diff --git a/DEPS b/DEPS index cf95f5a2..2476cb9 100644 --- a/DEPS +++ b/DEPS
@@ -138,27 +138,27 @@ # 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': 'fe18de506097d9cfa5f2a2a057e1dd134a96c116', + 'skia_revision': 'cc82972af115b2fecc857c39d55c308009eeca3a', # 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': 'c843aa75886abbd9aa4ea65818ece3d661ab2ed3', + 'v8_revision': '05e98a6eb753853cfbdabf257eba8cc633d5975f', # 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. - 'swarming_revision': '9b1b0ed1f31dd42b128ae88ce50c2ab1f87ebaeb', + 'swarming_revision': '96f125709acfd0b48fc1e5dae7d6ea42291726ac', # 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': 'ea49f6f5d4e3fda8003beb43a689a61c64b990b1', + 'angle_revision': '2d0a9acb05511a8fdaf0cd27d0da22599516a68b', # 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': 'c2c829bc9a633302d6a6b19e635a1ab6e7ae5915', + 'swiftshader_revision': 'f60a2d59c9f2cee2f3749ee9bf03bdb1bf2bccaa', # 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': '3ff3ecc72ae4d9fe90494085cc3f51c49c20e77e', + 'pdfium_revision': '6b231685b74bcf5327cb67da1fd0a9ef6e33d7f0', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling BoringSSL # and whatever else without interference from each other. @@ -185,7 +185,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': '0ddc033406886a709b901e0c312872529f9705e8', + 'nacl_revision': 'c4cf6f0621b94cca4053b19fa01ef329f5663880', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling freetype # and whatever else without interference from each other. @@ -201,7 +201,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': 'abea78f985f4f3156889f26ba5e34131ed457437', + 'catapult_revision': '93cd912aa60ef771f5aef978e3ba7f886c02bf9b', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling libFuzzer # and whatever else without interference from each other. @@ -257,11 +257,11 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling feed # and whatever else without interference from each other. - 'spv_tools_revision': 'a8ae579f7a8f4d84be86fe7263d1b6be0e18129f', + 'spv_tools_revision': '208d3132e6e8facd91aa7706e4f57bdcd7ce1ec9', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling feed # and whatever else without interference from each other. - 'spv_headers_revision': '8b911bd2ba37677037b38c9bd286c7c05701bcda', + 'spv_headers_revision': '9242862c84fe295ca0c9d26b36a6a891bb3ed6a7', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling feed # and whatever else without interference from each other. @@ -269,15 +269,15 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling feed # and whatever else without interference from each other. - 'shaderc_revision': 'acf7d24d01878bfdaf6e4e5df74722ec23b00954', + 'shaderc_revision': '3c76b8aa36fad139c871859d75056b222d31489c', # 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': '120f5d906283d44c5259987f650bc9c8e5b50d08', + 'dawn_revision': '7eb6be186be60a536a9f529b514bb5c5fd79293d', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling feed # and whatever else without interference from each other. - 'quiche_revision': '68d15a821c88b0e85c345d1393643a25322ce608', + 'quiche_revision': '292b75cd1b53b2c70c4c5b6af669e2d58c8e74e4', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling ios_webkit # and whatever else without interference from each other. @@ -807,7 +807,7 @@ # Build tools for Chrome OS. Note: This depends on third_party/pyelftools. 'src/third_party/chromite': { - 'url': Var('chromium_git') + '/chromiumos/chromite.git' + '@' + '311b8025e35cf75a06efa84ed34fed28180d6e42', + 'url': Var('chromium_git') + '/chromiumos/chromite.git' + '@' + 'a3211a4a0c9aae0e20b5b106719e14d14081ec64', 'condition': 'checkout_linux', }, @@ -832,7 +832,7 @@ }, 'src/third_party/depot_tools': - Var('chromium_git') + '/chromium/tools/depot_tools.git' + '@' + '073b8ac2ff8e7fdfba3e99db0d09611e20c2f202', + Var('chromium_git') + '/chromium/tools/depot_tools.git' + '@' + 'e30736fb090c7f3cd82efee1fa20f7af11dda5b3', 'src/third_party/devtools-node-modules': Var('chromium_git') + '/external/github.com/ChromeDevTools/devtools-node-modules' + '@' + Var('devtools_node_modules_revision'), @@ -901,7 +901,7 @@ }, 'src/third_party/glslang/src': - Var('chromium_git') + '/external/github.com/KhronosGroup/glslang.git' + '@' + 'd3692c701b1265955221aa0d6ebc656bc4442b2a', + Var('chromium_git') + '/external/github.com/KhronosGroup/glslang.git' + '@' + '9866ad9195cec8f266f16191fb4ec2ce4896e5c0', 'src/third_party/google_toolbox_for_mac/src': { 'url': Var('chromium_git') + '/external/github.com/google/google-toolbox-for-mac.git' + '@' + Var('google_toolbox_for_mac_revision'), @@ -1081,7 +1081,7 @@ }, 'src/third_party/libvpx/source/libvpx': - Var('chromium_git') + '/webm/libvpx.git' + '@' + '0308a9a132612006056f9920c069a1942e49c26c', + Var('chromium_git') + '/webm/libvpx.git' + '@' + '28cc5f3646bac9d01e583621f611303f738424f0', 'src/third_party/libwebm/source': Var('chromium_git') + '/webm/libwebm.git' + '@' + '51ca718c3adf0ddedacd7df25fe45f67dc5a9ce1', @@ -1355,7 +1355,7 @@ Var('chromium_git') + '/external/khronosgroup/webgl.git' + '@' + '6f0b34abee8dba611c253738d955c59f703c147a', 'src/third_party/webrtc': - Var('webrtc_git') + '/src.git' + '@' + '74e63b8abbbfdc25df05c90a6f4bc40cead73304', + Var('webrtc_git') + '/src.git' + '@' + '54c9d89f69c50ae180e818528081404582a59a9c', 'src/third_party/xdg-utils': { 'url': Var('chromium_git') + '/chromium/deps/xdg-utils.git' + '@' + 'd80274d5869b17b8c9067a1022e4416ee7ed5e0d', @@ -1396,7 +1396,7 @@ Var('chromium_git') + '/v8/v8.git' + '@' + Var('v8_revision'), 'src-internal': { - 'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@b793b75db94826ef7a42406d267d720d59c22354', + 'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@bc9865fc3dd2157d95ed2fb2096bee529b0d70a9', 'condition': 'checkout_src_internal', },
diff --git a/android_webview/BUILD.gn b/android_webview/BUILD.gn index 83a3a89..3d9f538 100644 --- a/android_webview/BUILD.gn +++ b/android_webview/BUILD.gn
@@ -449,22 +449,17 @@ # Note here that on a given system, the webview-only library needs the same # library name as the browser library, since the system webview factory will - # differentiate only by ABI. Each library has an app-bundle ("_base") - # variant. + # differentiate only by ABI. if (current_toolchain == android_secondary_abi_toolchain) { - # These targets are the 32-bit WebView libraries that pair with a 64-bit - # browser. They are suffixed with _64 because their names must mach the - # 64-bit browser library. + # This target is the 32-bit WebView library that pairs with a 64-bit + # browser. It is suffixed with _64 because its name must match the 64-bit + # browser library. webview_library("monochrome_64") { } - webview_library("monochrome_64_base") { - } } else { - # Inverse of the others above, for the original 32-bit case. + # Inverse of above, for the original 32-bit case. webview_library("monochrome") { } - webview_library("monochrome_base") { - } } }
diff --git a/ash/BUILD.gn b/ash/BUILD.gn index deeb43a4..07da425d 100644 --- a/ash/BUILD.gn +++ b/ash/BUILD.gn
@@ -450,20 +450,12 @@ "magnifier/partial_magnification_controller.h", "media/media_controller_impl.cc", "media/media_controller_impl.h", - "media/media_notification_background.cc", - "media/media_notification_background.h", "media/media_notification_constants.cc", "media/media_notification_constants.h", - "media/media_notification_container.h", "media/media_notification_container_impl.cc", "media/media_notification_container_impl.h", - "media/media_notification_controller.h", "media/media_notification_controller_impl.cc", "media/media_notification_controller_impl.h", - "media/media_notification_item.cc", - "media/media_notification_item.h", - "media/media_notification_view.cc", - "media/media_notification_view.h", "metrics/demo_session_metrics_recorder.cc", "metrics/demo_session_metrics_recorder.h", "metrics/desktop_task_switch_metric_recorder.cc", @@ -1350,6 +1342,7 @@ "//components/discardable_memory/service", "//components/exo", "//components/exo/wayland", + "//components/media_message_center", "//components/onc", "//components/password_manager/core/browser:hash_password_manager", "//components/pref_registry", @@ -1686,9 +1679,7 @@ "magnifier/magnifier_utils_unittest.cc", "magnifier/partial_magnification_controller_unittest.cc", "media/media_controller_unittest.cc", - "media/media_notification_background_unittest.cc", "media/media_notification_controller_impl_unittest.cc", - "media/media_notification_view_unittest.cc", "metrics/demo_session_metrics_recorder_unittest.cc", "metrics/desktop_task_switch_metric_recorder_unittest.cc", "metrics/histogram_macros_unittest.cc", @@ -1933,6 +1924,7 @@ "//components/arc:notification_test_support", "//components/exo", "//components/exo:test_support", + "//components/media_message_center", "//components/password_manager/core/browser:hash_password_manager", "//components/prefs:test_support", "//components/quirks",
diff --git a/ash/DEPS b/ash/DEPS index 10e3040..fb790b2 100644 --- a/ash/DEPS +++ b/ash/DEPS
@@ -9,6 +9,7 @@ "+components/discardable_memory/public", "+components/discardable_memory/service/discardable_shared_memory_manager.h", "+components/exo", + "+components/media_message_center", "+components/pref_registry", "+components/prefs", "+components/quirks",
diff --git a/ash/app_list/views/apps_container_view.cc b/ash/app_list/views/apps_container_view.cc index 8081cb6..ba4f568 100644 --- a/ash/app_list/views/apps_container_view.cc +++ b/ash/app_list/views/apps_container_view.cc
@@ -450,6 +450,7 @@ switch (show_state_) { case SHOW_APPS: + page_switcher_->set_can_process_events_within_subtree(true); folder_background_view_->SetVisible(false); apps_grid_view_->ResetForShowApps(); if (show_apps_with_animation) @@ -458,10 +459,12 @@ app_list_folder_view_->HideViewImmediately(); break; case SHOW_ACTIVE_FOLDER: + page_switcher_->set_can_process_events_within_subtree(false); folder_background_view_->SetVisible(true); app_list_folder_view_->ScheduleShowHideAnimation(true, false); break; case SHOW_ITEM_REPARENT: + page_switcher_->set_can_process_events_within_subtree(true); folder_background_view_->SetVisible(false); app_list_folder_view_->ScheduleShowHideAnimation(false, true); break;
diff --git a/ash/keyboard/ui/container_behavior.h b/ash/keyboard/ui/container_behavior.h index a5c84ae4..f3ed814 100644 --- a/ash/keyboard/ui/container_behavior.h +++ b/ash/keyboard/ui/container_behavior.h
@@ -46,13 +46,13 @@ // Apply changes to the animation settings to animate the keyboard container // showing. virtual void DoShowingAnimation( - aura::Window* window, + aura::Window* container, ui::ScopedLayerAnimationSettings* animation_settings) = 0; // Apply changes to the animation settings to animate the keyboard container // hiding. virtual void DoHidingAnimation( - aura::Window* window, + aura::Window* container, wm::ScopedHidingAnimationSettings* animation_settings) = 0; // Initialize the starting state of the keyboard container for the showing
diff --git a/ash/keyboard/ui/container_floating_behavior.cc b/ash/keyboard/ui/container_floating_behavior.cc index af4a3a1..590195d 100644 --- a/ash/keyboard/ui/container_floating_behavior.cc +++ b/ash/keyboard/ui/container_floating_behavior.cc
@@ -160,8 +160,8 @@ position->left_padding_allotment_ratio; double top = (display_bounds.height() - keyboard_size.height()) * position->top_padding_allotment_ratio; - top_left_offset.set_x((int)left); - top_left_offset.set_y((int)top); + top_left_offset.set_x(int{left}); + top_left_offset.set_y(int{top}); } // Make sure that this location is valid according to the current size of the @@ -180,7 +180,7 @@ bool ContainerFloatingBehavior::HandlePointerEvent( const ui::LocatedEvent& event, const display::Display& current_display) { - const gfx::Vector2d kb_offset(event.x(), event.y()); + const gfx::Vector2d kb_offset(int{event.x()}, int{event.y()}); const gfx::Rect& keyboard_bounds_in_screen = delegate_->GetBoundsInScreen(); @@ -201,7 +201,8 @@ if (!draggable_area_.Contains(kb_offset.x(), kb_offset.y())) { drag_descriptor_.reset(); } else if (type == ui::ET_MOUSE_PRESSED && - !((const ui::MouseEvent&)event).IsOnlyLeftMouseButton()) { + !static_cast<const ui::MouseEvent&>(event) + .IsOnlyLeftMouseButton()) { // Mouse events are limited to just the left mouse button. drag_descriptor_.reset(); } else if (!drag_descriptor_) { @@ -212,11 +213,7 @@ case ui::ET_MOUSE_DRAGGED: case ui::ET_TOUCH_MOVED: - if (!drag_descriptor_) { - // do nothing - } else if (drag_descriptor_->pointer_id != pointer_id) { - // do nothing. - } else { + if (drag_descriptor_ && drag_descriptor_->pointer_id == pointer_id) { // Drag continues. // If there is an active drag, use it to determine the new location // of the keyboard.
diff --git a/ash/keyboard/ui/container_floating_behavior.h b/ash/keyboard/ui/container_floating_behavior.h index 83c678f..054ad960 100644 --- a/ash/keyboard/ui/container_floating_behavior.h +++ b/ash/keyboard/ui/container_floating_behavior.h
@@ -5,6 +5,8 @@ #ifndef ASH_KEYBOARD_UI_CONTAINER_FLOATING_BEHAVIOR_H_ #define ASH_KEYBOARD_UI_CONTAINER_FLOATING_BEHAVIOR_H_ +#include <memory> + #include "ash/keyboard/ui/container_behavior.h" #include "ash/keyboard/ui/drag_descriptor.h" #include "ash/keyboard/ui/keyboard_export.h" @@ -25,10 +27,10 @@ // ContainerBehavior overrides void DoHidingAnimation( - aura::Window* window, + aura::Window* container, ::wm::ScopedHidingAnimationSettings* animation_settings) override; void DoShowingAnimation( - aura::Window* window, + aura::Window* container, ui::ScopedLayerAnimationSettings* animation_settings) override; void InitializeShowAnimationStartingState(aura::Window* container) override; gfx::Rect AdjustSetBoundsRequest(
diff --git a/ash/keyboard/ui/container_floating_behavior_unittest.cc b/ash/keyboard/ui/container_floating_behavior_unittest.cc index 44d9618a..1527333 100644 --- a/ash/keyboard/ui/container_floating_behavior_unittest.cc +++ b/ash/keyboard/ui/container_floating_behavior_unittest.cc
@@ -12,12 +12,6 @@ namespace keyboard { -class ContainerFloatingBehaviorTest : public testing::Test { - public: - ContainerFloatingBehaviorTest() {} - ~ContainerFloatingBehaviorTest() override {} -}; - TEST(ContainerFloatingBehaviorTest, AdjustSetBoundsRequest) { ContainerFloatingBehavior floating_behavior(nullptr);
diff --git a/ash/keyboard/ui/container_full_width_behavior.cc b/ash/keyboard/ui/container_full_width_behavior.cc index e9a88be..f507f21b 100644 --- a/ash/keyboard/ui/container_full_width_behavior.cc +++ b/ash/keyboard/ui/container_full_width_behavior.cc
@@ -17,7 +17,7 @@ ContainerFullWidthBehavior::ContainerFullWidthBehavior(Delegate* delegate) : ContainerBehavior(delegate) {} -ContainerFullWidthBehavior::~ContainerFullWidthBehavior() {} +ContainerFullWidthBehavior::~ContainerFullWidthBehavior() = default; ContainerType ContainerFullWidthBehavior::GetType() const { return ContainerType::kFullWidth;
diff --git a/ash/keyboard/ui/container_full_width_behavior.h b/ash/keyboard/ui/container_full_width_behavior.h index 0be24f8..666acce 100644 --- a/ash/keyboard/ui/container_full_width_behavior.h +++ b/ash/keyboard/ui/container_full_width_behavior.h
@@ -21,10 +21,10 @@ // ContainerBehavior overrides void DoHidingAnimation( - aura::Window* window, + aura::Window* container, ::wm::ScopedHidingAnimationSettings* animation_settings) override; void DoShowingAnimation( - aura::Window* window, + aura::Window* container, ui::ScopedLayerAnimationSettings* animation_settings) override; void InitializeShowAnimationStartingState(aura::Window* container) override; gfx::Rect AdjustSetBoundsRequest( @@ -41,7 +41,7 @@ bool TextBlurHidesKeyboard() const override; void SetOccludedBounds(const gfx::Rect& occluded_bounds_in_window) override; gfx::Rect GetOccludedBounds( - const gfx::Rect& visual_bounds_in_screen) const override; + const gfx::Rect& visual_bounds_in_window) const override; bool OccludedBoundsAffectWorkspaceLayout() const override; void SetDraggableArea(const gfx::Rect& rect) override;
diff --git a/ash/keyboard/ui/container_full_width_behavior_unittest.cc b/ash/keyboard/ui/container_full_width_behavior_unittest.cc index 5cd66c6..870c664 100644 --- a/ash/keyboard/ui/container_full_width_behavior_unittest.cc +++ b/ash/keyboard/ui/container_full_width_behavior_unittest.cc
@@ -9,12 +9,6 @@ namespace keyboard { -class ContainerFullWidthBehaviorTest : public testing::Test { - public: - ContainerFullWidthBehaviorTest() {} - ~ContainerFullWidthBehaviorTest() override {} -}; - TEST(ContainerFullWidthBehaviorTest, AdjustSetBoundsRequest) { ContainerFullWidthBehavior full_width_behavior(nullptr);
diff --git a/ash/keyboard/ui/display_util.cc b/ash/keyboard/ui/display_util.cc index 5c308a4..a57e7bf 100644 --- a/ash/keyboard/ui/display_util.cc +++ b/ash/keyboard/ui/display_util.cc
@@ -17,7 +17,7 @@ namespace keyboard { -DisplayUtil::DisplayUtil() {} +DisplayUtil::DisplayUtil() = default; display::Display DisplayUtil::GetNearestDisplayToWindow( aura::Window* window) const {
diff --git a/ash/keyboard/ui/keyboard_controller.cc b/ash/keyboard/ui/keyboard_controller.cc index 9f0207d7..4fbfb39 100644 --- a/ash/keyboard/ui/keyboard_controller.cc +++ b/ash/keyboard/ui/keyboard_controller.cc
@@ -117,12 +117,12 @@ void AddObserver( ui::InputMethodKeyboardControllerObserver* observer) override { - // TODO: Implement. + // TODO(shend): Implement. } void RemoveObserver( ui::InputMethodKeyboardControllerObserver* observer) override { - // TODO: Implement. + // TODO(shend): Implement. } bool IsKeyboardVisible() override { @@ -139,7 +139,7 @@ // KeyboardController. class CallbackAnimationObserver : public ui::ImplicitAnimationObserver { public: - CallbackAnimationObserver(base::OnceClosure callback) + explicit CallbackAnimationObserver(base::OnceClosure callback) : callback_(std::move(callback)) {} private:
diff --git a/ash/keyboard/ui/keyboard_controller.h b/ash/keyboard/ui/keyboard_controller.h index 80fd6d6..7d747d8 100644 --- a/ash/keyboard/ui/keyboard_controller.h +++ b/ash/keyboard/ui/keyboard_controller.h
@@ -7,6 +7,7 @@ #include <memory> #include <set> +#include <utility> #include <vector> #include "ash/keyboard/ui/container_behavior.h" @@ -234,7 +235,7 @@ } KeyboardUIState GetStateForTest() const { return model_.state(); } ui::InputMethod* GetInputMethodForTest(); - void EnsureCaretInWorkAreaForTest(const gfx::Rect& occluded_bounds_in_root); + void EnsureCaretInWorkAreaForTest(const gfx::Rect& occluded_bounds_in_screen); private: // For access to Observer methods for simulation.
diff --git a/ash/keyboard/ui/keyboard_controller_observer.h b/ash/keyboard/ui/keyboard_controller_observer.h index 6f5ba09..7b6ae7c 100644 --- a/ash/keyboard/ui/keyboard_controller_observer.h +++ b/ash/keyboard/ui/keyboard_controller_observer.h
@@ -5,6 +5,8 @@ #ifndef ASH_KEYBOARD_UI_KEYBOARD_CONTROLLER_OBSERVER_H_ #define ASH_KEYBOARD_UI_KEYBOARD_CONTROLLER_OBSERVER_H_ +#include <set> + #include "ash/keyboard/ui/keyboard_controller.h" #include "ash/keyboard/ui/keyboard_export.h"
diff --git a/ash/keyboard/ui/keyboard_controller_unittest.cc b/ash/keyboard/ui/keyboard_controller_unittest.cc index bb7dddf..8e518743 100644 --- a/ash/keyboard/ui/keyboard_controller_unittest.cc +++ b/ash/keyboard/ui/keyboard_controller_unittest.cc
@@ -78,7 +78,7 @@ private: // Overridden from ui::EventHandler: void OnEvent(ui::Event* event) override { - aura::Window* target = static_cast<aura::Window*>(event->target()); + auto* target = static_cast<aura::Window*>(event->target()); if (event->type() == ui::ET_MOUSE_PRESSED || event->type() == ui::ET_TOUCH_PRESSED) { aura::client::GetFocusClient(target)->FocusWindow(target); @@ -141,13 +141,8 @@ class KeyboardControllerTest : public aura::test::AuraTestBase, public KeyboardControllerObserver { public: - KeyboardControllerTest() - : visible_bounds_number_of_calls_(0), - occluding_bounds_number_of_calls_(0), - is_visible_number_of_calls_(0), - is_visible_(false), - keyboard_disabled_(false) {} - ~KeyboardControllerTest() override {} + KeyboardControllerTest() = default; + ~KeyboardControllerTest() override = default; void SetUp() override { ui::SetUpInputMethodFactoryForTesting(); @@ -179,8 +174,8 @@ KeyboardLayoutDelegate* layout_delegate() { return layout_delegate_.get(); } void ShowKeyboard() { - test_text_input_client_.reset( - new ui::DummyTextInputClient(ui::TEXT_INPUT_TYPE_TEXT)); + test_text_input_client_ = + std::make_unique<ui::DummyTextInputClient>(ui::TEXT_INPUT_TYPE_TEXT); SetFocus(test_text_input_client_.get()); } @@ -230,7 +225,7 @@ void AddTimeToTransientBlurCounter(double seconds) { controller_.time_of_last_blur_ -= - base::TimeDelta::FromMilliseconds((int)(1000 * seconds)); + base::TimeDelta::FromMilliseconds(int{1000 * seconds}); } void SetFocus(ui::TextInputClient* client) { @@ -264,18 +259,18 @@ std::unique_ptr<TestFocusController> focus_controller_; private: - int visible_bounds_number_of_calls_; + int visible_bounds_number_of_calls_ = 0; gfx::Rect visible_bounds_; - int occluding_bounds_number_of_calls_; + int occluding_bounds_number_of_calls_ = 0; gfx::Rect occluding_bounds_; - int is_visible_number_of_calls_; - bool is_visible_; + int is_visible_number_of_calls_ = 0; + bool is_visible_ = false; KeyboardController controller_; std::unique_ptr<KeyboardLayoutDelegate> layout_delegate_; std::unique_ptr<ui::TextInputClient> test_text_input_client_; - bool keyboard_disabled_; + bool keyboard_disabled_ = false; wm::DefaultScreenPositionClient screen_position_client_; DISALLOW_COPY_AND_ASSIGN(KeyboardControllerTest); }; @@ -505,8 +500,8 @@ class KeyboardControllerAnimationTest : public KeyboardControllerTest { public: - KeyboardControllerAnimationTest() {} - ~KeyboardControllerAnimationTest() override {} + KeyboardControllerAnimationTest() = default; + ~KeyboardControllerAnimationTest() override = default; void SetUp() override { // We cannot short-circuit animations for this test.
diff --git a/ash/keyboard/ui/keyboard_layout_delegate.h b/ash/keyboard/ui/keyboard_layout_delegate.h index e0edaaee..97b5ac8 100644 --- a/ash/keyboard/ui/keyboard_layout_delegate.h +++ b/ash/keyboard/ui/keyboard_layout_delegate.h
@@ -36,4 +36,4 @@ } // namespace keyboard -#endif +#endif // ASH_KEYBOARD_UI_KEYBOARD_LAYOUT_DELEGATE_H_
diff --git a/ash/keyboard/ui/keyboard_ui_model.cc b/ash/keyboard/ui/keyboard_ui_model.cc index 054a259..211c23d 100644 --- a/ash/keyboard/ui/keyboard_ui_model.cc +++ b/ash/keyboard/ui/keyboard_ui_model.cc
@@ -4,6 +4,9 @@ #include "ash/keyboard/ui/keyboard_ui_model.h" +#include <set> +#include <utility> + #include "base/metrics/histogram_functions.h" #include "base/metrics/histogram_macros.h" #include "base/no_destructor.h"
diff --git a/ash/keyboard/ui/keyboard_ukm_recorder_unittest.cc b/ash/keyboard/ui/keyboard_ukm_recorder_unittest.cc index d8095d4..558b1a01 100644 --- a/ash/keyboard/ui/keyboard_ukm_recorder_unittest.cc +++ b/ash/keyboard/ui/keyboard_ukm_recorder_unittest.cc
@@ -38,8 +38,8 @@ EXPECT_EQ(0u, test_recorder.sources_count()); EXPECT_EQ(1u, test_recorder.entries_count()); const auto entries = test_recorder.GetEntriesByName("VirtualKeyboard.Open"); - test_recorder.ExpectEntryMetric(entries[0], "TextInputType", - ui::TEXT_INPUT_TYPE_PASSWORD); + ukm::TestAutoSetUkmRecorder::ExpectEntryMetric(entries[0], "TextInputType", + ui::TEXT_INPUT_TYPE_PASSWORD); } } // namespace keyboard
diff --git a/ash/keyboard/ui/keyboard_util_unittest.cc b/ash/keyboard/ui/keyboard_util_unittest.cc index ee8626d..ab1c4ba 100644 --- a/ash/keyboard/ui/keyboard_util_unittest.cc +++ b/ash/keyboard/ui/keyboard_util_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 "ash/keyboard/ui/keyboard_util.h" +#include <memory> #include "ash/keyboard/ui/keyboard_controller.h" #include "ash/keyboard/ui/keyboard_ui.h" @@ -21,8 +21,8 @@ class KeyboardUtilTest : public aura::test::AuraTestBase { public: - KeyboardUtilTest() {} - ~KeyboardUtilTest() override {} + KeyboardUtilTest() = default; + ~KeyboardUtilTest() override = default; // Sets all flags controlling whether the keyboard should be shown to // their disabled state.
diff --git a/ash/keyboard/ui/notification_manager.cc b/ash/keyboard/ui/notification_manager.cc index e7384b88..eaf6660 100644 --- a/ash/keyboard/ui/notification_manager.cc +++ b/ash/keyboard/ui/notification_manager.cc
@@ -24,7 +24,7 @@ return value_changed; } -NotificationManager::NotificationManager() {} +NotificationManager::NotificationManager() = default; void NotificationManager::SendNotifications( bool does_occluded_bounds_affect_layout,
diff --git a/ash/keyboard/ui/notification_manager_unittest.cc b/ash/keyboard/ui/notification_manager_unittest.cc index d1754360..30d10e0 100644 --- a/ash/keyboard/ui/notification_manager_unittest.cc +++ b/ash/keyboard/ui/notification_manager_unittest.cc
@@ -6,17 +6,8 @@ #include "testing/gtest/include/gtest/gtest.h" namespace keyboard { -namespace { -class NotificationManagerTest : public testing::Test { - public: - NotificationManagerTest() {} - ~NotificationManagerTest() override {} -}; - -} // namespace - -TEST_F(NotificationManagerTest, DoesItConsolidate) { +TEST(NotificationManagerTest, DoesItConsolidate) { NotificationManager manager; ASSERT_TRUE(manager.ShouldSendVisibilityNotification(false));
diff --git a/ash/keyboard/ui/queued_container_type.cc b/ash/keyboard/ui/queued_container_type.cc index bf3917d..b4c815f4 100644 --- a/ash/keyboard/ui/queued_container_type.cc +++ b/ash/keyboard/ui/queued_container_type.cc
@@ -2,8 +2,11 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +#include "ash/keyboard/ui/queued_container_type.h" + +#include <utility> + #include "ash/keyboard/ui/keyboard_controller.h" -#include "base/bind.h" namespace keyboard { @@ -14,7 +17,7 @@ base::OnceCallback<void(bool success)> callback) : controller_(controller), container_type_(container_type), - bounds_(bounds), + bounds_(std::move(bounds)), callback_(std::move(callback)) {} QueuedContainerType::~QueuedContainerType() {
diff --git a/ash/keyboard/ui/queued_container_type.h b/ash/keyboard/ui/queued_container_type.h index e3e843f..5e3f81b 100644 --- a/ash/keyboard/ui/queued_container_type.h +++ b/ash/keyboard/ui/queued_container_type.h
@@ -6,7 +6,7 @@ #define ASH_KEYBOARD_UI_QUEUED_CONTAINER_TYPE_H_ #include "ash/public/cpp/keyboard/keyboard_types.h" -#include "base/bind.h" +#include "base/callback.h" #include "base/optional.h" #include "ui/gfx/geometry/rect.h"
diff --git a/ash/keyboard/ui/queued_display_change.cc b/ash/keyboard/ui/queued_display_change.cc index 9f29b874..97cc671 100644 --- a/ash/keyboard/ui/queued_display_change.cc +++ b/ash/keyboard/ui/queued_display_change.cc
@@ -13,6 +13,6 @@ const gfx::Rect& new_bounds_in_local) : new_display_(display), new_bounds_in_local_(new_bounds_in_local) {} -QueuedDisplayChange::~QueuedDisplayChange() {} +QueuedDisplayChange::~QueuedDisplayChange() = default; } // namespace keyboard
diff --git a/ash/keyboard/ui/queued_display_change.h b/ash/keyboard/ui/queued_display_change.h index 533d0d38..dba5e41 100644 --- a/ash/keyboard/ui/queued_display_change.h +++ b/ash/keyboard/ui/queued_display_change.h
@@ -12,8 +12,8 @@ namespace keyboard { -// TODO: refactor and merge this into QueuedContainerType and rename it to -// something like QueuedVisualChange or similar. +// TODO(shend): refactor and merge this into QueuedContainerType and rename it +// to something like QueuedVisualChange or similar. class QueuedDisplayChange { public: QueuedDisplayChange(const display::Display& display,
diff --git a/ash/keyboard/ui/shaped_window_targeter.cc b/ash/keyboard/ui/shaped_window_targeter.cc index 8912f17e..046c979 100644 --- a/ash/keyboard/ui/shaped_window_targeter.cc +++ b/ash/keyboard/ui/shaped_window_targeter.cc
@@ -4,15 +4,15 @@ #include "ash/keyboard/ui/shaped_window_targeter.h" -#include <memory> +#include <utility> #include "ui/gfx/geometry/rect.h" namespace keyboard { ShapedWindowTargeter::ShapedWindowTargeter( - const std::vector<gfx::Rect>& hit_test_rects) - : hit_test_rects_(hit_test_rects) {} + std::vector<gfx::Rect> hit_test_rects) + : hit_test_rects_(std::move(hit_test_rects)) {} ShapedWindowTargeter::~ShapedWindowTargeter() = default;
diff --git a/ash/keyboard/ui/shaped_window_targeter.h b/ash/keyboard/ui/shaped_window_targeter.h index bf14734c9..9214f7a 100644 --- a/ash/keyboard/ui/shaped_window_targeter.h +++ b/ash/keyboard/ui/shaped_window_targeter.h
@@ -5,6 +5,9 @@ #ifndef ASH_KEYBOARD_UI_SHAPED_WINDOW_TARGETER_H_ #define ASH_KEYBOARD_UI_SHAPED_WINDOW_TARGETER_H_ +#include <memory> +#include <vector> + #include "base/macros.h" #include "ui/aura/window_targeter.h" @@ -14,7 +17,7 @@ // list of rectangles. class ShapedWindowTargeter : public aura::WindowTargeter { public: - explicit ShapedWindowTargeter(const std::vector<gfx::Rect>& hit_test_rects); + explicit ShapedWindowTargeter(std::vector<gfx::Rect> hit_test_rects); ~ShapedWindowTargeter() override; private:
diff --git a/ash/keyboard/ui/test/test_keyboard_ui_factory.cc b/ash/keyboard/ui/test/test_keyboard_ui_factory.cc index f5cba17..c58b1e6 100644 --- a/ash/keyboard/ui/test/test_keyboard_ui_factory.cc +++ b/ash/keyboard/ui/test/test_keyboard_ui_factory.cc
@@ -4,13 +4,13 @@ #include "ash/keyboard/ui/test/test_keyboard_ui_factory.h" +#include <utility> + #include "ash/keyboard/ui/test/keyboard_test_util.h" #include "base/threading/sequenced_task_runner_handle.h" #include "ui/display/display.h" #include "ui/display/screen.h" -#include <utility> - namespace keyboard { TestKeyboardUIFactory::TestKeyboardUIFactory(ui::InputMethod* input_method)
diff --git a/ash/media/media_notification_constants.cc b/ash/media/media_notification_constants.cc index 9b02a08..a28c11c2 100644 --- a/ash/media/media_notification_constants.cc +++ b/ash/media/media_notification_constants.cc
@@ -10,8 +10,4 @@ const char kMediaSessionNotifierId[] = "media-session"; -const int kMediaSessionNotificationArtworkMinSize = 114; - -const int kMediaSessionNotificationArtworkDesiredSize = 512; - } // namespace ash
diff --git a/ash/media/media_notification_constants.h b/ash/media/media_notification_constants.h index 78e8d1b..dbc4753 100644 --- a/ash/media/media_notification_constants.h +++ b/ash/media/media_notification_constants.h
@@ -15,15 +15,6 @@ // The notifier ID associated with the media session service. ASH_EXPORT extern const char kMediaSessionNotifierId[]; -// The minimum size in px that the media session artwork can be to be displayed -// in the notification. -ASH_EXPORT extern const int kMediaSessionNotificationArtworkMinSize; - -// The desired size in px for the media session artwork to be displayed in the -// notification. The media session service will try and select artwork closest -// to this size. -ASH_EXPORT extern const int kMediaSessionNotificationArtworkDesiredSize; - } // namespace ash #endif // ASH_MEDIA_MEDIA_NOTIFICATION_CONSTANTS_H_
diff --git a/ash/media/media_notification_container.h b/ash/media/media_notification_container.h deleted file mode 100644 index cf8abcae..0000000 --- a/ash/media/media_notification_container.h +++ /dev/null
@@ -1,23 +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 ASH_MEDIA_MEDIA_NOTIFICATION_CONTAINER_H_ -#define ASH_MEDIA_MEDIA_NOTIFICATION_CONTAINER_H_ - -#include "ash/ash_export.h" - -namespace ash { - -// MediaNotificationContainer is an interface for containers of -// MediaNotificationView components to receive events from the -// MediaNotificationView. -class ASH_EXPORT MediaNotificationContainer { - public: - // Called when MediaNotificationView's expanded state changes. - virtual void OnExpanded(bool expanded) = 0; -}; - -} // namespace ash - -#endif // ASH_MEDIA_MEDIA_NOTIFICATION_CONTAINER_H_
diff --git a/ash/media/media_notification_container_impl.cc b/ash/media/media_notification_container_impl.cc index 73f9b79f..0c8effc 100644 --- a/ash/media/media_notification_container_impl.cc +++ b/ash/media/media_notification_container_impl.cc
@@ -14,7 +14,7 @@ MediaNotificationContainerImpl::MediaNotificationContainerImpl( const message_center::Notification& notification, - base::WeakPtr<MediaNotificationItem> item) + base::WeakPtr<media_message_center::MediaNotificationItem> item) : message_center::MessageView(notification), control_buttons_view_( std::make_unique<message_center::NotificationControlButtonsView>(
diff --git a/ash/media/media_notification_container_impl.h b/ash/media/media_notification_container_impl.h index 5aed317..e679d14 100644 --- a/ash/media/media_notification_container_impl.h +++ b/ash/media/media_notification_container_impl.h
@@ -6,13 +6,15 @@ #define ASH_MEDIA_MEDIA_NOTIFICATION_CONTAINER_IMPL_H_ #include "ash/ash_export.h" -#include "ash/media/media_notification_container.h" -#include "ash/media/media_notification_view.h" +#include "components/media_message_center/media_notification_container.h" +#include "components/media_message_center/media_notification_view.h" #include "ui/message_center/views/message_view.h" -namespace ash { - +namespace media_message_center { class MediaNotificationItem; +} // namespace media_message_center + +namespace ash { // MediaNotificationContainerImpl will show up as a custom notification. It will // show the currently playing media and provide playback controls. There will @@ -20,11 +22,11 @@ // and show if the notification is hovered. class ASH_EXPORT MediaNotificationContainerImpl : public message_center::MessageView, - public MediaNotificationContainer { + public media_message_center::MediaNotificationContainer { public: explicit MediaNotificationContainerImpl( const message_center::Notification& notification, - base::WeakPtr<MediaNotificationItem> item); + base::WeakPtr<media_message_center::MediaNotificationItem> item); ~MediaNotificationContainerImpl() override; // message_center::MessageView: @@ -35,7 +37,7 @@ void SetExpanded(bool expanded) override; void UpdateCornerRadius(int top_radius, int bottom_radius) override; - // MediaNotificationContainer: + // media_message_center::MediaNotificationContainer: void OnExpanded(bool expanded) override; // views::View: @@ -49,7 +51,7 @@ std::unique_ptr<message_center::NotificationControlButtonsView> control_buttons_view_; - MediaNotificationView view_; + media_message_center::MediaNotificationView view_; DISALLOW_COPY_AND_ASSIGN(MediaNotificationContainerImpl); };
diff --git a/ash/media/media_notification_controller.h b/ash/media/media_notification_controller.h deleted file mode 100644 index ae36a2c..0000000 --- a/ash/media/media_notification_controller.h +++ /dev/null
@@ -1,26 +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 ASH_MEDIA_MEDIA_NOTIFICATION_CONTROLLER_H_ -#define ASH_MEDIA_MEDIA_NOTIFICATION_CONTROLLER_H_ - -#include <string> - -#include "ash/ash_export.h" - -namespace ash { - -// MediaNotificationController does the actual hiding and showing of the media -// notification. -class ASH_EXPORT MediaNotificationController { - public: - // Shows/hides a notification with the given request id. Called by - // MediaNotificationItem when the notification should be shown/hidden. - virtual void ShowNotification(const std::string& id) = 0; - virtual void HideNotification(const std::string& id) = 0; -}; - -} // namespace ash - -#endif // ASH_MEDIA_MEDIA_NOTIFICATION_CONTROLLER_H_
diff --git a/ash/media/media_notification_controller_impl.cc b/ash/media/media_notification_controller_impl.cc index f03f701..931ff46dc 100644 --- a/ash/media/media_notification_controller_impl.cc +++ b/ash/media/media_notification_controller_impl.cc
@@ -6,7 +6,6 @@ #include "ash/media/media_notification_constants.h" #include "ash/media/media_notification_container_impl.h" -#include "ash/media/media_notification_item.h" #include "ash/public/cpp/notification_utils.h" #include "ash/session/session_controller_impl.h" #include "ash/session/session_observer.h" @@ -14,6 +13,7 @@ #include "base/bind.h" #include "base/metrics/histogram_macros.h" #include "base/stl_util.h" +#include "components/media_message_center/media_notification_item.h" #include "services/media_session/public/mojom/constants.mojom.h" #include "services/service_manager/public/cpp/connector.h" #include "ui/message_center/message_center.h" @@ -196,7 +196,7 @@ std::unique_ptr<MediaNotificationContainerImpl> MediaNotificationControllerImpl::CreateMediaNotification( const message_center::Notification& notification) { - base::WeakPtr<MediaNotificationItem> item; + base::WeakPtr<media_message_center::MediaNotificationItem> item; auto it = notifications_.find(notification.id()); if (it != notifications_.end())
diff --git a/ash/media/media_notification_controller_impl.h b/ash/media/media_notification_controller_impl.h index 24b8645..9b71600 100644 --- a/ash/media/media_notification_controller_impl.h +++ b/ash/media/media_notification_controller_impl.h
@@ -10,9 +10,9 @@ #include <string> #include "ash/ash_export.h" -#include "ash/media/media_notification_controller.h" -#include "ash/media/media_notification_item.h" #include "base/macros.h" +#include "components/media_message_center/media_notification_controller.h" +#include "components/media_message_center/media_notification_item.h" #include "mojo/public/cpp/bindings/binding.h" #include "services/media_session/public/mojom/audio_focus.mojom.h" #include "services/media_session/public/mojom/media_controller.mojom.h" @@ -38,7 +38,7 @@ // controls. class ASH_EXPORT MediaNotificationControllerImpl : public media_session::mojom::AudioFocusObserver, - public MediaNotificationController { + public media_message_center::MediaNotificationController { public: // The name of the histogram used to record the number of concurrent media // notifications. @@ -54,14 +54,14 @@ void OnFocusLost( media_session::mojom::AudioFocusRequestStatePtr session) override; - // MediaNotificationController: + // media_message_center::MediaNotificationController: void ShowNotification(const std::string& id) override; void HideNotification(const std::string& id) override; std::unique_ptr<MediaNotificationContainerImpl> CreateMediaNotification( const message_center::Notification& notification); - ash::MediaNotificationItem* GetItem(const std::string& id) { + media_message_center::MediaNotificationItem* GetItem(const std::string& id) { auto it = notifications_.find(id); DCHECK(it != notifications_.end()); return &it->second; @@ -77,9 +77,10 @@ mojo::Binding<media_session::mojom::AudioFocusObserver> audio_focus_observer_binding_{this}; - // Stores a |MediaNotificationItem| for each media session keyed by its - // |request_id| in string format. - std::map<const std::string, MediaNotificationItem> notifications_; + // Stores a |media_message_center::MediaNotificationItem| for each media + // session keyed by its |request_id| in string format. + std::map<const std::string, media_message_center::MediaNotificationItem> + notifications_; std::unique_ptr<MediaNotificationBlocker> blocker_;
diff --git a/ash/media/media_notification_controller_impl_unittest.cc b/ash/media/media_notification_controller_impl_unittest.cc index 95ad4c8..204a56bc 100644 --- a/ash/media/media_notification_controller_impl_unittest.cc +++ b/ash/media/media_notification_controller_impl_unittest.cc
@@ -7,7 +7,6 @@ #include <memory> #include "ash/media/media_notification_constants.h" -#include "ash/media/media_notification_item.h" #include "ash/public/cpp/ash_features.h" #include "ash/public/cpp/notification_utils.h" #include "ash/session/session_controller_impl.h" @@ -18,6 +17,7 @@ #include "base/test/metrics/histogram_tester.h" #include "base/test/scoped_feature_list.h" #include "base/unguessable_token.h" +#include "components/media_message_center/media_notification_item.h" #include "services/media_session/public/mojom/audio_focus.mojom.h" #include "ui/message_center/message_center.h" @@ -80,9 +80,10 @@ MediaNotificationControllerImpl::kCountHistogramName, count, size); } - void ExpectHistogramSourceRecorded(MediaNotificationItem::Source source) { + void ExpectHistogramSourceRecorded( + media_message_center::MediaNotificationItem::Source source) { histogram_tester_.ExpectUniqueSample( - MediaNotificationItem::kSourceHistogramName, + media_message_center::MediaNotificationItem::kSourceHistogramName, static_cast<base::HistogramBase::Sample>(source), 1); } @@ -169,8 +170,8 @@ } // Test that a notification is hidden when it becomes uncontrollable. We still -// keep the MediaNotificationItem around in case it becomes -// controllable again. +// keep the media_message_center::MediaNotificationItem around in case it +// becomes controllable again. TEST_F(MediaNotificationControllerImplTest, OnFocusGained_ControllableBecomesUncontrollable) { base::UnguessableToken id = base::UnguessableToken::Create(); @@ -363,7 +364,8 @@ ->MediaSessionMetadataChanged(BuildMediaMetadata()); ExpectNotificationCount(1); - ExpectHistogramSourceRecorded(MediaNotificationItem::Source::kUnknown); + ExpectHistogramSourceRecorded( + media_message_center::MediaNotificationItem::Source::kUnknown); } TEST_F(MediaNotificationControllerImplTest, RecordHistogramSource_Web) { @@ -384,7 +386,8 @@ ->MediaSessionMetadataChanged(BuildMediaMetadata()); ExpectNotificationCount(1); - ExpectHistogramSourceRecorded(MediaNotificationItem::Source::kWeb); + ExpectHistogramSourceRecorded( + media_message_center::MediaNotificationItem::Source::kWeb); } TEST_F(MediaNotificationControllerImplTest, RecordHistogramSource_Assistant) { @@ -405,7 +408,8 @@ ->MediaSessionMetadataChanged(BuildMediaMetadata()); ExpectNotificationCount(1); - ExpectHistogramSourceRecorded(MediaNotificationItem::Source::kAssistant); + ExpectHistogramSourceRecorded( + media_message_center::MediaNotificationItem::Source::kAssistant); } TEST_F(MediaNotificationControllerImplTest, RecordHistogramSource_Arc) { @@ -426,7 +430,8 @@ ->MediaSessionMetadataChanged(BuildMediaMetadata()); ExpectNotificationCount(1); - ExpectHistogramSourceRecorded(MediaNotificationItem::Source::kArc); + ExpectHistogramSourceRecorded( + media_message_center::MediaNotificationItem::Source::kArc); } // Test that locking the screen will hide the media notifications. Unlocking the
diff --git a/ash/metrics/login_metrics_recorder.cc b/ash/metrics/login_metrics_recorder.cc index 257e8aa..ff24ef3 100644 --- a/ash/metrics/login_metrics_recorder.cc +++ b/ash/metrics/login_metrics_recorder.cc
@@ -58,11 +58,6 @@ void LoginMetricsRecorder::RecordNumLoginAttempts(int num_attempt, bool success) { - if (Shell::Get()->session_controller()->GetSessionState() != - session_manager::SessionState::LOCKED) { - return; - } - if (success) { UMA_HISTOGRAM_COUNTS_100("Ash.Login.Lock.NumPasswordAttempts.UntilSuccess", num_attempt);
diff --git a/ash/metrics/login_metrics_recorder_unittest.cc b/ash/metrics/login_metrics_recorder_unittest.cc index 82b70dfd..23b6822d 100644 --- a/ash/metrics/login_metrics_recorder_unittest.cc +++ b/ash/metrics/login_metrics_recorder_unittest.cc
@@ -125,6 +125,25 @@ 1); } +// Verifies that the number of auth attempts at sign in is record successfully. +TEST_F(LoginMetricsRecorderTest, RecordNumSignInAttempts) { + GetSessionControllerClient()->SetSessionState( + session_manager::SessionState::ACTIVE); + + metrics_recorder()->RecordNumLoginAttempts(5, true /*success*/); + histogram_tester_->ExpectTotalCount(kNumAttemptTilSuccessHistogramName, 1); + histogram_tester_->ExpectBucketCount(kNumAttemptTilSuccessHistogramName, 5, + 1); + + metrics_recorder()->RecordNumLoginAttempts(7, false /*success*/); + histogram_tester_->ExpectTotalCount(kNumAttemptTilSuccessHistogramName, 1); + histogram_tester_->ExpectBucketCount(kNumAttemptTilSuccessHistogramName, 5, + 1); + histogram_tester_->ExpectTotalCount(kNumAttemptTilFailureHistogramName, 1); + histogram_tester_->ExpectBucketCount(kNumAttemptTilFailureHistogramName, 7, + 1); +} + // Verifies that user click events on the lock screen is recorded correctly. TEST_F(LoginMetricsRecorderTest, RecordUserClickEventOnLockScreen) { GetSessionControllerClient()->SetSessionState(
diff --git a/ash/metrics/user_metrics_recorder.cc b/ash/metrics/user_metrics_recorder.cc index 40851d7f..388baae 100644 --- a/ash/metrics/user_metrics_recorder.cc +++ b/ash/metrics/user_metrics_recorder.cc
@@ -164,7 +164,8 @@ for (const ShelfItem& item : ShelfModel::Get()->items()) { if (item.type == TYPE_PINNED_APP || item.type == TYPE_BROWSER_SHORTCUT) ++pinned_item_count; - else if (item.type != TYPE_APP_LIST && item.type != TYPE_BACK_BUTTON) + else if (item.type != TYPE_APP_LIST_DEPRECATED && + item.type != TYPE_BACK_BUTTON_DEPRECATED) ++unpinned_item_count; }
diff --git a/ash/metrics/user_metrics_recorder_unittest.cc b/ash/metrics/user_metrics_recorder_unittest.cc index 0443166..95fc010 100644 --- a/ash/metrics/user_metrics_recorder_unittest.cc +++ b/ash/metrics/user_metrics_recorder_unittest.cc
@@ -135,8 +135,8 @@ // Make sure the shelf contains the app list launcher and back button. ShelfModel* shelf_model = ShelfModel::Get(); ASSERT_EQ(2u, shelf_model->items().size()); - ASSERT_EQ(TYPE_BACK_BUTTON, shelf_model->items()[0].type); - ASSERT_EQ(TYPE_APP_LIST, shelf_model->items()[1].type); + ASSERT_EQ(TYPE_BACK_BUTTON_DEPRECATED, shelf_model->items()[0].type); + ASSERT_EQ(TYPE_APP_LIST_DEPRECATED, shelf_model->items()[1].type); ShelfItem shelf_item; shelf_item.type = ash::TYPE_PINNED_APP;
diff --git a/ash/public/cpp/app_list/app_list_metrics.cc b/ash/public/cpp/app_list/app_list_metrics.cc index 2c62ded6..dced363 100644 --- a/ash/public/cpp/app_list/app_list_metrics.cc +++ b/ash/public/cpp/app_list/app_list_metrics.cc
@@ -20,7 +20,7 @@ const char kAppListSuggestionChipOpenTypeHistogramInTablet[] = "Apps.AppListSuggestedChipOpenType.TabletMode"; const char kAppListZeroStateSuggestionOpenTypeHistogram[] = - "Apps.AppListZeroStateSuggestionOpenType"; + "Apps.AppList.ZeroStateSuggestionOpenType"; } // namespace
diff --git a/ash/public/cpp/default_scale_factor_retriever_unittest.cc b/ash/public/cpp/default_scale_factor_retriever_unittest.cc index df1edad..9035e33 100644 --- a/ash/public/cpp/default_scale_factor_retriever_unittest.cc +++ b/ash/public/cpp/default_scale_factor_retriever_unittest.cc
@@ -6,8 +6,8 @@ #include "ash/public/interfaces/cros_display_config.mojom.h" #include "base/bind.h" -#include "base/message_loop/message_loop.h" #include "base/run_loop.h" +#include "base/test/scoped_task_environment.h" #include "mojo/public/cpp/bindings/binding.h" #include "testing/gtest/include/gtest/gtest.h" #include "ui/display/display.h" @@ -73,7 +73,7 @@ ~DefaultScaleFactorRetrieverTest() override = default; private: - base::MessageLoop message_loop_; + base::test::ScopedTaskEnvironment scoped_task_environment_; DISALLOW_COPY_AND_ASSIGN(DefaultScaleFactorRetrieverTest); };
diff --git a/ash/public/cpp/manifest.cc b/ash/public/cpp/manifest.cc index de4c58e..a588903 100644 --- a/ash/public/cpp/manifest.cc +++ b/ash/public/cpp/manifest.cc
@@ -63,8 +63,6 @@ mojom::ShelfIntegrationTestApi>()) .RequireCapability("*", "accessibility") .RequireCapability("*", "app") - .RequireCapability(prefs::mojom::kLocalStateServiceName, - "pref_client") .RequireCapability(content::mojom::kServiceName, "navigation") .RequireCapability(data_decoder::mojom::kServiceName, "image_decoder") .RequireCapability(viz::mojom::kVizServiceName, "ozone")
diff --git a/ash/public/cpp/shelf_model.cc b/ash/public/cpp/shelf_model.cc index 8485dac4..ac2d19ac 100644 --- a/ash/public/cpp/shelf_model.cc +++ b/ash/public/cpp/shelf_model.cc
@@ -18,10 +18,8 @@ int ShelfItemTypeToWeight(ShelfItemType type) { switch (type) { - case TYPE_APP_LIST: - case TYPE_BACK_BUTTON: - // TODO(skuhne): If the app list and back button items become movable, - // this needs to be a fallthrough. + case TYPE_APP_LIST_DEPRECATED: + case TYPE_BACK_BUTTON_DEPRECATED: return 0; case TYPE_BROWSER_SHORTCUT: case TYPE_PINNED_APP: @@ -62,14 +60,17 @@ // Add the back button and app list item; its title and delegate are set in // ShelfController. This avoids an ash/public dep on ash/strings, and a // Chrome-side delegate. + // TODO(manucornet): The back button and the app list shelf items are now + // ignored at the view level and handled separately. Remove the creation bit + // here as well. ShelfItem back_button_item; - back_button_item.type = TYPE_BACK_BUTTON; + back_button_item.type = TYPE_BACK_BUTTON_DEPRECATED; back_button_item.id = ShelfID(kBackButtonId); const int back_button_index = Add(back_button_item); DCHECK_EQ(0, back_button_index); ShelfItem app_list_item; - app_list_item.type = TYPE_APP_LIST; + app_list_item.type = TYPE_APP_LIST_DEPRECATED; app_list_item.id = ShelfID(kAppListId); const int app_list_index = Add(app_list_item); DCHECK_EQ(1, app_list_index);
diff --git a/ash/public/cpp/shelf_model_unittest.cc b/ash/public/cpp/shelf_model_unittest.cc index 0fb8616..62b207b4 100644 --- a/ash/public/cpp/shelf_model_unittest.cc +++ b/ash/public/cpp/shelf_model_unittest.cc
@@ -249,8 +249,8 @@ int platform_app_index4 = model_->AddAt(8, item); EXPECT_EQ(8, platform_app_index4); - EXPECT_EQ(TYPE_BACK_BUTTON, model_->items()[0].type); - EXPECT_EQ(TYPE_APP_LIST, model_->items()[1].type); + EXPECT_EQ(TYPE_BACK_BUTTON_DEPRECATED, model_->items()[0].type); + EXPECT_EQ(TYPE_APP_LIST_DEPRECATED, model_->items()[1].type); EXPECT_EQ(TYPE_BROWSER_SHORTCUT, model_->items()[4].type); } @@ -283,8 +283,8 @@ // Test item reordering on type/weight (eg. pinning) changes. crbug.com/248769. TEST_F(ShelfModelTest, ReorderOnTypeChanges) { - EXPECT_EQ(TYPE_BACK_BUTTON, model_->items()[0].type); - EXPECT_EQ(TYPE_APP_LIST, model_->items()[1].type); + EXPECT_EQ(TYPE_BACK_BUTTON_DEPRECATED, model_->items()[0].type); + EXPECT_EQ(TYPE_APP_LIST_DEPRECATED, model_->items()[1].type); // Add three pinned items. ShelfItem item1;
diff --git a/ash/public/cpp/shelf_types.cc b/ash/public/cpp/shelf_types.cc index e1d2f1b..9606c45 100644 --- a/ash/public/cpp/shelf_types.cc +++ b/ash/public/cpp/shelf_types.cc
@@ -17,9 +17,9 @@ } // namespace bool IsValidShelfItemType(int64_t type) { - return type == TYPE_PINNED_APP || type == TYPE_APP_LIST || + return type == TYPE_PINNED_APP || type == TYPE_APP_LIST_DEPRECATED || type == TYPE_BROWSER_SHORTCUT || type == TYPE_APP || - type == TYPE_DIALOG || type == TYPE_BACK_BUTTON || + type == TYPE_DIALOG || type == TYPE_BACK_BUTTON_DEPRECATED || type == TYPE_UNDEFINED; }
diff --git a/ash/public/cpp/shelf_types.h b/ash/public/cpp/shelf_types.h index 4238219..571f0ec 100644 --- a/ash/public/cpp/shelf_types.h +++ b/ash/public/cpp/shelf_types.h
@@ -115,9 +115,9 @@ // Represents a pinned shortcut to an app, the app may be running or not. TYPE_PINNED_APP, - // Toggles visiblity of the app list. - // TODO(michaelpg): Rename App List item to Home Button. - TYPE_APP_LIST, + // Toggles visibility of the app list. Deprecated, moved to a separate widget + // instead of being shown as a shelf item. + TYPE_APP_LIST_DEPRECATED, // The browser shortcut button, the browser may be running or not. TYPE_BROWSER_SHORTCUT, @@ -131,8 +131,9 @@ // Represents an open dialog. TYPE_DIALOG, - // Represents the back button, which is shown in tablet mode. - TYPE_BACK_BUTTON, + // Represents the back button, which is shown in tablet mode. Deprecated, + // shown in a separate widget instead of as a shelf item. + TYPE_BACK_BUTTON_DEPRECATED, // Default value. TYPE_UNDEFINED,
diff --git a/ash/public/interfaces/user_info_traits.h b/ash/public/interfaces/user_info_traits.h deleted file mode 100644 index fc24fd2..0000000 --- a/ash/public/interfaces/user_info_traits.h +++ /dev/null
@@ -1,76 +0,0 @@ -// Copyright 2017 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef ASH_PUBLIC_INTERFACES_USER_INFO_TRAITS_H_ -#define ASH_PUBLIC_INTERFACES_USER_INFO_TRAITS_H_ - -#include "ash/public/cpp/session/user_info.h" -#include "components/user_manager/user_type.h" - -namespace mojo { - -template <> -struct EnumTraits<ash::mojom::UserType, user_manager::UserType> { - static ash::mojom::UserType ToMojom(user_manager::UserType input) { - switch (input) { - case user_manager::USER_TYPE_REGULAR: - return ash::mojom::UserType::REGULAR; - case user_manager::USER_TYPE_GUEST: - return ash::mojom::UserType::GUEST; - case user_manager::USER_TYPE_PUBLIC_ACCOUNT: - return ash::mojom::UserType::PUBLIC_ACCOUNT; - case user_manager::USER_TYPE_SUPERVISED: - return ash::mojom::UserType::SUPERVISED; - case user_manager::USER_TYPE_KIOSK_APP: - return ash::mojom::UserType::KIOSK; - case user_manager::USER_TYPE_CHILD: - return ash::mojom::UserType::CHILD; - case user_manager::USER_TYPE_ARC_KIOSK_APP: - return ash::mojom::UserType::ARC_KIOSK; - case user_manager::USER_TYPE_ACTIVE_DIRECTORY: - return ash::mojom::UserType::ACTIVE_DIRECTORY; - case user_manager::NUM_USER_TYPES: - // Bail as this is not a valid user type. - break; - } - NOTREACHED(); - return ash::mojom::UserType::REGULAR; - } - - static bool FromMojom(ash::mojom::UserType input, - user_manager::UserType* out) { - switch (input) { - case ash::mojom::UserType::REGULAR: - *out = user_manager::USER_TYPE_REGULAR; - return true; - case ash::mojom::UserType::GUEST: - *out = user_manager::USER_TYPE_GUEST; - return true; - case ash::mojom::UserType::PUBLIC_ACCOUNT: - *out = user_manager::USER_TYPE_PUBLIC_ACCOUNT; - return true; - case ash::mojom::UserType::SUPERVISED: - *out = user_manager::USER_TYPE_SUPERVISED; - return true; - case ash::mojom::UserType::KIOSK: - *out = user_manager::USER_TYPE_KIOSK_APP; - return true; - case ash::mojom::UserType::CHILD: - *out = user_manager::USER_TYPE_CHILD; - return true; - case ash::mojom::UserType::ARC_KIOSK: - *out = user_manager::USER_TYPE_ARC_KIOSK_APP; - return true; - case ash::mojom::UserType::ACTIVE_DIRECTORY: - *out = user_manager::USER_TYPE_ACTIVE_DIRECTORY; - return true; - } - NOTREACHED(); - return false; - } -}; - -} // namespace mojo - -#endif // ASH_PUBLIC_INTERFACES_USER_INFO_TRAITS_H_
diff --git a/ash/shelf/default_shelf_view.cc b/ash/shelf/default_shelf_view.cc index d6bc15d..710a96f0 100644 --- a/ash/shelf/default_shelf_view.cc +++ b/ash/shelf/default_shelf_view.cc
@@ -255,41 +255,6 @@ } } -views::View* DefaultShelfView::CreateViewForItem(const ShelfItem& item) { - views::View* view = nullptr; - switch (item.type) { - case TYPE_PINNED_APP: - case TYPE_BROWSER_SHORTCUT: - case TYPE_APP: - case TYPE_DIALOG: { - ShelfAppButton* button = new ShelfAppButton(this); - button->SetImage(item.image); - button->ReflectItemStatus(item); - view = button; - break; - } - - case TYPE_APP_LIST: { - view = new AppListButton(this, shelf()); - break; - } - - case TYPE_BACK_BUTTON: { - view = new BackButton(this); - break; - } - - case TYPE_UNDEFINED: - return nullptr; - } - - if (item.type != TYPE_BACK_BUTTON) - view->set_context_menu_controller(this); - - ConfigureChildView(view); - return view; -} - void DefaultShelfView::LayoutAppListAndBackButtonHighlight() { // Don't show anything if this is the overflow menu. if (is_overflow_mode()) { @@ -312,6 +277,14 @@ back_and_app_list_background_size)); } +std::unique_ptr<BackButton> DefaultShelfView::CreateBackButton() { + return std::make_unique<BackButton>(this); +} + +std::unique_ptr<AppListButton> DefaultShelfView::CreateHomeButton() { + return std::make_unique<AppListButton>(this, shelf()); +} + int DefaultShelfView::GetAvailableSpaceForAppIcons() const { // Subtract space already allocated to the app list button, and the back // button if applicable.
diff --git a/ash/shelf/default_shelf_view.h b/ash/shelf/default_shelf_view.h index dc87218d..bd6881e5 100644 --- a/ash/shelf/default_shelf_view.h +++ b/ash/shelf/default_shelf_view.h
@@ -5,6 +5,8 @@ #ifndef ASH_SHELF_DEFAULT_SHELF_VIEW_H_ #define ASH_SHELF_DEFAULT_SHELF_VIEW_H_ +#include <memory> + #include "ash/ash_export.h" #include "ash/shelf/shelf_view.h" #include "base/macros.h" @@ -17,7 +19,6 @@ namespace ash { class Shelf; -struct ShelfItem; class ShelfModel; class ShelfWidget; @@ -33,8 +34,9 @@ // ShelfView: void Init() override; void CalculateIdealBounds() override; - views::View* CreateViewForItem(const ShelfItem& item) override; void LayoutAppListAndBackButtonHighlight() override; + std::unique_ptr<BackButton> CreateBackButton() override; + std::unique_ptr<AppListButton> CreateHomeButton() override; private: struct AppCenteringStrategy {
diff --git a/ash/shelf/kiosk_next_shelf_view.cc b/ash/shelf/kiosk_next_shelf_view.cc index f442120..65f4638 100644 --- a/ash/shelf/kiosk_next_shelf_view.cc +++ b/ash/shelf/kiosk_next_shelf_view.cc
@@ -152,24 +152,12 @@ } } -views::View* KioskNextShelfView::CreateViewForItem(const ShelfItem& item) { - DCHECK(item.type == TYPE_BACK_BUTTON || item.type == TYPE_APP_LIST); +std::unique_ptr<BackButton> KioskNextShelfView::CreateBackButton() { + return std::make_unique<KioskNextBackButton>(this); +} - if (item.type == TYPE_BACK_BUTTON) { - auto* view = new KioskNextBackButton(this); - ConfigureChildView(view); - return view; - } - - if (item.type == TYPE_APP_LIST) { - auto* view = new KioskNextHomeButton(this, shelf()); - view->set_context_menu_controller(this); - ConfigureChildView(view); - return view; - } - - NOTREACHED(); - return nullptr; +std::unique_ptr<AppListButton> KioskNextShelfView::CreateHomeButton() { + return std::make_unique<KioskNextHomeButton>(this, shelf()); } } // namespace ash
diff --git a/ash/shelf/kiosk_next_shelf_view.h b/ash/shelf/kiosk_next_shelf_view.h index 1d1a57b9..35a6259a 100644 --- a/ash/shelf/kiosk_next_shelf_view.h +++ b/ash/shelf/kiosk_next_shelf_view.h
@@ -5,18 +5,15 @@ #ifndef ASH_SHELF_KIOSK_NEXT_SHELF_VIEW_H_ #define ASH_SHELF_KIOSK_NEXT_SHELF_VIEW_H_ +#include <memory> + #include "ash/ash_export.h" #include "ash/shelf/shelf_view.h" #include "base/macros.h" -namespace views { -class View; -} // namespace views - namespace ash { class Shelf; -struct ShelfItem; class ShelfModel; class ShelfWidget; @@ -37,7 +34,8 @@ // ShelfView: void Init() override; void CalculateIdealBounds() override; - views::View* CreateViewForItem(const ShelfItem& item) override; + std::unique_ptr<BackButton> CreateBackButton() override; + std::unique_ptr<AppListButton> CreateHomeButton() override; private: DISALLOW_COPY_AND_ASSIGN(KioskNextShelfView);
diff --git a/ash/shelf/shelf.cc b/ash/shelf/shelf.cc index 045aafca..3289c1c4 100644 --- a/ash/shelf/shelf.cc +++ b/ash/shelf/shelf.cc
@@ -80,7 +80,8 @@ // Iterating until we have hit the index we are interested in which // is true once indexes_left becomes negative. for (int i = 0; i < item_count && indexes_left >= 0; i++) { - if (items[i].type != TYPE_APP_LIST && items[i].type != TYPE_BACK_BUTTON) { + if (items[i].type != TYPE_APP_LIST_DEPRECATED && + items[i].type != TYPE_BACK_BUTTON_DEPRECATED) { found_index = i; indexes_left--; }
diff --git a/ash/shelf/shelf_view.cc b/ash/shelf/shelf_view.cc index ad096f310..d945e146 100644 --- a/ash/shelf/shelf_view.cc +++ b/ash/shelf/shelf_view.cc
@@ -86,6 +86,7 @@ constexpr int kMarginBetweenAppsAndOverflow = 16; } // namespace +constexpr int kBackButtonIndex = 0; constexpr int kAppListButtonIndex = 1; // The distance of the cursor from the outer rim of the shelf before it @@ -256,8 +257,8 @@ return static_cast<const ShelfAppButton*>(item_view)->state() & ShelfAppButton::STATE_DRAGGING; case TYPE_DIALOG: - case TYPE_BACK_BUTTON: - case TYPE_APP_LIST: + case TYPE_BACK_BUTTON_DEPRECATED: + case TYPE_APP_LIST_DEPRECATED: case TYPE_UNDEFINED: return false; } @@ -353,8 +354,24 @@ model()->AddObserver(this); const ShelfItems& items(model_->items()); + + std::unique_ptr<BackButton> back_button_ptr = CreateBackButton(); + ConfigureChildView(back_button_ptr.get()); + back_button_ = AddChildView(std::move(back_button_ptr)); + view_model_->Add(back_button_, kBackButtonIndex); + + std::unique_ptr<AppListButton> home_button_ptr = CreateHomeButton(); + ConfigureChildView(home_button_ptr.get()); + home_button_ = AddChildView(std::move(home_button_ptr)); + view_model_->Add(home_button_, kAppListButtonIndex); + home_button_->set_context_menu_controller(this); + for (ShelfItems::const_iterator i = items.begin(); i != items.end(); ++i) { views::View* child = CreateViewForItem(*i); + // TODO(manucornet): Remove this if statement once home and back are not + // allowed shelf item types in the model any longer. + if (!child) + continue; child->SetPaintToLayer(); view_model_->Add(child, static_cast<int>(i - items.begin())); AddChildView(child); @@ -406,29 +423,11 @@ } AppListButton* ShelfView::GetAppListButton() const { - for (int i = 0; i < model_->item_count(); ++i) { - if (model_->items()[i].type == TYPE_APP_LIST) { - views::View* view = view_model_->view_at(i); - CHECK_EQ(AppListButton::kViewClassName, view->GetClassName()); - return static_cast<AppListButton*>(view); - } - } - - NOTREACHED() << "Applist button not found"; - return nullptr; + return home_button_; } BackButton* ShelfView::GetBackButton() const { - for (int i = 0; i < model_->item_count(); ++i) { - if (model_->items()[i].type == TYPE_BACK_BUTTON) { - views::View* view = view_model_->view_at(i); - CHECK_EQ(BackButton::kViewClassName, view->GetClassName()); - return static_cast<BackButton*>(view); - } - } - - NOTREACHED() << "Back button not found"; - return nullptr; + return back_button_; } OverflowButton* ShelfView::GetOverflowButton() const { @@ -662,12 +661,12 @@ UMA_LAUNCHER_CLICK_ON_APP); break; - case TYPE_APP_LIST: + case TYPE_APP_LIST_DEPRECATED: Shell::Get()->metrics()->RecordUserMetricsAction( UMA_LAUNCHER_CLICK_ON_APPLIST_BUTTON); break; - case TYPE_BACK_BUTTON: + case TYPE_BACK_BUTTON_DEPRECATED: case TYPE_DIALOG: break; @@ -876,6 +875,33 @@ view->layer()->SetFillsBoundsOpaquely(false); } +views::View* ShelfView::CreateViewForItem(const ShelfItem& item) { + views::View* view = nullptr; + switch (item.type) { + case TYPE_PINNED_APP: + case TYPE_BROWSER_SHORTCUT: + case TYPE_APP: + case TYPE_DIALOG: { + ShelfAppButton* button = new ShelfAppButton(this); + button->SetImage(item.image); + button->ReflectItemStatus(item); + view = button; + break; + } + + // The home and back buttons are created separately. + case TYPE_APP_LIST_DEPRECATED: + case TYPE_BACK_BUTTON_DEPRECATED: + case TYPE_UNDEFINED: + return nullptr; + } + + view->set_context_menu_controller(this); + + ConfigureChildView(view); + return view; +} + void ShelfView::DestroyDragIconProxy() { drag_image_.reset(); drag_image_offset_ = gfx::Vector2d(0, 0); @@ -1535,7 +1561,8 @@ ShelfView::RemovableState ShelfView::RemovableByRipOff(int index) const { DCHECK(index >= 0 && index < model_->item_count()); ShelfItemType type = model_->items()[index].type; - if (type == TYPE_APP_LIST || type == TYPE_DIALOG || type == TYPE_BACK_BUTTON) + if (type == TYPE_APP_LIST_DEPRECATED || type == TYPE_DIALOG || + type == TYPE_BACK_BUTTON_DEPRECATED) return NOT_REMOVABLE; if (model_->items()[index].pinned_by_policy) @@ -1552,9 +1579,9 @@ case TYPE_PINNED_APP: case TYPE_BROWSER_SHORTCUT: return (typeb == TYPE_PINNED_APP || typeb == TYPE_BROWSER_SHORTCUT); - case TYPE_APP_LIST: + case TYPE_APP_LIST_DEPRECATED: case TYPE_APP: - case TYPE_BACK_BUTTON: + case TYPE_BACK_BUTTON_DEPRECATED: case TYPE_DIALOG: return typeb == typea; case TYPE_UNDEFINED: @@ -1576,11 +1603,12 @@ max_index = i; } } - DCHECK_EQ(1, model_->GetItemIndexForType(TYPE_APP_LIST)); + DCHECK_EQ(1, model_->GetItemIndexForType(TYPE_APP_LIST_DEPRECATED)); min_index = - std::max(min_index, is_overflow_mode() - ? first_visible_index_ - : model_->GetItemIndexForType(TYPE_APP_LIST) + 1); + std::max(min_index, + is_overflow_mode() + ? first_visible_index_ + : model_->GetItemIndexForType(TYPE_APP_LIST_DEPRECATED) + 1); max_index = std::min(max_index, last_visible_index_); return std::pair<int, int>(min_index, max_index); } @@ -1835,6 +1863,11 @@ } const ShelfItem& item(model_->items()[model_index]); views::View* view = CreateViewForItem(item); + // Some item types are ignored and yield a null view. Ignore those. + // TODO(manucornet): Remove this if statement once home and back are no + // longer acceptable shelf item types in the model. + if (!view) + return; AddChildView(view); // Hide the view, it'll be made visible when the animation is done. Using // opacity 0 here to avoid messing with CalculateIdealBounds which touches @@ -2139,7 +2172,7 @@ closing_event_time_ = shelf_menu_model_adapter_->GetClosingEventTime(); const ShelfItem* item = ShelfItemForView(source); - if (item && (item->type != TYPE_APP_LIST)) + if (item && (item->type != TYPE_APP_LIST_DEPRECATED)) static_cast<ShelfAppButton*>(source)->OnMenuClosed(); shelf_menu_model_adapter_.reset();
diff --git a/ash/shelf/shelf_view.h b/ash/shelf/shelf_view.h index 8fde061..4e521fd 100644 --- a/ash/shelf/shelf_view.h +++ b/ash/shelf/shelf_view.h
@@ -336,7 +336,10 @@ // Creates the view used to represent given shelf |item|. // Returns unowned pointer (view is owned by the view hierarchy). - virtual views::View* CreateViewForItem(const ShelfItem& item) = 0; + virtual views::View* CreateViewForItem(const ShelfItem& item); + + virtual std::unique_ptr<BackButton> CreateBackButton() = 0; + virtual std::unique_ptr<AppListButton> CreateHomeButton() = 0; // Lays out control buttons background. // Child classes should implement this method if control buttons background @@ -560,6 +563,8 @@ std::unique_ptr<views::BoundsAnimator> bounds_animator_; + BackButton* back_button_ = nullptr; + AppListButton* home_button_ = nullptr; OverflowButton* overflow_button_ = nullptr; std::unique_ptr<OverflowBubble> overflow_bubble_;
diff --git a/ash/shelf/shelf_view_test_api.cc b/ash/shelf/shelf_view_test_api.cc index 14403a9a..b42b8c0 100644 --- a/ash/shelf/shelf_view_test_api.cc +++ b/ash/shelf/shelf_view_test_api.cc
@@ -48,9 +48,12 @@ ShelfAppButton* ShelfViewTestAPI::GetButton(int index) { // App list and back button are not ShelfAppButtons. - if (shelf_view_->model_->items()[index].type == ash::TYPE_APP_LIST || - shelf_view_->model_->items()[index].type == ash::TYPE_BACK_BUTTON) + if (shelf_view_->model_->items()[index].type == + ash::TYPE_APP_LIST_DEPRECATED || + shelf_view_->model_->items()[index].type == + ash::TYPE_BACK_BUTTON_DEPRECATED) { return nullptr; + } return static_cast<ShelfAppButton*>(GetViewAt(index)); }
diff --git a/ash/shelf/shelf_view_unittest.cc b/ash/shelf/shelf_view_unittest.cc index bf32e17..39ce397e 100644 --- a/ash/shelf/shelf_view_unittest.cc +++ b/ash/shelf/shelf_view_unittest.cc
@@ -393,7 +393,7 @@ // since the app list button is not a ShelfAppButton. ShelfAppButton* SimulateButtonPressed(ShelfView::Pointer pointer, int button_index) { - EXPECT_NE(TYPE_APP_LIST, model_->items()[button_index].type); + EXPECT_NE(TYPE_APP_LIST_DEPRECATED, model_->items()[button_index].type); ShelfAppButton* button = test_api_->GetButton(button_index); EXPECT_EQ(button, SimulateViewPressed(pointer, button_index)); return button; @@ -745,17 +745,20 @@ EXPECT_TRUE(test_api_->SameDragType(TYPE_APP, TYPE_APP)); EXPECT_FALSE(test_api_->SameDragType(TYPE_APP, TYPE_PINNED_APP)); EXPECT_FALSE(test_api_->SameDragType(TYPE_APP, TYPE_BROWSER_SHORTCUT)); - EXPECT_FALSE(test_api_->SameDragType(TYPE_APP, TYPE_APP_LIST)); + EXPECT_FALSE(test_api_->SameDragType(TYPE_APP, TYPE_APP_LIST_DEPRECATED)); EXPECT_TRUE(test_api_->SameDragType(TYPE_PINNED_APP, TYPE_PINNED_APP)); EXPECT_TRUE(test_api_->SameDragType(TYPE_PINNED_APP, TYPE_BROWSER_SHORTCUT)); - EXPECT_FALSE(test_api_->SameDragType(TYPE_PINNED_APP, TYPE_APP_LIST)); + EXPECT_FALSE( + test_api_->SameDragType(TYPE_PINNED_APP, TYPE_APP_LIST_DEPRECATED)); EXPECT_TRUE( test_api_->SameDragType(TYPE_BROWSER_SHORTCUT, TYPE_BROWSER_SHORTCUT)); - EXPECT_FALSE(test_api_->SameDragType(TYPE_BROWSER_SHORTCUT, TYPE_APP_LIST)); + EXPECT_FALSE( + test_api_->SameDragType(TYPE_BROWSER_SHORTCUT, TYPE_APP_LIST_DEPRECATED)); - EXPECT_TRUE(test_api_->SameDragType(TYPE_APP_LIST, TYPE_APP_LIST)); + EXPECT_TRUE(test_api_->SameDragType(TYPE_APP_LIST_DEPRECATED, + TYPE_APP_LIST_DEPRECATED)); } // Adds platform app button until overflow and verifies that the last added
diff --git a/ash/strings/ash_strings_am.xtb b/ash/strings/ash_strings_am.xtb index 8256ed2..fe06cb55 100644 --- a/ash/strings/ash_strings_am.xtb +++ b/ash/strings/ash_strings_am.xtb
@@ -12,6 +12,7 @@ <translation id="1104621072296271835">የእርስዎ መሣሪያዎች እንዲያውም የተሻለ ይሠራሉ</translation> <translation id="112308213915226829">መደርደሪያን በራስ ሰር ደብቅ</translation> <translation id="1153356358378277386">የተጣመሩ መሣሪያዎች</translation> +<translation id="1175572348579024023">ሸብልል</translation> <translation id="1178581264944972037">ለአፍታ አቁም</translation> <translation id="1195412055398077112">ትርፍ ቅኝት</translation> <translation id="119944043368869598">ሁሉንም አጽዳ</translation> @@ -250,6 +251,7 @@ <translation id="4778095205580009397">የGoogle ረዳቱ በማሳያ ክፍለ-ጊዜ ውስጥ አይገኝም።</translation> <translation id="479989351350248267">ፈልግ</translation> <translation id="4804818685124855865">ግንኙነት አቋርጥ</translation> +<translation id="4831034276697007977">ራስሰር ጠቅ ማድረጎችን ማጥፋት እንደሚፈልጉ እርግጠኛ ነዎት?</translation> <translation id="4849058404725798627">ነገርየውን ከቁልፍ ሰሌዳ ትኩረት ጋር አድምቅ</translation> <translation id="485592688953820832">ምንም እርምጃ የለም (ባለበት አቁም)</translation> <translation id="4872237917498892622">Alt+Search ወይም Shift</translation> @@ -413,6 +415,7 @@ <translation id="7561014039265304140"><ph name="DISPLAY_NAME" /> <ph name="SPECIFIED_RESOLUTION" />ን አይደግፍም። ጥራቱ ወደ <ph name="FALLBACK_RESOLUTION" /> ተቀይሯል</translation> <translation id="7562368315689366235">ስሜት ገላጭ ሥዕል ቤተ-ሥዕል</translation> <translation id="7564874036684306347">መስኮትን ወደ ሌላ ዴስክቶፕ መውሰድ ያልተጠበቀ ባህሪን ሊያስከትል ይችላል። ተከትለው የሚመጡ ማሳወቂያዎችን፣ መስኮቶች እና መገናኛዎች በዴስክቶፖች መካከል ሊከፈሉ ይችላሉ።</translation> +<translation id="7568294522609223312">ራስሰር ጠቅ ማድረጎችን ያጥፉ</translation> <translation id="7569509451529460200">ብሬይል እና ChromeVox ነቅተዋል</translation> <translation id="7593891976182323525">Search ወይም Shift</translation> <translation id="7645176681409127223"><ph name="USER_NAME" /> (ባለቤት)</translation>
diff --git a/ash/strings/ash_strings_bg.xtb b/ash/strings/ash_strings_bg.xtb index 0a1f251..07b4afbb 100644 --- a/ash/strings/ash_strings_bg.xtb +++ b/ash/strings/ash_strings_bg.xtb
@@ -12,6 +12,7 @@ <translation id="1104621072296271835">Устройствата ви работят още по-добре заедно</translation> <translation id="112308213915226829">Автоматично скриване на лавицата</translation> <translation id="1153356358378277386">Сдвоени устройства</translation> +<translation id="1175572348579024023">Превъртане</translation> <translation id="1178581264944972037">Пауза</translation> <translation id="1195412055398077112">допълнителна област</translation> <translation id="119944043368869598">Изчистване на всички</translation> @@ -250,6 +251,7 @@ <translation id="4778095205580009397">Google Асистент не е налице по време на демонстрационна сесия.</translation> <translation id="479989351350248267">search</translation> <translation id="4804818685124855865">Изключване</translation> +<translation id="4831034276697007977">Наистина ли искате да изключите автоматичните кликвания?</translation> <translation id="4849058404725798627">Открояване на обекта, върху който е фокусът от клавиатурата</translation> <translation id="485592688953820832">Без действие (пауза)</translation> <translation id="4872237917498892622">„Alt + търсене“ или „Shift“</translation> @@ -413,6 +415,7 @@ <translation id="7561014039265304140">„<ph name="DISPLAY_NAME" />“ не поддържа разделителна способност от <ph name="SPECIFIED_RESOLUTION" />. Тя бе променена на <ph name="FALLBACK_RESOLUTION" /></translation> <translation id="7562368315689366235">Панел с емотикони</translation> <translation id="7564874036684306347">Преместването на прозорци към друг работен плот може да предизвика неочаквано поведение. Последващите известия, прозорци и диалогови прозорци може да бъдат разделени между работните плотове.</translation> +<translation id="7568294522609223312">Изключване на автоматичните кликвания</translation> <translation id="7569509451529460200">Активирахте функцията за брайлово писмо и ChromeVox</translation> <translation id="7593891976182323525">„търсене“ или „Shift“</translation> <translation id="7645176681409127223"><ph name="USER_NAME" /> (собственик)</translation>
diff --git a/ash/strings/ash_strings_bn.xtb b/ash/strings/ash_strings_bn.xtb index 4aeb510..b2ab2b22 100644 --- a/ash/strings/ash_strings_bn.xtb +++ b/ash/strings/ash_strings_bn.xtb
@@ -12,6 +12,7 @@ <translation id="1104621072296271835">আপনার ডিভাইসগুলি একসাথে আরও ভাল কাজ করে</translation> <translation id="112308213915226829">তাককে স্বয়ংক্রিয়ভাবে লুকান</translation> <translation id="1153356358378277386">যুক্ত করা ডিভাইসগুলি</translation> +<translation id="1175572348579024023">স্ক্রল করুন</translation> <translation id="1178581264944972037">বিরতি</translation> <translation id="1195412055398077112">ওভারস্ক্যান</translation> <translation id="119944043368869598">সব পরিষ্কার করুন</translation> @@ -250,6 +251,7 @@ <translation id="4778095205580009397">একটি ডেমো সেশনে Google অ্যাসিস্ট্যান্ট উপলভ্য নয়।</translation> <translation id="479989351350248267">search</translation> <translation id="4804818685124855865">সংযোগ বিচ্ছিন্ন</translation> +<translation id="4831034276697007977">অটোমেটিক ক্লিক বন্ধ করতে চান কিনা সেই বিষয়টি ভাল করে দেখে নিন?</translation> <translation id="4849058404725798627">কিবোর্ড ফোকাসের মাধ্যমে হাইলাইট করুন</translation> <translation id="485592688953820832">কোনও অ্যাকশন নেবেন না (পজ)</translation> <translation id="4872237917498892622">Alt+Search অথবা Shift</translation> @@ -414,6 +416,7 @@ <translation id="7561014039265304140"><ph name="DISPLAY_NAME" />, <ph name="SPECIFIED_RESOLUTION" /> সমর্থন করে না৷ রেজোলিউশন <ph name="FALLBACK_RESOLUTION" />-এ পরিবর্তিত হয়েছে</translation> <translation id="7562368315689366235">ইমোজি প্যালেট</translation> <translation id="7564874036684306347">কোনও উইন্ডো অন্য ডেস্কটপে সরানো হলে সেটির আচরণে অপ্রত্যাশিত পরিবর্তন হতে পারে। পরবর্তী বিজ্ঞপ্তি, উইন্ডো এবং ডায়ালগ দুটি ডেস্কটপ মিলিয়ে দেখানো হতে পারে।</translation> +<translation id="7568294522609223312">অটোমেটিক ক্লিক বিকল্প বন্ধ করুন</translation> <translation id="7569509451529460200">ব্রেল এবং ChromeVox সক্ষম করেছেন</translation> <translation id="7593891976182323525">Search অথবা Shift</translation> <translation id="7645176681409127223"><ph name="USER_NAME" /> (মালিক)</translation>
diff --git a/ash/strings/ash_strings_ca.xtb b/ash/strings/ash_strings_ca.xtb index 2b13c85a..ce62907 100644 --- a/ash/strings/ash_strings_ca.xtb +++ b/ash/strings/ash_strings_ca.xtb
@@ -12,6 +12,7 @@ <translation id="1104621072296271835">Els teus dispositius funcionen encara millor junts</translation> <translation id="112308213915226829">Amaga el prestatge automàticament</translation> <translation id="1153356358378277386">Dispositius vinculats</translation> +<translation id="1175572348579024023">Desplaça</translation> <translation id="1178581264944972037">Posa en pausa</translation> <translation id="1195412055398077112">ajusta la mida</translation> <translation id="119944043368869598">Esborra-ho tot</translation> @@ -250,6 +251,7 @@ <translation id="4778095205580009397">L'Assistent de Google no està disponible en les sessions de demostració.</translation> <translation id="479989351350248267">cerca</translation> <translation id="4804818685124855865">Desconnecta</translation> +<translation id="4831034276697007977">Confirmes que vols desactivar els clics automàtics?</translation> <translation id="4849058404725798627">Ressalta l'objecte amb el focus del teclat</translation> <translation id="485592688953820832">No facis res (pausa)</translation> <translation id="4872237917498892622">Alt+Cerca o Maj</translation> @@ -298,7 +300,7 @@ <translation id="574392208103952083">Mitjà</translation> <translation id="5744083938413354016">Tocar i arrossegar</translation> <translation id="5750765938512549687">El Bluetooth està desactivat</translation> -<translation id="5777841717266010279">Voleu deixar de compartir la pantalla?</translation> +<translation id="5777841717266010279">Vols aturar la compartició de pantalla?</translation> <translation id="57838592816432529">Silencia</translation> <translation id="5820394555380036790">Chromium OS</translation> <translation id="5837036133683224804">Atura <ph name="ROUTE_TITLE" /> a <ph name="RECEIVER_NAME" /></translation> @@ -319,7 +321,7 @@ <translation id="6018164090099858612">S'està sortint del mode de rèplica</translation> <translation id="6043212731627905357">Aquest monitor i el teu <ph name="DEVICE_TYPE" /> no s'entenen (el monitor no és compatible).</translation> <translation id="6043994281159824495">Tanca la sessió ara</translation> -<translation id="6047696787498798094">La pantalla es deixarà de compartir quan canvieu d'usuari. Voleu continuar?</translation> +<translation id="6047696787498798094">La compartició de pantalla s'aturarà quan canviïs d'usuari. Vols continuar?</translation> <translation id="6062360702481658777">Es tancarà la sessió automàticament d'aquí a <ph name="LOGOUT_TIME_LEFT" />.</translation> <translation id="6064337552080329342">No s'ha pogut verificar la contrasenya. Torna-ho a provar.</translation> <translation id="607652042414456612">El vostre ordinador està visible als dispositius Bluetooth propers i apareixerà com a "<ph name="NAME" />" amb l'adreça <ph name="ADDRESS" />.</translation> @@ -413,6 +415,7 @@ <translation id="7561014039265304140"><ph name="DISPLAY_NAME" /> no admet <ph name="SPECIFIED_RESOLUTION" />. S'ha canviat la resolució per <ph name="FALLBACK_RESOLUTION" />.</translation> <translation id="7562368315689366235">Paleta d'emoji</translation> <translation id="7564874036684306347">Moure finestres a un altre escriptori pot provocar un comportament imprevist. És possible que les notificacions, les finestres i els quadres de diàleg següents quedin dividits entre escriptoris.</translation> +<translation id="7568294522609223312">Desactiva els clics automàtics</translation> <translation id="7569509451529460200">S'ha activat el braille i ChromeVox</translation> <translation id="7593891976182323525">Cerca o Maj</translation> <translation id="7645176681409127223"><ph name="USER_NAME" /> (propietari)</translation>
diff --git a/ash/strings/ash_strings_cs.xtb b/ash/strings/ash_strings_cs.xtb index e6ca719..43cddcfa0 100644 --- a/ash/strings/ash_strings_cs.xtb +++ b/ash/strings/ash_strings_cs.xtb
@@ -12,6 +12,7 @@ <translation id="1104621072296271835">Společně budou vaše zařízení fungovat ještě lépe</translation> <translation id="112308213915226829">Automaticky skrývat poličku</translation> <translation id="1153356358378277386">Spárovaná zařízení</translation> +<translation id="1175572348579024023">Posunout</translation> <translation id="1178581264944972037">Pozastavit</translation> <translation id="1195412055398077112">přesah obrazu</translation> <translation id="119944043368869598">Vymazat vše</translation> @@ -250,6 +251,7 @@ <translation id="4778095205580009397">Asistent Google není v ukázkové relaci k dispozici.</translation> <translation id="479989351350248267">search</translation> <translation id="4804818685124855865">Odpojit</translation> +<translation id="4831034276697007977">Opravdu chcete automatická kliknutí vypnout?</translation> <translation id="4849058404725798627">Zvýraznit objekt se zaměřením pro zadávání</translation> <translation id="485592688953820832">Žádná akce (pozastavit)</translation> <translation id="4872237917498892622">Alt + Vyhledávání nebo Shift</translation> @@ -413,6 +415,7 @@ <translation id="7561014039265304140"><ph name="DISPLAY_NAME" /> rozlišení <ph name="SPECIFIED_RESOLUTION" /> nepodporuje. Rozlišení bylo změněno zpět na <ph name="FALLBACK_RESOLUTION" />.</translation> <translation id="7562368315689366235">Paleta emodži</translation> <translation id="7564874036684306347">Přesunutí oken na jinou plochu může vést k neočekávanému chování. Následná oznámení, okna a dialogy mohou být rozděleny mezi plochy.</translation> +<translation id="7568294522609223312">Vypnout automatická kliknutí</translation> <translation id="7569509451529460200">Jsou zapnuty funkce Braille a ChromeVox</translation> <translation id="7593891976182323525">Vyhledávání nebo Shift</translation> <translation id="7645176681409127223"><ph name="USER_NAME" /> (vlastník)</translation>
diff --git a/ash/strings/ash_strings_el.xtb b/ash/strings/ash_strings_el.xtb index df127e2..72de051 100644 --- a/ash/strings/ash_strings_el.xtb +++ b/ash/strings/ash_strings_el.xtb
@@ -12,6 +12,7 @@ <translation id="1104621072296271835">Οι συσκευές σας λειτουργούν ακόμα καλύτερα συνδυαστικά</translation> <translation id="112308213915226829">Αυτόματη απόκρυψη ραφιού</translation> <translation id="1153356358378277386">Συσκευές σε σύζευξη</translation> +<translation id="1175572348579024023">Κύλιση</translation> <translation id="1178581264944972037">Παύση</translation> <translation id="1195412055398077112">υπερσάρωση</translation> <translation id="119944043368869598">Διαγραφή όλων</translation> @@ -250,6 +251,7 @@ <translation id="4778095205580009397">Ο Βοηθός Google δεν είναι διαθέσιμος σε περίοδο λειτουργίας επίδειξης.</translation> <translation id="479989351350248267">search</translation> <translation id="4804818685124855865">Αποσύνδεση</translation> +<translation id="4831034276697007977">Είστε βέβαιοι ότι θέλετε να απενεργοποιήσετε τα αυτόματα κλικ;</translation> <translation id="4849058404725798627">Επισήμανση αντικειμένου με εστίαση στο πληκτρολόγιο</translation> <translation id="485592688953820832">Καμία ενέργεια (παύση)</translation> <translation id="4872237917498892622">Alt+Search ή Shift</translation> @@ -413,6 +415,7 @@ <translation id="7561014039265304140">Το <ph name="DISPLAY_NAME" /> δεν υποστηρίζει το <ph name="SPECIFIED_RESOLUTION" />. Η ανάλυση άλλαξε σε <ph name="FALLBACK_RESOLUTION" /></translation> <translation id="7562368315689366235">Παλέτα Emoji</translation> <translation id="7564874036684306347">Η μετακίνηση των παραθύρων σε άλλη επιφάνεια εργασίας ενδέχεται να οδηγήσει σε μη αναμενόμενη συμπεριφορά. Ενδέχεται να γίνει διαχωρισμός μεταγενέστερων ειδοποιήσεων, παραθύρων και παραθύρων διαλόγου μεταξύ των επιφανειών εργασίας.</translation> +<translation id="7568294522609223312">Απενεργοποίηση αυτόματων κλικ</translation> <translation id="7569509451529460200">Το Braille και το ChromeVox ενεργοποιήθηκαν</translation> <translation id="7593891976182323525">Search ή Shift</translation> <translation id="7645176681409127223"><ph name="USER_NAME" /> (κάτοχος)</translation>
diff --git a/ash/strings/ash_strings_en-GB.xtb b/ash/strings/ash_strings_en-GB.xtb index f8f4048..5254985 100644 --- a/ash/strings/ash_strings_en-GB.xtb +++ b/ash/strings/ash_strings_en-GB.xtb
@@ -12,6 +12,7 @@ <translation id="1104621072296271835">Your devices work even better together</translation> <translation id="112308213915226829">Autohide shelf</translation> <translation id="1153356358378277386">Paired devices</translation> +<translation id="1175572348579024023">Scroll</translation> <translation id="1178581264944972037">Pause</translation> <translation id="1195412055398077112">overscan</translation> <translation id="119944043368869598">Clear all</translation> @@ -250,6 +251,7 @@ <translation id="4778095205580009397">The Google Assistant is not available in a demo session.</translation> <translation id="479989351350248267">search</translation> <translation id="4804818685124855865">Disconnect</translation> +<translation id="4831034276697007977">Are you sure that you want to turn off automatic clicks?</translation> <translation id="4849058404725798627">Highlight object with keyboard focus</translation> <translation id="485592688953820832">No action (pause)</translation> <translation id="4872237917498892622">Alt+Search or Shift</translation> @@ -413,6 +415,7 @@ <translation id="7561014039265304140"><ph name="DISPLAY_NAME" /> doesn't support <ph name="SPECIFIED_RESOLUTION" />. The resolution was changed to <ph name="FALLBACK_RESOLUTION" /></translation> <translation id="7562368315689366235">Emoji palette</translation> <translation id="7564874036684306347">Moving windows to another desktop may result in unexpected behaviour. Subsequent notifications, windows and dialogues may be split between desktops.</translation> +<translation id="7568294522609223312">Turn off automatic clicks</translation> <translation id="7569509451529460200">Braille and ChromeVox are enabled</translation> <translation id="7593891976182323525">Search or Shift</translation> <translation id="7645176681409127223"><ph name="USER_NAME" /> (owner)</translation>
diff --git a/ash/strings/ash_strings_et.xtb b/ash/strings/ash_strings_et.xtb index e710e303..e01d270 100644 --- a/ash/strings/ash_strings_et.xtb +++ b/ash/strings/ash_strings_et.xtb
@@ -12,6 +12,7 @@ <translation id="1104621072296271835">Teie seadmed töötavad koos veelgi paremini</translation> <translation id="112308213915226829">Riiuli automaatne peitmine</translation> <translation id="1153356358378277386">Seotud seadmed</translation> +<translation id="1175572348579024023">Keri</translation> <translation id="1178581264944972037">Peata</translation> <translation id="1195412055398077112">liighälvitus</translation> <translation id="119944043368869598">Tühjenda kõik</translation> @@ -251,6 +252,7 @@ <translation id="4778095205580009397">Google'i assistent ei ole demoseansi puhul saadaval.</translation> <translation id="479989351350248267">otsing</translation> <translation id="4804818685124855865">Katkesta ühendus</translation> +<translation id="4831034276697007977">Kas soovite automaatsed klikid kindlasti välja lülitada?</translation> <translation id="4849058404725798627">Klaviatuuri fookusega objekti esiletõstmine</translation> <translation id="485592688953820832">Toiming puudub (peatamine)</translation> <translation id="4872237917498892622">Alt + otsinguklahv või tõstuklahv</translation> @@ -414,6 +416,7 @@ <translation id="7561014039265304140">Üksus <ph name="DISPLAY_NAME" /> ei toeta eraldusvõimet <ph name="SPECIFIED_RESOLUTION" />. Eraldusvõime muudeti tagasi väärtusele <ph name="FALLBACK_RESOLUTION" /></translation> <translation id="7562368315689366235">Emotikonide palett</translation> <translation id="7564874036684306347">Kui teisaldate aknad teisele töölauale, võib tagajärjeks olla ootamatu käitumine. Järgmised märguanded, aknad ja dialoogid võivad jaguneda eri töölaudade vahel.</translation> +<translation id="7568294522609223312">Automaatsete klikkide väljalülitamine</translation> <translation id="7569509451529460200">Punktkiri ja ChromeVox on lubatud</translation> <translation id="7593891976182323525">Otsinguklahv või tõstuklahv</translation> <translation id="7645176681409127223"><ph name="USER_NAME" /> (omanik)</translation>
diff --git a/ash/strings/ash_strings_fi.xtb b/ash/strings/ash_strings_fi.xtb index 51068bc..190b042 100644 --- a/ash/strings/ash_strings_fi.xtb +++ b/ash/strings/ash_strings_fi.xtb
@@ -12,6 +12,7 @@ <translation id="1104621072296271835">Laitteesi toimivat entistä paremmin yhdessä</translation> <translation id="112308213915226829">Piilota hylly automaattisesti</translation> <translation id="1153356358378277386">Laiteparit</translation> +<translation id="1175572348579024023">Vieritä</translation> <translation id="1178581264944972037">Tauko</translation> <translation id="1195412055398077112">kuvasta rajataan pois osa</translation> <translation id="119944043368869598">Tyhjennä kaikki</translation> @@ -251,6 +252,7 @@ <translation id="4778095205580009397">Google Assistantia ei voi käyttää demo-käyttökerralla.</translation> <translation id="479989351350248267">haku</translation> <translation id="4804818685124855865">Katkaise yhteys</translation> +<translation id="4831034276697007977">Haluatko varmasti lopettaa automaattisen klikkaamisen?</translation> <translation id="4849058404725798627">Korosta tekstin syöttökohde</translation> <translation id="485592688953820832">Ei toimenpiteitä (keskeytä)</translation> <translation id="4872237917498892622">Alt + haku tai Shift</translation> @@ -416,6 +418,7 @@ <translation id="7561014039265304140"><ph name="DISPLAY_NAME" /> ei tue resoluutiota <ph name="SPECIFIED_RESOLUTION" />. Resoluutioksi valittiin <ph name="FALLBACK_RESOLUTION" />.</translation> <translation id="7562368315689366235">Emojipaletti</translation> <translation id="7564874036684306347">Ikkunan siirtämisellä toiselle työpöydälle voi olla odottamattomia seurauksia. Myöhemmät ilmoitukset, ikkunat ja valintaikkunat voidaan jakaa työpöytien välillä.</translation> +<translation id="7568294522609223312">Lopeta automaattinen klikkaaminen</translation> <translation id="7569509451529460200">Pistekirjoitus ja ChromeVox käytössä</translation> <translation id="7593891976182323525">Haku tai Shift</translation> <translation id="7645176681409127223"><ph name="USER_NAME" /> (omistaja)</translation>
diff --git a/ash/strings/ash_strings_fr.xtb b/ash/strings/ash_strings_fr.xtb index 7ffaa9a..f3d7d748d 100644 --- a/ash/strings/ash_strings_fr.xtb +++ b/ash/strings/ash_strings_fr.xtb
@@ -12,6 +12,7 @@ <translation id="1104621072296271835">Vos appareils fonctionnent encore mieux ensemble</translation> <translation id="112308213915226829">Masquer automatiquement l'étagère</translation> <translation id="1153356358378277386">Appareils associés</translation> +<translation id="1175572348579024023">Faire défiler</translation> <translation id="1178581264944972037">Suspendre</translation> <translation id="1195412055398077112">Surbalayage</translation> <translation id="119944043368869598">Tout effacer</translation> @@ -251,6 +252,7 @@ <translation id="4778095205580009397">L'Assistant Google n'est pas disponible dans une session de démonstration.</translation> <translation id="479989351350248267">rechercher</translation> <translation id="4804818685124855865">Se déconnecter</translation> +<translation id="4831034276697007977">Voulez-vous vraiment désactiver les clics automatiques ?</translation> <translation id="4849058404725798627">Mettre l'objet sélectionné au clavier en surbrillance</translation> <translation id="485592688953820832">Aucune action (pause)</translation> <translation id="4872237917498892622">Alt + Recherche ou Maj</translation> @@ -414,6 +416,7 @@ <translation id="7561014039265304140"><ph name="DISPLAY_NAME" /> n'est pas compatible avec <ph name="SPECIFIED_RESOLUTION" />. La résolution a été modifiée pour utiliser <ph name="FALLBACK_RESOLUTION" />.</translation> <translation id="7562368315689366235">Palette d'emoji</translation> <translation id="7564874036684306347">Le déplacement de fenêtres vers un autre écran peut entraîner un comportement inattendu. Par exemple, les notifications, les fenêtres et les boîtes de dialogue peuvent s'afficher sur les deux écrans.</translation> +<translation id="7568294522609223312">Désactiver les clics automatiques</translation> <translation id="7569509451529460200">Braille et ChromeVox activés</translation> <translation id="7593891976182323525">Recherche ou Maj</translation> <translation id="7645176681409127223"><ph name="USER_NAME" /> (propriétaire)</translation>
diff --git a/ash/strings/ash_strings_hr.xtb b/ash/strings/ash_strings_hr.xtb index 324eab3..5810c13 100644 --- a/ash/strings/ash_strings_hr.xtb +++ b/ash/strings/ash_strings_hr.xtb
@@ -12,6 +12,7 @@ <translation id="1104621072296271835">Vaši uređaji funkcioniraju još bolje zajedno</translation> <translation id="112308213915226829">Automatski sakrij policu</translation> <translation id="1153356358378277386">Upareni uređaji</translation> +<translation id="1175572348579024023">Pomicanje</translation> <translation id="1178581264944972037">Pauziraj</translation> <translation id="1195412055398077112">rubno područje zaslona</translation> <translation id="119944043368869598">Očisti sve</translation> @@ -250,6 +251,7 @@ <translation id="4778095205580009397">Google asistent nije dostupan u demosesiji.</translation> <translation id="479989351350248267">search</translation> <translation id="4804818685124855865">Prekini vezu</translation> +<translation id="4831034276697007977">Jeste li sigurni da želite isključiti automatske klikove?</translation> <translation id="4849058404725798627">Istakni objekt fokusom na tipkovnici</translation> <translation id="485592688953820832">Nema radnje (pauza)</translation> <translation id="4872237917498892622">Alt + Pretraživanje ili Shift</translation> @@ -413,6 +415,7 @@ <translation id="7561014039265304140"><ph name="DISPLAY_NAME" /> ne podržava razlučivost <ph name="SPECIFIED_RESOLUTION" />. Razlučivost je promijenjena u <ph name="FALLBACK_RESOLUTION" /></translation> <translation id="7562368315689366235">Paleta emojija</translation> <translation id="7564874036684306347">Premještanje prozora na drugu radnu površinu može dovesti do neočekivanog ponašanja. Daljnje obavijesti, prozori i dijaloški okviri mogu se podijeliti između radnih površina.</translation> +<translation id="7568294522609223312">Isključi automatske klikove</translation> <translation id="7569509451529460200">Brajica i ChromeVox omogućeni</translation> <translation id="7593891976182323525">Pretraživanje ili Shift</translation> <translation id="7645176681409127223"><ph name="USER_NAME" /> (vlasnik)</translation>
diff --git a/ash/strings/ash_strings_hu.xtb b/ash/strings/ash_strings_hu.xtb index ca6fa229..bcfe72f 100644 --- a/ash/strings/ash_strings_hu.xtb +++ b/ash/strings/ash_strings_hu.xtb
@@ -12,6 +12,7 @@ <translation id="1104621072296271835">Eszközei együtt még jobban működnek</translation> <translation id="112308213915226829">Polc automatikus elrejtése</translation> <translation id="1153356358378277386">Párosított eszközök</translation> +<translation id="1175572348579024023">Görgetés</translation> <translation id="1178581264944972037">Szünet</translation> <translation id="1195412055398077112">túlpásztázás</translation> <translation id="119944043368869598">Összes törlése</translation> @@ -251,6 +252,7 @@ <translation id="4778095205580009397">A Google Segéd nem áll rendelkezésre bemutató munkamenetben.</translation> <translation id="479989351350248267">search</translation> <translation id="4804818685124855865">Kapcsolat bontása</translation> +<translation id="4831034276697007977">Biztosan kikapcsolja az automatikus kattintásokat?</translation> <translation id="4849058404725798627">Objektum kiemelése billentyűzetfókusszal</translation> <translation id="485592688953820832">Nincs művelet (szünet)</translation> <translation id="4872237917498892622">Alt + Keresés vagy Shift</translation> @@ -414,6 +416,7 @@ <translation id="7561014039265304140">A(z) <ph name="DISPLAY_NAME" /> nem támogatja a következő felbontást: <ph name="SPECIFIED_RESOLUTION" />. A felbontás megváltozott erre: <ph name="FALLBACK_RESOLUTION" /></translation> <translation id="7562368315689366235">Hangulatjel-paletta</translation> <translation id="7564874036684306347">Az ablakok másik asztalra történő áthelyezése váratlan viselkedést eredményezhet. Az ezt követő értesítéseket, ablakokat és párbeszédpaneleket a rendszer megoszthatja az asztalok között.</translation> +<translation id="7568294522609223312">Automatikus kattintások kikapcsolása</translation> <translation id="7569509451529460200">Braille és ChromeVox bekapcsolva</translation> <translation id="7593891976182323525">Keresés vagy Shift</translation> <translation id="7645176681409127223"><ph name="USER_NAME" /> (tulajdonos)</translation>
diff --git a/ash/strings/ash_strings_it.xtb b/ash/strings/ash_strings_it.xtb index f182bb1..735dd00 100644 --- a/ash/strings/ash_strings_it.xtb +++ b/ash/strings/ash_strings_it.xtb
@@ -12,6 +12,7 @@ <translation id="1104621072296271835">I tuoi dispositivi funzionano ancora meglio insieme</translation> <translation id="112308213915226829">Nascondi automaticamente shelf</translation> <translation id="1153356358378277386">Dispositivi accoppiati</translation> +<translation id="1175572348579024023">Scorri</translation> <translation id="1178581264944972037">Pausa</translation> <translation id="1195412055398077112">overscan</translation> <translation id="119944043368869598">Cancella tutto</translation> @@ -251,6 +252,7 @@ <translation id="4778095205580009397">L'Assistente Google non è disponibile in una sessione demo.</translation> <translation id="479989351350248267">ricerca</translation> <translation id="4804818685124855865">Disconnetti</translation> +<translation id="4831034276697007977">Vuoi disattivare i clic automatici?</translation> <translation id="4849058404725798627">Evidenzia oggetto con stato attivo della tastiera</translation> <translation id="485592688953820832">Nessuna azione (pausa)</translation> <translation id="4872237917498892622">Alt+tasto per la ricerca o Maiusc</translation> @@ -414,6 +416,7 @@ <translation id="7561014039265304140"><ph name="DISPLAY_NAME" /> non supporta <ph name="SPECIFIED_RESOLUTION" />. La risoluzione è stata modificata in <ph name="FALLBACK_RESOLUTION" /></translation> <translation id="7562368315689366235">Riquadro di emoji</translation> <translation id="7564874036684306347">Lo spostamento delle finestre su un altro desktop potrebbe causare comportamenti imprevisti. Le finestre, le notifiche e le finestre di dialogo successive potrebbero essere divise tra i desktop.</translation> +<translation id="7568294522609223312">Disattiva i clic automatici</translation> <translation id="7569509451529460200">Braille e ChromeVox attivati</translation> <translation id="7593891976182323525">Tasto per la ricerca o Maiusc</translation> <translation id="7645176681409127223"><ph name="USER_NAME" /> (proprietario)</translation>
diff --git a/ash/strings/ash_strings_lt.xtb b/ash/strings/ash_strings_lt.xtb index 8d2ca740..175888f 100644 --- a/ash/strings/ash_strings_lt.xtb +++ b/ash/strings/ash_strings_lt.xtb
@@ -12,6 +12,7 @@ <translation id="1104621072296271835">Jūsų įrenginiai kartu veikia dar geriau</translation> <translation id="112308213915226829">Automatiškai slėpti lentyną</translation> <translation id="1153356358378277386">Susieti įrenginiai</translation> +<translation id="1175572348579024023">Slinkti</translation> <translation id="1178581264944972037">Pristabdyti</translation> <translation id="1195412055398077112">sritis aplink vaizdo kraštus</translation> <translation id="119944043368869598">Valyti viską</translation> @@ -251,6 +252,7 @@ <translation id="4778095205580009397">„Google“ padėjėjas nepasiekiamas demonstracinėje sesijoje.</translation> <translation id="479989351350248267">ieškoti</translation> <translation id="4804818685124855865">Atsijungti</translation> +<translation id="4831034276697007977">Ar tikrai norite išjungti automatinius paspaudimus?</translation> <translation id="4849058404725798627">Paryškinti objektą jį suaktyvinus klaviatūra</translation> <translation id="485592688953820832">Nesiimti jokių veiksmų (pristabdyti)</translation> <translation id="4872237917498892622">„Alt“ + paieškos arba antrojo lygio klavišas</translation> @@ -414,6 +416,7 @@ <translation id="7561014039265304140">„<ph name="DISPLAY_NAME" />“ nepalaiko <ph name="SPECIFIED_RESOLUTION" />. Skyra pakeista į <ph name="FALLBACK_RESOLUTION" /></translation> <translation id="7562368315689366235">Jaustukų paletė</translation> <translation id="7564874036684306347">Perkėlus langus į kitą darbalaukį gali pasireikšti nenumatyta elgsena. Vėlesni pranešimai, langai ir dialogų langai gali būti padalyti keliuose darbalaukiuose.</translation> +<translation id="7568294522609223312">Išjungti automatinius paspaudimus</translation> <translation id="7569509451529460200">Brailio rašmenys ir „ChromeVox“ įgalinti</translation> <translation id="7593891976182323525">Paieškos arba antrojo lygio klavišas</translation> <translation id="7645176681409127223"><ph name="USER_NAME" /> (savininkas)</translation>
diff --git a/ash/strings/ash_strings_lv.xtb b/ash/strings/ash_strings_lv.xtb index 4b151bb..95989b4 100644 --- a/ash/strings/ash_strings_lv.xtb +++ b/ash/strings/ash_strings_lv.xtb
@@ -12,6 +12,7 @@ <translation id="1104621072296271835">Kopā jūsu ierīces darbojas vēl labāk</translation> <translation id="112308213915226829">Automātiski slēpt plauktu</translation> <translation id="1153356358378277386">Pārī savienotās ierīces</translation> +<translation id="1175572348579024023">Ritināt</translation> <translation id="1178581264944972037">Pauzēt</translation> <translation id="1195412055398077112">attēla izvērse</translation> <translation id="119944043368869598">Notīrīt visu</translation> @@ -250,6 +251,7 @@ <translation id="4778095205580009397">Google asistents nav pieejams demonstrācijas sesijā.</translation> <translation id="479989351350248267">meklēt</translation> <translation id="4804818685124855865">Atvienot</translation> +<translation id="4831034276697007977">Vai tiešām vēlaties izslēgt automātiskos klikšķus?</translation> <translation id="4849058404725798627">Izcelt objektu ar tastatūras fokusu</translation> <translation id="485592688953820832">Neveikt darbību (pārtraukt)</translation> <translation id="4872237917498892622">Alt+Meklēt vai Shift</translation> @@ -413,6 +415,7 @@ <translation id="7561014039265304140"><ph name="DISPLAY_NAME" /> neatbalsta šādu izšķirtspēju: <ph name="SPECIFIED_RESOLUTION" />. Izšķirtspēja tika mainīta uz <ph name="FALLBACK_RESOLUTION" />.</translation> <translation id="7562368315689366235">Emocijzīmju palete</translation> <translation id="7564874036684306347">Logu pārvietošana uz citu darbvirsmu var izraisīt neparedzētu darbību. Turpmākie paziņojumi, logi un dialoglodziņi var tikt sadalīti pa darbvirsmām.</translation> +<translation id="7568294522609223312">Izslēgt automātiskos klikšķus</translation> <translation id="7569509451529460200">Braila raksts un ChromeVox ir iespējoti</translation> <translation id="7593891976182323525">Meklēt vai Shift</translation> <translation id="7645176681409127223"><ph name="USER_NAME" /> (īpašnieks)</translation>
diff --git a/ash/strings/ash_strings_no.xtb b/ash/strings/ash_strings_no.xtb index aee77e79..32cf64d 100644 --- a/ash/strings/ash_strings_no.xtb +++ b/ash/strings/ash_strings_no.xtb
@@ -12,6 +12,7 @@ <translation id="1104621072296271835">Enhetene fungerer enda bedre sammen</translation> <translation id="112308213915226829">Skjul hyllen automatisk</translation> <translation id="1153356358378277386">Tilkoblede enheter</translation> +<translation id="1175572348579024023">Rull</translation> <translation id="1178581264944972037">Stans midlertidig</translation> <translation id="1195412055398077112">overscan</translation> <translation id="119944043368869598">Fjern alle</translation> @@ -250,6 +251,7 @@ <translation id="4778095205580009397">Google-assistenten er ikke tilgjengelig under demonstrasjonsøkter.</translation> <translation id="479989351350248267">søk</translation> <translation id="4804818685124855865">Koble fra</translation> +<translation id="4831034276697007977">Er du sikker på at du vil slå av automatiske klikk?</translation> <translation id="4849058404725798627">Fremhev objektet med tastaturfokus</translation> <translation id="485592688953820832">Ingen handling (pause)</translation> <translation id="4872237917498892622">Alt + Søk eller Shift</translation> @@ -413,6 +415,7 @@ <translation id="7561014039265304140"><ph name="DISPLAY_NAME" /> støtter ikke <ph name="SPECIFIED_RESOLUTION" />. Oppløsningen ble endret til <ph name="FALLBACK_RESOLUTION" /></translation> <translation id="7562368315689366235">Emoji-palett</translation> <translation id="7564874036684306347">Flytting av vinduer til et annet skrivebord kan føre til uventet atferd. Følgende varsler, vinduer og dialogbokser kan bli delt mellom skrivebordene.</translation> +<translation id="7568294522609223312">Slå av automatiske klikk</translation> <translation id="7569509451529460200">Braille og ChromeVox er slått på</translation> <translation id="7593891976182323525">Søk eller Shift</translation> <translation id="7645176681409127223"><ph name="USER_NAME" /> (eier)</translation>
diff --git a/ash/strings/ash_strings_pl.xtb b/ash/strings/ash_strings_pl.xtb index cb0f94e5..95cc6e5 100644 --- a/ash/strings/ash_strings_pl.xtb +++ b/ash/strings/ash_strings_pl.xtb
@@ -12,6 +12,7 @@ <translation id="1104621072296271835">Razem Twoje urządzenia mogą jeszcze więcej</translation> <translation id="112308213915226829">Autoukrywanie półki</translation> <translation id="1153356358378277386">Sparowane urządzenia</translation> +<translation id="1175572348579024023">Przewijanie</translation> <translation id="1178581264944972037">Wstrzymaj</translation> <translation id="1195412055398077112">nadmiarowość obrazu</translation> <translation id="119944043368869598">Wyczyść wszystko</translation> @@ -251,6 +252,7 @@ <translation id="4778095205580009397">Asystent Google jest niedostępny w sesji demonstracyjnej.</translation> <translation id="479989351350248267">search</translation> <translation id="4804818685124855865">Rozłącz</translation> +<translation id="4831034276697007977">Czy na pewno chcesz wyłączyć automatyczne kliknięcia?</translation> <translation id="4849058404725798627">Podświetlaj obiekt wybrany za pomocą klawiatury</translation> <translation id="485592688953820832">Brak działania (wstrzymaj)</translation> <translation id="4872237917498892622">Alt+Szukaj lub Shift</translation> @@ -414,6 +416,7 @@ <translation id="7561014039265304140"><ph name="DISPLAY_NAME" /> nie obsługuje <ph name="SPECIFIED_RESOLUTION" />. Zmieniono rozdzielczość na <ph name="FALLBACK_RESOLUTION" /></translation> <translation id="7562368315689366235">Paleta emotikonów</translation> <translation id="7564874036684306347">Przenoszenie okien na inny pulpit może spowodować nieoczekiwane zachowanie. Kolejne powiadomienia, okna i okna dialogowe mogą pojawiać się na różnych pulpitach.</translation> +<translation id="7568294522609223312">Wyłączanie automatycznych kliknięć</translation> <translation id="7569509451529460200">Włączono Braille'a i ChromeVox</translation> <translation id="7593891976182323525">Szukaj lub Shift</translation> <translation id="7645176681409127223"><ph name="USER_NAME" /> (właściciel)</translation>
diff --git a/ash/strings/ash_strings_pt-PT.xtb b/ash/strings/ash_strings_pt-PT.xtb index 99ff4721..a9093c67 100644 --- a/ash/strings/ash_strings_pt-PT.xtb +++ b/ash/strings/ash_strings_pt-PT.xtb
@@ -12,6 +12,7 @@ <translation id="1104621072296271835">Os seus dispositivos funcionam ainda melhor juntos</translation> <translation id="112308213915226829">Ocultar prateleira automaticamente</translation> <translation id="1153356358378277386">Dispositivos sincronizados</translation> +<translation id="1175572348579024023">Deslocar</translation> <translation id="1178581264944972037">Pausa</translation> <translation id="1195412055398077112">overscan</translation> <translation id="119944043368869598">Limpar tudo</translation> @@ -250,6 +251,7 @@ <translation id="4778095205580009397">O Assistente Google não está disponível numa sessão de demonstração.</translation> <translation id="479989351350248267">search</translation> <translation id="4804818685124855865">Desligar</translation> +<translation id="4831034276697007977">Tem a certeza de que pretende desativar os cliques automáticos?</translation> <translation id="4849058404725798627">Realçar objeto com foco do teclado</translation> <translation id="485592688953820832">Nenhuma ação (colocar em pausa)</translation> <translation id="4872237917498892622">Alt + Pesquisar ou Shift</translation> @@ -413,6 +415,7 @@ <translation id="7561014039265304140"><ph name="DISPLAY_NAME" /> não suporta <ph name="SPECIFIED_RESOLUTION" />. A resolução foi alterada para <ph name="FALLBACK_RESOLUTION" /></translation> <translation id="7562368315689366235">Paleta de emoji</translation> <translation id="7564874036684306347">A movimentação de janelas para outro ambiente de trabalho pode provocar um comportamento inesperado. É possível dividir as notificações, as janelas e as caixas de diálogo subsequentes entre ambientes de trabalho.</translation> +<translation id="7568294522609223312">Desative os cliques automáticos</translation> <translation id="7569509451529460200">O braille e o ChromeVox estão ativados</translation> <translation id="7593891976182323525">Pesquisar ou Shift</translation> <translation id="7645176681409127223"><ph name="USER_NAME" /> (proprietário)</translation>
diff --git a/ash/strings/ash_strings_ro.xtb b/ash/strings/ash_strings_ro.xtb index 0c50e03891..6b4a5f48 100644 --- a/ash/strings/ash_strings_ro.xtb +++ b/ash/strings/ash_strings_ro.xtb
@@ -12,6 +12,7 @@ <translation id="1104621072296271835">Dispozitivele funcționează și mai bine împreună</translation> <translation id="112308213915226829">Ascundeți automat raftul</translation> <translation id="1153356358378277386">Dispozitive asociate</translation> +<translation id="1175572348579024023">Derulează</translation> <translation id="1178581264944972037">Întrerupe</translation> <translation id="1195412055398077112">suprascanare</translation> <translation id="119944043368869598">Șterge-le pe toate</translation> @@ -250,6 +251,7 @@ <translation id="4778095205580009397">Asistentul Google nu este disponibil într-o sesiune demonstrativă.</translation> <translation id="479989351350248267">căutați</translation> <translation id="4804818685124855865">Deconectează-te</translation> +<translation id="4831034276697007977">Sigur vrei să dezactivezi clicurile automate?</translation> <translation id="4849058404725798627">Evidențiază obiectul focalizat de la tastatură</translation> <translation id="485592688953820832">Nicio acțiune (pauză)</translation> <translation id="4872237917498892622">Alt+Căutare sau Shift</translation> @@ -413,6 +415,7 @@ <translation id="7561014039265304140"><ph name="DISPLAY_NAME" /> nu acceptă <ph name="SPECIFIED_RESOLUTION" />. Rezoluția a fost modificată la <ph name="FALLBACK_RESOLUTION" /></translation> <translation id="7562368315689366235">Paletă cu emoji</translation> <translation id="7564874036684306347">Mutarea ferestrelor pe alt desktop poate duce la un comportament neașteptat. Notificările, ferestrele și casetele de dialog ulterioare ar putea fi împărțite între ecrane.</translation> +<translation id="7568294522609223312">Dezactivează clicurile automate</translation> <translation id="7569509451529460200">Braille și ChromeVox sunt activate</translation> <translation id="7593891976182323525">Căutare sau Shift</translation> <translation id="7645176681409127223"><ph name="USER_NAME" /> (proprietar)</translation>
diff --git a/ash/strings/ash_strings_sk.xtb b/ash/strings/ash_strings_sk.xtb index f3e6415b..8f6b8f5 100644 --- a/ash/strings/ash_strings_sk.xtb +++ b/ash/strings/ash_strings_sk.xtb
@@ -12,6 +12,7 @@ <translation id="1104621072296271835">Vaše zariadenia fungujú spoločne ešte lepšie</translation> <translation id="112308213915226829">Automatické skrývanie poličky</translation> <translation id="1153356358378277386">Spárované zariadenia</translation> +<translation id="1175572348579024023">Posúvanie</translation> <translation id="1178581264944972037">Pozastaviť</translation> <translation id="1195412055398077112">presah obsahu</translation> <translation id="119944043368869598">Vymazať všetko</translation> @@ -250,6 +251,7 @@ <translation id="4778095205580009397">Asistent Google nie je k dispozícii v relácii ukážky.</translation> <translation id="479989351350248267">search</translation> <translation id="4804818685124855865">Odpojiť</translation> +<translation id="4831034276697007977">Naozaj chcete vypnúť automatické kliknutia?</translation> <translation id="4849058404725798627">Zvýrazniť objekt so zameraním klávesnice</translation> <translation id="485592688953820832">Žiadna akcia (pozastaviť)</translation> <translation id="4872237917498892622">Alt + Hľadať alebo Shift</translation> @@ -413,6 +415,7 @@ <translation id="7561014039265304140">Obrazovka <ph name="DISPLAY_NAME" /> nepodporuje rozlíšenie <ph name="SPECIFIED_RESOLUTION" />. Rozlíšenie bolo zmenené na <ph name="FALLBACK_RESOLUTION" /></translation> <translation id="7562368315689366235">Paleta emodži</translation> <translation id="7564874036684306347">Presunutie okien na inú obrazovku môže spôsobiť neočakávané správanie. Nasledujúce upozornenia, okná a dialógové okná sa môžu zobraziť rozdelené na viacerých pracovných plochách.</translation> +<translation id="7568294522609223312">Vypnutie automatických kliknutí</translation> <translation id="7569509451529460200">Funkcie Braille a ChromeVox sú povolené</translation> <translation id="7593891976182323525">Hľadať alebo Shift</translation> <translation id="7645176681409127223"><ph name="USER_NAME" /> (vlastník)</translation>
diff --git a/ash/strings/ash_strings_sl.xtb b/ash/strings/ash_strings_sl.xtb index bffd69a..99f504d 100644 --- a/ash/strings/ash_strings_sl.xtb +++ b/ash/strings/ash_strings_sl.xtb
@@ -12,6 +12,7 @@ <translation id="1104621072296271835">Naprave delujejo še bolje skupaj</translation> <translation id="112308213915226829">Samodejno skrivanje police</translation> <translation id="1153356358378277386">Seznanjene naprave</translation> +<translation id="1175572348579024023">Drseče pomikanje</translation> <translation id="1178581264944972037">Prekini</translation> <translation id="1195412055398077112">upodabljanje čez rob zaslona</translation> <translation id="119944043368869598">Izbriši vse</translation> @@ -250,6 +251,7 @@ <translation id="4778095205580009397">Pomočnik Google ni na voljo v predstavitveni seji.</translation> <translation id="479989351350248267">search</translation> <translation id="4804818685124855865">Prekini povezavo</translation> +<translation id="4831034276697007977">Ali ste prepričani, da želite izklopiti samodejne klike?</translation> <translation id="4849058404725798627">Označitev predmeta s fokusom na tipkovnici</translation> <translation id="485592688953820832">Brez dejanj (zaustavitev)</translation> <translation id="4872237917498892622">Alt + iskanje ali Shift</translation> @@ -413,6 +415,7 @@ <translation id="7561014039265304140"><ph name="DISPLAY_NAME" /> ne podpira ločljivosti <ph name="SPECIFIED_RESOLUTION" />. Spremenjena je bila na <ph name="FALLBACK_RESOLUTION" /></translation> <translation id="7562368315689366235">Paleta emodžijev</translation> <translation id="7564874036684306347">Če okna premaknete na drugo namizje, lahko pride do nepričakovanega delovanja. Nadaljnja obvestila, okna in pogovorna okna so lahko razdeljena med namizji.</translation> +<translation id="7568294522609223312">Izklop samodejnih klikov</translation> <translation id="7569509451529460200">Omogočena sta braillova pisava in ChromeVox</translation> <translation id="7593891976182323525">Iskanje ali Shift</translation> <translation id="7645176681409127223"><ph name="USER_NAME" /> (lastnik)</translation>
diff --git a/ash/strings/ash_strings_sr.xtb b/ash/strings/ash_strings_sr.xtb index 2ffd115..bc668b39 100644 --- a/ash/strings/ash_strings_sr.xtb +++ b/ash/strings/ash_strings_sr.xtb
@@ -12,6 +12,7 @@ <translation id="1104621072296271835">Уређаји заједно функционишу још боље</translation> <translation id="112308213915226829">Аутоматски сакриј полицу</translation> <translation id="1153356358378277386">Упарени уређаји</translation> +<translation id="1175572348579024023">Померај</translation> <translation id="1178581264944972037">Паузирај</translation> <translation id="1195412055398077112">ивично подручје екрана</translation> <translation id="119944043368869598">Обриши све</translation> @@ -250,6 +251,7 @@ <translation id="4778095205580009397">Google помоћник није доступан у сесији демонстрације.</translation> <translation id="479989351350248267">search</translation> <translation id="4804818685124855865">Прекини везу</translation> +<translation id="4831034276697007977">Желите ли стварно да искључите аутоматске кликове?</translation> <translation id="4849058404725798627">Истакни објекат помоћу фокуса тастатуре</translation> <translation id="485592688953820832">Ништа се не предузима (паузирање)</translation> <translation id="4872237917498892622">Alt + тастер за претрагу или Shift</translation> @@ -413,6 +415,7 @@ <translation id="7561014039265304140"><ph name="DISPLAY_NAME" /> не подржава <ph name="SPECIFIED_RESOLUTION" />. Резолуција је промењена на <ph name="FALLBACK_RESOLUTION" /></translation> <translation id="7562368315689366235">Палета емоџија</translation> <translation id="7564874036684306347">Премештање прозора на други рачунар може да доведе до неочекиваног понашања. Накнадна обавештења, прозори и дијалози ће можда бити подељени између рачунара.</translation> +<translation id="7568294522609223312">Искључите аутоматске кликове</translation> <translation id="7569509451529460200">Брајева азбука и ChromeVox су омогућени</translation> <translation id="7593891976182323525">Тастер за претрагу или Shift</translation> <translation id="7645176681409127223"><ph name="USER_NAME" /> (власник)</translation>
diff --git a/ash/strings/ash_strings_sw.xtb b/ash/strings/ash_strings_sw.xtb index 06e7ece9..d1472f9 100644 --- a/ash/strings/ash_strings_sw.xtb +++ b/ash/strings/ash_strings_sw.xtb
@@ -12,6 +12,7 @@ <translation id="1104621072296271835">Vifaa vyako vitafanya kazi vizuri vikiwa pamoja</translation> <translation id="112308213915226829">Ficha rafu kiotomatiki</translation> <translation id="1153356358378277386">Vifaa vilivyooanishwa</translation> +<translation id="1175572348579024023">Sogeza</translation> <translation id="1178581264944972037">Sitisha</translation> <translation id="1195412055398077112">angalia kwa ujumla:</translation> <translation id="119944043368869598">Ondoa vyote</translation> @@ -250,6 +251,7 @@ <translation id="4778095205580009397">Programu ya Mratibu wa Google haipatikani katika kipindi cha onyesho.</translation> <translation id="479989351350248267">tafuta</translation> <translation id="4804818685124855865">Tenganisha</translation> +<translation id="4831034276697007977">Je, una uhakika ungependa kuzima mibofyo ya kiotomatiki?</translation> <translation id="4849058404725798627">Angazia kipengee kilicholengwa kwa kibodi</translation> <translation id="485592688953820832">Hakuna kitendo (simamisha)</translation> <translation id="4872237917498892622">Alt + Utafutaji au Hama</translation> @@ -414,6 +416,7 @@ <translation id="7562368315689366235">Safu ya emoji</translation> <translation id="7564874036684306347">Hatua ya kuhamishia madirisha kwenye eneo-kazi lingine inaweza kusababisha utendaji usiotarajiwa. Arifa, madirisha na vidirisha vya baadaye vitagawanywa kati ya maeneo-kazi.</translation> +<translation id="7568294522609223312">Zima mibofyo ya kiotomatiki</translation> <translation id="7569509451529460200">Breli na ChromeVox zimewashwa</translation> <translation id="7593891976182323525">Utafutaji au Hama</translation> <translation id="7645176681409127223"><ph name="USER_NAME" /> (mmiliki)</translation>
diff --git a/ash/strings/ash_strings_th.xtb b/ash/strings/ash_strings_th.xtb index bc7cb2a..3fd9188c 100644 --- a/ash/strings/ash_strings_th.xtb +++ b/ash/strings/ash_strings_th.xtb
@@ -12,6 +12,7 @@ <translation id="1104621072296271835">อุปกรณ์จะทำงานได้ดียิ่งขึ้นเมื่อใช้ร่วมกัน</translation> <translation id="112308213915226829">ซ่อนชั้นวางโดยอัตโนมัติ</translation> <translation id="1153356358378277386">อุปกรณ์ที่จับคู่</translation> +<translation id="1175572348579024023">เลื่อน</translation> <translation id="1178581264944972037">หยุดชั่วคราว</translation> <translation id="1195412055398077112">โอเวอร์สแกน</translation> <translation id="119944043368869598">ล้างทั้งหมด</translation> @@ -251,6 +252,7 @@ <translation id="4778095205580009397">Google Assistant ไม่พร้อมใช้งานในเซสชันสาธิต</translation> <translation id="479989351350248267">ค้นหา</translation> <translation id="4804818685124855865">ตัดการเชื่อมต่อ</translation> +<translation id="4831034276697007977">แน่ใจไหมว่าต้องการปิดการคลิกอัตโนมัติ</translation> <translation id="4849058404725798627">ไฮไลต์วัตถุที่มีโฟกัสแป้นพิมพ์</translation> <translation id="485592688953820832">ไม่มีการดำเนินการ (หยุดชั่วคราว)</translation> <translation id="4872237917498892622">Alt+ค้นหา หรือ Shift</translation> @@ -414,6 +416,7 @@ <translation id="7561014039265304140"><ph name="DISPLAY_NAME" /> ไม่สนับสนุน <ph name="SPECIFIED_RESOLUTION" /> ความละเอียดเปลี่ยนเป็น <ph name="FALLBACK_RESOLUTION" /></translation> <translation id="7562368315689366235">ชุดอีโมจิ</translation> <translation id="7564874036684306347">การย้ายหน้าต่างไปยังเดสก์ท็อปอื่นอาจส่งผลให้ลักษณะการทำงานผิกปกติ การแจ้งเตือน หน้าต่าง และกล่องโต้ตอบที่ตามมาอาจแสดงแยกส่วนในเดสก์ท็อปทั้งสอง</translation> +<translation id="7568294522609223312">ปิดการคลิกอัตโนมัติ</translation> <translation id="7569509451529460200">เปิดใช้เบรลล์และ ChromeVox แล้ว</translation> <translation id="7593891976182323525">ค้นหาหรือ Shift</translation> <translation id="7645176681409127223"><ph name="USER_NAME" /> (เจ้าของ)</translation>
diff --git a/ash/system/network/active_network_icon_unittest.cc b/ash/system/network/active_network_icon_unittest.cc index d25f637..c0290910 100644 --- a/ash/system/network/active_network_icon_unittest.cc +++ b/ash/system/network/active_network_icon_unittest.cc
@@ -10,9 +10,9 @@ #include "ash/strings/grit/ash_strings.h" #include "ash/system/network/network_icon.h" #include "ash/system/network/tray_network_state_model.h" -#include "base/message_loop/message_loop.h" #include "base/strings/stringprintf.h" #include "base/strings/utf_string_conversions.h" +#include "base/test/scoped_task_environment.h" #include "chromeos/network/network_state_handler.h" #include "chromeos/network/network_state_test_helper.h" #include "chromeos/services/network_config/public/cpp/cros_network_config_test_helper.h" @@ -155,7 +155,7 @@ network_icon::IconType icon_type() { return icon_type_; } private: - const base::MessageLoop message_loop_; + base::test::ScopedTaskEnvironment scoped_task_environment_; chromeos::network_config::CrosNetworkConfigTestHelper network_config_helper_; std::unique_ptr<TrayNetworkStateModel> network_state_model_; std::unique_ptr<ActiveNetworkIcon> active_network_icon_;
diff --git a/ash/system/network/network_icon_unittest.cc b/ash/system/network/network_icon_unittest.cc index eb66923..37b318d 100644 --- a/ash/system/network/network_icon_unittest.cc +++ b/ash/system/network/network_icon_unittest.cc
@@ -10,7 +10,6 @@ #include "ash/strings/grit/ash_strings.h" #include "ash/system/network/active_network_icon.h" #include "base/logging.h" -#include "base/message_loop/message_loop.h" #include "base/run_loop.h" #include "base/test/scoped_task_environment.h" #include "chromeos/network/network_state_handler.h" @@ -151,7 +150,7 @@ IconType icon_type_ = ICON_TYPE_TRAY_REGULAR; private: - const base::MessageLoop message_loop_; + base::test::ScopedTaskEnvironment scoped_task_environment_; chromeos::network_config::CrosNetworkConfigTestHelper network_config_helper_; std::unique_ptr<TrayNetworkStateModel> network_state_model_; std::unique_ptr<ActiveNetworkIcon> active_network_icon_;
diff --git a/ash/system/power/power_button_menu_view.cc b/ash/system/power/power_button_menu_view.cc index 758b818..fbebf58 100644 --- a/ash/system/power/power_button_menu_view.cc +++ b/ash/system/power/power_button_menu_view.cc
@@ -5,6 +5,7 @@ #include "ash/system/power/power_button_menu_view.h" #include "ash/display/screen_orientation_controller.h" +#include "ash/kiosk_next/kiosk_next_shell_controller_impl.h" #include "ash/public/cpp/new_window_delegate.h" #include "ash/resources/vector_icons/vector_icons.h" #include "ash/session/session_controller_impl.h" @@ -165,7 +166,8 @@ IDS_ASH_POWER_BUTTON_MENU_LOCK_SCREEN_BUTTON)); AddChildView(lock_screen_item_); - if (base::FeatureList::IsEnabled(kEnableFeedbackItem)) { + if (base::FeatureList::IsEnabled(kEnableFeedbackItem) || + Shell::Get()->kiosk_next_shell_controller()->IsEnabled()) { feedback_item_ = new PowerButtonMenuItemView( this, kSystemPowerButtonMenuFeedbackIcon, l10n_util::GetStringUTF16(
diff --git a/ash/wm/overview/overview_grid.cc b/ash/wm/overview/overview_grid.cc index 5bcd3ebf..c04713f 100644 --- a/ash/wm/overview/overview_grid.cc +++ b/ash/wm/overview/overview_grid.cc
@@ -1321,6 +1321,15 @@ (desks_bar_view_ && !desks_bar_view_->mini_views().empty()); } +gfx::Rect OverviewGrid::GetGridEffectiveBounds() const { + if (!features::IsVirtualDesksEnabled() || !IsDesksBarViewActive()) + return bounds_; + + gfx::Rect effective_bounds = bounds_; + effective_bounds.Inset(0, DesksBarView::GetBarHeight(), 0, 0); + return effective_bounds; +} + bool OverviewGrid::UpdateDesksBarDragDetails( const gfx::Point& screen_location) { DCHECK(features::IsVirtualDesksEnabled()); @@ -1506,19 +1515,7 @@ std::vector<gfx::RectF> OverviewGrid::GetWindowRects( const base::flat_set<OverviewItem*>& ignored_items) { - gfx::Rect total_bounds = bounds_; - - if (features::IsVirtualDesksEnabled()) { - const int desks_bar_height = DesksBarView::GetBarHeight(); - - // Always reduce the grid's height, even if the desks bar is not active. We - // do this to avoid changing the overview windows sizes once the desks bar - // becomes active, and we shift the grid downwards. - total_bounds.set_height(total_bounds.height() - desks_bar_height); - - if (IsDesksBarViewActive()) - total_bounds.Offset(0, desks_bar_height); - } + gfx::Rect total_bounds = GetGridEffectiveBounds(); // Windows occupy vertically centered area with additional vertical insets. int horizontal_inset =
diff --git a/ash/wm/overview/overview_grid.h b/ash/wm/overview/overview_grid.h index 694f20f..fd28e2a 100644 --- a/ash/wm/overview/overview_grid.h +++ b/ash/wm/overview/overview_grid.h
@@ -260,6 +260,10 @@ // show them once it is created). bool IsDesksBarViewActive() const; + // Gets the effective bounds of this grid (the area in which the windows are + // positioned, taking into account the availability of the Desks bar). + gfx::Rect GetGridEffectiveBounds() const; + // Called when a window is being dragged in Overview Mode to update the drag // details (screen_location, and whether that location intersects with the // desks bar widget.
diff --git a/ash/wm/overview/overview_item.cc b/ash/wm/overview/overview_item.cc index 5e476278..eac1089 100644 --- a/ash/wm/overview/overview_item.cc +++ b/ash/wm/overview/overview_item.cc
@@ -583,7 +583,7 @@ gfx::Rect bounds = gfx::ToEnclosingRect(target_bounds()); bounds.Inset(kWindowMargin, kWindowMargin); bounds.Inset(gfx::Insets(kHeaderHeightDp, 0, 0, 0)); - cannot_snap_widget_->SetBoundsCenteredIn(bounds); + cannot_snap_widget_->SetBoundsCenteredIn(bounds, /*animate=*/false); } void OverviewItem::OnSelectorItemDragStarted(OverviewItem* item) {
diff --git a/ash/wm/overview/overview_session.cc b/ash/wm/overview/overview_session.cc index 980ddd6..f024543 100644 --- a/ash/wm/overview/overview_session.cc +++ b/ash/wm/overview/overview_session.cc
@@ -589,6 +589,8 @@ const base::flat_set<OverviewItem*>& ignored_items) { for (std::unique_ptr<OverviewGrid>& grid : grid_list_) grid->PositionWindows(animate, ignored_items); + + RefreshNoWindowsWidgetBounds(animate); } bool OverviewSession::IsWindowInOverview(const aura::Window* window) { @@ -1043,21 +1045,17 @@ no_windows_widget_->SetOpacity(1.f); } - // The widget is centered in the work area, unless we are in split view with - // one window snapped. - aura::Window* window = no_windows_widget_->GetNativeWindow(); - gfx::Rect bounds = - display::Screen::GetScreen()->GetPrimaryDisplay().work_area(); - auto* split_view_controller = Shell::Get()->split_view_controller(); - if (split_view_controller->state() == SplitViewState::kLeftSnapped) { - bounds = split_view_controller->GetSnappedWindowBoundsInScreen( - window, SplitViewController::RIGHT); - } else if (split_view_controller->state() == SplitViewState::kRightSnapped) { - bounds = split_view_controller->GetSnappedWindowBoundsInScreen( - window, SplitViewController::LEFT); - } + RefreshNoWindowsWidgetBounds(/*animate=*/false); +} - no_windows_widget_->SetBoundsCenteredIn(bounds); +void OverviewSession::RefreshNoWindowsWidgetBounds(bool animate) { + if (!no_windows_widget_) + return; + + auto* grid = GetGridWithRootWindow(Shell::GetPrimaryRootWindow()); + DCHECK(grid); + no_windows_widget_->SetBoundsCenteredIn(grid->GetGridEffectiveBounds(), + animate); } } // namespace ash
diff --git a/ash/wm/overview/overview_session.h b/ash/wm/overview/overview_session.h index c523c429..fd82f611 100644 --- a/ash/wm/overview/overview_session.h +++ b/ash/wm/overview/overview_session.h
@@ -302,6 +302,8 @@ void UpdateNoWindowsWidget(); + void RefreshNoWindowsWidgetBounds(bool animate); + // Tracks observed windows. base::flat_set<aura::Window*> observed_windows_;
diff --git a/ash/wm/overview/overview_session_unittest.cc b/ash/wm/overview/overview_session_unittest.cc index 51551e65..12c53c8 100644 --- a/ash/wm/overview/overview_session_unittest.cc +++ b/ash/wm/overview/overview_session_unittest.cc
@@ -1955,14 +1955,6 @@ expected_x = /*bounds_right=*/(200 - 4) / 2; EXPECT_EQ(gfx::Point(expected_x, expected_y), no_windows_widget->GetWindowBoundsInScreen().CenterPoint()); - - // Tests that when moving the split view divider, the no windows indicator - // stays centered. - split_view_controller->StartResize(gfx::Point(200, 10)); - split_view_controller->EndResize(gfx::Point(100, 10)); - expected_x = /*bounds_right=*/(100 - 4) / 2; - EXPECT_EQ(gfx::Point(expected_x, expected_y), - no_windows_widget->GetWindowBoundsInScreen().CenterPoint()); } // Tests that the no windows indicator shows properly after adding an item.
diff --git a/ash/wm/overview/rounded_label_widget.cc b/ash/wm/overview/rounded_label_widget.cc index d4786529..092515f 100644 --- a/ash/wm/overview/rounded_label_widget.cc +++ b/ash/wm/overview/rounded_label_widget.cc
@@ -7,6 +7,7 @@ #include <memory> #include "ash/public/cpp/ash_features.h" +#include "ash/wm/overview/scoped_overview_animation_settings.h" #include "ui/aura/window.h" #include "ui/base/l10n/l10n_util.h" #include "ui/compositor/layer.h" @@ -104,8 +105,14 @@ return widget_bounds; } -void RoundedLabelWidget::SetBoundsCenteredIn(const gfx::Rect& bounds) { - GetNativeWindow()->SetBounds(GetBoundsCenteredIn(bounds)); +void RoundedLabelWidget::SetBoundsCenteredIn(const gfx::Rect& bounds, + bool animate) { + auto* window = GetNativeWindow(); + ScopedOverviewAnimationSettings animation_settings{ + animate ? OVERVIEW_ANIMATION_LAYOUT_OVERVIEW_ITEMS_IN_OVERVIEW + : OVERVIEW_ANIMATION_NONE, + window}; + window->SetBounds(GetBoundsCenteredIn(bounds)); } } // namespace ash
diff --git a/ash/wm/overview/rounded_label_widget.h b/ash/wm/overview/rounded_label_widget.h index 67b6a35..ba00b290 100644 --- a/ash/wm/overview/rounded_label_widget.h +++ b/ash/wm/overview/rounded_label_widget.h
@@ -37,8 +37,9 @@ gfx::Rect GetBoundsCenteredIn(const gfx::Rect& bounds); // Places the widget in the middle of |bounds|. The size will be the preferred - // size of the label. - void SetBoundsCenteredIn(const gfx::Rect& bounds); + // size of the label. If |animate| is true, the widget will be animated to the + // new bounds. + void SetBoundsCenteredIn(const gfx::Rect& bounds, bool animate); private: DISALLOW_COPY_AND_ASSIGN(RoundedLabelWidget);
diff --git a/base/BUILD.gn b/base/BUILD.gn index b6e9a1a..65c63b46 100644 --- a/base/BUILD.gn +++ b/base/BUILD.gn
@@ -2474,6 +2474,7 @@ "debug/alias_unittest.cc", "debug/crash_logging_unittest.cc", "debug/debugger_unittest.cc", + "debug/gdi_debug_util_win_unittest.cc", "debug/leak_tracker_unittest.cc", "debug/proc_maps_linux_unittest.cc", "debug/stack_trace_unittest.cc",
diff --git a/base/debug/gdi_debug_util_win.cc b/base/debug/gdi_debug_util_win.cc index a2bb410..5f6294f 100644 --- a/base/debug/gdi_debug_util_win.cc +++ b/base/debug/gdi_debug_util_win.cc
@@ -6,17 +6,309 @@ #include <algorithm> #include <cmath> +#include <TlHelp32.h> #include <psapi.h> #include <stddef.h> -#include <TlHelp32.h> +#include <windows.h> +#include <winternl.h> #include "base/debug/alias.h" #include "base/logging.h" +#include "base/optional.h" +#include "base/process/process.h" #include "base/win/scoped_handle.h" #include "base/win/win_util.h" +#include "base/win/windows_version.h" namespace { +// A partial PEB up until GdiSharedHandleTable. +// Derived from the ntdll symbols (ntdll!_PEB). +template <typename PointerType> +struct PartialWinPeb { + unsigned char InheritedAddressSpace; + unsigned char ReadImageFileExecOptions; + unsigned char BeingDebugged; + unsigned char ImageUsesLargePages : 1; + unsigned char IsProtectedProcess : 1; + unsigned char IsLegacyProcess : 1; + unsigned char IsImageDynamicallyRelocated : 1; + unsigned char SkipPatchingUser32Forwarders : 1; + unsigned char IsAppContainer : 1; + unsigned char IsProtectedProcessLight : 1; + unsigned char IsLongPathAwareProcess : 1; + PointerType Mutant; + PointerType ImageBaseAddress; + PointerType Ldr; + PointerType ProcessParamters; + PointerType SubSystemData; + PointerType ProcessHeap; + PointerType FastPebLock; + PointerType AtlThunkSListPtr; + PointerType IFEOKey; + uint32_t ProcessInJob : 1; + uint32_t ProcessInitializing : 1; + uint32_t ProcessUsingVEH : 1; + uint32_t ProcessUsingVCH : 1; + uint32_t ProcessUsingFTH : 1; + uint32_t ProcessPreviouslyThrottled : 1; + uint32_t ProcessCurrentlyThrottled : 1; + uint32_t ProcessImagesHotPatched : 1; + PointerType KernelCallbackTable; + uint32_t SystemReserved; + uint32_t AtlThunkSListPtr32; + PointerType ApiSetMap; + uint32_t TlsExpansionCounter; + PointerType TlsBitmap; + uint32_t TlsBitmapBits[2]; + PointerType ReadOnlySharedMemoryBase; + PointerType HotpatchInformation; + PointerType ReadOnlyStaticServerData; + PointerType AnsiCodePageData; + PointerType OemCodePageData; + PointerType UnicodeCaseTableData; + uint32_t NumberOfProcessors; + uint32_t NtGlobalFlag; + uint64_t CriticalSectionTimeout; + PointerType HeapSegmentReserve; + PointerType HeapSegmentCommit; + PointerType HeapDeCommitTotalFreeThreshold; + PointerType HeapDeCommitFreeBlockThreshold; + uint32_t NumberOfHeaps; + uint32_t MaximumNumberOfHeaps; + PointerType ProcessHeaps; + PointerType GdiSharedHandleTable; +}; + +// Found from +// https://stackoverflow.com/questions/13905661/how-to-get-list-of-gdi-handles. +enum GdiHandleType : USHORT { + kDC = 1, + kRegion = 4, + kBitmap = 5, + kPalette = 8, + kFont = 10, + kBrush = 16, + kPen = 48, +}; + +// Adapted from GDICELL. +template <typename PointerType> +struct GdiTableEntry { + PointerType pKernelAddress; + USHORT wProcessId; + USHORT wCount; + USHORT wUpper; + GdiHandleType wType; + PointerType pUserAddress; +}; + +// Types and names used for regular processes. +struct RegularProcessTypes { + using QueryInformationProcessFunc = decltype(NtQueryInformationProcess); + static const char* query_information_process_name; + // PROCESS_BASIC_INFORMATION + struct ProcessBasicInformation { + PVOID Reserved1; + PVOID PebBaseAddress; + PVOID Reserved2[2]; + ULONG_PTR UniqueProcessId; + PVOID Reserved3; + }; + + using ReadVirtualMemoryFunc = NTSTATUS NTAPI(IN HANDLE ProcessHandle, + IN PVOID BaseAddress, + OUT PVOID Buffer, + IN SIZE_T Size, + OUT PSIZE_T NumberOfBytesRead); + static const char* read_virtual_memory_func_name; + using NativePointerType = PVOID; +}; + +// static +const char* RegularProcessTypes::query_information_process_name = + "NtQueryInformationProcess"; + +// static +const char* RegularProcessTypes::read_virtual_memory_func_name = + "NtReadVirtualMemory"; + +// Types and names used for WOW based processes. +struct WowProcessTypes { + // http://crbug.com/972185: Clang doesn't handle PVOID64 correctly, so we use + // uint64_t as a substitute. + + // NtWow64QueryInformationProcess64 and NtQueryInformationProcess share the + // same signature. + using QueryInformationProcessFunc = decltype(NtQueryInformationProcess); + static const char* query_information_process_name; + // PROCESS_BASIC_INFORMATION_WOW64 + struct ProcessBasicInformation { + PVOID Reserved1[2]; + uint64_t PebBaseAddress; + PVOID Reserved2[4]; + ULONG_PTR UniqueProcessId[2]; + PVOID Reserved3[2]; + }; + + using ReadVirtualMemoryFunc = NTSTATUS NTAPI(IN HANDLE ProcessHandle, + IN uint64_t BaseAddress, + OUT PVOID Buffer, + IN ULONG64 Size, + OUT PULONG64 NumberOfBytesRead); + static const char* read_virtual_memory_func_name; + using NativePointerType = uint64_t; +}; + +// static +const char* WowProcessTypes::query_information_process_name = + "NtWow64QueryInformationProcess64"; + +// static +const char* WowProcessTypes::read_virtual_memory_func_name = + "NtWow64ReadVirtualMemory64"; + +// To prevent from having to write a regular and WOW codepaths that do the same +// thing with different structures and functions, GetGdiTableEntries is +// templated to expect either RegularProcessTypes or WowProcessTypes. +template <typename ProcessType> +std::vector<GdiTableEntry<typename ProcessType::NativePointerType>> +GetGdiTableEntries(const base::Process& process) { + using GdiTableEntryVector = + std::vector<GdiTableEntry<typename ProcessType::NativePointerType>>; + HMODULE ntdll = GetModuleHandle(L"ntdll.dll"); + if (!ntdll) + return GdiTableEntryVector(); + + static auto query_information_process_func = + reinterpret_cast<typename ProcessType::QueryInformationProcessFunc*>( + GetProcAddress(ntdll, ProcessType::query_information_process_name)); + if (!query_information_process_func) { + LOG(ERROR) << ProcessType::query_information_process_name << " Missing"; + return GdiTableEntryVector(); + } + + typename ProcessType::ProcessBasicInformation basic_info; + NTSTATUS result = + query_information_process_func(process.Handle(), ProcessBasicInformation, + &basic_info, sizeof(basic_info), nullptr); + if (result != 0) { + LOG(ERROR) << ProcessType::query_information_process_name << " Failed " + << std::hex << result; + return GdiTableEntryVector(); + } + + static auto read_virtual_mem_func = + reinterpret_cast<typename ProcessType::ReadVirtualMemoryFunc*>( + GetProcAddress(ntdll, ProcessType::read_virtual_memory_func_name)); + if (!read_virtual_mem_func) { + LOG(ERROR) << ProcessType::read_virtual_memory_func_name << " Missing"; + return GdiTableEntryVector(); + } + + PartialWinPeb<typename ProcessType::NativePointerType> peb; + result = read_virtual_mem_func(process.Handle(), basic_info.PebBaseAddress, + &peb, sizeof(peb), nullptr); + if (result != 0) { + LOG(ERROR) << ProcessType::read_virtual_memory_func_name << " PEB Failed " + << std::hex << result; + return GdiTableEntryVector(); + } + + // Estimated size derived from address space allocation of the table: + // Windows 10 + // 32-bit Size: 1052672 bytes + // 64-bit Size: 1576960 bytes + // sizeof(GdiTableEntry) + // 32-bit: 16 bytes + // 64-bit: 24 bytes + // Entry Count + // 32-bit: 65792 + // 64-bit: 65706ish + // So we'll take a look at 65536 entries since that's the maximum handle count. + constexpr int kGdiTableEntryCount = 65536; + GdiTableEntryVector entries; + entries.resize(kGdiTableEntryCount); + result = read_virtual_mem_func( + process.Handle(), peb.GdiSharedHandleTable, &entries[0], + sizeof(typename GdiTableEntryVector::value_type) * entries.size(), + nullptr); + if (result != 0) { + LOG(ERROR) << ProcessType::read_virtual_memory_func_name + << " GDI Handle Table Failed " << std::hex << result; + return GdiTableEntryVector(); + } + + return entries; +} + +// Iterates through |gdi_table| and finds handles that belong to |pid|, +// incrementing the appropriate fields in |base::debug::GdiHandleCounts|. +template <typename PointerType> +base::debug::GdiHandleCounts CountHandleTypesFromTable( + DWORD pid, + const std::vector<GdiTableEntry<PointerType>>& gdi_table) { + base::debug::GdiHandleCounts counts{}; + for (const auto& entry : gdi_table) { + if (entry.wProcessId != pid) + continue; + + switch (entry.wType & 0x7F) { + case GdiHandleType::kDC: + ++counts.dcs; + break; + case GdiHandleType::kRegion: + ++counts.regions; + break; + case GdiHandleType::kBitmap: + ++counts.bitmaps; + break; + case GdiHandleType::kPalette: + ++counts.palettes; + break; + case GdiHandleType::kFont: + ++counts.fonts; + break; + case GdiHandleType::kBrush: + ++counts.brushes; + break; + case GdiHandleType::kPen: + ++counts.pens; + break; + default: + ++counts.unknown; + break; + } + } + counts.total_tracked = counts.dcs + counts.regions + counts.bitmaps + + counts.palettes + counts.fonts + counts.brushes + + counts.pens + counts.unknown; + return counts; +} + +template <typename ProcessType> +base::Optional<base::debug::GdiHandleCounts> CollectGdiHandleCountsImpl( + DWORD pid) { + base::Process process = base::Process::OpenWithExtraPrivileges(pid); + if (!process.IsValid()) + return base::nullopt; + + std::vector<GdiTableEntry<typename ProcessType::NativePointerType>> + gdi_entries = GetGdiTableEntries<ProcessType>(process); + return CountHandleTypesFromTable(pid, gdi_entries); +} + +// Returns the GDI Handle counts from the GDI Shared handle table. Empty on +// failure. +base::Optional<base::debug::GdiHandleCounts> CollectGdiHandleCounts(DWORD pid) { + if (base::win::OSInfo::GetInstance()->wow64_status() == + base::win::OSInfo::WOW64_ENABLED) { + return CollectGdiHandleCountsImpl<WowProcessTypes>(pid); + } + + return CollectGdiHandleCountsImpl<RegularProcessTypes>(pid); +} + constexpr size_t kLotsOfMemory = 1500 * 1024 * 1024; // 1.5GB HANDLE NOINLINE GetToolhelpSnapshot() { @@ -163,6 +455,32 @@ base::debug::Alias(&num_gdi_handles); base::debug::Alias(&num_user_handles); + base::Optional<GdiHandleCounts> optional_handle_counts = + CollectGdiHandleCounts(GetCurrentProcessId()); + bool handle_counts_set = optional_handle_counts.has_value(); + GdiHandleCounts handle_counts = + optional_handle_counts.value_or(GdiHandleCounts()); + int tracked_dcs = handle_counts.dcs; + int tracked_regions = handle_counts.regions; + int tracked_bitmaps = handle_counts.bitmaps; + int tracked_palettes = handle_counts.palettes; + int tracked_fonts = handle_counts.fonts; + int tracked_brushes = handle_counts.brushes; + int tracked_pens = handle_counts.pens; + int tracked_unknown_handles = handle_counts.unknown; + int tracked_total = handle_counts.total_tracked; + + base::debug::Alias(&handle_counts_set); + base::debug::Alias(&tracked_dcs); + base::debug::Alias(&tracked_regions); + base::debug::Alias(&tracked_bitmaps); + base::debug::Alias(&tracked_palettes); + base::debug::Alias(&tracked_fonts); + base::debug::Alias(&tracked_brushes); + base::debug::Alias(&tracked_pens); + base::debug::Alias(&tracked_unknown_handles); + base::debug::Alias(&tracked_total); + CrashIfExcessiveHandles(num_gdi_handles); PROCESS_MEMORY_COUNTERS_EX pmc; @@ -180,5 +498,12 @@ CollectChildGDIUsageAndDie(GetCurrentProcessId()); } +GdiHandleCounts GetGDIHandleCountsInCurrentProcessForTesting() { + base::Optional<GdiHandleCounts> handle_counts = + CollectGdiHandleCounts(GetCurrentProcessId()); + DCHECK(handle_counts.has_value()); + return handle_counts.value_or(GdiHandleCounts()); +} + } // namespace debug } // namespace base
diff --git a/base/debug/gdi_debug_util_win.h b/base/debug/gdi_debug_util_win.h index 3383a4d..a725695 100644 --- a/base/debug/gdi_debug_util_win.h +++ b/base/debug/gdi_debug_util_win.h
@@ -12,13 +12,27 @@ namespace base { namespace debug { +struct BASE_EXPORT GdiHandleCounts { + int dcs = 0; + int regions = 0; + int bitmaps = 0; + int palettes = 0; + int fonts = 0; + int brushes = 0; + int pens = 0; + int unknown = 0; + int total_tracked = 0; +}; + // Crashes the process, using base::debug::Alias to leave valuable debugging // information in the crash dump. Pass values for |header| and |shared_section| // in the event of a bitmap allocation failure, to gather information about // those as well. -void BASE_EXPORT CollectGDIUsageAndDie(BITMAPINFOHEADER* header = nullptr, +BASE_EXPORT void CollectGDIUsageAndDie(BITMAPINFOHEADER* header = nullptr, HANDLE shared_section = nullptr); +BASE_EXPORT GdiHandleCounts GetGDIHandleCountsInCurrentProcessForTesting(); + } // namespace debug } // namespace base
diff --git a/base/debug/gdi_debug_util_win_unittest.cc b/base/debug/gdi_debug_util_win_unittest.cc new file mode 100644 index 0000000..c060768 --- /dev/null +++ b/base/debug/gdi_debug_util_win_unittest.cc
@@ -0,0 +1,28 @@ +// 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 <windows.h> + +#include "base/debug/gdi_debug_util_win.h" +#include "base/win/scoped_hdc.h" +#include "testing/gtest/include/gtest/gtest.h" + +// GDI handles can occasionally come out of nowhere on the shared table, so +// when writing the tests below, make sure you do differential snapshots to +// count handles. + +TEST(GdiDebugUtilWin, GdiHandleCountsCreateDC) { + base::debug::GdiHandleCounts handle_counts_start = + base::debug::GetGDIHandleCountsInCurrentProcessForTesting(); + base::win::ScopedGetDC dc(nullptr); + ASSERT_TRUE(static_cast<HDC>(dc)); + base::debug::GdiHandleCounts handle_counts_now = + base::debug::GetGDIHandleCountsInCurrentProcessForTesting(); + EXPECT_EQ(1, handle_counts_now.dcs - handle_counts_start.dcs); + EXPECT_EQ( + 1, handle_counts_now.total_tracked - handle_counts_start.total_tracked); +} + +// TODO(robliao): Create tests for other types once we figure out how often GDI +// updates the handle table.
diff --git a/base/logging.cc b/base/logging.cc index 36b8bfc..eaf5662 100644 --- a/base/logging.cc +++ b/base/logging.cc
@@ -97,7 +97,7 @@ #include "base/debug/debugger.h" #include "base/debug/stack_trace.h" #include "base/debug/task_trace.h" -#include "base/lazy_instance.h" +#include "base/no_destructor.h" #include "base/path_service.h" #include "base/posix/eintr_wrapper.h" #include "base/strings/string_piece.h" @@ -166,8 +166,10 @@ // An assert handler override specified by the client to be called instead of // the debug message dialog and process termination. Assert handlers are stored // in stack to allow overriding and restoring. -base::LazyInstance<base::stack<LogAssertHandlerFunction>>::Leaky - log_assert_handler_stack = LAZY_INSTANCE_INITIALIZER; +base::stack<LogAssertHandlerFunction>& GetLogAssertHandlerStack() { + static base::NoDestructor<base::stack<LogAssertHandlerFunction>> instance; + return *instance; +} // A log message handler that gets notified of every log message we process. LogMessageHandlerFunction log_message_handler = nullptr; @@ -521,11 +523,11 @@ ScopedLogAssertHandler::ScopedLogAssertHandler( LogAssertHandlerFunction handler) { - log_assert_handler_stack.Get().push(std::move(handler)); + GetLogAssertHandlerStack().push(std::move(handler)); } ScopedLogAssertHandler::~ScopedLogAssertHandler() { - log_assert_handler_stack.Get().pop(); + GetLogAssertHandlerStack().pop(); } void SetLogMessageHandler(LogMessageHandlerFunction handler) { @@ -907,10 +909,9 @@ base::size(str_stack.data)); base::debug::Alias(&str_stack); - if (log_assert_handler_stack.IsCreated() && - !log_assert_handler_stack.Get().empty()) { + if (!GetLogAssertHandlerStack().empty()) { LogAssertHandlerFunction log_assert_handler = - log_assert_handler_stack.Get().top(); + GetLogAssertHandlerStack().top(); if (log_assert_handler) { log_assert_handler.Run(
diff --git a/base/memory/discardable_shared_memory.cc b/base/memory/discardable_shared_memory.cc index 57494b5..f8e6c53 100644 --- a/base/memory/discardable_shared_memory.cc +++ b/base/memory/discardable_shared_memory.cc
@@ -32,6 +32,12 @@ #include "base/win/windows_version.h" #endif +#if defined(OS_FUCHSIA) +#include <lib/zx/vmo.h> +#include <zircon/types.h> +#include "base/fuchsia/fuchsia_logging.h" +#endif + namespace base { namespace { @@ -416,7 +422,13 @@ void* ptr = VirtualAlloc(address, length, MEM_RESET, PAGE_READWRITE); CHECK(ptr); } -#endif +#elif defined(OS_FUCHSIA) + zx::unowned_vmo vmo = shared_memory_region_.GetPlatformHandle(); + zx_status_t status = + vmo->op_range(ZX_VMO_OP_DECOMMIT, AlignToPageSize(sizeof(SharedState)), + AlignToPageSize(mapped_size_), nullptr, 0); + ZX_DCHECK(status == ZX_OK, status) << "zx_vmo_op_range(ZX_VMO_OP_DECOMMIT)"; +#endif // defined(OS_FUCHSIA) last_known_usage_ = Time(); return true;
diff --git a/base/metrics/histogram_base.cc b/base/metrics/histogram_base.cc index deaa36e..220578d1 100644 --- a/base/metrics/histogram_base.cc +++ b/base/metrics/histogram_base.cc
@@ -11,13 +11,13 @@ #include <utility> #include "base/json/json_string_value_serializer.h" -#include "base/lazy_instance.h" #include "base/logging.h" #include "base/metrics/histogram.h" #include "base/metrics/histogram_macros.h" #include "base/metrics/histogram_samples.h" #include "base/metrics/sparse_histogram.h" #include "base/metrics/statistics_recorder.h" +#include "base/no_destructor.h" #include "base/numerics/safe_conversions.h" #include "base/pickle.h" #include "base/process/process_handle.h" @@ -143,8 +143,8 @@ void HistogramBase::WriteJSON(std::string* output, JSONVerbosityLevel verbosity_level) const { - Count count; - int64_t sum; + Count count = 0; + int64_t sum = 0; std::unique_ptr<ListValue> buckets(new ListValue()); GetCountAndBucketData(&count, &sum, buckets.get()); std::unique_ptr<DictionaryValue> parameters(new DictionaryValue()); @@ -204,11 +204,11 @@ // A set of histogram names that provides the "permanent" lifetime required // by histogram objects for those strings that are not already code constants // or held in persistent memory. - static LazyInstance<std::set<std::string>>::Leaky permanent_names; - static LazyInstance<Lock>::Leaky permanent_names_lock; + static base::NoDestructor<std::set<std::string>> permanent_names; + static base::NoDestructor<Lock> permanent_names_lock; - AutoLock lock(permanent_names_lock.Get()); - auto result = permanent_names.Get().insert(name); + AutoLock lock(*permanent_names_lock); + auto result = permanent_names->insert(name); return result.first->c_str(); }
diff --git a/base/numerics/safe_math_shared_impl.h b/base/numerics/safe_math_shared_impl.h index 583c487..3556b1e 100644 --- a/base/numerics/safe_math_shared_impl.h +++ b/base/numerics/safe_math_shared_impl.h
@@ -17,12 +17,15 @@ #include "base/numerics/safe_conversions.h" +#ifdef __asmjs__ +// Optimized safe math instructions are incompatible with asmjs. +#define BASE_HAS_OPTIMIZED_SAFE_MATH (0) // Where available use builtin math overflow support on Clang and GCC. -#if !defined(__native_client__) && \ - ((defined(__clang__) && \ - ((__clang_major__ > 3) || \ - (__clang_major__ == 3 && __clang_minor__ >= 4))) || \ - (defined(__GNUC__) && __GNUC__ >= 5)) +#elif !defined(__native_client__) && \ + ((defined(__clang__) && \ + ((__clang_major__ > 3) || \ + (__clang_major__ == 3 && __clang_minor__ >= 4))) || \ + (defined(__GNUC__) && __GNUC__ >= 5)) #include "base/numerics/safe_math_clang_gcc_impl.h" #define BASE_HAS_OPTIMIZED_SAFE_MATH (1) #else
diff --git a/base/one_shot_event.cc b/base/one_shot_event.cc index addd0e1..f96f7a1 100644 --- a/base/one_shot_event.cc +++ b/base/one_shot_event.cc
@@ -7,7 +7,6 @@ #include <stddef.h> #include "base/callback.h" -#include "base/lazy_instance.h" #include "base/location.h" #include "base/single_thread_task_runner.h" #include "base/task_runner.h"
diff --git a/base/run_loop.cc b/base/run_loop.cc index de03afc..af0ed1f 100644 --- a/base/run_loop.cc +++ b/base/run_loop.cc
@@ -7,7 +7,6 @@ #include "base/bind.h" #include "base/callback.h" #include "base/cancelable_callback.h" -#include "base/lazy_instance.h" #include "base/message_loop/message_loop.h" #include "base/no_destructor.h" #include "base/single_thread_task_runner.h" @@ -19,8 +18,10 @@ namespace { -LazyInstance<ThreadLocalPointer<RunLoop::Delegate>>::Leaky tls_delegate = - LAZY_INSTANCE_INITIALIZER; +ThreadLocalPointer<RunLoop::Delegate>& GetTlsDelegate() { + static base::NoDestructor<ThreadLocalPointer<RunLoop::Delegate>> instance; + return *instance; +} // Runs |closure| immediately if this is called on |task_runner|, otherwise // forwards |closure| to it. @@ -33,10 +34,10 @@ task_runner->PostTask(FROM_HERE, std::move(closure)); } -ThreadLocalPointer<RunLoop::ScopedRunTimeoutForTest>* +ThreadLocalPointer<RunLoop::ScopedRunTimeoutForTest>& ScopedRunTimeoutForTestTLS() { static NoDestructor<ThreadLocalPointer<RunLoop::ScopedRunTimeoutForTest>> tls; - return tls.get(); + return *tls; } void OnRunTimeout(RunLoop* run_loop, OnceClosure on_timeout) { @@ -51,29 +52,29 @@ RepeatingClosure on_timeout) : timeout_(timeout), on_timeout_(std::move(on_timeout)), - nested_timeout_(ScopedRunTimeoutForTestTLS()->Get()) { + nested_timeout_(ScopedRunTimeoutForTestTLS().Get()) { DCHECK_GT(timeout_, TimeDelta()); DCHECK(on_timeout_); - ScopedRunTimeoutForTestTLS()->Set(this); + ScopedRunTimeoutForTestTLS().Set(this); } RunLoop::ScopedRunTimeoutForTest::~ScopedRunTimeoutForTest() { - ScopedRunTimeoutForTestTLS()->Set(nested_timeout_); + ScopedRunTimeoutForTestTLS().Set(nested_timeout_); } // static const RunLoop::ScopedRunTimeoutForTest* RunLoop::ScopedRunTimeoutForTest::Current() { - return ScopedRunTimeoutForTestTLS()->Get(); + return ScopedRunTimeoutForTestTLS().Get(); } RunLoop::ScopedDisableRunTimeoutForTest::ScopedDisableRunTimeoutForTest() - : nested_timeout_(ScopedRunTimeoutForTestTLS()->Get()) { - ScopedRunTimeoutForTestTLS()->Set(nullptr); + : nested_timeout_(ScopedRunTimeoutForTestTLS().Get()) { + ScopedRunTimeoutForTestTLS().Set(nullptr); } RunLoop::ScopedDisableRunTimeoutForTest::~ScopedDisableRunTimeoutForTest() { - ScopedRunTimeoutForTestTLS()->Set(nested_timeout_); + ScopedRunTimeoutForTestTLS().Set(nested_timeout_); } RunLoop::Delegate::Delegate() { @@ -87,8 +88,9 @@ // A RunLoop::Delegate may be destroyed before it is bound, if so it may still // be on its creation thread (e.g. a Thread that fails to start) and // shouldn't disrupt that thread's state. - if (bound_) - tls_delegate.Get().Set(nullptr); + if (bound_) { + GetTlsDelegate().Set(nullptr); + } } bool RunLoop::Delegate::ShouldQuitWhenIdle() { @@ -102,16 +104,16 @@ DCHECK_CALLED_ON_VALID_THREAD(delegate->bound_thread_checker_); // There can only be one RunLoop::Delegate per thread. - DCHECK(!tls_delegate.Get().Get()) + DCHECK(!GetTlsDelegate().Get()) << "Error: Multiple RunLoop::Delegates registered on the same thread.\n\n" "Hint: You perhaps instantiated a second " "MessageLoop/ScopedTaskEnvironment on a thread that already had one?"; - tls_delegate.Get().Set(delegate); + GetTlsDelegate().Set(delegate); delegate->bound_ = true; } RunLoop::RunLoop(Type type) - : delegate_(tls_delegate.Get().Get()), + : delegate_(GetTlsDelegate().Get()), type_(type), origin_task_runner_(ThreadTaskRunnerHandle::Get()), weak_factory_(this) { @@ -139,7 +141,7 @@ // TODO(crbug.com/905412): Use real-time for Run() timeouts so that they // can be applied even in tests which mock TimeTicks::Now(). CancelableOnceClosure cancelable_timeout; - ScopedRunTimeoutForTest* run_timeout = ScopedRunTimeoutForTestTLS()->Get(); + ScopedRunTimeoutForTest* run_timeout = ScopedRunTimeoutForTestTLS().Get(); if (run_timeout) { cancelable_timeout.Reset( BindOnce(&OnRunTimeout, Unretained(this), run_timeout->on_timeout())); @@ -234,26 +236,26 @@ // static bool RunLoop::IsRunningOnCurrentThread() { - Delegate* delegate = tls_delegate.Get().Get(); + Delegate* delegate = GetTlsDelegate().Get(); return delegate && !delegate->active_run_loops_.empty(); } // static bool RunLoop::IsNestedOnCurrentThread() { - Delegate* delegate = tls_delegate.Get().Get(); + Delegate* delegate = GetTlsDelegate().Get(); return delegate && delegate->active_run_loops_.size() > 1; } // static void RunLoop::AddNestingObserverOnCurrentThread(NestingObserver* observer) { - Delegate* delegate = tls_delegate.Get().Get(); + Delegate* delegate = GetTlsDelegate().Get(); DCHECK(delegate); delegate->nesting_observers_.AddObserver(observer); } // static void RunLoop::RemoveNestingObserverOnCurrentThread(NestingObserver* observer) { - Delegate* delegate = tls_delegate.Get().Get(); + Delegate* delegate = GetTlsDelegate().Get(); DCHECK(delegate); delegate->nesting_observers_.RemoveObserver(observer); } @@ -261,7 +263,7 @@ // static void RunLoop::QuitCurrentDeprecated() { DCHECK(IsRunningOnCurrentThread()); - Delegate* delegate = tls_delegate.Get().Get(); + Delegate* delegate = GetTlsDelegate().Get(); DCHECK(delegate->active_run_loops_.top()->allow_quit_current_deprecated_) << "Please migrate off QuitCurrentDeprecated(), e.g. to QuitClosure()."; delegate->active_run_loops_.top()->Quit(); @@ -270,7 +272,7 @@ // static void RunLoop::QuitCurrentWhenIdleDeprecated() { DCHECK(IsRunningOnCurrentThread()); - Delegate* delegate = tls_delegate.Get().Get(); + Delegate* delegate = GetTlsDelegate().Get(); DCHECK(delegate->active_run_loops_.top()->allow_quit_current_deprecated_) << "Please migrate off QuitCurrentWhenIdleDeprecated(), e.g. to " "QuitWhenIdleClosure()."; @@ -280,7 +282,7 @@ // static Closure RunLoop::QuitCurrentWhenIdleClosureDeprecated() { // TODO(844016): Fix callsites and enable this check, or remove the API. - // Delegate* delegate = tls_delegate.Get().Get(); + // Delegate* delegate = GetTlsDelegate().Get(); // DCHECK(delegate->active_run_loops_.top()->allow_quit_current_deprecated_) // << "Please migrate off QuitCurrentWhenIdleClosureDeprecated(), e.g to " // "QuitWhenIdleClosure()."; @@ -289,7 +291,7 @@ #if DCHECK_IS_ON() RunLoop::ScopedDisallowRunningForTesting::ScopedDisallowRunningForTesting() - : current_delegate_(tls_delegate.Get().Get()), + : current_delegate_(GetTlsDelegate().Get()), previous_run_allowance_( current_delegate_ ? current_delegate_->allow_running_for_testing_ : false) { @@ -298,7 +300,7 @@ } RunLoop::ScopedDisallowRunningForTesting::~ScopedDisallowRunningForTesting() { - DCHECK_EQ(current_delegate_, tls_delegate.Get().Get()); + DCHECK_EQ(current_delegate_, GetTlsDelegate().Get()); if (current_delegate_) current_delegate_->allow_running_for_testing_ = previous_run_allowance_; }
diff --git a/base/sequence_token.cc b/base/sequence_token.cc index 0bf2b44..3636c7f2 100644 --- a/base/sequence_token.cc +++ b/base/sequence_token.cc
@@ -5,8 +5,8 @@ #include "base/sequence_token.h" #include "base/atomic_sequence_num.h" -#include "base/lazy_instance.h" #include "base/logging.h" +#include "base/no_destructor.h" #include "base/threading/thread_local.h" namespace base { @@ -17,11 +17,15 @@ base::AtomicSequenceNumber g_task_token_generator; -LazyInstance<ThreadLocalPointer<const SequenceToken>>::Leaky - tls_current_sequence_token = LAZY_INSTANCE_INITIALIZER; +ThreadLocalPointer<const SequenceToken>& GetTlsCurrentSequenceToken() { + static base::NoDestructor<ThreadLocalPointer<const SequenceToken>> instance; + return *instance; +} -LazyInstance<ThreadLocalPointer<const TaskToken>>::Leaky - tls_current_task_token = LAZY_INSTANCE_INITIALIZER; +ThreadLocalPointer<const TaskToken>& GetTlsCurrentTaskToken() { + static base::NoDestructor<ThreadLocalPointer<const TaskToken>> instance; + return *instance; +} } // namespace @@ -47,7 +51,7 @@ SequenceToken SequenceToken::GetForCurrentThread() { const SequenceToken* current_sequence_token = - tls_current_sequence_token.Get().Get(); + GetTlsCurrentSequenceToken().Get(); return current_sequence_token ? *current_sequence_token : SequenceToken(); } @@ -68,25 +72,25 @@ } TaskToken TaskToken::GetForCurrentThread() { - const TaskToken* current_task_token = tls_current_task_token.Get().Get(); + const TaskToken* current_task_token = GetTlsCurrentTaskToken().Get(); return current_task_token ? *current_task_token : TaskToken(); } ScopedSetSequenceTokenForCurrentThread::ScopedSetSequenceTokenForCurrentThread( const SequenceToken& sequence_token) : sequence_token_(sequence_token), task_token_(TaskToken::Create()) { - DCHECK(!tls_current_sequence_token.Get().Get()); - DCHECK(!tls_current_task_token.Get().Get()); - tls_current_sequence_token.Get().Set(&sequence_token_); - tls_current_task_token.Get().Set(&task_token_); + DCHECK(!GetTlsCurrentSequenceToken().Get()); + DCHECK(!GetTlsCurrentTaskToken().Get()); + GetTlsCurrentSequenceToken().Set(&sequence_token_); + GetTlsCurrentTaskToken().Set(&task_token_); } ScopedSetSequenceTokenForCurrentThread:: ~ScopedSetSequenceTokenForCurrentThread() { - DCHECK_EQ(tls_current_sequence_token.Get().Get(), &sequence_token_); - DCHECK_EQ(tls_current_task_token.Get().Get(), &task_token_); - tls_current_sequence_token.Get().Set(nullptr); - tls_current_task_token.Get().Set(nullptr); + DCHECK_EQ(GetTlsCurrentSequenceToken().Get(), &sequence_token_); + DCHECK_EQ(GetTlsCurrentTaskToken().Get(), &task_token_); + GetTlsCurrentSequenceToken().Set(nullptr); + GetTlsCurrentTaskToken().Set(nullptr); } } // namespace base
diff --git a/base/stl_util.h b/base/stl_util.h index 18d44616b..4174d0c4 100644 --- a/base/stl_util.h +++ b/base/stl_util.h
@@ -79,6 +79,17 @@ void_t<decltype(std::declval<const Container&>().contains( std::declval<const Element&>()))>> : std::true_type {}; +// Utility type trait to detect whether a given container type has a nested +// mapped_type typedef. Used below to disable ContainsValue() for map like +// types. +// TOOD(crbug.com/970209): Remove once ContainsValue() is no longer used. +template <typename Container, typename = void> +struct HasMappedType : std::false_type {}; + +template <typename Container> +struct HasMappedType<Container, void_t<typename Container::mapped_type>> + : std::true_type {}; + } // namespace internal // C++14 implementation of C++17's std::size(): @@ -230,9 +241,17 @@ // Test to see if a collection like a vector contains a particular value. // Returns true if the value is in the collection. +// +// Note: This method is disabled for std::map-like types to avoid confusion. +// Since ContainsValue() would invoke std::map::find() through Contains(), +// usages of keys would be reported, not values. +// // TODO(crbug.com/970209): Replace usages of ContainsValue() with Contains() and // remove this method. -template <typename Collection, typename Value> +template < + typename Collection, + typename Value, + std::enable_if_t<!internal::HasMappedType<Collection>::value>* = nullptr> bool ContainsValue(const Collection& collection, const Value& value) { return Contains(collection, value); }
diff --git a/base/strings/string_number_conversions_fuzzer.cc b/base/strings/string_number_conversions_fuzzer.cc index 005873f..0088cae 100644 --- a/base/strings/string_number_conversions_fuzzer.cc +++ b/base/strings/string_number_conversions_fuzzer.cc
@@ -60,8 +60,8 @@ CheckRoundtrips16<int64_t>(data, size, &base::StringToInt64); CheckRoundtrips<uint64_t>(data, size, &base::StringToUint64); CheckRoundtrips16<uint64_t>(data, size, &base::StringToUint64); - CheckRoundtrips<size_t>(data, size, &base::StringToUint64); - CheckRoundtrips16<size_t>(data, size, &base::StringToUint64); + CheckRoundtrips<size_t>(data, size, &base::StringToSizeT); + CheckRoundtrips16<size_t>(data, size, &base::StringToSizeT); base::StringPiece string_piece_input(reinterpret_cast<const char*>(data), size);
diff --git a/base/system/sys_info.cc b/base/system/sys_info.cc index 5328e00..19a7dbb8 100644 --- a/base/system/sys_info.cc +++ b/base/system/sys_info.cc
@@ -11,10 +11,10 @@ #include "base/callback.h" #include "base/command_line.h" #include "base/feature_list.h" -#include "base/lazy_instance.h" #include "base/location.h" #include "base/logging.h" #include "base/metrics/field_trial_params.h" +#include "base/no_destructor.h" #include "base/system/sys_info_internal.h" #include "base/task/post_task.h" #include "base/task/task_traits.h" @@ -89,12 +89,12 @@ return (ram_size_mb > 0 && ram_size_mb <= GetLowMemoryDeviceThresholdMB()); } -static LazyInstance<internal::LazySysInfoValue<bool, DetectLowEndDevice>>::Leaky - g_lazy_low_end_device = LAZY_INSTANCE_INITIALIZER; - // static bool SysInfo::IsLowEndDeviceImpl() { - return g_lazy_low_end_device.Get().value(); + static base::NoDestructor< + internal::LazySysInfoValue<bool, DetectLowEndDevice>> + instance; + return instance->value(); } #endif
diff --git a/base/task/lazy_task_runner.cc b/base/task/lazy_task_runner.cc index fc80c8e7..9ee1bb7 100644 --- a/base/task/lazy_task_runner.cc +++ b/base/task/lazy_task_runner.cc
@@ -6,7 +6,7 @@ #include <utility> -#include "base/lazy_instance.h" +#include "base/lazy_instance_helpers.h" #include "base/logging.h" #include "base/task/post_task.h"
diff --git a/base/task/lazy_task_runner.h b/base/task/lazy_task_runner.h index 68d19a68..e3a41f7 100644 --- a/base/task/lazy_task_runner.h +++ b/base/task/lazy_task_runner.h
@@ -10,7 +10,6 @@ #include "base/atomicops.h" #include "base/callback.h" #include "base/compiler_specific.h" -#include "base/lazy_instance_helpers.h" #include "base/sequenced_task_runner.h" #include "base/single_thread_task_runner.h" #include "base/task/common/checked_lock.h"
diff --git a/base/test/launcher/test_launcher.cc b/base/test/launcher/test_launcher.cc index b3951485..85ab039e 100644 --- a/base/test/launcher/test_launcher.cc +++ b/base/test/launcher/test_launcher.cc
@@ -1054,13 +1054,17 @@ } } + skip_diabled_tests_ = + !command_line->HasSwitch(kGTestRunDisabledTestsFlag) && + !command_line->HasSwitch(kIsolatedScriptRunDisabledTestsFlag); + if (!InitTests()) return false; if (!ShuffleTests(command_line)) return false; - if (!ReorderAndValidateTests()) + if (!ProcessAndValidateTests()) return false; if (command_line->HasSwitch(switches::kTestLauncherPrintTestStdio)) { @@ -1080,10 +1084,6 @@ } } - skip_diabled_tests_ = - !command_line->HasSwitch(kGTestRunDisabledTestsFlag) && - !command_line->HasSwitch(kIsolatedScriptRunDisabledTestsFlag); - stop_on_failure_ = command_line->HasSwitch(kGTestBreakOnFailure); if (command_line->HasSwitch(switches::kTestLauncherSummaryOutput)) { @@ -1226,25 +1226,29 @@ return true; } -bool TestLauncher::ReorderAndValidateTests() { +bool TestLauncher::ProcessAndValidateTests() { bool result = true; std::unordered_set<std::string> disabled_tests; std::unordered_map<std::string, TestInfo> pre_tests; // Find disabled and pre tests for (const TestInfo& test_info : tests_) { - if (test_info.disabled()) + std::string test_name = test_info.GetFullName(); + results_tracker_.AddTest(test_name); + if (test_info.disabled()) { disabled_tests.insert(test_info.GetDisabledStrippedName()); + results_tracker_.AddDisabledTest(test_name); + } if (test_info.pre_test()) pre_tests[test_info.GetDisabledStrippedName()] = test_info; } std::vector<TestInfo> tests_to_run; for (const TestInfo& test_info : tests_) { + std::string test_name = test_info.GetFullName(); // If any test has a matching disabled test, fail and log for audit. - if (base::Contains(disabled_tests, test_info.GetFullName())) { - LOG(ERROR) << test_info.GetFullName() - << " duplicated by a DISABLED_ test"; + if (base::Contains(disabled_tests, test_name)) { + LOG(ERROR) << test_name << " duplicated by a DISABLED_ test"; result = false; } @@ -1259,8 +1263,10 @@ test_sequence.push_back(pre_tests[test_sequence.back().GetPreName()]); pre_tests.erase(test_sequence.back().GetDisabledStrippedName()); } - tests_to_run.insert(tests_to_run.end(), test_sequence.rbegin(), - test_sequence.rend()); + // Skip disabled tests unless explicitly requested. + if (!test_info.disabled() || !skip_diabled_tests_) + tests_to_run.insert(tests_to_run.end(), test_sequence.rbegin(), + test_sequence.rend()); } tests_ = std::move(tests_to_run); @@ -1313,13 +1319,6 @@ size_t test_found_count = 0; for (const TestInfo& test_info : tests_) { std::string test_name = test_info.GetFullName(); - results_tracker_.AddTest(test_name); - // Skip disabled tests unless explicitly requested. - if (test_info.disabled()) { - results_tracker_.AddDisabledTest(test_name); - if (skip_diabled_tests_) - continue; - } bool will_run_test = launcher_delegate_->WillRunTest( test_info.test_case_name(), test_info.test_name());
diff --git a/base/test/launcher/test_launcher.h b/base/test/launcher/test_launcher.h index 364b41c..1546dc94 100644 --- a/base/test/launcher/test_launcher.h +++ b/base/test/launcher/test_launcher.h
@@ -184,8 +184,10 @@ // Move all PRE_ tests prior to the final test in order. // Validate tests names. This includes no name conflict between tests // without DISABLED_ prefix, and orphaned PRE_ tests. + // Add all tests and disabled tests names to result tracker. + // Filter Disabled tests if not flagged to run. // Returns false if any violation is found. - bool ReorderAndValidateTests(); + bool ProcessAndValidateTests(); // Runs all tests in current iteration. void RunTests();
diff --git a/base/test/launcher/test_launcher_unittest.cc b/base/test/launcher/test_launcher_unittest.cc index ea461b8..b5d7508f 100644 --- a/base/test/launcher/test_launcher_unittest.cc +++ b/base/test/launcher/test_launcher_unittest.cc
@@ -338,6 +338,20 @@ EXPECT_TRUE(test_launcher.Run(command_line.get())); } +// Disabled test should disable all pre tests +TEST_F(TestLauncherTest, DisablePreTests) { + AddMockedTests("Test", + {"DISABLED_firstTest", "PRE_PRE_firstTest", "PRE_firstTest"}); + SetUpExpectCalls(); + using ::testing::_; + std::vector<std::string> tests_names; + EXPECT_CALL(delegate, + RunTests(_, testing::ElementsAreArray(tests_names.cbegin(), + tests_names.cend()))) + .WillOnce(testing::Return(0)); + EXPECT_TRUE(test_launcher.Run(command_line.get())); +} + // Shard index must be lesser than total shards TEST_F(TestLauncherTest, FaultyShardSetup) { command_line->AppendSwitchASCII("test-launcher-total-shards", "2");
diff --git a/base/time/default_clock.cc b/base/time/default_clock.cc index aa08f52..001357e 100644 --- a/base/time/default_clock.cc +++ b/base/time/default_clock.cc
@@ -4,7 +4,7 @@ #include "base/time/default_clock.h" -#include "base/lazy_instance.h" +#include "base/no_destructor.h" namespace base { @@ -16,8 +16,8 @@ // static DefaultClock* DefaultClock::GetInstance() { - static LazyInstance<DefaultClock>::Leaky instance = LAZY_INSTANCE_INITIALIZER; - return instance.Pointer(); + static base::NoDestructor<DefaultClock> instance; + return instance.get(); } } // namespace base
diff --git a/base/trace_event/heap_profiler_allocation_context_tracker.cc b/base/trace_event/heap_profiler_allocation_context_tracker.cc index 7da727a..ef48f68 100644 --- a/base/trace_event/heap_profiler_allocation_context_tracker.cc +++ b/base/trace_event/heap_profiler_allocation_context_tracker.cc
@@ -97,6 +97,7 @@ : thread_name_(nullptr), ignore_scope_depth_(0) { tracked_stack_.reserve(kMaxStackDepth); task_contexts_.reserve(kMaxTaskDepth); + task_contexts_.push_back("UntrackedTask"); } AllocationContextTracker::~AllocationContextTracker() = default; @@ -163,8 +164,8 @@ void AllocationContextTracker::PopCurrentTaskContext(const char* context) { // Guard for stack underflow. If tracing was started with a TRACE_EVENT in // scope, the context was never pushed, so it is possible that pop is called - // on an empty stack. - if (task_contexts_.empty()) + // on an empty stack. Note that the context always contains "UntrackedTask". + if (task_contexts_.size() == 1) return; DCHECK_EQ(context, task_contexts_.back())
diff --git a/base/trace_event/heap_profiler_allocation_context_tracker_unittest.cc b/base/trace_event/heap_profiler_allocation_context_tracker_unittest.cc index c26149e..b05d263a 100644 --- a/base/trace_event/heap_profiler_allocation_context_tracker_unittest.cc +++ b/base/trace_event/heap_profiler_allocation_context_tracker_unittest.cc
@@ -8,6 +8,7 @@ #include "base/memory/ref_counted.h" #include "base/pending_task.h" +#include "base/strings/string_piece.h" #include "base/trace_event/heap_profiler.h" #include "base/trace_event/heap_profiler_allocation_context.h" #include "base/trace_event/heap_profiler_allocation_context_tracker.h" @@ -334,7 +335,7 @@ AllocationContext ctx; ASSERT_TRUE(AllocationContextTracker::GetInstanceForCurrentThread() ->GetContextSnapshot(&ctx)); - ASSERT_FALSE(ctx.type_name); + ASSERT_EQ("UntrackedTask", base::StringPiece(ctx.type_name)); } TEST_F(AllocationContextTrackerTest, IgnoreAllocationTest) {
diff --git a/base/win/enum_variant.cc b/base/win/enum_variant.cc index 2975560..38861bfe7 100644 --- a/base/win/enum_variant.cc +++ b/base/win/enum_variant.cc
@@ -11,18 +11,19 @@ namespace base { namespace win { -EnumVariant::EnumVariant(unsigned long count) - : items_(new VARIANT[count]), - count_(count), - current_index_(0) { +EnumVariant::EnumVariant(ULONG count) : items_(), current_index_(0) { + for (ULONG i = 0; i < count; ++i) + items_.emplace_back(ScopedVariant::kEmptyVariant); } -EnumVariant::~EnumVariant() { -} +EnumVariant::~EnumVariant() = default; -VARIANT* EnumVariant::ItemAt(unsigned long index) { - DCHECK(index < count_); - return &items_[index]; +VARIANT* EnumVariant::ItemAt(ULONG index) { + DCHECK_LT(index, items_.size()); + // This is a hack to return a mutable pointer to the ScopedVariant, even + // though the original intent of the AsInput method was to allow only readonly + // access to the wrapped variant. + return items_[index].AsInput(); } ULONG STDMETHODCALLTYPE EnumVariant::AddRef() { @@ -46,19 +47,28 @@ STDMETHODIMP EnumVariant::Next(ULONG requested_count, VARIANT* out_elements, ULONG* out_elements_received) { - unsigned long count = std::min(requested_count, count_ - current_index_); - for (unsigned long i = 0; i < count; ++i) - out_elements[i] = items_[current_index_ + i]; + if (!out_elements) + return E_INVALIDARG; + + DCHECK_LE(current_index_, items_.size()); + ULONG available_count = ULONG{items_.size()} - current_index_; + ULONG count = std::min(requested_count, available_count); + for (ULONG i = 0; i < count; ++i) + out_elements[i] = items_[current_index_ + i].Copy(); current_index_ += count; - *out_elements_received = count; + + // The caller can choose not to get the number of received elements by setting + // |out_elements_received| to nullptr. + if (out_elements_received) + *out_elements_received = count; return (count == requested_count ? S_OK : S_FALSE); } STDMETHODIMP EnumVariant::Skip(ULONG skip_count) { - unsigned long count = skip_count; - if (current_index_ + count > count_) - count = count_ - current_index_; + ULONG count = skip_count; + if (current_index_ + count > ULONG{items_.size()}) + count = ULONG{items_.size()} - current_index_; current_index_ += count; return (count == skip_count ? S_OK : S_FALSE); @@ -70,9 +80,14 @@ } STDMETHODIMP EnumVariant::Clone(IEnumVARIANT** out_cloned_object) { - EnumVariant* other = new EnumVariant(count_); - if (count_ > 0) - memcpy(other->ItemAt(0), &items_[0], count_ * sizeof(VARIANT)); + if (!out_cloned_object) + return E_INVALIDARG; + + size_t count = items_.size(); + EnumVariant* other = new EnumVariant(ULONG{count}); + for (size_t i = 0; i < count; ++i) + other->items_[i] = static_cast<const VARIANT&>(items_[i]); + other->Skip(current_index_); other->AddRef(); *out_cloned_object = other;
diff --git a/base/win/enum_variant.h b/base/win/enum_variant.h index e27afcd..47ffd07 100644 --- a/base/win/enum_variant.h +++ b/base/win/enum_variant.h
@@ -8,8 +8,10 @@ #include <unknwn.h> #include <memory> +#include <vector> #include "base/win/iunknown_impl.h" +#include "base/win/scoped_variant.h" namespace base { namespace win { @@ -19,12 +21,12 @@ : public IEnumVARIANT, public IUnknownImpl { public: - // The constructor allocates an array of size |count|. Then use - // ItemAt to set the value of each item in the array to initialize it. - explicit EnumVariant(unsigned long count); + // The constructor allocates a vector of empty ScopedVariants of size |count|. + // Use ItemAt to set the value of each item in the array. + explicit EnumVariant(ULONG count); // Returns a mutable pointer to the item at position |index|. - VARIANT* ItemAt(unsigned long index); + VARIANT* ItemAt(ULONG index); // IUnknown. ULONG STDMETHODCALLTYPE AddRef() override; @@ -42,9 +44,8 @@ private: ~EnumVariant() override; - std::unique_ptr<VARIANT[]> items_; - unsigned long count_; - unsigned long current_index_; + std::vector<ScopedVariant> items_; + ULONG current_index_; }; } // namespace win
diff --git a/base/win/enum_variant_unittest.cc b/base/win/enum_variant_unittest.cc index 288c97e..77b2fde 100644 --- a/base/win/enum_variant_unittest.cc +++ b/base/win/enum_variant_unittest.cc
@@ -29,9 +29,11 @@ ienumvariant->Release(); VARIANT out_element; + ::VariantInit(&out_element); ULONG out_received = 0; EXPECT_EQ(S_FALSE, ev->Next(1, &out_element, &out_received)); EXPECT_EQ(0u, out_received); + ::VariantClear(&out_element); EXPECT_EQ(S_FALSE, ev->Skip(1)); @@ -66,20 +68,26 @@ // Get elements one at a time. VARIANT out_element; + ::VariantInit(&out_element); ULONG out_received = 0; EXPECT_EQ(S_OK, ev->Next(1, &out_element, &out_received)); EXPECT_EQ(1u, out_received); EXPECT_EQ(VT_I4, out_element.vt); EXPECT_EQ(10, out_element.lVal); + ::VariantClear(&out_element); EXPECT_EQ(S_OK, ev->Skip(1)); EXPECT_EQ(S_OK, ev->Next(1, &out_element, &out_received)); EXPECT_EQ(1u, out_received); EXPECT_EQ(VT_I4, out_element.vt); EXPECT_EQ(30, out_element.lVal); + ::VariantClear(&out_element); EXPECT_EQ(S_FALSE, ev->Next(1, &out_element, &out_received)); + ::VariantClear(&out_element); // Reset and get all elements at once. VARIANT out_elements[3]; + for (int i = 0; i < 3; ++i) + ::VariantInit(&out_elements[i]); EXPECT_EQ(S_OK, ev->Reset()); EXPECT_EQ(S_OK, ev->Next(3, out_elements, &out_received)); EXPECT_EQ(3u, out_received); @@ -89,23 +97,29 @@ EXPECT_EQ(20, out_elements[1].lVal); EXPECT_EQ(VT_I4, out_elements[2].vt); EXPECT_EQ(30, out_elements[2].lVal); + for (int i = 0; i < 3; ++i) + ::VariantClear(&out_elements[i]); EXPECT_EQ(S_FALSE, ev->Next(1, &out_element, &out_received)); + ::VariantClear(&out_element); // Clone it. IEnumVARIANT* ev2 = NULL; EXPECT_EQ(S_OK, ev->Clone(&ev2)); EXPECT_TRUE(ev2 != NULL); EXPECT_EQ(S_FALSE, ev->Next(1, &out_element, &out_received)); + ::VariantClear(&out_element); EXPECT_EQ(S_OK, ev2->Reset()); - EXPECT_EQ(S_OK, ev2->Next(3, out_elements, &out_received)); - EXPECT_EQ(3u, out_received); + EXPECT_EQ(S_OK, ev2->Next(3, out_elements, nullptr)); EXPECT_EQ(VT_I4, out_elements[0].vt); EXPECT_EQ(10, out_elements[0].lVal); EXPECT_EQ(VT_I4, out_elements[1].vt); EXPECT_EQ(20, out_elements[1].lVal); EXPECT_EQ(VT_I4, out_elements[2].vt); EXPECT_EQ(30, out_elements[2].lVal); - EXPECT_EQ(S_FALSE, ev2->Next(1, &out_element, &out_received)); + for (int i = 0; i < 3; ++i) + ::VariantClear(&out_elements[i]); + EXPECT_EQ(S_FALSE, ev2->Next(1, &out_element, nullptr)); + ::VariantClear(&out_element); ULONG ev2_finalrefcount = ev2->Release(); EXPECT_EQ(0u, ev2_finalrefcount);
diff --git a/base/win/scoped_variant.cc b/base/win/scoped_variant.cc index 61f645a..2d87dacb 100644 --- a/base/win/scoped_variant.cc +++ b/base/win/scoped_variant.cc
@@ -12,6 +12,11 @@ // Global, const instance of an empty variant. const VARIANT ScopedVariant::kEmptyVariant = {{{VT_EMPTY}}}; +ScopedVariant::ScopedVariant(ScopedVariant&& var) { + var_.vt = VT_EMPTY; + Reset(var.Release()); +} + ScopedVariant::~ScopedVariant() { static_assert(sizeof(ScopedVariant) == sizeof(VARIANT), "ScopedVariantSize"); ::VariantClear(&var_); @@ -222,6 +227,12 @@ } } +ScopedVariant& ScopedVariant::operator=(ScopedVariant&& var) { + if (var.ptr() != &var_) + Reset(var.Release()); + return *this; +} + ScopedVariant& ScopedVariant::operator=(const VARIANT& var) { if (&var != &var_) { VariantClear(&var_);
diff --git a/base/win/scoped_variant.h b/base/win/scoped_variant.h index caf6f50..afeecce 100644 --- a/base/win/scoped_variant.h +++ b/base/win/scoped_variant.h
@@ -61,6 +61,9 @@ // Copies the variant. explicit ScopedVariant(const VARIANT& var); + // Moves the wrapped variant into another ScopedVariant. + ScopedVariant(ScopedVariant&& var); + ~ScopedVariant(); inline VARTYPE type() const { @@ -126,6 +129,9 @@ // over that. const VARIANT* ptr() const { return &var_; } + // Moves the ScopedVariant to another instance. + ScopedVariant& operator=(ScopedVariant&& var); + // Like other scoped classes (e.g. scoped_refptr, ScopedBstr, // Microsoft::WRL::ComPtr) we support the assignment operator for the type we // wrap.
diff --git a/base/win/scoped_variant_unittest.cc b/base/win/scoped_variant_unittest.cc index 7d61e28..ef762f9 100644 --- a/base/win/scoped_variant_unittest.cc +++ b/base/win/scoped_variant_unittest.cc
@@ -4,6 +4,8 @@ #include <stdint.h> +#include <utility> + #include "base/win/scoped_variant.h" #include "testing/gtest/include/gtest/gtest.h" @@ -214,6 +216,17 @@ { ScopedVariant ref1(&faker); EXPECT_EQ(1, faker.ref_count()); + ScopedVariant ref2(std::move(ref1)); + EXPECT_EQ(1, faker.ref_count()); + ScopedVariant ref3; + ref3 = std::move(ref2); + EXPECT_EQ(1, faker.ref_count()); + } + EXPECT_EQ(0, faker.ref_count()); + + { + ScopedVariant ref1(&faker); + EXPECT_EQ(1, faker.ref_count()); ScopedVariant ref2(static_cast<const VARIANT&>(ref1)); EXPECT_EQ(2, faker.ref_count()); ScopedVariant ref3;
diff --git a/build/android/gyp/javac.py b/build/android/gyp/javac.py index 7cbe74c4..f34415d 100755 --- a/build/android/gyp/javac.py +++ b/build/android/gyp/javac.py
@@ -572,6 +572,7 @@ # they change. depfile_deps = [javac_path] + classpath_inputs + options.java_srcjars input_paths = depfile_deps + java_files + input_paths += [x[0] for x in options.additional_jar_files] output_paths = [ options.jar_path,
diff --git a/build/config/ios/codesign.py b/build/config/ios/codesign.py index 64bd129..11a021a 100644 --- a/build/config/ios/codesign.py +++ b/build/config/ios/codesign.py
@@ -511,8 +511,6 @@ def Main(): parser = argparse.ArgumentParser('codesign iOS bundles') - parser.add_argument('--developer_dir', required=False, - help='Path to Xcode.') subparsers = parser.add_subparsers() actions = [ @@ -525,8 +523,6 @@ action.Register(subparsers) args = parser.parse_args() - if args.developer_dir: - os.environ['DEVELOPER_DIR'] = args.developer_dir args.func(args)
diff --git a/build/config/mac/compile_ib_files.py b/build/config/ios/compile_ib_files.py similarity index 89% rename from build/config/mac/compile_ib_files.py rename to build/config/ios/compile_ib_files.py index cb6fa05..84781c17 100644 --- a/build/config/mac/compile_ib_files.py +++ b/build/config/ios/compile_ib_files.py
@@ -20,13 +20,8 @@ help='Path to output bundle.') parser.add_argument('-i', '--input', required=True, help='Path to input xib or storyboard.') - parser.add_argument('--developer_dir', required=False, - help='Path to Xcode.') args, unknown_args = parser.parse_known_args() - if args.developer_dir: - os.environ['DEVELOPER_DIR'] = args.developer_dir - ibtool_args = [ 'xcrun', 'ibtool', '--errors', '--warnings', '--notices',
diff --git a/build/toolchain/mac/compile_xcassets.py b/build/config/ios/compile_xcassets.py similarity index 100% rename from build/toolchain/mac/compile_xcassets.py rename to build/config/ios/compile_xcassets.py
diff --git a/build/toolchain/mac/compile_xcassets_unittests.py b/build/config/ios/compile_xcassets_unittests.py similarity index 100% rename from build/toolchain/mac/compile_xcassets_unittests.py rename to build/config/ios/compile_xcassets_unittests.py
diff --git a/build/config/ios/find_signing_identity.py b/build/config/ios/find_signing_identity.py index 19ab48b5..693054a2 100644 --- a/build/config/ios/find_signing_identity.py +++ b/build/config/ios/find_signing_identity.py
@@ -36,14 +36,9 @@ if __name__ == '__main__': parser = argparse.ArgumentParser('codesign iOS bundles') parser.add_argument( - '--developer_dir', required=False, - help='Path to Xcode.') - parser.add_argument( '--identity-description', required=True, help='Text description used to select the code signing identity.') args = parser.parse_args() - if args.developer_dir: - os.environ['DEVELOPER_DIR'] = args.developer_dir for identity in FindValidIdentity(args.identity_description): print(identity)
diff --git a/build/config/ios/ios_sdk.gni b/build/config/ios/ios_sdk.gni index cf7ee81..06bbfa77 100644 --- a/build/config/ios/ios_sdk.gni +++ b/build/config/ios/ios_sdk.gni
@@ -5,6 +5,8 @@ import("//build/config/ios/ios_sdk_overrides.gni") import("//build/toolchain/toolchain.gni") +assert(use_system_xcode, "Hermetic xcode doesn't work for ios.") + declare_args() { # SDK path to use. When empty this will use the default SDK based on the # value of use_ios_simulator. @@ -89,12 +91,6 @@ } ios_sdk_info_args = [ "--get_sdk_info" ] - if (!use_system_xcode) { - ios_sdk_info_args += [ - "--developer_dir", - hermetic_xcode_path, - ] - } ios_sdk_info_args += [ ios_sdk_name ] script_name = "//build/config/mac/sdk_info.py" _ios_sdk_result = exec_script(script_name, ios_sdk_info_args, "scope") @@ -120,12 +116,6 @@ "--identity-description", ios_code_signing_identity_description, ] - if (!use_system_xcode) { - find_signing_identity_args += [ - "--developer_dir", - hermetic_xcode_path, - ] - } # If an identity is not provided, look for one on the host if (ios_code_signing_identity == "") {
diff --git a/build/config/ios/rules.gni b/build/config/ios/rules.gni index 383207d..5c282ab 100644 --- a/build/config/ios/rules.gni +++ b/build/config/ios/rules.gni
@@ -84,20 +84,13 @@ deps += [ "$_arch_binary_target($_toolchain)" ] } - args = [] - if (!use_system_xcode) { - args += [ - "--developer_dir", - hermetic_xcode_path, - ] - } - args += [ - "xcrun", - "lipo", - "-create", - "-output", - rebase_path("$target_out_dir/$_output_name", root_build_dir), - ] + rebase_path(inputs, root_build_dir) + args = [ + "xcrun", + "lipo", + "-create", + "-output", + rebase_path("$target_out_dir/$_output_name", root_build_dir), + ] + rebase_path(inputs, root_build_dir) if (enable_dsyms) { _dsyms_output_dir = "$root_out_dir/$_output_name.dSYM" @@ -351,14 +344,7 @@ } } - code_signing_args = [] - if (!use_system_xcode) { - code_signing_args += [ - "--developer_dir", - hermetic_xcode_path, - ] - } - code_signing_args += [ + code_signing_args = [ "code-sign-bundle", "-t=" + ios_sdk_name, "-i=" + ios_code_signing_identity, @@ -768,18 +754,11 @@ _generate_entitlements_output, ] - args = [] - if (!use_system_xcode) { - args += [ - "--developer_dir", - hermetic_xcode_path, - ] - } - args += [ - "generate-entitlements", - "-e=" + rebase_path(_entitlements_path, root_build_dir), - "-p=" + rebase_path(_info_plist_path, root_build_dir), - ] + rebase_path(outputs, root_build_dir) + args = [ + "generate-entitlements", + "-e=" + rebase_path(_entitlements_path, root_build_dir), + "-p=" + rebase_path(_info_plist_path, root_build_dir), + ] + rebase_path(outputs, root_build_dir) } } @@ -970,6 +949,51 @@ configs = default_executable_configs } +# Template to compile .xib and .storyboard files. +# +# Arguments +# +# sources: +# list of string, sources to compile +# +# ibtool_flags: +# (optional) list of string, additional flags to pass to the ibtool +template("compile_ib_files") { + action_foreach(target_name) { + forward_variables_from(invoker, + [ + "testonly", + "visibility", + ]) + assert(defined(invoker.sources), + "sources must be specified for $target_name") + assert(defined(invoker.output_extension), + "output_extension must be specified for $target_name") + + ibtool_flags = [] + if (defined(invoker.ibtool_flags)) { + ibtool_flags = invoker.ibtool_flags + } + + _output_extension = invoker.output_extension + + script = "//build/config/ios/compile_ib_files.py" + sources = invoker.sources + outputs = [ + "$target_gen_dir/$target_name/{{source_name_part}}.$_output_extension", + ] + args = [ + "--input", + "{{source}}", + "--output", + rebase_path( + "$target_gen_dir/$target_name/{{source_name_part}}.$_output_extension", + root_build_dir), + ] + args += ibtool_flags + } +} + # Compile a xib or storyboard file and add it to a bundle_data so that it is # available at runtime in the bundle. #
diff --git a/build/config/mac/base_rules.gni b/build/config/mac/base_rules.gni index 88641af..45c9db04 100644 --- a/build/config/mac/base_rules.gni +++ b/build/config/mac/base_rules.gni
@@ -252,54 +252,3 @@ } } } - -# Template to compile .xib and .storyboard files. -# -# Arguments -# -# sources: -# list of string, sources to compile -# -# ibtool_flags: -# (optional) list of string, additional flags to pass to the ibtool -template("compile_ib_files") { - action_foreach(target_name) { - forward_variables_from(invoker, - [ - "testonly", - "visibility", - ]) - assert(defined(invoker.sources), - "sources must be specified for $target_name") - assert(defined(invoker.output_extension), - "output_extension must be specified for $target_name") - - ibtool_flags = [] - if (defined(invoker.ibtool_flags)) { - ibtool_flags = invoker.ibtool_flags - } - - _output_extension = invoker.output_extension - - script = "//build/config/mac/compile_ib_files.py" - sources = invoker.sources - outputs = [ - "$target_gen_dir/$target_name/{{source_name_part}}.$_output_extension", - ] - args = [ - "--input", - "{{source}}", - "--output", - rebase_path( - "$target_gen_dir/$target_name/{{source_name_part}}.$_output_extension", - root_build_dir), - ] - if (!use_system_xcode) { - args += [ - "--developer_dir", - hermetic_xcode_path, - ] - } - args += ibtool_flags - } -}
diff --git a/build/config/mac/mac_sdk.gni b/build/config/mac/mac_sdk.gni index 1a6d170a..5e59c2e2 100644 --- a/build/config/mac/mac_sdk.gni +++ b/build/config/mac/mac_sdk.gni
@@ -45,7 +45,10 @@ # iOS toolchains. _verify_sdk = is_chrome_branded && is_official_build && target_os != "ios" -find_sdk_args = [ "--print_sdk_path" ] +find_sdk_args = [ + "--print_sdk_path", + "--print_bin_path", +] if (!use_system_xcode) { find_sdk_args += [ "--developer_dir", @@ -66,10 +69,17 @@ # second line. find_sdk_lines = exec_script("//build/mac/find_sdk.py", find_sdk_args, "list lines") -mac_sdk_version = find_sdk_lines[1] +mac_sdk_version = find_sdk_lines[2] if (mac_sdk_path == "") { mac_sdk_path = find_sdk_lines[0] } +mac_bin_path = find_sdk_lines[1] + +# If we're using hermetic Xcode, then we want the paths to be relative so that +# generated ninja files are independent of the directory location. +if (!use_system_xcode) { + mac_bin_path = rebase_path(mac_bin_path, root_build_dir) +} script_name = "//build/config/mac/sdk_info.py" sdk_info_args = []
diff --git a/build/fuchsia/linux.sdk.sha1 b/build/fuchsia/linux.sdk.sha1 index 52913649..06d15ba 100644 --- a/build/fuchsia/linux.sdk.sha1 +++ b/build/fuchsia/linux.sdk.sha1
@@ -1 +1 @@ -8911315473209928720 \ No newline at end of file +8911081207211170128 \ No newline at end of file
diff --git a/build/fuchsia/mac.sdk.sha1 b/build/fuchsia/mac.sdk.sha1 index 0745611d..625f04a 100644 --- a/build/fuchsia/mac.sdk.sha1 +++ b/build/fuchsia/mac.sdk.sha1
@@ -1 +1 @@ -8911318344250807168 \ No newline at end of file +8911085935913886544 \ No newline at end of file
diff --git a/build/mac/find_sdk.py b/build/mac/find_sdk.py index b358505f..2a277e1 100755 --- a/build/mac/find_sdk.py +++ b/build/mac/find_sdk.py
@@ -4,11 +4,23 @@ # found in the LICENSE file. """Prints the lowest locally available SDK version greater than or equal to a -given minimum sdk version to standard output. If --developer_dir is passed, then -the script will use the Xcode toolchain located at DEVELOPER_DIR. +given minimum sdk version to standard output. + +If --developer_dir is passed, then the script will use the Xcode toolchain +located at DEVELOPER_DIR. + +If --print_sdk_path is passed, then the script will also print the SDK path. +If --print_bin_path is passed, then the script will also print the path to the +toolchain bin dir. Usage: - python find_sdk.py [--developer_dir DEVELOPER_DIR] 10.6 # Ignores SDKs < 10.6 + python find_sdk.py [--developer_dir DEVELOPER_DIR] [--print_sdk_path] \ + [--print_bin_path] 10.6 # Ignores SDKs < 10.6 + +Sample Output: +/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.14.sdk +/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ +10.14 """ from __future__ import print_function @@ -44,6 +56,9 @@ parser.add_option("--print_sdk_path", action="store_true", dest="print_sdk_path", default=False, help="Additionally print the path the SDK (appears first).") + parser.add_option("--print_bin_path", + action="store_true", dest="print_bin_path", default=False, + help="Additionally print the path the toolchain bin dir.") parser.add_option("--developer_dir", help='Path to Xcode.') options, args = parser.parse_args() if len(args) != 1: @@ -55,9 +70,7 @@ # This is important to avoid since we want to minimize dependencies on the # xcode toolchain. if options.developer_dir: - sdk_dir = os.path.join( - options.developer_dir, - 'Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs') + dev_dir = os.path.join(options.developer_dir, 'Contents/Developer') else: job = subprocess.Popen(['xcode-select', '-print-path'], stdout=subprocess.PIPE, @@ -67,8 +80,9 @@ print(out, file=sys.stderr) print(err, file=sys.stderr) raise Exception('Error %d running xcode-select' % job.returncode) - sdk_dir = os.path.join( - out.rstrip(), 'Platforms/MacOSX.platform/Developer/SDKs') + dev_dir = out.rstrip() + sdk_dir = os.path.join( + dev_dir, 'Platforms/MacOSX.platform/Developer/SDKs') # Xcode must be installed, its license agreement must be accepted, and its # command-line tools must be installed. Stand-alone installations (in @@ -104,6 +118,10 @@ sdk_name = 'MacOSX' + best_sdk + '.sdk' print(os.path.join(sdk_dir, sdk_name)) + if options.print_bin_path: + bin_path = 'Toolchains/XcodeDefault.xctoolchain/usr/bin/' + print(os.path.join(dev_dir, bin_path)) + return best_sdk
diff --git a/build/sanitizers/tsan_suppressions.cc b/build/sanitizers/tsan_suppressions.cc index 72cb5ade..6139e6c 100644 --- a/build/sanitizers/tsan_suppressions.cc +++ b/build/sanitizers/tsan_suppressions.cc
@@ -110,10 +110,6 @@ // http://crbug.com/328868 "race:PR_Lock\n" - // http://crbug.com/333244 - "race:content::" - "VideoCaptureImplTest::MockVideoCaptureImpl::~MockVideoCaptureImpl\n" - // http://crbug.com/347538 "race:sctp_timer_start\n"
diff --git a/build/toolchain/mac/BUILD.gn b/build/toolchain/mac/BUILD.gn index 3de0b92..c83b83a7 100644 --- a/build/toolchain/mac/BUILD.gn +++ b/build/toolchain/mac/BUILD.gn
@@ -52,7 +52,7 @@ tool_versions = exec_script("get_tool_mtime.py", rebase_path([ - "//build/toolchain/mac/compile_xcassets.py", + "//build/config/ios/compile_xcassets.py", "//build/toolchain/mac/filter_libtool.py", "//build/toolchain/mac/linker_driver.py", ], @@ -63,12 +63,6 @@ # build args in this definition. template("mac_toolchain") { toolchain(target_name) { - if (use_system_xcode) { - env_wrapper = "" - } else { - env_wrapper = "export DEVELOPER_DIR=$hermetic_xcode_path; " - } - # When invoking this toolchain not as the default one, these args will be # passed to the build. They are ignored when this is the default toolchain. assert(defined(invoker.toolchain_args), @@ -125,6 +119,10 @@ cxx = compiler_prefix + _cxx ld = _cxx + # Set the explicit search path for clang++ so it uses the right linker + # binary. + ld += " -B " + mac_bin_path + if (defined(toolchain_args.coverage_instrumentation_input_file)) { toolchain_coverage_instrumentation_input_file = toolchain_args.coverage_instrumentation_input_file @@ -148,6 +146,10 @@ "TOOL_VERSION=${tool_versions.linker_driver} " + rebase_path("//build/toolchain/mac/linker_driver.py", root_build_dir) + # Specify an explicit path for the strip binary. + _strippath = "$mac_bin_path" + "strip" + linker_driver += " -Wcrl,strippath," + _strippath + # On iOS, the final applications are assembled using lipo (to support fat # builds). The correct flags are passed to the linker_driver.py script # directly during the lipo call. @@ -263,16 +265,9 @@ rspfile = "{{output}}.rsp" rspfile_content = "{{inputs_newline}}" - # libtool is part of the default path at /usr/bin/libtool. That binary is - # just a shim that calls out to xcrun to find the actual libtool. If we're - # using hermetic xcode, then we can explicitly specify the path to avoid - # invoking xcrun. - if (use_system_xcode) { - libtool = "libtool" - } else { - libtool = "$hermetic_xcode_path/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/libtool" - } - command = "$env_wrapper rm -f {{output}} && TOOL_VERSION=${tool_versions.filter_libtool} python $script $libtool -static {{arflags}} -o {{output}} -filelist $rspfile" + # Specify explicit path for libtool. + libtool = "$mac_bin_path" + "libtool" + command = "rm -f {{output}} && TOOL_VERSION=${tool_versions.filter_libtool} python $script $libtool -static {{arflags}} -o {{output}} -filelist $rspfile" description = "LIBTOOL-STATIC {{output}}" outputs = [ "{{output_dir}}/{{target_output_name}}{{output_extension}}", @@ -298,7 +293,14 @@ tocname = dylib + ".TOC" temporary_tocname = dylib + ".tmp" - does_reexport_command = "[ ! -e \"$dylib\" -o ! -e \"$tocname\" ] || otool -l \"$dylib\" | grep -q LC_REEXPORT_DYLIB" + # Use explicit paths to binaries. The binaries present on the default + # search path in /usr/bin are thin wrappers around xcrun, which requires a + # full CommandLineTools or Xcode install, and still may not choose the + # appropriate binary if there are multiple installs. + otool = "$mac_bin_path" + "otool" + nm = "$mac_bin_path" + "nm" + + does_reexport_command = "[ ! -e \"$dylib\" -o ! -e \"$tocname\" ] || $otool -l \"$dylib\" | grep -q LC_REEXPORT_DYLIB" link_command = "$linker_driver $ld -shared " if (is_component_build) { @@ -308,9 +310,9 @@ link_command += "{{ldflags}} -o \"$dylib\" -Wl,-filelist,\"$rspfile\" {{libs}} {{solibs}}" replace_command = "if ! cmp -s \"$temporary_tocname\" \"$tocname\"; then mv \"$temporary_tocname\" \"$tocname\"" - extract_toc_command = "{ otool -l \"$dylib\" | grep LC_ID_DYLIB -A 5; nm -gP \"$dylib\" | cut -f1-2 -d' ' | grep -v U\$\$; true; }" + extract_toc_command = "{ $otool -l \"$dylib\" | grep LC_ID_DYLIB -A 5; $nm -gP \"$dylib\" | cut -f1-2 -d' ' | grep -v U\$\$; true; }" - command = "$env_wrapper if $does_reexport_command ; then $link_command && $extract_toc_command > \"$tocname\"; else $link_command && $extract_toc_command > \"$temporary_tocname\" && $replace_command ; fi; fi" + command = "if $does_reexport_command ; then $link_command && $extract_toc_command > \"$tocname\"; else $link_command && $extract_toc_command > \"$temporary_tocname\" && $replace_command ; fi; fi" rspfile_content = "{{inputs_newline}}" @@ -351,7 +353,7 @@ rspfile = sofile + ".rsp" pool = "//build/toolchain:link_pool($default_toolchain)" - link_command = "$env_wrapper $linker_driver $ld -bundle {{ldflags}} -o \"$sofile\" -Wl,-filelist,\"$rspfile\"" + link_command = "$linker_driver $ld -bundle {{ldflags}} -o \"$sofile\" -Wl,-filelist,\"$rspfile\"" if (is_component_build) { link_command += " -Wl,-install_name,@rpath/{{target_output_name}}{{output_extension}}" } @@ -394,7 +396,7 @@ # do for command-line arguments. Thus any source names with spaces, or # label names with spaces (which GN bases the output paths on) will be # corrupted by this process. Don't use spaces for source files or labels. - command = "$env_wrapper $linker_driver $ld $dsym_switch {{ldflags}} -o \"$outfile\" -Wl,-filelist,\"$rspfile\" {{solibs}} {{libs}}" + command = "$linker_driver $ld $dsym_switch {{ldflags}} -o \"$outfile\" -Wl,-filelist,\"$rspfile\" {{solibs}} {{libs}}" description = "LINK $outfile" rspfile_content = "{{inputs_newline}}" outputs = [ @@ -456,7 +458,7 @@ # disallow future uses of xcassets on macOS. https://crbug.com/965663. if (toolchain_args.current_os == "ios") { tool("compile_xcassets") { - _tool = rebase_path("//build/toolchain/mac/compile_xcassets.py", + _tool = rebase_path("//build/config/ios/compile_xcassets.py", root_build_dir) if (is_ios) { _sdk_name = ios_sdk_name @@ -468,7 +470,7 @@ _compress_pngs = " -c " } command = - "$env_wrapper rm -f \"{{output}}\" && " + + "rm -f \"{{output}}\" && " + "TOOL_VERSION=${tool_versions.compile_xcassets} " + "python $_tool$_compress_pngs -p \"$_sdk_name\" " + "-t \"$_min_deployment_target\" -T \"{{bundle_product_type}}\" " +
diff --git a/build/toolchain/mac/linker_driver.py b/build/toolchain/mac/linker_driver.py index 10bbda02..4524a76 100755 --- a/build/toolchain/mac/linker_driver.py +++ b/build/toolchain/mac/linker_driver.py
@@ -10,7 +10,10 @@ import subprocess import sys +# On mac, the values of these globals are modified when parsing -Wcrl, flags. On +# ios, the script uses the defaults. DSYMUTIL_INVOKE = ['xcrun', 'dsymutil'] +STRIP_INVOKE = ['xcrun', 'strip'] # The linker_driver.py is responsible for forwarding a linker invocation to # the compiler driver, while processing special arguments itself. @@ -45,6 +48,10 @@ # After invoking the linker, and optionally dsymutil, this will run # the strip command on the linker's output. strip_arguments are # comma-separated arguments to be passed to the strip command. +# +# -Wcrl,strippath,<strip_path> +# Sets the path to the strip to run with -Wcrl,strip, in which case +# `xcrun` is not used to invoke it. def Main(args): """Main function for the linker driver. Separates out the arguments for @@ -204,7 +211,7 @@ Returns: list of string, Build step outputs. """ - strip_command = ['xcrun', 'strip'] + strip_command = list(STRIP_INVOKE) if len(strip_args_string) > 0: strip_command += strip_args_string.split(',') strip_command.append(_FindLinkerOutput(full_args)) @@ -212,6 +219,25 @@ return [] +def SetStripPath(strip_path, full_args): + """Linker driver action for -Wcrl,strippath,<strip_path>. + + Sets the invocation command for strip, which allows the caller to specify + an alternate strip. This action is always processed before the RunStrip + action. + + Args: + strip_path: string, The path to the strip binary to run + full_args: list of string, Full argument list for the linker driver. + + Returns: + No output - this step is run purely for its side-effect. + """ + global STRIP_INVOKE + STRIP_INVOKE = [strip_path] + return [] + + def _FindLinkerOutput(full_args): """Finds the output of the linker by looking for the output flag in its argument list. As this is a required linker argument, raises an error if it @@ -248,6 +274,7 @@ ('dsym,', RunDsymUtil), ('unstripped,', RunSaveUnstripped), ('strip,', RunStrip), + ('strippath,', SetStripPath), ]
diff --git a/buildtools/third_party/libunwind/BUILD.gn b/buildtools/third_party/libunwind/BUILD.gn index 3f671c8..1e4fbcb8 100644 --- a/buildtools/third_party/libunwind/BUILD.gn +++ b/buildtools/third_party/libunwind/BUILD.gn
@@ -19,7 +19,7 @@ if (is_fuchsia) { visibility += [ "//buildtools/third_party/libc++abi" ] } else if (is_android) { - visibility += [ "//components/tracing" ] + visibility += [ "//services/tracing/public/cpp" ] } if (!is_component_build) { defines = [ "_LIBUNWIND_DISABLE_VISIBILITY_ANNOTATIONS" ]
diff --git a/cc/test/layer_tree_pixel_test.cc b/cc/test/layer_tree_pixel_test.cc index 84a3139..9c85736 100644 --- a/cc/test/layer_tree_pixel_test.cc +++ b/cc/test/layer_tree_pixel_test.cc
@@ -284,8 +284,11 @@ ScrollNode scroll_node; property_trees->scroll_tree.Insert(scroll_node, 0); - TransformNode transform_node; - property_trees->transform_tree.Insert(transform_node, 0); + TransformTree& transform_tree = property_trees->transform_tree; + auto& transform_node = + *transform_tree.Node(transform_tree.Insert(TransformNode(), 0)); + transform_node.source_node_id = transform_node.parent_id; + transform_tree.set_needs_update(true); *root_layer = Layer::Create(); (*root_layer)->SetBounds(gfx::Size(100, 100));
diff --git a/cc/test/layer_tree_test.cc b/cc/test/layer_tree_test.cc index 6edc96b6..770839e9 100644 --- a/cc/test/layer_tree_test.cc +++ b/cc/test/layer_tree_test.cc
@@ -45,6 +45,7 @@ #include "gpu/command_buffer/service/gpu_switches.h" #include "testing/gmock/include/gmock/gmock.h" #include "ui/gfx/geometry/size_conversions.h" +#include "ui/gl/gl_switches.h" namespace cc { namespace { @@ -1065,8 +1066,12 @@ InitializeSettings(&settings_); if (use_vulkan()) { - base::CommandLine::ForCurrentProcess()->AppendSwitch( - ::switches::kEnableVulkan); + auto* command_line = base::CommandLine::ForCurrentProcess(); + bool use_gpu = command_line->HasSwitch(::switches::kUseGpuInTests); + command_line->AppendSwitchASCII( + ::switches::kUseVulkan, + use_gpu ? ::switches::kVulkanImplementationNameNative + : ::switches::kVulkanImplementationNameSwiftshader); } base::ThreadTaskRunnerHandle::Get()->PostTask(
diff --git a/cc/test/pixel_test.cc b/cc/test/pixel_test.cc index 044a3f7..5dabb363 100644 --- a/cc/test/pixel_test.cc +++ b/cc/test/pixel_test.cc
@@ -277,8 +277,12 @@ void PixelTest::SetUpSkiaRenderer(bool flipped_output_surface, bool enable_vulkan) { if (enable_vulkan) { - base::CommandLine::ForCurrentProcess()->AppendSwitch( - ::switches::kEnableVulkan); + auto* command_line = base::CommandLine::ForCurrentProcess(); + bool use_gpu = command_line->HasSwitch(::switches::kUseGpuInTests); + command_line->AppendSwitchASCII( + ::switches::kUseVulkan, + use_gpu ? ::switches::kVulkanImplementationNameNative + : ::switches::kVulkanImplementationNameSwiftshader); } // Set up the GPU service. gpu_service_holder_ = viz::TestGpuServiceHolder::GetInstance();
diff --git a/cc/trees/draw_property_utils.cc b/cc/trees/draw_property_utils.cc index 9c1bec65..6b89087b 100644 --- a/cc/trees/draw_property_utils.cc +++ b/cc/trees/draw_property_utils.cc
@@ -838,8 +838,17 @@ } void ComputeTransforms(TransformTree* transform_tree) { - if (!transform_tree->needs_update()) + if (!transform_tree->needs_update()) { +#if DCHECK_IS_ON() + // If the transform tree does not need an update, no TransformNode should + // need a local transform update. + for (int i = TransformTree::kContentsRootNodeId; + i < static_cast<int>(transform_tree->size()); ++i) { + DCHECK(!transform_tree->Node(i)->needs_local_transform_update); + } +#endif return; + } for (int i = TransformTree::kContentsRootNodeId; i < static_cast<int>(transform_tree->size()); ++i) transform_tree->UpdateTransforms(i);
diff --git a/cc/trees/layer_tree_host_pixeltest_masks.cc b/cc/trees/layer_tree_host_pixeltest_masks.cc index cc590489..61836ca2 100644 --- a/cc/trees/layer_tree_host_pixeltest_masks.cc +++ b/cc/trees/layer_tree_host_pixeltest_masks.cc
@@ -450,10 +450,12 @@ // Scale the mask with a non-integral transform. This will trigger the // AA path in the renderer. - TransformNode transform; - transform.local = gfx::Transform(); - transform.local.Scale(1.5, 1.5); - property_trees.transform_tree.Insert(transform, 1); + TransformTree& transform_tree = property_trees.transform_tree; + auto& transform_node = + *transform_tree.Node(transform_tree.Insert(TransformNode(), 1)); + transform_node.source_node_id = transform_node.parent_id; + transform_node.local = gfx::Transform(); + transform_node.local.Scale(1.5, 1.5); scoped_refptr<SolidColorLayer> background = CreateSolidColorLayer(gfx::Rect(100, 100), SK_ColorWHITE);
diff --git a/cc/trees/property_tree.cc b/cc/trees/property_tree.cc index 5d6b0b8..98266cc 100644 --- a/cc/trees/property_tree.cc +++ b/cc/trees/property_tree.cc
@@ -233,6 +233,8 @@ UpdateNodeAndAncestorsHaveIntegerTranslations(node, parent_node); UpdateTransformChanged(node, parent_node, source_node); UpdateNodeAndAncestorsAreAnimatedOrInvertible(node, parent_node); + + DCHECK(!node->needs_local_transform_update); } bool TransformTree::IsDescendant(int desc_id, int source_id) const {
diff --git a/cc/trees/transform_node.h b/cc/trees/transform_node.h index 5a19cce..e5c80d2 100644 --- a/cc/trees/transform_node.h +++ b/cc/trees/transform_node.h
@@ -67,7 +67,8 @@ // context. int sorting_context_id; - // TODO(vollick): will be moved when accelerated effects are implemented. + // True if |TransformTree::UpdateLocalTransform| needs to be called which + // will update |to_parent| and |source_to_parent| (if possible). bool needs_local_transform_update : 1; // Whether this node or any ancestor has a potentially running
diff --git a/chrome/BUILD.gn b/chrome/BUILD.gn index 40a4309..e5d9950 100644 --- a/chrome/BUILD.gn +++ b/chrome/BUILD.gn
@@ -34,6 +34,7 @@ } else if (is_mac) { import("//build/compiled_action.gni") import("//build/config/mac/base_rules.gni") + import("//build/config/mac/mac_sdk.gni") import("//build/config/mac/rules.gni") import("//build/config/mac/symbols.gni") import("//build/mac/tweak_info_plist.gni") @@ -1331,16 +1332,10 @@ "--stamp", rebase_path(stamp_file, root_out_dir), ] - if (!use_system_xcode) { - args += [ - "--developer_dir", - hermetic_xcode_path, - ] - } - args += [ "_ChromeMain", rebase_path(_framework_binary_path, root_out_dir), + mac_bin_path, ] outputs = [ stamp_file, @@ -1455,7 +1450,6 @@ "//chrome/common", "//components/gwp_asan/buildflags", "//components/sync", - "//components/tracing", ] if (enable_plugins) { public_deps += [ "//ppapi/host" ] @@ -1504,7 +1498,6 @@ "//components/gwp_asan/buildflags", "//components/services/heap_profiling", "//components/sync", - "//components/tracing", "//content/public/child", "//pdf", "//third_party/blink/public:blink_devtools_frontend_resources", @@ -1849,7 +1842,6 @@ "//components/minidump_uploader", "//components/safe_browsing/android:safe_browsing_mobile", "//components/services/heap_profiling", - "//components/tracing", "//content/public/app:both", "//content/public/common:service_names", "//services/service_manager/embedder",
diff --git a/chrome/VERSION b/chrome/VERSION index e776d5b..66f21e55 100644 --- a/chrome/VERSION +++ b/chrome/VERSION
@@ -1,4 +1,4 @@ MAJOR=77 MINOR=0 -BUILD=3818 +BUILD=3821 PATCH=0
diff --git a/chrome/android/BUILD.gn b/chrome/android/BUILD.gn index febeacf..f49c150 100644 --- a/chrome/android/BUILD.gn +++ b/chrome/android/BUILD.gn
@@ -1234,21 +1234,14 @@ if (enable_resource_whitelist_generation) { if (_is_trichrome || _is_monochrome) { - _lib = "monochrome" + _lib = "libmonochrome" } else { - _lib = "chrome" + _lib = "libchrome" } _resource_whitelist_target = "${_variant}_resource_whitelist" _resource_whitelist_file = "$target_gen_dir/${_variant}_resource_whitelist.txt" - - if (_is_trichrome || _is_monochrome) { - _target_prefix = "" - } else { - _target_prefix = "lib" - } - _lib_path = "/lib.unstripped/lib" + _lib + shlib_extension - _lib_target = _target_prefix + _lib + _lib_path = "/lib.unstripped/" + _lib + shlib_extension generate_resource_whitelist(_resource_whitelist_target) { _fat_lib_toolchain = "" @@ -1262,7 +1255,7 @@ } } deps = [ - ":${_lib_target}($_fat_lib_toolchain)", + ":${_lib}($_fat_lib_toolchain)", ] inputs = [ @@ -1439,25 +1432,25 @@ if (!android_64bit_target_cpu || current_toolchain == android_secondary_abi_toolchain) { # Monochrome APK native library. - libmonochrome_apk_or_bundle_tmpl("monochrome") { + libmonochrome_apk_or_bundle_tmpl("libmonochrome") { } if (android_64bit_target_cpu) { group("monochrome_64_secondary_abi_lib") { public_deps = [ - ":monochrome_64($android_secondary_abi_toolchain)", + ":libmonochrome_64($android_secondary_abi_toolchain)", ] } } } else { # 64-bit browser library targets (APK and bundle). - libmonochrome_apk_or_bundle_tmpl("monochrome_64") { + libmonochrome_apk_or_bundle_tmpl("libmonochrome_64") { } # 32-bit browser library alias targets, pulled in by 64-bit WebView builds. group("monochrome_secondary_abi_lib") { public_deps = [ - ":monochrome($android_secondary_abi_toolchain)", + ":libmonochrome($android_secondary_abi_toolchain)", ] } }
diff --git a/chrome/android/chrome_common_shared_library.gni b/chrome/android/chrome_common_shared_library.gni index 9a8346d..e37213e 100644 --- a/chrome/android/chrome_common_shared_library.gni +++ b/chrome/android/chrome_common_shared_library.gni
@@ -12,7 +12,7 @@ # TODO(cjgrant): Remove these variables once downstream stops using them. bundle_library_suffix = "" -apk_pak_asset_type = "apk" +apk_pak_asset_type = "_apk" # This value is set downstream for internal builds. if (!defined(default_chrome_orderfile)) {
diff --git a/chrome/android/chrome_java_sources.gni b/chrome/android/chrome_java_sources.gni index 281fb054..1cd97302 100644 --- a/chrome/android/chrome_java_sources.gni +++ b/chrome/android/chrome_java_sources.gni
@@ -1746,7 +1746,6 @@ "java/src/org/chromium/chrome/browser/widget/MaterialProgressBar.java", "java/src/org/chromium/chrome/browser/widget/NumberRollView.java", "java/src/org/chromium/chrome/browser/widget/OverviewListLayout.java", - "java/src/org/chromium/chrome/browser/widget/GridTabSwitcherLayout.java", "java/src/org/chromium/chrome/browser/widget/PaddedFrameLayout.java", "java/src/org/chromium/chrome/browser/widget/ProgressAnimationSmooth.java", "java/src/org/chromium/chrome/browser/widget/PromoDialog.java",
diff --git a/chrome/android/chrome_junit_test_java_sources.gni b/chrome/android/chrome_junit_test_java_sources.gni index 1c5f0d5f..9277cf0 100644 --- a/chrome/android/chrome_junit_test_java_sources.gni +++ b/chrome/android/chrome_junit_test_java_sources.gni
@@ -178,6 +178,7 @@ "junit/src/org/chromium/chrome/browser/suggestions/tile/TileGroupUnitTest.java", "junit/src/org/chromium/chrome/browser/survey/ChromeSurveyControllerTest.java", "junit/src/org/chromium/chrome/browser/tab/TabAttributesTest.java", + "junit/src/org/chromium/chrome/browser/tab/TabUnitTest.java", "junit/src/org/chromium/chrome/browser/tabmodel/TabPersistentStoreUnitTest.java", "junit/src/org/chromium/chrome/browser/tabstate/TabStateUnitTest.java", "junit/src/org/chromium/chrome/browser/tasks/EngagementTimeUtilTest.java",
diff --git a/chrome/android/chrome_public_apk_tmpl.gni b/chrome/android/chrome_public_apk_tmpl.gni index 7a268f3b..7ea064bc 100644 --- a/chrome/android/chrome_public_apk_tmpl.gni +++ b/chrome/android/chrome_public_apk_tmpl.gni
@@ -88,7 +88,7 @@ library_target = invoker.shared_library_for_unwind_asset deps = invoker.shared_libraries if (build_apk_secondary_abi && defined(android_secondary_abi_cpu)) { - deps += [ "//chrome/android:${library_target}($android_secondary_abi_toolchain)" ] + deps += [ "//chrome/android:lib${library_target}($android_secondary_abi_toolchain)" ] } } } @@ -308,7 +308,7 @@ # Build //android_webview:monochrome with the opposite bitness that # Chrome runs in. if (defined(invoker.is_64_bit_browser) && invoker.is_64_bit_browser) { - shared_libraries = [ "//chrome/android:monochrome_64" ] + shared_libraries = [ "//chrome/android:libmonochrome_64" ] if (build_apk_secondary_abi && invoker.include_32_bit_webview) { secondary_abi_shared_libraries = [ "//android_webview:monochrome_64($android_secondary_abi_toolchain)" ] } @@ -320,7 +320,7 @@ } } } else { - shared_libraries = [ "//chrome/android:monochrome" ] + shared_libraries = [ "//chrome/android:libmonochrome" ] } if (invoker.add_unwind_tables_in_apk) { shared_library_for_unwind_asset = "monochrome"
diff --git a/chrome/android/chrome_test_java_sources.gni b/chrome/android/chrome_test_java_sources.gni index f906c04..200c567 100644 --- a/chrome/android/chrome_test_java_sources.gni +++ b/chrome/android/chrome_test_java_sources.gni
@@ -495,7 +495,6 @@ "javatests/src/org/chromium/chrome/browser/webauth/AuthenticatorTest.java", "javatests/src/org/chromium/chrome/browser/webshare/WebShareTest.java", "javatests/src/org/chromium/chrome/browser/widget/DualControlLayoutTest.java", - "javatests/src/org/chromium/chrome/browser/widget/GridTabSwitcherLayoutPerfTest.java", "javatests/src/org/chromium/chrome/browser/widget/OverviewListLayoutTest.java", "javatests/src/org/chromium/chrome/browser/widget/PromoDialogTest.java", "javatests/src/org/chromium/chrome/browser/widget/RadioButtonLayoutTest.java",
diff --git a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_ar.xtb b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_ar.xtb index 5bfe5f4..8bcfdf6 100644 --- a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_ar.xtb +++ b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_ar.xtb
@@ -1,12 +1,15 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="ar"> +<translation id="1492646418094134664">انقر لإدخال بطاقة الائتمان باستخدام Chrome</translation> <translation id="2610239185026711824">اقتراح كلمة مرور</translation> <translation id="2803478378562657435">عرض كلمات المرور المحفوظة وخيارات كلمة المرور</translation> <translation id="2903493209154104877">العناوين</translation> <translation id="4660011489602794167">عرض لوحة المفاتيح</translation> <translation id="5088366526685584589">جارٍ عرض العناوين المحفوظة.</translation> +<translation id="5552748600584301915">انقر لإدخال العنوان باستخدام Chrome</translation> <translation id="6393156038355142111">اقتراح كلمة مرور قوية</translation> +<translation id="6810986916917535017">انقر لإدخال كلمة المرور باستخدام Chrome</translation> <translation id="7299100402441711551">عرض العناوين</translation> <translation id="7494879913343971937">عرض كلمات المرور</translation> <translation id="8507520749471379845">كلمات المرور متاحة</translation>
diff --git a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_fr.xtb b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_fr.xtb index 192088b..45b0359 100644 --- a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_fr.xtb +++ b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_fr.xtb
@@ -1,15 +1,15 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="fr"> -<translation id="1492646418094134664">Appuyez ici pour spécifier une carte de crédit avec Chrome</translation> +<translation id="1492646418094134664">Appuyez ici pour que Chrome remplisse la carte de crédit</translation> <translation id="2610239185026711824">Suggérer un mot de passe</translation> <translation id="2803478378562657435">Affichage des mots de passe enregistrés et des options de mot de passe</translation> <translation id="2903493209154104877">Adresses</translation> <translation id="4660011489602794167">Afficher le clavier</translation> <translation id="5088366526685584589">Affichage des adresses enregistrées</translation> -<translation id="5552748600584301915">Appuyez ici pour spécifier une adresse avec Chrome</translation> +<translation id="5552748600584301915">Appuyez ici pour que Chrome remplisse l'adresse</translation> <translation id="6393156038355142111">Suggérer un mot de passe sécurisé</translation> -<translation id="6810986916917535017">Appuyez ici pour spécifier un mot de passe avec Chrome</translation> +<translation id="6810986916917535017">Appuyez ici pour que Chrome remplisse le mot de passe</translation> <translation id="7299100402441711551">Afficher les adresses</translation> <translation id="7494879913343971937">Afficher les mots de passe</translation> <translation id="8507520749471379845">Mots de passe disponibles</translation>
diff --git a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_ja.xtb b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_ja.xtb index e25a17a..0867987 100644 --- a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_ja.xtb +++ b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_ja.xtb
@@ -1,15 +1,15 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="ja"> -<translation id="1492646418094134664">Chrome でクレジット カード情報を入力するにはタップしてください</translation> +<translation id="1492646418094134664">クレジット カード情報を自動入力するにはタップしてください</translation> <translation id="2610239185026711824">パスワードを自動生成</translation> <translation id="2803478378562657435">保存したパスワードとパスワードのオプションを表示しています</translation> <translation id="2903493209154104877">住所</translation> <translation id="4660011489602794167">キーボードを表示</translation> <translation id="5088366526685584589">保存された住所を表示しています</translation> -<translation id="5552748600584301915">Chrome で住所を入力するにはタップしてください</translation> +<translation id="5552748600584301915">住所を自動入力するにはタップしてください</translation> <translation id="6393156038355142111">安全なパスワードを自動生成</translation> -<translation id="6810986916917535017">Chrome でパスワードを入力するにはタップしてください</translation> +<translation id="6810986916917535017">パスワードを自動入力するにはタップしてください</translation> <translation id="7299100402441711551">住所を表示</translation> <translation id="7494879913343971937">パスワードを表示</translation> <translation id="8507520749471379845">使用可能なパスワード</translation>
diff --git a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_kn.xtb b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_kn.xtb index 568a8cd..4df669d4 100644 --- a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_kn.xtb +++ b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_kn.xtb
@@ -1,7 +1,7 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="kn"> -<translation id="1492646418094134664">Chrome ಮೂಲಕ ಕ್ರೆಡಿಟ್ ಕಾರ್ಡ್ ಮಾಹಿತಿಯನ್ನು ಭರ್ತಿ ಮಾಡಲು ಟ್ಯಾಪ್ ಮಾಡಿ</translation> +<translation id="1492646418094134664">Chrome ಸಹಾಯದಿಂದ ಕ್ರೆಡಿಟ್ ಕಾರ್ಡ್ ಮಾಹಿತಿಯನ್ನು ಭರ್ತಿ ಮಾಡಲು ಟ್ಯಾಪ್ ಮಾಡಿ</translation> <translation id="2610239185026711824">ಪಾಸ್ವರ್ಡ್ ಅನ್ನು ಸೂಚಿಸಿ</translation> <translation id="2803478378562657435">ಉಳಿಸಿದ ಪಾಸ್ವರ್ಡ್ಗಳು ಮತ್ತು ಪಾಸ್ವರ್ಡ್ ಆಯ್ಕೆಗಳನ್ನು ತೋರಿಸಲಾಗುತ್ತಿದೆ</translation> <translation id="2903493209154104877">ವಿಳಾಸಗಳು</translation>
diff --git a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_sk.xtb b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_sk.xtb index efa05b0..6f41d7d4 100644 --- a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_sk.xtb +++ b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_sk.xtb
@@ -7,9 +7,9 @@ <translation id="2903493209154104877">Adresy</translation> <translation id="4660011489602794167">Zobraziť klávesnicu</translation> <translation id="5088366526685584589">Zobrazujú sa uložené adresy</translation> -<translation id="5552748600584301915">Klepnutím nechajte adresu vyplniť Chrome</translation> +<translation id="5552748600584301915">Klepnutím nechajte Chrome vyplniť adresu</translation> <translation id="6393156038355142111">Navrhnúť silné heslo</translation> -<translation id="6810986916917535017">Klepnutím nechajte heslo vyplniť Chrome</translation> +<translation id="6810986916917535017">Klepnutím nechajte Chrome vyplniť heslo</translation> <translation id="7299100402441711551">Zobraziť adresy</translation> <translation id="7494879913343971937">Zobrazovať heslá</translation> <translation id="8507520749471379845">K dispozícii sú heslá</translation>
diff --git a/chrome/android/features/tab_ui/BUILD.gn b/chrome/android/features/tab_ui/BUILD.gn index e85ea34..e813b76 100644 --- a/chrome/android/features/tab_ui/BUILD.gn +++ b/chrome/android/features/tab_ui/BUILD.gn
@@ -23,6 +23,7 @@ "java/src/org/chromium/chrome/browser/tasks/tab_groups/TabGroupUtils.java", "java/src/org/chromium/chrome/browser/tasks/tab_management/ClosableTabGridViewHolder.java", "java/src/org/chromium/chrome/browser/tasks/tab_management/GridTabSwitcherCoordinator.java", + "java/src/org/chromium/chrome/browser/tasks/tab_management/GridTabSwitcherLayout.java", "java/src/org/chromium/chrome/browser/tasks/tab_management/GridTabSwitcherMediator.java", "java/src/org/chromium/chrome/browser/tasks/tab_management/MultiThumbnailCardProvider.java", "java/src/org/chromium/chrome/browser/tasks/tab_management/SelectableTabGridViewHolder.java",
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/GridTabSwitcher.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/GridTabSwitcher.java index dbcdf14..77facdb 100644 --- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/GridTabSwitcher.java +++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/GridTabSwitcher.java
@@ -27,6 +27,10 @@ */ interface GridVisibilityObserver extends OverviewModeBehavior.OverviewModeObserver {} + /** + * @return GridController implementation that can be used for controlling + * grid visibility changes. + */ GridController getGridController(); /**
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/GridTabSwitcherCoordinator.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/GridTabSwitcherCoordinator.java index d5a222ec..96512929 100644 --- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/GridTabSwitcherCoordinator.java +++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/GridTabSwitcherCoordinator.java
@@ -7,6 +7,7 @@ import android.content.Context; import android.graphics.Rect; import android.support.annotation.NonNull; +import android.support.annotation.Nullable; import org.chromium.chrome.R; import org.chromium.chrome.browser.compositor.CompositorViewHolder; @@ -19,7 +20,6 @@ import org.chromium.chrome.browser.tab.Tab; import org.chromium.chrome.browser.tabmodel.TabCreatorManager; import org.chromium.chrome.browser.tabmodel.TabList; -import org.chromium.chrome.browser.tabmodel.TabModel; import org.chromium.chrome.browser.tabmodel.TabModelSelector; import org.chromium.chrome.browser.util.FeatureUtilities; import org.chromium.ui.modelutil.PropertyModel; @@ -97,10 +97,7 @@ mLifecycleDispatcher.register(this); } - /** - * @return GridController implementation that will can be used for controlling - * grid visibility changes. - */ + // GridTabSwitcher implementation. @Override public GridController getGridController() { return mMediator; @@ -108,8 +105,9 @@ @Override public boolean prepareOverview() { + boolean quick = mMediator.prepareOverview(); mTabGridCoordinator.prepareOverview(); - return mMediator.prepareOverview(); + return quick; } @Override @@ -135,12 +133,9 @@ return mTabGridCoordinator.getLastDirtyTimeForTesting(); } - /** - * Reset the tab grid with the given {@link TabModel}. Can be null. - * @param tabList The current {@link TabList} to show the tabs for in the grid. - */ + // ResetHandler implementation. @Override - public boolean resetWithTabList(TabList tabList) { + public boolean resetWithTabList(@Nullable TabList tabList, boolean quickMode) { List<Tab> tabs = null; if (tabList != null) { tabs = new ArrayList<>(); @@ -148,7 +143,7 @@ tabs.add(tabList.getTabAt(i)); } } - return mTabGridCoordinator.resetWithListOfTabs(tabs); + return mTabGridCoordinator.resetWithListOfTabs(tabs, quickMode); } @Override @@ -156,6 +151,7 @@ mTabGridCoordinator.softCleanup(); } + // ResetHandler implementation. @Override public void destroy() { mTabGridCoordinator.destroy();
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/widget/GridTabSwitcherLayout.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/GridTabSwitcherLayout.java similarity index 84% rename from chrome/android/java/src/org/chromium/chrome/browser/widget/GridTabSwitcherLayout.java rename to chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/GridTabSwitcherLayout.java index 7f82311..be456bc 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/widget/GridTabSwitcherLayout.java +++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/GridTabSwitcherLayout.java
@@ -2,7 +2,9 @@ // 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.widget; +package org.chromium.chrome.browser.tasks.tab_management; + +import static org.chromium.chrome.browser.compositor.animation.CompositorAnimator.FAST_OUT_SLOW_IN_INTERPOLATOR; import android.animation.Animator; import android.animation.AnimatorListenerAdapter; @@ -31,8 +33,6 @@ import org.chromium.chrome.browser.compositor.scene_layer.TabListSceneLayer; import org.chromium.chrome.browser.fullscreen.ChromeFullscreenManager; import org.chromium.chrome.browser.tab.Tab; -import org.chromium.chrome.browser.tasks.tab_management.GridTabSwitcher; -import org.chromium.ui.interpolators.BakedBezierInterpolator; import org.chromium.ui.resources.ResourceManager; import org.chromium.ui.widget.Toast; @@ -50,6 +50,7 @@ // Duration of the transition animation @VisibleForTesting static final long ZOOMING_DURATION = 300; + private static final int BACKGROUND_FADING_DURATION_MS = 150; /** Field trial parameter for whether skipping slow zooming animation */ private static final String SKIP_SLOW_ZOOMING_PARAM = "skip-slow-zooming"; @@ -64,6 +65,8 @@ // To force Toolbar finishes its animation when this Layout finished hiding. private final LayoutTab mDummyLayoutTab; + private float mBackgroundAlpha; + private int mFrameCount; private long mStartTime; private long mLastFrameTime; @@ -111,6 +114,11 @@ } if (!showShrinkingAnimation) { + // Keep the current tab in mLayoutTabs so that thumbnail taking is not blocked. + LayoutTab sourceLayoutTab = createLayoutTab(mTabModelSelector.getCurrentTabId(), + mTabModelSelector.isIncognitoSelected(), NO_CLOSE_BUTTON, NEED_TITLE); + mLayoutTabs = new LayoutTab[] {sourceLayoutTab}; + mGridController.showOverview(animate); return; } @@ -204,6 +212,7 @@ private void shrinkTab(Supplier<Rect> target) { LayoutTab sourceLayoutTab = createLayoutTab(mTabModelSelector.getCurrentTabId(), mTabModelSelector.isIncognitoSelected(), NO_CLOSE_BUTTON, NEED_TITLE); + sourceLayoutTab.setDecorationAlpha(0); mLayoutTabs = new LayoutTab[] {sourceLayoutTab}; @@ -216,18 +225,26 @@ animationList.add(CompositorAnimator.ofFloatProperty( handler, sourceLayoutTab, LayoutTab.SCALE, () -> 1f, () -> { return target.get().width() / (getWidth() * mDpToPx); - }, ZOOMING_DURATION)); - animationList.add(CompositorAnimator.ofFloatProperty(handler, sourceLayoutTab, LayoutTab.X, - () -> 0f, () -> { return target.get().left / mDpToPx; }, ZOOMING_DURATION)); - animationList.add(CompositorAnimator.ofFloatProperty(handler, sourceLayoutTab, LayoutTab.Y, - () -> 0f, () -> { return target.get().top / mDpToPx; }, ZOOMING_DURATION)); + }, ZOOMING_DURATION, FAST_OUT_SLOW_IN_INTERPOLATOR)); animationList.add(CompositorAnimator.ofFloatProperty( - handler, sourceLayoutTab, LayoutTab.DECORATION_ALPHA, 1f, 0f, ZOOMING_DURATION)); + handler, sourceLayoutTab, LayoutTab.X, () -> 0f, () -> { + return target.get().left / mDpToPx; + }, ZOOMING_DURATION, FAST_OUT_SLOW_IN_INTERPOLATOR)); + animationList.add(CompositorAnimator.ofFloatProperty( + handler, sourceLayoutTab, LayoutTab.Y, () -> 0f, () -> { + return target.get().top / mDpToPx; + }, ZOOMING_DURATION, FAST_OUT_SLOW_IN_INTERPOLATOR)); // TODO(crbug.com/964406): when shrinking to the bottom row, bottom of the tab goes up and // down, making the "create group" visible for a while. animationList.add(CompositorAnimator.ofFloatProperty(handler, sourceLayoutTab, LayoutTab.MAX_CONTENT_HEIGHT, sourceLayoutTab.getUnclampedOriginalContentHeight(), - getWidth(), ZOOMING_DURATION, BakedBezierInterpolator.FADE_OUT_CURVE)); + getWidth(), ZOOMING_DURATION, FAST_OUT_SLOW_IN_INTERPOLATOR)); + + CompositorAnimator backgroundAlpha = + CompositorAnimator.ofFloat(handler, 0f, 1f, BACKGROUND_FADING_DURATION_MS, + animator -> mBackgroundAlpha = animator.getAnimatedValue()); + backgroundAlpha.setInterpolator(CompositorAnimator.FAST_OUT_LINEAR_IN_INTERPOLATOR); + animationList.add(backgroundAlpha); mTabToSwitcherAnimation = new AnimatorSet(); mTabToSwitcherAnimation.playTogether(animationList); @@ -255,6 +272,7 @@ private void expandTab(Rect source) { LayoutTab sourceLayoutTab = createLayoutTab(mTabModelSelector.getCurrentTabId(), mTabModelSelector.isIncognitoSelected(), NO_CLOSE_BUTTON, NEED_TITLE); + sourceLayoutTab.setDecorationAlpha(0); mLayoutTabs = new LayoutTab[] {sourceLayoutTab}; @@ -265,19 +283,24 @@ // Zoom in the source tab animationList.add(CompositorAnimator.ofFloatProperty(handler, sourceLayoutTab, - LayoutTab.SCALE, source.width() / (getWidth() * mDpToPx), 1, ZOOMING_DURATION)); + LayoutTab.SCALE, source.width() / (getWidth() * mDpToPx), 1, ZOOMING_DURATION, + FAST_OUT_SLOW_IN_INTERPOLATOR)); animationList.add(CompositorAnimator.ofFloatProperty(handler, sourceLayoutTab, LayoutTab.X, - source.left / mDpToPx, 0f, ZOOMING_DURATION)); - animationList.add(CompositorAnimator.ofFloatProperty( - handler, sourceLayoutTab, LayoutTab.Y, source.top / mDpToPx, 0f, ZOOMING_DURATION)); - animationList.add(CompositorAnimator.ofFloatProperty( - handler, sourceLayoutTab, LayoutTab.DECORATION_ALPHA, 0f, 1f, ZOOMING_DURATION)); + source.left / mDpToPx, 0f, ZOOMING_DURATION, FAST_OUT_SLOW_IN_INTERPOLATOR)); + animationList.add(CompositorAnimator.ofFloatProperty(handler, sourceLayoutTab, LayoutTab.Y, + source.top / mDpToPx, 0f, ZOOMING_DURATION, FAST_OUT_SLOW_IN_INTERPOLATOR)); // TODO(crbug.com/964406): when shrinking to the bottom row, bottom of the tab goes up and // down, making the "create group" visible for a while. animationList.add(CompositorAnimator.ofFloatProperty(handler, sourceLayoutTab, LayoutTab.MAX_CONTENT_HEIGHT, getWidth(), sourceLayoutTab.getUnclampedOriginalContentHeight(), ZOOMING_DURATION, - BakedBezierInterpolator.FADE_IN_CURVE)); + FAST_OUT_SLOW_IN_INTERPOLATOR)); + + CompositorAnimator backgroundAlpha = + CompositorAnimator.ofFloat(handler, 1f, 0f, BACKGROUND_FADING_DURATION_MS, + animator -> mBackgroundAlpha = animator.getAnimatedValue()); + backgroundAlpha.setInterpolator(CompositorAnimator.FAST_OUT_LINEAR_IN_INTERPOLATOR); + animationList.add(backgroundAlpha); mTabToSwitcherAnimation = new AnimatorSet(); mTabToSwitcherAnimation.playTogether(animationList); @@ -355,7 +378,8 @@ layerTitleCache, tabContentManager, resourceManager, fullscreenManager, ChromeFeatureList.isEnabled(ChromeFeatureList.TAB_TO_GTS_ANIMATION) ? mGridTabSwitcher.getResourceId() - : 0); + : 0, + mBackgroundAlpha); mFrameCount++; if (mLastFrameTime != 0) { long elapsed = SystemClock.elapsedRealtime() - mLastFrameTime;
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/GridTabSwitcherMediator.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/GridTabSwitcherMediator.java index 3954aba..a7b154ed 100644 --- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/GridTabSwitcherMediator.java +++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/GridTabSwitcherMediator.java
@@ -108,9 +108,12 @@ */ interface ResetHandler { /** + * Reset the tab grid with the given {@link TabList}, which can be null. + * @param tabList The {@link TabList} to show the tabs for in the grid. + * @param quickMode Whether to skip capturing the selected live tab for the thumbnail. * @return Whether the {@link TabListRecyclerView} can be shown quickly. */ - boolean resetWithTabList(TabList tabList); + boolean resetWithTabList(@Nullable TabList tabList, boolean quickMode); /** * Release the thumbnail {@link Bitmap} but keep the {@link TabGridViewHolder}. @@ -143,7 +146,7 @@ TabList currentTabModelFilter = mTabModelSelector.getTabModelFilterProvider().getCurrentTabModelFilter(); - mResetHandler.resetWithTabList(currentTabModelFilter); + mResetHandler.resetWithTabList(currentTabModelFilter, false); mContainerViewModel.set(IS_INCOGNITO, currentTabModelFilter.isIncognito()); } }; @@ -195,7 +198,7 @@ mTabGridDialogResetHandler = tabGridDialogResetHandler; mSoftClearTabListRunnable = mResetHandler::softCleanup; - mClearTabListRunnable = () -> mResetHandler.resetWithTabList(null); + mClearTabListRunnable = () -> mResetHandler.resetWithTabList(null, false); mHandler = new Handler(); } @@ -263,7 +266,7 @@ mHandler.removeCallbacks(mSoftClearTabListRunnable); mHandler.removeCallbacks(mClearTabListRunnable); boolean quick = mResetHandler.resetWithTabList( - mTabModelSelector.getTabModelFilterProvider().getCurrentTabModelFilter()); + mTabModelSelector.getTabModelFilterProvider().getCurrentTabModelFilter(), false); int initialPosition = Math.max( mTabModelSelector.getTabModelFilterProvider().getCurrentTabModelFilter().index() - INITIAL_SCROLL_INDEX_OFFSET, @@ -274,6 +277,8 @@ @Override public void showOverview(boolean animate) { + mResetHandler.resetWithTabList( + mTabModelSelector.getTabModelFilterProvider().getCurrentTabModelFilter(), true); if (!animate) mContainerViewModel.set(ANIMATE_VISIBILITY_CHANGES, false); setVisibility(true); mContainerViewModel.set(ANIMATE_VISIBILITY_CHANGES, true);
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridDialogMediator.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridDialogMediator.java index c310fad..b20eed33b 100644 --- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridDialogMediator.java +++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridDialogMediator.java
@@ -126,7 +126,7 @@ private void updateGridTabSwitcher() { if (!mModel.get(TabGridSheetProperties.IS_DIALOG_VISIBLE)) return; mGridTabSwitcherResetHandler.resetWithTabList( - mTabModelSelector.getTabModelFilterProvider().getCurrentTabModelFilter()); + mTabModelSelector.getTabModelFilterProvider().getCurrentTabModelFilter(), false); } private void updateDialog() {
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridItemTouchHelperCallback.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridItemTouchHelperCallback.java index f2d0b17..de4ed0f 100644 --- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridItemTouchHelperCallback.java +++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridItemTouchHelperCallback.java
@@ -17,6 +17,7 @@ import org.chromium.chrome.browser.tabmodel.TabModelSelector; import org.chromium.chrome.browser.tasks.tab_groups.TabGroupUtils; import org.chromium.chrome.browser.tasks.tabgroup.TabGroupModelFilter; +import org.chromium.chrome.browser.util.FeatureUtilities; import java.util.List; @@ -62,16 +63,20 @@ /** * This method sets up parameters that are used by the {@link ItemTouchHelper} to make decisions * about user actions. - * @param swipeToDismissThreshold Defines the threshold that user needs to swipe in order to - * be considered as a remove operation. - * @param mergeThreshold Defines the threshold of how much two items need to be - * overlapped in order to be considered as a merge operation. - * @param isDragEnabled Whether drag related behavior should handled in this - * callback. + * @param swipeToDismissThreshold Defines the threshold that user needs to swipe in + * order to be considered as a remove operation. + * @param mergeThreshold Defines the threshold of how much two items need to + * be overlapped in order to be considered as a merge operation. */ - void setupCallback(float swipeToDismissThreshold, float mergeThreshold, boolean isDragEnabled) { + void setupCallback(float swipeToDismissThreshold, float mergeThreshold) { mSwipeToDismissThreshold = swipeToDismissThreshold; mMergeThreshold = mergeThreshold; + boolean isTabGroupEnabled = FeatureUtilities.isTabGroupsAndroidEnabled(); + boolean isTabGroupUiImprovementEnabled = + FeatureUtilities.isTabGroupsAndroidUiImprovementsEnabled(); + // Only enable drag for users with group disabled, or with group and group ui improvement + // enabled at the same time. + boolean isDragEnabled = !isTabGroupEnabled || isTabGroupUiImprovementEnabled; mDragFlags = isDragEnabled ? ItemTouchHelper.START | ItemTouchHelper.END | ItemTouchHelper.UP | ItemTouchHelper.DOWN : 0; @@ -93,9 +98,9 @@ RecordUserAction.record("TabGrid.DragToReorder." + mComponentName); mSelectedTabIndex = toViewHolder.getAdapterPosition(); - if (mHoveredTabIndex != -1) { + if (mHoveredTabIndex != TabModel.INVALID_TAB_INDEX) { mModel.updateHoveredTabForMergeToGroup(mHoveredTabIndex, false); - mHoveredTabIndex = -1; + mHoveredTabIndex = TabModel.INVALID_TAB_INDEX; } int currentTabId = ((TabGridViewHolder) fromViewHolder).getTabId(); @@ -134,16 +139,19 @@ mSelectedTabIndex = viewHolder.getAdapterPosition(); mModel.updateSelectedTabForMergeToGroup(mSelectedTabIndex, true); } else if (actionState == ItemTouchHelper.ACTION_STATE_IDLE) { - if (mHoveredTabIndex != -1 && mActionsOnAllRelatedTabs) { + if (!FeatureUtilities.isTabGroupsAndroidUiImprovementsEnabled()) { + mHoveredTabIndex = TabModel.INVALID_TAB_INDEX; + } + if (mHoveredTabIndex != TabModel.INVALID_TAB_INDEX && mActionsOnAllRelatedTabs) { RecordUserAction.record("GridTabSwitcher.DropTabToMerge"); onTabMergeToGroup(mSelectedTabIndex, mHoveredTabIndex); mRecyclerView.getAdapter().notifyDataSetChanged(); } - if (mHoveredTabIndex == -1) { + if (mHoveredTabIndex == TabModel.INVALID_TAB_INDEX) { mModel.updateSelectedTabForMergeToGroup(mSelectedTabIndex, false); } - mHoveredTabIndex = -1; - mSelectedTabIndex = -1; + mHoveredTabIndex = TabModel.INVALID_TAB_INDEX; + mSelectedTabIndex = TabModel.INVALID_TAB_INDEX; } } @@ -154,10 +162,11 @@ if (actionState == ItemTouchHelper.ACTION_STATE_SWIPE) { float alpha = Math.max(0.2f, 1f - 0.8f * Math.abs(dX) / mSwipeToDismissThreshold); int index = mModel.indexFromId(((TabGridViewHolder) viewHolder).getTabId()); - if (index == -1) return; + if (index == TabModel.INVALID_TAB_INDEX) return; mModel.get(index).set(TabProperties.ALPHA, alpha); } else if (actionState == ItemTouchHelper.ACTION_STATE_DRAG && mActionsOnAllRelatedTabs) { + if (!FeatureUtilities.isTabGroupsAndroidUiImprovementsEnabled()) return; int prev_hovered = mHoveredTabIndex; mHoveredTabIndex = TabListRecyclerView.getHoveredTabIndex( recyclerView, viewHolder.itemView, dX, dY, mMergeThreshold);
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListCoordinator.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListCoordinator.java index 3b518212..38f04a2 100644 --- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListCoordinator.java +++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListCoordinator.java
@@ -22,7 +22,6 @@ import org.chromium.chrome.browser.tab.Tab; import org.chromium.chrome.browser.tabmodel.TabModelSelector; import org.chromium.chrome.browser.tasks.tab_groups.TabGroupUtils; -import org.chromium.chrome.browser.util.FeatureUtilities; import org.chromium.chrome.tab_ui.R; import org.chromium.components.feature_engagement.FeatureConstants; import org.chromium.ui.modelutil.PropertyKey; @@ -147,9 +146,7 @@ if (mMode == TabListMode.GRID) { ItemTouchHelper touchHelper = new ItemTouchHelper(mMediator.getItemTouchHelperCallback( context.getResources().getDimension(R.dimen.swipe_to_dismiss_threshold), - context.getResources().getDimension(R.dimen.tab_grid_merge_threshold), - !FeatureUtilities.isTabGroupsAndroidEnabled() - || FeatureUtilities.isTabGroupsAndroidUiImprovementsEnabled())); + context.getResources().getDimension(R.dimen.tab_grid_merge_threshold))); touchHelper.attachToRecyclerView(mRecyclerView); mMediator.registerOrientationListener( (GridLayoutManager) mRecyclerView.getLayoutManager()); @@ -185,15 +182,18 @@ } /** - * Reset the tab grid with the given List of Tabs. Can be null. - * @param tabs List of Tabs to show for in the UI. + * @see TabListMediator#resetWithListOfTabs(List, boolean) */ - public boolean resetWithListOfTabs(@Nullable List<Tab> tabs) { + boolean resetWithListOfTabs(@Nullable List<Tab> tabs, boolean quickMode) { if (mMode == TabListMode.STRIP && tabs != null && tabs.size() > 1) { TabGroupUtils.maybeShowIPH( FeatureConstants.TAB_GROUPS_TAP_TO_SEE_ANOTHER_TAB_FEATURE, mRecyclerView); } - return mMediator.resetWithListOfTabs(tabs); + return mMediator.resetWithListOfTabs(tabs, quickMode); + } + + boolean resetWithListOfTabs(@Nullable List<Tab> tabs) { + return resetWithListOfTabs(tabs, false); } void softCleanup() { @@ -202,6 +202,7 @@ void prepareOverview() { mRecyclerView.prepareOverview(); + mMediator.prepareOverview(); } void postHiding() {
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListMediator.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListMediator.java index 13aa911..08166cb 100644 --- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListMediator.java +++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListMediator.java
@@ -535,6 +535,21 @@ return position != TabModel.INVALID_TAB_INDEX && position < mModel.size(); } + /** + * Hide the blue border for selected tab for the Tab-to-Grid resizing stage. + * The selected border should re-appear in the final fading-in stage. + */ + void prepareOverview() { + int count = 0; + for (int i = 0; i < mModel.size(); i++) { + if (mModel.get(i).get(TabProperties.IS_SELECTED)) count++; + mModel.get(i).set(TabProperties.IS_SELECTED, false); + } + assert (count == 1) + : "There should be exactly one selected tab when calling " + + "TabListMediator.prepareOverview()"; + } + private boolean areTabsUnchanged(@Nullable List<Tab> tabs) { if (tabs == null) { return mModel.size() == 0; @@ -549,9 +564,10 @@ /** * Initialize the component with a list of tabs to show in a grid. * @param tabs The list of tabs to be shown. + * @param quickMode Whether to skip capturing the selected live tab for the thumbnail. * @return Whether the {@link TabListRecyclerView} can be shown quickly. */ - public boolean resetWithListOfTabs(@Nullable List<Tab> tabs) { + boolean resetWithListOfTabs(@Nullable List<Tab> tabs, boolean quickMode) { if (areTabsUnchanged(tabs)) { if (tabs == null) return true; @@ -563,7 +579,7 @@ boolean isSelected = mTabModelSelector.getCurrentTab() == tab; mModel.get(i).set(TabProperties.IS_SELECTED, isSelected); - if (mThumbnailProvider != null && isSelected) { + if (mThumbnailProvider != null && isSelected && !quickMode) { ThumbnailFetcher callback = new ThumbnailFetcher(mThumbnailProvider, tab, true); mModel.get(i).set(TabProperties.THUMBNAIL_FETCHER, callback); } @@ -616,10 +632,9 @@ /** * @return The callback that hosts the logic for swipe and drag related actions. */ - ItemTouchHelper.SimpleCallback getItemTouchHelperCallback(final float swipeToDismissThreshold, - final float mergeThreshold, final boolean isDragEnabled) { - mTabGridItemTouchHelperCallback.setupCallback( - swipeToDismissThreshold, mergeThreshold, isDragEnabled); + ItemTouchHelper.SimpleCallback getItemTouchHelperCallback( + final float swipeToDismissThreshold, final float mergeThreshold) { + mTabGridItemTouchHelperCallback.setupCallback(swipeToDismissThreshold, mergeThreshold); return mTabGridItemTouchHelperCallback; }
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListRecyclerView.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListRecyclerView.java index 0ab2c6c..e4895b7 100644 --- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListRecyclerView.java +++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListRecyclerView.java
@@ -29,6 +29,7 @@ */ class TabListRecyclerView extends RecyclerView { public static final long BASE_ANIMATION_DURATION_MS = 218; + public static final long FINAL_FADE_IN_DURATION_MS = 50; public static final long RESTORE_ANIMATION_DURATION_MS = 10; public static final int ANIMATION_STATUS_RESTORE = 0; public static final int ANIMATION_STATUS_ZOOM_OUT = 1; @@ -106,11 +107,15 @@ assert mFadeOutAnimator == null; mListener.startedShowing(animate); + long duration = ChromeFeatureList.isEnabled(ChromeFeatureList.TAB_TO_GTS_ANIMATION) + ? FINAL_FADE_IN_DURATION_MS + : BASE_ANIMATION_DURATION_MS; + setAlpha(0); setVisibility(View.VISIBLE); mFadeInAnimator = ObjectAnimator.ofFloat(this, View.ALPHA, 1); mFadeInAnimator.setInterpolator(BakedBezierInterpolator.FADE_IN_CURVE); - mFadeInAnimator.setDuration(BASE_ANIMATION_DURATION_MS); + mFadeInAnimator.setDuration(duration); mFadeInAnimator.start(); mFadeInAnimator.addListener(new AnimatorListenerAdapter() { @Override
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabManagementDelegate.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabManagementDelegate.java index 73914af..7b6269d5 100644 --- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabManagementDelegate.java +++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabManagementDelegate.java
@@ -4,10 +4,14 @@ package org.chromium.chrome.browser.tasks.tab_management; +import android.content.Context; import android.view.ViewGroup; import org.chromium.chrome.browser.ChromeActivity; import org.chromium.chrome.browser.ThemeColorProvider; +import org.chromium.chrome.browser.compositor.layouts.Layout; +import org.chromium.chrome.browser.compositor.layouts.LayoutRenderHost; +import org.chromium.chrome.browser.compositor.layouts.LayoutUpdateHost; import org.chromium.components.module_installer.ModuleInterface; /** @@ -16,6 +20,16 @@ @ModuleInterface(module = "tab_management", impl = "org.chromium.chrome.browser.tasks.tab_management.TabManagementDelegateImpl") public interface TabManagementDelegate { + /** + * Create the {@link GridTabSwitcherLayout}. + * @param context The current Android's context. + * @param updateHost The parent {@link LayoutUpdateHost}. + * @param renderHost The parent {@link LayoutRenderHost}. + * @param gridTabSwitcher The {@link GridTabSwitcher} the layout should own. + * @return The {@link GridTabSwitcherLayout}. + */ + Layout createGTSLayout(Context context, LayoutUpdateHost updateHost, + LayoutRenderHost renderHost, GridTabSwitcher gridTabSwitcher); GridTabSwitcher createGridTabSwitcher(ChromeActivity activity); TabGroupUi createTabGroupUi(ViewGroup parentView, ThemeColorProvider themeColorProvider); }
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabManagementDelegateImpl.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabManagementDelegateImpl.java index 3d66b85b..edc2f22 100644 --- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabManagementDelegateImpl.java +++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabManagementDelegateImpl.java
@@ -6,12 +6,16 @@ import static org.chromium.chrome.browser.tasks.tab_management.TabManagementModuleProvider.SYNTHETIC_TRIAL_POSTFIX; +import android.content.Context; import android.view.ViewGroup; import org.chromium.base.annotations.UsedByReflection; import org.chromium.chrome.browser.ChromeActivity; import org.chromium.chrome.browser.ChromeFeatureList; import org.chromium.chrome.browser.ThemeColorProvider; +import org.chromium.chrome.browser.compositor.layouts.Layout; +import org.chromium.chrome.browser.compositor.layouts.LayoutRenderHost; +import org.chromium.chrome.browser.compositor.layouts.LayoutUpdateHost; import org.chromium.chrome.browser.metrics.UmaSessionStats; /** @@ -20,6 +24,12 @@ @UsedByReflection("TabManagementModule") public class TabManagementDelegateImpl implements TabManagementDelegate { @Override + public Layout createGTSLayout(Context context, LayoutUpdateHost updateHost, + LayoutRenderHost renderHost, GridTabSwitcher gridTabSwitcher) { + return new GridTabSwitcherLayout(context, updateHost, renderHost, gridTabSwitcher); + } + + @Override public GridTabSwitcher createGridTabSwitcher(ChromeActivity activity) { if (ChromeFeatureList.isInitialized()) { UmaSessionStats.registerSyntheticFieldTrial(
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/widget/GridTabSwitcherLayoutPerfTest.java b/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/GridTabSwitcherLayoutPerfTest.java similarity index 98% rename from chrome/android/javatests/src/org/chromium/chrome/browser/widget/GridTabSwitcherLayoutPerfTest.java rename to chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/GridTabSwitcherLayoutPerfTest.java index 3ef2c532d..177934d 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/widget/GridTabSwitcherLayoutPerfTest.java +++ b/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/GridTabSwitcherLayoutPerfTest.java
@@ -2,7 +2,7 @@ // 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.widget; +package org.chromium.chrome.browser.tasks.tab_management; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; @@ -32,7 +32,6 @@ import org.chromium.chrome.browser.compositor.animation.CompositorAnimator; import org.chromium.chrome.browser.compositor.layouts.Layout; import org.chromium.chrome.browser.tab.Tab; -import org.chromium.chrome.browser.tasks.tab_management.GridTabSwitcher; import org.chromium.chrome.browser.util.FeatureUtilities; import org.chromium.chrome.test.ChromeJUnit4ClassRunner; import org.chromium.chrome.test.ChromeTabbedActivityTestRule;
diff --git a/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabGridContainerViewBinderTest.java b/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabGridContainerViewBinderTest.java index 2d0e233..68546eba 100644 --- a/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabGridContainerViewBinderTest.java +++ b/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabGridContainerViewBinderTest.java
@@ -17,17 +17,23 @@ import android.widget.FrameLayout; import org.junit.BeforeClass; +import org.junit.Rule; import org.junit.Test; +import org.junit.rules.TestRule; import org.junit.runner.RunWith; import org.chromium.base.ApiCompatibilityUtils; +import org.chromium.base.CommandLine; import org.chromium.base.ContextUtils; import org.chromium.base.test.util.CallbackHelper; import org.chromium.base.test.util.DisabledTest; +import org.chromium.chrome.browser.ChromeFeatureList; +import org.chromium.chrome.browser.util.FeatureUtilities; import org.chromium.chrome.tab_ui.R; import org.chromium.chrome.test.ChromeJUnit4ClassRunner; import org.chromium.chrome.test.ui.DummyUiActivity; import org.chromium.chrome.test.ui.DummyUiActivityTestCase; +import org.chromium.chrome.test.util.browser.Features; import org.chromium.content_public.browser.test.util.Criteria; import org.chromium.content_public.browser.test.util.CriteriaHelper; import org.chromium.content_public.browser.test.util.TestThreadUtils; @@ -39,6 +45,14 @@ */ @RunWith(ChromeJUnit4ClassRunner.class) public class TabGridContainerViewBinderTest extends DummyUiActivityTestCase { + /** + * DummyUiActivityTestCase also needs {@link ChromeFeatureList}'s + * internal test-only feature map, not the {@link CommandLine} provided by + * {@link Features.InstrumentationProcessor}. + */ + @Rule + public TestRule mProcessor = new Features.JUnitProcessor(); + private static final int CONTAINER_HEIGHT = 56; private TabGridContainerViewBinder mTabGridContainerViewHolder; private PropertyModel mContainerModel; @@ -83,6 +97,7 @@ @Override public void setUpTest() throws Exception { super.setUpTest(); + FeatureUtilities.setGridTabSwitcherEnabledForTesting(true); TestThreadUtils.runOnUiThreadBlocking( () -> { mRecyclerView = getActivity().findViewById(R.id.tab_list_view); }); @@ -100,6 +115,7 @@ @Test @MediumTest + @Features.EnableFeatures(ChromeFeatureList.TAB_TO_GTS_ANIMATION) @DisabledTest // Failed multiple times on Android CFI https://crbug.com/954145 public void testShowWithAnimation() throws Exception { @@ -129,6 +145,7 @@ @Test @MediumTest @UiThreadTest + @Features.EnableFeatures(ChromeFeatureList.TAB_TO_GTS_ANIMATION) public void testShowWithoutAnimation() throws Exception { mContainerModel.set( TabListContainerProperties.VISIBILITY_LISTENER, mMockVisibilityListener); @@ -145,6 +162,7 @@ @Test @MediumTest + @Features.EnableFeatures(ChromeFeatureList.TAB_TO_GTS_ANIMATION) public void testHidesWithAnimation() throws Exception { TestThreadUtils.runOnUiThreadBlocking(() -> { mContainerModel.set( @@ -182,6 +200,7 @@ @Test @MediumTest @UiThreadTest + @Features.EnableFeatures(ChromeFeatureList.TAB_TO_GTS_ANIMATION) public void testHidesWithoutAnimation() throws Exception { mContainerModel.set( TabListContainerProperties.VISIBILITY_LISTENER, mMockVisibilityListener);
diff --git a/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/GridTabSwitcherMediatorUnitTest.java b/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/GridTabSwitcherMediatorUnitTest.java index 1cd2264..0ba4fb8 100644 --- a/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/GridTabSwitcherMediatorUnitTest.java +++ b/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/GridTabSwitcherMediatorUnitTest.java
@@ -286,7 +286,7 @@ mMediator.setCleanupDelayForTesting(0); mMediator.postHiding(); verify(mResetHandler).softCleanup(); - verify(mResetHandler).resetWithTabList(eq(null)); + verify(mResetHandler).resetWithTabList(eq(null), eq(false)); } @Test @@ -295,7 +295,7 @@ doReturn(true).when(mTabModelFilter).isIncognito(); mTabModelSelectorObserverCaptor.getValue().onTabModelSelected(mTabModel, null); - verify(mResetHandler).resetWithTabList(eq(mTabModelFilter)); + verify(mResetHandler).resetWithTabList(eq(mTabModelFilter), eq(false)); assertThat(mModel.get(TabListContainerProperties.IS_INCOGNITO), equalTo(true)); // Switching TabModels by itself shouldn't cause visibility changes.
diff --git a/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabListMediatorUnitTest.java b/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabListMediatorUnitTest.java index f7a692db..f7d3908 100644 --- a/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabListMediatorUnitTest.java +++ b/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabListMediatorUnitTest.java
@@ -17,9 +17,13 @@ import static org.mockito.Mockito.doNothing; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.never; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; +import static org.chromium.chrome.browser.ChromeFeatureList.TAB_GROUPS_ANDROID; +import static org.chromium.chrome.browser.ChromeFeatureList.TAB_GROUPS_UI_IMPROVEMENTS_ANDROID; + import android.graphics.Color; import android.graphics.drawable.ColorDrawable; import android.graphics.drawable.Drawable; @@ -29,7 +33,9 @@ import org.junit.After; import org.junit.Before; +import org.junit.Rule; import org.junit.Test; +import org.junit.rules.TestRule; import org.junit.runner.RunWith; import org.mockito.ArgumentCaptor; import org.mockito.Captor; @@ -41,6 +47,7 @@ import org.chromium.base.UserDataHost; import org.chromium.base.metrics.RecordHistogram; import org.chromium.base.metrics.RecordUserAction; +import org.chromium.chrome.browser.ChromeFeatureList; import org.chromium.chrome.browser.compositor.layouts.content.TabContentManager; import org.chromium.chrome.browser.favicon.FaviconHelper; import org.chromium.chrome.browser.tab.Tab; @@ -53,6 +60,8 @@ import org.chromium.chrome.browser.tabmodel.TabModelObserver; import org.chromium.chrome.browser.tabmodel.TabModelSelectorImpl; import org.chromium.chrome.browser.tasks.tabgroup.TabGroupModelFilter; +import org.chromium.chrome.browser.util.FeatureUtilities; +import org.chromium.chrome.test.util.browser.Features; import org.chromium.testing.local.LocalRobolectricTestRunner; import java.util.ArrayList; @@ -65,6 +74,9 @@ @RunWith(LocalRobolectricTestRunner.class) @Config(manifest = Config.NONE) public class TabListMediatorUnitTest { + @Rule + public TestRule mProcessor = new Features.JUnitProcessor(); + private static final String TAB1_TITLE = "Tab1"; private static final String TAB2_TITLE = "Tab2"; private static final String TAB3_TITLE = "Tab3"; @@ -223,22 +235,28 @@ } @Test + @Features.DisableFeatures({ChromeFeatureList.TAB_GROUPS_ANDROID, + ChromeFeatureList.TAB_GROUPS_UI_IMPROVEMENTS_ANDROID}) public void sendsMoveTabSignalCorrectlyWithoutGroup() { initAndAssertAllProperties(); + FeatureUtilities.setTabGroupsAndroidEnabledForTesting(false); doReturn(mEmptyTabModelFilter).when(mTabModelFilterProvider).getCurrentTabModelFilter(); - mMediator.getItemTouchHelperCallback(0f, 0f, true) - .onMove(mRecyclerView, mViewHolder1, mViewHolder2); + mMediator.getItemTouchHelperCallback(0f, 0f).onMove( + mRecyclerView, mViewHolder1, mViewHolder2); verify(mTabModel).moveTab(eq(TAB1_ID), eq(2)); } @Test + @Features.EnableFeatures({ChromeFeatureList.TAB_GROUPS_ANDROID, + ChromeFeatureList.TAB_GROUPS_UI_IMPROVEMENTS_ANDROID}) public void sendsMoveTabSignalCorrectlyWithGroup() { initAndAssertAllProperties(); + FeatureUtilities.setTabGroupsAndroidEnabledForTesting(true); TabGridItemTouchHelperCallback itemTouchHelperCallback = - (TabGridItemTouchHelperCallback) mMediator.getItemTouchHelperCallback(0f, 0f, true); + (TabGridItemTouchHelperCallback) mMediator.getItemTouchHelperCallback(0f, 0f); itemTouchHelperCallback.setActionsOnAllRelatedTabsForTest(true); doReturn(mTabGroupModelFilter).when(mTabModelFilterProvider).getCurrentTabModelFilter(); @@ -249,23 +267,29 @@ } @Test + @Features.EnableFeatures({ChromeFeatureList.TAB_GROUPS_ANDROID, + ChromeFeatureList.TAB_GROUPS_UI_IMPROVEMENTS_ANDROID}) public void sendsMoveTabSignalCorrectlyWithinGroup() { initAndAssertAllProperties(); + FeatureUtilities.setTabGroupsAndroidEnabledForTesting(true); doReturn(mTabGroupModelFilter).when(mTabModelFilterProvider).getCurrentTabModelFilter(); - mMediator.getItemTouchHelperCallback(0f, 0f, true) - .onMove(mRecyclerView, mViewHolder1, mViewHolder2); + mMediator.getItemTouchHelperCallback(0f, 0f).onMove( + mRecyclerView, mViewHolder1, mViewHolder2); verify(mTabModel).moveTab(eq(TAB1_ID), eq(2)); } @Test + @Features.EnableFeatures({ChromeFeatureList.TAB_GROUPS_ANDROID, + ChromeFeatureList.TAB_GROUPS_UI_IMPROVEMENTS_ANDROID}) public void sendsMergeTabSignalCorrectly() { initAndAssertAllProperties(); + FeatureUtilities.setTabGroupsAndroidEnabledForTesting(true); mMediator.setActionOnAllRelatedTabsForTest(true); TabGridItemTouchHelperCallback itemTouchHelperCallback = - (TabGridItemTouchHelperCallback) mMediator.getItemTouchHelperCallback(0f, 0f, true); + (TabGridItemTouchHelperCallback) mMediator.getItemTouchHelperCallback(0f, 0f); itemTouchHelperCallback.setActionsOnAllRelatedTabsForTest(true); itemTouchHelperCallback.setHoveredTabIndexForTest(POSITION1); itemTouchHelperCallback.setSelectedTabIndexForTest(POSITION2); @@ -281,6 +305,51 @@ } @Test + @Features.DisableFeatures({TAB_GROUPS_ANDROID, TAB_GROUPS_UI_IMPROVEMENTS_ANDROID}) + public void neverSendsMergeTabSignal_Without_Group() { + initAndAssertAllProperties(); + FeatureUtilities.setTabGroupsAndroidEnabledForTesting(false); + mMediator.setActionOnAllRelatedTabsForTest(true); + TabGridItemTouchHelperCallback itemTouchHelperCallback = + (TabGridItemTouchHelperCallback) mMediator.getItemTouchHelperCallback(0f, 0f); + itemTouchHelperCallback.setActionsOnAllRelatedTabsForTest(true); + itemTouchHelperCallback.setHoveredTabIndexForTest(POSITION1); + itemTouchHelperCallback.setSelectedTabIndexForTest(POSITION2); + itemTouchHelperCallback.getMovementFlags(mRecyclerView, mViewHolder1); + + doReturn(mTabGroupModelFilter).when(mTabModelFilterProvider).getCurrentTabModelFilter(); + doReturn(mAdapter).when(mRecyclerView).getAdapter(); + + // Simulate the drop action. + itemTouchHelperCallback.onSelectedChanged(mViewHolder1, ItemTouchHelper.ACTION_STATE_IDLE); + + verify(mTabGroupModelFilter, never()).mergeTabsToGroup(anyInt(), anyInt()); + } + + @Test + @Features.EnableFeatures({TAB_GROUPS_ANDROID}) + @Features.DisableFeatures({TAB_GROUPS_UI_IMPROVEMENTS_ANDROID}) + public void neverSendsMergeTabSignal_With_Group_Without_Group_Improvement() { + initAndAssertAllProperties(); + FeatureUtilities.setTabGroupsAndroidEnabledForTesting(true); + mMediator.setActionOnAllRelatedTabsForTest(true); + TabGridItemTouchHelperCallback itemTouchHelperCallback = + (TabGridItemTouchHelperCallback) mMediator.getItemTouchHelperCallback(0f, 0f); + itemTouchHelperCallback.setActionsOnAllRelatedTabsForTest(true); + itemTouchHelperCallback.setHoveredTabIndexForTest(POSITION1); + itemTouchHelperCallback.setSelectedTabIndexForTest(POSITION2); + itemTouchHelperCallback.getMovementFlags(mRecyclerView, mViewHolder1); + + doReturn(mTabGroupModelFilter).when(mTabModelFilterProvider).getCurrentTabModelFilter(); + doReturn(mAdapter).when(mRecyclerView).getAdapter(); + + // Simulate the drop action. + itemTouchHelperCallback.onSelectedChanged(mViewHolder1, ItemTouchHelper.ACTION_STATE_IDLE); + + verify(mTabGroupModelFilter, never()).mergeTabsToGroup(anyInt(), anyInt()); + } + + @Test public void tabClosure() { initAndAssertAllProperties(); @@ -578,7 +647,7 @@ for (int i = 0; i < mTabModel.getCount(); i++) { tabs.add(mTabModel.getTabAt(i)); } - mMediator.resetWithListOfTabs(tabs); + mMediator.resetWithListOfTabs(tabs, false); for (Callback<Drawable> callback : mCallbackCaptor.getAllValues()) { callback.onResult(new ColorDrawable(Color.RED)); }
diff --git a/chrome/android/features/tab_ui/tab_management_java_sources.gni b/chrome/android/features/tab_ui/tab_management_java_sources.gni index cafcde2..938dcde 100644 --- a/chrome/android/features/tab_ui/tab_management_java_sources.gni +++ b/chrome/android/features/tab_ui/tab_management_java_sources.gni
@@ -11,6 +11,7 @@ ] tab_management_test_java_sources = [ + "//chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/GridTabSwitcherLayoutPerfTest.java", "//chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabGridContainerViewBinderTest.java", "//chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabListViewHolderTest.java", "//chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TestRecyclerViewSimpleViewBinder.java",
diff --git a/chrome/android/features/vr/vr_module_tmpl.gni b/chrome/android/features/vr/vr_module_tmpl.gni index 6f55d90b1..ca5075a 100644 --- a/chrome/android/features/vr/vr_module_tmpl.gni +++ b/chrome/android/features/vr/vr_module_tmpl.gni
@@ -72,9 +72,9 @@ } } if (_is_monochrome_or_trichrome) { - _base_target_name = "monochrome${_arch}_base" + _base_target_name = "libmonochrome${_arch}" } else { - _base_target_name = "libchrome${_arch}_base" + _base_target_name = "libchrome${_arch}" } _module = "vr" deps +=
diff --git a/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/FeedAppLifecycle.java b/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/FeedAppLifecycle.java index 8cb541a..9ea4764 100644 --- a/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/FeedAppLifecycle.java +++ b/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/FeedAppLifecycle.java
@@ -11,14 +11,11 @@ import org.chromium.base.ActivityState; import org.chromium.base.ApplicationStatus; -import org.chromium.base.VisibleForTesting; import org.chromium.base.metrics.RecordHistogram; -import org.chromium.base.task.PostTask; -import org.chromium.base.task.TaskTraits; import org.chromium.chrome.browser.ChromeFeatureList; import org.chromium.chrome.browser.ChromeTabbedActivity; +import org.chromium.chrome.browser.DeferredStartupHandler; import org.chromium.chrome.browser.signin.SigninManager; -import org.chromium.content_public.browser.UiThreadTaskTraits; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; @@ -52,31 +49,11 @@ private AppLifecycleListener mAppLifecycleListener; private FeedLifecycleBridge mLifecycleBridge; private FeedScheduler mFeedScheduler; - private TaskDelegate mTaskDelegate; private int mTabbedActivityCount; private boolean mInitializeCalled; private boolean mDelayedInitializeStarted; - /** Abstraction for posting delayed tasks. */ - interface TaskDelegate { - /** - * @param taskTraits The TaskTraits that describe the desired TaskRunner. - * @param task The task to be run with the specified traits. - * @param delay The delay in milliseconds before the task can be run. - */ - void postDelayedTask(TaskTraits taskTraits, Runnable task, long delay); - } - - /** The implementation used at runtime that calls into {@link PostTask}. */ - @VisibleForTesting - static class DefaultTaskDelegate implements TaskDelegate { - @Override - public void postDelayedTask(TaskTraits taskTraits, Runnable task, long delay) { - PostTask.postDelayedTask(taskTraits, task, delay); - } - } - /** * Create a FeedAppLifecycle instance. In normal use, this should only be called by {@link * FeedAppLifecycleFactory}. @@ -88,17 +65,9 @@ */ public FeedAppLifecycle(AppLifecycleListener appLifecycleListener, FeedLifecycleBridge lifecycleBridge, FeedScheduler feedScheduler) { - this(appLifecycleListener, lifecycleBridge, feedScheduler, new DefaultTaskDelegate()); - } - - /** Package private constructor used directly by tests to inject a mock TaskDelegate. */ - @VisibleForTesting - FeedAppLifecycle(AppLifecycleListener appLifecycleListener, FeedLifecycleBridge lifecycleBridge, - FeedScheduler feedScheduler, TaskDelegate taskDelegate) { mAppLifecycleListener = appLifecycleListener; mLifecycleBridge = lifecycleBridge; mFeedScheduler = feedScheduler; - mTaskDelegate = taskDelegate; int resumedActivityCount = 0; for (Activity activity : ApplicationStatus.getRunningActivities()) { @@ -163,7 +132,6 @@ mLifecycleBridge = null; mAppLifecycleListener = null; mFeedScheduler = null; - mTaskDelegate = null; } @Override @@ -209,18 +177,17 @@ if (!mDelayedInitializeStarted) { mDelayedInitializeStarted = true; - int disableByDefault = -1; - int delayMs = ChromeFeatureList.getFieldTrialParamByFeatureAsInt( - ChromeFeatureList.INTEREST_FEED_CONTENT_SUGGESTIONS, "init_feed_after_delay_ms", - disableByDefault); - if (delayMs >= 0) { - mTaskDelegate.postDelayedTask(UiThreadTaskTraits.BEST_EFFORT, () -> { + boolean initFeed = ChromeFeatureList.getFieldTrialParamByFeatureAsBoolean( + ChromeFeatureList.INTEREST_FEED_CONTENT_SUGGESTIONS, "init_feed_after_startup", + false); + if (initFeed) { + DeferredStartupHandler.getInstance().addDeferredTask(() -> { // Since this is being run asynchronously, it's possible #destroy() is called // before the delay finishes. Must guard against this. if (mLifecycleBridge != null) { initialize(); } - }, delayMs); + }); } } }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ShortcutHelper.java b/chrome/android/java/src/org/chromium/chrome/browser/ShortcutHelper.java index f1c72253..122a120 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/ShortcutHelper.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/ShortcutHelper.java
@@ -702,13 +702,12 @@ } private static boolean shouldShowToastWhenAddingShortcut() { - return !isRequestPinShortcutSupported(); + return !isRequestPinShortcutSupported() || FeatureUtilities.isNoTouchModeEnabled(); } private static boolean isRequestPinShortcutSupported() { if (!sCheckedIfRequestPinShortcutSupported) { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O - && !FeatureUtilities.isNoTouchModeEnabled()) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { checkIfRequestPinShortcutSupported(); } sCheckedIfRequestPinShortcutSupported = true;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/animation/CompositorAnimator.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/animation/CompositorAnimator.java index eebeddc..88b07a28 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/animation/CompositorAnimator.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/animation/CompositorAnimator.java
@@ -13,7 +13,9 @@ import android.support.annotation.IntDef; import android.support.annotation.NonNull; import android.support.annotation.Nullable; +import android.support.v4.view.animation.FastOutLinearInInterpolator; import android.support.v4.view.animation.FastOutSlowInInterpolator; +import android.support.v4.view.animation.LinearOutSlowInInterpolator; import android.view.animation.AccelerateInterpolator; import android.view.animation.DecelerateInterpolator; import android.view.animation.LinearInterpolator; @@ -114,6 +116,10 @@ new DecelerateInterpolator(); public static final FastOutSlowInInterpolator FAST_OUT_SLOW_IN_INTERPOLATOR = new FastOutSlowInInterpolator(); + public static final LinearOutSlowInInterpolator LINEAR_OUT_SLOW_IN_INTERPOLATOR = + new LinearOutSlowInInterpolator(); + public static final FastOutLinearInInterpolator FAST_OUT_LINEAR_IN_INTERPOLATOR = + new FastOutLinearInInterpolator(); public static final LinearInterpolator LINEAR_INTERPOLATOR = new LinearInterpolator(); /** @@ -162,6 +168,29 @@ * @param handler The {@link CompositorAnimationHandler} responsible for running the animation. * @param target The object to modify. * @param property The property of the object to modify. + * @param startValue The {@link Supplier} of the starting animation value. + * @param endValue The {@link Supplier} of the end animation value. + * @param durationMs The duration of the animation in ms. + * @param interpolator The time interpolator for the animation. + * @return A {@link CompositorAnimator} for the property. + */ + public static <T> CompositorAnimator ofFloatProperty(CompositorAnimationHandler handler, + final T target, final FloatProperty<T> property, Supplier<Float> startValue, + Supplier<Float> endValue, long durationMs, TimeInterpolator interpolator) { + CompositorAnimator animator = new CompositorAnimator(handler); + animator.setValues(startValue, endValue); + animator.setDuration(durationMs); + animator.addUpdateListener( + (CompositorAnimator a) -> property.setValue(target, a.getAnimatedValue())); + animator.setInterpolator(interpolator); + return animator; + } + + /** + * A utility for creating a basic animator. + * @param handler The {@link CompositorAnimationHandler} responsible for running the animation. + * @param target The object to modify. + * @param property The property of the object to modify. * @param startValue The starting animation value. * @param endValue The end animation value. * @param durationMs The duration of the animation in ms. @@ -187,12 +216,8 @@ public static <T> CompositorAnimator ofFloatProperty(CompositorAnimationHandler handler, final T target, final FloatProperty<T> property, Supplier<Float> startValue, Supplier<Float> endValue, long durationMs) { - CompositorAnimator animator = new CompositorAnimator(handler); - animator.setValues(startValue, endValue); - animator.setDuration(durationMs); - animator.addUpdateListener( - (CompositorAnimator a) -> property.setValue(target, a.getAnimatedValue())); - return animator; + return ofFloatProperty(handler, target, property, startValue, endValue, durationMs, + DECELERATE_INTERPOLATOR); } /** An interface for listening for frames of an animation. */
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/LayoutManagerChrome.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/LayoutManagerChrome.java index 662ad88a..4b579ec 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/LayoutManagerChrome.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/LayoutManagerChrome.java
@@ -31,10 +31,11 @@ import org.chromium.chrome.browser.tabmodel.TabModelSelector; import org.chromium.chrome.browser.tabmodel.TabModelUtils; import org.chromium.chrome.browser.tasks.tab_management.GridTabSwitcher; +import org.chromium.chrome.browser.tasks.tab_management.TabManagementDelegate; +import org.chromium.chrome.browser.tasks.tab_management.TabManagementModuleProvider; import org.chromium.chrome.browser.toolbar.ToolbarManager; import org.chromium.chrome.browser.util.AccessibilityUtil; import org.chromium.chrome.browser.util.FeatureUtilities; -import org.chromium.chrome.browser.widget.GridTabSwitcherLayout; import org.chromium.chrome.browser.widget.OverviewListLayout; import org.chromium.ui.resources.dynamics.DynamicResourceLoader; @@ -87,8 +88,12 @@ mToolbarSwipeLayout = new ToolbarSwipeLayout(context, this, renderHost); if (createOverviewLayout) { if (gridTabSwitcher != null) { - mOverviewLayout = - new GridTabSwitcherLayout(context, this, renderHost, gridTabSwitcher); + assert FeatureUtilities.isGridTabSwitcherEnabled(); + TabManagementDelegate tabManagementDelegate = + TabManagementModuleProvider.getDelegate(); + assert tabManagementDelegate != null; + mOverviewLayout = tabManagementDelegate.createGTSLayout( + context, this, renderHost, gridTabSwitcher); } else { mOverviewLayout = new StackLayout(context, this, renderHost); }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/ToolbarSwipeLayout.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/ToolbarSwipeLayout.java index edccdc5f..2f2ba79 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/ToolbarSwipeLayout.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/ToolbarSwipeLayout.java
@@ -403,7 +403,7 @@ // contentViewport is intentionally passed for both parameters below. mSceneLayer.pushLayers(getContext(), contentViewport, contentViewport, this, layerTitleCache, tabContentManager, resourceManager, fullscreenManager, - SceneLayer.INVALID_RESOURCE_ID); + SceneLayer.INVALID_RESOURCE_ID, 0); } /**
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 98c1695c..be7c3fa 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
@@ -8,6 +8,7 @@ import android.content.Context; import android.graphics.Bitmap; +import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.graphics.Matrix; import android.support.annotation.NonNull; @@ -16,8 +17,10 @@ import org.chromium.base.Callback; import org.chromium.base.CommandLine; +import org.chromium.base.PathUtils; import org.chromium.base.annotations.CalledByNative; import org.chromium.base.annotations.JNINamespace; +import org.chromium.base.task.AsyncTask; import org.chromium.chrome.R; import org.chromium.chrome.browser.ChromeSwitches; import org.chromium.chrome.browser.native_page.FrozenNativePage; @@ -29,6 +32,7 @@ import org.chromium.ui.base.DeviceFormFactor; import org.chromium.ui.display.DisplayAndroid; +import java.io.File; import java.util.ArrayList; import java.util.List; @@ -115,6 +119,7 @@ float thumbnailScale = 1.f; boolean useApproximationThumbnails; + boolean saveJpegThumbnails = FeatureUtilities.isGridTabSwitcherEnabled(); DisplayAndroid display = DisplayAndroid.getNonMultiDisplay(context); float deviceDensity = display.getDipScale(); if (DeviceFormFactor.isNonMultiDisplayContextOnTablet(context)) { @@ -133,9 +138,9 @@ mPriorityTabIds = new int[mFullResThumbnailsMaxSize]; - mNativeTabContentManager = nativeInit(defaultCacheSize, - approximationCacheSize, compressionQueueMaxSize, writeQueueMaxSize, - useApproximationThumbnails); + mNativeTabContentManager = + nativeInit(defaultCacheSize, approximationCacheSize, compressionQueueMaxSize, + writeQueueMaxSize, useApproximationThumbnails, saveJpegThumbnails); } /** @@ -277,13 +282,13 @@ if (mNativeTabContentManager == 0 || !mSnapshotsEnabled) return; if (!forceUpdate) { - nativeGetTabThumbnailWithCallback(mNativeTabContentManager, tab.getId(), callback); + getTabThumbnailFromDisk(tab, callback); return; } // Reading thumbnail from disk is faster than taking screenshot from live Tab, so fetch // that first even if |forceUpdate|. - nativeGetTabThumbnailWithCallback(mNativeTabContentManager, tab.getId(), (diskBitmap) -> { + getTabThumbnailFromDisk(tab, (diskBitmap) -> { callback.onResult(diskBitmap); captureDownsampledThumbnail(tab, (bitmap) -> { // Null check to avoid having a Bitmap from nativeGetTabThumbnailWithCallback() but @@ -297,6 +302,28 @@ }); } + private void getTabThumbnailFromDisk(@NonNull Tab tab, @NonNull Callback<Bitmap> callback) { + // Try JPEG thumbnail first before using the more costly nativeGetTabThumbnailWithCallback. + new AsyncTask<Bitmap>() { + @Override + public Bitmap doInBackground() { + File file = new File(PathUtils.getThumbnailCacheDirectory(), tab.getId() + ".jpeg"); + if (!file.isFile()) return null; + return BitmapFactory.decodeFile(file.getPath()); + } + + @Override + public void onPostExecute(Bitmap bitmap) { + if (bitmap != null) { + callback.onResult(bitmap); + return; + } + if (mNativeTabContentManager == 0 || !mSnapshotsEnabled) return; + nativeGetTabThumbnailWithCallback(mNativeTabContentManager, tab.getId(), callback); + } + }.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); + } + /** * Cache the content of a tab as a thumbnail. * @param tab The tab whose content we will cache. @@ -421,7 +448,8 @@ // Class Object Methods private native long nativeInit(int defaultCacheSize, int approximationCacheSize, - int compressionQueueMaxSize, int writeQueueMaxSize, boolean useApproximationThumbnail); + int compressionQueueMaxSize, int writeQueueMaxSize, boolean useApproximationThumbnail, + boolean saveJpegThumbnails); private native void nativeAttachTab(long nativeTabContentManager, Tab tab, int tabId); private native void nativeDetachTab(long nativeTabContentManager, Tab tab, int tabId); private native boolean nativeHasFullCachedThumbnail(long nativeTabContentManager, int tabId);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/SimpleAnimationLayout.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/SimpleAnimationLayout.java index eaed96c..620b3fb 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/SimpleAnimationLayout.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/SimpleAnimationLayout.java
@@ -457,6 +457,6 @@ // The content viewport is intentionally sent as both params below. mSceneLayer.pushLayers(getContext(), contentViewport, contentViewport, this, layerTitleCache, tabContentManager, resourceManager, fullscreenManager, - SceneLayer.INVALID_RESOURCE_ID); + SceneLayer.INVALID_RESOURCE_ID, 0); } }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/StackLayoutBase.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/StackLayoutBase.java index 65f1b77a..2f88199 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/StackLayoutBase.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/StackLayoutBase.java
@@ -1621,7 +1621,7 @@ mSceneLayer.pushLayers(getContext(), viewport, contentViewport, this, layerTitleCache, tabContentManager, resourceManager, fullscreenManager, - SceneLayer.INVALID_RESOURCE_ID); + SceneLayer.INVALID_RESOURCE_ID, 0); } /**
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/scene_layer/TabListSceneLayer.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/scene_layer/TabListSceneLayer.java index ae63775d..9e8b2bb 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/scene_layer/TabListSceneLayer.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/scene_layer/TabListSceneLayer.java
@@ -56,7 +56,7 @@ public void pushLayers(Context context, RectF viewport, RectF contentViewport, Layout layout, LayerTitleCache layerTitleCache, TabContentManager tabContentManager, ResourceManager resourceManager, ChromeFullscreenManager fullscreenManager, - int backgroundResourceId) { + int backgroundResourceId, float backgroundAlpha) { if (mNativePtr == 0) return; Resources res = context.getResources(); @@ -72,7 +72,7 @@ viewport.height(), layerTitleCache, tabContentManager, resourceManager); if (backgroundResourceId != INVALID_RESOURCE_ID) { - nativePutBackgroundLayer(mNativePtr, backgroundResourceId); + nativePutBackgroundLayer(mNativePtr, backgroundResourceId, backgroundAlpha); } boolean isHTSEnabled = @@ -207,5 +207,6 @@ float toolbarTextBoxAlpha, float toolbarAlpha, float toolbarYOffset, float sideBorderScale, boolean insetVerticalBorder); - private native void nativePutBackgroundLayer(long nativeTabListSceneLayer, int resourceId); + private native void nativePutBackgroundLayer( + long nativeTabListSceneLayer, int resourceId, float alpha); }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/explore_sites/ExploreSitesPage.java b/chrome/android/java/src/org/chromium/chrome/browser/explore_sites/ExploreSitesPage.java index c5e6856..53c666a2 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/explore_sites/ExploreSitesPage.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/explore_sites/ExploreSitesPage.java
@@ -182,9 +182,11 @@ } }); - // When we personalize, we don't want to scroll to the 4th category. - mInitialScrollPosition = - ExploreSitesBridge.getVariation() == ExploreSitesVariation.PERSONALIZED + // We don't want to scroll to the 4th category if personalized + // or integrated with Most Likely. + int variation = ExploreSitesBridge.getVariation(); + mInitialScrollPosition = variation == ExploreSitesVariation.PERSONALIZED + || ExploreSitesBridge.isIntegratedWithMostLikely(variation) ? INITIAL_SCROLL_POSITION_PERSONALIZED : INITIAL_SCROLL_POSITION;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/infobar/SavePasswordInfoBar.java b/chrome/android/java/src/org/chromium/chrome/browser/infobar/SavePasswordInfoBar.java index e3ea32c..486db5a 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/infobar/SavePasswordInfoBar.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/infobar/SavePasswordInfoBar.java
@@ -14,35 +14,25 @@ * The Save Password infobar asks the user whether they want to save the password for the site. */ public class SavePasswordInfoBar extends ConfirmInfoBar { - private final int mTitleLinkRangeStart; - private final int mTitleLinkRangeEnd; private final String mDetailsMessage; @CalledByNative - private static InfoBar show(int enumeratedIconId, String message, int titleLinkStart, - int titleLinkEnd, String detailsMessage, String primaryButtonText, - String secondaryButtonText) { + private static InfoBar show(int enumeratedIconId, String message, String detailsMessage, + String primaryButtonText, String secondaryButtonText) { return new SavePasswordInfoBar(ResourceId.mapToDrawableId(enumeratedIconId), message, - titleLinkStart, titleLinkEnd, detailsMessage, primaryButtonText, - secondaryButtonText); + detailsMessage, primaryButtonText, secondaryButtonText); } - private SavePasswordInfoBar(int iconDrawbleId, String message, int titleLinkStart, - int titleLinkEnd, String detailsMessage, String primaryButtonText, - String secondaryButtonText) { + private SavePasswordInfoBar(int iconDrawbleId, String message, String detailsMessage, + String primaryButtonText, String secondaryButtonText) { super(iconDrawbleId, R.color.infobar_icon_drawable_color, null, message, null, primaryButtonText, secondaryButtonText); - mTitleLinkRangeStart = titleLinkStart; - mTitleLinkRangeEnd = titleLinkEnd; mDetailsMessage = detailsMessage; } @Override public void createContent(InfoBarLayout layout) { super.createContent(layout); - if (mTitleLinkRangeStart != 0 && mTitleLinkRangeEnd != 0) { - layout.setInlineMessageLink(mTitleLinkRangeStart, mTitleLinkRangeEnd); - } if (!TextUtils.isEmpty(mDetailsMessage)) { InfoBarControlLayout detailsMessageLayout = layout.addControlLayout(); detailsMessageLayout.addDescription(mDetailsMessage);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/infobar/UpdatePasswordInfoBar.java b/chrome/android/java/src/org/chromium/chrome/browser/infobar/UpdatePasswordInfoBar.java index 10ae9e1..84e3312 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/infobar/UpdatePasswordInfoBar.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/infobar/UpdatePasswordInfoBar.java
@@ -17,34 +17,29 @@ */ public class UpdatePasswordInfoBar extends ConfirmInfoBar { private final String[] mUsernames; - private final int mTitleLinkRangeStart; - private final int mTitleLinkRangeEnd; + private final int mUsernameIndex; private final String mDetailsMessage; private Spinner mUsernamesSpinner; @CalledByNative - private static InfoBar show(int enumeratedIconId, String[] usernames, String message, - int titleLinkStart, int titleLinkEnd, String detailsMessage, String primaryButtonText) { + private static InfoBar show(int enumeratedIconId, String[] usernames, int selectedUsername, + String message, String detailsMessage, String primaryButtonText) { return new UpdatePasswordInfoBar(ResourceId.mapToDrawableId(enumeratedIconId), usernames, - message, titleLinkStart, titleLinkEnd, detailsMessage, primaryButtonText); + selectedUsername, message, detailsMessage, primaryButtonText); } - private UpdatePasswordInfoBar(int iconDrawableId, String[] usernames, String message, - int titleLinkStart, int titleLinkEnd, String detailsMessage, String primaryButtonText) { + private UpdatePasswordInfoBar(int iconDrawableId, String[] usernames, int selectedUsername, + String message, String detailsMessage, String primaryButtonText) { super(iconDrawableId, R.color.infobar_icon_drawable_color, null, message, null, primaryButtonText, null); - mTitleLinkRangeStart = titleLinkStart; - mTitleLinkRangeEnd = titleLinkEnd; mDetailsMessage = detailsMessage; mUsernames = usernames; + mUsernameIndex = selectedUsername; } @Override public void createContent(InfoBarLayout layout) { super.createContent(layout); - if (mTitleLinkRangeStart != 0 && mTitleLinkRangeEnd != 0) { - layout.setInlineMessageLink(mTitleLinkRangeStart, mTitleLinkRangeEnd); - } InfoBarControlLayout usernamesLayout = layout.addControlLayout(); if (mUsernames.length > 1) { @@ -52,6 +47,7 @@ new InfoBarArrayAdapter<String>(getContext(), mUsernames); mUsernamesSpinner = usernamesLayout.addSpinner( R.id.password_infobar_accounts_spinner, usernamesAdapter); + mUsernamesSpinner.setSelection(mUsernameIndex); } else { usernamesLayout.addDescription(mUsernames[0]); }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/offlinepages/prefetch/OfflineNotificationBackgroundTask.java b/chrome/android/java/src/org/chromium/chrome/browser/offlinepages/prefetch/OfflineNotificationBackgroundTask.java index ad6b8e4..4d73f0d 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/offlinepages/prefetch/OfflineNotificationBackgroundTask.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/offlinepages/prefetch/OfflineNotificationBackgroundTask.java
@@ -5,6 +5,7 @@ package org.chromium.chrome.browser.offlinepages.prefetch; import android.content.Context; +import android.os.Build; import android.text.format.DateUtils; import org.chromium.base.ContextUtils; @@ -240,7 +241,12 @@ boolean tooManyIgnoredNotifications = PrefetchPrefs.getIgnoredNotificationCounter() >= IGNORED_NOTIFICATION_MAX; - return noNewPages || tooManyIgnoredNotifications; + // Always enable on O+ devices because notification settings are handled at the system + // level, so the value of this pref can be ignored. + boolean disabledByPref = Build.VERSION.SDK_INT < Build.VERSION_CODES.O + && !PrefetchPrefs.getNotificationEnabled(); + + return noNewPages || tooManyIgnoredNotifications || disabledByPref; } private void resetPrefs() {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/offlinepages/prefetch/PrefetchBackgroundTask.java b/chrome/android/java/src/org/chromium/chrome/browser/offlinepages/prefetch/PrefetchBackgroundTask.java index df291d5..ddd0ff84 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/offlinepages/prefetch/PrefetchBackgroundTask.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/offlinepages/prefetch/PrefetchBackgroundTask.java
@@ -25,9 +25,6 @@ /** Key used in the extra data {@link Bundle} when the limitless flag is enabled. */ public static final String LIMITLESS_BUNDLE_KEY = "limitlessPrefetching"; - /** Key used in the extra data {@link Bundle} to store the GCM token. */ - public static final String GCM_TOKEN_BUNDLE_KEY = "gcmToken"; - private static final int MINIMUM_BATTERY_PERCENTAGE_FOR_PREFETCHING = 50; private static boolean sSkipConditionCheckingForTesting; @@ -43,8 +40,6 @@ private boolean mCachedRescheduleResult = true; private boolean mLimitlessPrefetchingEnabled; - private String mGcmToken; - public PrefetchBackgroundTask() {} @Override @@ -59,7 +54,6 @@ mTaskFinishedCallback = callback; mLimitlessPrefetchingEnabled = taskParameters.getExtras().getBoolean(LIMITLESS_BUNDLE_KEY); - mGcmToken = taskParameters.getExtras().getString(GCM_TOKEN_BUNDLE_KEY); // Check current device conditions. They might be set to null when testing and for some // specific Android devices. @@ -113,7 +107,7 @@ return; } - nativeStartPrefetchTask(mGcmToken); + nativeStartPrefetchTask(); } private boolean isBrowserRunningInReducedMode() { @@ -143,9 +137,9 @@ // that backoff states are rare, we decided not to start native here just to get an unlikely // set value of backoff time for the schedule calls. if (mLimitlessPrefetchingEnabled) { - PrefetchBackgroundTaskScheduler.scheduleTaskLimitless(0, mGcmToken); + PrefetchBackgroundTaskScheduler.scheduleTaskLimitless(0); } else { - PrefetchBackgroundTaskScheduler.scheduleTask(0, mGcmToken); + PrefetchBackgroundTaskScheduler.scheduleTask(0); } } @@ -210,7 +204,7 @@ } @VisibleForTesting - native boolean nativeStartPrefetchTask(String gcmToken); + native boolean nativeStartPrefetchTask(); @VisibleForTesting native boolean nativeOnStopTask(long nativePrefetchBackgroundTaskAndroid); native void nativeSetTaskReschedulingForTesting(
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/offlinepages/prefetch/PrefetchBackgroundTaskScheduler.java b/chrome/android/java/src/org/chromium/chrome/browser/offlinepages/prefetch/PrefetchBackgroundTaskScheduler.java index 45b9917..81d08d4 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/offlinepages/prefetch/PrefetchBackgroundTaskScheduler.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/offlinepages/prefetch/PrefetchBackgroundTaskScheduler.java
@@ -28,8 +28,8 @@ * TODO(dewittj): Handle skipping work if the battery percentage is too low. */ @CalledByNative - public static void scheduleTask(int additionalDelaySeconds, String gcmToken) { - scheduleTaskInternal(additionalDelaySeconds, false, gcmToken); + public static void scheduleTask(int additionalDelaySeconds) { + scheduleTaskInternal(additionalDelaySeconds, false); } /** @@ -37,18 +37,12 @@ * delays and no network restrictions (device needs only to be online). */ @CalledByNative - public static void scheduleTaskLimitless(int additionalDelaySeconds, String gcmToken) { - scheduleTaskInternal(additionalDelaySeconds, true, gcmToken); - } - - static Bundle createGCMTokenBundle(String gcmToken) { - Bundle bundle = new Bundle(1); - bundle.putString(PrefetchBackgroundTask.GCM_TOKEN_BUNDLE_KEY, gcmToken); - return bundle; + public static void scheduleTaskLimitless(int additionalDelaySeconds) { + scheduleTaskInternal(additionalDelaySeconds, true); } private static void scheduleTaskInternal( - int additionalDelaySeconds, boolean limitlessPrefetching, String gcmToken) { + int additionalDelaySeconds, boolean limitlessPrefetching) { final long minimumTimeSeconds = (limitlessPrefetching ? LIMITLESS_START_DELAY_SECONDS : DEFAULT_START_DELAY_SECONDS) + additionalDelaySeconds; @@ -63,17 +57,16 @@ .setRequiredNetworkType(TaskInfo.NetworkType.UNMETERED) .setIsPersisted(true) .setUpdateCurrent(true); - - Bundle bundle = createGCMTokenBundle(gcmToken); /* Limitless prefetching eliminates the default wait time but still complies with backoff * delays determined by |additionalDelaySeconds|. There's also no restriction on the network * type. */ if (limitlessPrefetching) { taskInfoBuilder.setRequiredNetworkType(TaskInfo.NetworkType.ANY); + Bundle bundle = new Bundle(1); bundle.putBoolean(PrefetchBackgroundTask.LIMITLESS_BUNDLE_KEY, true); + taskInfoBuilder.setExtras(bundle); } - taskInfoBuilder.setExtras(bundle); BackgroundTaskSchedulerFactory.getScheduler().schedule( ContextUtils.getApplicationContext(), taskInfoBuilder.build()); }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/offlinepages/prefetch/PrefetchPrefs.java b/chrome/android/java/src/org/chromium/chrome/browser/offlinepages/prefetch/PrefetchPrefs.java index 6c5d0fc6..a9c1240 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/offlinepages/prefetch/PrefetchPrefs.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/offlinepages/prefetch/PrefetchPrefs.java
@@ -15,6 +15,7 @@ * reacting to it */ public class PrefetchPrefs { + static final String PREF_PREFETCH_NOTIFICATION_ENABLED = "prefetch_notification_enabled"; static final String PREF_PREFETCH_HAS_NEW_PAGES = "prefetch_notification_has_new_pages"; static final String PREF_PREFETCH_NOTIFICATION_TIME = "prefetch_notification_shown_time"; static final String PREF_PREFETCH_OFFLINE_COUNTER = "prefetch_notification_offline_counter"; @@ -22,6 +23,24 @@ "prefetch_notification_ignored_counter"; /** + * Sets the flag to tell whether prefetch notifications are enabled in user settings. + */ + public static void setNotificationEnabled(boolean enabled) { + ContextUtils.getAppSharedPreferences() + .edit() + .putBoolean(PREF_PREFETCH_NOTIFICATION_ENABLED, enabled) + .apply(); + } + + /** + * Returns the flag to tell whether prefetch notifications are enabled in user settings. + */ + public static boolean getNotificationEnabled() { + return ContextUtils.getAppSharedPreferences().getBoolean( + PREF_PREFETCH_NOTIFICATION_ENABLED, true); + } + + /** * Sets the flag to tell whether new pages have been saved. */ public static void setHasNewPages(boolean hasNewPages) {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/MainPreferences.java b/chrome/android/java/src/org/chromium/chrome/browser/preferences/MainPreferences.java index 1e03030..7a38275b 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/MainPreferences.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/preferences/MainPreferences.java
@@ -18,6 +18,7 @@ import org.chromium.chrome.browser.ChromeFeatureList; import org.chromium.chrome.browser.net.spdyproxy.DataReductionProxySettings; import org.chromium.chrome.browser.night_mode.NightModeUtils; +import org.chromium.chrome.browser.offlinepages.prefetch.PrefetchConfiguration; import org.chromium.chrome.browser.partnercustomizations.HomepageManager; import org.chromium.chrome.browser.password_manager.ManagePasswordsReferrer; import org.chromium.chrome.browser.preferences.autofill_assistant.AutofillAssistantPreferences; @@ -140,14 +141,12 @@ // isn't triggered. return true; }); - } else { - // Since the Content Suggestions Notification feature has been removed, the - // Notifications Preferences page only contains a link to per-website notification - // settings, which can be access through Site Settings, so don't show the Notifications - // Preferences page. - - // TODO(crbug.com/944912): Have the Offline Pages Prefetch Notifier start using the pref - // that can be set on this page, then re-enable. + } else if (!PrefetchConfiguration.isPrefetchingFlagEnabled()) { + // The Notifications Preferences page currently contains the Content Suggestions + // Notifications setting (used only by the Offline Prefetch feature) and an entry to the + // per-website notification settings page. The latter can be accessed from Site + // Settings, so we only show the entry to the Notifications Preferences page if the + // Prefetching feature flag is enabled. getPreferenceScreen().removePreference(findPreference(PREF_NOTIFICATIONS)); }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/NotificationsPreferences.java b/chrome/android/java/src/org/chromium/chrome/browser/preferences/NotificationsPreferences.java index d237ce2..10b0721 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/NotificationsPreferences.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/preferences/NotificationsPreferences.java
@@ -8,15 +8,15 @@ import android.os.Bundle; import android.preference.Preference; import android.preference.PreferenceFragment; +import android.support.annotation.Nullable; import org.chromium.chrome.R; -import org.chromium.chrome.browser.ChromeFeatureList; import org.chromium.chrome.browser.ContentSettingsType; -import org.chromium.chrome.browser.ntp.snippets.SnippetsBridge; +import org.chromium.chrome.browser.offlinepages.prefetch.PrefetchConfiguration; +import org.chromium.chrome.browser.offlinepages.prefetch.PrefetchPrefs; import org.chromium.chrome.browser.preferences.website.ContentSettingsResources; import org.chromium.chrome.browser.preferences.website.SingleCategoryPreferences; import org.chromium.chrome.browser.preferences.website.SiteSettingsCategory; -import org.chromium.chrome.browser.profiles.Profile; /** * Settings fragment that allows the user to configure notifications. It contains general @@ -30,10 +30,10 @@ private Preference mFromWebsitesPref; - // The following fields are only set if Feed is disabled, and should be null checked before + // The following field is only set if Feed is disabled, and should be null checked before // being used. + @Nullable private ChromeSwitchPreference mSuggestionsPref; - private SnippetsBridge mSnippetsBridge; @Override public void onCreate(Bundle savedInstanceState) { @@ -44,20 +44,11 @@ PreferenceUtils.addPreferencesFromResource(this, R.xml.notifications_preferences); getActivity().setTitle(R.string.prefs_notifications); - if (!ChromeFeatureList.isEnabled(ChromeFeatureList.INTEREST_FEED_CONTENT_SUGGESTIONS)) { - mSnippetsBridge = new SnippetsBridge(Profile.getLastUsedProfile()); - - mSuggestionsPref = (ChromeSwitchPreference) findPreference(PREF_SUGGESTIONS); - mSuggestionsPref.setOnPreferenceChangeListener( - (Preference preference, Object newValue) -> { - PrefServiceBridge.getInstance().setBoolean( - Pref.CONTENT_SUGGESTIONS_NOTIFICATIONS_ENABLED, (boolean) newValue); - return true; - }); - } else { - // This preference is not applicable, does not currently affect Feed. - getPreferenceScreen().removePreference(findPreference(PREF_SUGGESTIONS)); - } + mSuggestionsPref = (ChromeSwitchPreference) findPreference(PREF_SUGGESTIONS); + mSuggestionsPref.setOnPreferenceChangeListener((Preference preference, Object newValue) -> { + PrefetchPrefs.setNotificationEnabled((boolean) newValue); + return true; + }); mFromWebsitesPref = findPreference(PREF_FROM_WEBSITES); mFromWebsitesPref.getExtras().putString(SingleCategoryPreferences.EXTRA_CATEGORY, @@ -70,27 +61,16 @@ update(); } - @Override - public void onDestroy() { - super.onDestroy(); - if (mSnippetsBridge != null) { - mSnippetsBridge.destroy(); - } - } - /** * Updates the state of displayed preferences. */ private void update() { if (mSuggestionsPref != null) { - mSuggestionsPref.setShouldDisableView(mSnippetsBridge == null); - boolean suggestionsEnabled = - mSnippetsBridge != null && mSnippetsBridge.areRemoteSuggestionsEnabled(); - mSuggestionsPref.setChecked(suggestionsEnabled - && PrefServiceBridge.getInstance().getBoolean( - Pref.CONTENT_SUGGESTIONS_NOTIFICATIONS_ENABLED)); - mSuggestionsPref.setEnabled(suggestionsEnabled); - mSuggestionsPref.setSummary(suggestionsEnabled + boolean prefetchingFeatureEnabled = PrefetchConfiguration.isPrefetchingFlagEnabled(); + boolean notificationsEnabled = PrefetchPrefs.getNotificationEnabled(); + mSuggestionsPref.setChecked(prefetchingFeatureEnabled && notificationsEnabled); + mSuggestionsPref.setEnabled(prefetchingFeatureEnabled); + mSuggestionsPref.setSummary(prefetchingFeatureEnabled ? R.string.notifications_content_suggestions_summary : R.string.notifications_content_suggestions_summary_disabled); }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/share/ShareHelper.java b/chrome/android/java/src/org/chromium/chrome/browser/share/ShareHelper.java index 3d36ea3..b280c64 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/share/ShareHelper.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/share/ShareHelper.java
@@ -595,7 +595,10 @@ @VisibleForTesting public static Intent getShareLinkIntent(ShareParams params) { final boolean isFileShare = (params.getFileUris() != null); - Intent intent = new Intent(isFileShare ? Intent.ACTION_SEND_MULTIPLE : Intent.ACTION_SEND); + final boolean isMultipleFileShare = isFileShare && (params.getFileUris().size() > 1); + final String action = + isMultipleFileShare ? Intent.ACTION_SEND_MULTIPLE : Intent.ACTION_SEND; + Intent intent = new Intent(action); intent.addFlags(ApiCompatibilityUtils.getActivityNewDocumentFlag()); intent.putExtra(EXTRA_TASK_ID, params.getActivity().getTaskId()); @@ -626,7 +629,11 @@ intent.setType(params.getFileContentType()); intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); - intent.putParcelableArrayListExtra(Intent.EXTRA_STREAM, params.getFileUris()); + if (isMultipleFileShare) { + intent.putParcelableArrayListExtra(Intent.EXTRA_STREAM, params.getFileUris()); + } else { + intent.putExtra(Intent.EXTRA_STREAM, params.getFileUris().get(0)); + } } else { intent.setType("text/plain"); }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/suggestions/tile/TileGroup.java b/chrome/android/java/src/org/chromium/chrome/browser/suggestions/tile/TileGroup.java index 4d0da06..869cfd3 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/suggestions/tile/TileGroup.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/suggestions/tile/TileGroup.java
@@ -16,12 +16,14 @@ import org.chromium.base.Callback; import org.chromium.base.VisibleForTesting; +import org.chromium.chrome.browser.explore_sites.ExploreSitesBridge; import org.chromium.chrome.browser.favicon.IconType; import org.chromium.chrome.browser.favicon.LargeIconBridge; import org.chromium.chrome.browser.native_page.ContextMenuManager; import org.chromium.chrome.browser.native_page.ContextMenuManager.ContextMenuItemId; import org.chromium.chrome.browser.offlinepages.OfflinePageBridge; import org.chromium.chrome.browser.offlinepages.OfflinePageItem; +import org.chromium.chrome.browser.profiles.Profile; import org.chromium.chrome.browser.suggestions.SiteSuggestion; import org.chromium.chrome.browser.suggestions.SuggestionsConfig; import org.chromium.chrome.browser.suggestions.SuggestionsMetrics; @@ -194,6 +196,7 @@ private String mPendingInsertionUrl; private boolean mHasReceivedData; + private boolean mExploreSitesLoaded; // TODO(dgn): Attempt to avoid cycling dependencies with TileRenderer. Is there a better way? private final TileSetupDelegate mTileSetupDelegate = new TileSetupDelegate() { @@ -249,6 +252,15 @@ if (suggestion.sectionType != TileSectionType.PERSONALIZED) continue; if (suggestion.url.equals(mPendingRemovalUrl)) removalCompleted = false; if (suggestion.url.equals(mPendingInsertionUrl)) insertionCompleted = true; + if (suggestion.source == TileSource.EXPLORE && !mExploreSitesLoaded) { + mExploreSitesLoaded = true; + ExploreSitesBridge.getEspCatalog(Profile.getLastUsedProfile(), (catalog) -> { + if (catalog == null || catalog.isEmpty()) { + ExploreSitesBridge.updateCatalogFromNetwork( + Profile.getLastUsedProfile(), true, (finished) -> {}); + } + }); + } } boolean expectedChangeCompleted = false;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tab/EmptyTabObserver.java b/chrome/android/java/src/org/chromium/chrome/browser/tab/EmptyTabObserver.java index f7aacfc..1e72da8 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/tab/EmptyTabObserver.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/tab/EmptyTabObserver.java
@@ -166,4 +166,7 @@ @Override public void onContentViewSystemUiVisibilityChanged(Tab tab, int visibility) {} + + @Override + public void onRootIdChanged(Tab tab, int newRootId) {} }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tab/Tab.java b/chrome/android/java/src/org/chromium/chrome/browser/tab/Tab.java index 4b4b862..26b8598a 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/tab/Tab.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/tab/Tab.java
@@ -643,7 +643,12 @@ * @param rootId New relationship id to be set. */ public void setRootId(int rootId) { + if (rootId == mRootId) return; mRootId = rootId; + mIsTabStateDirty = true; + for (TabObserver observer : mObservers) { + observer.onRootIdChanged(this, rootId); + } } /**
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tab/TabObserver.java b/chrome/android/java/src/org/chromium/chrome/browser/tab/TabObserver.java index 0bb49c1..e624f30 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/tab/TabObserver.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/tab/TabObserver.java
@@ -366,4 +366,10 @@ * @see View#setSystemUiVisibility(int) */ void onContentViewSystemUiVisibilityChanged(Tab tab, int visibility); + + /** + * Called when the root Id of tab is changed. + * @param newRootId New root ID to be set. + */ + void onRootIdChanged(Tab tab, int newRootId); }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabModelSelectorImpl.java b/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabModelSelectorImpl.java index c64e944f..d7f97be 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabModelSelectorImpl.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabModelSelectorImpl.java
@@ -203,6 +203,11 @@ public void onCloseContents(Tab tab) { closeTab(tab); } + + @Override + public void onRootIdChanged(Tab tab, int newRootId) { + mTabSaver.addTabToSaveQueue(tab); + } }; }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/IdentityDiscController.java b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/IdentityDiscController.java index 804bf369..9361f6c 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/IdentityDiscController.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/IdentityDiscController.java
@@ -10,12 +10,16 @@ import org.chromium.chrome.R; import org.chromium.chrome.browser.ChromeFeatureList; +import org.chromium.chrome.browser.feature_engagement.TrackerFactory; import org.chromium.chrome.browser.lifecycle.ActivityLifecycleDispatcher; import org.chromium.chrome.browser.lifecycle.NativeInitObserver; import org.chromium.chrome.browser.preferences.PreferencesLauncher; import org.chromium.chrome.browser.preferences.SyncAndServicesPreferences; +import org.chromium.chrome.browser.profiles.Profile; import org.chromium.chrome.browser.signin.ProfileDataCache; import org.chromium.chrome.browser.signin.SigninManager; +import org.chromium.components.feature_engagement.FeatureConstants; +import org.chromium.components.feature_engagement.Tracker; import org.chromium.components.signin.ChromeSigninController; import org.chromium.components.sync.AndroidSyncSettings; @@ -89,6 +93,7 @@ mIsIdentityDiscVisible = true; createProfileDataCache(accountName); showIdentityDisc(accountName); + maybeShowIPH(); } else { mIsIdentityDiscVisible = false; mToolbarManager.disableExperimentalButton(); @@ -175,4 +180,17 @@ mAndroidSyncSettings = null; } } + + /** + * Shows a help bubble below Identity Disc if the In-Product Help conditions are met. + */ + private void maybeShowIPH() { + Profile profile = Profile.getLastUsedProfile(); + Tracker tracker = TrackerFactory.getTrackerForProfile(profile); + if (!tracker.shouldTriggerHelpUI(FeatureConstants.IDENTITY_DISC_FEATURE)) return; + + mToolbarManager.showIPHOnExperimentalButton(R.string.iph_identity_disc_text, + R.string.iph_identity_disc_accessibility_text, + () -> { tracker.dismissed(FeatureConstants.IDENTITY_DISC_FEATURE); }); + } }
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 dd33c33..5e06215 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
@@ -1083,6 +1083,17 @@ } /** + * Displays in-product help for experimental button. + * @param stringId The id of the string resource for the text that should be shown. + * @param accessibilityStringId The id of the string resource of the accessibility text. + * @param dismissedCallback The callback that will be called when in-product help is dismissed. + */ + public void showIPHOnExperimentalButton(@StringRes int stringId, + @StringRes int accessibilityStringId, Runnable dismissedCallback) { + mToolbar.showIPHOnExperimentalButton(stringId, accessibilityStringId, dismissedCallback); + } + + /** * @return The bookmarks bridge. */ public BookmarkBridge getBookmarkBridge() {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/top/TabSwitcherModeTTPhone.java b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/top/TabSwitcherModeTTPhone.java index f10438ea..ee0a798 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/top/TabSwitcherModeTTPhone.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/top/TabSwitcherModeTTPhone.java
@@ -146,10 +146,18 @@ // TODO(twellington): Handle interrupted animations to avoid jumps to 1.0 or 0.f. setAlpha(inTabSwitcherMode ? 0.0f : 1.0f); + boolean showZoomingAnimation = FeatureUtilities.isGridTabSwitcherEnabled() + && ChromeFeatureList.isEnabled(ChromeFeatureList.TAB_TO_GTS_ANIMATION); + long duration = showZoomingAnimation + ? TopToolbarCoordinator.TAB_SWITCHER_MODE_GTS_ANIMATION_DURATION_MS + : TopToolbarCoordinator.TAB_SWITCHER_MODE_NORMAL_ANIMATION_DURATION_MS; + mVisiblityAnimator = ObjectAnimator.ofFloat(this, View.ALPHA, inTabSwitcherMode ? 1.0f : 0.0f); - mVisiblityAnimator.setDuration( - TopToolbarCoordinator.TAB_SWITCHER_MODE_NORMAL_ANIMATION_DURATION_MS); + mVisiblityAnimator.setDuration(duration); + if (showZoomingAnimation && inTabSwitcherMode) { + mVisiblityAnimator.setStartDelay(duration); + } mVisiblityAnimator.setInterpolator(new LinearInterpolator()); // TODO(https://crbug.com/914868): Use consistent logic here for setting clickable/enabled
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/top/ToolbarLayout.java b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/top/ToolbarLayout.java index 927eb18..47c94f9f 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/top/ToolbarLayout.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/top/ToolbarLayout.java
@@ -46,6 +46,8 @@ import org.chromium.chrome.browser.util.ColorUtils; import org.chromium.chrome.browser.util.ViewUtils; import org.chromium.chrome.browser.widget.ToolbarProgressBar; +import org.chromium.chrome.browser.widget.ViewHighlighter; +import org.chromium.chrome.browser.widget.textbubble.TextBubble; import org.chromium.components.security_state.ConnectionSecurityLevel; import org.chromium.ui.UiUtils; @@ -863,6 +865,33 @@ void disableExperimentalButton() {} /** + * @return Experimental button view. + */ + View getExperimentalButtonView() { + return null; + } + + /** + * Displays in-product help for experimental button. + * @param stringId The id of the string resource for the text that should be shown. + * @param accessibilityStringId The id of the string resource of the accessibility text. + * @param dismissedCallback The callback that will be called when in-product help is dismissed. + */ + void showIPHOnExperimentalButton(@StringRes int stringId, @StringRes int accessibilityStringId, + Runnable dismissedCallback) { + View experimentalButton = getExperimentalButtonView(); + TextBubble textBubble = new TextBubble(getContext(), experimentalButton, stringId, + accessibilityStringId, experimentalButton); + textBubble.setDismissOnTouchInteraction(true); + ViewHighlighter.turnOnHighlight(experimentalButton, true); + textBubble.addOnDismissListener(() -> { + ViewHighlighter.turnOffHighlight(experimentalButton); + dismissedCallback.run(); + }); + textBubble.show(); + } + + /** * Sets the menu button's background depending on whether or not we are highlighting and whether * or not we are using light or dark assets. */
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/top/ToolbarPhone.java b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/top/ToolbarPhone.java index dd5d06c..7e50fa7 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/top/ToolbarPhone.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/top/ToolbarPhone.java
@@ -2347,7 +2347,9 @@ // TODO(twellington): Move this shadow state information to ToolbarDataProvider and show // shadow when incognito NTP is scrolled. return mTabSwitcherState == STATIC_TAB && !hideShadowForIncognitoNtp() - && !hideShadowForInterstitial(); + && !hideShadowForInterstitial() + && (getToolbarDataProvider() != null + && !getToolbarDataProvider().isInOverviewAndShowingOmnibox()); } private boolean hideShadowForIncognitoNtp() { @@ -2549,6 +2551,11 @@ } } + @Override + View getExperimentalButtonView() { + return mExperimentalButton; + } + /** * Whether the menu button is visible. Used as a proxy for whether there are end toolbar * buttons besides the experimental button.
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/top/ToolbarTablet.java b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/top/ToolbarTablet.java index 6ac086a0..8d1e0bc 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/top/ToolbarTablet.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/top/ToolbarTablet.java
@@ -589,6 +589,11 @@ mExperimentalButton.setVisibility(View.GONE); } + @Override + View getExperimentalButtonView() { + return mExperimentalButton; + } + private void setToolbarButtonsVisible(boolean visible) { if (mToolbarButtonsVisible == visible) return;
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 c89062e..c68ada6 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
@@ -35,6 +35,7 @@ */ public class TopToolbarCoordinator implements Toolbar { static final int TAB_SWITCHER_MODE_NORMAL_ANIMATION_DURATION_MS = 200; + static final int TAB_SWITCHER_MODE_GTS_ANIMATION_DURATION_MS = 150; /** * Observes toolbar URL expansion percentage change. @@ -617,6 +618,18 @@ mToolbarLayout.disableExperimentalButton(); } + /** + * Displays in-product help for experimental button. + * @param stringId The id of the string resource for the text that should be shown. + * @param accessibilityStringId The id of the string resource of the accessibility text. + * @param dismissedCallback The callback that will be called when in-product help is dismissed. + */ + public void showIPHOnExperimentalButton(@StringRes int stringId, + @StringRes int accessibilityStringId, Runnable dismissedCallback) { + mToolbarLayout.showIPHOnExperimentalButton( + stringId, accessibilityStringId, dismissedCallback); + } + @Override public int getHeight() { return mToolbarLayout.getHeight();
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/util/FeatureUtilities.java b/chrome/android/java/src/org/chromium/chrome/browser/util/FeatureUtilities.java index 82e11e63..a1fd6ac 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/util/FeatureUtilities.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/util/FeatureUtilities.java
@@ -82,7 +82,6 @@ private static Boolean sShouldPrioritizeBootstrapTasks; private static Boolean sIsGridTabSwitcherEnabled; private static Boolean sIsTabGroupsAndroidEnabled; - private static Boolean sIsTabGroupUiImprovementsAndroidEnabled; private static Boolean sFeedEnabled; private static Boolean sServiceManagerForBackgroundPrefetch; private static Boolean sIsNetworkServiceEnabled; @@ -196,7 +195,6 @@ if (isHighEndPhone()) cacheGridTabSwitcherEnabled(); if (isHighEndPhone()) cacheTabGroupsAndroidEnabled(); - if (isHighEndPhone()) cacheTabGroupsAndroidUiImprovementsEnabled(); // Propagate REACHED_CODE_PROFILER feature value to LibraryLoader. This can't be done in // LibraryLoader itself because it lives in //base and can't depend on ChromeFeatureList. @@ -681,38 +679,28 @@ return sIsTabGroupsAndroidEnabled; } + /** + * Toggles whether the Tab Group is enabled for testing. Should be reset back to null after the + * test has finished. + */ + @VisibleForTesting + public static void setTabGroupsAndroidEnabledForTesting(@Nullable Boolean available) { + sIsTabGroupsAndroidEnabled = available; + } + private static boolean isHighEndPhone() { return !SysUtils.isLowEndDevice() && !DeviceFormFactor.isNonMultiDisplayContextOnTablet( ContextUtils.getApplicationContext()); } - private static void cacheTabGroupsAndroidUiImprovementsEnabled() { - ChromePreferenceManager.getInstance().writeBoolean( - ChromePreferenceManager.TAB_GROUPS_UI_IMPROVEMENTS_ANDROID_ENABLED_KEY, - !DeviceClassManager.enableAccessibilityLayout() - && (ChromeFeatureList.isEnabled( - ChromeFeatureList.DOWNLOAD_TAB_MANAGEMENT_MODULE) - || ChromeFeatureList.isEnabled( - ChromeFeatureList.TAB_GROUPS_UI_IMPROVEMENTS_ANDROID)) - && TabManagementModuleProvider.getDelegate() != null - && ChromeFeatureList.isEnabled( - ChromeFeatureList.TAB_GROUPS_UI_IMPROVEMENTS_ANDROID)); - } - /** * @return Whether the tab group ui improvement feature is enabled and available for use. */ public static boolean isTabGroupsAndroidUiImprovementsEnabled() { - if (!isTabGroupsAndroidEnabled()) return false; - - if (sIsTabGroupUiImprovementsAndroidEnabled == null) { - ChromePreferenceManager preferenceManager = ChromePreferenceManager.getInstance(); - - sIsTabGroupUiImprovementsAndroidEnabled = preferenceManager.readBoolean( - ChromePreferenceManager.TAB_GROUPS_UI_IMPROVEMENTS_ANDROID_ENABLED_KEY, false); - } - return sIsTabGroupUiImprovementsAndroidEnabled; + return isTabGroupsAndroidEnabled() + && ChromeFeatureList.isEnabled( + ChromeFeatureList.TAB_GROUPS_UI_IMPROVEMENTS_ANDROID); } /**
diff --git a/chrome/android/java/strings/android_chrome_strings.grd b/chrome/android/java/strings/android_chrome_strings.grd index 47be3b0f..f634190 100644 --- a/chrome/android/java/strings/android_chrome_strings.grd +++ b/chrome/android/java/strings/android_chrome_strings.grd
@@ -3837,6 +3837,12 @@ <message name="IDS_IPH_DATA_SAVER_DETAIL_ACCESSIBILITY_TEXT" desc="The in-product-help accessibility text to open lite mode."> See how much data you've saved from the More Options button </message> + <message name="IDS_IPH_IDENTITY_DISC_TEXT" desc="The in-product-help text prompting the user that tapping identity disc will navigate to 'Sync and Google services' settings page."> + Tap here to manage your accounts + </message> + <message name="IDS_IPH_IDENTITY_DISC_ACCESSIBILITY_TEXT" desc="The in-product-help accessibility text prompting the user that tapping identity disc will navigate to 'Sync and Google services' settings page."> + Tap the "Manage account" button to manage your accounts + </message> <message name="IDS_IPH_PREVIEWS_OMNIBOX_UI_TEXT" desc="The in-product-help text informing the user that the displayed page was modified to make it load faster or use less data. Prompts the user to tap the message and load the original, unaltered, page if they would like. The 'Lite page provided by Google.' sentence should match TC ID 373879247902731825"> Lite page provided by Google. Tap to load the original. </message>
diff --git a/chrome/android/java/strings/android_chrome_strings_grd/IDS_IPH_IDENTITY_DISC_TEXT.png.sha1 b/chrome/android/java/strings/android_chrome_strings_grd/IDS_IPH_IDENTITY_DISC_TEXT.png.sha1 new file mode 100644 index 0000000..d9fa000f --- /dev/null +++ b/chrome/android/java/strings/android_chrome_strings_grd/IDS_IPH_IDENTITY_DISC_TEXT.png.sha1
@@ -0,0 +1 @@ +5db7c6f71aae1791ac9cc92612ebe7267c6b72f1 \ No newline at end of file
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_am.xtb b/chrome/android/java/strings/translations/android_chrome_strings_am.xtb index d12acddc..5a56ffe 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_am.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_am.xtb
@@ -2,6 +2,7 @@ <!DOCTYPE translationbundle> <translationbundle lang="am"> <translation id="1006017844123154345">መስመር ላይ ክፈት</translation> +<translation id="1028699632127661925">ወደ <ph name="DEVICE_NAME" /> በመላክ ላይ...</translation> <translation id="1036727731225946849"><ph name="WEBAPK_NAME" />ን በማከል ላይ...</translation> <translation id="1041308826830691739">ከድር ጣቢያዎች</translation> <translation id="1049743911850919806">ማንነት የማያሳውቅ</translation> @@ -43,6 +44,7 @@ <translation id="1260236875608242557">ይፈልጉ እና ያስሱ</translation> <translation id="1264974993859112054">ሰፖርቶች</translation> <translation id="1272079795634619415">አቁም</translation> +<translation id="1272444412400969138">ትርን ለመጋራት የመሣሪያ መራጭ።</translation> <translation id="1283039547216852943">ለመዘርጋት መታ ያድርጉ</translation> <translation id="1285320974508926690">ይህን ጣቢያ በጭራሽ አትተርጉም</translation> <translation id="1291207594882862231">ታሪክ፣ ኩኪዎች፣ የጣቢያ ውሂብ፣ መሸጎጫን አጽዳ…</translation> @@ -59,6 +61,7 @@ <translation id="138361230106469022">ሰላም፣ <ph name="FULL_NAME" /></translation> <translation id="1383876407941801731">ፍለጋ </translation> <translation id="1384959399684842514">የሚወርደው ላፍታ ቆሟል</translation> +<translation id="1386674309198842382">ገባሪ ከ<ph name="LAST_UPDATED" /> ቀናት በፊት</translation> <translation id="1389974829397082527">እዚህ ምንም ዕልባቶች የሉም</translation> <translation id="1397811292916898096">በ<ph name="PRODUCT_NAME" /> ይፈልጉ</translation> <translation id="1404122904123200417">በ<ph name="WEBSITE_URL" /> ውስጥ ተካትቷል</translation> @@ -223,6 +226,7 @@ <translation id="2567385386134582609">ምስል</translation> <translation id="257088987046510401">ገፅታዎች </translation> <translation id="2570922361219980984">የአካባቢ መዳረሻ እንዲሁም ለዚህ መሣሪያ ጠፍቷል። በ<ph name="BEGIN_LINK" />Android ቅንብሮች<ph name="END_LINK" /> ውስጥ ያብሩት።</translation> +<translation id="257674075312929031">ቡድን</translation> <translation id="257931822824936280">ተዘርግቷል - ለመሰብሰብ ጠቅ ያድርጉ</translation> <translation id="2581165646603367611">ይሄ Chrome አስፈላጊ ናቸው ብሎ የማያስባቸውን ኩኪዎች፣ መሸጎጫ እና ሌሎች ጣቢያዎች ያጸዳል።</translation> <translation id="2586657967955657006">የቅንጥብ ሰሌዳ</translation> @@ -274,6 +278,7 @@ <translation id="2956410042958133412">ይህ መለያ የሚቀናበረው በ<ph name="PARENT_NAME_1" /> እና <ph name="PARENT_NAME_2" /> ነው።</translation> <translation id="2962095958535813455">ወደ ማንነት የማያሳውቁ ትሮች ተቀይሯል</translation> <translation id="2968755619301702150">የእውቅና ማረጋገጫ መመልከቻ</translation> +<translation id="2977480621796371840">ከቡድን አስወግድ</translation> <translation id="2979025552038692506">የተመረጠው ማንነት የማያሳውቅ ትር</translation> <translation id="2989523299700148168">በቅርብ ጊዜ የተጎበኙ</translation> <translation id="2996291259634659425">የይለፍ ሐረግ ይፍጠሩ</translation> @@ -400,6 +405,7 @@ <translation id="4008040567710660924">የተወሰነ ጣቢያ ኩኪዎችን ፍቀድ።</translation> <translation id="4034817413553209278">{HOURS,plural, =1{# ሰዓ}one{# ሰዓቶች}other{# ሰዓቶች}}</translation> <translation id="4042870126885713738">አንድ የድር አድራሻ መፍትሔ ካላመጣ ወይም ግንኙነት ሊፈጠር ካልቻለ ጥቆማዎችን አሳይ</translation> +<translation id="4044912625106523635">የመሣሪያ መራጭ ከትር ጋር ለማጋራት በሙሉ ቁመት ክፍት ነው።</translation> <translation id="4046123991198612571">ቀጣይ ትራክ</translation> <translation id="4048707525896921369">ገጹን ትተው ሳይሄዱ በድር ጣቢያዎች ላይ ስላሉ ርዕሶች ይወቁ። ለመፈለግ መታ ያድርጉ አንድ ቃል እና በዙሪያው ያለውን አውድ ወደ Google ፍለጋ ይልክና ትርጓሜዎችን፣ ስዕሎችን፣ የፍለጋ ውጤቶችን እና ሌሎች ዝርዝሮችን ይመልሳል። @@ -426,6 +432,12 @@ <translation id="4226663524361240545">ማሳወቂያዎች መሣሪያውን እንዲነዝር ሊያደርጉት ይችላሉ</translation> <translation id="423219824432660969">የተሳመረ ውሂብ <ph name="TIME" /> ላይ በነበረው የGoogle ይለፍ ቃል ያመስጥሩ</translation> <translation id="4242533952199664413">ቅንብሮችን ክፈት</translation> +<translation id="4247274662191902962">የዳሳሽ ውውሂብ የሚጋራው እርስዎ በዚህ የቪአር ተሞክሮ ላይ እያሉ ብቻ ነው። ጣቢያው እንደሚከተሉት ያሉ የተወሰነ መረጃ ተጠቅሞ እርስዎ ሊያውቅ ይችላል፦ + - የእርስዎ አካባቢ + - እንደ የአይን አቀማመጥ ያሉ የእርስዎ አካላዊ ባህሪያትት + - እንደ አረማመድዎ ያሉ የእርስዎ እንቅስቃሴዎች + + መዳረሻን ከመፍቀድዎ በፊት ይህን ጣቢያ የሚያምኑት መሆንዎን ያረጋግጡ።</translation> <translation id="424864128008805179">ከChrome ተዘግቶ ይወጣ?</translation> <translation id="4256782883801055595">የክፍት ምንጭ ፍቃዶች</translation> <translation id="4259722352634471385">ዳሰሳ ታግዷል፦ <ph name="URL" /></translation> @@ -571,6 +583,7 @@ <translation id="5271967389191913893">መሣሪያ የሚወርደውን ይዘት መክፈት አይችልም።</translation> <translation id="528192093759286357">ከሙሉ ማያ ገጽ ለመውጣት ከላይ ይጎትቱ እና የተመለስ አዝራሩን ይንኩ።</translation> <translation id="5284584623296338184">በእርስዎ ዕልባቶች፣ ታሪክ፣ የይለፍ ቃላት እና ሌሎች ቅንብሮች ላይ የተደረጉ ለውጦች ከአሁን በኋላ ከእርስዎ የGoogle መለያ ጋር አይሠምሩም። ሆኖም ግን ነባር ውሂብዎ በእርስዎ የGoogle መለያ ላይ እንደተከማቸ ይቆያል።</translation> +<translation id="5292796745632149097">ላክ ወደ</translation> <translation id="5300589172476337783">አሳይ</translation> <translation id="5301954838959518834">እሺ፣ ገባኝ</translation> <translation id="5304593522240415983">ይህ መስክ ባዶ ሊሆን አይችልም</translation> @@ -598,6 +611,7 @@ <translation id="545042621069398927">ውርድዎን በማፍጠን ላይ።</translation> <translation id="5456381639095306749">ገጽ አውርድ</translation> <translation id="5475862044948910901">የሚጨምር የእውነት ክፍለ ጊዜ ይጀመር?</translation> +<translation id="5481942164684849270"><ph name="APP_NAME" /> ወደ የእኔ መተግበሪያዎች ታክሏል</translation> <translation id="548278423535722844">በካርታዎች መተግበሪያ ውስጥ ይክፈቱ</translation> <translation id="5487521232677179737">ውሂብን አጽዳ</translation> <translation id="5494752089476963479">ረባሽ ወይም አሳሳች ማስታወቂያዎችን ከሚያሳዩ ጣቢያዎች የሚመጡ ማስታወቂያዎችን አግድ</translation> @@ -731,6 +745,7 @@ <translation id="6406506848690869874">አመሳስል</translation> <translation id="641643625718530986">አትም…</translation> <translation id="6416782512398055893"><ph name="MBS" /> ሜባ ወርዷል</translation> +<translation id="6418750371676080905">የመሣሪያ መረጭ ከትር ጋር ለማጋራት ተዘግቷል።</translation> <translation id="6427112570124116297">ድሩን ያስተርጉሙ</translation> <translation id="6433501201775827830">የእርስዎን የፍለጋ ፕሮግራም ይምረጡ</translation> <translation id="6437478888915024427">የገጽ መረጃ</translation> @@ -770,6 +785,7 @@ <translation id="666268767214822976">በአድራሻ አሞሌው ላይ እየተየቡ ሳለ ተዛማጅ መጠይቆችን ለማሳየት እና ታዋቂ ድር ጣቢያዎችን ለማሳየት የመገመቻ አገልግሎት ይጠቀሙ</translation> <translation id="666731172850799929">በ<ph name="APP_NAME" /> ውስጥ ክፈት</translation> <translation id="666981079809192359">የChrome ግላዊነት ማስታወቂያ</translation> +<translation id="6672986458216094438">የመሣሪያ መራጭ ከትር ጋር ለማጋራት በግማሽ ቁመት ክፍት ነው።</translation> <translation id="6697492270171225480">አንድ ገጽ ሊገኝ ካልቻለ የተመሳሳይ ገጾች የአስተያየት ጥቆማዎችን አሳይ</translation> <translation id="6697947395630195233">Chrome አካባቢዎን ለዚህ ጣቢያ ለማጋራት የአካባቢዎ መዳረሻ ይፈልጋል።</translation> <translation id="6698801883190606802">የተመሳሰለ ውሂብ ያስተዳድሩ</translation> @@ -947,6 +963,7 @@ <translation id="7942131818088350342"><ph name="PRODUCT_NAME" /> ጊዜው ያለፈበት ነው።</translation> <translation id="7947953824732555851">ተቀበል እና ግባ</translation> <translation id="7963646190083259054">አቅራቢ፦</translation> +<translation id="7971136598759319605">1 ቀን በፊት ንቁ ነበር</translation> <translation id="7975379999046275268">ገጽ <ph name="BEGIN_NEW" />አዲስ<ph name="END_NEW" /> ቅድሚያ ይመልከቱ</translation> <translation id="7981313251711023384">ይበልጥ ፈጣን ለሆነ አሰሳ እና ፍለጋ ገጾችን ቅድሚያ ይጫኑ</translation> <translation id="79859296434321399">የትክክለኛ እውነታ ይዘትን ለማየት ARCore ይጫኑ</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_ar.xtb b/chrome/android/java/strings/translations/android_chrome_strings_ar.xtb index 6a034038..154fec7 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_ar.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_ar.xtb
@@ -20,6 +20,7 @@ <translation id="1145536944570833626">يمكنك حذف البيانات الحالية.</translation> <translation id="1146678959555564648">إدخال VR</translation> <translation id="116280672541001035">المستخدَمة</translation> +<translation id="1171770572613082465">عرض مواقع الويب الشائعة من خلال النقر على الزر "أهم المواقع"</translation> <translation id="1172593791219290334">صفحة بدء التشغيل</translation> <translation id="1173894706177603556">إعادة تسمية</translation> <translation id="1175310183703641346">لن تتم مزامنة الإشارات المرجعية والسجلّ وكلمات المرور والإعدادات الأخرى مع حسابك على Google بعد الآن.</translation> @@ -222,6 +223,7 @@ <translation id="2567385386134582609">صورة</translation> <translation id="257088987046510401">المظاهر</translation> <translation id="2570922361219980984">الوصول إلى الموقع الجغرافي متوقف لهذا الجهاز أيضًا. يمكنك تفعليه في <ph name="BEGIN_LINK" />إعدادات Android<ph name="END_LINK" />.</translation> +<translation id="257674075312929031">مجموعة</translation> <translation id="257931822824936280">تم التوسيع - انقر للتصغير.</translation> <translation id="2581165646603367611">سيؤدي هذا إلى مسح ملفات تعريف الارتباط وذاكرة التخزين المؤقت والبيانات الأخرى للمواقع التي لا يعتقد Chrome أنها مهمة.</translation> <translation id="2586657967955657006">الحافظة</translation> @@ -256,6 +258,7 @@ <translation id="2836148919159985482">المس زر الرجوع للخروج من وضع ملء الشاشة.</translation> <translation id="2842985007712546952">المجلد الرئيسي</translation> <translation id="2845873210977809562">تم إغلاق علامات التبويب المفتوحة</translation> +<translation id="2858138569776157458">أهم المواقع</translation> <translation id="2870560284913253234">الموقع</translation> <translation id="2874939134665556319">المقطع الصوتي السابق</translation> <translation id="2876369937070532032">يتم إرسال عناوين URL لبعض الصفحات التي تزورها إلى Google، عندما يكون أمانك في خطر</translation> @@ -272,6 +275,7 @@ <translation id="2956410042958133412">تتم إدارة هذا الحساب بواسطة <ph name="PARENT_NAME_1" /> و <ph name="PARENT_NAME_2" />.</translation> <translation id="2962095958535813455">تم التبديل إلى علامات تبويب التصفح المتخفي</translation> <translation id="2968755619301702150">عارض الشهادات</translation> +<translation id="2977480621796371840">الإزالة من مجموعة</translation> <translation id="2979025552038692506">علامة تبويب محددة للتصفح المتخفي</translation> <translation id="2989523299700148168">تم الانتقال إليها مؤخرًا</translation> <translation id="2996291259634659425">إنشاء عبارة المرور</translation> @@ -424,6 +428,12 @@ <translation id="4226663524361240545">يمكن أن تؤدي الإشعارات إلى اهتزاز الجهاز</translation> <translation id="423219824432660969">تشفير البيانات المتزامنة باستخدام كلمة مرور Google اعتبارًا من <ph name="TIME" /></translation> <translation id="4242533952199664413">فتح الإعدادات</translation> +<translation id="4247274662191902962">لن تتم مشاركة بيانات جهاز الاستشعار إلا أثناء تجربة الواقع الافتراضي هذه. قد يتمكّن الموقع من التعرُّف عليك باستخدام معلومات معينة، مثل: + - موقعك الجغرافي + - سماتك البدنية، مثل موضع العين + - وحركاتك، مثل طريقة المشي + + يُرجى التأكُّد من أنك تثق بهذا الموقع قبل منحه الإذن بالوصول.</translation> <translation id="424864128008805179">هل تريد تسجيل الخروج من Chrome؟</translation> <translation id="4256782883801055595">تراخيص البرامج المفتوحة المصدر</translation> <translation id="4259722352634471385">التنقل محظور: <ph name="URL" /></translation> @@ -596,6 +606,7 @@ <translation id="545042621069398927">جارٍ تسريع التنزيل.</translation> <translation id="5456381639095306749">تنزيل الصفحة</translation> <translation id="5475862044948910901">هل تريد بدء جلسة الواقع المعزّز؟</translation> +<translation id="5481942164684849270">تمت إضافة <ph name="APP_NAME" /> إلى تطبيقاتي</translation> <translation id="548278423535722844">فتح في تطبيق الخرائط</translation> <translation id="5487521232677179737">محو البيانات</translation> <translation id="5494752089476963479">حظر الإعلانات في المواقع الإلكترونية التي تعرض إعلانات مضلِّلة أو غير مرغوب فيها</translation> @@ -965,6 +976,7 @@ <translation id="8058746566562539958">فتح بعلامة تبويب Chrome جديدة</translation> <translation id="8063895661287329888">تعذّرت إضافة الإشارة المرجعية.</translation> <translation id="806745655614357130">الحفاظ على البيانات التابعة لي منفصلة</translation> +<translation id="8067883171444229417">تشغيل الفيديو</translation> <translation id="8068648041423924542">يتعذر تحديد الشهادة.</translation> <translation id="8073388330009372546">فتح الصورة بعلامة تبويب جديدة</translation> <translation id="8076492880354921740">علامات التبويب</translation> @@ -1001,6 +1013,7 @@ <translation id="8327155640814342956">للحصول على أفضل تجربة للتصفّح، يُرجى الفتح لتحديث Chrome.</translation> <translation id="8339163506404995330">لن تتم ترجمة الصفحات باللغة <ph name="LANGUAGE" /></translation> <translation id="8349013245300336738">الترتيب حسب مقدار البيانات المُستخدَمة</translation> +<translation id="8364299278605033898">عرض مواقع الويب الشائعة</translation> <translation id="8372893542064058268">السماح لموقع ويب معيّن بتشغيل "المزامنة في الخلفية"</translation> <translation id="8374821112118309944">يلزمك تحديث TalkBack إلى إصدار جديد.</translation> <translation id="8378714024927312812">بإدارة مؤسستك</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_bg.xtb b/chrome/android/java/strings/translations/android_chrome_strings_bg.xtb index 050524a..ef19aef 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_bg.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_bg.xtb
@@ -2,6 +2,7 @@ <!DOCTYPE translationbundle> <translationbundle lang="bg"> <translation id="1006017844123154345">Отваряне онлайн</translation> +<translation id="1028699632127661925">Изпраща се до <ph name="DEVICE_NAME" />...</translation> <translation id="1036727731225946849"><ph name="WEBAPK_NAME" /> се добавя...</translation> <translation id="1041308826830691739">От уебсайтове</translation> <translation id="1049743911850919806">„Инкогнито“</translation> @@ -43,6 +44,7 @@ <translation id="1260236875608242557">Търсене и разглеждане</translation> <translation id="1264974993859112054">Спорт</translation> <translation id="1272079795634619415">Стоп</translation> +<translation id="1272444412400969138">Инструмент за избор на устройство, с което да се сподели даден раздел.</translation> <translation id="1283039547216852943">Докоснете за разгъване</translation> <translation id="1285320974508926690">Този сайт да не се превежда никога</translation> <translation id="1291207594882862231">Изчистване на историята, „бисквитките“, данните за сайтове и кеша…</translation> @@ -59,6 +61,7 @@ <translation id="138361230106469022">Здравейте, <ph name="FULL_NAME" /></translation> <translation id="1383876407941801731">Търсене</translation> <translation id="1384959399684842514">Изтеглянето е на пауза</translation> +<translation id="1386674309198842382">Активно преди <ph name="LAST_UPDATED" /> дни</translation> <translation id="1389974829397082527">Тук няма отметки</translation> <translation id="1397811292916898096">Търсене чрез <ph name="PRODUCT_NAME" /></translation> <translation id="1404122904123200417">Вградено в(ъв) <ph name="WEBSITE_URL" /></translation> @@ -223,6 +226,7 @@ <translation id="2567385386134582609">ИЗОБРАЖЕНИЕ</translation> <translation id="257088987046510401">Теми</translation> <translation id="2570922361219980984">Достъпът до местоположението е изключен и за това устройство. Включете го от <ph name="BEGIN_LINK" />настройките на Android<ph name="END_LINK" />.</translation> +<translation id="257674075312929031">Група</translation> <translation id="257931822824936280">Разгънато – кликнете за свиване.</translation> <translation id="2581165646603367611">Така ще се изчистят „бисквитките“, кешът и другата информация от сайтове, която не е важна за Chrome.</translation> <translation id="2586657967955657006">Буферна памет</translation> @@ -274,6 +278,7 @@ <translation id="2956410042958133412">Този профил се управлява от <ph name="PARENT_NAME_1" /> и <ph name="PARENT_NAME_2" />.</translation> <translation id="2962095958535813455">Превключихте към разделите в режим „инкогнито“</translation> <translation id="2968755619301702150">Визуализатор на сертификатите</translation> +<translation id="2977480621796371840">Премахване от групата</translation> <translation id="2979025552038692506">Избран раздел в режим „инкогнито“</translation> <translation id="2989523299700148168">Наскоро посетени</translation> <translation id="2996291259634659425">Създаване на пропуск</translation> @@ -400,6 +405,7 @@ <translation id="4008040567710660924">Разрешаване на „бисквитките“ за конкретен сайт.</translation> <translation id="4034817413553209278">{HOURS,plural, =1{# ч}other{# ч}}</translation> <translation id="4042870126885713738">Показване на предложения, когато даден уеб адрес не може да бъде преобразуван или не може да бъде осъществена връзка</translation> +<translation id="4044912625106523635">Инструментът за избор на устройство, с което да се сподели даден раздел, е отворен на цялата височина.</translation> <translation id="4046123991198612571">Следващ запис</translation> <translation id="4048707525896921369">Научавайте за темите в уебсайтовете, без да напускате страницата. Функцията за търсене с докосване изпраща до Google Търсене определени думи и заобикалящия ги текст и така извежда определения, снимки, резултати и други подробности. @@ -426,6 +432,12 @@ <translation id="4226663524361240545">Възможно е устройството да вибрира при известия</translation> <translation id="423219824432660969">Шифроване на синхронизираните данни с паролата за Google от <ph name="TIME" /></translation> <translation id="4242533952199664413">Отваряне на настройките</translation> +<translation id="4247274662191902962">Данните от сензорите ще се споделят само по време на това VR изживяване. Възможно е сайтът да научи някои неща за вас с помощта на определена информация, като например: +– местоположението ви; +– физически черти, като позиция на очите; +– движения, например походката ви. + +Разрешете достъп на този сайт само ако му имате доверие.</translation> <translation id="424864128008805179">Искате ли да излезете от Chrome?</translation> <translation id="4256782883801055595">Лицензи за отворен код</translation> <translation id="4259722352634471385">Навигирането е блокирано: <ph name="URL" /></translation> @@ -571,6 +583,7 @@ <translation id="5271967389191913893">Устройството не може да отвори съдържанието за изтегляне.</translation> <translation id="528192093759286357">Плъзнете пръст от горната част на екрана и докоснете бутона за връщане назад, за да излезете от режима на цял екран.</translation> <translation id="5284584623296338184">Промените в отметките, историята, паролите и другите ви настройки вече няма да се синхронизират с профила ви в Google. Съществуващите ви данни обаче ще продължат да се съхраняват в него.</translation> +<translation id="5292796745632149097">Изпращане до</translation> <translation id="5300589172476337783">Показване</translation> <translation id="5301954838959518834">Добре, разбрах</translation> <translation id="5304593522240415983">Това поле трябва да се попълни</translation> @@ -598,6 +611,7 @@ <translation id="545042621069398927">Изтеглянето се ускорява.</translation> <translation id="5456381639095306749">Изтегляне на страницата</translation> <translation id="5475862044948910901">Искате ли да стартирате сесия с обогатена реалност?</translation> +<translation id="5481942164684849270"><ph name="APP_NAME" /> се добави към моите приложения.</translation> <translation id="548278423535722844">Отваряне в приложение за карти</translation> <translation id="5487521232677179737">Изчиств. на данните</translation> <translation id="5494752089476963479">Блокиране на рекламите от сайтове, на които се показват натрапчиви или подвеждащи реклами</translation> @@ -731,6 +745,7 @@ <translation id="6406506848690869874">Синхронизиранe</translation> <translation id="641643625718530986">Печат…</translation> <translation id="6416782512398055893">Изтеглено: <ph name="MBS" /> МБ</translation> +<translation id="6418750371676080905">Инструментът за избор на устройство, с което да се сподели даден раздел, е затворен.</translation> <translation id="6427112570124116297">Превод на всичко в мрежата</translation> <translation id="6433501201775827830">Изберете машина за търсене</translation> <translation id="6437478888915024427">Информация за страницата</translation> @@ -770,6 +785,7 @@ <translation id="666268767214822976">Използване на услуга за предвиждания за показване на сродни заявки и популярни уебсайтове, докато пишете в адресната лента</translation> <translation id="666731172850799929">Отваряне в <ph name="APP_NAME" /></translation> <translation id="666981079809192359">Съобщение за поверителност на Chrome</translation> +<translation id="6672986458216094438">Инструментът за избор на устройство, с което да се сподели даден раздел, е отворен на половината височина.</translation> <translation id="6697492270171225480">Показване на предложения за подобни страници, когато дадена страница не може да бъде намерена</translation> <translation id="6697947395630195233">Chrome се нуждае от достъп до данните за местоположението ви, за да ги сподели с този сайт.</translation> <translation id="6698801883190606802">Управление на синхронизираните данни</translation> @@ -947,6 +963,7 @@ <translation id="7942131818088350342"><ph name="PRODUCT_NAME" /> не е актуален.</translation> <translation id="7947953824732555851">Приемам и влизам</translation> <translation id="7963646190083259054">Доставчик:</translation> +<translation id="7971136598759319605">Активно преди 1 ден</translation> <translation id="7975379999046275268">Визуализация <ph name="BEGIN_NEW" />Ново<ph name="END_NEW" /></translation> <translation id="7981313251711023384">Предварително зареждане на страниците с цел по-бързо сърфиране и търсене</translation> <translation id="79859296434321399">За да гледате съдържание с обогатена реалност, инсталирайте ARCore</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_bn.xtb b/chrome/android/java/strings/translations/android_chrome_strings_bn.xtb index 0aebb1b..2afecd4 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_bn.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_bn.xtb
@@ -2,6 +2,7 @@ <!DOCTYPE translationbundle> <translationbundle lang="bn"> <translation id="1006017844123154345">অনলাইনে খুলুন</translation> +<translation id="1028699632127661925"><ph name="DEVICE_NAME" />-এ পাঠানো হচ্ছে...</translation> <translation id="1036727731225946849"><ph name="WEBAPK_NAME" /> যোগ করা হচ্ছে...</translation> <translation id="1041308826830691739">ওয়েবসাইট থেকে</translation> <translation id="1049743911850919806">ছদ্মবেশী</translation> @@ -43,6 +44,7 @@ <translation id="1260236875608242557">সার্চ করুন, ঘুরে দেখুন</translation> <translation id="1264974993859112054">খেলাধূলা</translation> <translation id="1272079795634619415">বন্ধ</translation> +<translation id="1272444412400969138">ট্যাব শেয়ার করার জন্য ডিভাইস পিকার।</translation> <translation id="1283039547216852943">প্রসারিত করতে আলতো চাপুন</translation> <translation id="1285320974508926690">কখনই এই সাইটটিকে অনুবাদ করবেন না</translation> <translation id="1291207594882862231">ইতিহাস, কুকিজ, সাইট ডেটা, ক্যাশে সাফ করে...</translation> @@ -59,6 +61,7 @@ <translation id="138361230106469022">হাই, <ph name="FULL_NAME" /></translation> <translation id="1383876407941801731">সার্চ করুন</translation> <translation id="1384959399684842514">ডাউনলোড পজ করা আছে</translation> +<translation id="1386674309198842382"><ph name="LAST_UPDATED" /> দিন আগে ব্যবহার করা হয়েছে</translation> <translation id="1389974829397082527">এখানে কোনো বুকমার্ক নেই</translation> <translation id="1397811292916898096"><ph name="PRODUCT_NAME" /> এর সাহায্যে খুঁজুন</translation> <translation id="1404122904123200417">এর মধ্যে এম্বেড করা হয়েছে <ph name="WEBSITE_URL" /></translation> @@ -223,6 +226,7 @@ <translation id="2567385386134582609">ইমেজ</translation> <translation id="257088987046510401">থিমসমূহ</translation> <translation id="2570922361219980984">এই ডিভাইসেও লোকেশন অ্যাক্সেস বন্ধ আছে। চালু করতে <ph name="BEGIN_LINK" />Android সেটিংসে<ph name="END_LINK" /> যান।</translation> +<translation id="257674075312929031">গ্রুপ</translation> <translation id="257931822824936280">প্রসারিত - সঙ্কুচিত করতে ক্লিক করুন৷</translation> <translation id="2581165646603367611">এটা কুকিজ, ক্যাশে, এবং সাইটের সেই সব ডেটা যা Chrome গুরুত্বপূর্ণ মনে করে না সেগুলিকে সাফ করবে।</translation> <translation id="2586657967955657006">ক্লিপবোর্ড</translation> @@ -274,6 +278,7 @@ <translation id="2956410042958133412">এই অ্যাকাউন্টটি <ph name="PARENT_NAME_1" /> এবং <ph name="PARENT_NAME_2" /> দ্বারা পরিচালিত হয়৷</translation> <translation id="2962095958535813455">ছদ্মবেশী ট্যাবে পাল্টানো হয়েছে</translation> <translation id="2968755619301702150">সার্টিফিকেট প্রদর্শনকারী</translation> +<translation id="2977480621796371840">গ্রুপ থেকে সরান</translation> <translation id="2979025552038692506">নির্বাচিত ছদ্মবেশী ট্যাবগুলি</translation> <translation id="2989523299700148168">সাম্প্রতিক দেখা হয়েছে</translation> <translation id="2996291259634659425">পাসফ্রেজ তৈরি করুন</translation> @@ -402,6 +407,7 @@ <translation id="4008040567710660924">কোনও নির্দিষ্ট সাইটের জন্য কুকিকে অনুমতি দিন।</translation> <translation id="4034817413553209278">{HOURS,plural, =1{# ঘণ্টা}one{# ঘণ্টা}other{# ঘণ্টা}}</translation> <translation id="4042870126885713738">যখন কোনো ওয়েব ঠিকানা সমাধান করা না গেলে অথবা কোনো সংযোগ স্থাপন করা না গেলে সেক্ষেত্রে প্রস্তাবগুলি দেখান</translation> +<translation id="4044912625106523635">ট্যাব শেয়ার করতে ডিভাইস পিকার সম্পূর্ণ স্ক্রিন জুড়ে খুলেছে।</translation> <translation id="4046123991198612571">পরবর্তী ট্র্যাক</translation> <translation id="4048707525896921369">পৃষ্ঠাতে থাকাকালীন ওয়েবসাইটে গিয়ে বিষয়গুলি সম্পর্কে জানুন। 'সার্চ করতে ট্যাপ করা' বৈশিষ্ট্যটি একটি শব্দ এবং এটির সাথে সম্পর্কযুক্ত প্রসঙ্গ Google সার্চে পাঠায়, তার সাথে সংজ্ঞা, ছবি, সার্চ ফলাফল এবং আরও অনেক কিছু দেখায়৷ @@ -428,6 +434,12 @@ <translation id="4226663524361240545">বিজ্ঞপ্তি আসলে ডিভাইস ভাইব্রেট হতে পারে</translation> <translation id="423219824432660969">Google পাসওয়ার্ড দিয়ে <ph name="TIME" />-এ সিঙ্ক করা ডেটা এনক্রিপ্ট করুন</translation> <translation id="4242533952199664413">সেটিংস খুলুন</translation> +<translation id="4247274662191902962">এই ভিআর প্রেজেন্টেশন চলাকালীনই শুধু সেন্সর ডেটা শেয়ার করা হবে। সাইটটি আপনার সম্পর্কে কিছু তথ্য জানতে পারে, যেমন: + - আপনার লোকেশন + - আপনার শারীরিক বৈশিষ্ট্য, যেমন চোখের অবস্থান + - আপনার গতিবিধি, যেমন আপনি কেমন করে হাঁটেন + + অ্যাক্সেসের অনুমতি দেওয়ার আগে সাইটটি বিশ্বস্ত কিনা দেখে নিতে ভুলবেন না।</translation> <translation id="424864128008805179">Chrome থেকে সাইন-আউট করবেন?</translation> <translation id="4256782883801055595">ওপেন সোর্স লাইসেন্স</translation> <translation id="4259722352634471385">নেভিগেশন অবরুদ্ধ করা হয়েছে: <ph name="URL" /></translation> @@ -573,6 +585,7 @@ <translation id="5271967389191913893">ডাউনলোড করা কন্টেন্ট ডিভাইস খুলতে পারবে না৷</translation> <translation id="528192093759286357">উপর থেকে টেনে আনুন এবং পূর্ণ স্ক্রিন থেকে বেরিয়ে যেতে পিছনে ফেরার বোতাম স্পর্শ করুন।</translation> <translation id="5284584623296338184">আপনার বুকমার্ক, ইতিহাস, পাসওয়ার্ড এবং অন্যান্য সেটিংসে করা পরিবর্তন আর আপনার Google অ্যাকাউন্টের সাথে সিঙ্ক করা হবে না। অবশ্য, আপনার বর্তমান ডেটা আপনার Google অ্যাকাউন্টে সঞ্চিত থাকবে।</translation> +<translation id="5292796745632149097">এতে পাঠান:</translation> <translation id="5300589172476337783">দেখান</translation> <translation id="5301954838959518834">ঠিক আছে, বুঝেছি</translation> <translation id="5304593522240415983">এই ক্ষেত্রটি খালি রাখা যাবে না</translation> @@ -600,6 +613,7 @@ <translation id="545042621069398927">আপনার ডাউনলোডের স্পিড বাড়ানো হচ্ছে।</translation> <translation id="5456381639095306749">পৃষ্ঠা ডাউনলোড করুন</translation> <translation id="5475862044948910901">অগমেন্টেড রিয়েলিটি সেশন শুরু করতে চান?</translation> +<translation id="5481942164684849270">আমার অ্যাপে <ph name="APP_NAME" /> যোগ করা হয়েছে</translation> <translation id="548278423535722844">ম্যাপ অ্যাপ্লিকেশানে খুলুন</translation> <translation id="5487521232677179737">ডেটা সাফ করুন</translation> <translation id="5494752089476963479">সাইটে থাকা ব্যাঘাত সৃষ্টিকারী বা বিভ্রান্তিকর বিজ্ঞাপন ব্লক করুন</translation> @@ -733,6 +747,7 @@ <translation id="6406506848690869874">সিঙ্ক</translation> <translation id="641643625718530986">প্রিন্ট...</translation> <translation id="6416782512398055893"><ph name="MBS" /> MB ডাউনলোড হয়েছে</translation> +<translation id="6418750371676080905">ট্যাব শেয়ার করার ডিভাইস পিকার বন্ধ আছে।</translation> <translation id="6427112570124116297">ওয়েবের কন্টেন্ট অনুবাদ করুন</translation> <translation id="6433501201775827830">আপনার সার্চ ইঞ্জিন বেছে নিন</translation> <translation id="6437478888915024427">পৃষ্ঠার তথ্য</translation> @@ -772,6 +787,7 @@ <translation id="666268767214822976">সম্পর্কিত কোয়েরি এবং অ্যাড্রেস বারের মধ্যে আপনার টাইপ করা জনপ্রিয় ওয়েবসাইটগুলি দেখাতে একটি পূর্বাভাস পরিষেবা ব্যবহার করুন</translation> <translation id="666731172850799929"><ph name="APP_NAME" /> এ খুলুন</translation> <translation id="666981079809192359">Chrome এর গোপনীয়তা বিজ্ঞপ্তি</translation> +<translation id="6672986458216094438">ট্যাব শেয়ার করার ডিভাইস পিকার অর্ধেক স্ক্রিন জুড়ে খুলেছে।</translation> <translation id="6697492270171225480">কোনও একটি পৃষ্ঠা খুঁজে পাওয়া না গেলে একইরকম আরও পৃষ্ঠার সাজেশন দেখুন</translation> <translation id="6697947395630195233">এই সাইটটির সাথে আপনার লোকেশন শেয়ার করার জন্য Chrome কে আপনার লোকেশনের তথ্যে অ্যাক্সেস দিতে হবে।</translation> <translation id="6698801883190606802">সিঙ্ক হওয়া ডেটা পরিচালনা করুন</translation> @@ -949,6 +965,7 @@ <translation id="7942131818088350342"><ph name="PRODUCT_NAME" /> পুরনো হয়ে গেছে।</translation> <translation id="7947953824732555851">সম্মত হয়ে সাইন-ইন করুন</translation> <translation id="7963646190083259054">বিক্রেতা:</translation> +<translation id="7971136598759319605">১ দিন আগে ব্যবহার করা হয়েছে</translation> <translation id="7975379999046275268"><ph name="BEGIN_NEW" />নতুন<ph name="END_NEW" /> পৃষ্ঠার প্রিভিউ দেখুন</translation> <translation id="7981313251711023384">আরও দ্রুত ব্রাউজ করা এবং খোঁজার জন্য পৃষ্ঠা আগে লোড করুন</translation> <translation id="79859296434321399">অগমেন্টেড রিয়েলিটি কন্টেন্ট দেখার জন্য ARCore ইনস্টল করুন</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_ca.xtb b/chrome/android/java/strings/translations/android_chrome_strings_ca.xtb index dc3ce21..4fe149a 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_ca.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_ca.xtb
@@ -2,6 +2,7 @@ <!DOCTYPE translationbundle> <translationbundle lang="ca"> <translation id="1006017844123154345">Obre en línia</translation> +<translation id="1028699632127661925">S'està enviant a <ph name="DEVICE_NAME" />...</translation> <translation id="1036727731225946849">S'està afegint <ph name="WEBAPK_NAME" />...</translation> <translation id="1041308826830691739">De llocs web</translation> <translation id="1049743911850919806">Incògnit</translation> @@ -43,6 +44,7 @@ <translation id="1260236875608242557">Fes cerques i explora contingut</translation> <translation id="1264974993859112054">Esports</translation> <translation id="1272079795634619415">Atura</translation> +<translation id="1272444412400969138">Selector de dispositius amb què es compartirà una pestanya.</translation> <translation id="1283039547216852943">Toca per desplegar</translation> <translation id="1285320974508926690">No tradueixis mai aquest lloc</translation> <translation id="1291207594882862231">Esborra l'historial, les galetes, les dades dels llocs web, la memòria cau, etc.</translation> @@ -59,6 +61,7 @@ <translation id="138361230106469022">Hola, <ph name="FULL_NAME" /></translation> <translation id="1383876407941801731">Cerca</translation> <translation id="1384959399684842514">La baixada s'ha posat en pausa</translation> +<translation id="1386674309198842382">Actiu fa <ph name="LAST_UPDATED" /> dies</translation> <translation id="1389974829397082527">No hi ha cap adreça d'interès aquí</translation> <translation id="1397811292916898096">Cerca amb <ph name="PRODUCT_NAME" /></translation> <translation id="1404122904123200417">Inserit a <ph name="WEBSITE_URL" /></translation> @@ -223,6 +226,7 @@ <translation id="2567385386134582609">IMATGE</translation> <translation id="257088987046510401">Temes</translation> <translation id="2570922361219980984">L'accés a la ubicació també està desactivat en aquest dispositiu. Activa'l a la <ph name="BEGIN_LINK" />configuració d'Android<ph name="END_LINK" />.</translation> +<translation id="257674075312929031">Grup</translation> <translation id="257931822824936280">Vista desplegada (feu clic per replegar-la)</translation> <translation id="2581165646603367611">Amb aquesta acció, se suprimiran les galetes, la memòria cau i altres dades de llocs que Chrome no consideri importants.</translation> <translation id="2586657967955657006">Porta-retalls</translation> @@ -274,6 +278,7 @@ <translation id="2956410042958133412"><ph name="PARENT_NAME_1" /> i <ph name="PARENT_NAME_2" /> gestionen aquest compte.</translation> <translation id="2962095958535813455">S'ha canviat a les pestanyes d'incògnit</translation> <translation id="2968755619301702150">Lector de certificats</translation> +<translation id="2977480621796371840">Suprimeix del grup</translation> <translation id="2979025552038692506">Pestanya d'incògnit seleccionada</translation> <translation id="2989523299700148168">Visitats últimament</translation> <translation id="2996291259634659425">Creeu una frase de contrasenya</translation> @@ -400,6 +405,7 @@ <translation id="4008040567710660924">Permet les galetes d'un lloc web concret.</translation> <translation id="4034817413553209278">{HOURS,plural, =1{# h}other{# h}}</translation> <translation id="4042870126885713738">Mostra suggeriments quan no es resol una adreça web o quan no es pot establir una connexió</translation> +<translation id="4044912625106523635">El selector de dispositius amb què es compartirà una pestanya ocupa tota la pantalla.</translation> <translation id="4046123991198612571">Pista següent</translation> <translation id="4048707525896921369">Obtén informació sobre temes dels llocs web sense sortir de la pàgina. La funció Toca per cercar envia una paraula i el context que l'envolta a la Cerca de Google i torna definicions, imatges, resultats de la cerca i altres detalls. @@ -426,6 +432,12 @@ <translation id="4226663524361240545">És possible que les notificacions facin vibrar el dispositiu</translation> <translation id="423219824432660969">Encripta les dades sincronitzades amb la contrasenya de Google del dia <ph name="TIME" /></translation> <translation id="4242533952199664413">Obre la configuració</translation> +<translation id="4247274662191902962">Les dades del sensor només es podran compartir mentre duri l'experiència de RV. Pot ser que el lloc web aprengui coses sobre tu a partir de certa informació, per exemple: + - la teva ubicació + - els teus trets físics, com ara la posició dels ulls + - els teus moviments, com ara la manera de caminar + + Assegura't que confies en aquest lloc web abans de donar-li accés.</translation> <translation id="424864128008805179">Vols tancar la sessió de Chrome?</translation> <translation id="4256782883801055595">Llicències de programari lliure</translation> <translation id="4259722352634471385">S'ha bloquejat la navegació: <ph name="URL" /></translation> @@ -571,6 +583,7 @@ <translation id="5271967389191913893">El dispositiu no pot obrir el contingut que s'ha de baixar.</translation> <translation id="528192093759286357">Arrossegueu la pantalla des de la part superior i toqueu el botó Enrere per sortir de la pantalla completa.</translation> <translation id="5284584623296338184">Els canvis que es facin a les adreces d'interès, l'historial, les contrasenyes i altres opcions de configuració es deixaran de sincronitzar amb el Compte de Google. No obstant això, les dades actuals hi continuaran emmagatzemades.</translation> +<translation id="5292796745632149097">Envia a</translation> <translation id="5300589172476337783">Mostra</translation> <translation id="5301954838959518834">D'acord</translation> <translation id="5304593522240415983">Aquest camp no pot estar en blanc</translation> @@ -598,6 +611,7 @@ <translation id="545042621069398927">S'està accelerant la baixada.</translation> <translation id="5456381639095306749">Baixa la pàgina</translation> <translation id="5475862044948910901">Vols iniciar la sessió de realitat augmentada?</translation> +<translation id="5481942164684849270"><ph name="APP_NAME" /> s'ha afegit a les teves aplicacions</translation> <translation id="548278423535722844">Obre en una aplicació de mapes</translation> <translation id="5487521232677179737">Esborra les dades</translation> <translation id="5494752089476963479">Bloqueja els anuncis als llocs web que mostren publicitat intrusiva o enganyosa</translation> @@ -731,6 +745,7 @@ <translation id="6406506848690869874">Sincronització</translation> <translation id="641643625718530986">Imprimeix…</translation> <translation id="6416782512398055893">S'han baixat <ph name="MBS" /> MB</translation> +<translation id="6418750371676080905">El selector de dispositius amb què es compartirà una pestanya està tancat.</translation> <translation id="6427112570124116297">Tradueix el web</translation> <translation id="6433501201775827830">Tria el motor de cerca</translation> <translation id="6437478888915024427">Informació de la pàgina</translation> @@ -770,6 +785,7 @@ <translation id="666268767214822976">Utilitza un servei de predicció per mostrar consultes relacionades i llocs web populars mentre escrius a la barra d'adreces</translation> <translation id="666731172850799929">Obre a <ph name="APP_NAME" /></translation> <translation id="666981079809192359">Avís de privadesa de Chrome</translation> +<translation id="6672986458216094438">El selector de dispositius amb què es compartirà una pestanya ocupa la meitat inferior de la pantalla.</translation> <translation id="6697492270171225480">Mostra suggeriments de pàgines similars quan no se'n trobi una</translation> <translation id="6697947395630195233">Chrome necessita accedir a la teva ubicació per compartir-la amb aquest lloc web.</translation> <translation id="6698801883190606802">Gestiona les dades sincronitzades</translation> @@ -947,6 +963,7 @@ <translation id="7942131818088350342"><ph name="PRODUCT_NAME" /> no està actualitzat.</translation> <translation id="7947953824732555851">Acc. i inicia sessió</translation> <translation id="7963646190083259054">Proveïdor:</translation> +<translation id="7971136598759319605">Actiu fa 1 dia</translation> <translation id="7975379999046275268">Previsualitza la pàgina <ph name="BEGIN_NEW" />Novetat<ph name="END_NEW" /></translation> <translation id="7981313251711023384">Carrega les pàgines prèviament per poder-hi navegar i fer cerques més de pressa</translation> <translation id="79859296434321399">Per veure contingut en realitat augmentada, instal·la ARCore</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_cs.xtb b/chrome/android/java/strings/translations/android_chrome_strings_cs.xtb index 3f888bb..ce143a2 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_cs.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_cs.xtb
@@ -2,6 +2,7 @@ <!DOCTYPE translationbundle> <translationbundle lang="cs"> <translation id="1006017844123154345">Otevřít online</translation> +<translation id="1028699632127661925">Odesílání na zařízení <ph name="DEVICE_NAME" />...</translation> <translation id="1036727731225946849">Přidávání aplikace <ph name="WEBAPK_NAME" />...</translation> <translation id="1041308826830691739">Z webů</translation> <translation id="1049743911850919806">Anonymní režim</translation> @@ -43,6 +44,7 @@ <translation id="1260236875608242557">Vyhledávání a prozkoumávání</translation> <translation id="1264974993859112054">Sport</translation> <translation id="1272079795634619415">Zastavit</translation> +<translation id="1272444412400969138">Výběr zařízení, se kterým se má sdílet karta.</translation> <translation id="1283039547216852943">Klepnutím rozbalíte</translation> <translation id="1285320974508926690">Tento web nikdy nepřekládat</translation> <translation id="1291207594882862231">Vymazat historii, soubory cookie, data webů, mezipaměť…</translation> @@ -59,6 +61,7 @@ <translation id="138361230106469022">Dobrý den, <ph name="FULL_NAME" /></translation> <translation id="1383876407941801731">Vyhledávání</translation> <translation id="1384959399684842514">Stahování pozastaveno</translation> +<translation id="1386674309198842382">Aktivní před tímto počtem dní: <ph name="LAST_UPDATED" /></translation> <translation id="1389974829397082527">Nejsou zde žádné záložky</translation> <translation id="1397811292916898096">Hledat pomocí vyhledávače <ph name="PRODUCT_NAME" /></translation> <translation id="1404122904123200417">Vloženo do <ph name="WEBSITE_URL" /></translation> @@ -223,6 +226,7 @@ <translation id="2567385386134582609">OBRÁZEK</translation> <translation id="257088987046510401">Motivy</translation> <translation id="2570922361219980984">Přístup k poloze je vypnut také v tomto zařízení. Zapnete jej v <ph name="BEGIN_LINK" />Nastavení Android<ph name="END_LINK" />.</translation> +<translation id="257674075312929031">Skupina</translation> <translation id="257931822824936280">Rozbaleno – kliknutím sbalíte</translation> <translation id="2581165646603367611">Tímto vymažete soubory cookie, mezipaměť a další data webů, která Chrome považuje za nedůležitá.</translation> <translation id="2586657967955657006">Schránka</translation> @@ -274,6 +278,7 @@ <translation id="2956410042958133412">Tento účet spravují uživatelé <ph name="PARENT_NAME_1" /> a <ph name="PARENT_NAME_2" />.</translation> <translation id="2962095958535813455">Přepnuto na anonymní karty</translation> <translation id="2968755619301702150">Prohlížeč certifikátů</translation> +<translation id="2977480621796371840">Odebrat ze skupiny</translation> <translation id="2979025552038692506">Vybraná anonymní karta</translation> <translation id="2989523299700148168">Nedávno navštívené</translation> <translation id="2996291259634659425">Vytvoření heslové fráze</translation> @@ -400,6 +405,7 @@ <translation id="4008040567710660924">Povolit soubory cookie pro konkrétní web.</translation> <translation id="4034817413553209278">{HOURS,plural, =1{# h}few{# h}many{# h}other{# h}}</translation> <translation id="4042870126885713738">Zobrazovat návrhy, pokud nelze vyhledat webovou adresu nebo navázat připojení.</translation> +<translation id="4044912625106523635">Tabulka pro výběr zařízení, se kterým se má sdílet karta, je otevřená na plnou výšku.</translation> <translation id="4046123991198612571">Další skladba</translation> <translation id="4048707525896921369">Vyhledávejte informace o tématech zmíněných na stránce, aniž byste stránku museli opustit. Funkce Vyhledání klepnutím odešle slovo a okolní kontext do Vyhledávání Google, které vrátí definice, obrázky, výsledky vyhledávání a další podrobnosti. @@ -426,6 +432,12 @@ <translation id="4226663524361240545">Oznámení mohou aktivovat vibraci</translation> <translation id="423219824432660969">Zašifrovat synchronizovaná data pomocí hesla Google z <ph name="TIME" /></translation> <translation id="4242533952199664413">Otevřít Nastavení</translation> +<translation id="4247274662191902962">Data ze senzorů se budou sdílet, pouze dokud budete v této virtuální realitě. Z některých údajů si o vás web může udělat určitou představu. Příklady takových údajů: + – poloha, + – fyzické znaky, např. pozice očí, + – pohyby, například způsob chůze. + + Přístup webu povolte pouze v případě, že mu důvěřujete.</translation> <translation id="424864128008805179">Odhlásit se z Chromu?</translation> <translation id="4256782883801055595">Licence open source</translation> <translation id="4259722352634471385">Navigace je blokována: <ph name="URL" /></translation> @@ -571,6 +583,7 @@ <translation id="5271967389191913893">Zařízení obsah ke stažení nemůže otevřít.</translation> <translation id="528192093759286357">Režim celé obrazovky ukončíte přetažením z horního okraje obrazovky a klepnutím na tlačítko Zpět.</translation> <translation id="5284584623296338184">Změny záložek, historie, hesel a dalších nastavení se již nebudou synchronizovat do vašeho účtu Google. Vaše existující data však v účtu Google uložena zůstanou.</translation> +<translation id="5292796745632149097">Odeslat do zařízení</translation> <translation id="5300589172476337783">Zobrazit</translation> <translation id="5301954838959518834">Dobře, rozumím</translation> <translation id="5304593522240415983">Toto pole nesmí být prázdné</translation> @@ -598,6 +611,7 @@ <translation id="545042621069398927">Zrychlování stahování.</translation> <translation id="5456381639095306749">Stáhnout stránku</translation> <translation id="5475862044948910901">Spustit relaci rozšířené reality?</translation> +<translation id="5481942164684849270">Aplikace <ph name="APP_NAME" /> byla přidána mezi moje aplikace</translation> <translation id="548278423535722844">Otevřít v mapové aplikaci</translation> <translation id="5487521232677179737">Vymazat data</translation> <translation id="5494752089476963479">Blokovat reklamy na webech, které zobrazují obtěžující nebo zavádějící reklamy</translation> @@ -731,6 +745,7 @@ <translation id="6406506848690869874">Synchronizace</translation> <translation id="641643625718530986">Tisk…</translation> <translation id="6416782512398055893">Staženo: <ph name="MBS" /> MB</translation> +<translation id="6418750371676080905">Tabulka pro výběr zařízení, se kterým se má sdílet karta, je zavřená.</translation> <translation id="6427112570124116297">Přeložte si web</translation> <translation id="6433501201775827830">Vyberte vyhledávač</translation> <translation id="6437478888915024427">Informace o stránce</translation> @@ -770,6 +785,7 @@ <translation id="666268767214822976">Používat službu předpovídání k zobrazení souvisejících dotazů a oblíbených webových stránek.</translation> <translation id="666731172850799929">Otevřít v aplikaci <ph name="APP_NAME" /></translation> <translation id="666981079809192359">Ochrana soukromí v Chromu</translation> +<translation id="6672986458216094438">Tabulka pro výběr zařízení, se kterým se má sdílet karta, je otevřená na poloviční výšku.</translation> <translation id="6697492270171225480">Zobrazovat návrhy podobných stránek, když stránku nelze najít</translation> <translation id="6697947395630195233">Chrome potřebuje přístup k vaší poloze, aby ji mohl sdílet s tímto webem.</translation> <translation id="6698801883190606802">Správa synchronizovaných dat</translation> @@ -947,6 +963,7 @@ <translation id="7942131818088350342">Aplikace <ph name="PRODUCT_NAME" /> je zastaralá.</translation> <translation id="7947953824732555851">Přijmout a přihlásit</translation> <translation id="7963646190083259054">Dodavatel:</translation> +<translation id="7971136598759319605">Aktivní včera</translation> <translation id="7975379999046275268">Zobrazit náhled stránky <ph name="BEGIN_NEW" />Nové<ph name="END_NEW" /></translation> <translation id="7981313251711023384">Předběžně načítat stránky pro rychlejší procházení a vyhledávání</translation> <translation id="79859296434321399">Chcete-li zobrazit obsah pro rozšířenou realitu, nainstalujte ARCore</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_da.xtb b/chrome/android/java/strings/translations/android_chrome_strings_da.xtb index 7ea8df42..9c9b0f5e 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_da.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_da.xtb
@@ -223,6 +223,7 @@ <translation id="2567385386134582609">BILLEDE</translation> <translation id="257088987046510401">Temaer</translation> <translation id="2570922361219980984">Placeringsadgang er også deaktiveret for denne enhed. Aktivér det under <ph name="BEGIN_LINK" />indstillinger for Android<ph name="END_LINK" />.</translation> +<translation id="257674075312929031">Gruppe</translation> <translation id="257931822824936280">Udvidet – klik for at skjule.</translation> <translation id="2581165646603367611">Dette rydder cookies, cache og andre data fra websites, som ikke er vigtige ifølge Chrome.</translation> <translation id="2586657967955657006">Udklipsholder</translation> @@ -274,6 +275,7 @@ <translation id="2956410042958133412">Denne konto administreres af <ph name="PARENT_NAME_1" /> og <ph name="PARENT_NAME_2" />.</translation> <translation id="2962095958535813455">Skiftet til inkognitofaner</translation> <translation id="2968755619301702150">Certifikatfremviser</translation> +<translation id="2977480621796371840">Fjern fra gruppe</translation> <translation id="2979025552038692506">Valgt inkognitofane</translation> <translation id="2989523299700148168">Besøgt for nylig</translation> <translation id="2996291259634659425">Opret adgangssætning</translation> @@ -426,6 +428,12 @@ <translation id="4226663524361240545">Notifikationer kan få enheden til at vibrere</translation> <translation id="423219824432660969">Kryptér synkroniserede data med Google-adgangskoden fra <ph name="TIME" /></translation> <translation id="4242533952199664413">Åbn Indstillinger</translation> +<translation id="4247274662191902962">Sensordata deles kun, når du er i denne VR-oplevelse. Websitet kan muligvis få oplysninger om dig ved hjælp af bestemte oplysninger som f.eks.: + - Din placering + - Dine fysiske træk, f.eks. øjnenes placering + - Dine bevægelser, f.eks. den måde, du går på + + Det er vigtigt, at du har tillid til websitet, før du giver adgang.</translation> <translation id="424864128008805179">Vil du logge ud af Chrome?</translation> <translation id="4256782883801055595">Open source-licenser</translation> <translation id="4259722352634471385">Navigationen er blokeret: <ph name="URL" /></translation> @@ -598,6 +606,7 @@ <translation id="545042621069398927">Øger hastigheden på din download.</translation> <translation id="5456381639095306749">Download siden</translation> <translation id="5475862044948910901">Vil du starte en session med augmented reality?</translation> +<translation id="5481942164684849270"><ph name="APP_NAME" /> blev føjet til mine apps</translation> <translation id="548278423535722844">Åbn i kortapp</translation> <translation id="5487521232677179737">Ryd data</translation> <translation id="5494752089476963479">Bloker annoncer på websites, der viser påtrængende eller vildledende annoncer</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_de.xtb b/chrome/android/java/strings/translations/android_chrome_strings_de.xtb index 893fea63..69fd811c 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_de.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_de.xtb
@@ -223,6 +223,7 @@ <translation id="2567385386134582609">BILD</translation> <translation id="257088987046510401">Designs</translation> <translation id="2570922361219980984">Der Standortzugriff ist für dieses Gerät ebenfalls deaktiviert. Sie können ihn in den <ph name="BEGIN_LINK" />Android-Einstellungen<ph name="END_LINK" /> aktivieren.</translation> +<translation id="257674075312929031">Gruppe</translation> <translation id="257931822824936280">Maximiert – zum Minimieren klicken</translation> <translation id="2581165646603367611">Alle Cookies, der Cache und andere Daten von Websites, die Chrome nicht für wichtig hält, werden gelöscht.</translation> <translation id="2586657967955657006">Zwischenablage</translation> @@ -274,6 +275,7 @@ <translation id="2956410042958133412">Dieses Konto wird von <ph name="PARENT_NAME_1" /> und <ph name="PARENT_NAME_2" /> verwaltet.</translation> <translation id="2962095958535813455">Zu Inkognito-Tabs gewechselt</translation> <translation id="2968755619301702150">Zertifikats-Viewer</translation> +<translation id="2977480621796371840">Aus Gruppe entfernen</translation> <translation id="2979025552038692506">Ausgewählter Inkognito-Tab</translation> <translation id="2989523299700148168">Kürzlich besucht</translation> <translation id="2996291259634659425">Passphrase erstellen</translation> @@ -426,6 +428,12 @@ <translation id="4226663524361240545">Bei Benachrichtigungen kann das Gerät vibrieren</translation> <translation id="423219824432660969">Synchronisierte Daten mit dem Google-Passwort vom <ph name="TIME" /> verschlüsseln</translation> <translation id="4242533952199664413">Einstellungen öffnen</translation> +<translation id="4247274662191902962">Sensordaten werden nur geteilt, während Sie diese VR-Funktion verwenden. Die Website erhält möglicherweise bestimmte Informationen über Sie. Dazu gehören + – Ihr Standort, + – physische Merkmale wie Ihre Augenposition und + – Bewegungen, wie z. B. Ihre Art, zu gehen. + + Geben Sie dieser Website nur Zugriff, wenn Sie ihr vertrauen.</translation> <translation id="424864128008805179">Von Chrome abmelden?</translation> <translation id="4256782883801055595">Open Source-Lizenzen</translation> <translation id="4259722352634471385">Die Navigation zu <ph name="URL" /> ist blockiert.</translation> @@ -598,6 +606,7 @@ <translation id="545042621069398927">Download wird beschleunigt.</translation> <translation id="5456381639095306749">Seite herunterladen</translation> <translation id="5475862044948910901">Augmented-Reality-Sitzung starten?</translation> +<translation id="5481942164684849270"><ph name="APP_NAME" /> zu meinen Apps hinzugefügt</translation> <translation id="548278423535722844">In einer Karten-App öffnen</translation> <translation id="5487521232677179737">Daten löschen</translation> <translation id="5494752089476963479">Werbung auf Websites blockieren, auf denen aufdringliche oder irreführende Werbung angezeigt wird</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_el.xtb b/chrome/android/java/strings/translations/android_chrome_strings_el.xtb index a7da734..77f55da 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_el.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_el.xtb
@@ -2,6 +2,7 @@ <!DOCTYPE translationbundle> <translationbundle lang="el"> <translation id="1006017844123154345">Άνοιγμα στο διαδίκτυο</translation> +<translation id="1028699632127661925">Αποστολή στη συσκευή <ph name="DEVICE_NAME" />…</translation> <translation id="1036727731225946849">Προσθήκη <ph name="WEBAPK_NAME" />…</translation> <translation id="1041308826830691739">Από ιστοτόπους</translation> <translation id="1049743911850919806">Ανώνυμη περιήγηση</translation> @@ -43,6 +44,7 @@ <translation id="1260236875608242557">Αναζήτηση και εξερεύνηση</translation> <translation id="1264974993859112054">Αθλητικά</translation> <translation id="1272079795634619415">Διακοπή</translation> +<translation id="1272444412400969138">Εργαλείο επιλογής συσκευής για κοινή χρήση καρτέλας.</translation> <translation id="1283039547216852943">Πατήστε για ανάπτυξη</translation> <translation id="1285320974508926690">Να μην γίνεται ποτέ μετάφραση αυτού του ιστότοπου</translation> <translation id="1291207594882862231">Διαγραφή ιστορικού, cookie, δεδομένων ιστότοπου, κρυφής μνήμης…</translation> @@ -59,6 +61,7 @@ <translation id="138361230106469022">Γεια σας, <ph name="FULL_NAME" /></translation> <translation id="1383876407941801731">Αναζήτηση</translation> <translation id="1384959399684842514">Η λήψη διακόπηκε προσωρινά.</translation> +<translation id="1386674309198842382">Ενεργή <ph name="LAST_UPDATED" /> ημέρες πριν</translation> <translation id="1389974829397082527">Δεν υπάρχουν σελιδοδείκτες εδώ</translation> <translation id="1397811292916898096">Αναζήτηση με <ph name="PRODUCT_NAME" /></translation> <translation id="1404122904123200417">Ενσωματωμένο σε <ph name="WEBSITE_URL" /></translation> @@ -223,6 +226,7 @@ <translation id="2567385386134582609">ΕΙΚΟΝΑ</translation> <translation id="257088987046510401">Θέματα</translation> <translation id="2570922361219980984">Η πρόσβαση στην Τοποθεσία είναι απενεργοποιημένη επίσης γι' αυτήν τη συσκευή. Ενεργοποιήστε τη στις <ph name="BEGIN_LINK" />Ρυθμίσεις Android<ph name="END_LINK" />.</translation> +<translation id="257674075312929031">Ομάδα</translation> <translation id="257931822824936280">Αναπτυγμένη - Κάντε κλικ για σύμπτυξη</translation> <translation id="2581165646603367611">Αυτό θα διαγράψει τα cookie, την κρυφή μνήμη και άλλα δεδομένα ιστοτόπων που το Chrome θεωρεί ότι δεν είναι σημαντικά.</translation> <translation id="2586657967955657006">Πρόχειρο</translation> @@ -274,6 +278,7 @@ <translation id="2956410042958133412">Αυτός ο λογαριασμός τελεί υπό τη διαχείριση των γονέων <ph name="PARENT_NAME_1" /> και <ph name="PARENT_NAME_2" />.</translation> <translation id="2962095958535813455">Έγινε εναλλαγή σε καρτέλες ανώνυμης περιήγησης</translation> <translation id="2968755619301702150">Πρόγρ. προβολής πιστοποιητικού</translation> +<translation id="2977480621796371840">Κατάργηση από την ομάδα</translation> <translation id="2979025552038692506">Επιλεγμένη καρτέλα ανώνυμης περιήγησης</translation> <translation id="2989523299700148168">Πραγματοποιήθηκε επίσκεψη πρόσφατα</translation> <translation id="2996291259634659425">Δημιουργία φράσης πρόσβασης</translation> @@ -400,6 +405,7 @@ <translation id="4008040567710660924">Επιτρέπει τα cookie για έναν συγκεκριμένο ιστότοπο.</translation> <translation id="4034817413553209278">{HOURS,plural, =1{# ω.}other{# ω.}}</translation> <translation id="4042870126885713738">Εμφάνιση προτάσεων όταν μια διεύθυνση ιστού δεν αναλύεται σωστά ή δεν είναι δυνατό να πραγματοποιηθεί σύνδεση</translation> +<translation id="4044912625106523635">Εργαλείο επιλογής συσκευών για κοινή χρήση μιας καρτέλας που ανοίγει σε πλήρες ύψος.</translation> <translation id="4046123991198612571">Επόμενο κομμάτι</translation> <translation id="4048707525896921369">Ενημερωθείτε σχετικά με τα θέματα των ιστοτόπων, χωρίς να αποχωρήσετε από τη σελίδα. Η λειτουργία "Πατήστε για αναζήτηση" στέλνει μια λέξη και τα συμφραζόμενά της στην Αναζήτηση Google και εμφανίζει ορισμούς, εικόνες, αποτελέσματα αναζήτησης και άλλες λεπτομέρειες. @@ -426,6 +432,12 @@ <translation id="4226663524361240545">Κατά τη λήψη ειδοποιήσεων ενδέχεται να δονείται η συσκευή</translation> <translation id="423219824432660969">Κρυπτογράφηση συγχρονισμένων δεδομένων με τον κωδικό πρόσβασης Google από τις <ph name="TIME" /></translation> <translation id="4242533952199664413">Ανοίξτε τις ρυθμίσεις</translation> +<translation id="4247274662191902962">Τα δεδομένα αισθητήρα θα κοινοποιούνται μόνο όταν χρησιμοποιείτε αυτήν την εμπειρία VR. Ο ιστότοπος μπορεί να έχει τη δυνατότητα να σας μαθαίνει για εσάς χρησιμοποιώντας ορισμένες πληροφορίες, όπως είναι οι εξής: + - Η τοποθεσία σας + - Τα φυσικά σας χαρακτηριστικά, όπως η θέση των ματιών + - Οι κινήσεις σας, όπως ο τρόπος που περπατάτε + + Προτού επιτρέψετε την πρόσβαση, βεβαιωθείτε ότι μπορείτε να εμπιστευτείτε αυτόν τον ιστότοπο.</translation> <translation id="424864128008805179">Αποσύνδεση από το Chrome;</translation> <translation id="4256782883801055595">Άδειες λογισμικού ανοικτού κώδικα</translation> <translation id="4259722352634471385">Αποκλείστηκε η μετάβαση στη διεύθυνση: <ph name="URL" /></translation> @@ -571,6 +583,7 @@ <translation id="5271967389191913893">Η συσκευή δεν μπορεί να ανοίξει το περιεχόμενο προς λήψη.</translation> <translation id="528192093759286357">Σύρετε από το επάνω τμήμα και αγγίξτε το κουμπί επιστροφής για έξοδο από την πλήρη οθόνη.</translation> <translation id="5284584623296338184">Οι αλλαγές σε σελιδοδείκτες, ιστορικό, κωδικούς πρόσβασης και άλλες ρυθμίσεις δεν θα συγχρονίζονται πλέον με το Λογαριασμό σας Google. Ωστόσο, τα υπάρχοντα δεδομένα σας θα παραμείνουν αποθηκευμένα στο λογαριασμό σας Google.</translation> +<translation id="5292796745632149097">Αποστολή προς</translation> <translation id="5300589172476337783">Εμφάνιση</translation> <translation id="5301954838959518834">OK, το κατάλαβα</translation> <translation id="5304593522240415983">Αυτό το πεδίο δεν μπορεί να είναι κενό</translation> @@ -598,6 +611,7 @@ <translation id="545042621069398927">Επιτάχυνση της λήψης σας.</translation> <translation id="5456381639095306749">Λήψη σελίδας</translation> <translation id="5475862044948910901">Έναρξη περιόδου λειτουργίας επαυξημένης πραγματικότητας;</translation> +<translation id="5481942164684849270">Το στοιχείο<ph name="APP_NAME" /> προστέθηκε στις εφαρμογές μου</translation> <translation id="548278423535722844">Άνοιγμα σε εφαρμογή χαρτών</translation> <translation id="5487521232677179737">Διαγραφή δεδομένων</translation> <translation id="5494752089476963479">Αποκλεισμός διαφημίσεων σε ιστοτόπους που εμφανίζουν παρεμβατικές ή παραπλανητικές διαφημίσεις</translation> @@ -731,6 +745,7 @@ <translation id="6406506848690869874">Συγχρονισμός</translation> <translation id="641643625718530986">Εκτύπωση…</translation> <translation id="6416782512398055893">Έγινε λήψη <ph name="MBS" /> MB</translation> +<translation id="6418750371676080905">Εργαλείο επιλογής συσκευής για κοινή χρήση καρτέλας που έχει κλείσει.</translation> <translation id="6427112570124116297">Μετάφραση ιστού</translation> <translation id="6433501201775827830">Επιλέξτε τη μηχανή αναζήτησής σας</translation> <translation id="6437478888915024427">Πληροφορίες σελίδας</translation> @@ -770,6 +785,7 @@ <translation id="666268767214822976">Χρήση υπηρεσίας προβλέψεων για την εμφάνιση σχετικών ερωτημάτων και δημοφιλών ιστοτόπων, καθώς πληκτρολογείτε στη γραμμή διευθύνσεων</translation> <translation id="666731172850799929">Άνοιγμα σε <ph name="APP_NAME" /></translation> <translation id="666981079809192359">Σημείωση Απορρήτου του Chrome</translation> +<translation id="6672986458216094438">Εργαλείο επιλογής συσκευών για κοινή χρήση μιας καρτέλας που ανοίγει στο μισό ύψος.</translation> <translation id="6697492270171225480">Εμφάνιση προτάσεων για παρόμοιες σελίδες όταν δεν είναι δυνατή η εύρεση μιας σελίδας</translation> <translation id="6697947395630195233">Το Chrome χρειάζεται πρόσβαση στην τοποθεσία σας, για να την κοινοποιήσει σε αυτόν τον ιστότοπο.</translation> <translation id="6698801883190606802">Διαχείριση συγχρονισμένων δεδομένων</translation> @@ -947,6 +963,7 @@ <translation id="7942131818088350342">Το <ph name="PRODUCT_NAME" /> δεν είναι ενημερωμένο.</translation> <translation id="7947953824732555851">Αποδοχή και σύνδεση</translation> <translation id="7963646190083259054">Προμηθευτής:</translation> +<translation id="7971136598759319605">Ενεργή 1 ημέρα πριν</translation> <translation id="7975379999046275268">Προεπισκόπηση σελίδας <ph name="BEGIN_NEW" />Νέο<ph name="END_NEW" /></translation> <translation id="7981313251711023384">Προφόρτωση ιστοσελίδων για ταχύτερη περιήγηση και αναζήτηση</translation> <translation id="79859296434321399">Για να δείτε περιεχόμενο επαυξημένης πραγματικότητας, εγκαταστήστε το ARCore</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_en-GB.xtb b/chrome/android/java/strings/translations/android_chrome_strings_en-GB.xtb index e0e68c6..bd01e87 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_en-GB.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_en-GB.xtb
@@ -2,6 +2,7 @@ <!DOCTYPE translationbundle> <translationbundle lang="en-GB"> <translation id="1006017844123154345">Open Online</translation> +<translation id="1028699632127661925">Sending to <ph name="DEVICE_NAME" />...</translation> <translation id="1036727731225946849">Adding <ph name="WEBAPK_NAME" />...</translation> <translation id="1041308826830691739">From websites</translation> <translation id="1049743911850919806">Incognito</translation> @@ -43,6 +44,7 @@ <translation id="1260236875608242557">Search and explore</translation> <translation id="1264974993859112054">Sports</translation> <translation id="1272079795634619415">Stop</translation> +<translation id="1272444412400969138">Device picker to share a tab with.</translation> <translation id="1283039547216852943">Tap to expand</translation> <translation id="1285320974508926690">Never translate this site</translation> <translation id="1291207594882862231">Clear history, cookies, site data, cache…</translation> @@ -59,6 +61,7 @@ <translation id="138361230106469022">Hi, <ph name="FULL_NAME" /></translation> <translation id="1383876407941801731">Search</translation> <translation id="1384959399684842514">Download paused</translation> +<translation id="1386674309198842382">Active <ph name="LAST_UPDATED" /> days ago</translation> <translation id="1389974829397082527">No bookmarks here</translation> <translation id="1397811292916898096">Search with <ph name="PRODUCT_NAME" /></translation> <translation id="1404122904123200417">Embedded in <ph name="WEBSITE_URL" /></translation> @@ -223,6 +226,7 @@ <translation id="2567385386134582609">IMAGE</translation> <translation id="257088987046510401">Themes</translation> <translation id="2570922361219980984">Location access is also off for this device. Turn it on in <ph name="BEGIN_LINK" />Android Settings<ph name="END_LINK" />.</translation> +<translation id="257674075312929031">Group</translation> <translation id="257931822824936280">Expanded – click to collapse.</translation> <translation id="2581165646603367611">This will clear cookies, cache and other data of sites Chrome doesn't think is important.</translation> <translation id="2586657967955657006">Clipboard</translation> @@ -274,6 +278,7 @@ <translation id="2956410042958133412">This account is managed by <ph name="PARENT_NAME_1" /> and <ph name="PARENT_NAME_2" />.</translation> <translation id="2962095958535813455">Switched to incognito tabs</translation> <translation id="2968755619301702150">Certificate viewer</translation> +<translation id="2977480621796371840">Remove from group</translation> <translation id="2979025552038692506">Selected Incognito Tab</translation> <translation id="2989523299700148168">Recently Visited</translation> <translation id="2996291259634659425">Create passphrase</translation> @@ -400,6 +405,7 @@ <translation id="4008040567710660924">Allow cookies for a specific site.</translation> <translation id="4034817413553209278">{HOURS,plural, =1{# hr}other{# hrs}}</translation> <translation id="4042870126885713738">Show suggestions when a web address does not resolve or a connection cannot be made</translation> +<translation id="4044912625106523635">Device picker to share a tab with is opened at full height.</translation> <translation id="4046123991198612571">Next track</translation> <translation id="4048707525896921369">Learn about topics on websites without leaving the page. Tap to Search sends a word and its surrounding context to Google Search, returning definitions, pictures, search results and other details. @@ -426,6 +432,12 @@ <translation id="4226663524361240545">Notifications may vibrate the device</translation> <translation id="423219824432660969">Encrypt synced data with Google password as of <ph name="TIME" /></translation> <translation id="4242533952199664413">Open settings</translation> +<translation id="4247274662191902962">Sensor data will only be shared while you're in this VR experience. The site may be able to learn about you using certain info, such as: + - Your location + - Your physical features, like eye position + - Your movements, like how you walk + + Make sure that you trust this site before you allow access.</translation> <translation id="424864128008805179">Sign out of Chrome?</translation> <translation id="4256782883801055595">Open-source licences</translation> <translation id="4259722352634471385">Navigation is blocked: <ph name="URL" /></translation> @@ -571,6 +583,7 @@ <translation id="5271967389191913893">Device cannot open the content to be downloaded.</translation> <translation id="528192093759286357">Drag from top and touch the back button to exit full screen.</translation> <translation id="5284584623296338184">Changes to your bookmarks, history, passwords and other settings will no longer be synced to your Google Account. However, your existing data will remain stored in your Google Account.</translation> +<translation id="5292796745632149097">Send to</translation> <translation id="5300589172476337783">Show</translation> <translation id="5301954838959518834">OK, got it</translation> <translation id="5304593522240415983">This field cannot be blank</translation> @@ -598,6 +611,7 @@ <translation id="545042621069398927">Speeding up your download.</translation> <translation id="5456381639095306749">Download page</translation> <translation id="5475862044948910901">Start Augmented Reality session?</translation> +<translation id="5481942164684849270"><ph name="APP_NAME" /> added to my apps</translation> <translation id="548278423535722844">Open in maps app</translation> <translation id="5487521232677179737">Clear data</translation> <translation id="5494752089476963479">Block ads on sites that show intrusive or misleading ads</translation> @@ -731,6 +745,7 @@ <translation id="6406506848690869874">Sync</translation> <translation id="641643625718530986">Print…</translation> <translation id="6416782512398055893">Downloaded <ph name="MBS" /> MB</translation> +<translation id="6418750371676080905">Device picker to share a tab with is closed.</translation> <translation id="6427112570124116297">Translate the Web</translation> <translation id="6433501201775827830">Choose your search engine</translation> <translation id="6437478888915024427">Page info</translation> @@ -770,6 +785,7 @@ <translation id="666268767214822976">Use a prediction service to show related queries and popular websites as you type in the address bar</translation> <translation id="666731172850799929">Open in <ph name="APP_NAME" /></translation> <translation id="666981079809192359">Chrome Privacy Notice</translation> +<translation id="6672986458216094438">Device picker to share a tab with is opened at half height.</translation> <translation id="6697492270171225480">Show suggestions for similar pages when a page can't be found</translation> <translation id="6697947395630195233">Chrome needs access to your location to share your location with this site.</translation> <translation id="6698801883190606802">Manage synced data</translation> @@ -947,6 +963,7 @@ <translation id="7942131818088350342"><ph name="PRODUCT_NAME" /> is out of date.</translation> <translation id="7947953824732555851">Accept and sign in</translation> <translation id="7963646190083259054">Vendor:</translation> +<translation id="7971136598759319605">Active 1 day ago</translation> <translation id="7975379999046275268">Preview page <ph name="BEGIN_NEW" />New<ph name="END_NEW" /></translation> <translation id="7981313251711023384">Preload pages for faster browsing and searching</translation> <translation id="79859296434321399">To view augmented reality content, install ARCore</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_es-419.xtb b/chrome/android/java/strings/translations/android_chrome_strings_es-419.xtb index 91d03ce..96b15486 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_es-419.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_es-419.xtb
@@ -223,6 +223,7 @@ <translation id="2567385386134582609">IMAGEN</translation> <translation id="257088987046510401">Temas</translation> <translation id="2570922361219980984">El acceso a la ubicación también está desactivado en este dispositivo. Actívalo en la <ph name="BEGIN_LINK" />Configuración de Android<ph name="END_LINK" />.</translation> +<translation id="257674075312929031">Grupo</translation> <translation id="257931822824936280">Expandido; haz clic para contraer.</translation> <translation id="2581165646603367611">Esta acción borrará la caché, cookies y otros datos de sitios que Chrome no considera importantes.</translation> <translation id="2586657967955657006">Portapapeles</translation> @@ -274,6 +275,7 @@ <translation id="2956410042958133412"><ph name="PARENT_NAME_1" /> y <ph name="PARENT_NAME_2" /> administran esta cuenta.</translation> <translation id="2962095958535813455">Se seleccionaron las pestañas en modo de navegación de incógnito</translation> <translation id="2968755619301702150">Visualizador de certificados</translation> +<translation id="2977480621796371840">Quitar del grupo</translation> <translation id="2979025552038692506">Pestaña de incógnito seleccionada</translation> <translation id="2989523299700148168">Visitados recientemente</translation> <translation id="2996291259634659425">Crear frase de contraseña</translation> @@ -426,6 +428,12 @@ <translation id="4226663524361240545">Es posible que las notificaciones hagan vibrar el dispositivo</translation> <translation id="423219824432660969">Encriptar los datos sincronizados con la contraseña de Google a partir del <ph name="TIME" /></translation> <translation id="4242533952199664413">Abrir la configuración</translation> +<translation id="4247274662191902962">Los datos del sensor solo se compartirán cuando estés disfrutando de esta experiencia en RV. Es posible que el sitio te reconozca con cierta información, por ejemplo: + - Tu ubicación + - Tus características físicas, como la posición de los ojos + - Tus movimientos, como la manera de caminar + + Antes de permitir el acceso, asegúrate de que confías en este sitio.</translation> <translation id="424864128008805179">¿Quieres salir de Chrome?</translation> <translation id="4256782883801055595">Licencias de código abierto</translation> <translation id="4259722352634471385">Navegación bloqueada: <ph name="URL" /></translation> @@ -598,6 +606,7 @@ <translation id="545042621069398927">Acelerando la descarga</translation> <translation id="5456381639095306749">Descargar página</translation> <translation id="5475862044948910901">¿Quieres iniciar la sesión de realidad aumentada?</translation> +<translation id="5481942164684849270">Se agregó <ph name="APP_NAME" /> a mis apps</translation> <translation id="548278423535722844">Abrir en una app de mapas</translation> <translation id="5487521232677179737">Borrar datos</translation> <translation id="5494752089476963479">Bloquear anuncios de sitios que muestran anuncios intrusivos o engañosos</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_es.xtb b/chrome/android/java/strings/translations/android_chrome_strings_es.xtb index eb7fc81..c002b7f 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_es.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_es.xtb
@@ -20,7 +20,7 @@ <translation id="1145536944570833626">Elimina los datos actuales.</translation> <translation id="1146678959555564648">Iniciar RV</translation> <translation id="116280672541001035">Usados</translation> -<translation id="1171770572613082465">Toca el botón "Populares" para ver los sitios web más populares</translation> +<translation id="1171770572613082465">Toca el botón Populares para ver los sitios web más populares</translation> <translation id="1172593791219290334">Página de inicio</translation> <translation id="1173894706177603556">Cambiar nombre</translation> <translation id="1175310183703641346">Tus marcadores, el historial, las contraseñas y otros datos dejarán de sincronizarse con tu cuenta de Google.</translation> @@ -223,6 +223,7 @@ <translation id="2567385386134582609">IMAGEN</translation> <translation id="257088987046510401">Temas</translation> <translation id="2570922361219980984">El acceso a la ubicación también está desactivado en este dispositivo. Actívalo en los <ph name="BEGIN_LINK" />Ajustes de Android<ph name="END_LINK" />.</translation> +<translation id="257674075312929031">Grupo</translation> <translation id="257931822824936280">Ampliado (hacer clic para contraer)</translation> <translation id="2581165646603367611">Se borrarán las cookies, la caché y otros datos de los sitios web que Chrome no considere importantes.</translation> <translation id="2586657967955657006">Portapapeles</translation> @@ -274,6 +275,7 @@ <translation id="2956410042958133412">Esta cuenta está administrada por <ph name="PARENT_NAME_1" /> y <ph name="PARENT_NAME_2" />.</translation> <translation id="2962095958535813455">Se ha cambiado a las pestañas de incógnito</translation> <translation id="2968755619301702150">Visor de certificados</translation> +<translation id="2977480621796371840">Quitar del grupo</translation> <translation id="2979025552038692506">Pestaña de incógnito seleccionada</translation> <translation id="2989523299700148168">Visitados recientemente</translation> <translation id="2996291259634659425">Crea una frase de contraseña</translation> @@ -426,6 +428,12 @@ <translation id="4226663524361240545">Es posible que las notificaciones hagan que el dispositivo vibre</translation> <translation id="423219824432660969">Cifrar los datos sincronizados con la contraseña de Google desde el <ph name="TIME" /></translation> <translation id="4242533952199664413">Abrir Configuración</translation> +<translation id="4247274662191902962">Los datos de los sensores solo se podrán compartir mientras estés inmerso en esta experiencia de realidad virtual. Es posible que el sitio web aprenda sobre ti usando cierta información, como la siguiente: + - Tu ubicación + - Tus características físicas, como la posición de los ojos + - Tus movimientos, p. ej., tu forma de andar + + Antes de permitirle el acceso, asegúrate de que el sitio web sea de confianza.</translation> <translation id="424864128008805179">¿Quieres cerrar sesión en Chrome?</translation> <translation id="4256782883801055595">Licencias de código abierto</translation> <translation id="4259722352634471385">Se ha bloqueado la navegación: <ph name="URL" /></translation> @@ -598,6 +606,7 @@ <translation id="545042621069398927">Acelerando descarga.</translation> <translation id="5456381639095306749">Descargar página</translation> <translation id="5475862044948910901">¿Quieres iniciar la sesión de realidad aumentada?</translation> +<translation id="5481942164684849270"><ph name="APP_NAME" /> se ha añadido a mis aplicaciones</translation> <translation id="548278423535722844">Abrirla en una aplicación de mapas</translation> <translation id="5487521232677179737">Borrar datos</translation> <translation id="5494752089476963479">Bloquea anuncios invasivos o engañosos en los sitios web que los muestran</translation> @@ -967,7 +976,7 @@ <translation id="8058746566562539958">Abrir en una pestaña nueva</translation> <translation id="8063895661287329888">No se ha podido añadir el marcador.</translation> <translation id="806745655614357130">Mantener mis datos separados</translation> -<translation id="8067883171444229417">Ver vídeo</translation> +<translation id="8067883171444229417">Reproducir vídeo</translation> <translation id="8068648041423924542">No se puede seleccionar el certificado.</translation> <translation id="8073388330009372546">Abrir en pestaña nueva</translation> <translation id="8076492880354921740">Pestañas</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_et.xtb b/chrome/android/java/strings/translations/android_chrome_strings_et.xtb index 1dc635fb..947fa57a 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_et.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_et.xtb
@@ -2,6 +2,7 @@ <!DOCTYPE translationbundle> <translationbundle lang="et"> <translation id="1006017844123154345">Ava veebis</translation> +<translation id="1028699632127661925">Saatmine seadmesse <ph name="DEVICE_NAME" /> …</translation> <translation id="1036727731225946849">APK <ph name="WEBAPK_NAME" /> lisamine …</translation> <translation id="1041308826830691739">Veebisaitidelt</translation> <translation id="1049743911850919806">Inkognito</translation> @@ -43,6 +44,7 @@ <translation id="1260236875608242557">Otsimine ja avastamine</translation> <translation id="1264974993859112054">Sport</translation> <translation id="1272079795634619415">Peata</translation> +<translation id="1272444412400969138">Seadmevalija, millega vahelehte jagatakse.</translation> <translation id="1283039547216852943">Laiendamiseks puudutage</translation> <translation id="1285320974508926690">Ära kunagi seda saiti tõlgi</translation> <translation id="1291207594882862231">Ajaloo, küpsiste, saidiandmete, vahemälu kustutamine …</translation> @@ -59,6 +61,7 @@ <translation id="138361230106469022">Tere, <ph name="FULL_NAME" />!</translation> <translation id="1383876407941801731">Otsi</translation> <translation id="1384959399684842514">Allalaadimine peatatud</translation> +<translation id="1386674309198842382">Aktiivne <ph name="LAST_UPDATED" /> päeva tagasi</translation> <translation id="1389974829397082527">Siin pole järjehoidjaid</translation> <translation id="1397811292916898096">Otsi teenusega <ph name="PRODUCT_NAME" /></translation> <translation id="1404122904123200417">Manustatud saidile <ph name="WEBSITE_URL" /></translation> @@ -223,6 +226,7 @@ <translation id="2567385386134582609">KUJUTIS</translation> <translation id="257088987046510401">Teemad</translation> <translation id="2570922361219980984">Ka juurdepääs asukohale on selle seadme puhul välja lülitatud. Lülitage see sisse <ph name="BEGIN_LINK" />Androidi seadetes<ph name="END_LINK" />.</translation> +<translation id="257674075312929031">Rühm</translation> <translation id="257931822824936280">Laiendatud – ahendamiseks klõpsake.</translation> <translation id="2581165646603367611">See tühjendab vahemälu, kustutab küpsised ja muud andmed, mis pärinevad Chrome'i arvates ebatähtsatelt saitidelt.</translation> <translation id="2586657967955657006">Lõikelaud</translation> @@ -274,6 +278,7 @@ <translation id="2956410042958133412">Seda kontot haldavad <ph name="PARENT_NAME_1" /> ja <ph name="PARENT_NAME_2" />.</translation> <translation id="2962095958535813455">Inkognito režiimi vahelehed on aktiveeritud</translation> <translation id="2968755619301702150">Sertifikaadikuvaja</translation> +<translation id="2977480621796371840">Grupist eemaldamine</translation> <translation id="2979025552038692506">Valitud inkognito vaheleht</translation> <translation id="2989523299700148168">Hiljuti külastatud</translation> <translation id="2996291259634659425">Parooli loomine</translation> @@ -400,6 +405,7 @@ <translation id="4008040567710660924">Lubage konkreetse saidi küpsisefailid.</translation> <translation id="4034817413553209278">{HOURS,plural, =1{# h}other{# h}}</translation> <translation id="4042870126885713738">Soovituste näitamine, kui veebiaadressi ei saa lahendada või ühendust ei õnnestu luua</translation> +<translation id="4044912625106523635">Seadmevalija, millega vahelehte jagatakse, on avatud täiskõrgusega.</translation> <translation id="4046123991198612571">Järgmine lugu</translation> <translation id="4048707525896921369">Vaadake veebisaidil olevaid teemasid lehelt lahkumata. Funktsioon Puuduta otsimiseks saadab sõna ja seda ümbritseva konteksti Google'i otsingusse, andes vastuseks definitsioonid, pildid, otsingutulemused ja muud üksikasjad. @@ -426,6 +432,12 @@ <translation id="4226663524361240545">Seade võib märguannete korral vibreerida</translation> <translation id="423219824432660969">Krüpteeri sünkroonitud andmed Google'i parooli abil <ph name="TIME" /> seisuga</translation> <translation id="4242533952199664413">Ava seaded</translation> +<translation id="4247274662191902962">Anduri andmeid jagatakse ainult virtuaalreaalsuse kogemuse ajal. Sait võib teid tundma õppida, kasutades järgmist teavet. + - Teie asukoht + - Teie füüsilised omadused, nt silmade asend + - Teie liigutused, nt teie kõnnak + + Enne juurdepääsu andmist veenduge, et usaldaksite seda saiti.</translation> <translation id="424864128008805179">Kas logida Chrome'ist välja?</translation> <translation id="4256782883801055595">Avatud lähtekoodi litsentsid</translation> <translation id="4259722352634471385">Navigeerimine on blokeeritud: <ph name="URL" /></translation> @@ -571,6 +583,7 @@ <translation id="5271967389191913893">Seade ei saa allalaaditavat sisu avada.</translation> <translation id="528192093759286357">Täisekraanilt väljumiseks lohistage ülaservast alla ja puudutage tagasinuppu.</translation> <translation id="5284584623296338184">Järjehoidjates, ajaloos, paroolides ja muudes seadetes tehtud muudatusi ei sünkroonita enam teie Google'i kontoga. Teie olemasolevad andmed jäävad siiski teie Google'i kontole.</translation> +<translation id="5292796745632149097">Saatmine</translation> <translation id="5300589172476337783">Kuva</translation> <translation id="5301954838959518834">Selge, sain aru</translation> <translation id="5304593522240415983">See väli ei tohi olla tühi</translation> @@ -598,6 +611,7 @@ <translation id="545042621069398927">Allalaadimise kiirendamine.</translation> <translation id="5456381639095306749">Laadi leht alla</translation> <translation id="5475862044948910901">Kas alustada liitreaalsuse seanssi?</translation> +<translation id="5481942164684849270"><ph name="APP_NAME" /> on minu rakendustesse lisatud</translation> <translation id="548278423535722844">Avage kaardirakenduses</translation> <translation id="5487521232677179737">Kustuta andmed</translation> <translation id="5494752089476963479">Blokeeri reklaamid saitidel, mis kuvavad sekkuvaid või eksitavaid reklaame</translation> @@ -731,6 +745,7 @@ <translation id="6406506848690869874">Sünkroonimine</translation> <translation id="641643625718530986">Printimine ...</translation> <translation id="6416782512398055893">Alla on laaditud <ph name="MBS" /> MB</translation> +<translation id="6418750371676080905">Seadmevalija, millega vahelehte jagatakse, on suletud.</translation> <translation id="6427112570124116297">Veebi tõlkimine</translation> <translation id="6433501201775827830">Valige oma otsingumootor</translation> <translation id="6437478888915024427">Lehe teave</translation> @@ -770,6 +785,7 @@ <translation id="666268767214822976">Aadressiribale teksti sisestamisel ennustusteenuse abil seotud päringute ja populaarsete veebisaitide kuvamine</translation> <translation id="666731172850799929">Ava rakenduses <ph name="APP_NAME" /></translation> <translation id="666981079809192359">Chrome'i privaatsusteatis</translation> +<translation id="6672986458216094438">Seadmevalija, millega vahelehte jagatakse, on avatud poole kõrgusega.</translation> <translation id="6697492270171225480">Kui lehte ei leita, kuvatakse sarnaste lehtede soovitusi</translation> <translation id="6697947395630195233">Chrome vajab juurdepääsu teie asukohale, et seda selle saidiga jagada.</translation> <translation id="6698801883190606802">Sünkroonitud andmete haldamine</translation> @@ -947,6 +963,7 @@ <translation id="7942131818088350342">Teenus <ph name="PRODUCT_NAME" /> on aegunud.</translation> <translation id="7947953824732555851">Nõustu ja logi sisse</translation> <translation id="7963646190083259054">Teenusepakkuja:</translation> +<translation id="7971136598759319605">Aktiivne 1 päev tagasi</translation> <translation id="7975379999046275268">Lehe eelvaade <ph name="BEGIN_NEW" />Uus<ph name="END_NEW" /></translation> <translation id="7981313251711023384">Eellaaditakse lehti kiiremaks sirvimiseks ja otsimiseks</translation> <translation id="79859296434321399">Liitreaalsuse sisu vaatamiseks installige ARCore</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_fa.xtb b/chrome/android/java/strings/translations/android_chrome_strings_fa.xtb index 643455e..d6f5e7ac 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_fa.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_fa.xtb
@@ -223,6 +223,7 @@ <translation id="2567385386134582609">تصویر</translation> <translation id="257088987046510401">طرحهای قسمت</translation> <translation id="2570922361219980984">دسترسی به مکان برای این دستگاه نیز خاموش است. آن را در <ph name="BEGIN_LINK" />تنظیمات Android<ph name="END_LINK" /> روشن کنید.</translation> +<translation id="257674075312929031">گروه</translation> <translation id="257931822824936280">بزرگشده - برای کوچک کردن کلیک کنید.</translation> <translation id="2581165646603367611">این کار کوکیها، حافظه پنهان و دادههای دیگر سایتها را که از نظر Chrome مهم نیست پاک میکند.</translation> <translation id="2586657967955657006">بریدهدان</translation> @@ -274,6 +275,7 @@ <translation id="2956410042958133412"><ph name="PARENT_NAME_1" /> و <ph name="PARENT_NAME_2" /> این حساب را مدیریت میکنند.</translation> <translation id="2962095958535813455">به برگههای ناشناس تغییر یافت</translation> <translation id="2968755619301702150">بیننده گواهی</translation> +<translation id="2977480621796371840">برداشتن از گروه</translation> <translation id="2979025552038692506">برگه ناشناس انتخابشده</translation> <translation id="2989523299700148168">اخیراً دیدهشده</translation> <translation id="2996291259634659425">ایجاد عبارت عبور</translation> @@ -426,6 +428,12 @@ <translation id="4226663524361240545">اعلانها ممکن است دستگاه را بلرزانند</translation> <translation id="423219824432660969">رمزگذاری دادههای همگامسازیشده با گذرواژه Google از <ph name="TIME" /></translation> <translation id="4242533952199664413">باز کردن تنظیمات</translation> +<translation id="4247274662191902962">دادههای حسگر فقط زمانی همرسانی میشود که در این تجربه واقعیت مجازی باشید. این سایت ممکن است ازطریق بعضی از اطلاعات زیر، اطلاعاتی درباره شما دریافت کند: + - مکان شما + - ویژگیهای فیزیکی شما، مانند موقعیت چشمانتان + - حرکتهای شما، مانند نحوه راه رفتنتان + + قبل از دسترسی به این سایت، مطمئن شوید به آن اعتماد دارید.</translation> <translation id="424864128008805179">از سیستم Chrome خارج می شوید؟</translation> <translation id="4256782883801055595">مجوزهای منبع آزاد</translation> <translation id="4259722352634471385">پیمایش مسدود است: <ph name="URL" /></translation> @@ -598,6 +606,7 @@ <translation id="545042621069398927">درحال سرعت بخشیدن به بارگیری.</translation> <translation id="5456381639095306749">بارگیری صفحه</translation> <translation id="5475862044948910901">جلسه «واقعیت افزوده» شروع شود؟</translation> +<translation id="5481942164684849270"><ph name="APP_NAME" /> به برنامههای من اضافه شد</translation> <translation id="548278423535722844">باز کردن در برنامه Maps</translation> <translation id="5487521232677179737">پاک کردن دادهها</translation> <translation id="5494752089476963479">آگهی سایتهایی که آگهیهای مزاحم یا گمراهکننده نشان میدهند، مسدود میشود</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_fi.xtb b/chrome/android/java/strings/translations/android_chrome_strings_fi.xtb index cf32f2bd..464881c 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_fi.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_fi.xtb
@@ -2,6 +2,7 @@ <!DOCTYPE translationbundle> <translationbundle lang="fi"> <translation id="1006017844123154345">Avaa verkkoversio</translation> +<translation id="1028699632127661925">Lähetetään: <ph name="DEVICE_NAME" /></translation> <translation id="1036727731225946849">Lisätään <ph name="WEBAPK_NAME" />…</translation> <translation id="1041308826830691739">Verkkosivustoilta</translation> <translation id="1049743911850919806">Incognito</translation> @@ -43,6 +44,7 @@ <translation id="1260236875608242557">Hae ja tutki</translation> <translation id="1264974993859112054">Urheilu</translation> <translation id="1272079795634619415">Pysäytä</translation> +<translation id="1272444412400969138">Välilehden jakamisen kohdelaitteen valinta</translation> <translation id="1283039547216852943">Laajenna napauttamalla.</translation> <translation id="1285320974508926690">Älä käännä tätä sivustoa</translation> <translation id="1291207594882862231">Tyhjennä historia, evästeet, sivustojen tiedot, välimuisti ja niin edelleen.</translation> @@ -59,6 +61,7 @@ <translation id="138361230106469022">Hei, <ph name="FULL_NAME" /></translation> <translation id="1383876407941801731">Haku</translation> <translation id="1384959399684842514">Lataus keskeytettiin.</translation> +<translation id="1386674309198842382">Aktiivinen <ph name="LAST_UPDATED" /> päivää sitten</translation> <translation id="1389974829397082527">Ei kirjanmerkkejä</translation> <translation id="1397811292916898096">Hae nimellä <ph name="PRODUCT_NAME" /></translation> <translation id="1404122904123200417">Upotettu osoitteeseen <ph name="WEBSITE_URL" /></translation> @@ -223,6 +226,7 @@ <translation id="2567385386134582609">KUVA</translation> <translation id="257088987046510401">Teemat</translation> <translation id="2570922361219980984">Sijainti on poissa käytöstä myös tällä laitteella. Voit ottaa sen käyttöön <ph name="BEGIN_LINK" />Android-asetuksista<ph name="END_LINK" />.</translation> +<translation id="257674075312929031">Ryhmä</translation> <translation id="257931822824936280">Laajennettu – tiivistä klikkaamalla.</translation> <translation id="2581165646603367611">Evästeet, välimuisti ja muut Chromen vähemmän tärkeinä pitämät sivustotiedot poistetaan.</translation> <translation id="2586657967955657006">Leikepöytä</translation> @@ -274,6 +278,7 @@ <translation id="2956410042958133412">Tätä tiliä hallinnoivat <ph name="PARENT_NAME_1" /> ja <ph name="PARENT_NAME_2" />.</translation> <translation id="2962095958535813455">Vaihdettiin näkyviin incognito-välilehdet.</translation> <translation id="2968755619301702150">Varmennetiedot</translation> +<translation id="2977480621796371840">Poista ryhmästä</translation> <translation id="2979025552038692506">Valittu incognito-välilehti</translation> <translation id="2989523299700148168">Viimeksi käytetyt</translation> <translation id="2996291259634659425">Luo tunnuslause</translation> @@ -400,6 +405,7 @@ <translation id="4008040567710660924">Salli evästeet tietyllä sivustolla.</translation> <translation id="4034817413553209278">{HOURS,plural, =1{# h}other{# h}}</translation> <translation id="4042870126885713738">Näytä ehdotuksia, jos verkko-osoitetta ei tunnisteta tai yhteyttä ei voi muodostaa.</translation> +<translation id="4044912625106523635">Välilehden jakamisen kohdevalinta avataan koko näytön korkeudella.</translation> <translation id="4046123991198612571">Seuraava kappale</translation> <translation id="4048707525896921369">Lue lisätietoja verkkosivujen aiheista poistumatta sivulta. Napauttamalla hakeminen lähettää sanan ja sen asiayhteyden Google Hakuun ja palauttaa määritelmiä, kuvia, hakutuloksia ja muita tietoja. @@ -426,6 +432,12 @@ <translation id="4226663524361240545">Laite voi väristä ilmoitusten yhteydessä.</translation> <translation id="423219824432660969">Salaa synkronoitu data Google-salasanalla (<ph name="TIME" />)</translation> <translation id="4242533952199664413">Avaa asetukset</translation> +<translation id="4247274662191902962">Anturidataa jaetaan vain, kun käytät tätä VR-kokemusta. Sivusto voi saada sinusta tietoa käyttämällä esimerkiksi + – sijaintiasi + – fyysisiä piirteitäsi, kuten silmiesi sijaintia + – liikkeitäsi, kuten kävelytapaasi. + + Varmista, että sivusto on luotettava, ennen kuin myönnät sille käyttöoikeuden.</translation> <translation id="424864128008805179">Kirjaudutaanko ulos Chromesta?</translation> <translation id="4256782883801055595">Avoimen lähdekoodin käyttöluvat</translation> <translation id="4259722352634471385">Kohde on estetty: <ph name="URL" /></translation> @@ -571,6 +583,7 @@ <translation id="5271967389191913893">Laite ei voi avata ladattavaa sisältöä.</translation> <translation id="528192093759286357">Poistu koko näytön tilasta vetämällä näytön yläreunasta ja koskettamalla Takaisin-painiketta.</translation> <translation id="5284584623296338184">Kirjanmerkkeihin, historiaan, salasanoihin ja muihin asetuksiin tehtäviä muutoksia ei enää synkronoida Google-tilillesi. Olemassa olevia tietojasi säilytetään kuitenkin Google-tililläsi.</translation> +<translation id="5292796745632149097">Lähetä:</translation> <translation id="5300589172476337783">Näytä</translation> <translation id="5301954838959518834">Selvä</translation> <translation id="5304593522240415983">Kenttä ei voi olla tyhjä.</translation> @@ -598,6 +611,7 @@ <translation id="545042621069398927">Lataustasi nopeutetaan</translation> <translation id="5456381639095306749">Lataa sivu</translation> <translation id="5475862044948910901">Aloitetaanko lisätyn todellisuuden käyttökerta?</translation> +<translation id="5481942164684849270"><ph name="APP_NAME" /> lisätty omiin sovelluksiin</translation> <translation id="548278423535722844">Avaa karttasovelluksessa</translation> <translation id="5487521232677179737">Poista tiedot</translation> <translation id="5494752089476963479">Estä häiritseviä tai harhaanjohtavia mainoksia näyttävien sivustojen mainokset</translation> @@ -731,6 +745,7 @@ <translation id="6406506848690869874">Synkronointi</translation> <translation id="641643625718530986">Tulosta…</translation> <translation id="6416782512398055893">Ladattu: <ph name="MBS" /> Mt</translation> +<translation id="6418750371676080905">Välilehden jakamisen kohdevalinta on suljettu.</translation> <translation id="6427112570124116297">Käännä verkon sisältö</translation> <translation id="6433501201775827830">Valitse hakukone</translation> <translation id="6437478888915024427">Sivun tiedot</translation> @@ -770,6 +785,7 @@ <translation id="666268767214822976">Käytä ennakointipalvelua, joka näyttää sinulle aiheeseen liittyviä kyselyitä sekä suosittuja verkkosivustoja kirjoittaessasi osoitepalkkiin.</translation> <translation id="666731172850799929">Avaa sovelluksessa <ph name="APP_NAME" /></translation> <translation id="666981079809192359">Chromen tietosuojailmoitus</translation> +<translation id="6672986458216094438">Välilehden jakamisen kohdevalinta avataan puolen näytön korkeudella.</translation> <translation id="6697492270171225480">Näytä ehdotuksia samankaltaisista sivuista, kun sivua ei löydy</translation> <translation id="6697947395630195233">Chrome tarvitsee oikeuden käyttää sijaintiasi, jotta se voidaan jakaa tämän sivuston kanssa.</translation> <translation id="6698801883190606802">Hallinnoi synkronoituja tietoja</translation> @@ -947,6 +963,7 @@ <translation id="7942131818088350342"><ph name="PRODUCT_NAME" /> on vanhentunut.</translation> <translation id="7947953824732555851">Hyväksy ja kirjaudu sisään</translation> <translation id="7963646190083259054">Toimittaja:</translation> +<translation id="7971136598759319605">Aktiivinen 1 päivä sitten</translation> <translation id="7975379999046275268">Esikatsele sivu <ph name="BEGIN_NEW" />Uusi<ph name="END_NEW" /></translation> <translation id="7981313251711023384">Esilataa sivuja nopeuttaaksesi lataamista ja hakemista</translation> <translation id="79859296434321399">Asenna ARCore, niin voit nähdä AR-sisältöä.</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_fil.xtb b/chrome/android/java/strings/translations/android_chrome_strings_fil.xtb index 3c8e890..7d225a9 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_fil.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_fil.xtb
@@ -223,6 +223,7 @@ <translation id="2567385386134582609">LARAWAN</translation> <translation id="257088987046510401">Mga tema</translation> <translation id="2570922361219980984">Naka-off din ang access sa lokasyon para sa device na ito. I-on ito sa <ph name="BEGIN_LINK" />Mga Setting ng Android<ph name="END_LINK" />.</translation> +<translation id="257674075312929031">Pangkat</translation> <translation id="257931822824936280">Pinalawak - i-click upang i-collapse.</translation> <translation id="2581165646603367611">Iki-clear nito ang cookies, cache at iba pang data ng mga site na sa tingin ng Chrome ay hindi mahalaga.</translation> <translation id="2586657967955657006">Clipboard</translation> @@ -257,7 +258,7 @@ <translation id="2836148919159985482">Pindutin ang button na bumalik upang lumabas sa full screen.</translation> <translation id="2842985007712546952">Pangunahing folder</translation> <translation id="2845873210977809562">Nakasara ang mga binuksang tab</translation> -<translation id="2858138569776157458">Sikat site</translation> +<translation id="2858138569776157458">Top na sites</translation> <translation id="2870560284913253234">Site</translation> <translation id="2874939134665556319">Nakaraang track</translation> <translation id="2876369937070532032">Ipadala ang mga URL ng ilang page na binibisita mo sa Google kapag nanganganib ang iyong seguridad</translation> @@ -274,6 +275,7 @@ <translation id="2956410042958133412">Pinapamahalaan ang account na ito ng <ph name="PARENT_NAME_1" /> at <ph name="PARENT_NAME_2" />.</translation> <translation id="2962095958535813455">Lumipat sa mga tab na incognito</translation> <translation id="2968755619301702150">Viewer ng certificate</translation> +<translation id="2977480621796371840">Alisin sa grupo</translation> <translation id="2979025552038692506">Napiling Tab na Incognito</translation> <translation id="2989523299700148168">Mga kamakailang binisita</translation> <translation id="2996291259634659425">Gumawa ng passphrase</translation> @@ -426,6 +428,12 @@ <translation id="4226663524361240545">Maaaring mag-vibrate ang device dahil sa mga notification</translation> <translation id="423219824432660969">I-encrypt ang naka-sync na data gamit ang password sa Google simula noong <ph name="TIME" /></translation> <translation id="4242533952199664413">Buksan ang mga setting</translation> +<translation id="4247274662191902962">Ibabahagi lang ang data ng sensor habang ikaw ay nasa VR experience na ito. Puwedeng matuto ang site tungkol sa iyo gamit ang ilang partikular na impormasyon, gaya ng: + - Iyong lokasyon + - Iyong mga pisikal na feature, gaya ng posisyon ng mata + - Iyong mga pagkilos, gaya ng kung paano ka maglakad + + Tiyaking pinagkakatiwalaan mo ang site na ito bago mo payagan ang pag-access.</translation> <translation id="424864128008805179">Mag-sign out sa Chrome?</translation> <translation id="4256782883801055595">Mga lisensya ng open source</translation> <translation id="4259722352634471385">Naka-block ang navigation: <ph name="URL" /></translation> @@ -598,6 +606,7 @@ <translation id="545042621069398927">Pinapabilis ang iyong pag-download.</translation> <translation id="5456381639095306749">I-download ang page</translation> <translation id="5475862044948910901">Magsimula ng session ng Augmented Reality?</translation> +<translation id="5481942164684849270">Idinagdag ang <ph name="APP_NAME" /> sa aking mga app</translation> <translation id="548278423535722844">Buksan sa app na mga mapa</translation> <translation id="5487521232677179737">I-clear ang data</translation> <translation id="5494752089476963479">I-block ang mga ad sa mga site na nagpapakita ng mga nakakasagabal o nakakapanlinlang na ad</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_fr.xtb b/chrome/android/java/strings/translations/android_chrome_strings_fr.xtb index e418143..cdc104d0 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_fr.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_fr.xtb
@@ -2,6 +2,7 @@ <!DOCTYPE translationbundle> <translationbundle lang="fr"> <translation id="1006017844123154345">Ouvrir la version en ligne</translation> +<translation id="1028699632127661925">Envoi sur <ph name="DEVICE_NAME" />…</translation> <translation id="1036727731225946849">Ajout de <ph name="WEBAPK_NAME" />…</translation> <translation id="1041308826830691739">À partir de sites Web</translation> <translation id="1049743911850919806">Navigation privée</translation> @@ -20,7 +21,7 @@ <translation id="1145536944570833626">Supprimer les données existantes.</translation> <translation id="1146678959555564648">Activer la réalité virtuelle</translation> <translation id="116280672541001035">Utilisées</translation> -<translation id="1171770572613082465">Appuyez sur le bouton "Sites prisés" pour afficher les sites Web populaires</translation> +<translation id="1171770572613082465">Appuyez sur le bouton "Sites populaires" pour afficher les sites Web les plus visités</translation> <translation id="1172593791219290334">Page de démarrage</translation> <translation id="1173894706177603556">Renommer</translation> <translation id="1175310183703641346">Vos favoris, votre historique, vos mots de passe et d'autres paramètres ne seront plus synchronisés avec votre compte Google</translation> @@ -43,6 +44,7 @@ <translation id="1260236875608242557">Rechercher et explorer</translation> <translation id="1264974993859112054">Sports</translation> <translation id="1272079795634619415">Arrêter</translation> +<translation id="1272444412400969138">Outil de sélection de l'appareil avec lequel partager un onglet.</translation> <translation id="1283039547216852943">Appuyer pour développer</translation> <translation id="1285320974508926690">Ne jamais traduire ce site</translation> <translation id="1291207594882862231">Efface l'historique, vider le cache, supprimer les cookies et les données de site…</translation> @@ -59,6 +61,7 @@ <translation id="138361230106469022">Bonjour "<ph name="FULL_NAME" />"</translation> <translation id="1383876407941801731">Rechercher</translation> <translation id="1384959399684842514">Téléchargement suspendu</translation> +<translation id="1386674309198842382">Actif il y a <ph name="LAST_UPDATED" /> jours</translation> <translation id="1389974829397082527">Aucun favori ici</translation> <translation id="1397811292916898096">Rechercher avec <ph name="PRODUCT_NAME" /></translation> <translation id="1404122904123200417">Intégration sur <ph name="WEBSITE_URL" /></translation> @@ -223,6 +226,7 @@ <translation id="2567385386134582609">IMAGE</translation> <translation id="257088987046510401">Thèmes</translation> <translation id="2570922361219980984">L'accès à la position est également désactivé pour cet appareil. Activez-le dans les <ph name="BEGIN_LINK" />paramètres Android<ph name="END_LINK" />.</translation> +<translation id="257674075312929031">Groupe</translation> <translation id="257931822824936280">Développé – Cliquer pour réduire</translation> <translation id="2581165646603367611">Cette action aura pour effet de vider le cache et de supprimer les cookies, ainsi que d'autres données de site que Chrome ne considère pas comme importantes.</translation> <translation id="2586657967955657006">Presse-papiers</translation> @@ -257,7 +261,7 @@ <translation id="2836148919159985482">Appuyez sur le bouton Retour pour quitter le mode plein écran.</translation> <translation id="2842985007712546952">Dossier parent</translation> <translation id="2845873210977809562">Onglets ouverts fermés</translation> -<translation id="2858138569776157458">Sites prisés</translation> +<translation id="2858138569776157458">Sites populaires</translation> <translation id="2870560284913253234">Site</translation> <translation id="2874939134665556319">Piste précédente</translation> <translation id="2876369937070532032">Envoyer à Google les URL des pages que vous consultez présentant un risque pour votre sécurité</translation> @@ -274,6 +278,7 @@ <translation id="2956410042958133412">Ce compte est géré par <ph name="PARENT_NAME_1" /> et <ph name="PARENT_NAME_2" />.</translation> <translation id="2962095958535813455">Onglets de navigation privée sélectionnés</translation> <translation id="2968755619301702150">Lecteur de certificat</translation> +<translation id="2977480621796371840">Retirer du groupe</translation> <translation id="2979025552038692506">Onglet de navigation privée sélectionné</translation> <translation id="2989523299700148168">Consultations récentes</translation> <translation id="2996291259634659425">Créer une phrase secrète</translation> @@ -400,6 +405,7 @@ <translation id="4008040567710660924">Autorisez les cookies pour un site spécifique.</translation> <translation id="4034817413553209278">{HOURS,plural, =1{# h}one{# h}other{# h}}</translation> <translation id="4042870126885713738">Afficher d'autres solutions lorsqu'une adresse Web ne peut pas être résolue ou qu'une connexion ne peut pas être établie</translation> +<translation id="4044912625106523635">L'outil de sélection de l'appareil avec lequel partager un onglet est ouvert à hauteur maximale.</translation> <translation id="4046123991198612571">Piste suivante</translation> <translation id="4048707525896921369">Découvrez les thèmes abordés sur les sites Web sans quitter la page. La fonctionnalité "Appuyer pour rechercher" transmet un mot et son contexte à la recherche Google, qui renvoie à son tour des définitions, des images, des résultats de recherche et d'autres informations. @@ -426,6 +432,12 @@ <translation id="4226663524361240545">L'appareil vibrera en cas de notifications.</translation> <translation id="423219824432660969">Chiffrer les données synchronisées avec le mot de passe Google à la date suivante : <ph name="TIME" /></translation> <translation id="4242533952199664413">Ouvrir les paramètres</translation> +<translation id="4247274662191902962">Les données du capteur ne seront partagées que durant l'expérience de réalité virtuelle. Le site peut retenir certaines informations vous concernant, par exemple : + – Votre position + – Vos caractéristiques physiques, par exemple la position de vos yeux + – Vos mouvements, par exemple votre démarche + + N'autorisez l'accès que si vous faites confiance à ce site.</translation> <translation id="424864128008805179">Se déconnecter de Chrome ?</translation> <translation id="4256782883801055595">Licences Open Source</translation> <translation id="4259722352634471385">La navigation sur <ph name="URL" /> est bloquée.</translation> @@ -571,6 +583,7 @@ <translation id="5271967389191913893">Impossible d'ouvrir le contenu à télécharger sur l'appareil.</translation> <translation id="528192093759286357">Pour quitter le mode plein écran, faites glisser un doigt du haut vers le bas, puis appuyez sur le bouton Retour.</translation> <translation id="5284584623296338184">Les modifications apportées à vos favoris, votre historique, vos mots de passe et d'autres paramètres ne seront plus synchronisées avec votre compte Google. Vos données seront cependant conservées dans votre compte Google.</translation> +<translation id="5292796745632149097">Envoyer sur</translation> <translation id="5300589172476337783">Afficher</translation> <translation id="5301954838959518834">OK</translation> <translation id="5304593522240415983">Champ obligatoire.</translation> @@ -598,6 +611,7 @@ <translation id="545042621069398927">Accélération du téléchargement…</translation> <translation id="5456381639095306749">Télécharger la page</translation> <translation id="5475862044948910901">Lancer une session en réalité augmentée ?</translation> +<translation id="5481942164684849270">Ajouté à mes applications : <ph name="APP_NAME" /></translation> <translation id="548278423535722844">Ouvrir dans une application de plans</translation> <translation id="5487521232677179737">Effacer les données</translation> <translation id="5494752089476963479">Bloquer les annonces sur les sites qui affichent des annonces intrusives ou trompeuses</translation> @@ -731,6 +745,7 @@ <translation id="6406506848690869874">Synchronisation</translation> <translation id="641643625718530986">Imprimer…</translation> <translation id="6416782512398055893"><ph name="MBS" /> Mo téléchargé(s)</translation> +<translation id="6418750371676080905">L'outil de sélection de l'appareil avec lequel partager un onglet est fermé.</translation> <translation id="6427112570124116297">Traduire le Web</translation> <translation id="6433501201775827830">Sélectionner votre moteur de recherche</translation> <translation id="6437478888915024427">Infos sur la page</translation> @@ -770,6 +785,7 @@ <translation id="666268767214822976">Utiliser un service de prédiction pour suggérer des requêtes associées et des sites populaires lorsque vous saisissez des termes dans la barre d'adresse</translation> <translation id="666731172850799929">Ouvrir dans <ph name="APP_NAME" /></translation> <translation id="666981079809192359">Avis de confidentialité de Chrome</translation> +<translation id="6672986458216094438">L'outil de sélection de l'appareil avec lequel partager un onglet est ouvert à mi-hauteur.</translation> <translation id="6697492270171225480">Afficher des suggestions de pages similaires lorsqu'une page est introuvable</translation> <translation id="6697947395630195233">Chrome a besoin d'accéder à votre position pour la partager avec ce site.</translation> <translation id="6698801883190606802">Gérer les données synchronisées</translation> @@ -947,6 +963,7 @@ <translation id="7942131818088350342"><ph name="PRODUCT_NAME" /> est obsolète.</translation> <translation id="7947953824732555851">Accepter/Se connecter</translation> <translation id="7963646190083259054">Fournisseur :</translation> +<translation id="7971136598759319605">Actif il y a 1 jour</translation> <translation id="7975379999046275268">Prévisualiser la page <ph name="BEGIN_NEW" />Nouveau<ph name="END_NEW" /></translation> <translation id="7981313251711023384">Précharger les pages pour accélérer la navigation et la recherche</translation> <translation id="79859296434321399">Pour afficher des contenus en réalité augmentée, installez ARCore</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_gu.xtb b/chrome/android/java/strings/translations/android_chrome_strings_gu.xtb index e6b8fc2b..fb01181 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_gu.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_gu.xtb
@@ -223,6 +223,7 @@ <translation id="2567385386134582609">છબી</translation> <translation id="257088987046510401">થીમ્સ</translation> <translation id="2570922361219980984">આ ઉપકરણ માટે સ્થાન ઍક્સેસ પણ બંધ છે. તેને <ph name="BEGIN_LINK" />Android સેટિંગ<ph name="END_LINK" />માં ચાલુ કરો.</translation> +<translation id="257674075312929031">જૂથ</translation> <translation id="257931822824936280">વિસ્તૃત - સંકુચિત કરવા માટે ક્લિક કરો.</translation> <translation id="2581165646603367611">આ કુકી, કૅશ અને Chromeને લાગતું હોય કે આ મહત્વનું નથી એવા સાઇટના બીજા ડેટાને સાફ કરશે.</translation> <translation id="2586657967955657006">ક્લિપબોર્ડ</translation> @@ -274,6 +275,7 @@ <translation id="2956410042958133412">આ એકાઉન્ટ <ph name="PARENT_NAME_1" /> અને <ph name="PARENT_NAME_2" /> દ્વારા મેનેજ થાય છે.</translation> <translation id="2962095958535813455">છૂપા ટૅબ્સ પર સ્વિચ કર્યું</translation> <translation id="2968755619301702150">પ્રમાણપત્ર દર્શક</translation> +<translation id="2977480621796371840">ગ્રૂપમાંથી દૂર કરો</translation> <translation id="2979025552038692506">પસંદ કરેલ છૂપું ટૅબ</translation> <translation id="2989523299700148168">તાજેતરમાં મુલાકાત લીધેલ</translation> <translation id="2996291259634659425">પાસફ્રેઝ બનાવો</translation> @@ -426,6 +428,12 @@ <translation id="4226663524361240545">સૂચનાઓ ઉપકરણને વાઇબ્રેટ કરી શકે છે</translation> <translation id="423219824432660969"><ph name="TIME" /> પ્રમાણે Google પાસવર્ડ વડે સિંક કરેલા ડેટાને એન્ક્રિપ્ટ કરો</translation> <translation id="4242533952199664413">સેટિંગ્સ ખોલો</translation> +<translation id="4247274662191902962">તમે આ VR અનુભવમાં હશો, ત્યારે જ સેન્સરનો ડેટા શેર કરવામાં આવશે. આ સાઇટ અમુક ચોક્કસ માહિતીનો ઉપયોગ કરીને કદાચ તમારા વિશેની માહિતી મેળવી શકશે, જેમ કે: + - તમારું સ્થાન + - તમારી શારીરિક લાક્ષણિકતાઓ, જેમ કે તમારી આંખની સ્થિતિ + - તમારું હલનચલન, જેમ કે તમારી ચાલવાની રીત + + તમે ઍક્સેસ માટે મંજૂરી આપો તે પહેલાં ખાતરી કરો કે તમે આ સાઇટ પર વિશ્વાસ મૂકો છો.</translation> <translation id="424864128008805179">Chromeમાંથી સાઇન આઉટ કરીએ?</translation> <translation id="4256782883801055595">ઓપન સોર્સ લાઇસન્સ</translation> <translation id="4259722352634471385">નેવિગેશન અવરોધિત છે: <ph name="URL" /></translation> @@ -598,6 +606,7 @@ <translation id="545042621069398927">તમારા ડાઉનલોડની ગતિ વધારી રહ્યાં છીએ.</translation> <translation id="5456381639095306749">પૃષ્ઠ ડાઉનલોડ કરો</translation> <translation id="5475862044948910901">ઑગ્મેન્ટેડ રિયાલિટી સત્ર શરૂ કરીએ?</translation> +<translation id="5481942164684849270"><ph name="APP_NAME" />ને મારી ઍપમાં ઉમેરી</translation> <translation id="548278423535722844">નકશા અૅપ્લિકેશનમાં ખોલો</translation> <translation id="5487521232677179737">ડેટા સાફ કરો</translation> <translation id="5494752089476963479">ઘૃણાસ્પદ અથવા ભ્રામક જાહેરાતો બતાવતી સાઇટ પરથી જાહેરાતો બ્લૉક કરો</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_hi.xtb b/chrome/android/java/strings/translations/android_chrome_strings_hi.xtb index fdd0fa1..e022681b 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_hi.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_hi.xtb
@@ -223,6 +223,7 @@ <translation id="2567385386134582609">इमेज</translation> <translation id="257088987046510401">थीम</translation> <translation id="2570922361219980984">इस डिवाइस के लिए जगह की जानकारी का एक्सेस भी बंद है. उसे <ph name="BEGIN_LINK" />Android सेटिंग<ph name="END_LINK" /> में चालू करें.</translation> +<translation id="257674075312929031">समूह</translation> <translation id="257931822824936280">बड़ा किया गया - छोटा करने के लिए क्लिक करें.</translation> <translation id="2581165646603367611">यह साइट की कुकी, कैश और अन्य डेटा निकाल देगा जो Chrome के विचार में महत्वपूर्ण नहीं है.</translation> <translation id="2586657967955657006">क्लिपबोर्ड</translation> @@ -274,6 +275,7 @@ <translation id="2956410042958133412">यह खाता <ph name="PARENT_NAME_1" /> और <ph name="PARENT_NAME_2" /> के द्वारा प्रबंधित है.</translation> <translation id="2962095958535813455">गुप्त टैब पर स्विच कर दिया गया</translation> <translation id="2968755619301702150">प्रमाणपत्र व्यूअर</translation> +<translation id="2977480621796371840">समूह से हटाएं</translation> <translation id="2979025552038692506">चयनित गुप्त टैब</translation> <translation id="2989523299700148168">हाल ही में देखे गए</translation> <translation id="2996291259634659425">'पासफ़्रेज़' बनाएं</translation> @@ -426,6 +428,12 @@ <translation id="4226663524361240545">नोटिफ़िकेशन से डिवाइस में कंपन हो सकता है</translation> <translation id="423219824432660969"><ph name="TIME" /> तक का सुरक्षित किया गया किया गया डेटा 'Google पासवर्ड' से सिंक करें</translation> <translation id="4242533952199664413">सेटिंग खोलें</translation> +<translation id="4247274662191902962">कुछ सेंसर डेटा को तब ही शेयर किया जाएगा जब आप इस VR अनुभव में होंगे. खास जानकारी का इस्तेमाल करके साइट आपको पहचान सकती है, जैसे: + - आपकी जगह की जानकारी + - आपकी शारीरिक बनावट, जैसे कि आँखों की स्थिति + - आपकी गतिविधि, जैसे कि आप कैसे चलते हैं + + एक्सेस देने से पहले इस बात की पुष्टि कर लें कि आप इस साइट पर भरोसा करते हैं.</translation> <translation id="424864128008805179">Chrome से साइन आउट करें?</translation> <translation id="4256782883801055595">ओपन सोर्स लाइसेंस</translation> <translation id="4259722352634471385">मार्गदर्शक अवरोधित है: <ph name="URL" /></translation> @@ -598,6 +606,7 @@ <translation id="545042621069398927">आपके डाउनलोड की गति बढ़ाई जा रही है.</translation> <translation id="5456381639095306749">पेज डाउनलोड करें</translation> <translation id="5475862044948910901">ऑगमेंटेड रिएलिटी (AR) सत्र शुरू करें?</translation> +<translation id="5481942164684849270"><ph name="APP_NAME" /> 'मेरे ऐप्लिकेशन' में जोड़ा गया</translation> <translation id="548278423535722844">मैप ऐप्लिकेशन में खोलें</translation> <translation id="5487521232677179737">डेटा साफ़ करें</translation> <translation id="5494752089476963479">तंग करने वाले या गुमराह करने वाले विज्ञापन दिखाने वाली साइटों पर विज्ञापन ब्लॉक करें</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_hr.xtb b/chrome/android/java/strings/translations/android_chrome_strings_hr.xtb index 807ad75..6a93e61f 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_hr.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_hr.xtb
@@ -2,6 +2,7 @@ <!DOCTYPE translationbundle> <translationbundle lang="hr"> <translation id="1006017844123154345">Otvori online</translation> +<translation id="1028699632127661925">Šalje se uređaju <ph name="DEVICE_NAME" />...</translation> <translation id="1036727731225946849">Dodavanje stavke <ph name="WEBAPK_NAME" />...</translation> <translation id="1041308826830691739">S web-lokacija</translation> <translation id="1049743911850919806">Anonimno</translation> @@ -43,6 +44,7 @@ <translation id="1260236875608242557">Pretraživanje i istraživanje</translation> <translation id="1264974993859112054">Sport</translation> <translation id="1272079795634619415">Zaustavi</translation> +<translation id="1272444412400969138">Alat za odabir uređaja s kojim će se dijeliti kartica.</translation> <translation id="1283039547216852943">Dodirnite za proširivanje</translation> <translation id="1285320974508926690">Nikad nemoj prevoditi ovu web-lokaciju</translation> <translation id="1291207594882862231">Brisanje povijesti, kolačića, podataka web-lokacija, predmemorije...</translation> @@ -59,6 +61,7 @@ <translation id="138361230106469022">Pozdrav, <ph name="FULL_NAME" /></translation> <translation id="1383876407941801731">Traži</translation> <translation id="1384959399684842514">Preuzimanje je pauzirano</translation> +<translation id="1386674309198842382">Aktivan prije <ph name="LAST_UPDATED" /> dana</translation> <translation id="1389974829397082527">Nema nijedne oznake</translation> <translation id="1397811292916898096">Pretraživanje pomoću usluge <ph name="PRODUCT_NAME" /></translation> <translation id="1404122904123200417">Ugrađeno u <ph name="WEBSITE_URL" /></translation> @@ -223,6 +226,7 @@ <translation id="2567385386134582609">SLIKA</translation> <translation id="257088987046510401">Teme</translation> <translation id="2570922361219980984">Pristup lokaciji isključen je i za ovaj uređaj. Uključite ga u <ph name="BEGIN_LINK" />postavkama Androida<ph name="END_LINK" />.</translation> +<translation id="257674075312929031">Grupa</translation> <translation id="257931822824936280">Prošireno – kliknite za sažimanje.</translation> <translation id="2581165646603367611">Time će se izbrisati kolačići, predmemorija i ostali podaci o web-lokacijama koje Chrome ne smatra važnima.</translation> <translation id="2586657967955657006">Međuspremnik</translation> @@ -274,6 +278,7 @@ <translation id="2956410042958133412">Računom upravljaju <ph name="PARENT_NAME_1" /> i <ph name="PARENT_NAME_2" />.</translation> <translation id="2962095958535813455">Prešli ste na anonimne kartice</translation> <translation id="2968755619301702150">Preglednik certifikata</translation> +<translation id="2977480621796371840">Ukloni iz grupe</translation> <translation id="2979025552038692506">Odabrana anonimna kartica</translation> <translation id="2989523299700148168">Nedavno posjećeno</translation> <translation id="2996291259634659425">Stvaranje zaporke</translation> @@ -400,6 +405,7 @@ <translation id="4008040567710660924">Dopusti kolačiće za određenu web-lokaciju.</translation> <translation id="4034817413553209278">{HOURS,plural, =1{# h}one{# h}few{# h}other{# h}}</translation> <translation id="4042870126885713738">Prikaži prijedloge kada se ne razriješi web-adresa ili nije moguće uspostaviti vezu</translation> +<translation id="4044912625106523635">Alat za odabir uređaja s kojim će se dijeliti kartica otvoren je u punoj visini.</translation> <translation id="4046123991198612571">Sljedeća pjesma</translation> <translation id="4048707525896921369">Saznajte više o temama na web-lokacijama izravno na stranici. Značajka Dodirnite za pretraživanje Google pretraživanju šalje riječ i njezin kontekst, a vraća definicije, slike, rezultate pretraživanja i druge pojedinosti. @@ -426,6 +432,12 @@ <translation id="4226663524361240545">Obavijesti mogu uključiti vibriranje uređaja</translation> <translation id="423219824432660969">Kriptiraj sinkronizirane podatke pomoću Googleove zaporke od <ph name="TIME" /></translation> <translation id="4242533952199664413">Otvori postavke</translation> +<translation id="4247274662191902962">Podaci senzora dijelit će se samo dok ste u tom VR doživljaju. Web-lokacija možda može saznati nešto o vama na temelju određenih informacija, na primjer: + – vaše lokacije + – vaših fizičkih značajki, primjerice položaja očiju + – vašeg kretanja, primjerice načina hoda. + + Prije nego što omogućite pristup, provjerite je li ta web-lokacija pouzdana.</translation> <translation id="424864128008805179">Želite li se odjaviti s Chromea?</translation> <translation id="4256782883801055595">Licence otvorenog koda</translation> <translation id="4259722352634471385">Otvaranje je blokirano: <ph name="URL" /></translation> @@ -571,6 +583,7 @@ <translation id="5271967389191913893">Uređaj ne može otvoriti sadržaj za preuzimanje.</translation> <translation id="528192093759286357">Povucite od vrha zaslona i dodirnite gumb Natrag da biste zatvorili prikaz na cijelom zaslonu.</translation> <translation id="5284584623296338184">Promjene oznaka, povijesti, zaporki i drugih postavki više se neće sinkronizirati s vašim Google računom. No vaši postojeći podaci ostat će pohranjeni na vašem Google računu.</translation> +<translation id="5292796745632149097">Pošalji na uređaj</translation> <translation id="5300589172476337783">Prikaži</translation> <translation id="5301954838959518834">U redu, shvaćam</translation> <translation id="5304593522240415983">To polje ne može biti prazno</translation> @@ -598,6 +611,7 @@ <translation id="545042621069398927">Ubrzavanje preuzimanja.</translation> <translation id="5456381639095306749">Preuzmi stranicu</translation> <translation id="5475862044948910901">Želite li pokrenuti sesiju proširene stvarnosti?</translation> +<translation id="5481942164684849270">Aplikacija <ph name="APP_NAME" /> dodana je u Moje aplikacije</translation> <translation id="548278423535722844">Otvori u aplikaciji za karte</translation> <translation id="5487521232677179737">Izbriši podatke</translation> <translation id="5494752089476963479">Blokiraj oglase na web-lokacijama koje prikazuju ometajuće ili obmanjujuće oglase</translation> @@ -731,6 +745,7 @@ <translation id="6406506848690869874">Sinkronizacija</translation> <translation id="641643625718530986">Ispis…</translation> <translation id="6416782512398055893">Preuzeto <ph name="MBS" /> MB</translation> +<translation id="6418750371676080905">Alat za odabir uređaja s kojim će se dijeliti kartica zatvoren je.</translation> <translation id="6427112570124116297">Prijevod weba</translation> <translation id="6433501201775827830">Odaberite tražilicu</translation> <translation id="6437478888915024427">Informacije o stranici</translation> @@ -770,6 +785,7 @@ <translation id="666268767214822976">Upotrijebi uslugu predviđanja za prikaz srodnih upita i popularnih web-lokacija prilikom upisivanja u adresnu traku</translation> <translation id="666731172850799929">Otvori u aplikaciji <ph name="APP_NAME" /></translation> <translation id="666981079809192359">Obavijest o privatnosti za Chrome</translation> +<translation id="6672986458216094438">Alat za odabir uređaja s kojim će se dijeliti kartica otvoren je na pola visine.</translation> <translation id="6697492270171225480">Prikaži prijedloge za slične stranice kada se stranica ne može pronaći</translation> <translation id="6697947395630195233">Chrome treba dopuštenje za pristup vašoj lokaciji da bi je podijelio s ovom web-lokacijom.</translation> <translation id="6698801883190606802">Upravljanje sinkroniziranim podacima</translation> @@ -947,6 +963,7 @@ <translation id="7942131818088350342">Proizvod <ph name="PRODUCT_NAME" /> zastario je.</translation> <translation id="7947953824732555851">Prihv. i prijavi se</translation> <translation id="7963646190083259054">Dobavljač:</translation> +<translation id="7971136598759319605">Aktivan prije jednog dana</translation> <translation id="7975379999046275268">Pregled stranice <ph name="BEGIN_NEW" />Novo<ph name="END_NEW" /></translation> <translation id="7981313251711023384">Prethodno učitaj stranice za brže pregledavanje i pretraživanje</translation> <translation id="79859296434321399">Za prikaz sadržaja proširene stvarnosti instalirajte ARCore</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_hu.xtb b/chrome/android/java/strings/translations/android_chrome_strings_hu.xtb index 6c072f3ef..726cc86 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_hu.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_hu.xtb
@@ -2,6 +2,7 @@ <!DOCTYPE translationbundle> <translationbundle lang="hu"> <translation id="1006017844123154345">Online megnyitás</translation> +<translation id="1028699632127661925">Küldés a következő eszközre: <ph name="DEVICE_NAME" />…</translation> <translation id="1036727731225946849"><ph name="WEBAPK_NAME" /> hozzáadása…</translation> <translation id="1041308826830691739">Webhelyekről</translation> <translation id="1049743911850919806">Inkognitómód</translation> @@ -43,6 +44,7 @@ <translation id="1260236875608242557">Keresés és felfedezés</translation> <translation id="1264974993859112054">Sport</translation> <translation id="1272079795634619415">Leállítás</translation> +<translation id="1272444412400969138">Eszközválasztó a lap megosztásához.</translation> <translation id="1283039547216852943">Koppintson a kibontáshoz</translation> <translation id="1285320974508926690">Ezt a webhelyet soha ne fordítsa le</translation> <translation id="1291207594882862231">Előzmények, cookie-k, webhelyadatok és a gyorsítótár törlése…</translation> @@ -59,6 +61,7 @@ <translation id="138361230106469022">Üdv, <ph name="FULL_NAME" />!</translation> <translation id="1383876407941801731">Keresés</translation> <translation id="1384959399684842514">A letöltés szünetel</translation> +<translation id="1386674309198842382"><ph name="LAST_UPDATED" /> napja volt aktív</translation> <translation id="1389974829397082527">Itt nincsenek könyvjelzők</translation> <translation id="1397811292916898096">Keresés a(z) <ph name="PRODUCT_NAME" /> keresőmotorral</translation> <translation id="1404122904123200417">Beágyazva itt: <ph name="WEBSITE_URL" /></translation> @@ -223,6 +226,7 @@ <translation id="2567385386134582609">KÉP</translation> <translation id="257088987046510401">Témák</translation> <translation id="2570922361219980984">A helyhozzáférés is ki van kapcsolva ennél az eszköznél. A funkciót az <ph name="BEGIN_LINK" />Android-beállításokban<ph name="END_LINK" /> tudja bekapcsolni.</translation> +<translation id="257674075312929031">Csoport</translation> <translation id="257931822824936280">Kibontva – kattintson az összecsukáshoz.</translation> <translation id="2581165646603367611">Ezzel törli a cookie-kat, a gyorsítótárat, valamint a webhelyek összes olyan adatát, amelyről a Chrome úgy véli, hogy nem fontos.</translation> <translation id="2586657967955657006">Vágólap</translation> @@ -274,6 +278,7 @@ <translation id="2956410042958133412">A fiók kezelői: <ph name="PARENT_NAME_1" /> és <ph name="PARENT_NAME_2" />.</translation> <translation id="2962095958535813455">Átváltva az inkognitómódban használt lapokra</translation> <translation id="2968755619301702150">Tanúsítványmegtekintő</translation> +<translation id="2977480621796371840">Eltávolítás a csoportból</translation> <translation id="2979025552038692506">Kiválasztott inkognitólap</translation> <translation id="2989523299700148168">Legutóbb látogatott</translation> <translation id="2996291259634659425">Összetett jelszó létrehozása</translation> @@ -400,6 +405,7 @@ <translation id="4008040567710660924">Adott webhely cookie-jainak engedélyezése.</translation> <translation id="4034817413553209278">{HOURS,plural, =1{# órája}other{# órája}}</translation> <translation id="4042870126885713738">Javaslatok megjelenítése, ha egy internetcímet nem lehet feloldani, vagy nem lehet kapcsolódni</translation> +<translation id="4044912625106523635">A lap megosztásához használt eszközválasztó teljes magasságban van megnyitva.</translation> <translation id="4046123991198612571">Következő szám</translation> <translation id="4048707525896921369">Megtudhatja a webhelyek témaköreit anélkül, hogy elhagyná az oldalt. A Keresés koppintással funkció elküld egy szót és annak kontextusát a Google Keresés számára, majd meghatározásokat, képeket, keresési eredményeket és egyéb részleteket ad vissza. @@ -426,6 +432,12 @@ <translation id="4226663524361240545">Az értesítések miatt rezeghet az eszköz</translation> <translation id="423219824432660969">A szinkronizált adatok titkosítása Google-jelszóval ekkortól: <ph name="TIME" /></translation> <translation id="4242533952199664413">Beállítások megnyitása</translation> +<translation id="4247274662191902962">A szenzoradatok megosztására csak addig kerül sor, amíg fut ez a VR-élmény. A webhely tanulhat Önről bizonyos információk, például a következők alapján: + – tartózkodási hely; + – fizikai jellemzők (például a szemei elhelyezkedése); + – mozgás (például a járásmódja). + + A hozzáférés engedélyezése előtt bizonyosodjon meg arról, hogy a webhely megbízható.</translation> <translation id="424864128008805179">Kijelentkezés a Chrome-ból</translation> <translation id="4256782883801055595">Nyílt forráskódú licencek</translation> <translation id="4259722352634471385">Le van tiltva az ide vezető navigáció: <ph name="URL" /></translation> @@ -571,6 +583,7 @@ <translation id="5271967389191913893">Az eszköz nem tudja megnyitni a letölteni kívánt tartalmat.</translation> <translation id="528192093759286357">A teljes képernyős megjelenítésből való kilépéshez húzza le felülről, majd koppintson a vissza gombra.</translation> <translation id="5284584623296338184">Könyvjelzői, előzményei, jelszavai és más beállításai a továbbiakban már nem lesznek szinkronizálva Google-fiókjával. Meglévő adatainak tárolása azonban továbbra is megmarad Google-fiókjában.</translation> +<translation id="5292796745632149097">Küldés a következőre:</translation> <translation id="5300589172476337783">Megjelenítés</translation> <translation id="5301954838959518834">Rendben, értem</translation> <translation id="5304593522240415983">Ez a mező nem lehet üres</translation> @@ -598,6 +611,7 @@ <translation id="545042621069398927">Letöltés felgyorsítása…</translation> <translation id="5456381639095306749">Oldal letöltése</translation> <translation id="5475862044948910901">Elindítja a kiterjesztett valóságot (AR) használó munkamenetet?</translation> +<translation id="5481942164684849270"><ph name="APP_NAME" /> hozzáadva a saját alkalmazásokhoz</translation> <translation id="548278423535722844">Megnyitás térképalkalmazásban</translation> <translation id="5487521232677179737">Adatok törlése</translation> <translation id="5494752089476963479">Hirdetések letiltása a tolakodó és félrevezető hirdetéseket megjelenítő webhelyeken</translation> @@ -731,6 +745,7 @@ <translation id="6406506848690869874">Szinkronizálás</translation> <translation id="641643625718530986">Nyomtatás…</translation> <translation id="6416782512398055893"><ph name="MBS" /> MB letöltve</translation> +<translation id="6418750371676080905">A lap megosztására szolgáló eszközválasztó be van zárva.</translation> <translation id="6427112570124116297">Lefordíthatja az internetet</translation> <translation id="6433501201775827830">Keresőmotor kiválasztása</translation> <translation id="6437478888915024427">Oldaladatok</translation> @@ -770,6 +785,7 @@ <translation id="666268767214822976">„Várható kifejezések” szolgáltatás használata a kapcsolódó lekérdezések és népszerű webhelyek megjelenítéséhez a címsávban történő gépelés során.</translation> <translation id="666731172850799929">Megnyitás itt: <ph name="APP_NAME" /></translation> <translation id="666981079809192359">Chrome – Adatvédelmi közlemény</translation> +<translation id="6672986458216094438">A lap megosztásához használt eszközválasztó félmagasságban van megnyitva.</translation> <translation id="6697492270171225480">Hasonló oldalakra vonatkozó javaslatok megjelenítése, ha az oldal nem található</translation> <translation id="6697947395630195233">A Chrome-nak hozzáférésre van szüksége a helyadatokra ahhoz, hogy megoszthassa a webhellyel az Ön tartózkodási helyét.</translation> <translation id="6698801883190606802">Szinkronizálás kezelése</translation> @@ -947,6 +963,7 @@ <translation id="7942131818088350342">A(z) <ph name="PRODUCT_NAME" /> elavult.</translation> <translation id="7947953824732555851">Elfogadás és bejelentkezés</translation> <translation id="7963646190083259054">Szolgáltató:</translation> +<translation id="7971136598759319605">1 napja volt aktív</translation> <translation id="7975379999046275268">Oldal előnézete <ph name="BEGIN_NEW" />Új<ph name="END_NEW" /></translation> <translation id="7981313251711023384">Oldalak előtöltése a gyorsabb böngészés és keresés érdekében</translation> <translation id="79859296434321399">A kiterjesztett valósággal kapcsolatos tartalmak megtekintéséhez telepítse az ARCore-t</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_id.xtb b/chrome/android/java/strings/translations/android_chrome_strings_id.xtb index 228887b8..4bebbf37 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_id.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_id.xtb
@@ -223,6 +223,7 @@ <translation id="2567385386134582609">GAMBAR</translation> <translation id="257088987046510401">Tema</translation> <translation id="2570922361219980984">Akses lokasi juga dinonaktifkan untuk perangkat ini. Aktifkan di <ph name="BEGIN_LINK" />Setelan Android<ph name="END_LINK" />.</translation> +<translation id="257674075312929031">Grup</translation> <translation id="257931822824936280">Diperluas - klik untuk menciutkan</translation> <translation id="2581165646603367611">Tindakan ini akan mengosongkan cache dan menghapus cookie, serta data lain dari situs yang dianggap tidak penting oleh Chrome.</translation> <translation id="2586657967955657006">Papan klip</translation> @@ -274,6 +275,7 @@ <translation id="2956410042958133412">Akun ini dikelola oleh <ph name="PARENT_NAME_1" /> dan <ph name="PARENT_NAME_2" />.</translation> <translation id="2962095958535813455">Beralih ke tab penyamaran</translation> <translation id="2968755619301702150">Penampil sertifikat</translation> +<translation id="2977480621796371840">Hapus dari grup</translation> <translation id="2979025552038692506">Tab Penyamaran yang Dipilih</translation> <translation id="2989523299700148168">Baru saja dikunjungi</translation> <translation id="2996291259634659425">Buat frasa sandi</translation> @@ -426,6 +428,12 @@ <translation id="4226663524361240545">Notifikasi dapat membuat perangkat bergetar</translation> <translation id="423219824432660969">Enkripsikan data yang disinkronkan dengan sandi Google mulai tanggal <ph name="TIME" /></translation> <translation id="4242533952199664413">Buka setelan</translation> +<translation id="4247274662191902962">Data sensor hanya akan dibagikan selama Anda berada di pengalaman VR ini. Situs mungkin dapat mempelajari Anda dengan menggunakan informasi tertentu, seperti: + - Lokasi Anda + - Ciri fisik Anda, seperti posisi mata + - Gerakan Anda, seperti cara Anda berjalan + + Pastikan Anda memercayai situs ini sebelum mengizinkan akses.</translation> <translation id="424864128008805179">Logout dari Chrome?</translation> <translation id="4256782883801055595">Lisensi open source</translation> <translation id="4259722352634471385">Navigasi diblokir: <ph name="URL" /></translation> @@ -598,6 +606,7 @@ <translation id="545042621069398927">Mempercepat download.</translation> <translation id="5456381639095306749">Download halaman</translation> <translation id="5475862044948910901">Mulai sesi Augmented Reality?</translation> +<translation id="5481942164684849270"><ph name="APP_NAME" /> ditambahkan ke aplikasi saya</translation> <translation id="548278423535722844">Buka di aplikasi peta</translation> <translation id="5487521232677179737">Hapus data</translation> <translation id="5494752089476963479">Blokir iklan di situs yang menampilkan iklan yang mengganggu atau menyesatkan</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_it.xtb b/chrome/android/java/strings/translations/android_chrome_strings_it.xtb index 4729add..f5a7c11 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_it.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_it.xtb
@@ -2,6 +2,7 @@ <!DOCTYPE translationbundle> <translationbundle lang="it"> <translation id="1006017844123154345">Apri online</translation> +<translation id="1028699632127661925">Invio a <ph name="DEVICE_NAME" />…</translation> <translation id="1036727731225946849">Aggiunta di <ph name="WEBAPK_NAME" /> in corso…</translation> <translation id="1041308826830691739">Da siti web</translation> <translation id="1049743911850919806">In incognito</translation> @@ -43,6 +44,7 @@ <translation id="1260236875608242557">Cerca ed esplora</translation> <translation id="1264974993859112054">Sport</translation> <translation id="1272079795634619415">Interrompi</translation> +<translation id="1272444412400969138">Selettore dispositivo con cui condividere una scheda.</translation> <translation id="1283039547216852943">Tocca per espandere</translation> <translation id="1285320974508926690">Non tradurre mai questo sito</translation> <translation id="1291207594882862231">Cancella la cronologia, i cookie, i dati dei siti, la cache…</translation> @@ -59,6 +61,7 @@ <translation id="138361230106469022">Ciao <ph name="FULL_NAME" /></translation> <translation id="1383876407941801731">Cerca</translation> <translation id="1384959399684842514">Download sospeso</translation> +<translation id="1386674309198842382">Attivo <ph name="LAST_UPDATED" /> giorni fa</translation> <translation id="1389974829397082527">Nessun preferito qui</translation> <translation id="1397811292916898096">Cerca con <ph name="PRODUCT_NAME" /></translation> <translation id="1404122904123200417">Incorporato in <ph name="WEBSITE_URL" /></translation> @@ -223,6 +226,7 @@ <translation id="2567385386134582609">IMMAGINE</translation> <translation id="257088987046510401">Temi</translation> <translation id="2570922361219980984">L'accesso alla posizione è disattivato anche per questo dispositivo. Attivalo nelle <ph name="BEGIN_LINK" />Impostazioni Android<ph name="END_LINK" />.</translation> +<translation id="257674075312929031">Gruppo</translation> <translation id="257931822824936280">Espanso. Fai clic per comprimere.</translation> <translation id="2581165646603367611">Verrà svuotata la cache e verranno cancellati i cookie e altri dati relativi a siti che Chrome non ritiene importanti.</translation> <translation id="2586657967955657006">Appunti</translation> @@ -274,6 +278,7 @@ <translation id="2956410042958133412">Questo account è gestito da <ph name="PARENT_NAME_1" /> e <ph name="PARENT_NAME_2" /></translation> <translation id="2962095958535813455">Schede in incognito attivate</translation> <translation id="2968755619301702150">Visualizzatore certificati</translation> +<translation id="2977480621796371840">Rimuovi dal gruppo</translation> <translation id="2979025552038692506">Scheda in incognito selezionata</translation> <translation id="2989523299700148168">Visitati di recente</translation> <translation id="2996291259634659425">Crea passphrase</translation> @@ -400,6 +405,7 @@ <translation id="4008040567710660924">Consenti i cookie per un sito specifico.</translation> <translation id="4034817413553209278">{HOURS,plural, =1{# ora}other{# ore}}</translation> <translation id="4042870126885713738">Mostra suggerimenti quando un indirizzo web non viene trovato o non è possibile stabilire una connessione</translation> +<translation id="4044912625106523635">Il selettore dispositivo con cui condividere una scheda è aperto a schermo intero.</translation> <translation id="4046123991198612571">Traccia successiva</translation> <translation id="4048707525896921369">Scopri gli argomenti dei siti web senza lasciare la pagina. La funzione Tocca per cercare consente di inviare una parola e il relativo contesto alla Ricerca Google; vengono restituiti risultati di ricerca, immagini, definizioni e altri dettagli. @@ -426,6 +432,12 @@ <translation id="4226663524361240545">Le notifiche possono far vibrare il dispositivo</translation> <translation id="423219824432660969">Cripta i dati sincronizzati con la password Google a partire dal giorno <ph name="TIME" /></translation> <translation id="4242533952199664413">Apri le impostazioni</translation> +<translation id="4247274662191902962">I dati dei sensori verranno condivisi solo quando ti trovi in questa esperienza VR. Questo sito potrebbe essere in grado di apprendere le tue abitudini utilizzando determinate informazioni, ad esempio: + - La tua località + - Le tue caratteristiche fisiche, come la posizione degli occhi + - I tuoi movimenti, come il modo di camminare + + Prima di consentire l'accesso, controlla che questo sito sia attendibile.</translation> <translation id="424864128008805179">Uscire da Chrome?</translation> <translation id="4256782883801055595">Licenze open source</translation> <translation id="4259722352634471385">Navigazione bloccata: <ph name="URL" /></translation> @@ -571,6 +583,7 @@ <translation id="5271967389191913893">Non è possibile aprire i contenuti da scaricare sul dispositivo.</translation> <translation id="528192093759286357">Trascina dall'alto e tocca il pulsante Indietro per uscire dalla modalità a schermo intero.</translation> <translation id="5284584623296338184">Le modifiche ai preferiti, alla cronologia, alle password e ad altre impostazioni non verranno più sincronizzate con il tuo Account Google. Tuttavia, i dati esistenti rimarranno memorizzati.</translation> +<translation id="5292796745632149097">Invia a</translation> <translation id="5300589172476337783">Mostra</translation> <translation id="5301954838959518834">OK</translation> <translation id="5304593522240415983">Questo campo non può essere vuoto</translation> @@ -598,6 +611,7 @@ <translation id="545042621069398927">Accelerazione del download in corso.</translation> <translation id="5456381639095306749">Scarica la pagina</translation> <translation id="5475862044948910901">Vuoi avviare una sessione di realtà aumentata?</translation> +<translation id="5481942164684849270"><ph name="APP_NAME" /> aggiunta alle mie app</translation> <translation id="548278423535722844">Apri nell'app di mappe</translation> <translation id="5487521232677179737">Cancella dati</translation> <translation id="5494752089476963479">Blocca gli annunci su siti che mostrano annunci invasivi o fuorvianti</translation> @@ -731,6 +745,7 @@ <translation id="6406506848690869874">Sincronizzazione</translation> <translation id="641643625718530986">Stampa…</translation> <translation id="6416782512398055893">Sono stati scaricati <ph name="MBS" /> MB</translation> +<translation id="6418750371676080905">Il selettore dispositivo con cui condividere una scheda è chiuso.</translation> <translation id="6427112570124116297">Traduci il Web</translation> <translation id="6433501201775827830">Scegli il motore di ricerca</translation> <translation id="6437478888915024427">Informazioni sulla pagina</translation> @@ -770,6 +785,7 @@ <translation id="666268767214822976">Utilizza un servizio di previsione per visualizzare query correlate e siti web popolari durante la digitazione nella barra degli indirizzi</translation> <translation id="666731172850799929">Apri in <ph name="APP_NAME" /></translation> <translation id="666981079809192359">Informativa sulla privacy di Chrome</translation> +<translation id="6672986458216094438">Il selettore dispositivo con cui condividere una scheda è aperto nella parte inferiore dello schermo.</translation> <translation id="6697492270171225480">Mostra suggerimenti per pagine simili quando una pagina non viene trovata</translation> <translation id="6697947395630195233">Chrome deve poter accedere alla tua posizione per condividerla con questo sito.</translation> <translation id="6698801883190606802">Gestisci dati sincronizzati</translation> @@ -947,6 +963,7 @@ <translation id="7942131818088350342"><ph name="PRODUCT_NAME" /> è obsoleto.</translation> <translation id="7947953824732555851">Accetta e accedi</translation> <translation id="7963646190083259054">Fornitore:</translation> +<translation id="7971136598759319605">Attivo 1 giorno fa</translation> <translation id="7975379999046275268">Anteprima pagina <ph name="BEGIN_NEW" />Novità<ph name="END_NEW" /></translation> <translation id="7981313251711023384">Le pagine vengono precaricate per velocizzare la navigazione e la ricerca</translation> <translation id="79859296434321399">Per visualizzare i contenuti di realtà aumentata, installa ARCore</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_iw.xtb b/chrome/android/java/strings/translations/android_chrome_strings_iw.xtb index 4aac7c54..fc56359 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_iw.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_iw.xtb
@@ -223,6 +223,7 @@ <translation id="2567385386134582609">תמונה</translation> <translation id="257088987046510401">ערכות נושא</translation> <translation id="2570922361219980984">גם הגישה למיקום כבויה בשביל המכשיר הזה. יש להפעיל אותה ב<ph name="BEGIN_LINK" />הגדרות Android<ph name="END_LINK" />.</translation> +<translation id="257674075312929031">קבוצה</translation> <translation id="257931822824936280">מורחב - לחץ כדי לכווץ.</translation> <translation id="2581165646603367611">פעולה זו תמחק את קובצי ה-Cookie, את המטמון ונתונים אחרים של אתרים ש-Chrome לא מחשיב כחשובים.</translation> <translation id="2586657967955657006">לוח</translation> @@ -274,6 +275,7 @@ <translation id="2956410042958133412">החשבון הזה מנוהל על ידי <ph name="PARENT_NAME_1" /> ו-<ph name="PARENT_NAME_2" />.</translation> <translation id="2962095958535813455">הוחלף לכרטיסיות גלישה בסתר</translation> <translation id="2968755619301702150">מציג האישורים</translation> +<translation id="2977480621796371840">הסרה מהקבוצה</translation> <translation id="2979025552038692506">כרטיסיית הגלישה בסתר שנבחרה</translation> <translation id="2989523299700148168">מנועי חיפוש שהשתמשת בהם לאחרונה</translation> <translation id="2996291259634659425">יצירת ביטוי סיסמה</translation> @@ -426,6 +428,12 @@ <translation id="4226663524361240545">רטט של המכשיר אפשרי כשמתקבלת הודעה</translation> <translation id="423219824432660969">הצפנת נתונים מסונכרנים באמצעות סיסמת Google החל מ-<ph name="TIME" /></translation> <translation id="4242533952199664413">פתח את 'הגדרות'</translation> +<translation id="4247274662191902962">שיתוף נתוני החיישן יתבצע רק במהלך ההשתתפות בחוויית ה-VR הזו. ייתכן שהאתר ילמד עליך באמצעות פרטים מסוימים, למשל: + - המיקום שלך + - המאפיינים הגופניים שלך, כמו מיקום העיניים + - התנועות שלך, למשל צורת ההליכה + + לפני הענקת הגישה, יש לוודא שמדובר באתר מהימן.</translation> <translation id="424864128008805179">האם לצאת מ-Chrome?</translation> <translation id="4256782883801055595">רישיונות קוד פתוח</translation> <translation id="4259722352634471385">הניווט חסום: <ph name="URL" /></translation> @@ -598,6 +606,7 @@ <translation id="545042621069398927">הדפדפן מאיץ את ההורדה.</translation> <translation id="5456381639095306749">הורד דף זה</translation> <translation id="5475862044948910901">להתחיל פעילות של מציאות רבודה?</translation> +<translation id="5481942164684849270">'<ph name="APP_NAME" />' נוסף לאפליקציות שלי</translation> <translation id="548278423535722844">פתח יישום מפות</translation> <translation id="5487521232677179737">ניקוי נתונים</translation> <translation id="5494752089476963479">חסימת מודעות באתרים שמוצגות בהם מודעות מפריעות או מטעות</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_ja.xtb b/chrome/android/java/strings/translations/android_chrome_strings_ja.xtb index bfef17b..45425b2 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_ja.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_ja.xtb
@@ -223,6 +223,7 @@ <translation id="2567385386134582609">画像</translation> <translation id="257088987046510401">テーマ</translation> <translation id="2570922361219980984">位置情報へのアクセスがデバイスでもオフになっています。<ph name="BEGIN_LINK" />Android の設定<ph name="END_LINK" />でオンにしてください。</translation> +<translation id="257674075312929031">グループ</translation> <translation id="257931822824936280">展開されています - クリックすると折りたたまれます。</translation> <translation id="2581165646603367611">Chrome で重要度が低いと判断されるサイトの Cookie やキャッシュなどのデータを削除します。</translation> <translation id="2586657967955657006">クリップボード</translation> @@ -274,6 +275,7 @@ <translation id="2956410042958133412">このアカウントは <ph name="PARENT_NAME_1" /> と <ph name="PARENT_NAME_2" /> によって管理されています。</translation> <translation id="2962095958535813455">シークレット タブに切り替えました</translation> <translation id="2968755619301702150">証明書ビューア</translation> +<translation id="2977480621796371840">グループから削除</translation> <translation id="2979025552038692506">選択したシークレット タブ</translation> <translation id="2989523299700148168">最近のアクセス</translation> <translation id="2996291259634659425">パスフレーズの作成</translation> @@ -426,6 +428,12 @@ <translation id="4226663524361240545">通知を受け取るとデバイスが振動します</translation> <translation id="423219824432660969"><ph name="TIME" />時点の Google パスワードで同期データを暗号化する</translation> <translation id="4242533952199664413">設定を開く</translation> +<translation id="4247274662191902962">センサーデータは、この VR 空間を利用している間のみ共有されます。次のような特定の情報により、サイトがお客様を記憶できる場合があります。 + - お客様の位置情報 + - お客様の身体的特徴(目の位置など) + - お客様の動き(歩き方など) + + アクセスを許可する前に、このサイトを信頼できるかどうか確認してください。</translation> <translation id="424864128008805179">Chrome からログアウトしますか?</translation> <translation id="4256782883801055595">オープンソース ライセンス</translation> <translation id="4259722352634471385"><ph name="URL" /> へのアクセスがブロックされました</translation> @@ -598,6 +606,7 @@ <translation id="545042621069398927">ダウンロード速度が向上しました。</translation> <translation id="5456381639095306749">ページをダウンロード</translation> <translation id="5475862044948910901">拡張現実セッションを開始しますか?</translation> +<translation id="5481942164684849270"><ph name="APP_NAME" /> をマイアプリに追加しました</translation> <translation id="548278423535722844">マップアプリで開く</translation> <translation id="5487521232677179737">データを削除</translation> <translation id="5494752089476963479">煩わしい広告や誤解を招く広告が表示されるサイトで広告をブロックする</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_kn.xtb b/chrome/android/java/strings/translations/android_chrome_strings_kn.xtb index 9dc03a7..e5fde089 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_kn.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_kn.xtb
@@ -224,6 +224,7 @@ <translation id="2567385386134582609">ಚಿತ್ರ</translation> <translation id="257088987046510401">ಥೀಮ್ಗಳು</translation> <translation id="2570922361219980984">ಈ ಸಾಧನದ ಸ್ಥಳ ಪ್ರವೇಶ ಸಹ ಆಫ್ ಆಗಿದೆ. ಅದನ್ನು <ph name="BEGIN_LINK" />Android ಸೆಟ್ಟಿಂಗ್ಗಳಲ್ಲಿ<ph name="END_LINK" /> ಆನ್ ಮಾಡಿ.</translation> +<translation id="257674075312929031">ಗುಂಪು</translation> <translation id="257931822824936280">ವಿಸ್ತರಿಸಲಾಗಿದೆ - ಕುಗ್ಗಿಸಲು ಕ್ಲಿಕ್ ಮಾಡಿ</translation> <translation id="2581165646603367611">ಇದು ಕುಕೀಗಳು, ಸಂಗ್ರಹ ಮತ್ತು ಪ್ರಮುಖವಲ್ಲವೆಂದು Chrome ಭಾವಿಸುವ ಸೈಟ್ಗಳ ಇತರ ಡೇಟಾವನ್ನು ತೆರವುಗೊಳಿಸುತ್ತದೆ.</translation> <translation id="2586657967955657006">ಕ್ಲಿಪ್ಬೋರ್ಡ್</translation> @@ -275,6 +276,7 @@ <translation id="2956410042958133412">ಈ ಖಾತೆಯನ್ನು <ph name="PARENT_NAME_1" /> ಮತ್ತು <ph name="PARENT_NAME_2" /> ಅವರು ನಿರ್ವಹಿಸುತ್ತಿದ್ದಾರೆ.</translation> <translation id="2962095958535813455">ಅದೃಶ್ಯ ಟ್ಯಾಬ್ಗಳಿಗೆ ಬದಲಾಯಿಸಲಾಗಿದೆ</translation> <translation id="2968755619301702150">ಪ್ರಮಾಣಪತ್ರ ವೀಕ್ಷಕ</translation> +<translation id="2977480621796371840">ಗುಂಪಿನಿಂದ ತೆಗೆದುಹಾಕಿ</translation> <translation id="2979025552038692506">ಅದೃಶ್ಯ ಟ್ಯಾಬ್ ಆಯ್ಕೆಮಾಡಲಾಗಿದೆ</translation> <translation id="2989523299700148168">ಇತ್ತೀಚೆಗೆ ಭೇಟಿ ನೀಡಿದವು</translation> <translation id="2996291259634659425">ಪಾಸ್ಫ್ರೇಸ್ ರಚಿಸಿ</translation> @@ -427,6 +429,12 @@ <translation id="4226663524361240545">ಪ್ರಕಟಣೆಗಳು ಸಾಧನವನ್ನು ವೈಬ್ರೇಟ್ ಮಾಡಬಹುದು</translation> <translation id="423219824432660969"><ph name="TIME" /> ರಂದು ಹೊಂದಿಸಿದ್ದ Google ಪಾಸ್ವರ್ಡ್ ಬಳಸಿಕೊಂಡು, ಸಿಂಕ್ ಮಾಡಿದ ಡೇಟಾವನ್ನು ಎನ್ಕ್ರಿಪ್ಟ್ ಮಾಡಿ</translation> <translation id="4242533952199664413">ಸೆಟ್ಟಿಂಗ್ಗಳನ್ನು ತೆರೆ</translation> +<translation id="4247274662191902962">ನೀವು ಈ VR ಅನುಭವ ಪಡೆಯುತ್ತಿರುವಾಗ ಮಾತ್ರವೇ ಸೆನ್ಸರ್ ಡೇಟಾವನ್ನು ಹಂಚಿಕೊಳ್ಳಲಾಗುತ್ತದೆ. ಈ ಸೈಟ್ ಕೆಲವು ಮಾಹಿತಿಯನ್ನು ಬಳಸಿಕೊಂಡು ನಿಮ್ಮ ಬಗೆಗೆ ತಿಳಿದುಕೊಳ್ಳಲು ಸಾಧ್ಯವಾಗಬಹುದು, ಅಂತಹ ಮಾಹಿತಿಗಳೆಂದರೆ: + - ನಿಮ್ಮ ಸ್ಥಳ + - ನಿಮ್ಮ ದೈಹಿಕ ಲಕ್ಷಣಗಳು, ಉದಾಹರಣೆಗೆ ಕಣ್ಣಿನ ಸ್ಥಿತಿ + - ನಿಮ್ಮ ಚಲನೆಗಳು, ಉದಾಹರಣೆಗೆ ನಿಮ್ಮ ನಡಿಗೆಯ ಶೈಲಿ + + ಈ ಸೈಟ್ಗೆ ಪ್ರವೇಶವನ್ನು ನೀಡುವುದಕ್ಕೂ ಮೊದಲು ಅದನ್ನು ನೀವು ನಂಬುತ್ತೀರಾ ಎಂದು ಖಚಿತಪಡಿಸಿಕೊಳ್ಳಿ.</translation> <translation id="424864128008805179">Chrome ನಿಂದ ಸೈನ್ ಔಟ್ ಮಾಡುವುದೇ?</translation> <translation id="4256782883801055595">ಮೂಲ ಪರವಾನಗಿಗಳನ್ನು ತೆರೆಯಿರಿ</translation> <translation id="4259722352634471385">ನ್ಯಾವಿಗೇಶನ್ ನಿರ್ಬಂಧಿಸಲಾಗಿದೆ: <ph name="URL" /></translation> @@ -598,6 +606,7 @@ <translation id="545042621069398927">ನಿಮ್ಮ ಡೌನ್ಲೋಡ್ನ ವೇಗವನ್ನು ಹೆಚ್ಚಿಸಲಾಗುತ್ತಿದೆ.</translation> <translation id="5456381639095306749">ಪುಟ ಡೌನ್ಲೋಡ್ ಮಾಡಿ</translation> <translation id="5475862044948910901">ಆಗ್ಮೆಂಟೆಡ್ ರಿಯಾಲಿಟಿ ಸೆಶನ್ ಪ್ರಾರಂಭಿಸುವುದೇ?</translation> +<translation id="5481942164684849270"><ph name="APP_NAME" /> ಆ್ಯಪ್ ಅನ್ನು ನನ್ನ ಆ್ಯಪ್ಗಳಿಗೆ ಸೇರಿಸಲಾಗಿದೆ</translation> <translation id="548278423535722844">ನಕ್ಷೆಗಳ ಅಪ್ಲಿಕೇಶನ್ನಲ್ಲಿ ತೆರೆಯಿರಿ</translation> <translation id="5487521232677179737">ಡೇಟಾ ತೆರವುಗೊಳಿಸು</translation> <translation id="5494752089476963479">ಅನಪೇಕ್ಷಿತ ಅಥವಾ ತಪ್ಪುದಾರಿಗೆಳೆಯುವ ಜಾಹೀರಾತುಗಳನ್ನು ತೋರಿಸುವ ಸೈಟ್ಗಳಲ್ಲಿ ಜಾಹೀರಾತುಗಳನ್ನು ನಿರ್ಬಂಧಿಸಿ</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_ko.xtb b/chrome/android/java/strings/translations/android_chrome_strings_ko.xtb index 725fd56..b8bf209 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_ko.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_ko.xtb
@@ -223,6 +223,7 @@ <translation id="2567385386134582609">이미지</translation> <translation id="257088987046510401">테마</translation> <translation id="2570922361219980984">이 기기의 위치 정보 액세스도 사용 중지되었습니다. <ph name="BEGIN_LINK" />Android 설정<ph name="END_LINK" />에서 사용 설정하세요.</translation> +<translation id="257674075312929031">그룹</translation> <translation id="257931822824936280">펼쳐짐 - 접으려면 클릭</translation> <translation id="2581165646603367611">이를 통해 쿠키, 캐시 및 Chrome에서 중요하다고 간주하지 않는 사이트의 기타 데이터가 삭제됩니다.</translation> <translation id="2586657967955657006">클립보드</translation> @@ -274,6 +275,7 @@ <translation id="2956410042958133412"><ph name="PARENT_NAME_1" />님과 <ph name="PARENT_NAME_2" />님이 관리하는 계정입니다.</translation> <translation id="2962095958535813455">시크릿 탭으로 전환됨</translation> <translation id="2968755619301702150">인증서 뷰어</translation> +<translation id="2977480621796371840">그룹에서 삭제</translation> <translation id="2979025552038692506">선택된 시크릿 탭</translation> <translation id="2989523299700148168">최근 방문</translation> <translation id="2996291259634659425">암호 만들기</translation> @@ -426,6 +428,12 @@ <translation id="4226663524361240545">알림이 있으면 진동이 울릴 수도 있습니다.</translation> <translation id="423219824432660969"><ph name="TIME" />에 Google 비밀번호를 사용하여 동기화된 데이터 암호화</translation> <translation id="4242533952199664413">설정 열기</translation> +<translation id="4247274662191902962">이 VR 경험을 사용하는 동안에만 센서 데이터가 공유됩니다. 사이트에서 다음과 같은 특정 정보를 사용해 나에 관한 정보를 학습할 수 있습니다. + - 위치 + - 눈 위치와 같은 신체적 특징 + - 걸음걸이와 같은 움직임 + + 액세스를 허용하기 전에 사이트를 신뢰할 수 있는지 확인하세요.</translation> <translation id="424864128008805179">Chrome에서 로그아웃하시겠습니까?</translation> <translation id="4256782883801055595">오픈소스 라이선스</translation> <translation id="4259722352634471385">탐색이 차단됨: <ph name="URL" /></translation> @@ -598,6 +606,7 @@ <translation id="545042621069398927">다운로드 속도 향상</translation> <translation id="5456381639095306749">다운로드 페이지</translation> <translation id="5475862044948910901">증강 현실 세션을 시작할까요?</translation> +<translation id="5481942164684849270"><ph name="APP_NAME" />이(가) 내 앱에 추가됨</translation> <translation id="548278423535722844">지도 앱에서 열기</translation> <translation id="5487521232677179737">인터넷 사용 기록 삭제</translation> <translation id="5494752089476963479">방해가 되거나 사용자를 현혹하는 광고를 표시하는 사이트의 광고 차단</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_lt.xtb b/chrome/android/java/strings/translations/android_chrome_strings_lt.xtb index 2374464..783a3e0 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_lt.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_lt.xtb
@@ -2,6 +2,7 @@ <!DOCTYPE translationbundle> <translationbundle lang="lt"> <translation id="1006017844123154345">Atidaryti prisijungus</translation> +<translation id="1028699632127661925">Siunčiama į „<ph name="DEVICE_NAME" />“...</translation> <translation id="1036727731225946849">Pridedamas APK „<ph name="WEBAPK_NAME" />“...</translation> <translation id="1041308826830691739">Iš svetainių</translation> <translation id="1049743911850919806">Inkognito</translation> @@ -43,6 +44,7 @@ <translation id="1260236875608242557">Paieška ir naršymas</translation> <translation id="1264974993859112054">Sportas</translation> <translation id="1272079795634619415">Sustabdyti</translation> +<translation id="1272444412400969138">Įrenginių rinkiklis, su kuriuo bendrinti skirtuką.</translation> <translation id="1283039547216852943">Palieskite ir išskleiskite</translation> <translation id="1285320974508926690">Niekada neversti šios svetainės</translation> <translation id="1291207594882862231">Išvalykite istoriją, slapukus, svetainės duomenis, talpyklą…</translation> @@ -59,6 +61,7 @@ <translation id="138361230106469022">Sveiki, <ph name="FULL_NAME" />!</translation> <translation id="1383876407941801731">Ieškoti</translation> <translation id="1384959399684842514">Atsisiuntimas pristabdytas</translation> +<translation id="1386674309198842382">Aktyvus prieš <ph name="LAST_UPDATED" /> d.</translation> <translation id="1389974829397082527">Čia žymių nėra</translation> <translation id="1397811292916898096">Paieška su „<ph name="PRODUCT_NAME" />“</translation> <translation id="1404122904123200417">Įterpta į <ph name="WEBSITE_URL" /></translation> @@ -223,6 +226,7 @@ <translation id="2567385386134582609">VAIZDAS</translation> <translation id="257088987046510401">Temos</translation> <translation id="2570922361219980984">Vietos prieiga taip pat išjungta šiame įrenginyje. Įjunkite ją skiltyje <ph name="BEGIN_LINK" />„Android“ nustatymai“<ph name="END_LINK" />.</translation> +<translation id="257674075312929031">Grupė</translation> <translation id="257931822824936280">Išskleista – spustelėkite, kad sutrauktumėte</translation> <translation id="2581165646603367611">Bus išvalyti slapukai, talpykla ir kiti svetainių duomenys, kurių „Chrome“ nelaiko svarbiais.</translation> <translation id="2586657967955657006">Iškarpinė</translation> @@ -274,6 +278,7 @@ <translation id="2956410042958133412">Šią paskyrą tvarko <ph name="PARENT_NAME_1" /> ir <ph name="PARENT_NAME_2" />.</translation> <translation id="2962095958535813455">Perjungta į inkognito skirtukus</translation> <translation id="2968755619301702150">Sertifikato peržiūros priemonė</translation> +<translation id="2977480621796371840">Pašalinti iš grupės</translation> <translation id="2979025552038692506">Pasirinktas inkognito skirtukas</translation> <translation id="2989523299700148168">Neseniai lankyta</translation> <translation id="2996291259634659425">Kurkite slaptafrazę</translation> @@ -400,6 +405,7 @@ <translation id="4008040567710660924">Leisti konkrečios svetainės slapukus.</translation> <translation id="4034817413553209278">{HOURS,plural, =1{# val.}one{# val.}few{# val.}many{# val.}other{# val.}}</translation> <translation id="4042870126885713738">Rodyti pasiūlymus, kai žiniatinklio adresas nepasiekiamas arba nepavyksta užmegzti ryšio</translation> +<translation id="4044912625106523635">Atidarytas viso aukščio įrenginių rinkiklis, su kuriuo bendrinti skirtuką.</translation> <translation id="4046123991198612571">Kitas takelis</translation> <translation id="4048707525896921369">Sužinokite apie temas svetainėse neišėję iš puslapio. Naudojant Paiešką palietus siunčiamas žodis ir jo kontekstas „Google“ paieškai, kuri pateikia apibrėžimų, nuotraukų, paieškos rezultatų ir kitos išsamios informacijos. @@ -426,6 +432,12 @@ <translation id="4226663524361240545">Gavus pranešimą įrenginys gali vibruoti</translation> <translation id="423219824432660969">Šifruoti sinchronizuotus duomenis nuo <ph name="TIME" /> taikant „Google“ slaptažodį</translation> <translation id="4242533952199664413">Atidaryti nustatymus</translation> +<translation id="4247274662191902962">Jutiklių duomenys bus bendrinami, tik kol naudositės šiomis VR funkcijomis. Svetainė gali sužinoti apie jus pagal tam tikrą informaciją, pavyzdžiui: + – jūsų vietovę; + – jūsų fizines savybes, pvz., akių padėtį; + – jūsų judesius, pvz., eiseną. + + Prieš suteikdami prieigą įsitikinkite, kad pasitikite šia svetaine.</translation> <translation id="424864128008805179">Atsijungti nuo „Chrome“?</translation> <translation id="4256782883801055595">Atvirojo šaltinio licencijos</translation> <translation id="4259722352634471385">Naršymas užblokuotas: <ph name="URL" /></translation> @@ -571,6 +583,7 @@ <translation id="5271967389191913893">Įrenginyje nepavyksta atidaryti norimo atsisiųsti turinio.</translation> <translation id="528192093759286357">Vilkite žymeklį nuo viršaus ir palieskite mygtuką „Atgal“, kad išeitumėte iš viso ekrano režimo.</translation> <translation id="5284584623296338184">Žymių, istorijos, slaptažodžių ir kitų nustatymų pakeitimai nebebus sinchronizuojami su „Google“ paskyra. Tačiau esami duomenys ir toliau bus saugomi „Google“ paskyroje.</translation> +<translation id="5292796745632149097">Siųsti į</translation> <translation id="5300589172476337783">Rodyti</translation> <translation id="5301954838959518834">Gerai, supratau</translation> <translation id="5304593522240415983">Šis laukas negali būti tuščias</translation> @@ -598,6 +611,7 @@ <translation id="545042621069398927">Paspartinamas atsisiuntimas.</translation> <translation id="5456381639095306749">Atsisiųsti puslapį</translation> <translation id="5475862044948910901">Pradėti išplėstosios realybės seansą?</translation> +<translation id="5481942164684849270">„<ph name="APP_NAME" />“ pridėta prie programų</translation> <translation id="548278423535722844">Atidaryti Žemėlapių programoje</translation> <translation id="5487521232677179737">Išvalyti duomenis</translation> <translation id="5494752089476963479">Blokuoti skelbimus svetainėse, kuriose rodomi nepageidaujami arba klaidinantys skelbimai</translation> @@ -731,6 +745,7 @@ <translation id="6406506848690869874">Sinchronizavimas</translation> <translation id="641643625718530986">Spausdinti…</translation> <translation id="6416782512398055893">Atsisiųsta <ph name="MBS" /> MB</translation> +<translation id="6418750371676080905">Įrenginių rinkiklis, su kuriuo bendrinti skirtuką, uždarytas.</translation> <translation id="6427112570124116297">Žiniatinklio vertimas</translation> <translation id="6433501201775827830">Paieškos variklio pasirinkimas</translation> <translation id="6437478888915024427">Puslapio informacija</translation> @@ -770,6 +785,7 @@ <translation id="666268767214822976">Naudoti numatymo paslaugą, kad adreso juostoje įvedant tekstą būtų rodomos susijusios užklausos ir populiarios svetainės</translation> <translation id="666731172850799929">Atidaryti naudojant „<ph name="APP_NAME" />“</translation> <translation id="666981079809192359">„Chrome“ privatumo pranešimas</translation> +<translation id="6672986458216094438">Atidarytas pusės aukščio įrenginių rinkiklis, su kuriuo bendrinti skirtuką.</translation> <translation id="6697492270171225480">Rodyti panašių puslapių pasiūlymus, kai nepavyksta rasti puslapio</translation> <translation id="6697947395630195233">„Chrome“ reikia leidimo, kad galėtų naudoti jūsų vietovės informaciją ir bendrinti ją su šia svetaine.</translation> <translation id="6698801883190606802">Tvarkykite sinchronizuotus duomenis</translation> @@ -947,6 +963,7 @@ <translation id="7942131818088350342">„<ph name="PRODUCT_NAME" />“ pasenęs.</translation> <translation id="7947953824732555851">Sutikti ir prisij.</translation> <translation id="7963646190083259054">Paslaugos teikėjas:</translation> +<translation id="7971136598759319605">Aktyvus prieš 1 d.</translation> <translation id="7975379999046275268">Peržiūrėti puslapį <ph name="BEGIN_NEW" />Naujas<ph name="END_NEW" /></translation> <translation id="7981313251711023384">Iš anksto įkelti puslapius, kad naršymo ir paieškos procesai vyktų greičiau</translation> <translation id="79859296434321399">Norėdami peržiūrėti išplėstosios realybės turinį įdiekite „ARCore“</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_lv.xtb b/chrome/android/java/strings/translations/android_chrome_strings_lv.xtb index f5cace83..bb443d9 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_lv.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_lv.xtb
@@ -2,6 +2,7 @@ <!DOCTYPE translationbundle> <translationbundle lang="lv"> <translation id="1006017844123154345">Atvērt tiešsaistē</translation> +<translation id="1028699632127661925">Notiek sūtīšana uz: <ph name="DEVICE_NAME" />...</translation> <translation id="1036727731225946849">Tiek pievienots <ph name="WEBAPK_NAME" />...</translation> <translation id="1041308826830691739">No vietnēm</translation> <translation id="1049743911850919806">Inkognito</translation> @@ -43,6 +44,7 @@ <translation id="1260236875608242557">Meklēšana un izpēte</translation> <translation id="1264974993859112054">Sports</translation> <translation id="1272079795634619415">Apturēt</translation> +<translation id="1272444412400969138">Ierīces atlasītājs, ar kuru kopīgot cilni.</translation> <translation id="1283039547216852943">Pieskarties, lai izvērstu</translation> <translation id="1285320974508926690">Nekad netulkot šo vietni</translation> <translation id="1291207594882862231">Dzēst vēsturi, sīkfailus, vietnes datus, kešatmiņu…</translation> @@ -59,6 +61,7 @@ <translation id="138361230106469022">Sveicināti, <ph name="FULL_NAME" />!</translation> <translation id="1383876407941801731">Meklēt</translation> <translation id="1384959399684842514">Lejupielāde pārtraukta</translation> +<translation id="1386674309198842382">Aktīvs pirms <ph name="LAST_UPDATED" /> dienām</translation> <translation id="1389974829397082527">Šeit nav nevienas grāmatzīmes.</translation> <translation id="1397811292916898096">Meklēt, izmantojot meklētājprogramu <ph name="PRODUCT_NAME" /></translation> <translation id="1404122904123200417">Iegults vietnē <ph name="WEBSITE_URL" /></translation> @@ -223,6 +226,7 @@ <translation id="2567385386134582609">ATTĒLS</translation> <translation id="257088987046510401">Motīvi</translation> <translation id="2570922361219980984">Arī piekļuve šīs ierīces atrašanās vietai ir izslēgta. Ieslēdziet to <ph name="BEGIN_LINK" />Android iestatījumos<ph name="END_LINK" />.</translation> +<translation id="257674075312929031">Grupa</translation> <translation id="257931822824936280">Izvērsts — noklikšķiniet, lai sakļautu.</translation> <translation id="2581165646603367611">Tādējādi tiks dzēsti sīkfaili, kešatmiņa un citi vietņu dati, kas pārlūkā Chrome netiek uzskatīti par svarīgiem.</translation> <translation id="2586657967955657006">Starpliktuve</translation> @@ -274,6 +278,7 @@ <translation id="2956410042958133412">Šo kontu pārvalda <ph name="PARENT_NAME_1" /> un <ph name="PARENT_NAME_2" />.</translation> <translation id="2962095958535813455">Notika pārslēgšanās uz inkognito režīma cilnēm</translation> <translation id="2968755619301702150">Sertifikātu skatītājs</translation> +<translation id="2977480621796371840">Noņemt no grupas</translation> <translation id="2979025552038692506">Atlasītā inkognito cilne</translation> <translation id="2989523299700148168">Nesen apmeklētās</translation> <translation id="2996291259634659425">Ieejas frāzes izveide</translation> @@ -400,6 +405,7 @@ <translation id="4008040567710660924">Atļaut sīkfailus konkrētai vietnei.</translation> <translation id="4034817413553209278">{HOURS,plural, =1{# h}zero{# h}one{# h}other{# h}}</translation> <translation id="4042870126885713738">Rādīt ieteikumus, ja nedarbojas tīmekļa adrese vai nevar izveidot savienojumu.</translation> +<translation id="4044912625106523635">Ierīces atlasītājs, ar kuru kopīgot cilni, ir atvērts pilnā augstumā.</translation> <translation id="4046123991198612571">Nākamais ieraksts</translation> <translation id="4048707525896921369">Uzziniet par vietņu tēmām, neizejot no lapas. Izmantojot funkciju “Pieskarties, lai meklētu”, vārds un tā konteksts tiek nosūtīts pakalpojumam Google meklēšana, un tiek parādītas definīcijas, attēli, meklēšanas rezultāti un cita informācija. @@ -426,6 +432,12 @@ <translation id="4226663524361240545">Saņemot paziņojumu, ierīce var vibrēt.</translation> <translation id="423219824432660969">Šifrēt sinhronizētos datus ar Google paroli, sākot no: <ph name="TIME" /></translation> <translation id="4242533952199664413">Atvērt iestatījumus</translation> +<translation id="4247274662191902962">Sensoru dati tiks kopīgoti tikai šajā VR pieredzē. Vietne var jūs atpazīt, izmantojot noteiktu informāciju, piemēram: + - jūsu atrašanās vietu; + - jūsu sejas vaibstus, piemēram, acu izvietojumu; + - jūsu kustības, piemēram, gaitas īpatnības. + + Atļaujiet piekļuvi tikai tad, ja uzticaties šai vietnei.</translation> <translation id="424864128008805179">Vai izrakstīties no pārlūka Chrome?</translation> <translation id="4256782883801055595">Atklātā pirmkoda licences</translation> <translation id="4259722352634471385">Navigācija ir bloķēta: <ph name="URL" /></translation> @@ -571,6 +583,7 @@ <translation id="5271967389191913893">Ierīcē nevar atvērt lejupielādējamo saturu.</translation> <translation id="528192093759286357">Lai izietu no pilnekrāna režīma, velciet no augšas un pieskarieties pogai Atpakaļ.</translation> <translation id="5284584623296338184">Grāmatzīmju, vēstures, paroļu un citu iestatījumu izmaiņas vairs netiks sinhronizētas ar jūsu Google kontu. Tomēr esošie dati joprojām tiks glabāti jūsu Google kontā.</translation> +<translation id="5292796745632149097">Sūtīt uz:</translation> <translation id="5300589172476337783">Rādīt</translation> <translation id="5301954838959518834">Labi, sapratu</translation> <translation id="5304593522240415983">Šis lauks nevar būt tukšs.</translation> @@ -598,6 +611,7 @@ <translation id="545042621069398927">Lejupielāde tiek paātrināta.</translation> <translation id="5456381639095306749">Lejupielādēt lapu</translation> <translation id="5475862044948910901">Vai sākt papildinātās realitātes sesiju?</translation> +<translation id="5481942164684849270">Lietotne <ph name="APP_NAME" /> ir pievienota sadaļai Manas lietotnes.</translation> <translation id="548278423535722844">Atvērt karšu lietotnē</translation> <translation id="5487521232677179737">Notīrīt datus</translation> <translation id="5494752089476963479">Bloķēt reklāmas vietnēs, kurās tiek rādītas traucējošas vai maldinošas reklāmas</translation> @@ -731,6 +745,7 @@ <translation id="6406506848690869874">Sinhronizācija</translation> <translation id="641643625718530986">Drukāt...</translation> <translation id="6416782512398055893">Lejupielādēts: <ph name="MBS" /> MB</translation> +<translation id="6418750371676080905">Ierīces atlasītājs, ar kuru kopīgot cilni, ir aizvērts.</translation> <translation id="6427112570124116297">Iztulkojiet tīmekli</translation> <translation id="6433501201775827830">Meklētājprogrammas izvēle</translation> <translation id="6437478888915024427">Lapas informācija</translation> @@ -770,6 +785,7 @@ <translation id="666268767214822976">Izmantojiet ieteikumus, lai skatītu saistītos vaicājumus un populāras vietnes, kad rakstāt adreses joslā.</translation> <translation id="666731172850799929">Atvērt lietotnē <ph name="APP_NAME" /></translation> <translation id="666981079809192359">Chrome konfidencialitātes paziņojums</translation> +<translation id="6672986458216094438">Ierīces atlasītājs, ar kuru kopīgot cilni, ir atvērts pusekrāna augstumā.</translation> <translation id="6697492270171225480">Ja lapu neizdotas atrast, rāda ieteikumus par līdzīgām lapām</translation> <translation id="6697947395630195233">Pārlūkam Chrome ir nepieciešama piekļuve jūsu atrašanās vietas datiem, lai varētu tos kopīgot ar šo vietni.</translation> <translation id="6698801883190606802">Pārvaldīt sinhronizētos datus</translation> @@ -947,6 +963,7 @@ <translation id="7942131818088350342">Spraudnis <ph name="PRODUCT_NAME" /> ir novecojis.</translation> <translation id="7947953824732555851">Pieņemt un pierakst.</translation> <translation id="7963646190083259054">Nodrošina:</translation> +<translation id="7971136598759319605">Aktīva pirms 1 dienas</translation> <translation id="7975379999046275268">Priekšskatīt lapu <ph name="BEGIN_NEW" />Jauna<ph name="END_NEW" /></translation> <translation id="7981313251711023384">Veikt lapu pirmsielādi, lai paātrinātu pārlūkošanu un meklēšanu</translation> <translation id="79859296434321399">Lai skatītu papildinātās realitātes saturu, instalējiet ARCore</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_ml.xtb b/chrome/android/java/strings/translations/android_chrome_strings_ml.xtb index 21815f2..909239396 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_ml.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_ml.xtb
@@ -223,6 +223,7 @@ <translation id="2567385386134582609">ചിത്രം</translation> <translation id="257088987046510401">തീമുകള്</translation> <translation id="2570922361219980984">ഈ ഉപകരണത്തിന്റെ ലൊക്കേഷൻ ആക്സസും ഓഫാണ്; <ph name="BEGIN_LINK" />Android ക്രമീകരണത്തിൽ<ph name="END_LINK" /> അത് ഓണാക്കുക.</translation> +<translation id="257674075312929031">ഗ്രൂപ്പ്</translation> <translation id="257931822824936280">വിപുലീകരിച്ചത് - ചുരുക്കാൻ ക്ലിക്ക് ചെയ്യുക</translation> <translation id="2581165646603367611">ഇത്, Chrome പ്രധാനമായി കണക്കാക്കാത്ത സൈറ്റുകളുടെ കുക്കികളും കാഷെയും മറ്റ് വിവരങ്ങളും മായ്ക്കും.</translation> <translation id="2586657967955657006">ക്ലിപ്പ്ബോർഡ്</translation> @@ -274,6 +275,7 @@ <translation id="2956410042958133412"><ph name="PARENT_NAME_1" />, <ph name="PARENT_NAME_2" /> എന്നിവരാണ് ഈ അക്കൗണ്ട് നിയന്ത്രിക്കുന്നത്.</translation> <translation id="2962095958535813455">ആൾമാറാട്ട ടാബുകളിലേക്ക് മാറി</translation> <translation id="2968755619301702150">സർട്ടിഫിക്കറ്റ് വ്യൂവർ</translation> +<translation id="2977480621796371840">ഗ്രൂപ്പിൽ നിന്ന് നീക്കം ചെയ്യുക</translation> <translation id="2979025552038692506">തിരഞ്ഞെടുത്ത അദൃശ്യ ടാബ്</translation> <translation id="2989523299700148168">അടുത്തിടെ സന്ദർശിച്ചവ</translation> <translation id="2996291259634659425">പാസ്ഫ്രെയ്സ് സൃഷ്ടിക്കുക</translation> @@ -426,6 +428,12 @@ <translation id="4226663524361240545">അറിയിപ്പുകൾ ലഭിക്കുമ്പോൾ ഉപകരണം വൈബ്രേറ്റ് ചെയ്തേക്കാം</translation> <translation id="423219824432660969">Google പാസ്വേഡ് ഉപയോഗിച്ച് <ph name="TIME" /> മുതൽ സമന്വയിപ്പിച്ച ഡാറ്റ എൻക്രിപ്റ്റ് ചെയ്യുക</translation> <translation id="4242533952199664413">ക്രമീകരണം തുറക്കുക</translation> +<translation id="4247274662191902962">നിങ്ങൾ ഈ VR അനുഭവത്തിലായിരിക്കുമ്പോൾ മാത്രമേ സെൻസർ ഡാറ്റ പങ്കിടൂ. ചുവടെ പറയുന്നത് പോലുള്ള ചില വിവരങ്ങൾ ഉപയോഗിച്ച് ഈ സൈറ്റിന് നിങ്ങളെ കുറിച്ച് അറിയാനാകും: + - നിങ്ങളുടെ ലൊക്കേഷൻ + - കണ്ണിൻ്റെ സ്ഥാനം പോലെയുള്ള നിങ്ങളുടെ ശാരീരിക സവിശേഷതകൾ + - നിങ്ങളുടെ നടപ്പിൻ്റെ ശൈലി പോലെയുള്ള ചലനങ്ങൾ + + ആക്സസ് അനുവദിക്കുന്നതിന് മുമ്പ് നിങ്ങൾ ഈ സൈറ്റിനെ വിശ്വസിക്കുന്നുണ്ടെന്ന് ഉറപ്പാക്കുക.</translation> <translation id="424864128008805179">Chrome-ൽ നിന്ന് സൈൻ ഔട്ട് ചെയ്യണോ?</translation> <translation id="4256782883801055595">ഓപ്പൺ സോഴ്സ് ലൈസൻസുകൾ</translation> <translation id="4259722352634471385">നാവിഗേഷൻ തടഞ്ഞിരിക്കുന്നു: <ph name="URL" /></translation> @@ -598,6 +606,7 @@ <translation id="545042621069398927">നിങ്ങളുടെ ഡൗൺലോഡ് വേഗത്തിലാക്കുന്നു.</translation> <translation id="5456381639095306749">പേജ് ഡൗൺലോഡ് ചെയ്യുക</translation> <translation id="5475862044948910901">അനുബന്ധയാഥാർത്ഥ്യ സെഷൻ ആരംഭിക്കണോ?</translation> +<translation id="5481942164684849270"><ph name="APP_NAME" /> എന്റെ ആപ്പുകളിലേക്ക് ചേർത്തു</translation> <translation id="548278423535722844">മാപ്സ് ആപ്പിൽ തുറക്കുക</translation> <translation id="5487521232677179737">ഡാറ്റ മായ്ക്കുക</translation> <translation id="5494752089476963479">അനാവശ്യമോ തെറ്റിദ്ധരിപ്പിക്കുന്നതോ ആയ പരസ്യങ്ങള് കാണിക്കുന്ന സൈറ്റുകളിലെ പരസ്യങ്ങൾ ബ്ലോക്ക് ചെയ്യുക</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_mr.xtb b/chrome/android/java/strings/translations/android_chrome_strings_mr.xtb index 6597a13..1231101 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_mr.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_mr.xtb
@@ -223,6 +223,7 @@ <translation id="2567385386134582609">इमेज</translation> <translation id="257088987046510401">थीम</translation> <translation id="2570922361219980984">या डिव्हाइसाठी स्थान अॅक्सेस देखील बंद आहे, <ph name="BEGIN_LINK" />Android सेटिंग्ज<ph name="END_LINK" /> मध्ये हे सुरू करा.</translation> +<translation id="257674075312929031">गट</translation> <translation id="257931822824936280">विस्तृत केले - संकुचित करण्यासाठी क्लिक करा.</translation> <translation id="2581165646603367611">हे सर्व कुकी, कॅशे आणि साइटचा अन्य डेटा साफ करेल जो Chrome ला महत्त्वाचा वाटत नाही.</translation> <translation id="2586657967955657006">क्लिपबोर्ड</translation> @@ -274,6 +275,7 @@ <translation id="2956410042958133412">हे खाते <ph name="PARENT_NAME_1" /> आणि <ph name="PARENT_NAME_2" /> द्वारे व्यवस्थापित केले आहे.</translation> <translation id="2962095958535813455">गुप्त टॅबवर स्विच केले</translation> <translation id="2968755619301702150">सर्टिफिकेट दर्शक</translation> +<translation id="2977480621796371840">गटामधून काढून टाका</translation> <translation id="2979025552038692506">निवडलेला गुप्त टॅब</translation> <translation id="2989523299700148168">अलीकडे भेट दिलेले</translation> <translation id="2996291259634659425">सांकेतिक पासफ्रेझ तयार करा</translation> @@ -426,6 +428,12 @@ <translation id="4226663524361240545">सूचनांमुळे डिव्हाइसचे कंपन होऊ शकते</translation> <translation id="423219824432660969"><ph name="TIME" /> पर्यंत Google पासवर्डसह सिंक केलेला डेटा एंक्रिप्ट करा</translation> <translation id="4242533952199664413">सेटिंग्ज उघडा</translation> +<translation id="4247274662191902962">तुम्ही VR अनुभवामध्ये असता तेव्हाच फक्त सेन्सर डेटा शेअर करू शकता. ही साइट खालील विशिष्ट माहिती वापरून तुमच्याबद्दल अधिक जाणून घेऊ शकते: + - तुमचे स्थान + - तुमची शारीरिक वैशिष्ट्ये, जसे की, डोळ्यांची रचना + - तुमच्या हालचाली, जसे की, तुम्ही कसे चालता + + ॲक्सेसची अनुमती देण्यापूर्वी तुम्ही या साइवर विश्वास ठेवता याची खात्री करा.</translation> <translation id="424864128008805179">Chrome मधून साइन आउट करायचे?</translation> <translation id="4256782883801055595">मुक्त स्रोत परवाने</translation> <translation id="4259722352634471385">नेव्हिगेशन अवरोधित केले आहे: <ph name="URL" /></translation> @@ -598,6 +606,7 @@ <translation id="545042621069398927">तुमच्या डाउनलोडचा वेग वाढवत आहे.</translation> <translation id="5456381639095306749">पेज डाउनलोड करा</translation> <translation id="5475862044948910901">ऑगमेंटेड रीअॅलिटी सेशन सुरू करायचे का?</translation> +<translation id="5481942164684849270"><ph name="APP_NAME" /> माझ्या अॅप्समध्ये जोडले आहे</translation> <translation id="548278423535722844">नकाशे ॲपमध्ये उघडा</translation> <translation id="5487521232677179737">डेटा साफ करा</translation> <translation id="5494752089476963479">अनाहूत किंवा दिशाभूल करणाऱ्या जाहिराती दाखवणाऱ्या साइटवरील जाहिराती ब्लॉक करा</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_ms.xtb b/chrome/android/java/strings/translations/android_chrome_strings_ms.xtb index 375e200..81a5100 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_ms.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_ms.xtb
@@ -223,6 +223,7 @@ <translation id="2567385386134582609">IMEJ</translation> <translation id="257088987046510401">Tema</translation> <translation id="2570922361219980984">Akses lokasi turut dimatikan untuk peranti ini. Hidupkannya dalam <ph name="BEGIN_LINK" />Tetapan Android<ph name="END_LINK" />.</translation> +<translation id="257674075312929031">Kumpulan</translation> <translation id="257931822824936280">Dikembangkan - klik untuk meruntuhkan.</translation> <translation id="2581165646603367611">Tindakan ini akan menghapuskan kuki, cache dan data tapak yang lain yang Chrome anggap tidak penting.</translation> <translation id="2586657967955657006">Papan Keratan</translation> @@ -274,6 +275,7 @@ <translation id="2956410042958133412">Akaun ini diurus oleh <ph name="PARENT_NAME_1" /> dan <ph name="PARENT_NAME_2" />.</translation> <translation id="2962095958535813455">Beralih ke tab inkognito</translation> <translation id="2968755619301702150">Pemapar sijil</translation> +<translation id="2977480621796371840">Alih keluar daripada kumpulan</translation> <translation id="2979025552038692506">Tab Inkognito yang Dipilih</translation> <translation id="2989523299700148168">Dilawati baru-baru ini</translation> <translation id="2996291259634659425">Buat ungkapan laluan</translation> @@ -426,6 +428,12 @@ <translation id="4226663524361240545">Pemberitahuan boleh menggetarkan peranti</translation> <translation id="423219824432660969">Sulitkan data yang disegerakkan dengan kata laluan Google bermula dari <ph name="TIME" /></translation> <translation id="4242533952199664413">Buka tetapan</translation> +<translation id="4247274662191902962">Data penderia hanya akan dikongsi semasa anda dalam pengalaman VR ini. Tapak ini mungkin dapat mengetahui tentang anda menggunakan maklumat tertentu, seperti: + - Lokasi anda + - Ciri fizikal anda, seperti kedudukan mata + - Pergerakan anda, seperti cara anda berjalan + + Pastikan anda mempercayai tapak ini sebelum anda membenarkan akses.</translation> <translation id="424864128008805179">Log keluar daripada Chrome?</translation> <translation id="4256782883801055595">Lesen sumber terbuka</translation> <translation id="4259722352634471385">Navigasi disekat: <ph name="URL" /></translation> @@ -598,6 +606,7 @@ <translation id="545042621069398927">Mempercepatkan muat turun anda.</translation> <translation id="5456381639095306749">Muat turun halaman</translation> <translation id="5475862044948910901">Mulakan sesi Realiti Tambahan?</translation> +<translation id="5481942164684849270"><ph name="APP_NAME" /> ditambahkan pada apl saya</translation> <translation id="548278423535722844">Buka dalam apl peta</translation> <translation id="5487521232677179737">Kosongkan data</translation> <translation id="5494752089476963479">Sekat iklan di tapak yang menyiarkan iklan yang mengganggu atau mengelirukan</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_nl.xtb b/chrome/android/java/strings/translations/android_chrome_strings_nl.xtb index 93bc61f..4d7b02b 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_nl.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_nl.xtb
@@ -223,6 +223,7 @@ <translation id="2567385386134582609">AFBEELDING</translation> <translation id="257088987046510401">Thema's</translation> <translation id="2570922361219980984">Locatietoegang is ook uitgeschakeld voor dit apparaat. Schakel dit in via de <ph name="BEGIN_LINK" />Android-instellingen<ph name="END_LINK" />.</translation> +<translation id="257674075312929031">Groep</translation> <translation id="257931822824936280">Uitgevouwen; klik om samen te vouwen.</translation> <translation id="2581165646603367611">Hiermee worden cookies, het cachegeheugen en andere gegevens gewist van sites waarvan Chrome denkt dat deze niet belangrijk zijn.</translation> <translation id="2586657967955657006">Klembord</translation> @@ -274,6 +275,7 @@ <translation id="2956410042958133412">Dit account wordt beheerd door <ph name="PARENT_NAME_1" /> en <ph name="PARENT_NAME_2" />.</translation> <translation id="2962095958535813455">Overgeschakeld naar incognitotabbladen</translation> <translation id="2968755619301702150">Certificaatviewer</translation> +<translation id="2977480621796371840">Uit groep verwijderen</translation> <translation id="2979025552038692506">Geselecteerd incognitotabblad</translation> <translation id="2989523299700148168">Onlangs bezocht</translation> <translation id="2996291259634659425">Wachtwoordzin maken</translation> @@ -426,6 +428,12 @@ <translation id="4226663524361240545">Het apparaat kan trillen bij meldingen</translation> <translation id="423219824432660969">Gesynchroniseerde gegevens versleutelen met Google-wachtwoord vanaf <ph name="TIME" /></translation> <translation id="4242533952199664413">Instellingen openen</translation> +<translation id="4247274662191902962">Sensorgegevens worden alleen gedeeld wanneer je deze VR-functie gebruikt. De site kan je mogelijk herkennen aan de hand van bepaalde gegevens, zoals: + - Je locatie + - Je fysieke kenmerken, zoals de positie van je ogen + - Je bewegingen, zoals hoe je loopt + + Controleer of je de site vertrouwt voordat je deze toegang geeft.</translation> <translation id="424864128008805179">Uitloggen bij Chrome?</translation> <translation id="4256782883801055595">Open-sourcelicenties</translation> <translation id="4259722352634471385">Navigatie is geblokkeerd: <ph name="URL" /></translation> @@ -598,6 +606,7 @@ <translation id="545042621069398927">Je download wordt versneld.</translation> <translation id="5456381639095306749">Pagina downloaden</translation> <translation id="5475862044948910901">Augmented reality-sessie starten?</translation> +<translation id="5481942164684849270"><ph name="APP_NAME" /> toegevoegd aan mijn apps</translation> <translation id="548278423535722844">Openen in app voor passen</translation> <translation id="5487521232677179737">Gegevens wissen</translation> <translation id="5494752089476963479">Advertenties blokkeren op sites die opdringerige of misleidende advertenties weergeven</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_no.xtb b/chrome/android/java/strings/translations/android_chrome_strings_no.xtb index c7cc485..ff55b31 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_no.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_no.xtb
@@ -2,6 +2,7 @@ <!DOCTYPE translationbundle> <translationbundle lang="no"> <translation id="1006017844123154345">Åpne på nettet</translation> +<translation id="1028699632127661925">Sender til <ph name="DEVICE_NAME" /> …</translation> <translation id="1036727731225946849">Legger til <ph name="WEBAPK_NAME" /> …</translation> <translation id="1041308826830691739">Fra nettsteder</translation> <translation id="1049743911850919806">Inkognito</translation> @@ -43,6 +44,7 @@ <translation id="1260236875608242557">Søk og utforsk</translation> <translation id="1264974993859112054">Sport</translation> <translation id="1272079795634619415">Stopp</translation> +<translation id="1272444412400969138">Enhetsvelger for fanedeling.</translation> <translation id="1283039547216852943">Trykk for å vise</translation> <translation id="1285320974508926690">Oversett aldri dette nettstedet</translation> <translation id="1291207594882862231">Slett loggoppføringer, informasjonskapsler, nettstedsdata, bufferen …</translation> @@ -59,6 +61,7 @@ <translation id="138361230106469022">Hei, <ph name="FULL_NAME" /></translation> <translation id="1383876407941801731">Søk</translation> <translation id="1384959399684842514">Nedlastingen er satt på pause</translation> +<translation id="1386674309198842382">Aktiv for <ph name="LAST_UPDATED" /> dager siden</translation> <translation id="1389974829397082527">Det er ingen bokmerker her</translation> <translation id="1397811292916898096">Søk med <ph name="PRODUCT_NAME" /></translation> <translation id="1404122904123200417">Innbygd i <ph name="WEBSITE_URL" /></translation> @@ -223,6 +226,7 @@ <translation id="2567385386134582609">BILDE</translation> <translation id="257088987046510401">Temaer</translation> <translation id="2570922361219980984">Posisjonstilgang er også slått av for denne enheten. Slå den på i <ph name="BEGIN_LINK" />Android-innstillingene<ph name="END_LINK" />.</translation> +<translation id="257674075312929031">Gruppe</translation> <translation id="257931822824936280">Utvidet – klikk for å minimere.</translation> <translation id="2581165646603367611">Dette sletter informasjonskapsler, buffere og annen data fra nettsteder Chrome ikke tror er viktige.</translation> <translation id="2586657967955657006">Utklippstavle</translation> @@ -274,6 +278,7 @@ <translation id="2956410042958133412">Denne kontoen er administrert av <ph name="PARENT_NAME_1" /> og <ph name="PARENT_NAME_2" />.</translation> <translation id="2962095958535813455">Byttet til inkognitofaner</translation> <translation id="2968755619301702150">Visningsprogram for sertifikater</translation> +<translation id="2977480621796371840">Fjern fra gruppen</translation> <translation id="2979025552038692506">Valgt inkognitofane</translation> <translation id="2989523299700148168">Nylig besøkte</translation> <translation id="2996291259634659425">Opprett en passordfrase</translation> @@ -400,6 +405,7 @@ <translation id="4008040567710660924">Tillat informasjonskapsler for et spesifikt nettsted.</translation> <translation id="4034817413553209278">{HOURS,plural, =1{# t}other{# t}}</translation> <translation id="4042870126885713738">Vis forslag når en nettadresse ikke fungerer eller en tilkobling ikke kan opprettes</translation> +<translation id="4044912625106523635">Enhetsvelgeren for fanedeling er åpnet i full høyde.</translation> <translation id="4046123991198612571">Neste spor</translation> <translation id="4048707525896921369">Finn ut om emner på nettsteder uten å forlate siden. «Trykk for å søke» sender et ord og omkringliggende kontekst til Google Søk, slik at definisjoner, bilder, søkeresultater og annen informasjon returneres. @@ -426,6 +432,12 @@ <translation id="4226663524361240545">Varsler kan gjøre at enheten vibrerer</translation> <translation id="423219824432660969">Kryptér synkroniserte data med Google-passord fra og med <ph name="TIME" /></translation> <translation id="4242533952199664413">Åpne innstillingene</translation> +<translation id="4247274662191902962">Sensordata deles bare mens du er i denne VR-opplevelsen. Nettstedet kan kanskje finne ut ting om deg ved å bruke visse opplysninger, for eksempel + - posisjonen din + - fysiske kjennetegn, som plassering av øyne + - bevegelsene dine, for eksempel måten du går på + + Forsikre deg om at du stoler på dette nettstedet før du gir tilgang.</translation> <translation id="424864128008805179">Vil du logge av Chrome?</translation> <translation id="4256782883801055595">Lisenser for åpen kildekode</translation> <translation id="4259722352634471385">Nettadressen er blokkert: <ph name="URL" /></translation> @@ -571,6 +583,7 @@ <translation id="5271967389191913893">Enheten kan ikke åpne innholdet som skal lastes ned.</translation> <translation id="528192093759286357">Dra ned fra toppen og trykk på tilbakeknappen for å avslutte fullskjerm.</translation> <translation id="5284584623296338184">Endringer i bokmerker, loggoppføringer, passord og andre innstillinger blir ikke synkronisert med Google-kontoen din lenger. Data som allerede er lagret i Google-kontoen din, blir imidlertid ikke fjernet.</translation> +<translation id="5292796745632149097">Send til</translation> <translation id="5300589172476337783">Vis</translation> <translation id="5301954838959518834">Greit</translation> <translation id="5304593522240415983">Dette feltet må fylles ut</translation> @@ -598,6 +611,7 @@ <translation id="545042621069398927">Øker hastigheten på nedlastingen.</translation> <translation id="5456381639095306749">Last ned siden</translation> <translation id="5475862044948910901">Vil du starte en økt med utvidet virkelighet?</translation> +<translation id="5481942164684849270"><ph name="APP_NAME" /> er lagt til i appene mine</translation> <translation id="548278423535722844">Åpne i en kartapp</translation> <translation id="5487521232677179737">Slett data</translation> <translation id="5494752089476963479">Blokkér annonser på nettsteder som ofte viser forstyrrende eller villedende annonser</translation> @@ -731,6 +745,7 @@ <translation id="6406506848690869874">Synkroniser</translation> <translation id="641643625718530986">Skriv ut</translation> <translation id="6416782512398055893"><ph name="MBS" /> MB er lastet ned</translation> +<translation id="6418750371676080905">Enhetsvelgeren for fanedeling er lukket.</translation> <translation id="6427112570124116297">Oversett nettet</translation> <translation id="6433501201775827830">Velg søkemotor</translation> <translation id="6437478888915024427">Sideinformasjon</translation> @@ -770,6 +785,7 @@ <translation id="666268767214822976">Bruk en forslagstjeneste for å vise relaterte søkeord og populære nettsteder mens du skriver i adressefeltet</translation> <translation id="666731172850799929">Åpne i <ph name="APP_NAME" /></translation> <translation id="666981079809192359">Merknad om personvern for Chrome</translation> +<translation id="6672986458216094438">Enhetsvelgeren for fanedeling er åpnet i halv høyde.</translation> <translation id="6697492270171225480">Viser forslag for lignende sider når en side ikke kan finnes</translation> <translation id="6697947395630195233">Chrome trenger tilgang til posisjonen din for å kunne dele den med dette nettstedet.</translation> <translation id="6698801883190606802">Administrer synkroniserte data</translation> @@ -947,6 +963,7 @@ <translation id="7942131818088350342"><ph name="PRODUCT_NAME" /> er utdatert.</translation> <translation id="7947953824732555851">Godta og logg på</translation> <translation id="7963646190083259054">Leverandør:</translation> +<translation id="7971136598759319605">Aktiv for én dag siden</translation> <translation id="7975379999046275268">Forhåndsvis siden <ph name="BEGIN_NEW" />Nyhet<ph name="END_NEW" /></translation> <translation id="7981313251711023384">Last inn sider på forhånd for raskere nettlesing og søk</translation> <translation id="79859296434321399">Du må installere ARCore for å se innhold med utvidet virkelighet</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_pl.xtb b/chrome/android/java/strings/translations/android_chrome_strings_pl.xtb index 658f928..40dee0855 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_pl.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_pl.xtb
@@ -2,6 +2,7 @@ <!DOCTYPE translationbundle> <translationbundle lang="pl"> <translation id="1006017844123154345">Otwórz online</translation> +<translation id="1028699632127661925">Przesyłam na: <ph name="DEVICE_NAME" />…</translation> <translation id="1036727731225946849">Dodaję aplikację <ph name="WEBAPK_NAME" />…</translation> <translation id="1041308826830691739">Ze stron internetowych</translation> <translation id="1049743911850919806">Incognito</translation> @@ -43,6 +44,7 @@ <translation id="1260236875608242557">Szukaj i przeglądaj</translation> <translation id="1264974993859112054">Sport</translation> <translation id="1272079795634619415">Zatrzymaj</translation> +<translation id="1272444412400969138">Selektor urządzenia, któremu udostępniasz kartę.</translation> <translation id="1283039547216852943">Kliknij, by rozwinąć</translation> <translation id="1285320974508926690">Nigdy nie tłumacz tej witryny</translation> <translation id="1291207594882862231">Wyczyść historię, pliki cookie, dane witryn, pamięć podręczną…</translation> @@ -59,6 +61,7 @@ <translation id="138361230106469022">Witaj, <ph name="FULL_NAME" /></translation> <translation id="1383876407941801731">Szukaj</translation> <translation id="1384959399684842514">Pobieranie wstrzymane</translation> +<translation id="1386674309198842382">Aktywność <ph name="LAST_UPDATED" /> dni temu</translation> <translation id="1389974829397082527">Brak zakładek</translation> <translation id="1397811292916898096">Szukaj w <ph name="PRODUCT_NAME" /></translation> <translation id="1404122904123200417">Umieszczone na <ph name="WEBSITE_URL" /></translation> @@ -223,6 +226,7 @@ <translation id="2567385386134582609">OBRAZ</translation> <translation id="257088987046510401">Motywy</translation> <translation id="2570922361219980984">Dostęp do lokalizacji jest wyłączony też na tym urządzeniu. Włącz go w <ph name="BEGIN_LINK" />Ustawieniach Androida<ph name="END_LINK" />.</translation> +<translation id="257674075312929031">Grupa</translation> <translation id="257931822824936280">Rozwinięty – kliknij, by zwinąć.</translation> <translation id="2581165646603367611">Spowoduje to skasowanie plików cookie, pamięci podręcznej i innych danych witryn, które Chrome uzna za nieistotne.</translation> <translation id="2586657967955657006">Schowek</translation> @@ -274,6 +278,7 @@ <translation id="2956410042958133412">Tym kontem zarządzają <ph name="PARENT_NAME_1" /> i <ph name="PARENT_NAME_2" />.</translation> <translation id="2962095958535813455">Przełączono na karty incognito</translation> <translation id="2968755619301702150">Przeglądarka certyfikatów</translation> +<translation id="2977480621796371840">Usuń z grupy</translation> <translation id="2979025552038692506">Wybrana karta incognito</translation> <translation id="2989523299700148168">Ostatnio odwiedzone</translation> <translation id="2996291259634659425">Utwórz hasło</translation> @@ -400,6 +405,7 @@ <translation id="4008040567710660924">Zezwalaj na pliki cookie z określonej strony internetowej.</translation> <translation id="4034817413553209278">{HOURS,plural, =1{# godzina}few{# godziny}many{# godzin}other{# godziny}}</translation> <translation id="4042870126885713738">Pokazuj podpowiedzi, gdy nie można znaleźć adresu internetowego lub nawiązać połączenia</translation> +<translation id="4044912625106523635">Selektor urządzenia, któremu udostępniasz kartę, jest otwarty na pełną wysokość.</translation> <translation id="4046123991198612571">Następny utwór</translation> <translation id="4048707525896921369">Poznaj tematy w witrynach bez opuszczania strony. Funkcja Kliknij, by wyszukać kopiuje słowo wraz z kontekstem i wkleja je w wyszukiwarce Google. Dzięki temu otrzymujesz definicje, grafiki, wyniki wyszukiwania i inne informacje. @@ -426,6 +432,12 @@ <translation id="4226663524361240545">Powiadomienia będą sygnalizowane wibracjami</translation> <translation id="423219824432660969">Zaszyfruj synchronizowane dane hasłem Google z <ph name="TIME" /></translation> <translation id="4242533952199664413">Otwórz ustawienia</translation> +<translation id="4247274662191902962">Dane z czujników będą udostępniane tylko wtedy, gdy będziesz używać tego doświadczenia związanego z VR. Strona może być w stanie poznać Cię na podstawie pewnych informacji, takich jak: + – Twoja lokalizacja; + – Twoje cechy fizyczne, na przykład położenie oczu; + – Twoje ruchy, na przykład sposób chodzenia. + + Zanim zezwolisz stronie na dostęp, upewnij się, że możesz jej zaufać.</translation> <translation id="424864128008805179">Wylogować z Chrome?</translation> <translation id="4256782883801055595">Licencje open source</translation> <translation id="4259722352634471385">Adres zablokowany: <ph name="URL" /></translation> @@ -571,6 +583,7 @@ <translation id="5271967389191913893">Na tym urządzeniu nie można otworzyć treści, które chcesz pobrać.</translation> <translation id="528192093759286357">Przeciągnij od góry i kliknij przycisk Wstecz, by wyjść z trybu pełnoekranowego.</translation> <translation id="5284584623296338184">Zmiany w zakładkach, historii, hasłach i innych ustawieniach nie będą już synchronizowane z kontem Google. Twoje obecne dane będą jednak nadal na nim przechowywane.</translation> +<translation id="5292796745632149097">Wyślij na</translation> <translation id="5300589172476337783">Pokaż</translation> <translation id="5301954838959518834">Rozumiem</translation> <translation id="5304593522240415983">To pole nie może być puste</translation> @@ -598,6 +611,7 @@ <translation id="545042621069398927">Przyspieszam pobieranie.</translation> <translation id="5456381639095306749">Pobierz stronę</translation> <translation id="5475862044948910901">Rozpocząć sesję rzeczywistości rozszerzonej?</translation> +<translation id="5481942164684849270"><ph name="APP_NAME" /> – dodano do aplikacji</translation> <translation id="548278423535722844">Otwórz w aplikacji z mapami</translation> <translation id="5487521232677179737">Wyczyść dane</translation> <translation id="5494752089476963479">Blokuj reklamy na stronach, które wyświetlają reklamy uciążliwe lub wprowadzające w błąd</translation> @@ -731,6 +745,7 @@ <translation id="6406506848690869874">Synchronizacja</translation> <translation id="641643625718530986">Drukuj…</translation> <translation id="6416782512398055893">Pobrano <ph name="MBS" /> MB</translation> +<translation id="6418750371676080905">Selektor urządzenia, któremu udostępniasz kartę, jest zamknięty.</translation> <translation id="6427112570124116297">Tłumacz internet</translation> <translation id="6433501201775827830">Wybierz wyszukiwarkę</translation> <translation id="6437478888915024427">Informacje o stronie</translation> @@ -770,6 +785,7 @@ <translation id="666268767214822976">Gdy piszesz na pasku adresu, korzystaj z podpowiedzi, by wyświetlać podobne zapytania i adresy popularnych stron</translation> <translation id="666731172850799929">Otwórz w <ph name="APP_NAME" /></translation> <translation id="666981079809192359">Informacje na temat ochrony prywatności w Chrome</translation> +<translation id="6672986458216094438">Selektor urządzenia, któremu udostępniasz kartę, jest otwarty na pół wysokości.</translation> <translation id="6697492270171225480">Gdy nie można odnaleźć strony, pokazuj sugestie podobnych stron</translation> <translation id="6697947395630195233">Chrome musi mieć dostęp do Twojej lokalizacji, by udostępnić ją tej stronie.</translation> <translation id="6698801883190606802">Zarządzaj synchronizowanymi danymi</translation> @@ -947,6 +963,7 @@ <translation id="7942131818088350342">Przeglądarka <ph name="PRODUCT_NAME" /> jest nieaktualna.</translation> <translation id="7947953824732555851">Zaakceptuj i zaloguj się</translation> <translation id="7963646190083259054">Dostawca:</translation> +<translation id="7971136598759319605">Aktywność 1 dzień temu</translation> <translation id="7975379999046275268">Wyświetl podgląd strony <ph name="BEGIN_NEW" />Nowość<ph name="END_NEW" /></translation> <translation id="7981313251711023384">Ładuj wstępnie strony, by przyspieszyć przeglądanie i wyszukiwanie</translation> <translation id="79859296434321399">Aby oglądać treści rzeczywistości rozszerzonej, zainstaluj ARCore</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_pt-BR.xtb b/chrome/android/java/strings/translations/android_chrome_strings_pt-BR.xtb index dd78ba1..9740941 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_pt-BR.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_pt-BR.xtb
@@ -223,6 +223,7 @@ <translation id="2567385386134582609">IMAGEM</translation> <translation id="257088987046510401">Temas</translation> <translation id="2570922361219980984">O acesso ao local também está desativado para este dispositivo. Ative-o nas <ph name="BEGIN_LINK" />Configurações do Android<ph name="END_LINK" />.</translation> +<translation id="257674075312929031">Grupo</translation> <translation id="257931822824936280">Visualização expandida. Clique para recolher</translation> <translation id="2581165646603367611">Essa ação limpará os cookies, cache e outros dados de sites que o Chrome não acredita serem importantes.</translation> <translation id="2586657967955657006">Área de transferência</translation> @@ -274,6 +275,7 @@ <translation id="2956410042958133412">Esta conta é gerenciada por <ph name="PARENT_NAME_1" /> e <ph name="PARENT_NAME_2" />.</translation> <translation id="2962095958535813455">Alternada para guias anônimas</translation> <translation id="2968755619301702150">Leitor de certificados</translation> +<translation id="2977480621796371840">Remover do grupo</translation> <translation id="2979025552038692506">Guia anônima selecionada</translation> <translation id="2989523299700148168">Visitados recentemente</translation> <translation id="2996291259634659425">Criar senha longa</translation> @@ -426,6 +428,12 @@ <translation id="4226663524361240545">É possível que as notificações façam o dispositivo vibrar</translation> <translation id="423219824432660969">Criptografar dados sincronizados com a senha do Google a partir de <ph name="TIME" /></translation> <translation id="4242533952199664413">Abrir configurações.</translation> +<translation id="4247274662191902962">Os dados do sensor serão compartilhados apenas enquanto você estiver nesta experiência de RV. É possível que o site aprenda sobre você usando algumas informações, como estas: + - Sua localização + - Suas características físicas, como a posição dos olhos + - Seus movimentos, como a maneira como você caminha + + Certifique-se de que esse site seja confiável antes de conceder acesso.</translation> <translation id="424864128008805179">Sair do Google Chrome?</translation> <translation id="4256782883801055595">Licenças de código aberto</translation> <translation id="4259722352634471385">A Navegação GPS está bloqueada: <ph name="URL" /></translation> @@ -599,6 +607,7 @@ <translation id="545042621069398927">Acelerando seu download.</translation> <translation id="5456381639095306749">Fazer o download da página</translation> <translation id="5475862044948910901">Iniciar sessão de realidade aumentada?</translation> +<translation id="5481942164684849270"><ph name="APP_NAME" /> adicionado aos meus apps</translation> <translation id="548278423535722844">Abrir no app de mapa</translation> <translation id="5487521232677179737">Limpar dados</translation> <translation id="5494752089476963479">Bloquear anúncios em sites com publicidade invasiva ou enganosa</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_pt-PT.xtb b/chrome/android/java/strings/translations/android_chrome_strings_pt-PT.xtb index 171cedbd..1168838 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_pt-PT.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_pt-PT.xtb
@@ -2,6 +2,7 @@ <!DOCTYPE translationbundle> <translationbundle lang="pt-PT"> <translation id="1006017844123154345">Abrir online</translation> +<translation id="1028699632127661925">A enviar para <ph name="DEVICE_NAME" />…</translation> <translation id="1036727731225946849">A adicionar <ph name="WEBAPK_NAME" />...</translation> <translation id="1041308826830691739">De Websites</translation> <translation id="1049743911850919806">Navegação anónima</translation> @@ -43,6 +44,7 @@ <translation id="1260236875608242557">Pesquisar e explorar</translation> <translation id="1264974993859112054">Desporto</translation> <translation id="1272079795634619415">Parar</translation> +<translation id="1272444412400969138">O selecionador do dispositivo com o qual pretende partilhar um separador.</translation> <translation id="1283039547216852943">Toque para expandir</translation> <translation id="1285320974508926690">Nunca traduzir este site</translation> <translation id="1291207594882862231">Limpar histórico, cookies, dados de sites, cache…</translation> @@ -59,6 +61,7 @@ <translation id="138361230106469022">Olá, <ph name="FULL_NAME" /></translation> <translation id="1383876407941801731">Pesquisar</translation> <translation id="1384959399684842514">Transferência interrompida</translation> +<translation id="1386674309198842382">Ativo há <ph name="LAST_UPDATED" /> dias</translation> <translation id="1389974829397082527">Nenhum marcador aqui</translation> <translation id="1397811292916898096">Pesquisar com o <ph name="PRODUCT_NAME" /></translation> <translation id="1404122904123200417">Incorporado em <ph name="WEBSITE_URL" /></translation> @@ -223,6 +226,7 @@ <translation id="2567385386134582609">IMAGEM</translation> <translation id="257088987046510401">Temas</translation> <translation id="2570922361219980984">O acesso à localização também está desativado para este dispositivo. Ative-o nas <ph name="BEGIN_LINK" />Definições do Android<ph name="END_LINK" />.</translation> +<translation id="257674075312929031">Grupo</translation> <translation id="257931822824936280">Expandido. Clique para reduzir.</translation> <translation id="2581165646603367611">Esta ação elimina os cookies, a cache e outros dados de sites que o Chrome não considera importantes.</translation> <translation id="2586657967955657006">Área de transferência</translation> @@ -274,6 +278,7 @@ <translation id="2956410042958133412">Esta conta é gerida por <ph name="PARENT_NAME_1" /> e por <ph name="PARENT_NAME_2" />.</translation> <translation id="2962095958535813455">Mudado para separadores de navegação anónima</translation> <translation id="2968755619301702150">Visualizador de certificados</translation> +<translation id="2977480621796371840">Remover do grupo</translation> <translation id="2979025552038692506">Separador de navegação anónima selecionado</translation> <translation id="2989523299700148168">Visitados recentemente</translation> <translation id="2996291259634659425">Criar frase de acesso</translation> @@ -400,6 +405,7 @@ <translation id="4008040567710660924">Permita cookies para um site específico.</translation> <translation id="4034817413553209278">{HOURS,plural, =1{# h}other{# h}}</translation> <translation id="4042870126885713738">Mostrar sugestões quando um endereço Web não responder ou não for possível estabelecer ligação</translation> +<translation id="4044912625106523635">O selecionador do dispositivo com o qual pretende partilhar um separador está aberto à altura total.</translation> <translation id="4046123991198612571">Faixa seguinte</translation> <translation id="4048707525896921369">Saiba mais acerca dos tópicos nos Websites sem sair da página. A funcionalidade Tocar para pesquisar envia uma palavra e o contexto circundante para a Pesquisa Google, que devolve definições, imagens, resultados da pesquisa e outros detalhes. @@ -426,6 +432,12 @@ <translation id="4226663524361240545">As notificações podem fazer com que o dispositivo vibre</translation> <translation id="423219824432660969">Encriptar dados sincronizados com a palavra-passe do Google a partir de <ph name="TIME" /></translation> <translation id="4242533952199664413">Abrir definições</translation> +<translation id="4247274662191902962">Os dados de sensores apenas serão partilhados enquanto estiver nesta experiência de RV. O site pode conhecê-lo através de determinadas informações, como: + - A sua localização. + - As suas caraterísticas físicas, como a posição dos olhos. + - Os seus movimentos, como o seu modo de caminhar. + + Certifique-se de que confia neste site antes de permitir o acesso.</translation> <translation id="424864128008805179">Pretende terminar sessão no Chrome?</translation> <translation id="4256782883801055595">Licenças de código aberto</translation> <translation id="4259722352634471385">A navegação está bloqueada: <ph name="URL" /></translation> @@ -571,6 +583,7 @@ <translation id="5271967389191913893">O dispositivo não consegue abrir o conteúdo a transferir.</translation> <translation id="528192093759286357">Arraste a partir da parte superior e toque no botão de retrocesso para sair do ecrã inteiro.</translation> <translation id="5284584623296338184">As alterações aos marcadores, ao histórico, às palavras-passe e a outras definições deixam de ser sincronizadas com a Conta Google. Contudo, os dados existentes permanecem armazenados na Conta Google.</translation> +<translation id="5292796745632149097">Enviar para</translation> <translation id="5300589172476337783">Mostrar</translation> <translation id="5301954838959518834">OK, compreendi</translation> <translation id="5304593522240415983">Este campo não pode estar em branco</translation> @@ -598,6 +611,7 @@ <translation id="545042621069398927">A acelerar a transferência…</translation> <translation id="5456381639095306749">Transferir página</translation> <translation id="5475862044948910901">Pretende iniciar a sessão de realidade aumentada?</translation> +<translation id="5481942164684849270">A aplicação <ph name="APP_NAME" /> foi adicionada às minhas aplicações</translation> <translation id="548278423535722844">Abrir na aplicação de mapas</translation> <translation id="5487521232677179737">Limpar dados</translation> <translation id="5494752089476963479">Bloquear anúncios em sites que apresentam anúncios intrusivos ou enganadores</translation> @@ -731,6 +745,7 @@ <translation id="6406506848690869874">Sincronização</translation> <translation id="641643625718530986">Imprimir…</translation> <translation id="6416782512398055893"><ph name="MBS" /> MB transferido(s)</translation> +<translation id="6418750371676080905">O selecionador do dispositivo com o qual pretende partilhar um separador está fechado.</translation> <translation id="6427112570124116297">Traduzir a Web</translation> <translation id="6433501201775827830">Escolher o motor de pesquisa</translation> <translation id="6437478888915024427">Informações da página</translation> @@ -770,6 +785,7 @@ <translation id="666268767214822976">Utilizar um serviço de previsão para mostrar consultas relacionadas e Sites populares à medida que escreve na barra de endereço</translation> <translation id="666731172850799929">Abrir no <ph name="APP_NAME" /></translation> <translation id="666981079809192359">Aviso de privacidade do Chrome</translation> +<translation id="6672986458216094438">O selecionador do dispositivo com o qual pretende partilhar um separador está aberto a meia altura.</translation> <translation id="6697492270171225480">Mostrar sugestões de páginas semelhantes se não for possível encontrar uma página</translation> <translation id="6697947395630195233">O Chrome precisa de acesso à sua localização para a partilhar com este site.</translation> <translation id="6698801883190606802">Gerir dados sincronizados</translation> @@ -947,6 +963,7 @@ <translation id="7942131818088350342">O <ph name="PRODUCT_NAME" /> está desatualizado.</translation> <translation id="7947953824732555851">Aceitar e in. sessão</translation> <translation id="7963646190083259054">Fornecedor:</translation> +<translation id="7971136598759319605">Ativo há 1 dia</translation> <translation id="7975379999046275268">Pré-visualizar página <ph name="BEGIN_NEW" />Novo<ph name="END_NEW" /></translation> <translation id="7981313251711023384">Pré-carregar as páginas para uma navegação e uma pesquisa mais rápidas</translation> <translation id="79859296434321399">Para ver conteúdo de realidade aumentada, instale o ARCore.</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_ro.xtb b/chrome/android/java/strings/translations/android_chrome_strings_ro.xtb index e8bfdbb..0cc3428 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_ro.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_ro.xtb
@@ -2,6 +2,7 @@ <!DOCTYPE translationbundle> <translationbundle lang="ro"> <translation id="1006017844123154345">Deschide online</translation> +<translation id="1028699632127661925">Se trimite la <ph name="DEVICE_NAME" />...</translation> <translation id="1036727731225946849">Se adaugă <ph name="WEBAPK_NAME" />...</translation> <translation id="1041308826830691739">De la site-uri</translation> <translation id="1049743911850919806">Incognito</translation> @@ -43,6 +44,7 @@ <translation id="1260236875608242557">Caută și explorează</translation> <translation id="1264974993859112054">Sport</translation> <translation id="1272079795634619415">Oprește</translation> +<translation id="1272444412400969138">Selector de dispozitive pe care să trimiți o filă.</translation> <translation id="1283039547216852943">Atinge pentru a extinde</translation> <translation id="1285320974508926690">Nu traduce niciodată acest site</translation> <translation id="1291207594882862231">Șterge istoricul, cookie-urile, datele privind site-urile și memoria cache…</translation> @@ -59,6 +61,7 @@ <translation id="138361230106469022">Bună ziua, <ph name="FULL_NAME" /></translation> <translation id="1383876407941801731">Caută</translation> <translation id="1384959399684842514">Descărcare întreruptă</translation> +<translation id="1386674309198842382">Activ acum <ph name="LAST_UPDATED" /> zile</translation> <translation id="1389974829397082527">Dosarul nu conține marcaje</translation> <translation id="1397811292916898096">Caută folosind <ph name="PRODUCT_NAME" /></translation> <translation id="1404122904123200417">Încorporat în <ph name="WEBSITE_URL" /></translation> @@ -223,6 +226,7 @@ <translation id="2567385386134582609">IMAGINE</translation> <translation id="257088987046510401">Teme</translation> <translation id="2570922361219980984">Accesul la locație este dezactivat și pentru acest dispozitiv. Activează-l în <ph name="BEGIN_LINK" />Setări Android<ph name="END_LINK" />.</translation> +<translation id="257674075312929031">Grup</translation> <translation id="257931822824936280">Afișare extinsă – dă clic pentru a restrânge.</translation> <translation id="2581165646603367611">Astfel, vor fi șterse cookie-urile, memoria cache și alte date ale site-urilor pe care Chrome nu le consideră importante.</translation> <translation id="2586657967955657006">Clipboard</translation> @@ -274,6 +278,7 @@ <translation id="2956410042958133412">Acest cont este gestionat de <ph name="PARENT_NAME_1" /> și de <ph name="PARENT_NAME_2" />.</translation> <translation id="2962095958535813455">Ai comutat la filele incognito</translation> <translation id="2968755619301702150">Vizualizator de certificate</translation> +<translation id="2977480621796371840">Elimină din grup</translation> <translation id="2979025552038692506">Fila incognito selectată</translation> <translation id="2989523299700148168">Accesate recent</translation> <translation id="2996291259634659425">Creează o expresie de acces</translation> @@ -400,6 +405,7 @@ <translation id="4008040567710660924">Permite cookie-uri pentru un anumit site.</translation> <translation id="4034817413553209278">{HOURS,plural, =1{O oră}few{# ore}other{# de ore}}</translation> <translation id="4042870126885713738">Afișează sugestii atunci când o adresă web nu se rezolvă sau nu poate fi stabilită o conexiune</translation> +<translation id="4044912625106523635">Selectorul de dispozitive pe care să trimiți o filă este deschis la înălțimea completă.</translation> <translation id="4046123991198612571">Melodia următoare</translation> <translation id="4048707525896921369">Află despre subiectele de pe site-uri fără să părăsești pagina. Funcția Atinge pentru a căuta trimite un cuvânt și contextul aferent către Căutarea Google și returnează definiții, imagini, rezultate ale căutării și alte detalii. @@ -426,6 +432,12 @@ <translation id="4226663524361240545">Notificările pot face dispozitivul să vibreze</translation> <translation id="423219824432660969">Criptează datele sincronizate cu parola Google începând cu <ph name="TIME" /></translation> <translation id="4242533952199664413">Deschide setările</translation> +<translation id="4247274662191902962">Datele de la senzori vor fi distribuite doar când ești în această experiență RV. Acest site te-ar putea recunoaște, folosind anumite informații, precum: + - locația ta, + - trăsăturile tale fizice, cum ar fi poziția ochilor, + - mișcările tale, cum ar fi mersul. + + Asigură-te că ai încredere în acest site înainte să permiți accesul.</translation> <translation id="424864128008805179">Te deconectezi de la Chrome?</translation> <translation id="4256782883801055595">Licențe open source</translation> <translation id="4259722352634471385">Navigarea este blocată: <ph name="URL" /></translation> @@ -571,6 +583,7 @@ <translation id="5271967389191913893">Dispozitivul nu poate deschide conținutul de descărcat.</translation> <translation id="528192093759286357">Trage din partea de sus și atinge butonul Înapoi pentru a ieși din ecranul complet.</translation> <translation id="5284584623296338184">Modificările marcajelor, istoricului, parolelor sau ale altor setări nu vor mai fi sincronizate cu Contul Google. Totuși, datele existente vor rămâne stocate în Contul Google.</translation> +<translation id="5292796745632149097">Trimite la</translation> <translation id="5300589172476337783">Afișează</translation> <translation id="5301954838959518834">OK, am înțeles</translation> <translation id="5304593522240415983">Acest câmp trebuie completat</translation> @@ -598,6 +611,7 @@ <translation id="545042621069398927">Se accelerează descărcarea.</translation> <translation id="5456381639095306749">Descarcă pagina</translation> <translation id="5475862044948910901">Pornești sesiunea de realitate augmentată?</translation> +<translation id="5481942164684849270"><ph name="APP_NAME" /> adăugată în aplicațiile mele</translation> <translation id="548278423535722844">Deschide în aplicația Maps</translation> <translation id="5487521232677179737">Șterge datele</translation> <translation id="5494752089476963479">Blochează anunțurile pe site-urile care afișează anunțuri deranjante sau înșelătoare</translation> @@ -731,6 +745,7 @@ <translation id="6406506848690869874">Sincronizare</translation> <translation id="641643625718530986">Printați...</translation> <translation id="6416782512398055893"><ph name="MBS" /> MB descărcați</translation> +<translation id="6418750371676080905">Selectorul de dispozitive pe care să trimiți o filă este închis.</translation> <translation id="6427112570124116297">Tradu pe web</translation> <translation id="6433501201775827830">Alege motorul de căutare</translation> <translation id="6437478888915024427">Informații despre pagină</translation> @@ -770,6 +785,7 @@ <translation id="666268767214822976">Folosește un serviciu de predicții pentru a afișa interogări similare și site-uri populare în timp ce introduci text în bara de adrese.</translation> <translation id="666731172850799929">Deschide în <ph name="APP_NAME" /></translation> <translation id="666981079809192359">Notificare privind confidențialitatea Chrome</translation> +<translation id="6672986458216094438">Selectorul de dispozitive pe care să trimiți o filă este deschis la jumătate din înălțime.</translation> <translation id="6697492270171225480">Afișează sugestii pentru pagini similare atunci când o pagină nu poate fi găsită</translation> <translation id="6697947395630195233">Chrome are nevoie de acces la locația ta ca să permită accesul la locație pentru acest site.</translation> <translation id="6698801883190606802">Gestionează datele sincronizate</translation> @@ -947,6 +963,7 @@ <translation id="7942131818088350342"><ph name="PRODUCT_NAME" /> este învechit.</translation> <translation id="7947953824732555851">Accept și conectare</translation> <translation id="7963646190083259054">Producător:</translation> +<translation id="7971136598759319605">Activ acum o zi</translation> <translation id="7975379999046275268">Previzualizează pagina <ph name="BEGIN_NEW" />Nou<ph name="END_NEW" /></translation> <translation id="7981313251711023384">Preîncarcă paginile pentru navigare și căutare mai rapide</translation> <translation id="79859296434321399">Pentru a vedea conținut din realitatea augmentată, instalează ARCore</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_ru.xtb b/chrome/android/java/strings/translations/android_chrome_strings_ru.xtb index 1b80423..602f9a0 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_ru.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_ru.xtb
@@ -223,6 +223,7 @@ <translation id="2567385386134582609">ИЗОБРАЖЕНИЕ</translation> <translation id="257088987046510401">Темы</translation> <translation id="2570922361219980984">Определение местоположения отключено и для самого устройства. Включите эту функцию в <ph name="BEGIN_LINK" />настройках Android<ph name="END_LINK" />.</translation> +<translation id="257674075312929031">Группа.</translation> <translation id="257931822824936280">Развернуто. Нажмите, чтобы свернуть.</translation> <translation id="2581165646603367611">Будет очищен кеш, а также удалены файлы cookie и другие данные, которые система сочтет маловажными.</translation> <translation id="2586657967955657006">Буфер обмена</translation> @@ -274,6 +275,7 @@ <translation id="2956410042958133412">Этим аккаунтом управляют <ph name="PARENT_NAME_1" /> и <ph name="PARENT_NAME_2" />.</translation> <translation id="2962095958535813455">Переключено на вкладки в режиме инкогнито</translation> <translation id="2968755619301702150">Просмотр сертификатов</translation> +<translation id="2977480621796371840">Удалить из группы</translation> <translation id="2979025552038692506">Выбранная вкладка инкогнито</translation> <translation id="2989523299700148168">Недавние</translation> <translation id="2996291259634659425">Придумайте кодовую фразу</translation> @@ -426,6 +428,12 @@ <translation id="4226663524361240545">Вибрация при получении уведомлений</translation> <translation id="423219824432660969">Шифровать синхронизированные данные, используя пароль аккаунта Google от <ph name="TIME" /></translation> <translation id="4242533952199664413">Открыть настройки</translation> +<translation id="4247274662191902962">Данные датчиков будут использоваться только во время сеанса виртуальной реальности. Сайт сможет определять: + – ваше местоположение; + – ваши внешние черты, например положение глаз; + – ваши движения и походку. + + Предоставляйте доступ только тем сайтам, которым вы доверяете.</translation> <translation id="424864128008805179">Выйти из Chrome?</translation> <translation id="4256782883801055595">Лицензии на ПО с открытым кодом</translation> <translation id="4259722352634471385">Навигация заблокирована: <ph name="URL" /></translation> @@ -598,6 +606,7 @@ <translation id="545042621069398927">Ускорение скачивания…</translation> <translation id="5456381639095306749">Скачать страницу</translation> <translation id="5475862044948910901">Начать сеанс дополненной реальности?</translation> +<translation id="5481942164684849270"><ph name="APP_NAME" />: добавлено в "Мои приложения".</translation> <translation id="548278423535722844">Показать на карте</translation> <translation id="5487521232677179737">Удалить данные</translation> <translation id="5494752089476963479">Блокировать объявления на сайтах, которые показывают навязчивую или вводящую в заблуждение рекламу</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_sk.xtb b/chrome/android/java/strings/translations/android_chrome_strings_sk.xtb index da89128..1f06549a 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_sk.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_sk.xtb
@@ -2,6 +2,7 @@ <!DOCTYPE translationbundle> <translationbundle lang="sk"> <translation id="1006017844123154345">Otvoriť online</translation> +<translation id="1028699632127661925">Odosiela sa do zariadenia <ph name="DEVICE_NAME" />…</translation> <translation id="1036727731225946849">Pridáva sa <ph name="WEBAPK_NAME" />...</translation> <translation id="1041308826830691739">Z webov</translation> <translation id="1049743911850919806">Inkognito</translation> @@ -43,6 +44,7 @@ <translation id="1260236875608242557">Prehľadať a preskúmať</translation> <translation id="1264974993859112054">Šport</translation> <translation id="1272079795634619415">Zastaviť</translation> +<translation id="1272444412400969138">Výber zariadení, s ktorými sa má karta zdieľať.</translation> <translation id="1283039547216852943">Klepnutím rozbaliť</translation> <translation id="1285320974508926690">Nikdy neprekladať tieto webové stránky</translation> <translation id="1291207594882862231">Vymazať históriu, súbory cookie, dáta webov, vyrovnávaciu pamäť…</translation> @@ -59,6 +61,7 @@ <translation id="138361230106469022">Dobrý deň, <ph name="FULL_NAME" />,</translation> <translation id="1383876407941801731">Vyhľadávanie</translation> <translation id="1384959399684842514">Sťahovanie bolo pozastavené</translation> +<translation id="1386674309198842382">Aktívne pred <ph name="LAST_UPDATED" /> dňami</translation> <translation id="1389974829397082527">Žiadne záložky</translation> <translation id="1397811292916898096">Hľadať pomocou vyhľadávača <ph name="PRODUCT_NAME" /></translation> <translation id="1404122904123200417">Vložené na webe <ph name="WEBSITE_URL" /></translation> @@ -223,6 +226,7 @@ <translation id="2567385386134582609">OBRÁZOK</translation> <translation id="257088987046510401">Motívy</translation> <translation id="2570922361219980984">Prístup k polohe je vypnutý aj v tomto zariadení. Zapnite ho v <ph name="BEGIN_LINK" />Nastaveniach Androidu<ph name="END_LINK" />.</translation> +<translation id="257674075312929031">Skupina</translation> <translation id="257931822824936280">Rozbalená (zbalíte ju kliknutím)</translation> <translation id="2581165646603367611">Táto akcia vymaže súbory cookie, vyrovnávaciu pamäť a ďalšie údaje webov, ktoré Chrome nepovažuje za dôležité.</translation> <translation id="2586657967955657006">Schránka</translation> @@ -274,6 +278,7 @@ <translation id="2956410042958133412">Tento účet je spravovaný používateľmi <ph name="PARENT_NAME_1" /> a <ph name="PARENT_NAME_2" />.</translation> <translation id="2962095958535813455">Prepnuté na karty inkognito</translation> <translation id="2968755619301702150">Zobrazovač certifikátov</translation> +<translation id="2977480621796371840">Odstrániť zo skupiny</translation> <translation id="2979025552038692506">Vybratá karta inkognito</translation> <translation id="2989523299700148168">Nedávno navštívené</translation> <translation id="2996291259634659425">Vytvorenie prístupovej frázy</translation> @@ -400,6 +405,7 @@ <translation id="4008040567710660924">Povolenie súborov cookie konkrétneho webu</translation> <translation id="4034817413553209278">{HOURS,plural, =1{# hod.}few{# hod.}many{# hod.}other{# hod.}}</translation> <translation id="4042870126885713738">Zobrazovať návrhy, ak sa nedá nájsť webová adresa alebo nadviazať spojenie</translation> +<translation id="4044912625106523635">Výber zariadení, s ktorými sa má karta zdieľať, je otvorený na celú výšku.</translation> <translation id="4046123991198612571">Ďalšia skladba</translation> <translation id="4048707525896921369">Získajte informácie o témach na weboch bez toho, aby ste museli opustiť stránku. Vyhľadávanie klepnutím odošle slovo a súvisiaci kontext do Vyhľadávania Google a vráti definície, obrázky, výsledky vyhľadávania a ďalšie podrobnosti. @@ -426,6 +432,12 @@ <translation id="4226663524361240545">Upozornenia môžu pri prijatí na zariadení spustiť vibrovanie</translation> <translation id="423219824432660969">Šifrovať synchronizované údaje heslom Google od <ph name="TIME" /></translation> <translation id="4242533952199664413">Otvoriť nastavenia</translation> +<translation id="4247274662191902962">Dáta senzorov sa budú zdieľať iba vtedy, keď budete v tomto prostredí VR. Príslušný web o vás môže získať informácie pomocou určitých údajov, napríklad na základe: + – polohy; + – fyzických čŕt, napríklad umiestnenia očí; + – pohybov, napríklad štýlu chôdze. + + Skôr ako povolíte prístup, skontrolujte, či ide o dôveryhodný web.</translation> <translation id="424864128008805179">Odhlásiť sa z Chromu?</translation> <translation id="4256782883801055595">Licencie open source</translation> <translation id="4259722352634471385">Navigácia je zablokovaná: <ph name="URL" /></translation> @@ -571,6 +583,7 @@ <translation id="5271967389191913893">Zariadenie nemôže otvoriť obsah na stiahnutie</translation> <translation id="528192093759286357">Režim celej obrazovky ukončíte potiahnutím z hornej časti a klepnutím na tlačidlo Späť.</translation> <translation id="5284584623296338184">Záložky, história, heslá a ďalšie nastavenia sa už nebudú ďalej synchronizovať do vášho účtu Google. Vaše súčasné údaje však zostanú v účte Google zachované.</translation> +<translation id="5292796745632149097">Odoslanie do zariadení</translation> <translation id="5300589172476337783">Zobraziť</translation> <translation id="5301954838959518834">Dobre</translation> <translation id="5304593522240415983">Toto pole nesmie byť prázdne</translation> @@ -598,6 +611,7 @@ <translation id="545042621069398927">Sťahovanie sa zrýchľuje.</translation> <translation id="5456381639095306749">Stránka sťahovania</translation> <translation id="5475862044948910901">Chcete spustiť reláciu rozšírenej reality?</translation> +<translation id="5481942164684849270">Aplikácia <ph name="APP_NAME" /> bola pridaná do mojich aplikácií</translation> <translation id="548278423535722844">Otvorte v aplikácii pre mapy</translation> <translation id="5487521232677179737">Vymazať dáta</translation> <translation id="5494752089476963479">Blokovať reklamy webov, ktoré zobrazujú obťažujúce alebo zavádzajúce reklamy</translation> @@ -731,6 +745,7 @@ <translation id="6406506848690869874">Synchronizácia</translation> <translation id="641643625718530986">Tlačiť...</translation> <translation id="6416782512398055893">Stiahnuté: <ph name="MBS" /> MB</translation> +<translation id="6418750371676080905">Výber zariadení, s ktorým sa má karta zdieľať, je zavretý.</translation> <translation id="6427112570124116297">Preklad webu</translation> <translation id="6433501201775827830">Výber vyhľadávača</translation> <translation id="6437478888915024427">Informácie o stránke</translation> @@ -770,6 +785,7 @@ <translation id="666268767214822976">Predpovedať súvisiace dopyty a populárne weby pri zadávaní textu do panela s adresou</translation> <translation id="666731172850799929">Otvoriť v aplikácii <ph name="APP_NAME" /></translation> <translation id="666981079809192359">Oznámenie o ochrane súkromia prehliadača Chrome</translation> +<translation id="6672986458216094438">Výber zariadení, s ktorými sa má karta zdieľať, je otvorený na polovičnú výšku.</translation> <translation id="6697492270171225480">Zobraziť návrhy podobných stránok, keď sa stránka nedá nájsť</translation> <translation id="6697947395630195233">Chrome potrebuje prístup k vašej polohe, aby ju mohol zdieľať s týmto webom.</translation> <translation id="6698801883190606802">Spravovať synchronizované údaje</translation> @@ -947,6 +963,7 @@ <translation id="7942131818088350342">Aplikácia <ph name="PRODUCT_NAME" /> je zastaraná.</translation> <translation id="7947953824732555851">Prijať a prihl. sa</translation> <translation id="7963646190083259054">Dodávateľ:</translation> +<translation id="7971136598759319605">Aktívne včera</translation> <translation id="7975379999046275268">Zobraziť ukážku stránky <ph name="BEGIN_NEW" />Novinka<ph name="END_NEW" /></translation> <translation id="7981313251711023384">Vopred načítavať stránky na zrýchlenie prehliadania a vyhľadávania</translation> <translation id="79859296434321399">Ak chcete zobraziť obsah v rozšírenej realite, nainštalujte si ARCore</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_sl.xtb b/chrome/android/java/strings/translations/android_chrome_strings_sl.xtb index 59a6446..06db87e 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_sl.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_sl.xtb
@@ -2,6 +2,7 @@ <!DOCTYPE translationbundle> <translationbundle lang="sl"> <translation id="1006017844123154345">Odpri v spletu</translation> +<translation id="1028699632127661925">Pošiljanje v napravo <ph name="DEVICE_NAME" /> ...</translation> <translation id="1036727731225946849">Dodajanje <ph name="WEBAPK_NAME" /> ...</translation> <translation id="1041308826830691739">S spletnih mest</translation> <translation id="1049743911850919806">Način brez beleženja zgodovine</translation> @@ -43,6 +44,7 @@ <translation id="1260236875608242557">Iščite in raziskujte</translation> <translation id="1264974993859112054">Šport</translation> <translation id="1272079795634619415">Ustavi</translation> +<translation id="1272444412400969138">Izbirnik naprave, s katero želite deliti zavihek.</translation> <translation id="1283039547216852943">Dotaknite se za razširitev</translation> <translation id="1285320974508926690">Nikoli ne prevedi tega spletnega mesta</translation> <translation id="1291207594882862231">Izbris zgodovine, piškotkov, podatkov spletnih mest, predpomnilnika …</translation> @@ -59,6 +61,7 @@ <translation id="138361230106469022">Pozdravljeni, <ph name="FULL_NAME" /></translation> <translation id="1383876407941801731">Išči</translation> <translation id="1384959399684842514">Prenos je zaustavljen</translation> +<translation id="1386674309198842382">Aktivna pred toliko dnevi: <ph name="LAST_UPDATED" /></translation> <translation id="1389974829397082527">Tu ni nobenega zaznamka</translation> <translation id="1397811292916898096">Iskanje z iskalnikom <ph name="PRODUCT_NAME" /></translation> <translation id="1404122904123200417">Vdelano v URL <ph name="WEBSITE_URL" /></translation> @@ -223,6 +226,7 @@ <translation id="2567385386134582609">SLIKA</translation> <translation id="257088987046510401">Teme</translation> <translation id="2570922361219980984">Dostop do lokacije je tudi izklopljen za to napravo. Vklopite ga lahko v <ph name="BEGIN_LINK" />nastavitvah za Android<ph name="END_LINK" />.</translation> +<translation id="257674075312929031">Skupina</translation> <translation id="257931822824936280">Razširjeno – kliknite, če želite strniti.</translation> <translation id="2581165646603367611">S tem bodo izbrisani piškotki, predpomnilnik in drugi podatki spletnih mest, ki se Chromu ne zdijo pomembni.</translation> <translation id="2586657967955657006">Odložišče</translation> @@ -274,6 +278,7 @@ <translation id="2956410042958133412">Ta računa upravljata <ph name="PARENT_NAME_1" /> in <ph name="PARENT_NAME_2" />.</translation> <translation id="2962095958535813455">Preklopljeno na zavihke brez beleženja zgodovine</translation> <translation id="2968755619301702150">Pregledovalnik potrdil</translation> +<translation id="2977480621796371840">Odstrani iz skupine</translation> <translation id="2979025552038692506">Izbrani zavihek brez beleženja zgodovine</translation> <translation id="2989523299700148168">Nedavno obiskano</translation> <translation id="2996291259634659425">Ustvarjanje gesla</translation> @@ -400,6 +405,7 @@ <translation id="4008040567710660924">Omogočanje piškotkov za določeno spletno mesto.</translation> <translation id="4034817413553209278">{HOURS,plural, =1{# h}one{# h}two{# h}few{# h}other{# h}}</translation> <translation id="4042870126885713738">Pokaži predloge, ko spletnega naslova ni mogoče najti ali povezave ni mogoče vzpostaviti</translation> +<translation id="4044912625106523635">Izbirnik naprave, s katero želite deliti zavihek, je odprt pri polni višini.</translation> <translation id="4046123991198612571">Naslednja skladba</translation> <translation id="4048707525896921369">Več informacij o temah na spletnih mestih, ne da bi zapustili stran. Funkcija »Iskanje z dotikom« pošlje besedo in njeno sobesedilo Iskanju Google in vrne definicije, slike, rezultate iskanja in druge podrobnosti. @@ -426,6 +432,12 @@ <translation id="4226663524361240545">Ob prejemanju obvestil naprava morda vibrira</translation> <translation id="423219824432660969">Šifriranje sinhroniziranih podatkov z geslom za Google Račun z dnem <ph name="TIME" /></translation> <translation id="4242533952199664413">Odpri nastavitve</translation> +<translation id="4247274662191902962">Podatki tipal bodo razkriti samo, ko boste sredi izkušnje VR. Spletno mesto morda lahko izve več o vas prek nekaterih podatkov, kot so: + – vaša lokacija, + – vaše fizične poteze, na primer položaj očes, + – vaše gibanje, na primer vaša hoja. + + Prepričajte se, da temu spletnemu mestu zaupate, preden mu odobrite dostop.</translation> <translation id="424864128008805179">Se želite odjaviti iz Chroma?</translation> <translation id="4256782883801055595">Odprtokodne licence</translation> <translation id="4259722352634471385">Krmarjenje je blokirano: <ph name="URL" /></translation> @@ -571,6 +583,7 @@ <translation id="5271967389191913893">Naprava ne more odpreti vsebine za prenos.</translation> <translation id="528192093759286357">Povlecite z vrha in se dotaknite gumba za nazaj, če želite zapreti celozaslonski način.</translation> <translation id="5284584623296338184">Spremembe zaznamkov, zgodovine, gesel in drugih nastavitev ne bodo več sinhronizirane z Google Računom. Obstoječi podatki bodo še naprej shranjeni v Google Računu.</translation> +<translation id="5292796745632149097">Pošiljanje v napravo</translation> <translation id="5300589172476337783">Pokaži</translation> <translation id="5301954838959518834">V redu, razumem</translation> <translation id="5304593522240415983">To polje ne sme biti prazno</translation> @@ -598,6 +611,7 @@ <translation id="545042621069398927">Pospeševanje prenosa.</translation> <translation id="5456381639095306749">Prenos strani</translation> <translation id="5475862044948910901">Želite začeti sejo razširjene resničnosti?</translation> +<translation id="5481942164684849270">Aplikacija <ph name="APP_NAME" /> je dodana v moje aplikacije</translation> <translation id="548278423535722844">Odpiranje v aplikaciji z zemljevidi</translation> <translation id="5487521232677179737">Izbriši podatke</translation> <translation id="5494752089476963479">Blokiranje oglasov na spletnih mestih, ki prikazujejo vsiljive ali zavajajoče oglase</translation> @@ -731,6 +745,7 @@ <translation id="6406506848690869874">Sinhronizacija</translation> <translation id="641643625718530986">Tiskanje …</translation> <translation id="6416782512398055893">Preneseno <ph name="MBS" /> MB</translation> +<translation id="6418750371676080905">Izbirnik naprave, s katero želite deliti zavihek, je zaprt.</translation> <translation id="6427112570124116297">Prevajanje spleta</translation> <translation id="6433501201775827830">Izbira iskalnika</translation> <translation id="6437478888915024427">Podatki o strani</translation> @@ -770,6 +785,7 @@ <translation id="666268767214822976">Uporabite storitev predvidevanja za prikaz povezanih poizvedb in priljubljenih spletnih mest med vnašanjem v naslovno vrstico</translation> <translation id="666731172850799929">Odpri v: <ph name="APP_NAME" /></translation> <translation id="666981079809192359">Obvestilo o zasebnosti za Chrome</translation> +<translation id="6672986458216094438">Izbirnik naprave, s katero želite deliti zavihek, je odprt pri polovični višini.</translation> <translation id="6697492270171225480">Prikaz predlogov za podobne strani, ko strani ni mogoče najti</translation> <translation id="6697947395630195233">Chrome potrebuje dostop do vaše lokacije, da jo bo lahko delil s tem spletnim mestom.</translation> <translation id="6698801883190606802">Upravljanje sinhroniziranih podatkov</translation> @@ -947,6 +963,7 @@ <translation id="7942131818088350342">Izdelek <ph name="PRODUCT_NAME" /> je zastarel.</translation> <translation id="7947953824732555851">Sprejem in prijava</translation> <translation id="7963646190083259054">Ponudnik:</translation> +<translation id="7971136598759319605">Aktivna pred 1 dnevom</translation> <translation id="7975379999046275268">Predogled strani <ph name="BEGIN_NEW" />Novo<ph name="END_NEW" /></translation> <translation id="7981313251711023384">Vnaprejšnje nalaganje strani zaradi hitrejšega brskanja in iskanja</translation> <translation id="79859296434321399">Če si želite ogledati vsebino v razširjeni resničnosti, namestite ARCore</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_sr.xtb b/chrome/android/java/strings/translations/android_chrome_strings_sr.xtb index 2651363..8a5d23f3 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_sr.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_sr.xtb
@@ -2,6 +2,7 @@ <!DOCTYPE translationbundle> <translationbundle lang="sr"> <translation id="1006017844123154345">Отвори онлајн</translation> +<translation id="1028699632127661925">Шаље се на уређај <ph name="DEVICE_NAME" />...</translation> <translation id="1036727731225946849">Додаје се <ph name="WEBAPK_NAME" />...</translation> <translation id="1041308826830691739">Са веб-сајтова</translation> <translation id="1049743911850919806">Без архивирања</translation> @@ -43,6 +44,7 @@ <translation id="1260236875608242557">Претражујте и истражујте</translation> <translation id="1264974993859112054">Спорт</translation> <translation id="1272079795634619415">Заустави</translation> +<translation id="1272444412400969138">Бирач уређаја с којим се дели картица.</translation> <translation id="1283039547216852943">Додирните да бисте проширили</translation> <translation id="1285320974508926690">Никад не преводи овај сајт</translation> <translation id="1291207594882862231">Обришите историју, колачиће, податке о сајтовима, кеш...</translation> @@ -59,6 +61,7 @@ <translation id="138361230106469022">Здраво, <ph name="FULL_NAME" /></translation> <translation id="1383876407941801731">Претражи</translation> <translation id="1384959399684842514">Преузимање је паузирано</translation> +<translation id="1386674309198842382">Последња активност: пре <ph name="LAST_UPDATED" /> дан/а</translation> <translation id="1389974829397082527">Овде нема обележивача</translation> <translation id="1397811292916898096">Претражите помоћу: <ph name="PRODUCT_NAME" /></translation> <translation id="1404122904123200417">Уграђено је у сајт <ph name="WEBSITE_URL" /></translation> @@ -223,6 +226,7 @@ <translation id="2567385386134582609">СЛИКА</translation> <translation id="257088987046510401">Теме</translation> <translation id="2570922361219980984">Приступ локацији је искључен и за овај уређај. Укључите га у <ph name="BEGIN_LINK" />Android подешавањима<ph name="END_LINK" />.</translation> +<translation id="257674075312929031">Група</translation> <translation id="257931822824936280">Проширено је – Кликните да бисте скупили.</translation> <translation id="2581165646603367611">Овим ћете обрисати колачиће, кеш и друге податке сајтова које Chrome не сматра важним.</translation> <translation id="2586657967955657006">Меморија</translation> @@ -274,6 +278,7 @@ <translation id="2956410042958133412">Овим налогом управљају <ph name="PARENT_NAME_1" /> и <ph name="PARENT_NAME_2" />.</translation> <translation id="2962095958535813455">Пребацили сте на картице без архивирања</translation> <translation id="2968755619301702150">Приказивач сертификата</translation> +<translation id="2977480621796371840">Уклони из групе</translation> <translation id="2979025552038692506">Изабране картице без архивирањa</translation> <translation id="2989523299700148168">Недавно посећено</translation> <translation id="2996291259634659425">Направите приступну фразу</translation> @@ -400,6 +405,7 @@ <translation id="4008040567710660924">Омогућава колачиће за одређени сајт.</translation> <translation id="4034817413553209278">{HOURS,plural, =1{# ч}one{# ч}few{# ч}other{# ч}}</translation> <translation id="4042870126885713738">Приказивање предлога када се веб-адреса не разреши или када није могуће успоставити везу</translation> +<translation id="4044912625106523635">Бирач уређаја с којим се дели картица је отворен у пуној висини.</translation> <translation id="4046123991198612571">Следећа песма</translation> <translation id="4048707525896921369">Сазнајте више о темама на веб-сајтовима без напуштања странице. Функција „Додирните за претрагу“ шаље реч и њен контекст у Google претрагу и приказује дефиниције, слике, резултате претраге и друге детаље. @@ -426,6 +432,12 @@ <translation id="4226663524361240545">Уређај ће вибрирати када примате обавештења</translation> <translation id="423219824432660969">Шифрујте синхронизоване податке помоћу Google лозинке од <ph name="TIME" /></translation> <translation id="4242533952199664413">Отвори подешавања</translation> +<translation id="4247274662191902962">Подаци сензора се деле само током овог ВР доживљаја. Сајт ће можда моћи да учи о вама помоћу одређених података, као што су: + - локација + - физичке карактеристике, попут положаја очију + - покрети, попут начина хода + + Уверите се да верујете овом сајту пре него што дозволите приступ.</translation> <translation id="424864128008805179">Желите ли да се одјавите из Chrome-а?</translation> <translation id="4256782883801055595">Лиценце отвореног кода</translation> <translation id="4259722352634471385">Навигација је блокирана: <ph name="URL" /></translation> @@ -571,6 +583,7 @@ <translation id="5271967389191913893">Уређај не може да отвори садржај за преузимање.</translation> <translation id="528192093759286357">Превуците од врха екрана и додирните дугме Назад да бисте изашли из режима целог екрана.</translation> <translation id="5284584623296338184">Промене обележивача, историје, лозинки и других подешавања се више неће синхронизовати са Google налогом. Међутим, постојећи подаци ће остати сачувани на Google налогу.</translation> +<translation id="5292796745632149097">Пошаљите на</translation> <translation id="5300589172476337783">Прикажи</translation> <translation id="5301954838959518834">Важи</translation> <translation id="5304593522240415983">Ово поље не сме да буде празно</translation> @@ -598,6 +611,7 @@ <translation id="545042621069398927">Преузимање се убрзава.</translation> <translation id="5456381639095306749">Преузми страницу</translation> <translation id="5475862044948910901">Желите ли да започнете сесију проширене реалности?</translation> +<translation id="5481942164684849270">Апликација <ph name="APP_NAME" /> је додата у моје апликације</translation> <translation id="548278423535722844">Отворите у апликацији за мапе</translation> <translation id="5487521232677179737">Обриши податке</translation> <translation id="5494752089476963479">Блокирај огласе на сајтовима који приказују огласе који ометају активности или обмањујуће огласе</translation> @@ -731,6 +745,7 @@ <translation id="6406506848690869874">Синхронизација</translation> <translation id="641643625718530986">Штампај...</translation> <translation id="6416782512398055893">Преузели сте <ph name="MBS" /> MB</translation> +<translation id="6418750371676080905">Бирач уређаја с којим се дели картица је затворен.</translation> <translation id="6427112570124116297">Преводите странице са веба</translation> <translation id="6433501201775827830">Изаберите претраживач</translation> <translation id="6437478888915024427">Информације о страници</translation> @@ -770,6 +785,7 @@ <translation id="666268767214822976">Коришћење услуге предвиђања за приказивање сродних упита и популарних веб-сајтова док куцате у траци за адресу</translation> <translation id="666731172850799929">Отвори у <ph name="APP_NAME" /></translation> <translation id="666981079809192359">Chrome обавештење о приватности</translation> +<translation id="6672986458216094438">Бирач уређаја с којим се дели картица је отворен на пола висине.</translation> <translation id="6697492270171225480">Приказуј предлоге за сличне странице када нека страница не може да се пронађе</translation> <translation id="6697947395630195233">Chrome тражи приступ вашој локацији да бисте је делили са овим сајтом.</translation> <translation id="6698801883190606802">Управљајте синхронизованим подацима</translation> @@ -947,6 +963,7 @@ <translation id="7942131818088350342">Производ <ph name="PRODUCT_NAME" /> је застарео.</translation> <translation id="7947953824732555851">Прихвати и пријави ме</translation> <translation id="7963646190083259054">Продавац:</translation> +<translation id="7971136598759319605">Последња активност: пре 1 дан</translation> <translation id="7975379999046275268">Прикажи страницу <ph name="BEGIN_NEW" />Ново<ph name="END_NEW" /></translation> <translation id="7981313251711023384">Странице се учитавају унапред ради бржег прегледања и претраживања</translation> <translation id="79859296434321399">Да бисте видели садржај проширене реалности, инсталирајте ARCore</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_sv.xtb b/chrome/android/java/strings/translations/android_chrome_strings_sv.xtb index e6e23ec..64caedc 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_sv.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_sv.xtb
@@ -223,6 +223,7 @@ <translation id="2567385386134582609">BILD</translation> <translation id="257088987046510401">Teman</translation> <translation id="2570922361219980984">Platsåtkomst har inaktiverats på enheten också. Aktivera det i <ph name="BEGIN_LINK" />Android-inställningarna<ph name="END_LINK" />.</translation> +<translation id="257674075312929031">Grupp</translation> <translation id="257931822824936280">Vyn har expanderats. Komprimera den genom att klicka.</translation> <translation id="2581165646603367611">Det här alternativet rensar cookies, cacheminnet och annan data från webbplatser som bedöms vara oviktiga.</translation> <translation id="2586657967955657006">Urklipp</translation> @@ -274,6 +275,7 @@ <translation id="2956410042958133412">Det här kontot hanteras av <ph name="PARENT_NAME_1" /> och <ph name="PARENT_NAME_2" />.</translation> <translation id="2962095958535813455">Byter till inkognitoflikar</translation> <translation id="2968755619301702150">Certifikatvisare</translation> +<translation id="2977480621796371840">Ta bort från gruppen</translation> <translation id="2979025552038692506">Vald inkognitoflik</translation> <translation id="2989523299700148168">Nyligen besökta</translation> <translation id="2996291259634659425">Skapa lösenfras</translation> @@ -426,6 +428,12 @@ <translation id="4226663524361240545">Aviseringar kan göra att enheten vibrerar</translation> <translation id="423219824432660969">Kryptera synkroniserad data med Google-lösenordet från <ph name="TIME" /></translation> <translation id="4242533952199664413">Öppna Inställningar</translation> +<translation id="4247274662191902962">Sensordata delas bara så länge VR-upplevelsen pågår. Webbplatsen kan ta reda på mer om dig utifrån vissa uppgifter, till exempel: + – din plats + – dina fysiska egenskaper, som ögonens placering + – dina rörelser, som hur du går. + + Tänk efter om du litar på webbplatsen innan du ger den åtkomst.</translation> <translation id="424864128008805179">Vill du logga ut från Chrome?</translation> <translation id="4256782883801055595">Licenser för öppen källkod</translation> <translation id="4259722352634471385">Webbadressen har blockerats: <ph name="URL" /></translation> @@ -598,6 +606,7 @@ <translation id="545042621069398927">Nedladdningen görs snabbare.</translation> <translation id="5456381639095306749">Ladda ned sida</translation> <translation id="5475862044948910901">Vill du starta en session med förstärkt verklighet?</translation> +<translation id="5481942164684849270"><ph name="APP_NAME" /> har lagts till i mina appar</translation> <translation id="548278423535722844">Öppna i kartapp</translation> <translation id="5487521232677179737">Rensa data</translation> <translation id="5494752089476963479">Blockera annonser på webbplatser där påträngande eller vilseledande annonser visas</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_sw.xtb b/chrome/android/java/strings/translations/android_chrome_strings_sw.xtb index ce05aafd..a8db293 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_sw.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_sw.xtb
@@ -2,6 +2,7 @@ <!DOCTYPE translationbundle> <translationbundle lang="sw"> <translation id="1006017844123154345">Fungua Mtandaoni</translation> +<translation id="1028699632127661925">Unatuma kwenye <ph name="DEVICE_NAME" />...</translation> <translation id="1036727731225946849">Inaongeza <ph name="WEBAPK_NAME" />...</translation> <translation id="1041308826830691739">Kutoka kwenye tovuti</translation> <translation id="1049743911850919806">Kichupo fiche</translation> @@ -43,6 +44,7 @@ <translation id="1260236875608242557">Tafuta na ugundue</translation> <translation id="1264974993859112054">Michezo</translation> <translation id="1272079795634619415">Simamisha</translation> +<translation id="1272444412400969138">Kiteua kifaa cha kushiriki kichupo.</translation> <translation id="1283039547216852943">Gusa ili upanue</translation> <translation id="1285320974508926690">Kamwe usitafsiri tovuti hii</translation> <translation id="1291207594882862231">Futa historia, vidakuzi, data ya tovuti, akiba…</translation> @@ -59,6 +61,7 @@ <translation id="138361230106469022">Hujambo, <ph name="FULL_NAME" /></translation> <translation id="1383876407941801731">Tafuta</translation> <translation id="1384959399684842514">Upakuaji umesitishwa</translation> +<translation id="1386674309198842382">Ilitumika siku <ph name="LAST_UPDATED" /> zilizopita</translation> <translation id="1389974829397082527">Hamna alamisho hapa</translation> <translation id="1397811292916898096">Tafuta kwa <ph name="PRODUCT_NAME" /></translation> <translation id="1404122904123200417">Imepachikwa katika <ph name="WEBSITE_URL" /></translation> @@ -223,6 +226,7 @@ <translation id="2567385386134582609">PICHA</translation> <translation id="257088987046510401">Mandhari</translation> <translation id="2570922361219980984">Kipengele cha mahali pia kimezimwa kwenye kifaa hiki. Kiwashe katika <ph name="BEGIN_LINK" />Mipangilio ya Android<ph name="END_LINK" />.</translation> +<translation id="257674075312929031">Kikundi</translation> <translation id="257931822824936280">Imepanuliwa - bofya ili ukunje.</translation> <translation id="2581165646603367611">Hatua hii itafuta vidakuzi, akiba na data nyingine ya tovuti ambazo Chrome haidhani kuwa muhimu.</translation> <translation id="2586657967955657006">Ubao wa kunakili</translation> @@ -274,6 +278,7 @@ <translation id="2956410042958133412">Akaunti hii inadhibitiwa na <ph name="PARENT_NAME_1" /> na <ph name="PARENT_NAME_2" />.</translation> <translation id="2962095958535813455">Inabadilisha kwenda vichupo fiche</translation> <translation id="2968755619301702150">Kitazamaji vyeti</translation> +<translation id="2977480621796371840">Ondoa kwenye kikundi</translation> <translation id="2979025552038692506">Kichupo Fiche Kilichochaguliwa</translation> <translation id="2989523299700148168">Ulizotembelea hivi karibuni</translation> <translation id="2996291259634659425">Unda kauli ya siri</translation> @@ -400,6 +405,7 @@ <translation id="4008040567710660924">Ruhusu vidakuzi katika tovuti maalum.</translation> <translation id="4034817413553209278">{HOURS,plural, =1{Saa #}other{Saa #}}</translation> <translation id="4042870126885713738">Onyesha mapendekezo wakati anwani ya wavuti inaposhindwa kutatuliwa au muunganisho ukiwa hauwezi kufanyika</translation> +<translation id="4044912625106523635">Kiteua kifaa cha kushiriki kichupo kimefunguliwa kwa urefu kamili.</translation> <translation id="4046123991198612571">Wimbo unaofuata</translation> <translation id="4048707525896921369">Pata maelezo kuhusu mada kwenye tovuti bila kuondoka kwenye ukurasa. Kipengele cha Gusa ili Utafute hutuma neno na muktadha wake kwenye huduma ya Tafuta na Google na kuonyesha ufafanuzi, picha, matokeo ya utafutaji na maelezo mengine. @@ -426,6 +432,12 @@ <translation id="4226663524361240545">Arifa huenda zitatetemesha kifaa</translation> <translation id="423219824432660969">Simba data iliyosawazishwa kwa njia fiche ukitumia nenosiri la Google lililokuwepo <ph name="TIME" /></translation> <translation id="4242533952199664413">Fungua mipangilio</translation> +<translation id="4247274662191902962">Data ya vitambuzi itashirikiwa tu ukiwa katika hali hii ya VR. Tovuti hii inaweza kupata maelezo zaidi kukuhusu kwa kutumia maelezo fulani, kama vile: + - Mahali ulipo + - Umbo lako, kwa mfano nafasi ya macho yako + - Unavyosogea, kama vile jinsi unavyotembea + + Hakikisha kwamba unaamini tovuti hii kabla ya kuruhusu ufikiaji.</translation> <translation id="424864128008805179">Ungependa kuondoka kwenye Chrome?</translation> <translation id="4256782883801055595">Leseni za programu huria</translation> <translation id="4259722352634471385">Kudurusu kumezuiwa: <ph name="URL" /></translation> @@ -571,6 +583,7 @@ <translation id="5271967389191913893">Kifaa hakiwezi kufungua maudhui yanayopaswa kupakuliwa.</translation> <translation id="528192093759286357">Buruta kutoka juu na uguse kitufe cha kurudi nyuma ili uondoke kwenye skrini nzima.</translation> <translation id="5284584623296338184">Mabadiliko kwenye alamisho, historia, manenosiri na mipangilio yako mingine haitasawazishwa tena kwenye Akaunti yako ya Google. Hata hivyo, data yako iliyopo itaendelea kuhifadhiwa katika akaunti yako ya Google.</translation> +<translation id="5292796745632149097">Tuma kwenye</translation> <translation id="5300589172476337783">Onyesha</translation> <translation id="5301954838959518834">Sawa, nimeelewa</translation> <translation id="5304593522240415983">Sehemu hii haiwezi kuwa tupu</translation> @@ -598,6 +611,7 @@ <translation id="545042621069398927">Inaongeza kasi ya kupakua faili yako.</translation> <translation id="5456381639095306749">Pakua ukurasa</translation> <translation id="5475862044948910901">Je, ungependa kuanzisha kipindi cha Uhalisia Ulioboreshwa?</translation> +<translation id="5481942164684849270"><ph name="APP_NAME" /> imeongezwa kwenye programu zangu</translation> <translation id="548278423535722844">Fungua katika programu ya ramani</translation> <translation id="5487521232677179737">Futa data</translation> <translation id="5494752089476963479">Zuia matangazo kwenye tovuti zinazoonyesha matangazo yanayopotosha au yanayokatiza huduma</translation> @@ -731,6 +745,7 @@ <translation id="6406506848690869874">Sawazisha</translation> <translation id="641643625718530986">Chapisha...</translation> <translation id="6416782512398055893">Umepakua MB <ph name="MBS" /></translation> +<translation id="6418750371676080905">Kiteuzi cha kifaa cha kushiriki kichupo kimefungwa.</translation> <translation id="6427112570124116297">Tafsiri Wavuti</translation> <translation id="6433501201775827830">Chagua mtambo wako wa kutafuta</translation> <translation id="6437478888915024427">Maelezo ya ukurasa</translation> @@ -770,6 +785,7 @@ <translation id="666268767214822976">Tumia huduma ya ubashiri ili kuonyesha hoja zinazohusiana na tovuti maarufu unapocharaza katika sehemu ya anwani</translation> <translation id="666731172850799929">Fungua katika <ph name="APP_NAME" /></translation> <translation id="666981079809192359">Ilani ya Faragha ya Chrome</translation> +<translation id="6672986458216094438">Kiteua kifaa kitashiriki kichupo ambacho kimefunguliwa nusu.</translation> <translation id="6697492270171225480">Onyesha mapendekezo ya kurasa zinazofanana na ukurasa huu wakati haupatikani</translation> <translation id="6697947395630195233">Chrome inahitaji kufikia maelezo ya mahali ulipo ili kuyashiriki na tovuti hii.</translation> <translation id="6698801883190606802">Dhibiti data iliyosawazishwa</translation> @@ -946,6 +962,7 @@ <translation id="7942131818088350342"><ph name="PRODUCT_NAME" /> imepitwa na wakati.</translation> <translation id="7947953824732555851">Kubali na uingie</translation> <translation id="7963646190083259054">Mchuuzi:</translation> +<translation id="7971136598759319605">Ilitumika siku 1 iliyopita</translation> <translation id="7975379999046275268">Kagua ukurasa kwanza <ph name="BEGIN_NEW" />Mpya<ph name="END_NEW" /></translation> <translation id="7981313251711023384">Pakia mapema kurasa ili upate huduma ya haraka ya kuvinjari na kutafuta</translation> <translation id="79859296434321399">Sakinisha ARCore ili uangalie maudhui ya uhalisia ulioboreshwa</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_ta.xtb b/chrome/android/java/strings/translations/android_chrome_strings_ta.xtb index 72f2a9ad..0aaa204 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_ta.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_ta.xtb
@@ -222,6 +222,7 @@ <translation id="2567385386134582609">படம்</translation> <translation id="257088987046510401">தீம்கள்</translation> <translation id="2570922361219980984">இந்தச் சாதனத்திற்கான இருப்பிட அணுகலும் முடக்கப்பட்டுள்ளது. அதை <ph name="BEGIN_LINK" />Android அமைப்புகளில்<ph name="END_LINK" /> இயக்கவும்.</translation> +<translation id="257674075312929031">குழு</translation> <translation id="257931822824936280">விரிவாக்கப்பட்டது - சுருக்க, கிளிக் செய்யவும்.</translation> <translation id="2581165646603367611">முக்கியமில்லை என்று Chrome கருதும் குக்கீகள், தற்காலிகச் சேமிப்பு, தளங்களின் பிற தரவு ஆகியவற்றை இது அழிக்கும்.</translation> <translation id="2586657967955657006">கிளிப்போர்டு</translation> @@ -272,6 +273,7 @@ <translation id="2956410042958133412">இந்தக் கணக்கு <ph name="PARENT_NAME_1" /> மற்றும் <ph name="PARENT_NAME_2" /> ஆல் நிர்வகிக்கப்படுகிறது.</translation> <translation id="2962095958535813455">மறைநிலைத் தாவல்களுக்கு மாற்றப்பட்டது</translation> <translation id="2968755619301702150">சான்றிதழ் வியூவர்</translation> +<translation id="2977480621796371840">குழுவிலிருந்து அகற்று</translation> <translation id="2979025552038692506">தேர்ந்தெடுத்த மறைநிலைத் தாவல்</translation> <translation id="2989523299700148168">சமீபத்தில் பார்த்தவை</translation> <translation id="2996291259634659425">கடவுச்சொற்றொடரை உருவாக்கு</translation> @@ -424,6 +426,12 @@ <translation id="4226663524361240545">அறிவிப்புகள் வரும் போது சாதனம் அதிர்வுறக்கூடும்</translation> <translation id="423219824432660969"><ph name="TIME" /> அன்றைக்கான Google கடவுச்சொல்லைப் பயன்படுத்தி ஒத்திசைக்கப்பட்ட தரவை என்க்ரிப்ட் செய்</translation> <translation id="4242533952199664413">அமைப்புகளைத் திற</translation> +<translation id="4247274662191902962">இந்த VR அனுபவத்தில் இருக்கும்போது மட்டுமே சென்சார் தரவு பகிரப்படும். கீழுள்ளவை போன்ற குறிப்பிட்ட தகவல் மூலம் இந்தத் தளத்தால் உங்களைக் கண்டறிய முடியும்: + - இருப்பிடம் + - கண்ணின் அமைப்பு போன்ற அங்க அடையாளங்கள் + - நடக்கும் விதம் போன்ற அசைவுகள் + + இந்தத் தளம் நம்பத்தகுந்தது எனக் கருதினால் மட்டுமே அணுகல் வழங்கவும்.</translation> <translation id="424864128008805179">Chrome இலிருந்து வெளியேறவா?</translation> <translation id="4256782883801055595">ஓப்பன் சோர்ஸ் உரிமங்கள்</translation> <translation id="4259722352634471385">செல்வது தடுக்கப்பட்டது: <ph name="URL" /></translation> @@ -596,6 +604,7 @@ <translation id="545042621069398927">பதிவிறக்கத்தின் வேகத்தை அதிகப்படுத்துகிறது.</translation> <translation id="5456381639095306749">பக்கத்தைப் பதிவிறக்குக</translation> <translation id="5475862044948910901">'ஆக்மெண்ட்டட் ரியாலிட்டி' அமர்வைத் தொடங்கவா?</translation> +<translation id="5481942164684849270">உங்கள் ஆப்ஸில் <ph name="APP_NAME" /> சேர்க்கப்பட்டது</translation> <translation id="548278423535722844">வரைபடப் பயன்பாட்டில் திற</translation> <translation id="5487521232677179737">தரவை அழி</translation> <translation id="5494752089476963479">குறுக்கிடும் அல்லது தவறாக வழிநடத்தும் விளம்பரங்களைக் காட்டும் தளங்களில் விளம்பரங்களைத் தடு</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_te.xtb b/chrome/android/java/strings/translations/android_chrome_strings_te.xtb index 6171355..a43d0cc 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_te.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_te.xtb
@@ -223,6 +223,7 @@ <translation id="2567385386134582609">చిత్రం</translation> <translation id="257088987046510401">థీమ్లు</translation> <translation id="2570922361219980984">ఈ పరికరానికి స్థానం యాక్సెస్ కూడా ఆఫ్ చేయబడింది. దీనిని <ph name="BEGIN_LINK" />Android సెట్టింగ్లు<ph name="END_LINK" />లో తిరిగి ఆన్ చేయండి.</translation> +<translation id="257674075312929031">సమూహం</translation> <translation id="257931822824936280">విస్తరింపబడింది - కుదించడానికి క్లిక్ చేయండి.</translation> <translation id="2581165646603367611">ఇది Chrome ముఖ్యమైనదిగా భావించని కుక్కీలు, కాష్, సైట్ల ఇతర డేటాను తీసివేస్తుంది.</translation> <translation id="2586657967955657006">క్లిప్బోర్డ్</translation> @@ -274,6 +275,7 @@ <translation id="2956410042958133412">ఈ ఖాతా <ph name="PARENT_NAME_1" /> మరియు <ph name="PARENT_NAME_2" /> నిర్వహణలో ఉంది.</translation> <translation id="2962095958535813455">అజ్ఞాత ట్యాబ్లకు మార్చబడింది</translation> <translation id="2968755619301702150">ప్రమాణపత్రం వ్యూయర్</translation> +<translation id="2977480621796371840">గుంపు నుండి తీసివేయి</translation> <translation id="2979025552038692506">ఎంచుకున్న అజ్ఞాత ట్యాబ్</translation> <translation id="2989523299700148168">ఇటీవల సందర్శించినవి</translation> <translation id="2996291259634659425">రహస్య పదబంధాన్ని సృష్టించండి</translation> @@ -426,6 +428,12 @@ <translation id="4226663524361240545">నోటిఫికేషన్లు పరికరాన్ని వైబ్రేట్ చేయవచ్చు</translation> <translation id="423219824432660969"><ph name="TIME" /> నాటికి సమకాలీకరించిన డేటాని Google పాస్వర్డ్తో ఎన్క్రిప్ట్ చేయండి</translation> <translation id="4242533952199664413">సెట్టింగ్లను తెరువు</translation> +<translation id="4247274662191902962">మీరు ఈ VR అనుభవంలో ఉన్నప్పుడు మాత్రమే సెన్సార్ డేటా షేర్ చేయబడుతుంది. ఈ కింద ఉన్న నిర్దిష్ట సమాచారం ఆధారంగా ఈ సైట్ మీ గురించి తెలుసుకునే అవకాశం ఉంది: + - మీ స్థానం + - మీ ముఖ స్వరూపం, అంటే కన్ను ఉన్న స్థానం లాంటివి + - మీ కదలికలు, అంటే మీరు ఎలా నడుస్తారు లాంటివి + + మీరు యాక్సెస్ ఇచ్చే ముందు ఈ సైట్ను విశ్వసిస్తున్నట్లు నిర్ధారించండి.</translation> <translation id="424864128008805179">Chrome నుండి సైన్ అవుట్ చేయాలా?</translation> <translation id="4256782883801055595">ఓపెన్ సోర్స్ లైసెన్స్లు</translation> <translation id="4259722352634471385">నావిగేషన్ బ్లాక్ చేయబడింది: <ph name="URL" /></translation> @@ -598,6 +606,7 @@ <translation id="545042621069398927">మీ డౌన్లోడ్ను వేగవంతం చేస్తోంది.</translation> <translation id="5456381639095306749">పేజీని డౌన్లోడ్ చేయండి</translation> <translation id="5475862044948910901">అగ్మెంటెడ్ రియాలిటీ సెషన్ను ప్రారంభించాలా?</translation> +<translation id="5481942164684849270">నా యాప్లకు <ph name="APP_NAME" /> జోడించబడింది</translation> <translation id="548278423535722844">మ్యాప్స్ యాప్లో తెరువు</translation> <translation id="5487521232677179737">డేటాని తీసివేయి</translation> <translation id="5494752089476963479">అనుచితమైన లేదా తప్పుదారి పట్టించే ప్రకటనలను చూపించే సైట్లలో ప్రకటనలను బ్లాక్ చేయి</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_th.xtb b/chrome/android/java/strings/translations/android_chrome_strings_th.xtb index 8acd27655..6122f7b 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_th.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_th.xtb
@@ -2,6 +2,7 @@ <!DOCTYPE translationbundle> <translationbundle lang="th"> <translation id="1006017844123154345">เปิดแบบออนไลน์</translation> +<translation id="1028699632127661925">กำลังส่งไปที่ <ph name="DEVICE_NAME" />...</translation> <translation id="1036727731225946849">กำลังเพิ่ม <ph name="WEBAPK_NAME" />...</translation> <translation id="1041308826830691739">จากเว็บไซต์</translation> <translation id="1049743911850919806">โหมดไม่ระบุตัวตน</translation> @@ -43,6 +44,7 @@ <translation id="1260236875608242557">ค้นหาและสำรวจ</translation> <translation id="1264974993859112054">กีฬา</translation> <translation id="1272079795634619415">หยุด</translation> +<translation id="1272444412400969138">เครื่องมือเลือกอุปกรณ์ที่จะแชร์แท็บด้วย</translation> <translation id="1283039547216852943">แตะเพื่อขยาย</translation> <translation id="1285320974508926690">ไม่ต้องแปลเว็บไซต์นี้</translation> <translation id="1291207594882862231">ล้างประวัติการเข้าชม คุกกี้ ข้อมูลเว็บไซต์ แคช…</translation> @@ -59,6 +61,7 @@ <translation id="138361230106469022">สวัสดี คุณ <ph name="FULL_NAME" /></translation> <translation id="1383876407941801731">ค้นหา</translation> <translation id="1384959399684842514">หยุดดาวน์โหลดไว้ชั่วคราว</translation> +<translation id="1386674309198842382">ใช้งานเมื่อ <ph name="LAST_UPDATED" /> วันที่ผ่านมา</translation> <translation id="1389974829397082527">ไม่มีบุ๊กมาร์กที่นี่</translation> <translation id="1397811292916898096">ค้นหาด้วย <ph name="PRODUCT_NAME" /></translation> <translation id="1404122904123200417">ฝังอยู่ใน <ph name="WEBSITE_URL" /></translation> @@ -223,6 +226,7 @@ <translation id="2567385386134582609">รูปภาพ</translation> <translation id="257088987046510401">ธีม</translation> <translation id="2570922361219980984">การเข้าถึงตำแหน่งสำหรับอุปกรณ์เครื่องนี้ปิดอยู่ เปิดการเข้าถึงได้ใน<ph name="BEGIN_LINK" />การตั้งค่า Android<ph name="END_LINK" /></translation> +<translation id="257674075312929031">กลุ่ม</translation> <translation id="257931822824936280">ขยาย - คลิกเพื่อยุบ</translation> <translation id="2581165646603367611">การดำเนินการนี้จะล้างคุกกี้ แคช และข้อมูลอื่นๆ ของเว็บไซต์ที่ Chrome คิดว่าไม่สำคัญ</translation> <translation id="2586657967955657006">คลิปบอร์ด</translation> @@ -274,6 +278,7 @@ <translation id="2956410042958133412">บัญชีนี้ได้รับการจัดการโดย <ph name="PARENT_NAME_1" /> และ <ph name="PARENT_NAME_2" /></translation> <translation id="2962095958535813455">สลับเป็นแท็บไม่ระบุตัวตนแล้ว</translation> <translation id="2968755619301702150">เครื่องมือดูใบรับรอง</translation> +<translation id="2977480621796371840">นำออกจากกลุ่ม</translation> <translation id="2979025552038692506">แท็บที่ไม่ระบุตัวตนที่เลือก</translation> <translation id="2989523299700148168">เข้าชมล่าสุด</translation> <translation id="2996291259634659425">สร้างรหัสผ่าน</translation> @@ -400,6 +405,7 @@ <translation id="4008040567710660924">อนุญาตคุกกี้ของเว็บไซต์ที่เจาะจง</translation> <translation id="4034817413553209278">{HOURS,plural, =1{# ชม.}other{# ชม.}}</translation> <translation id="4042870126885713738">แสดงคำแนะนำเมื่อไม่สามารถระบุที่อยู่เว็บหรือไม่สามารถเชื่อมต่อได้</translation> +<translation id="4044912625106523635">เครื่องมือเลือกอุปกรณ์ที่จะแชร์แท็บด้วยเปิดอยู่ที่ระดับความสูงเต็มหน้าจอ</translation> <translation id="4046123991198612571">แทร็กถัดไป</translation> <translation id="4048707525896921369">ดูข้อมูลเกี่ยวกับหัวข้อในเว็บไซต์โดยไม่ต้องออกจากหน้า แตะเพื่อค้นหาจะส่งคำและบริบทที่อยู่ข้างเคียงไปยัง Google Search เพื่อแสดงคำจำกัดความ รูปภาพ ผลการค้นหา และรายละเอียดอื่นๆ @@ -426,6 +432,12 @@ <translation id="4226663524361240545">การแจ้งเตือนอาจทำให้อุปกรณ์สั่น</translation> <translation id="423219824432660969">เข้ารหัสลับข้อมูลที่ซิงค์ด้วยรหัสผ่าน Google ตั้งแต่ <ph name="TIME" /></translation> <translation id="4242533952199664413">เปิดการตั้งค่า</translation> +<translation id="4247274662191902962">ระบบจะแชร์ข้อมูลเซ็นเซอร์เฉพาะตอนที่คุณอยู่ในประสบการณ์ VR นี้ เว็บไซต์นี้อาจดูข้อมูลเกี่ยวกับคุณได้โดยใช้ข้อมูลบางอย่าง เช่น + - ตำแหน่ง + - ลักษณะทางกายภาพ เช่น ตำแหน่งดวงตา + - การเคลื่อนไหว เช่น ลักษณะการเดิน + + โปรดตรวจสอบว่าเว็บไซต์นี้เชื่อถือได้ก่อนอนุญาตการเข้าถึง</translation> <translation id="424864128008805179">ต้องการออกจากระบบ Chrome ไหม</translation> <translation id="4256782883801055595">ใบอนุญาตโอเพนซอร์ส</translation> <translation id="4259722352634471385">มีการบล็อกการนำทาง: <ph name="URL" /></translation> @@ -571,6 +583,7 @@ <translation id="5271967389191913893">อุปกรณ์ไม่สามารถเปิดเนื้อหาที่จะดาวน์โหลดได้</translation> <translation id="528192093759286357">ลากจากด้านบน แล้วแตะปุ่มกลับเพื่อออกจากโหมดเต็มหน้าจอ</translation> <translation id="5284584623296338184">การเปลี่ยนแปลงบุ๊กมาร์ก ประวัติการเข้าชม รหัสผ่าน และการตั้งค่าอื่นๆ จะไม่ซิงค์กับบัญชี Google ของคุณอีกต่อไป อย่างไรก็ตาม ข้อมูลที่คุณมีจะยังคงจัดเก็บอยู่ในบัญชี Google ของคุณ</translation> +<translation id="5292796745632149097">ส่งไปที่</translation> <translation id="5300589172476337783">แสดง</translation> <translation id="5301954838959518834">ตกลง เข้าใจแล้ว</translation> <translation id="5304593522240415983">ต้องกรอกข้อมูลในช่องนี้</translation> @@ -598,6 +611,7 @@ <translation id="545042621069398927">กำลังเพิ่มความเร็วในการดาวน์โหลด</translation> <translation id="5456381639095306749">ดาวน์โหลดหน้า</translation> <translation id="5475862044948910901">เริ่มเซสชัน Augmented Reality ไหม</translation> +<translation id="5481942164684849270">เพิ่ม <ph name="APP_NAME" /> ไปยังแอปของฉันแล้ว</translation> <translation id="548278423535722844">เปิดในแอปแผนที่</translation> <translation id="5487521232677179737">ล้างข้อมูล</translation> <translation id="5494752089476963479">บล็อกโฆษณาในเว็บไซต์ที่แสดงโฆษณาที่แทรกหรือทำให้เข้าใจผิด</translation> @@ -731,6 +745,7 @@ <translation id="6406506848690869874">การซิงค์ข้อมูล</translation> <translation id="641643625718530986">พิมพ์…</translation> <translation id="6416782512398055893">ดาวน์โหลดแล้ว <ph name="MBS" /> MB</translation> +<translation id="6418750371676080905">เครื่องมือเลือกอุปกรณ์ที่จะแชร์แท็บด้วยปิดอยู่</translation> <translation id="6427112570124116297">แปลเว็บ</translation> <translation id="6433501201775827830">เลือกเครื่องมือค้นหา</translation> <translation id="6437478888915024427">ข้อมูลหน้าเว็บ</translation> @@ -770,6 +785,7 @@ <translation id="666268767214822976">ใช้บริการการคาดคะเนเพื่อแสดงคำค้นหาที่เกี่ยวข้องและเว็บไซต์ยอดนิยมขณะที่คุณพิมพ์ในแถบที่อยู่</translation> <translation id="666731172850799929">เปิดใน <ph name="APP_NAME" /></translation> <translation id="666981079809192359">ประกาศเกี่ยวกับนโยบายความเป็นส่วนตัวของ Chrome</translation> +<translation id="6672986458216094438">เครื่องมือเลือกอุปกรณ์ที่จะแชร์แท็บด้วยเปิดอยู่ที่ระดับความสูงครึ่งหนึ่งของหน้าจอ</translation> <translation id="6697492270171225480">แสดงคำแนะนำหน้าที่คล้ายกันเมื่อไม่พบหน้าเว็บ</translation> <translation id="6697947395630195233">Chrome ต้องการสิทธิ์เข้าถึงตำแหน่งของคุณเพื่อแชร์ตำแหน่งกับไซต์นี้</translation> <translation id="6698801883190606802">จัดการข้อมูลที่ซิงค์</translation> @@ -947,6 +963,7 @@ <translation id="7942131818088350342"><ph name="PRODUCT_NAME" /> ล้าสมัย</translation> <translation id="7947953824732555851">ยอมรับและลงชื่อเข้าใช้</translation> <translation id="7963646190083259054">ผู้ขาย:</translation> +<translation id="7971136598759319605">ใช้งานเมื่อ 1 วันที่ผ่านมา</translation> <translation id="7975379999046275268">พรีวิวหน้า <ph name="BEGIN_NEW" />ใหม่<ph name="END_NEW" /></translation> <translation id="7981313251711023384">โหลดหน้าเว็บล่วงหน้าเพื่อให้เรียกดูและค้นหาได้เร็วขึ้น</translation> <translation id="79859296434321399">ติดตั้ง ARCore เพื่อดูเนื้อหา Augmented Reality</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_tr.xtb b/chrome/android/java/strings/translations/android_chrome_strings_tr.xtb index ccc3c77..692ae589 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_tr.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_tr.xtb
@@ -223,6 +223,7 @@ <translation id="2567385386134582609">IMAGE</translation> <translation id="257088987046510401">Temalar</translation> <translation id="2570922361219980984">Konum erişimi bu cihaz için de kapalı. Konum erişimini <ph name="BEGIN_LINK" />Android Ayarları<ph name="END_LINK" />'ndan açın.</translation> +<translation id="257674075312929031">Grup</translation> <translation id="257931822824936280">Genişletildi - Daraltmak için tıklayın.</translation> <translation id="2581165646603367611">Bu işlem Chrome'un önemli olmadığını düşündüğü çerezleri, önbelleği ve diğer site verilerini temizleyecek.</translation> <translation id="2586657967955657006">Pano</translation> @@ -274,6 +275,7 @@ <translation id="2956410042958133412">Bu hesap <ph name="PARENT_NAME_1" /> ve <ph name="PARENT_NAME_2" /> tarafından yönetiliyor.</translation> <translation id="2962095958535813455">Gizli mod sekmelerine geçildi</translation> <translation id="2968755619301702150">Sertifika görüntüleyici</translation> +<translation id="2977480621796371840">Gruptan kaldır</translation> <translation id="2979025552038692506">Seçili Gizli Sekme</translation> <translation id="2989523299700148168">Son ziyaret edilenler</translation> <translation id="2996291259634659425">Parola oluşturun</translation> @@ -426,6 +428,12 @@ <translation id="4226663524361240545">Bildirimler cihazı titretebilir</translation> <translation id="423219824432660969"><ph name="TIME" /> itibarıyla, senkronize edilmiş verileri Google şifresiyle şifrele</translation> <translation id="4242533952199664413">Ayarları aç</translation> +<translation id="4247274662191902962">Sensör verileri yalnızca bu VR deneyiminiz sırasında paylaşılacak. Bu site bazı verileri kullanarak hakkınızda bilgi edinebilir. Örneğin: + - Konumunuz + - Fiziksel özellikleriniz (ör. gözünüzün konumu) + - Hareketleriniz (ör. yürüme biçiminiz) + + Erişime izin vermeden önce bu siteye güvendiğinizden emin olun.</translation> <translation id="424864128008805179">Chrome oturumu kapatılsın mı?</translation> <translation id="4256782883801055595">Açık kaynak lisansları</translation> <translation id="4259722352634471385">Gezinme engellendi: <ph name="URL" /></translation> @@ -598,6 +606,7 @@ <translation id="545042621069398927">İndirme işleminiz hızlandırılıyor.</translation> <translation id="5456381639095306749">Sayfayı indir</translation> <translation id="5475862044948910901">Artırılmış Gerçeklik oturumu başlatılsın mı?</translation> +<translation id="5481942164684849270"><ph name="APP_NAME" /> uygulamalarıma eklendi</translation> <translation id="548278423535722844">Haritalar uygulamasında aç</translation> <translation id="5487521232677179737">Verileri temizle</translation> <translation id="5494752089476963479">Araya giren veya yanıltıcı reklamlar gösteren sitelerde reklamları engelle</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_uk.xtb b/chrome/android/java/strings/translations/android_chrome_strings_uk.xtb index 34082d2..d7b296f 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_uk.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_uk.xtb
@@ -223,6 +223,7 @@ <translation id="2567385386134582609">ЗОБРАЖЕННЯ</translation> <translation id="257088987046510401">Теми</translation> <translation id="2570922361219980984">На цьому пристрої також вимкнено доступ до геоданих. Увімкніть його в <ph name="BEGIN_LINK" />налаштуваннях Android<ph name="END_LINK" />.</translation> +<translation id="257674075312929031">Група</translation> <translation id="257931822824936280">Розгорнуто – натисніть, щоб згорнути.</translation> <translation id="2581165646603367611">Буде видалено файли cookie, кеш та інші дані сайтів, які Chrome визначив як неважливі.</translation> <translation id="2586657967955657006">Буфер обміну</translation> @@ -274,6 +275,7 @@ <translation id="2956410042958133412">Цим обліковим записом керують <ph name="PARENT_NAME_1" /> і <ph name="PARENT_NAME_2" />.</translation> <translation id="2962095958535813455">Ви перейшли на анонімні вкладки</translation> <translation id="2968755619301702150">Перегляд сертифікатів</translation> +<translation id="2977480621796371840">Вилучити з групи</translation> <translation id="2979025552038692506">Вибрана анонімна вкладка</translation> <translation id="2989523299700148168">Нещодавно відвідані</translation> <translation id="2996291259634659425">Створити парольну фразу</translation> @@ -426,6 +428,12 @@ <translation id="4226663524361240545">Коли надходитимуть сповіщення, пристрій може вібрувати</translation> <translation id="423219824432660969">Зашифрувати синхронізовані дані за допомогою пароля Google від <ph name="TIME" /></translation> <translation id="4242533952199664413">Відкрити налаштування</translation> +<translation id="4247274662191902962">Доступ до даних датчиків надаватиметься лише впродовж цього сеансу віртуальної реальності. Цей сайт може розпізнавати вас за допомогою певної інформації, як-от: + - вашого місцезнаходження; + - фізичних особливостей (наприклад, положення очей) + - рухів (наприклад, типу ходьби). + + Переконайтеся, що довіряєте цьому сайту, перш ніж надати доступ.</translation> <translation id="424864128008805179">Вийти з Chrome?</translation> <translation id="4256782883801055595">Ліцензії ПЗ з відкритим кодом</translation> <translation id="4259722352634471385">Веб-сторінку <ph name="URL" /> заблоковано</translation> @@ -598,6 +606,7 @@ <translation id="545042621069398927">Прискорюється завантаження.</translation> <translation id="5456381639095306749">Завантажити сторінку</translation> <translation id="5475862044948910901">Почати сеанс у режимі доповненої реальності?</translation> +<translation id="5481942164684849270">"<ph name="APP_NAME" />" додано в список "Мої додатки"</translation> <translation id="548278423535722844">Відкрити в додатку Карти</translation> <translation id="5487521232677179737">Видалити дані</translation> <translation id="5494752089476963479">Блокувати рекламу на сайтах, які показують нав’язливі чи оманливі оголошення</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_vi.xtb b/chrome/android/java/strings/translations/android_chrome_strings_vi.xtb index ed27ec3..a156fa9b 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_vi.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_vi.xtb
@@ -223,6 +223,7 @@ <translation id="2567385386134582609">HÌNH ẢNH</translation> <translation id="257088987046510401">Chủ đề</translation> <translation id="2570922361219980984">Quyền truy cập vị trí cũng đã bị tắt đối với thiết bị này. Hãy bật trong <ph name="BEGIN_LINK" />Cài đặt Android<ph name="END_LINK" />.</translation> +<translation id="257674075312929031">Nhóm</translation> <translation id="257931822824936280">Đã mở rộng - nhấp để thu gọn.</translation> <translation id="2581165646603367611">Thao tác này sẽ xóa cookie, bộ nhớ đệm và các dữ liệu khác của các trang web mà Chrome cho rằng không quan trọng.</translation> <translation id="2586657967955657006">Khay nhớ tạm</translation> @@ -274,6 +275,7 @@ <translation id="2956410042958133412">Tài khoản này do <ph name="PARENT_NAME_1" /> và <ph name="PARENT_NAME_2" /> quản lý.</translation> <translation id="2962095958535813455">Đã chuyển sang tab ẩn danh</translation> <translation id="2968755619301702150">Trình xem chứng chỉ</translation> +<translation id="2977480621796371840">Xóa khỏi nhóm</translation> <translation id="2979025552038692506">Tab ẩn danh được chọn</translation> <translation id="2989523299700148168">Đã truy cập gần đây</translation> <translation id="2996291259634659425">Tạo cụm mật khẩu</translation> @@ -426,6 +428,12 @@ <translation id="4226663524361240545">Thông báo có thể làm rung thiết bị</translation> <translation id="423219824432660969">Mã hóa dữ liệu đã đồng bộ hóa bằng mật khẩu Google kể từ <ph name="TIME" /></translation> <translation id="4242533952199664413">Mở cài đặt</translation> +<translation id="4247274662191902962">Dữ liệu cảm biến sẽ chỉ được chia sẻ khi bạn vào trải nghiệm thực tế ảo này. Trang web này có thể tìm hiểu về bạn thông qua một số thông tin, chẳng hạn như: + - Vị trí của bạn + - Đặc điểm ngoại hình của bạn, như vị trí mắt + - Cử động của bạn, ví dụ như cách đi + + Đảm bảo bạn tin cậy trang web này trước khi cho phép truy cập.</translation> <translation id="424864128008805179">Đăng xuất khỏi Chrome?</translation> <translation id="4256782883801055595">Giấy phép nguồn mở</translation> <translation id="4259722352634471385">Điều hướng bị chặn: <ph name="URL" /></translation> @@ -598,6 +606,7 @@ <translation id="545042621069398927">Đang tăng tốc độ tải xuống.</translation> <translation id="5456381639095306749">Tải trang xuống</translation> <translation id="5475862044948910901">Bắt đầu phiên đăng nhập thực tế tăng cường?</translation> +<translation id="5481942164684849270">Đã thêm <ph name="APP_NAME" /> vào phần ứng dụng của tôi</translation> <translation id="548278423535722844">Mở trong ứng dụng bản đồ</translation> <translation id="5487521232677179737">Xóa dữ liệu</translation> <translation id="5494752089476963479">Chặn quảng cáo trên các trang web hiển thị quảng cáo xâm nhập hoặc quảng cáo gây hiểu nhầm</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_zh-CN.xtb b/chrome/android/java/strings/translations/android_chrome_strings_zh-CN.xtb index 69f7a12..92d2e3c 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_zh-CN.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_zh-CN.xtb
@@ -223,6 +223,7 @@ <translation id="2567385386134582609">图片</translation> <translation id="257088987046510401">主题背景</translation> <translation id="2570922361219980984">此设备的位置信息使用权也已关闭;若想开启这项权限,请转到 <ph name="BEGIN_LINK" />Android 设置<ph name="END_LINK" />。</translation> +<translation id="257674075312929031">群组</translation> <translation id="257931822824936280">已展开 - 点击此处即可收起。</translation> <translation id="2581165646603367611">这会清除 Chrome 认为不重要的网站的 Cookie、缓存和其他数据。</translation> <translation id="2586657967955657006">剪贴板</translation> @@ -274,6 +275,7 @@ <translation id="2956410042958133412">该帐号由 <ph name="PARENT_NAME_1" /> 和 <ph name="PARENT_NAME_2" /> 管理。</translation> <translation id="2962095958535813455">已切换到隐身标签页</translation> <translation id="2968755619301702150">证书查看器</translation> +<translation id="2977480621796371840">从组中移除</translation> <translation id="2979025552038692506">所选的隐身标签页</translation> <translation id="2989523299700148168">最近用过的搜索引擎</translation> <translation id="2996291259634659425">创建密码</translation> @@ -426,6 +428,12 @@ <translation id="4226663524361240545">收到通知时设备会振动</translation> <translation id="423219824432660969">自 <ph name="TIME" />起,使用 Google 密码加密已同步的数据</translation> <translation id="4242533952199664413">打开“设置”</translation> +<translation id="4247274662191902962">仅在您体验此 VR 时才能分享传感器数据。这可能会让网站可以使用某些信息来了解您,例如: + - 您的位置信息 + - 您的身体特征,例如眼睛位置 + - 您的动作,例如走路姿势 + + 请确保您信任此网站,然后再允许访问。</translation> <translation id="424864128008805179">退出 Chrome?</translation> <translation id="4256782883801055595">开放源代码许可</translation> <translation id="4259722352634471385">已屏蔽 <ph name="URL" /></translation> @@ -598,6 +606,7 @@ <translation id="545042621069398927">正在加快您的下载速度。</translation> <translation id="5456381639095306749">下载网页</translation> <translation id="5475862044948910901">启动增强现实会话?</translation> +<translation id="5481942164684849270">“<ph name="APP_NAME" />”已添加到“我的应用”</translation> <translation id="548278423535722844">在地图应用中打开</translation> <translation id="5487521232677179737">清除数据</translation> <translation id="5494752089476963479">禁止会展示侵扰性或误导性广告的网站显示广告</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_zh-TW.xtb b/chrome/android/java/strings/translations/android_chrome_strings_zh-TW.xtb index 29318d3..2d0e44d 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_zh-TW.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_zh-TW.xtb
@@ -223,6 +223,7 @@ <translation id="2567385386134582609">圖片</translation> <translation id="257088987046510401">主題</translation> <translation id="2570922361219980984">此外,這部裝置的位置資訊存取權已關閉。請在 <ph name="BEGIN_LINK" />Android 設定<ph name="END_LINK" />中予以開啟。</translation> +<translation id="257674075312929031">群組</translation> <translation id="257931822824936280">已展開 - 按一下即可收合。</translation> <translation id="2581165646603367611">這項操作會清除不重要的網站 Cookie、快取等其他資料 (Chrome 會自動判斷資料的重要性)。</translation> <translation id="2586657967955657006">剪貼簿</translation> @@ -274,6 +275,7 @@ <translation id="2956410042958133412">這個帳戶受 <ph name="PARENT_NAME_1" /> 和 <ph name="PARENT_NAME_2" /> 管理。</translation> <translation id="2962095958535813455">已切換成無痕式分頁</translation> <translation id="2968755619301702150">憑證檢視器</translation> +<translation id="2977480621796371840">從群組中移除</translation> <translation id="2979025552038692506">選取的無痕式分頁</translation> <translation id="2989523299700148168">最近造訪過</translation> <translation id="2996291259634659425">建立通關密語</translation> @@ -426,6 +428,12 @@ <translation id="4226663524361240545">收到通知時裝置會震動</translation> <translation id="423219824432660969">使用你在 <ph name="TIME" />設定的 Google 密碼,加密保護同步資料</translation> <translation id="4242533952199664413">開啟設定</translation> +<translation id="4247274662191902962">系統只會在你進入這個 VR 時分享感應器資料。網站或許可以使用特定資訊辨識你,例如: + - 你的位置 + - 你的身體特徵,例如眼睛的位置 + - 你的動作,例如走路的方式 + + 允許存取前,請確認你信任這個網站。</translation> <translation id="424864128008805179">要登出 Chrome 嗎?</translation> <translation id="4256782883801055595">開放原始碼授權</translation> <translation id="4259722352634471385">瀏覽的網址已封鎖:<ph name="URL" /></translation> @@ -598,6 +606,7 @@ <translation id="545042621069398927">正在加快下載速度。</translation> <translation id="5456381639095306749">下載網頁</translation> <translation id="5475862044948910901">要啟動擴增實境工作階段嗎?</translation> +<translation id="5481942164684849270">已將「<ph name="APP_NAME" />」新增至我的應用程式</translation> <translation id="548278423535722844">在地圖應用程式中開啟</translation> <translation id="5487521232677179737">清除資料</translation> <translation id="5494752089476963479">封鎖干擾性或誤導性的網站廣告</translation>
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/ServicificationBackgroundService.java b/chrome/android/javatests/src/org/chromium/chrome/browser/ServicificationBackgroundService.java index c9b555d..b7c4da45 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/ServicificationBackgroundService.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/ServicificationBackgroundService.java
@@ -15,7 +15,6 @@ import org.chromium.chrome.browser.init.BrowserParts; import org.chromium.chrome.browser.init.ChromeBrowserInitializer; import org.chromium.chrome.browser.init.EmptyBrowserParts; -import org.chromium.chrome.browser.init.ServiceManagerStartupUtils; import org.chromium.content_public.browser.BrowserStartupController; import org.chromium.content_public.browser.test.util.Criteria; import org.chromium.content_public.browser.test.util.CriteriaHelper; @@ -29,13 +28,6 @@ private boolean mNativeLoaded; private boolean mSupportsServiceManagerOnly; - public static void launchChromeInBackground(boolean serviceManagerOnlyMode) { - ServicificationBackgroundService service = - new ServicificationBackgroundService(serviceManagerOnlyMode); - service.onRunTask(new TaskParams(ServiceManagerStartupUtils.TASK_TAG)); - service.waitForNativeLoaded(); - } - public ServicificationBackgroundService(boolean supportsServiceManagerOnly) { mSupportsServiceManagerOnly = supportsServiceManagerOnly; }
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/download/ServicificationDownloadTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/download/ServicificationDownloadTest.java index 7e80800f..21548fed 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/download/ServicificationDownloadTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/download/ServicificationDownloadTest.java
@@ -8,8 +8,6 @@ import android.support.test.InstrumentationRegistry; import android.support.test.filters.LargeTest; -import com.google.android.gms.gcm.TaskParams; - import org.junit.After; import org.junit.Before; import org.junit.Rule; @@ -21,9 +19,8 @@ import org.chromium.base.test.util.Feature; import org.chromium.base.test.util.RetryOnFailure; import org.chromium.base.test.util.TestFileUtil; -import org.chromium.chrome.browser.ServicificationBackgroundService; -import org.chromium.chrome.browser.init.ServiceManagerStartupUtils; import org.chromium.chrome.test.ChromeJUnit4ClassRunner; +import org.chromium.chrome.test.ReducedModeNativeTestRule; import org.chromium.components.offline_items_collection.ContentId; import org.chromium.content_public.browser.test.util.Criteria; import org.chromium.content_public.browser.test.util.CriteriaHelper; @@ -38,10 +35,11 @@ public final class ServicificationDownloadTest { @Rule public EmbeddedTestServerRule mEmbeddedTestServerRule = new EmbeddedTestServerRule(); + @Rule + public ReducedModeNativeTestRule mNativeTestRule = new ReducedModeNativeTestRule(); private static final String TEST_DOWNLOAD_FILE = "/chrome/test/data/android/download/test.gzip"; private static final String DOWNLOAD_GUID = "F7FB1F59-7DE1-4845-AFDB-8A688F70F583"; - private ServicificationBackgroundService mServicificationBackgroundService; private MockDownloadNotificationService mNotificationService; static class MockDownloadNotificationService extends DownloadNotificationService { @@ -70,8 +68,6 @@ @Before public void setUp() throws InterruptedException { RecordHistogram.setDisabledForTests(true); - mServicificationBackgroundService = - new ServicificationBackgroundService(true /*supportsServiceManagerOnly*/); TestThreadUtils.runOnUiThreadBlocking( () -> { mNotificationService = new MockDownloadNotificationService(); }); } @@ -86,10 +82,7 @@ @Feature({"Download"}) @CommandLineFlags.Add({"enable-features=NetworkService,AllowStartingServiceManagerOnly"}) public void testResumeInterruptedDownload() { - mServicificationBackgroundService.onRunTask( - new TaskParams(ServiceManagerStartupUtils.TASK_TAG)); - mServicificationBackgroundService.waitForNativeLoaded(); - ServicificationBackgroundService.assertOnlyServiceManagerStarted(); + mNativeTestRule.assertOnlyServiceManagerStarted(); String tempFile = InstrumentationRegistry.getInstrumentation() .getTargetContext()
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/explore_sites/ExploreSitesPageTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/explore_sites/ExploreSitesPageTest.java index a89efdd..57d6c8e 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/explore_sites/ExploreSitesPageTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/explore_sites/ExploreSitesPageTest.java
@@ -142,6 +142,18 @@ @Test @SmallTest + @CommandLineFlags. + Add({"enabled-features=ExploreSites<FakeStudyName", "force-fieldtrials=FakeStudyName/Enabled", + "force-fieldtrial-params=FakeStudyName.Enabled:variation/mostLikelyTile"}) + @Feature({"ExploreSites", "RenderTest"}) + public void + testInitialLayout_MostLikely() throws Exception { + mRenderTestRule.render(mRecyclerView, "initial_layout"); + Assert.assertEquals(0, getFirstVisiblePosition()); + } + + @Test + @SmallTest @Feature({"ExploreSites", "RenderTest"}) public void testScrollingFromNTP() throws Exception { mActivityTestRule.loadUrl("about:blank");
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/feed/FeedAppLifecycleTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/feed/FeedAppLifecycleTest.java index fcec227..069b680c 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/feed/FeedAppLifecycleTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/feed/FeedAppLifecycleTest.java
@@ -5,11 +5,7 @@ package org.chromium.chrome.browser.feed; import static org.junit.Assert.assertEquals; -import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyBoolean; -import static org.mockito.ArgumentMatchers.anyLong; -import static org.mockito.ArgumentMatchers.eq; -import static org.mockito.Mockito.never; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; @@ -20,13 +16,12 @@ import com.google.android.libraries.feed.api.client.lifecycle.AppLifecycleListener; import com.google.android.libraries.feed.api.host.network.NetworkClient; +import org.junit.After; import org.junit.Assert; import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; -import org.mockito.ArgumentCaptor; -import org.mockito.Captor; import org.mockito.Mock; import org.mockito.MockitoAnnotations; @@ -41,6 +36,7 @@ import org.chromium.chrome.browser.ChromeFeatureList; import org.chromium.chrome.browser.ChromeSwitches; import org.chromium.chrome.browser.ChromeTabbedActivity; +import org.chromium.chrome.browser.DeferredStartupHandler; import org.chromium.chrome.browser.UrlConstants; import org.chromium.chrome.browser.feed.FeedAppLifecycle.AppLifecycleEvent; import org.chromium.chrome.browser.init.ChromeBrowserInitializer; @@ -56,6 +52,8 @@ import org.chromium.content_public.browser.UiThreadTaskTraits; import org.chromium.content_public.browser.test.util.TestThreadUtils; +import java.util.ArrayList; +import java.util.List; import java.util.concurrent.TimeoutException; /** @@ -75,11 +73,9 @@ private FeedOfflineIndicator mOfflineIndicator; @Mock private AppLifecycleListener mAppLifecycleListener; - @Mock - private FeedAppLifecycle.TaskDelegate mTestDelegate; - @Captor - ArgumentCaptor<Runnable> mRunnableCaptor; + private TestDeferredStartupHandler mTestDeferredStartupHandler = + new TestDeferredStartupHandler(); private ChromeTabbedActivity mActivity; private FeedAppLifecycle mAppLifecycle; @@ -87,9 +83,27 @@ private final String mHistogramAppLifecycleEvents = "ContentSuggestions.Feed.AppLifecycle.Events"; + private static class TestDeferredStartupHandler extends DeferredStartupHandler { + private List<Runnable> mDeferredTaskQueue = new ArrayList<>(); + @Override + public void addDeferredTask(Runnable deferredTask) { + mDeferredTaskQueue.add(deferredTask); + } + public void runAllTasks() { + TestThreadUtils.runOnUiThreadBlocking(() -> { + for (Runnable deferredTask : mDeferredTaskQueue) { + deferredTask.run(); + } + }); + } + } + @Before public void setUp() throws InterruptedException { MockitoAnnotations.initMocks(this); + + DeferredStartupHandler.setInstanceForTests(mTestDeferredStartupHandler); + TestThreadUtils.runOnUiThreadBlocking(() -> { try { ChromeBrowserInitializer.getInstance().handleSynchronousStartup(); @@ -98,8 +112,8 @@ } Profile profile = Profile.getLastUsedProfile().getOriginalProfile(); mLifecycleBridge = new FeedLifecycleBridge(profile); - mAppLifecycle = new FeedAppLifecycle( - mAppLifecycleListener, mLifecycleBridge, mFeedScheduler, mTestDelegate); + mAppLifecycle = + new FeedAppLifecycle(mAppLifecycleListener, mLifecycleBridge, mFeedScheduler); FeedProcessScopeFactory.createFeedProcessScopeForTesting(mFeedScheduler, mNetworkClient, mOfflineIndicator, mAppLifecycle, new FeedLoggingBridge(profile)); @@ -109,6 +123,11 @@ mActivity = mActivityTestRule.getActivity(); } + @After + public void tearDown() { + DeferredStartupHandler.setInstanceForTests(null); + } + @Test @SmallTest @Feature({"Feed"}) @@ -305,8 +324,8 @@ @Feature({"Feed"}) public void testDelayedInitNoParam() { verify(mAppLifecycleListener, times(1)).onEnterForeground(); + mTestDeferredStartupHandler.runAllTasks(); verify(mAppLifecycleListener, times(0)).initialize(); - verify(mTestDelegate, never()).postDelayedTask(any(), any(), anyLong()); } @Test @@ -314,15 +333,12 @@ @Feature({"Feed"}) @CommandLineFlags. Add({"enable-features=InterestFeedContentSuggestions<Trial", "force-fieldtrials=Trial/Group", - "force-fieldtrial-params=Trial.Group:init_feed_after_delay_ms/99"}) + "force-fieldtrial-params=Trial.Group:init_feed_after_startup/true"}) public void - testDelayedInitWithParam() { + testDelayedInitWithParamTrue() { verify(mAppLifecycleListener, times(1)).onEnterForeground(); verify(mAppLifecycleListener, times(0)).initialize(); - verify(mTestDelegate, times(1)) - .postDelayedTask( - eq(UiThreadTaskTraits.BEST_EFFORT), mRunnableCaptor.capture(), eq(99L)); - mRunnableCaptor.getValue().run(); + mTestDeferredStartupHandler.runAllTasks(); verify(mAppLifecycleListener, times(1)).initialize(); } @@ -331,18 +347,12 @@ @Feature({"Feed"}) @CommandLineFlags. Add({"enable-features=InterestFeedContentSuggestions<Trial", "force-fieldtrials=Trial/Group", - "force-fieldtrial-params=Trial.Group:init_feed_after_delay_ms/0"}) + "force-fieldtrial-params=Trial.Group:init_feed_after_startup/false"}) public void - testDelayedInitZeroParam() { + testDelayedInitZeroParamFalse() { verify(mAppLifecycleListener, times(1)).onEnterForeground(); - // While the real implementation will likely synchronously invoke the callback when given a - // delay of 0, our mocks have no logic in them. + mTestDeferredStartupHandler.runAllTasks(); verify(mAppLifecycleListener, times(0)).initialize(); - verify(mTestDelegate, times(1)) - .postDelayedTask( - eq(UiThreadTaskTraits.BEST_EFFORT), mRunnableCaptor.capture(), eq(0L)); - mRunnableCaptor.getValue().run(); - verify(mAppLifecycleListener, times(1)).initialize(); } @Test @@ -350,20 +360,12 @@ @Feature({"Feed"}) @CommandLineFlags. Add({"enable-features=InterestFeedContentSuggestions<Trial", "force-fieldtrials=Trial/Group", - "force-fieldtrial-params=Trial.Group:init_feed_after_delay_ms/99"}) + "force-fieldtrial-params=Trial.Group:init_feed_after_startup/notboolean"}) public void - testDelayedInitWithDestroy() { + testDelayedInitZeroParamNotBoolean() { verify(mAppLifecycleListener, times(1)).onEnterForeground(); + mTestDeferredStartupHandler.runAllTasks(); verify(mAppLifecycleListener, times(0)).initialize(); - verify(mTestDelegate, times(1)) - .postDelayedTask( - eq(UiThreadTaskTraits.BEST_EFFORT), mRunnableCaptor.capture(), eq(99L)); - // Must be on the UI thread, one of the dependencies checks. - TestThreadUtils.runOnUiThreadBlocking(() -> mAppLifecycle.destroy()); - - // Initialize shouldn't be called after we're destroyed. - mRunnableCaptor.getValue().run(); - verify(mAppLifecycleListener, never()).initialize(); } private void signalActivityStart(Activity activity)
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/offlinepages/OfflineTestUtil.java b/chrome/android/javatests/src/org/chromium/chrome/browser/offlinepages/OfflineTestUtil.java index 81635af..29dfaafb 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/offlinepages/OfflineTestUtil.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/offlinepages/OfflineTestUtil.java
@@ -168,6 +168,10 @@ () -> { nativeSetPrefetchingEnabledByServer(enabled); }); } + public static void setGCMTokenForTesting(String gcmToken) { + TestThreadUtils.runOnUiThreadBlocking(() -> { nativeSetGCMTokenForTesting(gcmToken); }); + } + private static native void nativeGetRequestsInQueue(Callback<SavePageRequest[]> callback); private static native void nativeGetAllPages( List<OfflinePageItem> offlinePages, final Callback<List<OfflinePageItem>> callback); @@ -177,4 +181,5 @@ private static native void nativeDumpRequestCoordinatorState(Callback<String> callback); private static native void nativeWaitForConnectivityState(boolean connected, Runnable callback); private static native void nativeSetPrefetchingEnabledByServer(boolean enabled); + private static native void nativeSetGCMTokenForTesting(String gcmToken); }
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/offlinepages/prefetch/PrefetchBackgroundTaskTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/offlinepages/prefetch/PrefetchBackgroundTaskTest.java index 8274d2b..2cd487f0 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/offlinepages/prefetch/PrefetchBackgroundTaskTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/offlinepages/prefetch/PrefetchBackgroundTaskTest.java
@@ -13,6 +13,7 @@ import org.junit.After; import org.junit.Before; +import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; @@ -21,9 +22,9 @@ import org.chromium.base.test.util.CommandLineFlags; import org.chromium.base.test.util.DisabledTest; import org.chromium.chrome.browser.ChromeSwitches; -import org.chromium.chrome.browser.ServicificationBackgroundService; import org.chromium.chrome.browser.offlinepages.OfflineTestUtil; import org.chromium.chrome.test.ChromeJUnit4ClassRunner; +import org.chromium.chrome.test.ReducedModeNativeTestRule; import org.chromium.components.background_task_scheduler.BackgroundTask.TaskFinishedCallback; import org.chromium.components.background_task_scheduler.BackgroundTaskScheduler; import org.chromium.components.background_task_scheduler.BackgroundTaskSchedulerFactory; @@ -44,9 +45,11 @@ "enable-features=OfflinePagesPrefetching,NetworkService,AllowStartingServiceManagerOnly," + "InterestFeedContentSuggestions"}) public class PrefetchBackgroundTaskTest { + @Rule + public ReducedModeNativeTestRule mNativeTestRule = new ReducedModeNativeTestRule(); + private static final double BACKOFF_JITTER_FACTOR = 0.33; private static final int SEMAPHORE_TIMEOUT_MS = 5000; - private static final String GCM_TOKEN = "dummy_gcm_token"; private TestBackgroundTaskScheduler mScheduler; private static class TestPrefetchBackgroundTask extends PrefetchBackgroundTask { @@ -59,9 +62,7 @@ public void startTask(Context context, final TaskFinishedCallback callback) { TaskParameters.Builder builder = - TaskParameters.create(TaskIds.OFFLINE_PAGES_PREFETCH_JOB_ID) - .addExtras(PrefetchBackgroundTaskScheduler.createGCMTokenBundle( - GCM_TOKEN)); + TaskParameters.create(TaskIds.OFFLINE_PAGES_PREFETCH_JOB_ID); TaskParameters params = builder.build(); onStartTask(context, params, new TaskFinishedCallback() { @Override @@ -79,9 +80,7 @@ public void stopTask() { TestThreadUtils.runOnUiThreadBlocking(() -> { TaskParameters.Builder builder = - TaskParameters.create(TaskIds.OFFLINE_PAGES_PREFETCH_JOB_ID) - .addExtras(PrefetchBackgroundTaskScheduler.createGCMTokenBundle( - GCM_TOKEN)); + TaskParameters.create(TaskIds.OFFLINE_PAGES_PREFETCH_JOB_ID); TaskParameters params = builder.build(); onStopTask(ContextUtils.getApplicationContext(), params); }); @@ -183,27 +182,24 @@ @Before public void setUp() throws Exception { - ServicificationBackgroundService.launchChromeInBackground(true /*serviceManagerOnlyMode*/); - ServicificationBackgroundService.assertOnlyServiceManagerStarted(); - TestThreadUtils.runOnUiThreadBlocking(() -> { mScheduler = new TestBackgroundTaskScheduler(); BackgroundTaskSchedulerFactory.setSchedulerForTesting(mScheduler); }); OfflineTestUtil.setPrefetchingEnabledByServer(true); + OfflineTestUtil.setGCMTokenForTesting("dummy_gcm_token"); PrefetchBackgroundTask.alwaysSupportServiceManagerOnlyForTesting(); } @After public void tearDown() { - ServicificationBackgroundService.assertOnlyServiceManagerStarted(); + mNativeTestRule.assertOnlyServiceManagerStarted(); } private void scheduleTask(int additionalDelaySeconds) { - TestThreadUtils.runOnUiThreadBlocking(() -> { - PrefetchBackgroundTaskScheduler.scheduleTask(additionalDelaySeconds, GCM_TOKEN); - }); + TestThreadUtils.runOnUiThreadBlocking( + () -> { PrefetchBackgroundTaskScheduler.scheduleTask(additionalDelaySeconds); }); } @Test
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/offlinepages/prefetch/PrefetchConfigurationTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/offlinepages/prefetch/PrefetchConfigurationTest.java index b089091..62d2c3d 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/offlinepages/prefetch/PrefetchConfigurationTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/offlinepages/prefetch/PrefetchConfigurationTest.java
@@ -9,7 +9,7 @@ import android.support.test.filters.MediumTest; -import org.junit.Before; +import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; @@ -18,9 +18,9 @@ import org.chromium.base.test.util.Restriction; import org.chromium.chrome.browser.ChromeFeatureList; import org.chromium.chrome.browser.ChromeSwitches; -import org.chromium.chrome.browser.ServicificationBackgroundService; import org.chromium.chrome.browser.offlinepages.OfflineTestUtil; import org.chromium.chrome.test.ChromeJUnit4ClassRunner; +import org.chromium.chrome.test.ReducedModeNativeTestRule; import org.chromium.chrome.test.util.ChromeRestriction; import org.chromium.chrome.test.util.browser.Features; import org.chromium.content_public.browser.test.util.TestThreadUtils; @@ -32,11 +32,8 @@ @Restriction({ChromeRestriction.RESTRICTION_TYPE_REQUIRES_TOUCH}) @RunWith(ChromeJUnit4ClassRunner.class) public class PrefetchConfigurationTest { - @Before - public void setUp() throws Exception { - // Start Chrome. - ServicificationBackgroundService.launchChromeInBackground(true /*serviceManagerOnlyMode*/); - } + @Rule + public ReducedModeNativeTestRule mNativeTestRule = new ReducedModeNativeTestRule(); @Test @MediumTest
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/offlinepages/prefetch/PrefetchFeedFlowTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/offlinepages/prefetch/PrefetchFeedFlowTest.java index 2026bbf8..34bea1cb 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/offlinepages/prefetch/PrefetchFeedFlowTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/offlinepages/prefetch/PrefetchFeedFlowTest.java
@@ -102,7 +102,6 @@ "https://www.nytimes.com/2017/11/10/world/asia/trump-apec-asia-trade.html"; private static final String THUMBNAIL_URL2 = "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRh1tEaJT-br6mBxM89U3vgjDldwb9L_baZszhstAGMQh3_fuG13ax3C9ewR2tq45tbZj74CHl3KNU"; - private static final String GCM_TOKEN = "dummy_gcm_token"; // Returns a small PNG image data. private static byte[] testImageData() { @@ -200,6 +199,7 @@ }); OfflineTestUtil.setPrefetchingEnabledByServer(true); + OfflineTestUtil.setGCMTokenForTesting("dummy_gcm_token"); } @After @@ -255,9 +255,7 @@ PrefetchBackgroundTask task = new PrefetchBackgroundTask(); TestThreadUtils.runOnUiThreadBlocking(() -> { TaskParameters.Builder builder = - TaskParameters.create(TaskIds.OFFLINE_PAGES_PREFETCH_JOB_ID) - .addExtras(PrefetchBackgroundTaskScheduler.createGCMTokenBundle( - GCM_TOKEN)); + TaskParameters.create(TaskIds.OFFLINE_PAGES_PREFETCH_JOB_ID); PrefetchBackgroundTask.skipConditionCheckingForTesting(); task.onStartTask(ContextUtils.getApplicationContext(), builder.build(), (boolean needsReschedule) -> { finished.notifyCalled(); });
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/offlinepages/prefetch/PrefetchFlowTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/offlinepages/prefetch/PrefetchFlowTest.java index c1a40ec..34a9753c 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/offlinepages/prefetch/PrefetchFlowTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/offlinepages/prefetch/PrefetchFlowTest.java
@@ -62,7 +62,6 @@ @CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE}) public class PrefetchFlowTest implements WebServer.RequestHandler { private static final String TAG = "PrefetchFlowTest"; - private static final String GCM_TOKEN = "dummy_gcm_token"; private TestOfflinePageService mOPS = new TestOfflinePageService(); private TestSuggestionsService mSuggestionsService = new TestSuggestionsService(); private WebServer mServer; @@ -138,6 +137,7 @@ PrefetchTestBridge.skipNTPSuggestionsAPIKeyCheck(); }); OfflineTestUtil.setPrefetchingEnabledByServer(true); + OfflineTestUtil.setGCMTokenForTesting("dummy_gcm_token"); } @After @@ -168,9 +168,7 @@ PrefetchBackgroundTask task = new PrefetchBackgroundTask(); TestThreadUtils.runOnUiThreadBlocking(() -> { TaskParameters.Builder builder = - TaskParameters.create(TaskIds.OFFLINE_PAGES_PREFETCH_JOB_ID) - .addExtras(PrefetchBackgroundTaskScheduler.createGCMTokenBundle( - GCM_TOKEN)); + TaskParameters.create(TaskIds.OFFLINE_PAGES_PREFETCH_JOB_ID); PrefetchBackgroundTask.skipConditionCheckingForTesting(); task.onStartTask(ContextUtils.getApplicationContext(), builder.build(), (boolean needsReschedule) -> { finished.notifyCalled(); });
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/preferences/NotificationsPreferencesTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/preferences/NotificationsPreferencesTest.java index 564fd647..549ee67 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/preferences/NotificationsPreferencesTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/preferences/NotificationsPreferencesTest.java
@@ -21,15 +21,14 @@ import org.chromium.base.test.util.CommandLineFlags; import org.chromium.base.test.util.DisableIf; import org.chromium.base.test.util.Feature; -import org.chromium.chrome.browser.ChromeFeatureList; import org.chromium.chrome.browser.ContentSettingsType; +import org.chromium.chrome.browser.offlinepages.prefetch.PrefetchPrefs; import org.chromium.chrome.browser.preferences.website.ContentSettingsResources; import org.chromium.chrome.browser.preferences.website.SingleCategoryPreferences; import org.chromium.chrome.browser.preferences.website.SiteSettingsCategory; import org.chromium.chrome.browser.test.ChromeBrowserTestRule; import org.chromium.chrome.browser.test.ScreenShooter; import org.chromium.chrome.test.ChromeJUnit4ClassRunner; -import org.chromium.chrome.test.util.browser.Features; import org.chromium.content_public.browser.test.util.Criteria; import org.chromium.content_public.browser.test.util.CriteriaHelper; import org.chromium.content_public.browser.test.util.TestThreadUtils; @@ -58,8 +57,7 @@ @SmallTest @Feature({"Preferences", "UiCatalogue"}) @DisableIf.Build(sdk_is_greater_than = Build.VERSION_CODES.N_MR1) - @CommandLineFlags.Add("enable-features=ContentSuggestionsNotifications") - @Features.DisableFeatures(ChromeFeatureList.INTEREST_FEED_CONTENT_SUGGESTIONS) + @CommandLineFlags.Add("enable-features=OfflinePagesPrefetching") public void testContentSuggestionsToggle() { // clang-format on @@ -70,23 +68,17 @@ TestThreadUtils.runOnUiThreadBlocking(() -> { // Make sure the toggle reflects the state correctly. boolean initiallyChecked = toggle.isChecked(); - Assert.assertEquals(toggle.isChecked(), - PrefServiceBridge.getInstance().getBoolean( - Pref.CONTENT_SUGGESTIONS_NOTIFICATIONS_ENABLED)); + Assert.assertEquals(toggle.isChecked(), PrefetchPrefs.getNotificationEnabled()); // Make sure we can change the state. PreferencesTest.clickPreference(fragment, toggle); Assert.assertEquals(toggle.isChecked(), !initiallyChecked); - Assert.assertEquals(toggle.isChecked(), - PrefServiceBridge.getInstance().getBoolean( - Pref.CONTENT_SUGGESTIONS_NOTIFICATIONS_ENABLED)); + Assert.assertEquals(toggle.isChecked(), PrefetchPrefs.getNotificationEnabled()); // Make sure we can change it back. PreferencesTest.clickPreference(fragment, toggle); Assert.assertEquals(toggle.isChecked(), initiallyChecked); - Assert.assertEquals(toggle.isChecked(), - PrefServiceBridge.getInstance().getBoolean( - Pref.CONTENT_SUGGESTIONS_NOTIFICATIONS_ENABLED)); + Assert.assertEquals(toggle.isChecked(), PrefetchPrefs.getNotificationEnabled()); // Click it one last time so we're in a toggled state for the UI Capture. PreferencesTest.clickPreference(fragment, toggle); @@ -101,9 +93,8 @@ @SmallTest @Feature({"Preferences", "UiCatalogue"}) @DisableIf.Build(sdk_is_greater_than = Build.VERSION_CODES.N_MR1) - @CommandLineFlags.Add("disable-features=NTPArticleSuggestions") - @Features.DisableFeatures(ChromeFeatureList.INTEREST_FEED_CONTENT_SUGGESTIONS) - public void testToggleDisabledWhenSuggestionsDisabled() { + @CommandLineFlags.Add("disable-features=OfflinePagesPrefetching") + public void testToggleDisabledWhenPrefetchingDisabled() { // clang-format on PreferenceFragment fragment = (PreferenceFragment) mActivity.getMainFragment(); @@ -122,7 +113,6 @@ @SmallTest @Feature({"Preferences", "UiCatalogue"}) @DisableIf.Build(sdk_is_greater_than = Build.VERSION_CODES.N_MR1) - @Features.DisableFeatures(ChromeFeatureList.INTEREST_FEED_CONTENT_SUGGESTIONS) public void testLinkToWebsiteNotifications() { // clang-format on @@ -148,19 +138,12 @@ mScreenShooter.shoot("LinkToWebsiteNotifications"); } - /** Gets the fragment of the top Activity. Assumes the top Activity is a Preferences. */ - private static Fragment getTopFragment() { - Preferences preferences = (Preferences) ApplicationStatus.getLastTrackedFocusedActivity(); - return preferences.getMainFragment(); - } - // TODO(https://crbug.com/894334): Remove format suppression once formatting bug is fixed. // clang-format off @Test @SmallTest @Feature({"Preferences"}) @DisableIf.Build(sdk_is_greater_than = Build.VERSION_CODES.N_MR1) - @Features.DisableFeatures(ChromeFeatureList.INTEREST_FEED_CONTENT_SUGGESTIONS) public void testWebsiteNotificationsSummary() { // clang-format on @@ -181,18 +164,10 @@ }); } - // TODO(https://crbug.com/894334): Remove format suppression once formatting bug is fixed. - // clang-format off - @Test - @SmallTest - @Feature({"Preferences"}) - @DisableIf.Build(sdk_is_greater_than = Build.VERSION_CODES.N_MR1) - @Features.EnableFeatures(ChromeFeatureList.INTEREST_FEED_CONTENT_SUGGESTIONS) - public void prefHiddenWhenOnFeed() { - // clang-format on - - final PreferenceFragment fragment = (PreferenceFragment) mActivity.getMainFragment(); - Assert.assertNull(fragment.findPreference(NotificationsPreferences.PREF_SUGGESTIONS)); + /** Gets the fragment of the top Activity. Assumes the top Activity is a Preferences. */ + private static Fragment getTopFragment() { + Preferences preferences = (Preferences) ApplicationStatus.getLastTrackedFocusedActivity(); + return preferences.getMainFragment(); } /** Gets the summary text that should be used for site specific notifications. */
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/suggestions/tile/OWNERS b/chrome/android/javatests/src/org/chromium/chrome/browser/suggestions/tile/OWNERS new file mode 100644 index 0000000..e513d51 --- /dev/null +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/suggestions/tile/OWNERS
@@ -0,0 +1 @@ +file://chrome/android/java/src/org/chromium/chrome/browser/suggestions/tile/OWNERS
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/suggestions/tile/TileGroupTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/suggestions/tile/TileGroupTest.java index 22d3713..4c4e7fe 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/suggestions/tile/TileGroupTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/suggestions/tile/TileGroupTest.java
@@ -26,9 +26,10 @@ import org.chromium.chrome.browser.ChromeActivity; import org.chromium.chrome.browser.ChromeSwitches; import org.chromium.chrome.browser.UrlConstants; +import org.chromium.chrome.browser.explore_sites.ExploreSitesBridge; +import org.chromium.chrome.browser.explore_sites.ExploreSitesCategory; import org.chromium.chrome.browser.native_page.ContextMenuManager; import org.chromium.chrome.browser.ntp.NewTabPage; -import org.chromium.chrome.browser.ntp.cards.NewTabPageRecyclerView; import org.chromium.chrome.browser.snackbar.SnackbarManager; import org.chromium.chrome.browser.suggestions.SiteSuggestion; import org.chromium.chrome.browser.tab.Tab; @@ -47,6 +48,7 @@ import java.util.ArrayList; import java.util.Date; +import java.util.List; import java.util.concurrent.ExecutionException; import java.util.concurrent.TimeoutException; @@ -129,6 +131,7 @@ @Feature({"NewTabPage"}) public void testDismissExploreTileWithContextMenuFails() throws Exception { SiteSuggestion exploreTile = recreateSuggestionsWithExploreTile(); + initializeTab(); Assert.assertEquals(4, getTileGridLayout().getChildCount()); @@ -173,10 +176,6 @@ Assert.assertEquals(3, tileContainer.getChildCount()); } - private NewTabPageRecyclerView getRecyclerView() { - return mNtp.getNewTabPageView().getRecyclerView(); - } - private TileGridLayout getTileGridLayout() { ViewGroup newTabPageLayout = mNtp.getNewTabPageLayout(); Assert.assertNotNull("Unable to retrieve the NewTabPageLayout.", newTabPageLayout); @@ -274,6 +273,11 @@ TestThreadUtils.runOnUiThreadBlocking( () -> mMostVisitedSites.setTileSuggestions(currentSuggestions)); + // Set up ExploreSitesBridge for testing. + List<ExploreSitesCategory> category = new ArrayList<>(); + category.add(new ExploreSitesCategory(0, 1, "foo", 0, 0)); + ExploreSitesBridge.setCatalogForTesting(category); + return exploreTile; } }
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/vr/WebXrVrTransitionTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/vr/WebXrVrTransitionTest.java index cdd01eb..51a12b6 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/vr/WebXrVrTransitionTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/vr/WebXrVrTransitionTest.java
@@ -38,6 +38,7 @@ import org.chromium.base.test.params.ParameterSet; import org.chromium.base.test.params.ParameterizedRunner; import org.chromium.base.test.util.CommandLineFlags; +import org.chromium.base.test.util.DisabledTest; import org.chromium.base.test.util.MinAndroidSdkLevel; import org.chromium.base.test.util.Restriction; import org.chromium.base.test.util.UrlUtils; @@ -230,6 +231,7 @@ @Restriction({RESTRICTION_TYPE_DEVICE_DAYDREAM, RESTRICTION_TYPE_VR_SETTINGS_SERVICE}) @VrSettingsFile(VrSettingsServiceUtils.FILE_DDVIEW_DONENABLED) @XrActivityRestriction({XrActivityRestriction.SupportedActivity.ALL}) + @DisabledTest(message = "crbug.com/972153") public void testPresentationPromiseUnresolvedDuringDon() throws InterruptedException { presentationPromiseUnresolvedDuringDonImpl( WebVrTestFramework.getFileUrlForHtmlTestFile( @@ -272,6 +274,7 @@ @Restriction({RESTRICTION_TYPE_DEVICE_DAYDREAM, RESTRICTION_TYPE_VR_SETTINGS_SERVICE}) @VrSettingsFile(VrSettingsServiceUtils.FILE_DDVIEW_DONENABLED) @XrActivityRestriction({XrActivityRestriction.SupportedActivity.ALL}) + @DisabledTest(message = "crbug.com/972153") public void testPresentationPromiseRejectedIfDonCanceled() throws InterruptedException { presentationPromiseRejectedIfDonCanceledImpl( WebVrTestFramework.getFileUrlForHtmlTestFile(
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/vr/util/VrSettingsServiceUtils.java b/chrome/android/javatests/src/org/chromium/chrome/browser/vr/util/VrSettingsServiceUtils.java index cd4e8a2..224ea13c 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/vr/util/VrSettingsServiceUtils.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/vr/util/VrSettingsServiceUtils.java
@@ -40,7 +40,8 @@ private static final String EXTRA_ACTION_VALUE = "UPDATE_SETTINGS"; private static final String EXTRA_VR_SETTINGS_PATH = "vr_settings_path"; - private static final int SETTINGS_APPLICATION_DELAY_MS = 500; + // Needs to be long because this can occasionally take multiple seconds to apply. + private static final int SETTINGS_APPLICATION_DELAY_MS = 3000; /** * Applies the settings specified in the provided file to VrCore. @@ -69,10 +70,10 @@ // We need to tell the rule whether the newly applied settings enable the DON flow. rule.setDonEnabled(fileEnablesDon(filename)); - // The settings seem to apply nearly instantly, but since it's done through a service, we - // don't have any guarantees about that or a way to be notified when they're applied. So, - // sleep a bit to be safe. This shouldn't be an issue in terms of runtime since this is - // used pretty infrequently. + // The settings usually apply nearly instantly, but can occasionally take multiple seconds. + // Since this is done through a service, we don't have any guarantees about that or a way to + // be notified when they're applied. So, sleep for a while. This is a long sleep, but few + // tests use this functionality, so overall runtime impact is pretty low. SystemClock.sleep(SETTINGS_APPLICATION_DELAY_MS); }
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/webshare/WebShareTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/webshare/WebShareTest.java index 3a461553..6c82e71 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/webshare/WebShareTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/webshare/WebShareTest.java
@@ -417,14 +417,12 @@ private static void verifyDeliveredOggIntent(Intent intent) throws Exception { Assert.assertNotNull(intent); - Assert.assertEquals(Intent.ACTION_SEND_MULTIPLE, intent.getAction()); + Assert.assertEquals(Intent.ACTION_SEND, intent.getAction()); Assert.assertEquals("video/ogg", intent.getType()); Assert.assertEquals(Intent.FLAG_GRANT_READ_URI_PERMISSION, intent.getFlags() & Intent.FLAG_GRANT_READ_URI_PERMISSION); - - ArrayList<Uri> fileUris = intent.getParcelableArrayListExtra(Intent.EXTRA_STREAM); - Assert.assertEquals(1, fileUris.size()); - Assert.assertEquals("contents", getFileContents(fileUris.get(0))); + Uri fileUri = intent.getParcelableExtra(Intent.EXTRA_STREAM); + Assert.assertEquals("contents", getFileContents(fileUri)); } // Uses intent picker functionality that is only available since Lollipop MR1.
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/offlinepages/prefetch/OfflineNotificationBackgroundTaskUnitTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/offlinepages/prefetch/OfflineNotificationBackgroundTaskUnitTest.java index f7eb9108..a19e6bb 100644 --- a/chrome/android/junit/src/org/chromium/chrome/browser/offlinepages/prefetch/OfflineNotificationBackgroundTaskUnitTest.java +++ b/chrome/android/junit/src/org/chromium/chrome/browser/offlinepages/prefetch/OfflineNotificationBackgroundTaskUnitTest.java
@@ -24,6 +24,7 @@ import static org.mockito.Mockito.when; import android.content.Context; +import android.os.Build; import org.junit.After; import org.junit.Before; @@ -156,6 +157,7 @@ mCalendar.set(2017, 1, 1, 0, 0, 0); OfflineNotificationBackgroundTask.setCalendarForTesting(mCalendar); + PrefetchPrefs.setNotificationEnabled(true); } @After @@ -458,4 +460,41 @@ "After waiting for tomorrow morning, the next delay should be normal " + "even if the last notification was sent well in the future."); } + + @Test + @Config(sdk = Build.VERSION_CODES.O) + public void disabledPrefDoesNothingSdkO() { + // Set up the prefs so that a notification should be shown. + PrefetchPrefs.setHasNewPages(true); + PrefetchPrefs.setOfflineCounter(OfflineNotificationBackgroundTask.OFFLINE_POLLING_ATTEMPTS); + PrefetchPrefs.setIgnoredNotificationCounter(0); + setupDeviceOnlineStatus(false); + + // Set up the Content Suggestions notifications preference. + PrefetchPrefs.setNotificationEnabled(false); + + runTaskAndExpectTaskDone(); + assertNativeStarted(); + assertNotificationShown(); + } + + @Test + @Config(sdk = Build.VERSION_CODES.N_MR1) + public void disabledPrefPreventsNotificationShow() { + // Set up the prefs so that a notification would be shown, if not for the Content + // Suggestions notifications preference. + PrefetchPrefs.setHasNewPages(true); + PrefetchPrefs.setOfflineCounter(OfflineNotificationBackgroundTask.OFFLINE_POLLING_ATTEMPTS); + PrefetchPrefs.setIgnoredNotificationCounter(0); + setupDeviceOnlineStatus(false); + + // Set up the Content Suggestions notifications preference. + PrefetchPrefs.setNotificationEnabled(false); + + runTask(); + assertNativeDidNotStart(); + assertNoTaskScheduled("If the notifications preference was disabled, the task should not " + + "reschedule itself."); + assertNotificationNotShown(); + } }
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/offlinepages/prefetch/PrefetchBackgroundTaskUnitTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/offlinepages/prefetch/PrefetchBackgroundTaskUnitTest.java index f0bdc81d..71f40f66 100644 --- a/chrome/android/junit/src/org/chromium/chrome/browser/offlinepages/prefetch/PrefetchBackgroundTaskUnitTest.java +++ b/chrome/android/junit/src/org/chromium/chrome/browser/offlinepages/prefetch/PrefetchBackgroundTaskUnitTest.java
@@ -90,7 +90,6 @@ public static final int HIGH_BATTERY_LEVEL = 75; public static final int LOW_BATTERY_LEVEL = 25; public static final boolean METERED = true; - private static final String GCM_TOKEN = "dummy_gcm_token"; @Spy private PrefetchBackgroundTask mPrefetchBackgroundTask = new PrefetchBackgroundTask(); @@ -128,7 +127,7 @@ } }) .when(mPrefetchBackgroundTask) - .nativeStartPrefetchTask(eq(GCM_TOKEN)); + .nativeStartPrefetchTask(); doReturn(true).when(mPrefetchBackgroundTask).nativeOnStopTask(1); mFakeTaskScheduler = new FakeBackgroundTaskScheduler(); @@ -138,7 +137,7 @@ @Test public void scheduleTask() { final int additionalDelaySeconds = 15; - PrefetchBackgroundTaskScheduler.scheduleTask(additionalDelaySeconds, GCM_TOKEN); + PrefetchBackgroundTaskScheduler.scheduleTask(additionalDelaySeconds); TaskInfo scheduledTask = mFakeTaskScheduler.getTaskInfo(TaskIds.OFFLINE_PAGES_PREFETCH_JOB_ID); assertNotNull(scheduledTask); @@ -157,7 +156,7 @@ @Test public void scheduleTaskLimitless() { final int additionalDelaySeconds = 20; - PrefetchBackgroundTaskScheduler.scheduleTaskLimitless(additionalDelaySeconds, GCM_TOKEN); + PrefetchBackgroundTaskScheduler.scheduleTaskLimitless(additionalDelaySeconds); TaskInfo scheduledTask = mFakeTaskScheduler.getTaskInfo(TaskIds.OFFLINE_PAGES_PREFETCH_JOB_ID); assertNotNull(scheduledTask); @@ -175,7 +174,7 @@ mFakeTaskScheduler.getTaskInfo(TaskIds.OFFLINE_PAGES_PREFETCH_JOB_ID); assertNull(scheduledTask); - PrefetchBackgroundTaskScheduler.scheduleTask(0, GCM_TOKEN); + PrefetchBackgroundTaskScheduler.scheduleTask(0); scheduledTask = mFakeTaskScheduler.getTaskInfo(TaskIds.OFFLINE_PAGES_PREFETCH_JOB_ID); assertNotNull(scheduledTask); assertEquals(TimeUnit.SECONDS.toMillis( @@ -191,9 +190,7 @@ public void createNativeTask() { final ArrayList<Boolean> reschedules = new ArrayList<>(); TaskParameters params = - TaskParameters.create(TaskIds.OFFLINE_PAGES_PREFETCH_JOB_ID) - .addExtras(PrefetchBackgroundTaskScheduler.createGCMTokenBundle(GCM_TOKEN)) - .build(); + TaskParameters.create(TaskIds.OFFLINE_PAGES_PREFETCH_JOB_ID).build(); // Setup battery conditions with no power connected. DeviceConditions deviceConditions = @@ -220,7 +217,7 @@ @Test public void createNativeTaskLimitless() { final ArrayList<Boolean> reschedules = new ArrayList<>(); - Bundle extrasBundle = PrefetchBackgroundTaskScheduler.createGCMTokenBundle(GCM_TOKEN); + Bundle extrasBundle = new Bundle(); extrasBundle.putBoolean(PrefetchBackgroundTask.LIMITLESS_BUNDLE_KEY, true); TaskParameters params = TaskParameters.create(TaskIds.OFFLINE_PAGES_PREFETCH_JOB_ID) .addExtras(extrasBundle) @@ -252,9 +249,7 @@ // Check impact on starting before native loaded. TaskParameters params = - TaskParameters.create(TaskIds.OFFLINE_PAGES_BACKGROUND_JOB_ID) - .addExtras(PrefetchBackgroundTaskScheduler.createGCMTokenBundle(GCM_TOKEN)) - .build(); + TaskParameters.create(TaskIds.OFFLINE_PAGES_BACKGROUND_JOB_ID).build(); int result = mPrefetchBackgroundTask.onStartTaskBeforeNativeLoaded( RuntimeEnvironment.application, params, new TaskFinishedCallback() { @@ -275,9 +270,7 @@ // Check impact on starting before native loaded. TaskParameters params = - TaskParameters.create(TaskIds.OFFLINE_PAGES_BACKGROUND_JOB_ID) - .addExtras(PrefetchBackgroundTaskScheduler.createGCMTokenBundle(GCM_TOKEN)) - .build(); + TaskParameters.create(TaskIds.OFFLINE_PAGES_BACKGROUND_JOB_ID).build(); int result = mPrefetchBackgroundTask.onStartTaskBeforeNativeLoaded( RuntimeEnvironment.application, params, new TaskFinishedCallback() { @@ -298,9 +291,7 @@ // Check impact on starting before native loaded. TaskParameters params = - TaskParameters.create(TaskIds.OFFLINE_PAGES_BACKGROUND_JOB_ID) - .addExtras(PrefetchBackgroundTaskScheduler.createGCMTokenBundle(GCM_TOKEN)) - .build(); + TaskParameters.create(TaskIds.OFFLINE_PAGES_BACKGROUND_JOB_ID).build(); int result = mPrefetchBackgroundTask.onStartTaskBeforeNativeLoaded( RuntimeEnvironment.application, params, new TaskFinishedCallback() { @@ -325,7 +316,7 @@ ShadowDeviceConditions.setCurrentConditions(deviceConditionsNoNetwork); // Check impact on starting before native loaded. - Bundle extrasBundle = PrefetchBackgroundTaskScheduler.createGCMTokenBundle(GCM_TOKEN); + Bundle extrasBundle = new Bundle(); extrasBundle.putBoolean(PrefetchBackgroundTask.LIMITLESS_BUNDLE_KEY, true); TaskParameters params = TaskParameters.create(TaskIds.OFFLINE_PAGES_PREFETCH_JOB_ID) .addExtras(extrasBundle) @@ -350,9 +341,7 @@ // Check impact on starting before native loaded. TaskParameters params = - TaskParameters.create(TaskIds.OFFLINE_PAGES_BACKGROUND_JOB_ID) - .addExtras(PrefetchBackgroundTaskScheduler.createGCMTokenBundle(GCM_TOKEN)) - .build(); + TaskParameters.create(TaskIds.OFFLINE_PAGES_BACKGROUND_JOB_ID).build(); int result = mPrefetchBackgroundTask.onStartTaskBeforeNativeLoaded( RuntimeEnvironment.application, params, new TaskFinishedCallback() { @@ -373,9 +362,7 @@ // Check impact on starting before native loaded. TaskParameters params = - TaskParameters.create(TaskIds.OFFLINE_PAGES_BACKGROUND_JOB_ID) - .addExtras(PrefetchBackgroundTaskScheduler.createGCMTokenBundle(GCM_TOKEN)) - .build(); + TaskParameters.create(TaskIds.OFFLINE_PAGES_BACKGROUND_JOB_ID).build(); int result = mPrefetchBackgroundTask.onStartTaskBeforeNativeLoaded( RuntimeEnvironment.application, params, new TaskFinishedCallback() { @@ -397,9 +384,7 @@ // Check impact on starting before native loaded. TaskParameters params = - TaskParameters.create(TaskIds.OFFLINE_PAGES_BACKGROUND_JOB_ID) - .addExtras(PrefetchBackgroundTaskScheduler.createGCMTokenBundle(GCM_TOKEN)) - .build(); + TaskParameters.create(TaskIds.OFFLINE_PAGES_BACKGROUND_JOB_ID).build(); int result = mPrefetchBackgroundTask.onStartTaskBeforeNativeLoaded( RuntimeEnvironment.application, params, new TaskFinishedCallback() { @@ -421,9 +406,7 @@ // Check impact on starting before native loaded. TaskParameters params = - TaskParameters.create(TaskIds.OFFLINE_PAGES_BACKGROUND_JOB_ID) - .addExtras(PrefetchBackgroundTaskScheduler.createGCMTokenBundle(GCM_TOKEN)) - .build(); + TaskParameters.create(TaskIds.OFFLINE_PAGES_BACKGROUND_JOB_ID).build(); int result = mPrefetchBackgroundTask.onStartTaskBeforeNativeLoaded( RuntimeEnvironment.application, params, new TaskFinishedCallback() { @@ -439,9 +422,7 @@ public void testOnStopAfterCallback() throws Exception { final ArrayList<Boolean> reschedules = new ArrayList<>(); TaskParameters params = - TaskParameters.create(TaskIds.OFFLINE_PAGES_PREFETCH_JOB_ID) - .addExtras(PrefetchBackgroundTaskScheduler.createGCMTokenBundle(GCM_TOKEN)) - .build(); + TaskParameters.create(TaskIds.OFFLINE_PAGES_PREFETCH_JOB_ID).build(); // Conditions should be appropriate for running the task. DeviceConditions deviceConditions = @@ -471,9 +452,7 @@ // Check impact on starting before native loaded. TaskParameters params = - TaskParameters.create(TaskIds.OFFLINE_PAGES_BACKGROUND_JOB_ID) - .addExtras(PrefetchBackgroundTaskScheduler.createGCMTokenBundle(GCM_TOKEN)) - .build(); + TaskParameters.create(TaskIds.OFFLINE_PAGES_BACKGROUND_JOB_ID).build(); int result = mPrefetchBackgroundTask.onStartTaskBeforeNativeLoaded( RuntimeEnvironment.application, params, new TaskFinishedCallback() {
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/suggestions/tile/OWNERS b/chrome/android/junit/src/org/chromium/chrome/browser/suggestions/tile/OWNERS new file mode 100644 index 0000000..e513d51 --- /dev/null +++ b/chrome/android/junit/src/org/chromium/chrome/browser/suggestions/tile/OWNERS
@@ -0,0 +1 @@ +file://chrome/android/java/src/org/chromium/chrome/browser/suggestions/tile/OWNERS
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 new file mode 100644 index 0000000..20b56a3 --- /dev/null +++ b/chrome/android/junit/src/org/chromium/chrome/browser/tab/TabUnitTest.java
@@ -0,0 +1,104 @@ +// 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. + +package org.chromium.chrome.browser.tab; + +import static org.hamcrest.CoreMatchers.equalTo; +import static org.junit.Assert.assertThat; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyInt; +import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.never; +import static org.mockito.Mockito.verify; + +import android.app.Activity; +import android.content.Context; +import android.support.test.filters.SmallTest; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; +import org.robolectric.annotation.Config; + +import org.chromium.base.test.BaseRobolectricTestRunner; +import org.chromium.chrome.browser.ChromeFeatureList; +import org.chromium.content_public.browser.LoadUrlParams; +import org.chromium.ui.base.WindowAndroid; + +import java.lang.ref.WeakReference; +import java.util.HashMap; +import java.util.Map; + +/** + * Tests for {@link Tab}. + */ +@RunWith(BaseRobolectricTestRunner.class) +@Config(manifest = Config.NONE) +public class TabUnitTest { + private static final int TAB1_ID = 456; + private static final int TAB2_ID = 789; + + @Mock + private WindowAndroid mWindowAndroid; + @Mock + private LoadUrlParams mLoadUrlParams; + @Mock + private EmptyTabObserver mObserver; + @Mock + private Context mContext; + @Mock + private WeakReference<Context> mWeakReferenceContext; + @Mock + private WeakReference<Activity> mWeakReferenceActivity; + @Mock + private Activity mActivity; + + private Tab mTab; + + @Before + public void setUp() throws InterruptedException { + MockitoAnnotations.initMocks(this); + + doReturn(mWeakReferenceActivity).when(mWindowAndroid).getActivity(); + doReturn(mWeakReferenceContext).when(mWindowAndroid).getContext(); + doReturn(mActivity).when(mWeakReferenceActivity).get(); + doReturn(mContext).when(mWeakReferenceContext).get(); + doReturn(mContext).when(mContext).getApplicationContext(); + + // Bypass feature checks. + Map<String, Boolean> features = new HashMap<>(); + features.put("ShoppingAssist", true); + ChromeFeatureList.setTestFeatures(features); + + mTab = new Tab(TAB1_ID, null, false, mWindowAndroid, null, null, mLoadUrlParams); + mTab.addObserver(mObserver); + } + + @Test + @SmallTest + public void testSetRootIdWithChange() throws Exception { + assertThat(mTab.getRootId(), equalTo(TAB1_ID)); + + mTab.setRootId(TAB2_ID); + + verify(mObserver).onRootIdChanged(mTab, TAB2_ID); + assertThat(mTab.getRootId(), equalTo(TAB2_ID)); + assertThat(mTab.isTabStateDirty(), equalTo(true)); + } + + @Test + @SmallTest + public void testSetRootIdWithoutChange() throws Exception { + assertThat(mTab.getRootId(), equalTo(TAB1_ID)); + mTab.setIsTabStateDirty(false); + + mTab.setRootId(TAB1_ID); + + verify(mObserver, never()).onRootIdChanged(any(Tab.class), anyInt()); + assertThat(mTab.getRootId(), equalTo(TAB1_ID)); + assertThat(mTab.isTabStateDirty(), equalTo(false)); + } +}
diff --git a/chrome/android/profiles/newest.txt b/chrome/android/profiles/newest.txt index 8edaa40..76d95cf 100644 --- a/chrome/android/profiles/newest.txt +++ b/chrome/android/profiles/newest.txt
@@ -1 +1 @@ -chromeos-chrome-amd64-77.0.3817.0_rc-r1-merged.afdo.bz2 \ No newline at end of file +chromeos-chrome-amd64-77.0.3819.0_rc-r1-merged.afdo.bz2 \ No newline at end of file
diff --git a/chrome/android/trichrome.gni b/chrome/android/trichrome.gni index 472217d8..1c9ac3e6 100644 --- a/chrome/android/trichrome.gni +++ b/chrome/android/trichrome.gni
@@ -109,7 +109,7 @@ deps += [ "//android_webview:v8_snapshot_secondary_abi_assets" ] } } else { - shared_libraries = [ "//chrome/android:monochrome" ] + shared_libraries = [ "//chrome/android:libmonochrome" ] deps += [ "//third_party/crashpad/crashpad/handler:crashpad_handler_trampoline", ]
diff --git a/chrome/app/BUILD.gn b/chrome/app/BUILD.gn index 3d918789..7a0e9d9 100644 --- a/chrome/app/BUILD.gn +++ b/chrome/app/BUILD.gn
@@ -347,7 +347,6 @@ "//components/gwp_asan/buildflags", "//components/nacl/common:buildflags", "//components/startup_metric_utils/browser:lib", - "//components/tracing", "//content/public/app:both", "//content/public/common", "//content/public/common:service_names",
diff --git a/chrome/app/DEPS b/chrome/app/DEPS index 026cfae..88d40f6 100644 --- a/chrome/app/DEPS +++ b/chrome/app/DEPS
@@ -24,7 +24,7 @@ "+components/policy", "+components/safe_browsing", "+components/startup_metric_utils/browser", - "+components/tracing/common/tracing_sampler_profiler.h", + "+services/tracing/public/cpp/stack_sampling/tracing_sampler_profiler.h", "+components/upload_list", "+components/version_info", "+content/public/app",
diff --git a/chrome/app/chrome_content_browser_overlay_manifest.cc b/chrome/app/chrome_content_browser_overlay_manifest.cc index 21a736ae..f132c2b 100644 --- a/chrome/app/chrome_content_browser_overlay_manifest.cc +++ b/chrome/app/chrome_content_browser_overlay_manifest.cc
@@ -124,8 +124,6 @@ // Used by ShelfTestApi and ShelfIntegrationTestApi .RequireCapability("ash", "test") .RequireCapability("ash", "display") - // Only used in the classic Ash case - .RequireCapability("ash_pref_connector", "pref_connector") .RequireCapability("assistant", "assistant") .RequireCapability("cellular_setup", "cellular_setup") // Only used in the classic Ash case @@ -146,8 +144,6 @@ .RequireCapability(image_annotation::mojom::kServiceName, image_annotation::mojom::kAnnotationCapability) .RequireCapability("ime", "input_engine") - // Only used in the classic Ash case - .RequireCapability("local_state", "pref_client") .RequireCapability("media_gallery_util", "parse_media") .RequireCapability("mirroring", "mirroring") .RequireCapability("multidevice_setup", "multidevice_setup")
diff --git a/chrome/app/chrome_main_delegate.cc b/chrome/app/chrome_main_delegate.cc index 58e5cbb..7edc2a2 100644 --- a/chrome/app/chrome_main_delegate.cc +++ b/chrome/app/chrome_main_delegate.cc
@@ -50,7 +50,6 @@ #include "components/gwp_asan/buildflags/buildflags.h" #include "components/nacl/common/buildflags.h" #include "components/services/heap_profiling/public/cpp/profiling_client.h" -#include "components/tracing/common/tracing_sampler_profiler.h" #include "components/version_info/version_info.h" #include "content/public/common/content_client.h" #include "content/public/common/content_paths.h" @@ -63,6 +62,7 @@ #include "ppapi/buildflags/buildflags.h" #include "printing/buildflags/buildflags.h" #include "services/service_manager/embedder/switches.h" +#include "services/tracing/public/cpp/stack_sampling/tracing_sampler_profiler.h" #include "ui/base/material_design/material_design_controller.h" #include "ui/base/resource/resource_bundle.h" #include "ui/base/ui_base_switches.h"
diff --git a/chrome/app/chromeos_strings.grdp b/chrome/app/chromeos_strings.grdp index f231bb0..af2b73c 100644 --- a/chrome/app/chromeos_strings.grdp +++ b/chrome/app/chromeos_strings.grdp
@@ -174,8 +174,8 @@ <message name="IDS_MULTIDEVICE_SETUP_START_SETUP_PAGE_AWM_DESCRIPTION" desc="Description of a feature that shows text messages received by the user's phone as notification on their Chromebook and a link to an information page."> Send you notifications and default to remembering this computer for Messages. <ph name="LINK_BEGIN"><a href="$1<ex>https://support.google.com/chromebook/?p=messages</ex>"></ph>Learn more<ph name="LINK_END"></a></ph> </message> - <message name="IDS_MULTIDEVICE_SETUP_START_SETUP_PAGE_INSTALL_APPS_DESCRIPTION" desc="Tell the user that Better Together can install apps on their Chromebook"> - Install apps on your Chromebook + <message name="IDS_MULTIDEVICE_SETUP_START_SETUP_PAGE_INSTALL_APPS_DESCRIPTION" desc="Tell the user that Better Together can automatically install apps on their Chromebook"> + Automatically install apps </message> <message name="IDS_MULTIDEVICE_SETUP_START_SETUP_PAGE_ADD_FEATURES" desc="Tell the user that Better Together can offer to add new features to that use their phone's connection to their Chromebook"> Offer new features as they become available
diff --git a/chrome/app/os_settings_strings.grdp b/chrome/app/os_settings_strings.grdp index 4cdb89b..9c500e3 100644 --- a/chrome/app/os_settings_strings.grdp +++ b/chrome/app/os_settings_strings.grdp
@@ -2,6 +2,11 @@ <!-- Settings-specific strings (included from generated_resources.grd). --> <grit-part> <if expr="chromeos"> + <!-- Languages and Inputs (OS settings) --> + <message name="IDS_OS_SETTINGS_LANGUAGES_AND_INPUT_PAGE_TITLE" desc="Name of the OS settings page which displays language method preferences."> + Languages and input + </message> + <!-- Personalizaton Page (OS settings) --> <message name="IDS_OS_SETTINGS_PERSONALIZATION" desc="Name of the OS settings page which displays personalization preferences."> Personalization @@ -15,9 +20,9 @@ Open the wallpaper app </message> - <!-- Search and Assistant section. --> - <message name="IDS_OS_SETTINGS_SEARCH_ENGINE_LABEL" desc="Label in OS settings describing search engine behavior."> - Searches from the app launcher use your browser <ph name="BEGIN_LINK"><a target="_blank" href="$1"></ph>search engine setting<ph name="END_LINK"></a></ph>. + <!-- Assistant section. --> + <message name="IDS_OS_SETTINGS_ASSISTANT" desc="Name of the settings section for the Google Assistant."> + Assistant </message> </if> </grit-part>
diff --git a/chrome/app/resources/chromium_strings_ar.xtb b/chrome/app/resources/chromium_strings_ar.xtb index cb1d0d2..6fa2f39 100644 --- a/chrome/app/resources/chromium_strings_ar.xtb +++ b/chrome/app/resources/chromium_strings_ar.xtb
@@ -13,6 +13,7 @@ <translation id="1414495520565016063">تم تسجيل دخولك إلى Chromium!</translation> <translation id="1502360822835740515">جعل Chromium المتصفح التلقائي</translation> <translation id="151962892725702025">تعذر على نظام التشغيل Chromium مزامنة البيانات نظرًا لأن المزامنة غير متاحة في نطاقك.</translation> +<translation id="1524282610922162960">مشاركة علامة تبويب Chromium</translation> <translation id="1585657529869845941">النقر على زر <ph name="BEGIN_BOLD" />التبديل على أي حال<ph name="END_BOLD" /> في حال ظهوره</translation> <translation id="1668054258064581266">بعد إزالة حسابك من Chromium، قد تحتاج إلى إعادة تحميل علامات التبويب المفتوحة لتفعيلها.</translation> <translation id="1688750314291223739">يمكنك إعداد المزامنة لحفظ ميزات المتصفح المخصصة على الويب والدخول إليها من Chromium على أي كمبيوتر.</translation> @@ -126,6 +127,7 @@ <translation id="5479196819031988440">يتعذر على نظام التشغيل Chromium فتح هذه الصفحة.</translation> <translation id="5480860683791598150">يحتاج Chromium للوصول إلى موقعك الجغرافي لمشاركته مع هذا الموقع.</translation> <translation id="549669000822060376">يُرجى الانتظار أثناء تثبيت Chromium لآخر تحديثات النظام.</translation> +<translation id="5623402015214259806">{0,plural, =0{يتوفر تحديث لمتصفح Chromium}=1{يتوفر تحديث لمتصفح Chromium}two{يتوفر تحديث لمتصفح Chromium منذ يومين}few{يتوفر تحديث لمتصفح Chromium منذ # أيام}many{يتوفر تحديث لمتصفح Chromium منذ # يومًا}other{يتوفر تحديث لمتصفح Chromium منذ # يوم}}</translation> <translation id="5631814766731275228">الاسم والصورة على Chromium</translation> <translation id="5634636535844844681">يتطلب Chromium نظام التشغيل Windows 7 أو إصدارًا أحدث.</translation> <translation id="5680901439334282664">تسجيل الدخول إلى Chromium</translation> @@ -149,6 +151,7 @@ <translation id="6120345080069858279">سيحفظ Chromium كلمة المرور هذه في حسابك على Google ولن تحتاج تذكّرها.</translation> <translation id="6129621093834146363">ملف <ph name="FILE_NAME" /> ضار، لذلك فقد حظره Chromium.</translation> <translation id="6212496753309875659">يحتوي هذا الكمبيوتر فعلاً على إصدار أحدث من Chromium. إذا كان البرنامج لا يعمل، فالرجاء إزالة Chromium وإعادة المحاولة.</translation> +<translation id="6219195342503754812">{0,plural, =0{ستتم إعادة تشغيل Chromium الآن}=1{ستتم إعادة تشغيل Chromium في غضون ثانية واحدة}two{ستتم إعادة تشغيل Chromium في غضون ثانيتين}few{ستتم إعادة تشغيل Chromium في غضون # ثوان}many{ستتم إعادة تشغيل Chromium في غضون # ثانيةً}other{ستتم إعادة تشغيل Chromium في غضون # ثانية}}</translation> <translation id="6248213926982192922">جعل Chromium المتصفح التلقائي</translation> <translation id="6268381023930128611">هل تريد الخروج من Chromium؟</translation> <translation id="6295779123002464101">قد يكون ملف <ph name="FILE_NAME" /> ضارًا، لذلك فقد حظره Chromium.</translation> @@ -205,6 +208,7 @@ <translation id="7449453770951226939"><ph name="PAGE_TITLE" /> - إصدار قناة مطوري البرامج من Chromium</translation> <translation id="7451052299415159299">يحتاج Chromium إلى إذن للوصول إلى الكاميرا من أجل موقع الويب هذا.</translation> <translation id="7483335560992089831">لا يمكن تثبيت إصدار Chromium ذاته الذي يتم تشغيله حاليًا. يُرجى إغلاق Chromium وإعادة المحاولة.</translation> +<translation id="753534427205733210">{0,plural, =1{ستتم إعادة تشغيل Chromium في غضون دقيقة واحدة}zero{ستتم إعادة تشغيل Chromium في غضون # دقيقة}two{ستتم إعادة تشغيل Chromium في غضون دقيقتين}few{ستتم إعادة تشغيل Chromium في غضون # دقائق}many{ستتم إعادة تشغيل Chromium في غضون # دقيقةً}other{ستتم إعادة تشغيل Chromium في غضون # دقيقة}}</translation> <translation id="7549178288319965365">حول نظام التشغيل Chromium</translation> <translation id="7561906087460245826">محو البيانات من Chromium أيضًا (<ph name="URL" />)</translation> <translation id="761356813943268536">يستخدم Chromium الكاميرا والميكروفون.</translation> @@ -232,6 +236,7 @@ <translation id="8330519371938183845">يمكنك تسجيل الدخول لمزامنة Chromium وتخصيصه على جميع أجهزتك.</translation> <translation id="8340674089072921962">كان <ph name="USER_EMAIL_ADDRESS" /> يستخدم Chromium مسبقًا</translation> <translation id="8375950122744241554">لن تصبح الملفات الشخصية للمستخدمين تحت الإشراف متاحة بعد الآن بدءًا من إصدار Chromium 70.</translation> +<translation id="8417404458978023919">{0,plural, =1{يجب إعادة تشغيل Chromium في غضون يوم واحد}zero{يجب إعادة تشغيل Chromium في غضون # يوم}two{يجب إعادة تشغيل Chromium في غضون يومين}few{يجب إعادة تشغيل Chromium في غضون # أيام}many{يجب إعادة تشغيل Chromium في غضون # يومًا}other{يجب إعادة تشغيل Chromium في غضون # يوم}}</translation> <translation id="8453117565092476964">أرشيف أداة التثبيت تالف أو غير صالح. يُرجى إعادة تنزيل Chromium.</translation> <translation id="8493179195440786826">إصدار Chromium قديم</translation> <translation id="85843667276690461">الحصول على مساعدة بشأن استخدام Chromium</translation> @@ -258,6 +263,7 @@ <translation id="9025992965467895364">تستهلك هذه الصفحة مساحة كبيرة من الذاكرة، لذلك أوقفها Chromium مؤقتًا.</translation> <translation id="9036189287518468038">مشغل تطبيقات Chromium</translation> <translation id="9089354809943900324">إصدار Chromium قديم</translation> +<translation id="9093206154853821181">{0,plural, =1{ستتم إعادة تشغيل Chromium في غضون ساعة واحدة}zero{ستتم إعادة تشغيل Chromium في غضون # ساعة}two{ستتم إعادة تشغيل Chromium في غضون ساعتين}few{ستتم إعادة تشغيل Chromium في غضون # ساعات}many{ستتم إعادة تشغيل Chromium في غضون # ساعةً}other{ستتم إعادة تشغيل Chromium في غضون # ساعة}}</translation> <translation id="91086099826398415">فتح الرابط في علامة تبويب جديدة في Chromium</translation> <translation id="911206726377975832">هل تريد أيضًا حذف بيانات التصفح؟</translation> <translation id="9158494823179993217">ضَبَط مشرف النظام Chromium لفتح متصفِّح بديل للوصول إلى <ph name="TARGET_URL_HOSTNAME" />.</translation>
diff --git a/chrome/app/resources/chromium_strings_ca.xtb b/chrome/app/resources/chromium_strings_ca.xtb index 63722a0..1ef8c66 100644 --- a/chrome/app/resources/chromium_strings_ca.xtb +++ b/chrome/app/resources/chromium_strings_ca.xtb
@@ -236,7 +236,7 @@ <translation id="8330519371938183845">Inicia la sessió per sincronitzar i personalitzar Chromium en tots els teus dispositius</translation> <translation id="8340674089072921962"><ph name="USER_EMAIL_ADDRESS" /> abans utilitzava Chromium</translation> <translation id="8375950122744241554">A partir de Chromium 70, els perfils d'usuaris supervisats deixaran d'estar disponibles.</translation> -<translation id="8417404458978023919">{0,plural, =1{Reinicia Chromium en un termini d'1 dia}other{Reinicia Chromium en un termini de # dies}}</translation> +<translation id="8417404458978023919">{0,plural, =1{Reinicia Chromium en 1 dia}other{Reinicia Chromium en # dies}}</translation> <translation id="8453117565092476964">L'arxiu d'instal·lació està malmès o no és vàlid. Torneu a baixar Chromium.</translation> <translation id="8493179195440786826">Chromium no està actualitzat</translation> <translation id="85843667276690461">Obtén ajuda per a l'ús de Chromium</translation>
diff --git a/chrome/app/resources/chromium_strings_es.xtb b/chrome/app/resources/chromium_strings_es.xtb index 39c5de8..8860024 100644 --- a/chrome/app/resources/chromium_strings_es.xtb +++ b/chrome/app/resources/chromium_strings_es.xtb
@@ -153,7 +153,7 @@ <translation id="6120345080069858279">Chromium guardará esta contraseña en tu cuenta de Google para que no tengas que recordarla.</translation> <translation id="6129621093834146363"><ph name="FILE_NAME" /> es peligroso, por lo que Chromium lo ha bloqueado.</translation> <translation id="6212496753309875659">Este ordenador ya cuenta con una versión más reciente de Chromium. Si el software no funciona, desinstala Chromium y vuelve a intentarlo.</translation> -<translation id="6219195342503754812">{0,plural, =0{Chromium se reiniciará ahora}=1{Chromium se reiniciará dentro de 1 segundo}other{Chromium se reiniciará dentro de # segundos}}</translation> +<translation id="6219195342503754812">{0,plural, =0{Chromium se reiniciará ahora}=1{Chromium se reiniciará en el transcurso de 1 segundo}other{Chromium se reiniciará en el transcurso de # segundos}}</translation> <translation id="6248213926982192922">Establecer Chromium como navegador predeterminado</translation> <translation id="6268381023930128611">¿Cerrar sesión en Chromium?</translation> <translation id="6295779123002464101">Es posible que <ph name="FILE_NAME" /> sea peligroso, por lo que Chromium lo ha bloqueado.</translation> @@ -210,7 +210,7 @@ <translation id="7449453770951226939"><ph name="PAGE_TITLE" /> ‑ Chromium Dev</translation> <translation id="7451052299415159299">Chromium necesita permiso para acceder a la cámara en este sitio web</translation> <translation id="7483335560992089831">No se puede instalar la misma versión de Chromium que se está ejecutando actualmente. Cierra Chromium y vuelve a intentarlo.</translation> -<translation id="753534427205733210">{0,plural, =1{Chromium se reiniciará dentro de 1 minuto}other{Chromium se reiniciará dentro de # minutos}}</translation> +<translation id="753534427205733210">{0,plural, =1{Chromium se reiniciará en el transcurso de 1 minuto}other{Chromium se reiniciará en el transcurso de # minutos}}</translation> <translation id="7549178288319965365">Información de Chromium OS</translation> <translation id="7561906087460245826">Borrar también los datos de Chromium (<ph name="URL" />)</translation> <translation id="761356813943268536">Chromium está utilizando la cámara y el micrófono.</translation> @@ -238,7 +238,7 @@ <translation id="8330519371938183845">Inicia sesión para sincronizar y personalizar Chromium en todos tus dispositivos</translation> <translation id="8340674089072921962"><ph name="USER_EMAIL_ADDRESS" /> usaba Chromium anteriormente</translation> <translation id="8375950122744241554">Los perfiles de usuario supervisado no estarán disponibles a partir de la versión 70 de Chromium.</translation> -<translation id="8417404458978023919">{0,plural, =1{Reiniciar Chromium dentro de 1 día}other{Reiniciar Chromium dentro de # días}}</translation> +<translation id="8417404458978023919">{0,plural, =1{Reiniciar Chromium en el transcurso de 1 día}other{Reiniciar Chromium en el transcurso de # días}}</translation> <translation id="8453117565092476964">El archivo de instalación está dañado o no es válido. Vuelve a descargar Chromium.</translation> <translation id="8493179195440786826">Chromium no está actualizado</translation> <translation id="85843667276690461">Obtener ayuda de Chromium</translation> @@ -265,7 +265,7 @@ <translation id="9025992965467895364">Esta página utiliza demasiada memoria y Chromium la ha pausado.</translation> <translation id="9036189287518468038">Menú de aplicaciones de Chromium</translation> <translation id="9089354809943900324">Chromium no está actualizado</translation> -<translation id="9093206154853821181">{0,plural, =1{Chromium se reiniciará dentro de 1 hora}other{Chromium se reiniciará dentro de # horas}}</translation> +<translation id="9093206154853821181">{0,plural, =1{Chromium se reiniciará en el transcurso de 1 hora}other{Chromium se reiniciará en el transcurso de # horas}}</translation> <translation id="91086099826398415">Abrir enlace en una pes&taña nueva de Chromium</translation> <translation id="911206726377975832">¿Quieres borrar también los datos de navegación?</translation> <translation id="9158494823179993217">El administrador del sistema ha configurado Chromium para que abra otro navegador al acceder a <ph name="TARGET_URL_HOSTNAME" />.</translation>
diff --git a/chrome/app/resources/chromium_strings_hi.xtb b/chrome/app/resources/chromium_strings_hi.xtb index 3b10f8c..3d88afc8 100644 --- a/chrome/app/resources/chromium_strings_hi.xtb +++ b/chrome/app/resources/chromium_strings_hi.xtb
@@ -108,7 +108,7 @@ <translation id="4714956846925717402">क्रोमियम पर तेज़ी से पहुंचें</translation> <translation id="4746050847053251315">फिर भी क्रोमियम छोड़ें?</translation> <translation id="4748217263233248895">क्रोमियम के लिए एक खास सुरक्षा अपडेट अभी लागू किया गया था. अभी रीस्टार्ट करें और हम आपके टैब बहाल कर देंगे.</translation> -<translation id="479167709087336770">इसमें स्पेलिंग जाँचने वाली उसी सुविधा का इस्तेमाल होता है जिसका इस्तेमाल 'Google सर्च' में किया जाता है. आप ब्राउज़र में जो भी लेख लिखते हैं उसे Google को भेजा जाता है. आप सेटिंग में जाकर इसे कभी भी बदल सकते हैं.</translation> +<translation id="479167709087336770">इसमें स्पेलिंग जाँचने वाली उसी सुविधा का इस्तेमाल होता है जिसका इस्तेमाल 'Google सर्च' में किया जाता है. आप ब्राउज़र में जो भी लेख लिखते हैं उसे Google को भेजा जाता है. आप 'सेटिंग' में जाकर इसे कभी भी बदल सकते हैं.</translation> <translation id="4888717733111232871">mDNS ट्रैफ़िक की अनुमति देने के लिए क्रोमियम के लिए इनबाउंड नियम.</translation> <translation id="4943838377383847465">क्रोमियम पृष्ठभूमि मोड में है.</translation> <translation id="4987820182225656817">अतिथि कुछ भी छोड़े बिना क्रोमियम का उपयोग कर सकते हैं.</translation> @@ -263,7 +263,7 @@ <translation id="9025992965467895364">यह पेज बहुत ज़्यादा मेमोरी का इस्तेमाल करता है, इसलिए क्रोमियम ने इसे रोक दिया है.</translation> <translation id="9036189287518468038">क्रोमियम ऐप्लिकेशन लॉन्चर</translation> <translation id="9089354809943900324">क्रोमियम पुराना हो गया है</translation> -<translation id="9093206154853821181">{0,plural, =1{क्रोमियम एक घंटे के अंदर फिर से लॉन्च होगा}one{क्रोमियम # घंटों के अंदर फिर से लॉन्च होगा}other{क्रोमियम # घंटों के अंदर फिर से लॉन्च होगा}}</translation> +<translation id="9093206154853821181">{0,plural, =1{क्रोमियम एक घंटे के अंदर फिर से लॉन्च होगा}one{क्रोमियम # घंटे के अंदर फिर से लॉन्च होगा}other{क्रोमियम # घंटे के अंदर फिर से लॉन्च होगा}}</translation> <translation id="91086099826398415">नए क्रोमियम &टैब में लिंक खोलें</translation> <translation id="911206726377975832">अपने ब्राउज़िंग डेटा भी मिटाएं?</translation> <translation id="9158494823179993217">आपके सिस्टम एडमिन ने 'क्रोमियम' को इस तरह कॉन्फ़िगर किया है कि वह <ph name="TARGET_URL_HOSTNAME" /> को एक्सेस करने के लिए कोई दूसरा ब्राउज़र खोले.</translation>
diff --git a/chrome/app/resources/chromium_strings_ml.xtb b/chrome/app/resources/chromium_strings_ml.xtb index b45459d..00d1a690 100644 --- a/chrome/app/resources/chromium_strings_ml.xtb +++ b/chrome/app/resources/chromium_strings_ml.xtb
@@ -129,7 +129,7 @@ <translation id="5479196819031988440">Chromium OS-ന് ഈ പേജ് തുറക്കാനാവില്ല.</translation> <translation id="5480860683791598150">Chromium-ത്തിന് ഈ സൈറ്റുമായി ലൊക്കേഷൻ പങ്കിടുന്നതിന് നിങ്ങളുടെ ലൊക്കേഷനിലേക്കുള്ള ആക്സസ് ആവശ്യമാണ്</translation> <translation id="549669000822060376">Chromium ഏറ്റവും പുതിയ സിസ്റ്റം അപ്ഡേറ്റുകൾ ഇൻസ്റ്റാളുചെയ്യുന്നതുവരെ കാത്തിരിക്കുക.</translation> -<translation id="5623402015214259806">{0,plural, =0{ഒരു Chromium അപ്ഡേറ്റ് ലഭ്യമാണ്}=1{ഒരു Chromium അപ്ഡേറ്റ് ലഭ്യമാണ്}other{# ദിവസത്തേക്ക് ഒരു Chromium അപ്ഡേറ്റ് ലഭ്യമാണ്}}</translation> +<translation id="5623402015214259806">{0,plural, =0{Chromium-ത്തിനൊരു അപ്ഡേറ്റ് ലഭ്യമാണ്}=1{Chromium-ത്തിനൊരു അപ്ഡേറ്റ് ലഭ്യമാണ്}other{# ദിവസമായി Chromium-ത്തിനൊരു അപ്ഡേറ്റ് ലഭ്യമാണ്}}</translation> <translation id="5631814766731275228">Chromium പേരും ചിത്രവും</translation> <translation id="5634636535844844681">Chromium-ത്തിന് Windows 7 അല്ലെങ്കിൽ അതിനുശേഷമുള്ള പതിപ്പ് ആവശ്യമാണ്.</translation> <translation id="5680901439334282664">Chromium-ലേക്ക് സൈൻ ഇൻ ചെയ്യുക</translation>
diff --git a/chrome/app/resources/generated_resources_am.xtb b/chrome/app/resources/generated_resources_am.xtb index edc7017..a0f92ebb 100644 --- a/chrome/app/resources/generated_resources_am.xtb +++ b/chrome/app/resources/generated_resources_am.xtb
@@ -1,6 +1,7 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="am"> +<translation id="1002469766576243227">ይህ ማረጋገጫ አገልግሎት የሚስተናገደው በ <ph name="EXTENSION_NAME" /> ነው</translation> <translation id="1003088604756913841">አገናኝ በአዲስ የ<ph name="APP" /> መስኮት ውስጥ ይክፈቱ</translation> <translation id="1004218526896219317">የጣቢያ መዳረሻ</translation> <translation id="1005274289863221750">ማይክሮፎንዎን እና ካሜራዎን ይጠቀማል</translation> @@ -289,6 +290,7 @@ <translation id="1429300045468813835">ሁሉም ጸድተዋል</translation> <translation id="143027896309062157">በጎበኟቸው ድር ጣቢያዎች ላይ ያለው ሁሉም ውሂብዎን ያነብባል እና ይቀይራል</translation> <translation id="1430915738399379752">አትም</translation> +<translation id="1431188203598586230">የመጨረሻ የሶፍትዌር ዝማኔ</translation> <translation id="1432581352905426595">የፍለጋ ፕሮግራሞችን ያቀናብሩ</translation> <translation id="1433811987160647649">ከመድረስ በፊት ጠይቅ</translation> <translation id="1434696352799406980">ይህ የእርስዎን የመነሻ ገጽ፣ አዲስ የትር ገጽ፣ የፍለጋ ፕሮግራምን እና የተሰኩ ትሮችን ዳግም ያቀናብራቸዋል። እንዲሁም ሁሉንም ቅጥያዎች ያሰናክላል እና እንደ ኩኪዎች ያለ ጊዜያዊ ውሂብን ያጸዳል። የእርስዎ ዕልባቶች፣ ታሪክ እና የተቀመጡ የይለፍ ቃላት አይጸዱም።</translation> @@ -528,6 +530,7 @@ <translation id="1781771911845953849">መለያዎች እና ማስመር</translation> <translation id="1782196717298160133">የእርስዎን ስልክ ማግኘት</translation> <translation id="1784849162047402014">መሣሪያ ያለው ባዶ ቦታ ዝቅተኛ ነው</translation> +<translation id="1790194216133135334">አገናኝ ወደ <ph name="DEVICE_NAME" /> ይላኩ</translation> <translation id="1792619191750875668">የተቀጠለ ማሳያ</translation> <translation id="1794791083288629568">እኛ ይህን ችግር እንድንፈታው ለማገዝ ግብረመልስ ይላኩ።</translation> <translation id="1795214765651529549">የታወቀ ገጽታን ተጠቀም</translation> @@ -590,6 +593,7 @@ <translation id="1875312262568496299">ጀምር</translation> <translation id="1875387611427697908">ይሄ ከ<ph name="CHROME_WEB_STORE" /> ብቻ ነው ሊታከል የሚችለው</translation> <translation id="1877520246462554164">የማረጋገጫ ማስመሰያውን ማግኘት አልተሳካም። እንደገና ለመሞከር እባክዎ ዘግተው ይውጡና እንደገና ይግቡ።</translation> +<translation id="1877860345998737529">የእርምጃ ምደባን ቀያይር</translation> <translation id="1879000426787380528">በመለያ ይግቡ እንደ</translation> <translation id="1880905663253319515">«<ph name="CERTIFICATE_NAME" />» የእውቅና ማረጋገጫ ይሰረዝ?</translation> <translation id="1886996562706621347">ጣቢያዎች ለፕሮቶኮሎች ነባሪ ከዋኞች እንዲሆኑ እንዲጠይቁ ፍቀድ (የሚመከር)</translation> @@ -869,7 +873,9 @@ <translation id="230927227160767054">ይህ ገጽ የአገልግሎት ተቆጣጣሪ ለመጫን ይፈልጋል።</translation> <translation id="2309620859903500144">ይህ ጣቢያ የእርስዎን እንቅስቃሴ ወይም የብርሃን ዳሳሾችን እንዳይደርስ አግዷል።</translation> <translation id="2315414688463285945">የLinux ፋይሎችን ማዋቀር ላይ ስህተት። እባክዎ እንደገና ይሞክሩ።</translation> +<translation id="2315587498123194634">አገናኝ ወደ <ph name="DEVICE_NAME" /> ይላኩ</translation> <translation id="2316129865977710310">አይ፣ አመሰግናለሁ</translation> +<translation id="2316739859433277603">ከመተግበሪያው አስጀመሪ የሚመጡ ፍለጋዎች የእርስዎን አሳሽ <ph name="BEGIN_LINK" />የፍለጋ ሞተር ቅንብር<ph name="END_LINK" /> ይጠቀማሉ።</translation> <translation id="2317842250900878657"><ph name="PROGRESS_PERCENT" />% ተከናውኗል</translation> <translation id="2318143611928805047">የወረቀት መጠን</translation> <translation id="2318817390901984578">የAndroid መተግበሪያዎችን ለመጠቀም የእርስዎን <ph name="DEVICE_TYPE" /> ኃይል ይሙሉ እና ያዘምኑ።</translation> @@ -909,6 +915,7 @@ <translation id="2365507699358342471">ይህ ጣቢያ ወደ ቅንጥብ ሰሌዳው የተቀዱ ጽሑፍን እና ምስሎችን መመልከት ይችላል።</translation> <translation id="2367199180085172140">ፋይል አጋራን ያክሉ</translation> <translation id="2367972762794486313">መተግበሪያዎችን አሳይ</translation> +<translation id="2369105924912929484">የተጣሩ የገጽ ይዘቶችን ይቀያይሩ</translation> <translation id="2371076942591664043">&ሲጠናቀቅ ክፈት</translation> <translation id="2375406435414127095">ከእርስዎ ስልክ ጋር ይገናኙ</translation> <translation id="2377667304966270281">ከባድ ስህተቶች</translation> @@ -1158,6 +1165,7 @@ <translation id="2739191690716947896">አርም</translation> <translation id="2739240477418971307">የተደራሽነት ቅንብሮችዎን ይቀይራል</translation> <translation id="2740393541869613458">ክትትል የሚደረግበት ተጠቃሚ የጎበኛቸውን ድር ጣቢያዎች ይከልሱ እና</translation> +<translation id="2741912629735277980">በመለያ መግቢያ ማያ ገጽ ላይ ዩአይ አሳይ</translation> <translation id="274290345632688601">የLinux መተግበሪያዎችን እና ፋይሎችን ወደ ነበሩበት በመመለስ ላይ</translation> <translation id="2743387203779672305">ወደ ቅንጥብ ሰሌዳ ገልብጥ</translation> <translation id="2745080116229976798">Microsoft Qualified Subordination</translation> @@ -1274,6 +1282,7 @@ <translation id="2910318910161511225">ከአውታረ መረብ ጋር ያገናኙና እንደገና ይሞክሩ</translation> <translation id="2913331724188855103">ጣቢያዎች የኩኪ ውሂብ እንዲያስቀምጡ እና እንዲያነቡ ይፍቀዱ (የሚመከር)</translation> <translation id="2915102088417824677">የእንቅስቃሴ ምዝግብ ማስታወሻን ይመልከቱ</translation> +<translation id="2915873080513663243">ራስ-ቅኝት</translation> <translation id="2916073183900451334">አንድ ድረ-ገጽ ላይ Tabን መጫን አገናኞችንና እንዲሁም የቅጽ መስኮችን ያደምቃል።</translation> <translation id="2916745397441987255">በቅጥያዎች ውስጥ ይፈልጉ</translation> <translation id="2921081876747860777">እባክዎ አካባቢያዊ ውሂብዎን ለመጠበቅ የይለፍ ቃል ይፍጠሩ</translation> @@ -1482,6 +1491,7 @@ <translation id="327147043223061465">ሁሉንም ኩኪዎች እና የጣቢያ ውሂብ ይመልከቱ</translation> <translation id="3271648667212143903"><ph name="ORIGIN" /> መገናኘት ይፈልጋል</translation> <translation id="3274763671541996799">አሁን ወደ ሙሉ ማያ ገጽ ሄደዋል።</translation> +<translation id="3275778809241512831">የእርስዎ ውስጣዊ ደህንነት ቁልፍ አሁን ላይ ደህንነቱ የማያስተማምን ነው። እርስዎ አብረው ከሚጠቀሙበት ከማናቸውም አገልግሎት ላይ እባክዎ ያስወግዱት። ችግሩን መፍትሔ ለመስጠት፣ የደህንነት ቁልፉን እባክዎ ዳግም ያቀናብሩ።</translation> <translation id="3275778913554317645">እንደ መስኮት ክፈት</translation> <translation id="3278001907972365362">የእርስዎ Google መለያ(ዎች) ትኩረት ይፈልጋል(ሉ)</translation> <translation id="3279230909244266691">ይህ ሂደት ጥቂት ደቂቃዎች ሊወስድ ይችላል። ምናባዊ ማሽኑን በመጀመር ላይ።</translation> @@ -1574,6 +1584,7 @@ <translation id="3412265149091626468">ወደ ተመረጠው ዝለል</translation> <translation id="3413122095806433232">CA ሰጪዎች፦ <ph name="LOCATION" /></translation> <translation id="3414952576877147120">መጠን፦</translation> +<translation id="3420501302812554910">ውስጣዊ ደህንነት ቅይልፍ ዳግም መቀናበር ይፈልጋል</translation> <translation id="3421387094817716717">ሞላላ ጥምዝ ይፋዊ ቁልፍ</translation> <translation id="3423463006624419153">በእርስዎ «<ph name="PHONE_NAME_1" />» እና «<ph name="PHONE_NAME_2" />» ላይ፦</translation> <translation id="3423858849633684918">እባክዎ <ph name="PRODUCT_NAME" />ን ዳግም ያስጀምሩት</translation> @@ -1602,6 +1613,7 @@ <translation id="3450157232394774192">የስራ-ፈት ሁኔታ ያዥነት መቶኛ</translation> <translation id="3453612417627951340">ፈቀዳ ያስፈልገዋል</translation> <translation id="3454157711543303649">ማግበር ተጠናቋል</translation> +<translation id="3454213325559396544">ይህ ለዚህ <ph name="DEVICE_TYPE" /> የመጨረሻው ራስሰር ሶፍትዌር እና የደህንነት ዝማኔ ነው። የወደፊት ዝማኔዎችን ለማግኘት፣ ወደ በጣም አዲሱ ሞዴል ደረጃ ያሻሽሉ።</translation> <translation id="345693547134384690">&ምስል በአዲስ ትር ውስጥ ክፈት</translation> <translation id="3457500881955698515">የእርስዎ ኩባንያ ወይም ድርጅት በዚህ መሣሪያ ላይ ወዲያውኑ ዝማኔ ያስፈልገዋል</translation> <translation id="3459509316159669723">ማተም</translation> @@ -1759,6 +1771,7 @@ <translation id="3672681487849735243">አንድ የፋብሪካ ስህተት ተገኝቷል</translation> <translation id="367645871420407123">የስር ይለፍ ቃሉ ወደ ነባሪው የሙከራ ምስል እሴት ለማዘጋጀት ከፈለጉ ባዶ እንደሆነ ይተዉት</translation> <translation id="3677657024345889897">ከሁሉም ጸጥ ያለው</translation> +<translation id="3677911431265050325">የሞባይል ጣቢያ ጠይቅ</translation> <translation id="3678156199662914018">ቅጥያ፦ <ph name="EXTENSION_NAME" /></translation> <translation id="3681311097828166361">ለሰጡን ግብረመልስ እናመሰግናለን። አሁን ከመስመር ውጭ ነዎት፣ እና የእርስዎ ሪፖርት በኋላ ላይ ይላካል።</translation> <translation id="3682824389861648626">የእንቅስቃሴ መባቻ</translation> @@ -2141,6 +2154,12 @@ <translation id="4242577469625748426">የመምሪያ ቅንብሮች በዚህ መሣሪያ ላይ መጫን አልተሳካም፦ <ph name="VALIDATION_ERROR" />።</translation> <translation id="4244238649050961491">ተጨማሪ የስቲለስ መተግበሪያዎችን ያግኙ</translation> <translation id="424726838611654458">ሁልጊዜ በAdobe Reader ክፈት</translation> +<translation id="4247274662191902962">የዳሳሽ ውውሂብ የሚጋራው እርስዎ በዚህ የቪአር ተሞክሮ ላይ እያሉ ብቻ ነው። ጣቢያው እንደሚከተሉት ያሉ የተወሰነ መረጃ ተጠቅሞ እርስዎ ሊያውቅ ይችላል፦ + - የእርስዎ አካባቢ + - እንደ የአይን አቀማመጥ ያሉ የእርስዎ አካላዊ ባህሪያትት + - እንደ አረማመድዎ ያሉ የእርስዎ እንቅስቃሴዎች + + መዳረሻን ከመፍቀድዎ በፊት ይህን ጣቢያ የሚያምኑት መሆንዎን ያረጋግጡ።</translation> <translation id="4247901771970415646">ከ<ph name="USERNAME" /> ጋር ማሳመር አይቻልም</translation> <translation id="4249248555939881673">የአውታረ መረብ ግንኙነትን በመጠበቅ ላይ...</translation> <translation id="4249373718504745892">ይህ ገጽ ካሜራዎን እና ማይክሮፎንዎን እንዳይደርስባቸው ታግዷል።</translation> @@ -2203,6 +2222,7 @@ <translation id="4350019051035968019">ይህ መሣሪያ በተለየ ጎራ የሚተዳደር መሆኑ ምልክት ስለተደረገበት የእርስዎ መለያ ባለበት ጎራ መመዝገብ አይችልም።</translation> <translation id="4354344420232759511">እርስዎ የጎበኙዋቸው ጣቢያዎች እዚህ ላይ ብቅ ይላሉ</translation> <translation id="435527878592612277">የእርስዎን ፎቶ ይምረጡ</translation> +<translation id="4358313196493694334">የጠቅ ማድረግ መገኛ አካባቢን አረጋጋ</translation> <translation id="4359408040881008151">በጥገኛ ቅጥያ(ዎች) ምክንያት ተጭኗል።</translation> <translation id="4359717112757026264">ሲቲስኬፕ</translation> <translation id="4361142739114356624">የዚህ ደንበኛ የእውቅና ማረጋገጫ የሆነው የግል ቁልፍ ይጎድላል ወይም አይሠራም</translation> @@ -2327,6 +2347,7 @@ <translation id="4558426062282641716">የራስ-አስጀምር ፍቃድ ተጠይቋል</translation> <translation id="4558491878126948419">በGoogle ምርቶች ላይ የ<ph name="DEVICE_TYPE" /> ጠቃሚ ምክሮችንና ዝማኔዎችን ያግኙ እና ግብረመልስ ያጋሩ። በማንኛውም ጊዜ ከደንበኝነት ምዝገባ ይውጡ።</translation> <translation id="4559617833001311418">ይህ ጣቢያ የእርስዎን እንቅስቃሴ ወይም የብርሃን ዳሳሾች እየደረሰ ነው።</translation> +<translation id="4561098487691395071">ወይም የእርስዎን አታሚ PPD ይጥቀሱ</translation> <translation id="4562155214028662640">የጣት አሻራን አክል</translation> <translation id="4563880231729913339">ጣት 3</translation> <translation id="4565377596337484307">የይለፍ ቃል ደብቅ</translation> @@ -2571,6 +2592,7 @@ <translation id="494286511941020793">የተኪ ውቅር እገዛ</translation> <translation id="4943368462779413526">የአሜሪካ እግር ኳስ</translation> <translation id="4943691134276646401">«<ph name="CHROME_EXTENSION_NAME" />» ወደ ተከታታይ ወደብ መገናኘት ይፈልጋል</translation> +<translation id="4944310289250773232">ይህ ማረጋገጫ አገልግሎት የሚስተናገደው በ <ph name="SAML_DOMAIN" /> ነው</translation> <translation id="495170559598752135">እርምጃዎች</translation> <translation id="4953689047182316270">ለተደራሽነት ክስተቶች ምላሽ መስጠት</translation> <translation id="4953808748584563296">ነባሪ ብርቱካናማ አምሳያ</translation> @@ -2663,6 +2685,7 @@ <translation id="5094721898978802975">ከተባባሪ ቤተኛ መተግበሪያዎች ጋር ተገናኝ</translation> <translation id="5097002363526479830">ከአውታረ መረብ «<ph name="NAME" />» ጋር መገናኘት አልተሳካም፦ <ph name="DETAILS" /></translation> <translation id="5101042277149003567">ሀሉንም እልባቶች ክፈት</translation> +<translation id="5101839224773798795">ጠቋሚ ሲያቆም በራስሰር ጠቅ አድርግ</translation> <translation id="5108967062857032718">ቅንብሮች - የAndroid መተግበሪያዎችን አስወግድ</translation> <translation id="5109044022078737958">ሚያ</translation> <translation id="5111646998522066203">ማንነትን ከማያሳውቅ ይውጡ</translation> @@ -3146,6 +3169,7 @@ <translation id="5852112051279473187">ውይ! ይህን መሣሪያ በመመዝገብ ላይ ሳለ የሆነ ስህተት ተፈጥሯል። እባክዎ እንደገና ይሞክሩ ወይም የድጋፍ ተወካይዎን ያግኙ።</translation> <translation id="5852137567692933493">ዳግም አስጀምር እና ፓወርዋሽ አድርግ</translation> <translation id="5854912040170951372">Slice</translation> +<translation id="5855643921295613558">0.6 ሰከንዶች</translation> <translation id="5855773610748894548">ውይ፣ ደህንነቱ የተጠበቀ ሞዱል ስህተት።</translation> <translation id="5856721540245522153">የማረሚያ ባህሪያትን ያንቁ</translation> <translation id="5857090052475505287">አዲስ አቃፊ</translation> @@ -3435,6 +3459,7 @@ <translation id="6279183038361895380">የእርስዎን ጠቋሚ ለማሳየት |<ph name="ACCELERATOR" />| ይጫኑ</translation> <translation id="6280215091796946657">በተለየ መለያ ይግቡ</translation> <translation id="6280912520669706465">ኤአርሲ</translation> +<translation id="628352644014831790">4 ሰከንዶች</translation> <translation id="6285120108426285413"><ph name="FILE_NAME" /> በተለምዶ የሚወርድ ፋይል አይደለም፣ እና አደገኛ ሊሆን ይችላል።</translation> <translation id="6285120908535925801">{NUM_PRINTER,plural, =1{በእርስዎ አውታረ መረብ ላይ ያለ አዲስ አታሚ}one{በእርስዎ አውታረ መረብ ላይ ያሉ አዲስ አታሚዎች}other{በእርስዎ አውታረ መረብ ላይ ያሉ አዲስ አታሚዎች}}</translation> <translation id="6286708577777130801">የተቀመጡ የይለፍ ቃላት ዝርዝሮች</translation> @@ -3641,6 +3666,7 @@ <translation id="6612358246767739896">ጥበቃ የሚደረግለት ይዘት</translation> <translation id="6613452264606394692">ይህን ገጽ ዕልባት በማድረግ በፍጥነት ወደዚህ ተመልሰው ይምጡ</translation> <translation id="6615455863669487791">አሳየኝ</translation> +<translation id="6617100836880592260">የቅኝት ፍጥነት፦ <ph name="SPEED_WITH_UNITS" /></translation> <translation id="6618097958368085618">ለማንኛውም አስቀምጥ</translation> <translation id="6619058681307408113">የመስመር ህትመት ዴሞን (LPD)</translation> <translation id="661907246513853610">ጣቢያ የእርስዎን አካባቢ መከታተል ይችላል</translation> @@ -4455,6 +4481,7 @@ <translation id="7831491651892296503">አውታረ መረብን ማዋቀር ላይ ስህተት</translation> <translation id="7831754656372780761"><ph name="TAB_TITLE" /> <ph name="EMOJI_MUTING" /></translation> <translation id="7832084384634357321">የሚያበቃበት ጊዜ</translation> +<translation id="783214144752121388">እየሠራ ካለ Flash ጣቢያዎችን አግድ (የሚመከር)</translation> <translation id="7833720883933317473">የተቀመጡ ብጁ ቃላት እዚህ ይታያሉ</translation> <translation id="7835178595033117206">ዕልባት ተወግዷል</translation> <translation id="7837776265184002579">የእርስዎ ጅምር ገጽ ወደ <ph name="URL" /> ተቀይሯል።</translation> @@ -4510,6 +4537,7 @@ <translation id="7911118814695487383">Linux</translation> <translation id="7912080627461681647">የእርስዎ የይለፍ ቃል በአገልጋዩ ላይ ተቀይሯል። እባክዎ ዘግተው ይውጡና እንደገና ይግቡ።</translation> <translation id="7915471803647590281">ግብረ መልሱን ከመላክዎ በፊት እባክዎ ምን እየተከሰተ እንደሆነ ይንገሩን።</translation> +<translation id="7919210519031517829"><ph name="DURATION" /> ሴ</translation> <translation id="792514962475806987">የተተከለ ማጉያ ደረጃ፦</translation> <translation id="7925247922861151263">የAAA ማረጋገጥ አልተሳካም</translation> <translation id="7925285046818567682"><ph name="HOST_NAME" /> በመጠበቅ ላይ…</translation> @@ -4567,6 +4595,7 @@ <translation id="7987814697832569482">በዚህ VPN በኩል ሁልጊዜ አገናኝ</translation> <translation id="798835209536175951">መልዕክቶችን ወደ የእርስዎ Chromebook ይላኩ እና ከእሱ ይቀበሉ። <ph name="LINK_BEGIN" />የበለጠ ለመረዳት<ph name="LINK_END" /></translation> <translation id="7988355189918024273">የተደራሽነት ቅንብሮች ያንቁ</translation> +<translation id="7991296728590311172">የመቀያየሪያ መዳረሻ ቅንብሮች</translation> <translation id="7994702968232966508">የEAP ስልት</translation> <translation id="7997826902155442747">የቅድሚያ ሂደት</translation> <translation id="7999229196265990314">'የሚከተሉትን ፋይሎች ፈጥሯል፦ @@ -4784,6 +4813,8 @@ <translation id="8308179586020895837"><ph name="HOST" /> የእርስዎ ካሜራ መድረስ የሚፈልግ ከሆነ ይጠይቅ</translation> <translation id="830868413617744215">ቅድመ-ይሁንታ</translation> <translation id="8309458809024885768">የእውቅና ማረጋገጫ አስቀድሞ አለ</translation> +<translation id="8314381333424235892">የጎደለ ወይም ያልተጫነ ቅጥያ</translation> +<translation id="8316618172731049784">ወደ <ph name="DEVICE_NAME" /> ላክ</translation> <translation id="8317671367883557781">የአውታረ መረብ ግንኙነት ያክሉ</translation> <translation id="8319414634934645341">የተስፋፋ ቁልፍ አጠቃቀም</translation> <translation id="8320459152843401447">የእርስዎ ሙሉ ማያ ገጽ</translation> @@ -4940,6 +4971,7 @@ <translation id="8588866096426746242">የመገለጫ ስታቲስቲክስ</translation> <translation id="8588868914509452556"><ph name="WINDOW_TITLE" /> - VR ወደ የጆሮ ማዳመጫ በማቅረብ ላይ</translation> <translation id="8590375307970699841">አውቶማቲክ ዝምኖችን አዋቅር</translation> +<translation id="8591783563402255548">1 ሰከንድ</translation> <translation id="8592141010104017453">በጭራሽ ማሳወቂያዎችን አታሳይ</translation> <translation id="8593121833493516339">የአጠቃቀም እና የምርመራ ውሂብ ይላኩ። የምርመራ፣ የመሣሪያ እና የመተግበሪያ አጠቃቀም ውሂብ በራስ-ሰር ወደ Google በመላክ የልጅዎን የAndroid ተሞክሮ እንዲሻሻል ያግዙ። ይህ ልጅዎን ለመለየት ስራ ላይ አይውልም፣ እና የስርዓት እና የመተግበሪያ እርጋታን እና ሌሎች ማሻሻያዎችን ያግዛል። አንዳንድ ውሑድ ውሂብ እንዲሁም የGoogle መተግበሪያዎችን እና እንደ የAndroid ገንቢዎች ያሉ አጋሮችን ያግዛሉ። የተጨማሪ ድር እና መተግበሪያ እንቅስቃሴ ለልጅዎ በርቶ ከሆነ ይህ ውሂብ አሁን በGoogle መለያቸው ላይ ሊቀመጥ ይችላል። <ph name="BEGIN_LINK1" />የበለጠ ለመረዳት<ph name="END_LINK1" /></translation> <translation id="8594908476761052472">ቪድዮ ቅረጽ</translation> @@ -4969,6 +5001,7 @@ <translation id="8637688295594795546">የስርዓት ዝማኔ አለ። ለማውረድ በመዘጋጀት ላይ…</translation> <translation id="8639047128869322042">ጎጂ ሶፍትዌር ካለ በመፈተሽ ላይ...</translation> <translation id="8642171459927087831">የመዳረሻ ማስመሰያ</translation> +<translation id="8642900771896232685">2 ሰከንዶች</translation> <translation id="8642947597466641025">ጽሑፍ አተልቅ</translation> <translation id="8643418457919840804">ለመቀጠል አንድ አማራጭ ይምረጡ፦</translation> <translation id="8644655801811752511">ይህን የደህንነት ቁልፍ ዳግም ማቀናበር አይቻልም። ካስገቡት በኋላ ወዲያውኑ ቁልፉን ዳግም ለማቀናበር ይሞክሩ።</translation> @@ -5170,6 +5203,7 @@ <translation id="8910222113987937043">በእርስዎ ዕልባቶች፣ ታሪክ፣ የይለፍ ቃላት እና ሌሎች ቅንብሮች ላይ የሚደረጉ ለውጦች ከአሁን በኋላ ከGoogle መለያዎ ጋር አይሰምሩም። ይሁንና፣ የእርስዎ ነባር ውሂብ በGoogle መለያዎ ላይ እንደተከማቸ የሚቆይ እና በ<ph name="BEGIN_LINK" />Google ዳሽቦርድ<ph name="END_LINK" /> ላይ መቀናበር የሚችል ነው።</translation> <translation id="8912362522468806198">የGoogle መለያ</translation> <translation id="8912793549644936705">ወጥር</translation> +<translation id="8912810933860534797">ራስ-ቃኝን አንቃ</translation> <translation id="891365694296252935">የአጠቃቀም እና የምርመራ ውሂብ ይላኩ። ይህ መሣሪያ በአሁኑ ጊዜ በራስ-ሰር የምርመራ፣ የመሣሪያ እና የመተግበሪያ አጠቃቀም ውሂብ ወደ Google እየላከ ነው። ይህ ልጅዎን ለመለየት ስራ ላይ አይውልም፣ እና የስርዓት እና የመተግበሪያ እርጋታን እና ሌሎች ማሻሻያዎችን ያግዛል። አንዳንድ ውሑድ ውሂብ እንዲሁም የGoogle መተግበሪያዎችን እና እንደ የAndroid ገንቢዎች ያሉ አጋሮችን ያግዛሉ። ይህ ቅንብር በባለቤቱ ተፈጻሚ ይደረጋል። የተጨማሪ ድር እና መተግበሪያ እንቅስቃሴ ለልጅዎ በርቶ ከሆነ ይህ ውሂብ አሁን በGoogle መለያቸው ላይ ሊቀመጥ ይችላል። <ph name="BEGIN_LINK1" />የበለጠ ለመረዳት<ph name="END_LINK1" /></translation> <translation id="8915370057835397490">የጥቆማ አስተያየት በመጫን ላይ</translation> <translation id="8916476537757519021">ማንነት የማያሳውቅ ንዑስ ክፈፍ፦ <ph name="SUBFRAME_SITE" /></translation> @@ -5322,6 +5356,7 @@ <translation id="9153934054460603056">ማንነት እና የይለፍ ቃል ያስቀምጡ</translation> <translation id="9154194610265714752">የተዘመነ</translation> <translation id="91568222606626347">አቋራጭ ፍጠር...</translation> +<translation id="9157096865782046368">0.8 ሰከንዶች</translation> <translation id="9157697743260533322">ለሁሉም ተጠቃሚዎች ራስ-ሰር ዝማኔዎችን ማዋቀር አልተሳካም (የቅድመ በረራ ማስጀመሪያ ስህተት፦ <ph name="ERROR_NUMBER" />)</translation> <translation id="9158715103698450907">ውይ! በማረጋገጥ ጊዜ ላይ አንድ የአውታረ መረብ ግንኙነት ችግር ተከስቷል። እባክዎ የአውታረ መረብዎን ግንኙነት ያረጋግጡና እንደገና ይሞክሩ።</translation> <translation id="916607977885256133">በሥዕል ላይ ሥዕል</translation>
diff --git a/chrome/app/resources/generated_resources_ar.xtb b/chrome/app/resources/generated_resources_ar.xtb index 661a2a8..dc33f36 100644 --- a/chrome/app/resources/generated_resources_ar.xtb +++ b/chrome/app/resources/generated_resources_ar.xtb
@@ -4,6 +4,7 @@ <translation id="1003088604756913841">فتح الرابط في نافذة جديدة في <ph name="APP" /></translation> <translation id="1004218526896219317">الوصول إلى موقع ويب</translation> <translation id="1005274289863221750">استخدام الميكروفون والكاميرا</translation> +<translation id="1005608198058526414">عرض إعدادات Family Link</translation> <translation id="1006873397406093306">يمكن لهذه الإضافة قراءة بياناتك وتغييرها على المواقع. يمكنك التحكُّم في المواقع التي يمكن لهذه الإضافة الوصول إليها.</translation> <translation id="1007408791287232274">تعذر تحميل الأجهزة.</translation> <translation id="1008186147501209563">تصدير الإشارات المرجعية</translation> @@ -33,6 +34,7 @@ <translation id="1039337018183941703">ملف تالف أو غير صالح</translation> <translation id="1041175011127912238">الصفحة لا تستجيب.</translation> <translation id="1042174272890264476">يأتي جهاز الكمبيوتر أيضًا مزودًا بمكتبة RLZ مضمنة للمنتج <ph name="SHORT_PRODUCT_NAME" />. تعيّن RLZ علامة غير فريدة وغير متعلقة بتحديد الشخصية من أجل قياس عمليات البحث ومعدل استخدام <ph name="SHORT_PRODUCT_NAME" /> الذي تؤثر فيه حملة ترويجية محددة. تظهر هذه التصنيفات أحيانًا في طلبات بحث Google في <ph name="PRODUCT_NAME" />.</translation> +<translation id="1045692658517323508">{0,plural, =1{يجب التحديث في غضون دقيقة واحدة}zero{يجب التحديث في غضون # دقيقة}two{يجب التحديث في غضون دقيقتين}few{يجب التحديث في غضون # دقائق}many{يجب التحديث في غضون # دقيقةً}other{يجب التحديث في غضون # دقيقة}}</translation> <translation id="1046059554679513793">عذرًا، هذا الاسم قيد الاستخدام فعلاً!</translation> <translation id="1046635659603195359">يبدو أنه سبق لك إعداد ميزة Voice Match في "مساعد Google "على جهاز آخر. ويمكن استخدام هذه التسجيلات السابقة لإنشاء نموذج صوتي على هذا الجهاز. ويستغرق ذلك أقل من دقيقة.</translation> <translation id="1047431265488717055">نسخ ن&ص الرابط</translation> @@ -149,6 +151,7 @@ <translation id="1206407435587370571">استكشاف جهاز Chromebook</translation> <translation id="1209796539517632982">خوادم الأسماء التلقائية</translation> <translation id="1211364473545090084">استخدِم الويب دون حفظ سجلّ التصفُّح باستخدام نافذة تصفُّح متخفٍ</translation> +<translation id="1211769675100312947">الاختصارات التي نظمتها</translation> <translation id="1213037489357051291">تم إعداد <ph name="NUM_FINGERPRINTS" /> من بصمات الإصبع</translation> <translation id="1215411991991485844">تمت إضافة تطبيق جديد في الخلفية</translation> <translation id="1217483152325416304">سيتم قريبًا حذف البيانات المحلية.</translation> @@ -303,6 +306,7 @@ <translation id="146000042969587795">تمّ حجب هذا الإطار لتضمّنه بعض المحتوى غير الآمن.</translation> <translation id="146219525117638703">حالة ONC</translation> <translation id="146220085323579959">تم قطع الاتصال بالإنترنت. يُرجى التحقق من الاتصال بالإنترنت وإعادة المحاولة.</translation> +<translation id="1463112138205428654">تم حظر <ph name="FILE_NAME" /> من خلال برنامج "الحماية المتقدمة".</translation> <translation id="1464258312790801189">حساباتك</translation> <translation id="1465176863081977902">ن&سخ عنوان الصوت</translation> <translation id="1465827627707997754">شريحة بيتزا</translation> @@ -315,6 +319,7 @@ <translation id="1478340334823509079">التفاصيل: <ph name="FILE_NAME" /></translation> <translation id="1478607704480248626">التثبيت غير مُفعَّل</translation> <translation id="1483493594462132177">إرسال</translation> +<translation id="1483829627339988491">أدوات الرقابة الأبوية</translation> <translation id="1484979925941077974">يستخدم الموقع الإلكتروني البلوتوث.</translation> <translation id="1485015260175968628">يمكنه الآن:</translation> <translation id="1485141095922496924">الإصدار <ph name="PRODUCT_VERSION" /> (<ph name="PRODUCT_CHANNEL" />) <ph name="PRODUCT_MODIFIER" /> <ph name="PRODUCT_VERSION_BITS" /></translation> @@ -368,10 +373,12 @@ <translation id="155865706765934889">لوحة اللمس</translation> <translation id="1564414980088536597">يتعذَّر استخدام هذه الصورة. يُرجى اختيار صورة أخرى.</translation> <translation id="1566049601598938765">موقع ويب</translation> +<translation id="15662109988763471">لا تتوفر الطابعة المختارة أو لم يتم تثبيتها بشكلٍ صحيح. يُرجى التحقق من الطابعة أو تجربة اختيار طابعة أخرى.</translation> <translation id="1567387640189251553">تم توصيل لوحة مفاتيح مختلفة منذ آخر إدخال لكلمة المرور، وقد يكون ذلك محاولةً لسرقة ضغطات المفاتيح.</translation> <translation id="1567750922576943685">يساعد التحقُّق من هويتك في حماية معلوماتك الشخصية</translation> <translation id="1567993339577891801">وحدة تحكم جافا سكريبت</translation> <translation id="1568323446248056064">فتح إعدادات الجهاز للعرض</translation> +<translation id="1572139610531470719"><ph name="WINDOW_TITLE" /> (وضع الضيف)</translation> <translation id="1572266655485775982">تفعيل شبكة Wi-Fi</translation> <translation id="1572876035008611720">أدخل بريدك الإلكتروني</translation> <translation id="1576594961618857597">الصورة الرمزية التلقائية البيضاء</translation> @@ -651,6 +658,7 @@ <translation id="1983959805486816857">بعد إنشاء مستخدم جديد يخضع للإشراف، يُمكنك إدارة الإعدادات في أي وقت وعلى أي جهاز على <ph name="MANAGEMENT_URL" />.</translation> <translation id="1987317783729300807">حسابات</translation> <translation id="1989112275319619282">تصفّح</translation> +<translation id="1990512225220753005">عدم إظهار الاختصارات في هذه الصفحة</translation> <translation id="1992397118740194946">لم يتم تعيينه</translation> <translation id="1994173015038366702">عنوان URL للموقع</translation> <translation id="1997484222658892567">يريد <ph name="URL" /> تخزين حجم كبير من البيانات على جهاز الكمبيوتر المحلي بشكل دائم.</translation> @@ -1106,6 +1114,7 @@ <translation id="2677748264148917807">الخروج</translation> <translation id="2678063897982469759">إعادة تفعيل</translation> <translation id="268053382412112343">ال&سجل</translation> +<translation id="2682374361574804119">{0,plural, =1{يجب التحديث في غضون ساعة واحدة}zero{يجب التحديث في غضون # ساعة}two{يجب التحديث في غضون ساعتين}few{يجب التحديث في غضون # ساعات}many{يجب التحديث في غضون # ساعةً}other{يجب التحديث في غضون # ساعة}}</translation> <translation id="2682498795777673382">تحديث من أحد والديك</translation> <translation id="2683638487103917598">تم تصنيف المجلد</translation> <translation id="2684004000387153598">للمتابعة، انقر على "موافقة" ثم انقر على "إضافة شخص" لإنشاء ملف شخصي جديد لعنوان بريدك الإلكتروني.</translation> @@ -1222,6 +1231,7 @@ <translation id="284975061945174219">تعذّرت إزالة البرامج.</translation> <translation id="2849936225196189499">مهمة</translation> <translation id="2850541429955027218">إضافة مظهر</translation> +<translation id="2858138569776157458">أهم المواقع</translation> <translation id="2859806420264540918">يعرض هذا الموقع الإلكتروني إعلانات مضلِّلة أو غير مرغوب فيها.</translation> <translation id="2861301611394761800">اكتمل تحديث النظام. يُرجى إعادة تشغيل النظام.</translation> <translation id="2861941300086904918">إدارة الأمان لـ Native Client</translation> @@ -1327,6 +1337,7 @@ <translation id="3016329696181678353">تعذَّر ضبط <ph name="PRINTER_NAME" /> تلقائيًا. يُرجى تحديد تفاصيل الطابعة المتقدِّمة.</translation> <translation id="3016641847947582299">تم تحديث المُكوّن</translation> <translation id="3016780570757425217">معرفة موقعك</translation> +<translation id="3017079585324758401">الخلفية</translation> <translation id="3020183492814296499">الاختصارات</translation> <translation id="3020990233660977256">الرقم التسلسلي: <ph name="SERIAL_NUMBER" /></translation> <translation id="3021066826692793094">فراشة</translation> @@ -1591,6 +1602,7 @@ <translation id="3453612417627951340">يتطلب تخويل</translation> <translation id="3454157711543303649">اكتمل التفعيل</translation> <translation id="345693547134384690">فتح &الصورة في علامة تبويب جديدة</translation> +<translation id="3457500881955698515">تتطلب شركتك أو مؤسستك تحديث هذا الجهاز في الحال.</translation> <translation id="3459509316159669723">الطباعة</translation> <translation id="3459697287128633276">لتمكين حسابك من الوصول إلى متجر Google Play، يُرجى المصادقة مع موفّر الهوية.</translation> <translation id="3459774175445953971">آخر تعديل:</translation> @@ -1659,6 +1671,7 @@ <translation id="3552780134252864554">تم المحو عند الخروج</translation> <translation id="3555812735919707620">إزالة الإضافة</translation> <translation id="3556000484321257665">تم تغيير محرك بحثك إلى <ph name="URL" />.</translation> +<translation id="3557101512409028104">ضبط الحدود القصوى المسموح بها للقيود على مواقع الويب ووقت النظر إلى الشاشة باستخدام Family Link</translation> <translation id="3559262020195162408">تعذَّر تثبيت السياسة على الجهاز.</translation> <translation id="3560034655160545939">&التدقيق الإملائي</translation> <translation id="3562423906127931518">قد تستغرق هذه العملية بضع دقائق. جارٍ إعداد حاوية نظام التشغيل Linux.</translation> @@ -1722,6 +1735,7 @@ <translation id="3645372836428131288">حرّك إصبعك قليلاً لالتقاط جزء مختلف من بصمة الإصبع.</translation> <translation id="3648348069317717750">تم اكتشاف <ph name="USB_DEVICE_NAME" /></translation> <translation id="3649138363871392317">تم التقاط الصورة</translation> +<translation id="3649505501900178324">ثمة تأخير في التحديث</translation> <translation id="3650845953328929506">تحميل السجلّ مُعلّق.</translation> <translation id="3650952250015018111">السماح لتطبيق "<ph name="APP_NAME" />" بالوصول:</translation> <translation id="3651488188562686558">قطع الاتصال بشبكة Wi-Fi</translation> @@ -1987,6 +2001,7 @@ <translation id="3996366967769547206">{NUM_TABS,plural, =1{إزالة تثبيت علامة تبويب واحدة}zero{إزالة تثبيت علامات التبويب}two{إزالة تثبيت علامتيِّ التبويب}few{إزالة تثبيت علامات التبويب}many{إزالة تثبيت علامات التبويب}other{إزالة تثبيت علامات التبويب}}</translation> <translation id="4002440992267487163">إعداد رقم تعريف شخصي</translation> <translation id="4005817994523282006">طريقة رصد المنطقة الزمنية</translation> +<translation id="4007856537951125667">إخفاء الاختصارات</translation> <translation id="4008291085758151621">معلومات الموقع غير متاحة في VR</translation> <translation id="4010917659463429001">للحصول على الإشارات المرجعية على جهازك الجوّال، <ph name="GET_IOS_APP_LINK" />.</translation> <translation id="4013132157686828973">يُجري "<ph name="CLIENT_NAME" />" تصحيحًا لأخطاء هذا المتصفِّح.</translation> @@ -2124,6 +2139,12 @@ <translation id="4242577469625748426">تعذّر تثبيت إعدادات السياسة على الجهاز: <ph name="VALIDATION_ERROR" />.</translation> <translation id="4244238649050961491">العثور على المزيد من تطبيقات قلم الشاشة</translation> <translation id="424726838611654458">الفتح دائمًا باستخدام Adobe Reader</translation> +<translation id="4247274662191902962">لن تتم مشاركة بيانات جهاز الاستشعار إلا أثناء تجربة الواقع الافتراضي هذه. قد يتمكّن الموقع من التعرُّف عليك باستخدام معلومات معينة، مثل: + - موقعك الجغرافي + - سماتك البدنية، مثل موضع العين + - وحركاتك، مثل طريقة المشي + + يُرجى التأكُّد من أنك تثق بهذا الموقع قبل منحه الإذن بالوصول.</translation> <translation id="4247901771970415646">تتعذّر المزامنة مع <ph name="USERNAME" /></translation> <translation id="4249248555939881673">في انتظار الاتصال بالشبكة...</translation> <translation id="4249373718504745892">تم حظر دخول هذه الصفحة إلى الكاميرا والميكروفون التابعين لك.</translation> @@ -2156,6 +2177,7 @@ <translation id="4289540628985791613">نظرة عامة</translation> <translation id="4291934469232591280">الإصدار: <ph name="VERSION" /></translation> <translation id="4295072614469448764">أصبح التطبيق متاحًا في الوحدة الطرفية وقد تجد رمزًا له في مشغِّل التطبيقات.</translation> +<translation id="4295979599050707005">يُرجى تسجيل الدخول مرة أخرى لتأكيد إمكانية استخدام حسابك <ph name="USER_EMAIL" /> مع مواقع الويب والتطبيقات والإضافات في Chrome وGoogle Play. يمكنك أيضًا إزالة هذا الحساب. <ph name="LINK_BEGIN" />مزيد من المعلومات<ph name="LINK_END" /></translation> <translation id="4296575653627536209">إضافة مستخدم تحت الإشراف</translation> <translation id="4297219207642690536">إعادة التشغيل وإعادة الضبط</translation> <translation id="4297322094678649474">تغيير اللغات</translation> @@ -2392,6 +2414,7 @@ <translation id="4697551882387947560">عند انتهاء جلسة التصفح</translation> <translation id="4699172675775169585">الصور والملفات المخزنة مؤقتًا</translation> <translation id="4699357559218762027">(يتم تشغيله تلقائيًا)</translation> +<translation id="470074695271471509">هل تريد تسجيل الخروج لإتمام العملية؟</translation> <translation id="4707302005824653064">يمكن للمدير مراجعة الاستخدام والسجل (<ph name="CUSTODIAN_EMAIL" />) على chrome.com.</translation> <translation id="4707579418881001319">L2TP/IPSec + شهادة المستخدم</translation> <translation id="4707934200082538898">يُرجى التحقق من بريدك الإلكتروني على <ph name="BEGIN_BOLD" /><ph name="MANAGER_EMAIL" /><ph name="END_BOLD" /> للحصول على مزيد من الإرشادات.</translation> @@ -2570,6 +2593,7 @@ <translation id="4973307593867026061">إضافة الطابعات</translation> <translation id="4973325300212422370">{NUM_TABS,plural, =1{كتم صوت موقع ويب واحد}zero{كتم صوت مواقع الويب}two{كتم صوت موقعيِّ الويب}few{كتم صوت مواقع الويب}many{كتم صوت مواقع الويب}other{كتم صوت مواقع الويب}}</translation> <translation id="4974733135013075877">الخروج وتشغيل وضع القفل للأطفال</translation> +<translation id="4976795213394241669">{0,plural, =0{يجب التحديث الآن}=1{يجب التحديث في غضون ثانية واحدة}two{يجب التحديث في غضون ثانيتين}few{يجب التحديث في غضون # ثوان}many{يجب التحديث في غضون # ثانيةً}other{يجب التحديث في غضون # ثانية}}</translation> <translation id="4977942889532008999">تأكيد الدخول</translation> <translation id="4980805016576257426">تحتوي هذه الإضافة على برامج ضارة.</translation> <translation id="4981449534399733132">لمحو بيانات التصفُّح من جميع أجهزتك التي تمت مزامنتها ومن حسابك على Google، يُرجى <ph name="BEGIN_LINK" />تسجيل الدخول<ph name="END_LINK" />.</translation> @@ -2601,6 +2625,7 @@ <translation id="5029568752722684782">محو النسخة</translation> <translation id="5030338702439866405">جهة الإصدار</translation> <translation id="5033266061063942743">الأشكال الهندسية</translation> +<translation id="5033619151015094114">تتطلب شركتك أو مؤسستك تحديث هذا الجهاز.</translation> <translation id="503498442187459473">يريد <ph name="HOST" /> استخدام الكاميرا والميكروفون.</translation> <translation id="5036662165765606524">عدم السماح لأي موقع بتنزيل عدة ملفات تلقائيًا</translation> <translation id="5037676449506322593">تحديد الكل</translation> @@ -3128,6 +3153,7 @@ <translation id="5855773610748894548">عفوًا، حدث خطأ في الوحدة الآمنة.</translation> <translation id="5856721540245522153">تفعيل ميزات تصحيح الأخطاء</translation> <translation id="5857090052475505287">مجلد جديد</translation> +<translation id="5857171483910641802">يتم اقتراح الاختصارات استنادًا إلى مواقع الويب التي تزورها كثيرًا.</translation> <translation id="5858490737742085133">Terminal</translation> <translation id="585979798156957858">مفتاح Meta الخارجي</translation> <translation id="5860033963881614850">غير مفعّل</translation> @@ -3297,6 +3323,7 @@ <translation id="6097480669505687979">إذا لم تفرّغ مساحة، فقد تتم إزالة المستخدمين والبيانات تلقائيا.</translation> <translation id="6100736666660498114">قائمة بدء التشغيل</translation> <translation id="6101226222197207147">تمت إضافة تطبيق جديد (<ph name="EXTENSION_NAME" />)</translation> +<translation id="6102043788063419338">تم حظر الملف من خلال برنامج "الحماية المتقدمة".</translation> <translation id="6103681770816982672">تحذير: أنت الآن تجري تحويلاً إلى قناة المطوّر</translation> <translation id="6104068876731806426">حسابات Google</translation> <translation id="6104311680260824317">يتعذَّر ضم الجهاز إلى النطاق لأن الخادم لا يدعم أنواع تشفير Kerberos المحدَّدة. يُرجى الانتقال إلى "مزيد من الخيارات" للاطِّلاع على إعدادات التشفير.</translation> @@ -3389,6 +3416,7 @@ <translation id="6242852299490624841">التركيز على علامة التبويب هذه</translation> <translation id="6243280677745499710">المحدّدة حاليًا</translation> <translation id="6243774244933267674">الخادم غير متاح</translation> +<translation id="6246790815526961700">تحميل من الجهاز</translation> <translation id="6247708409970142803">%<ph name="PERCENTAGE" /></translation> <translation id="6247802389331535091">النظام: <ph name="ARC_PROCESS_NAME" /></translation> <translation id="624789221780392884">التحديث جاهز</translation> @@ -3590,6 +3618,7 @@ <translation id="6555432686520421228">إزالة جميع حسابات المستخدمين وإعادة تعيين جهاز <ph name="IDS_SHORT_PRODUCT_NAME" /> كما لو كان جديدًا.</translation> <translation id="6555810572223193255">إزالة البرامج غير متاحة حاليًا</translation> <translation id="6556866813142980365">إعادة</translation> +<translation id="6557290421156335491">اختصاراتي</translation> <translation id="6559023360691182159">{COUNT,plural, =0{ولا تطبيق}=1{<ph name="APP_1" />}=2{<ph name="APP_1" /> و<ph name="APP_2" />}=3{<ph name="APP_1" /> و<ph name="APP_2" /> و<ph name="APP_3" />}=4{<ph name="APP_1" /> و<ph name="APP_2" /> و<ph name="APP_3" /> وتطبيق واحد آخر}few{<ph name="APP_1" /> و<ph name="APP_2" /> و<ph name="APP_3" /> و<ph name="EXTRA_APPS" /> تطبيقات أخرى}many{<ph name="APP_1" /> و<ph name="APP_2" /> و<ph name="APP_3" /> و<ph name="EXTRA_APPS" /> تطبيقًا آخر}other{<ph name="APP_1" /> و<ph name="APP_2" /> و<ph name="APP_3" /> و<ph name="EXTRA_APPS" /> تطبيق آخر}}</translation> <translation id="6561726789132298588">إدخال</translation> <translation id="656293578423618167">اسم الملف أو مساره طويل جدًا. يُرجى الحفظ باستخدام اسم أقصر أو في مكان آخر.</translation> @@ -4280,8 +4309,10 @@ <translation id="764017888128728">يعمل <ph name="PASSWORD_MANAGER_BRAND" /> على تسجيل دخولك تلقائيًا إلى المواقع المؤهلة باستخدام كلمات المرور التي حفظتها.</translation> <translation id="7642778300616172920">إخفاء المحتوى الحسّاس</translation> <translation id="7643842463591647490">{0,plural, =1{هناك نافذة واحدة مفتوحة (#).}zero{هناك # نافذة مفتوحة.}two{هناك نافذتان مفتوحتان (#).}few{هناك # نوافذ مفتوحة.}many{هناك # نافذة مفتوحة.}other{هناك # نافذة مفتوحة.}}</translation> +<translation id="7644543211198159466">اللون والتصميم</translation> <translation id="7645176681409127223"><ph name="USER_NAME" /> (المالك)</translation> <translation id="7647403192093989392">ليست هناك أنشطة حديثة</translation> +<translation id="7648142322539582331">الاتصال بالإنترنت لإعداد أدوات الرقابة الأبوية</translation> <translation id="7648992873808071793">تخزين الملفات على هذا الجهاز</translation> <translation id="7649070708921625228">مساعدة</translation> <translation id="7650511557061837441">تريد الإضافة "<ph name="TRIGGERING_EXTENSION_NAME" />" إزالة "<ph name="EXTENSION_NAME" />".</translation> @@ -4440,6 +4471,8 @@ <translation id="7847212883280406910">اضغط على Ctrl + Alt + S للتبديل إلى <ph name="IDS_SHORT_PRODUCT_OS_NAME" /></translation> <translation id="7849264908733290972">فتح ال&صورة في علامة تبويب جديدة</translation> <translation id="784934925303690534">النطاق الزمني</translation> +<translation id="7850222546481862746"><ph name="BEGIN_PARAGRAPH1" />لإتمام عملية إعداد الإشراف على هذا الجهاز، عليك تسجيل الخروج من الحساب الخاص بالمستخدم <ph name="USER_NAME" />.<ph name="END_PARAGRAPH1" /> + <ph name="BEGIN_PARAGRAPH2" />يمكنك إدارة أدوات الرقابة الأبوية لطفلك من خلال تثبيت تطبيق "Family Link للوالدَين" على الجهاز الخاص بك.<ph name="END_PARAGRAPH2" /></translation> <translation id="7851457902707056880">تم تقييد تسجيل الدخول على مالك الحساب فقط. يُرجى إعادة التشغيل وتسجيل الدخول باستخدام حساب المالك. ستتم إعادة تشغيل الجهاز خلال 30 ثانية.</translation> <translation id="7851716364080026749">حظر الدخول إلى الكاميرا والميكروفون دومًا</translation> <translation id="7853747251428735">المزيد من الأد&وات</translation> @@ -4678,6 +4711,7 @@ <translation id="8200772114523450471">استئناف</translation> <translation id="8202160505685531999">يُرجى إعادة إدخال كلمة المرور لتحديث ملف <ph name="DEVICE_TYPE" /> الشخصي.</translation> <translation id="8203732864715032075">تُرسِل إليك الإشعارات وتتذكر جهاز الكمبيوتر هذا لميزة "الرسائل". <ph name="LINK_BEGIN" />مزيد من المعلومات<ph name="LINK_END" /></translation> +<translation id="820568752112382238">المواقع الأكثر زيارة</translation> <translation id="8206354486702514201">تم فرض هذا الإعداد بواسطة المشرف.</translation> <translation id="8206581664590136590">يمكنك إرسال بيانات الاستخدام والتشخيص. يمكنك المساعدة في تحسين تجربة نظام التشغيل Android على حسابك الفرعي من خلال إرسال بيانات التطبيق والجهاز والتشخيص تلقائيًا إلى Google. لن يتم استخدام ذلك لتعريف حسابك الفرعي وسيساعد في استقرار عمل النظام والتطبيقات، بالإضافة إلى التحسينات الأخرى. كما ستساعد بعض البيانات المجمّعة تطبيقات Google وشركائها، مثل مطوّري برامج نظام التشغيل Android. في حال تفعيل إعداد "النشاط الإضافي على الويب وفي التطبيقات" لحسابك الفرعي، قد يتم حفظ هذه البيانات في حسابك على Google. <ph name="BEGIN_LINK1" />مزيد من المعلومات<ph name="END_LINK1" /></translation> <translation id="8206745257863499010">موسيقي</translation> @@ -4689,6 +4723,7 @@ <translation id="8214489666383623925">فتح ملف...</translation> <translation id="8214962590150211830">إزالة هذا الشخص</translation> <translation id="8217399928341212914">متابعة حظر التنزيلات التلقائية لعدة ملفات</translation> +<translation id="8225265270453771718">مشاركة نافذة التطبيق</translation> <translation id="8225753906568652947">استرداد قيمة العروض</translation> <translation id="8226222018808695353">محظور </translation> <translation id="8226619461731305576">اللائحة</translation> @@ -4712,6 +4747,7 @@ <translation id="8253198102038551905">انقر '+' للحصول على خصائص الشبكة</translation> <translation id="825483282309623688">لاستعادة بياناتك، تحتاج إلى اتصال بالإنترنت.</translation> <translation id="8254954272268479918">إيقاف تطبيق Linux (إصدار تجريبي)</translation> +<translation id="8255451560461371599">لا تتوفر خلفية</translation> <translation id="8256319818471787266">اللامع</translation> <translation id="8257950718085972371">متابعة حظر الدخول إلى الكاميرا</translation> <translation id="8259239505248583312">بدء الاستخدام</translation> @@ -4922,6 +4958,7 @@ <translation id="8620617069779373398">حالة التجوال</translation> <translation id="8620765578342452535">تهيئة اتصالات الشبكة</translation> <translation id="8621866727807194849">هناك برنامج ضار على جهاز الكمبيوتر. يعمل متصفِّح Chrome على إزالته وعلى استعادة إعداداتك وإيقاف الإضافات. سيؤدي هذا الإجراء إلى عمل متصفِّحك بشكلٍ طبيعي من جديد.</translation> +<translation id="8621979332865976405">مشاركة الشاشة بالكامل</translation> <translation id="862542460444371744">&الإضافات</translation> <translation id="8627151598708688654">تحديد مصدر</translation> <translation id="862727964348362408">معلقة</translation> @@ -5107,6 +5144,7 @@ <translation id="8871974300055371298">إعدادات المحتوى</translation> <translation id="8872155268274985541">يوجد ملف غير صالح لبيان التحديث الخارجي لتطبيق Kiosk. اخفق تحديث تطبيق Kiosk. يُرجى إزالة جهاز USB.</translation> <translation id="8874184842967597500">غير متصل</translation> +<translation id="887550310442005096">تطلب منك شركتك أو مؤسستك تحديث هذا الجهاز.</translation> <translation id="8876307312329369159">لا يمكن تغيير هذا الإعداد في جلسة تجريبية.</translation> <translation id="8877448029301136595">[الدليل الأصل]</translation> <translation id="8879284080359814990">إ&ظهار كعلامة تبويب</translation> @@ -5157,6 +5195,7 @@ <translation id="8948939328578167195">يريد <ph name="WEBSITE" /> الاطّلاع على العلامة التجارية لمفتاح الأمان وطرازه.</translation> <translation id="8951256747718668828">تعذَّر إكمال الاستعادة بسبب حدوث خطأ</translation> <translation id="895347679606913382">بدء التحميل...</translation> +<translation id="8956941634583033512">{0,plural, =1{يجب التحديث في غضون يوم واحد}zero{يجب التحديث في غضون # يوم}two{يجب التحديث في غضون يومين}few{يجب التحديث في غضون # أيام}many{يجب التحديث في غضون # يومًا}other{يجب التحديث في غضون # يوم}}</translation> <translation id="895944840846194039">ذاكرة جافا سكريبت</translation> <translation id="8959810181433034287">سيحتاج المستخدم الذي يخضع للإشراف إلى استخدام كلمة المرور هذه لتسجيل الدخول، لذا يُرجى اختيار كلمة مرور آمنة ولا تنس طرح الأمر للنقاش مع المستخدم الخاضع للإشراف.</translation> <translation id="8962083179518285172">إخفاء التفاصيل</translation>
diff --git a/chrome/app/resources/generated_resources_bg.xtb b/chrome/app/resources/generated_resources_bg.xtb index e8dd12d..a2f6b2f 100644 --- a/chrome/app/resources/generated_resources_bg.xtb +++ b/chrome/app/resources/generated_resources_bg.xtb
@@ -1,6 +1,7 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="bg"> +<translation id="1002469766576243227">Тази услуга за удостоверяване се хоства от <ph name="EXTENSION_NAME" /></translation> <translation id="1003088604756913841">Отваряне на връзката в нов прозорец на <ph name="APP" /></translation> <translation id="1004218526896219317">Достъп до сайтове</translation> <translation id="1005274289863221750">Използване на микрофона и камерата ви</translation> @@ -289,6 +290,7 @@ <translation id="1429300045468813835">Всичко бе изчистено</translation> <translation id="143027896309062157">Четене и промяна на всичките ви данни на компютъра и в посещаваните от вас уебсайтове</translation> <translation id="1430915738399379752">Печат</translation> +<translation id="1431188203598586230">Последна софтуерна актуализация</translation> <translation id="1432581352905426595">Управление на търсещите машини</translation> <translation id="1433811987160647649">Извеждане на запитване преди осъществяване на достъп</translation> <translation id="1434696352799406980">Така ще се нулират началната страница, новият раздел в браузъра, търсещата машина и фиксираните раздели. Освен това ще се деактивират всички разширения и ще се изчистят временните данни, като например „бисквитките“. Отметките, историята и запазените ви пароли няма да бъдат премахнати.</translation> @@ -525,6 +527,7 @@ <translation id="1781771911845953849">Профили и синхронизиране</translation> <translation id="1782196717298160133">Намиране на телефона ви</translation> <translation id="1784849162047402014">Дисковото пространство на устройството е малко</translation> +<translation id="1790194216133135334">Изпращане на връзката до <ph name="DEVICE_NAME" /></translation> <translation id="1792619191750875668">Разширен екран</translation> <translation id="1794791083288629568">Изпращане на отзиви, за да ни помогнете да отстраним този проблем.</translation> <translation id="1795214765651529549">Използване на класическата тема</translation> @@ -587,6 +590,7 @@ <translation id="1875312262568496299">Начало</translation> <translation id="1875387611427697908">Това може да бъде добавено само от <ph name="CHROME_WEB_STORE" /></translation> <translation id="1877520246462554164">Получаването на означение за удостоверяване не бе успешно. Моля, излезте от профила си и влезте отново в него, за да опитате пак.</translation> +<translation id="1877860345998737529">Задаване на действия за превключвателите</translation> <translation id="1879000426787380528">Вход като</translation> <translation id="1880905663253319515">Да се изтрие ли сертификатът „<ph name="CERTIFICATE_NAME" />“?</translation> <translation id="1886996562706621347">Разрешаване на питания от сайтове дали да са манипулаторите по подразбиране за протоколите (препоръчително)</translation> @@ -866,7 +870,9 @@ <translation id="230927227160767054">Тази страница иска да инсталира манипулатор на услуги.</translation> <translation id="2309620859903500144">Достъпът на този сайт до сензорите ви за движение или светлина е блокиран.</translation> <translation id="2315414688463285945">При конфигурирането на файловете за Linux възникна грешка. Моля, опитайте отново.</translation> +<translation id="2315587498123194634">Изпращане на връзката до <ph name="DEVICE_NAME" /></translation> <translation id="2316129865977710310">Не, благодаря</translation> +<translation id="2316739859433277603">За търсенията от стартовия панел с приложения се използва <ph name="BEGIN_LINK" />настройката за търсеща машина<ph name="END_LINK" /> на браузъра.</translation> <translation id="2317842250900878657">Завършено: <ph name="PROGRESS_PERCENT" />%</translation> <translation id="2318143611928805047">Размер на хартията</translation> <translation id="2318817390901984578">За да използвате приложения за Android, заредете и актуализирайте своя <ph name="DEVICE_TYPE" />.</translation> @@ -906,6 +912,7 @@ <translation id="2365507699358342471">Този сайт може да преглежда текста и изображенията, копирани в буферната памет.</translation> <translation id="2367199180085172140">Добавяне на споделяне на файл</translation> <translation id="2367972762794486313">Показване на приложенията</translation> +<translation id="2369105924912929484">Превключване на функцията за извеждане на основното съдържание на страниците</translation> <translation id="2371076942591664043">Отваряне &след изтегляне</translation> <translation id="2375406435414127095">Свързване с телефона ви</translation> <translation id="2377667304966270281">Съществени грешки</translation> @@ -1156,6 +1163,7 @@ <translation id="2739191690716947896">Отстраняване на грешки</translation> <translation id="2739240477418971307">Промяна на настройките ви за достъпност</translation> <translation id="2740393541869613458">да преглеждате уебсайтовете, посетени от контролирания потребител;</translation> +<translation id="2741912629735277980">Показване на ПИ на екрана за вход</translation> <translation id="274290345632688601">Приложенията и файловете за Linux се възстановяват</translation> <translation id="2743387203779672305">Копиране в буферната памет</translation> <translation id="2745080116229976798">Удостоверена субординация от Microsoft</translation> @@ -1272,6 +1280,7 @@ <translation id="2910318910161511225">Свържете се с мрежа и опитайте отново</translation> <translation id="2913331724188855103">Разрешаване на сайтовете да запазват „бисквитки“ и да четат данни от такива (препоръчително)</translation> <translation id="2915102088417824677">Преглед на регистрационния файл за активността</translation> +<translation id="2915873080513663243">Автоматично сканиране</translation> <translation id="2916073183900451334">При натискането на клавиша „Tab“ върху уеб страница се открояват връзките, както и полетата на формулярите</translation> <translation id="2916745397441987255">Търсете в разширенията</translation> <translation id="2921081876747860777">Моля, създайте парола, за да защитите локалните си данни.</translation> @@ -1480,6 +1489,7 @@ <translation id="327147043223061465">Преглед на всички „бисквитки“ и данни за сайтове</translation> <translation id="3271648667212143903"><ph name="ORIGIN" /> иска да се свърже</translation> <translation id="3274763671541996799">Използвате цял екран.</translation> +<translation id="3275778809241512831">Понастоящем вътрешният ви ключ за сигурност не е защитен. Моля, премахнете го от услугите, с които сте го използвали. За да отстраните проблема, нулирайте ключа за сигурност.</translation> <translation id="3275778913554317645">Отваряне като прозорец</translation> <translation id="3278001907972365362">Профилите ви в Google изискват внимание</translation> <translation id="3279230909244266691">Това може да отнеме няколко минути. Виртуалната машина стартира.</translation> @@ -1572,6 +1582,7 @@ <translation id="3412265149091626468">Преминаване към избраното</translation> <translation id="3413122095806433232">Издатели сертифициращи органи: <ph name="LOCATION" /></translation> <translation id="3414952576877147120">Размер:</translation> +<translation id="3420501302812554910">Вътрешният ключ за сигурност трябва да бъде нулиран</translation> <translation id="3421387094817716717">Публичен ключ за алгоритъм, основан на елиптични криви</translation> <translation id="3423463006624419153">На устройствата си <ph name="PHONE_NAME_1" /> и <ph name="PHONE_NAME_2" />:</translation> <translation id="3423858849633684918">Моля, стартирайте отново <ph name="PRODUCT_NAME" /></translation> @@ -1600,6 +1611,7 @@ <translation id="3450157232394774192">Процент на използване в състояние на неактивност</translation> <translation id="3453612417627951340">Нуждае се от упълномощаване</translation> <translation id="3454157711543303649">Активирането завърши</translation> +<translation id="3454213325559396544">Това е последната автоматична актуализация на софтуера и сигурността за устройството <ph name="DEVICE_TYPE" />. За да получавате бъдещи актуализации, надстройте до по-нов модел.</translation> <translation id="345693547134384690">Отваряне на &изображението в нов раздел</translation> <translation id="3457500881955698515">Фирмата или организацията ви изискват това устройство да бъде актуализирано веднага</translation> <translation id="3459509316159669723">Отпечатване</translation> @@ -1758,6 +1770,7 @@ <translation id="3672681487849735243">Открита е фабрична грешка</translation> <translation id="367645871420407123">не попълвайте, ако искате паролата на root да е стандартната от тестовия образ</translation> <translation id="3677657024345889897">Най-тихо</translation> +<translation id="3677911431265050325">Заявка за мобилния сайт</translation> <translation id="3678156199662914018">Разширение: <ph name="EXTENSION_NAME" /></translation> <translation id="3681311097828166361">Благодарим ви за отзива. В момента сте офлайн, така че сигналът ви ще бъде изпратен по-късно.</translation> <translation id="3682824389861648626">Праг на движение</translation> @@ -2143,6 +2156,12 @@ <translation id="4242577469625748426">Настройките за правила не бяха инсталирани успешно на устройството: <ph name="VALIDATION_ERROR" />.</translation> <translation id="4244238649050961491">Намиране на още приложения за писалка</translation> <translation id="424726838611654458">Отваряне винаги в Adobe Reader</translation> +<translation id="4247274662191902962">Данните от сензорите ще се споделят само по време на това VR изживяване. Възможно е сайтът да научи някои неща за вас с помощта на определена информация, като например: +– местоположението ви; +– физически черти, като позиция на очите; +– движения, например походката ви. + +Разрешете достъп на този сайт само ако му имате доверие.</translation> <translation id="4247901771970415646">Не може да се синхронизира с/ъс <ph name="USERNAME" /></translation> <translation id="4249248555939881673">Изчаква се връзка с мрежата...</translation> <translation id="4249373718504745892">Достъпът на тази страница до камерата и микрофона ви е блокиран.</translation> @@ -2205,6 +2224,7 @@ <translation id="4350019051035968019">Това устройство не може да бъде регистрирано в домейна, към който принадлежи профилът ви, защото е означено за управление от друг домейн.</translation> <translation id="4354344420232759511">Посетените от вас сайтове ще се показват тук</translation> <translation id="435527878592612277">Изберете своя снимка</translation> +<translation id="4358313196493694334">Стабилизиране при мястото за кликване</translation> <translation id="4359408040881008151">Инсталирано заради зависимо разширение или съответно разширения.</translation> <translation id="4359717112757026264">Градски пейзажи</translation> <translation id="4361142739114356624">Частният ключ за този клиентски сертификат липсва или е невалиден</translation> @@ -2329,6 +2349,7 @@ <translation id="4558426062282641716">Изисква се разрешение за автоматично стартиране</translation> <translation id="4558491878126948419">Получавайте съвети и актуална информация за <ph name="DEVICE_TYPE" /> и продуктите на Google и споделяйте отзиви. Можете да се отпишете по всяко време.</translation> <translation id="4559617833001311418">Този сайт осъществява достъп до сензорите ви за движение или светлина.</translation> +<translation id="4561098487691395071">Или посочете PPD файла за принтера</translation> <translation id="4562155214028662640">Добавяне на отпечатък</translation> <translation id="4563880231729913339">Пръст 3</translation> <translation id="4565377596337484307">Скриване на паролата</translation> @@ -2573,6 +2594,7 @@ <translation id="494286511941020793">Помощ за конфигурация на прокси сървър</translation> <translation id="4943368462779413526">Футболна топка</translation> <translation id="4943691134276646401">„<ph name="CHROME_EXTENSION_NAME" />“ иска да се свърже със сериен порт</translation> +<translation id="4944310289250773232">Тази услуга за удостоверяване се хоства от <ph name="SAML_DOMAIN" /></translation> <translation id="495170559598752135">Действия</translation> <translation id="4953689047182316270">Реагиране на събития за достъпност</translation> <translation id="4953808748584563296">Стандартен оранжев аватар</translation> @@ -2665,6 +2687,7 @@ <translation id="5094721898978802975">Комуникация със съдействащи директно изпълнявани приложения</translation> <translation id="5097002363526479830">Свързването с мрежата „<ph name="NAME" />“ не бе успешно: <ph name="DETAILS" /></translation> <translation id="5101042277149003567">Отваряне на всички отметки</translation> +<translation id="5101839224773798795">Автоматично кликване при спиране на курсора</translation> <translation id="5108967062857032718">Настройки – Премахване на приложенията за Android</translation> <translation id="5109044022078737958">Мия</translation> <translation id="5111646998522066203">Изход от режим „инкогнито“</translation> @@ -3149,6 +3172,7 @@ <translation id="5852112051279473187">Ами сега! При записването на това устройство нещо се обърка сериозно. Моля, опитайте отново или се свържете с представител на екипа за поддръжка.</translation> <translation id="5852137567692933493">Рестартиране и извършване на Powerwash</translation> <translation id="5854912040170951372">Парче пица</translation> +<translation id="5855643921295613558">0,6 секунди</translation> <translation id="5855773610748894548">Ами сега! Възникна грешка в модула за сигурност.</translation> <translation id="5856721540245522153">Активиране на функциите за отстраняване на грешки</translation> <translation id="5857090052475505287">Нова папка</translation> @@ -3438,6 +3462,7 @@ <translation id="6279183038361895380">Натиснете |<ph name="ACCELERATOR" />|, за да се покаже курсорът</translation> <translation id="6280215091796946657">Влизане с друг профил</translation> <translation id="6280912520669706465">ARC</translation> +<translation id="628352644014831790">4 секунди</translation> <translation id="6285120108426285413">Файлът „<ph name="FILE_NAME" />“ не е често изтеглян и може да е опасен.</translation> <translation id="6285120908535925801">{NUM_PRINTER,plural, =1{Нов принтер в мрежата ви}other{Нови принтери в мрежата ви}}</translation> <translation id="6286708577777130801">Подробности за запазената парола</translation> @@ -3644,6 +3669,7 @@ <translation id="6612358246767739896">Защитено съдържание</translation> <translation id="6613452264606394692">Връщайте се тук бързо, като запазите отметка към тази страница</translation> <translation id="6615455863669487791">Покажете ми</translation> +<translation id="6617100836880592260">Скорост на сканиране: <ph name="SPEED_WITH_UNITS" /></translation> <translation id="6618097958368085618">Запазване въпреки това</translation> <translation id="6619058681307408113">Line Printer Daemon (LPD)</translation> <translation id="661907246513853610">Сайтът може да следи местоположението ви</translation> @@ -4458,6 +4484,7 @@ <translation id="7831491651892296503">Грешка при конфигурирането на мрежата</translation> <translation id="7831754656372780761"><ph name="TAB_TITLE" /> <ph name="EMOJI_MUTING" /></translation> <translation id="7832084384634357321">Краен час</translation> +<translation id="783214144752121388">Блокиране на изпълняването на Flash от сайтове (препоръчително)</translation> <translation id="7833720883933317473">Тук ще се покажат запазените персонализирани думи</translation> <translation id="7835178595033117206">Отметката бе премахната</translation> <translation id="7837776265184002579">Началната ви страница бе променена на <ph name="URL" />.</translation> @@ -4513,6 +4540,7 @@ <translation id="7911118814695487383">Linux</translation> <translation id="7912080627461681647">Паролата ви е променена в сървъра. Моля, излезте от профила си и влезте отново в него.</translation> <translation id="7915471803647590281">Моля, кажете ни какво става, преди да изпратите отзивите.</translation> +<translation id="7919210519031517829"><ph name="DURATION" /> сек</translation> <translation id="792514962475806987">Ниво на мащаба при прикрепен режим:</translation> <translation id="7925247922861151263">Проверката за AAA не бе успешна</translation> <translation id="7925285046818567682">Изчаква се отговор от <ph name="HOST_NAME" />...</translation> @@ -4570,6 +4598,7 @@ <translation id="7987814697832569482">Винаги да се установява връзка през тази VPN</translation> <translation id="798835209536175951">Изпращайте и получавайте SMS съобщения от своя Chromebook. <ph name="LINK_BEGIN" />Научете повече<ph name="LINK_END" /></translation> <translation id="7988355189918024273">Активиране на функциите за достъпност</translation> +<translation id="7991296728590311172">Настройки на „Достъп с превключване“</translation> <translation id="7994702968232966508">Метод с EAP</translation> <translation id="7997826902155442747">Приоритет на процесите</translation> <translation id="7999229196265990314">Създадени бяха следните файлове: @@ -4783,6 +4812,8 @@ <translation id="8308179586020895837">Да се получава запитване, ако <ph name="HOST" /> иска достъп до камерата ви</translation> <translation id="830868413617744215">Бета</translation> <translation id="8309458809024885768">Сертификатът вече съществува</translation> +<translation id="8314381333424235892">Разширението липсва или е деинсталирано</translation> +<translation id="8316618172731049784">Изпращане до <ph name="DEVICE_NAME" /></translation> <translation id="8317671367883557781">Добавяне на мрежова връзка</translation> <translation id="8319414634934645341">Удължена употреба на ключа</translation> <translation id="8320459152843401447">Целият ви екран</translation> @@ -4939,6 +4970,7 @@ <translation id="8588866096426746242">Статистика за потребителския профил</translation> <translation id="8588868914509452556"><ph name="WINDOW_TITLE" /> – предава съдържание във VR към очила</translation> <translation id="8590375307970699841">Настройка за автоматични актуализации</translation> +<translation id="8591783563402255548">1 секунда</translation> <translation id="8592141010104017453">Известията да не се показват въобще</translation> <translation id="8593121833493516339">Изпращане на данни за употребата и диагностиката. Помогнете за подобряването на работата на детето ви с Android, като автоматично изпращате до Google диагностична информация и данни за употребата на устройството и приложенията. Тази информация няма да се използва за идентифициране на детето ви, а ще послужи за подобряване на стабилността на системата и приложенията и др. Някои обобщени данни също така ще подпомогнат приложенията и партньорите на Google, напр. програмистите за Android. Ако настройката „Допълнителна активност в мрежата и приложенията“ е включена за детето ви, тези данни може да се запазват в профила му в Google. <ph name="BEGIN_LINK1" />Научете повече<ph name="END_LINK1" /></translation> <translation id="8594908476761052472">Заснемане на видеоклип</translation> @@ -4968,6 +5000,7 @@ <translation id="8637688295594795546">Налице е системна актуализация. Подготвя се за изтегляне...</translation> <translation id="8639047128869322042">Извършва се проверка за опасен софтуер...</translation> <translation id="8642171459927087831">Означение за достъп</translation> +<translation id="8642900771896232685">2 секунди</translation> <translation id="8642947597466641025">Шрифтът на текста се уголемява</translation> <translation id="8643418457919840804">За да продължите, изберете опция:</translation> <translation id="8644655801811752511">Този ключ за сигурност не може да бъде нулиран. Опитайте да го нулирате веднага след като го поставите.</translation> @@ -5169,6 +5202,7 @@ <translation id="8910222113987937043">Промените във вашите отметки, история, пароли и други настройки повече няма да се синхронизират с профила ви в Google. Съществуващите ви данни обаче ще продължат да се съхраняват в него. Можете да ги управлявате от <ph name="BEGIN_LINK" />Google Табло за управление<ph name="END_LINK" />.</translation> <translation id="8912362522468806198">Профил в Google</translation> <translation id="8912793549644936705">Разтегляне</translation> +<translation id="8912810933860534797">Активиране на автоматичното сканиране</translation> <translation id="891365694296252935">Изпращане на данни за употребата и диагностиката. Понастоящем това устройство автоматично изпраща до Google диагностична информация и данни за употребата на устройството и приложенията. Тази информация няма да се използва за идентифициране на детето ви, а ще послужи за подобряване на стабилността на системата и приложенията и др. Някои обобщени данни също така ще подпомогнат приложенията и партньорите на Google, напр. програмистите за Android. Тази настройка е наложена от собственика. Ако настройката „Допълнителна активност в мрежата и приложенията“ е включена за детето ви, тези данни може да се запазват в профила му в Google. <ph name="BEGIN_LINK1" />Научете повече<ph name="END_LINK1" /></translation> <translation id="8915370057835397490">Предложението се зарежда</translation> <translation id="8916476537757519021">Подрамка в режим „инкогнито“: <ph name="SUBFRAME_SITE" /></translation> @@ -5321,6 +5355,7 @@ <translation id="9153934054460603056">Запазване на самоличността и паролата</translation> <translation id="9154194610265714752">Актуализирано</translation> <translation id="91568222606626347">Създаване на пряк път...</translation> +<translation id="9157096865782046368">0,8 секунди</translation> <translation id="9157697743260533322">Настройването на автоматични актуализации за всички потребители не бе успешно (грешка при стартирането на предстартовия процес: <ph name="ERROR_NUMBER" />)</translation> <translation id="9158715103698450907">Ами сега! При удостоверяването възникна проблем във връзката с мрежата. Моля, проверете я и опитайте отново.</translation> <translation id="916607977885256133">Картина в картината</translation>
diff --git a/chrome/app/resources/generated_resources_bn.xtb b/chrome/app/resources/generated_resources_bn.xtb index 256d0ac..f6d12cc 100644 --- a/chrome/app/resources/generated_resources_bn.xtb +++ b/chrome/app/resources/generated_resources_bn.xtb
@@ -1,6 +1,7 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="bn"> +<translation id="1002469766576243227"><ph name="EXTENSION_NAME" />-এর মাধ্যমে যাচাইকরণ পরিষেবা হোস্ট করা হয়েছে</translation> <translation id="1003088604756913841">নতুন <ph name="APP" /> উইন্ডোতে লিঙ্ক খুলুন</translation> <translation id="1004218526896219317">অ্যাক্সেস করতে পারে এমন সাইট</translation> <translation id="1005274289863221750">আপনার মাইক্রোফোন ও ক্যামেরা ব্যবহার করুন</translation> @@ -289,6 +290,7 @@ <translation id="1429300045468813835">সব মোছা হয়ে গেছে</translation> <translation id="143027896309062157">আপনার কম্পিউটারে সব ডেটা এবং আপনার দেখা ওয়েবসাইটগুলি পড়ুন এবং পরিবর্তন করুন</translation> <translation id="1430915738399379752">প্রিন্ট</translation> +<translation id="1431188203598586230">সফ্টওয়্যার ফাইনাল আপডেট হয়ে গেছে</translation> <translation id="1432581352905426595">সার্চ ইঞ্জিনগুলি পরিচালনা করুন</translation> <translation id="1433811987160647649">অ্যাক্সেস করার আগে জিজ্ঞাসা করুন</translation> <translation id="1434696352799406980">এটি আপনার শুরুর পৃষ্ঠা, নতুন ট্যাব পৃষ্ঠা, সার্চ ইঞ্জিন, এবং পিন হওয়া ট্যাবগুলি আবার সেট করবে। এছাড়াও এটি সব কটি এক্সটেনশন বন্ধ করবে এবং কুকিজের মতো অস্থায়ী ডেটা সাফ করবে। আপনার বুকমার্ক, ইতিহাস এবং সংরক্ষিত পাসওয়ার্ডগুলি সাফ করা হবে না।</translation> @@ -527,6 +529,7 @@ <translation id="1781771911845953849">অ্যাকাউন্ট এবং সিঙ্ক</translation> <translation id="1782196717298160133">আপনার ফোন খোঁজা হচ্ছে</translation> <translation id="1784849162047402014">ডিভাইসে ডিস্কের জায়গা কম আছে</translation> +<translation id="1790194216133135334"><ph name="DEVICE_NAME" />-এ লিঙ্ক পাঠান</translation> <translation id="1792619191750875668">প্রসারিত প্রদর্শন</translation> <translation id="1794791083288629568">এই সমস্যা সমাধানে আমাদের সাহায্য করতে প্রতিবার্তা পাঠান।</translation> <translation id="1795214765651529549">ক্লাসিক ব্যবহার করুন</translation> @@ -589,6 +592,7 @@ <translation id="1875312262568496299">শুরু করুন</translation> <translation id="1875387611427697908">এটি কেবলমাত্র <ph name="CHROME_WEB_STORE" /> থেকেই যোগ করা যেতে পারে</translation> <translation id="1877520246462554164">যাচাইকরণ টোকেন পাওয়া যায়নি। অনুগ্রহ করে সাইন-আউট-এর পরে সাইন-ইন করে আবার চেষ্টা করুন।</translation> +<translation id="1877860345998737529">অ্যাকশনে সুইচ অ্যাসাইন করা</translation> <translation id="1879000426787380528">কোন আইডি দিয়ে সাইন-ইন করবেন</translation> <translation id="1880905663253319515">সার্টিফিকেট মুছবেন "<ph name="CERTIFICATE_NAME" />"?</translation> <translation id="1886996562706621347">সাইটগুলিকে প্রোটোকলের জন্য ডিফল্ট পরিচালক হতে জিজ্ঞাসা করার অনুমতি দেয় (প্রস্তাবিত)</translation> @@ -868,7 +872,9 @@ <translation id="230927227160767054">এই পৃষ্ঠাটি একটি পরিষেবা নিয়ন্ত্রক ইনস্টল করতে চায়৷</translation> <translation id="2309620859903500144">এই সাইটটি আপনার মোশন এবং লাইট সেন্সর অ্যাক্সেস করতে পারবে না।</translation> <translation id="2315414688463285945">Linux ফাইল কনফিগার করতে সমস্যা হচ্ছে। আবার চেষ্টা করুন।</translation> +<translation id="2315587498123194634"><ph name="DEVICE_NAME" />-এ লিঙ্ক পাঠান</translation> <translation id="2316129865977710310">না, ধন্যবাদ</translation> +<translation id="2316739859433277603">অ্যাপ লঞ্চার থেকে সার্চ করার জন্য ব্রাউজারের <ph name="BEGIN_LINK" />সার্চ ইঞ্জিন সেটিংস<ph name="END_LINK" /> ব্যবহার করা হয়।</translation> <translation id="2317842250900878657"><ph name="PROGRESS_PERCENT" />% হয়েছে</translation> <translation id="2318143611928805047">কাগজের আকার</translation> <translation id="2318817390901984578">Android অ্যাপ ব্যবহার করতে, আপনার <ph name="DEVICE_TYPE" /> চার্জ ও আপডেট করতে।</translation> @@ -908,6 +914,7 @@ <translation id="2365507699358342471">এই সাইটটি ক্লিপবোর্ডে কপি করা টেক্সট এবং ছবি দেখতে পায়।</translation> <translation id="2367199180085172140">ফাইল শেয়ার যোগ করুন</translation> <translation id="2367972762794486313">অ্যাপ্লিকেশানগুলি দেখান</translation> +<translation id="2369105924912929484">ডিস্টিল পৃষ্ঠার কন্টেন্ট টগল করুন</translation> <translation id="2371076942591664043">&সম্পন্ন হলে খুলুন</translation> <translation id="2375406435414127095">আপনার ফোন কানেক্ট করুন</translation> <translation id="2377667304966270281">হার্ড ফল্ট</translation> @@ -1159,6 +1166,7 @@ <translation id="2739191690716947896">ডিবাগ</translation> <translation id="2739240477418971307">আপনার ব্যবহারযোগ্যতার সেটিংস পরিবর্তন করুন</translation> <translation id="2740393541869613458">তত্ত্বাবধানে থাকা ব্যবহারকারীর ভিজিট করা ওয়েবসাইটগুলি পর্যালোচনা করুন এবং</translation> +<translation id="2741912629735277980">লগ-ইন স্ক্রিনে UI ডিসপ্লে করুন</translation> <translation id="274290345632688601">Linux অ্যাপ ও ফাইল ফিরিয়ে আনা হচ্ছে</translation> <translation id="2743387203779672305">ক্লিপবোর্ডে কপি করুন</translation> <translation id="2745080116229976798">Microsoft Qualified Subordination</translation> @@ -1275,6 +1283,7 @@ <translation id="2910318910161511225">নেটওয়ার্কে সংযোগ করে আবার চেষ্টা করুন</translation> <translation id="2913331724188855103">সাইটগুলিকে কুকি ডেটা পড়ার এবং সংরক্ষণ করার অনুমতি দিন (প্রস্তাবিত)</translation> <translation id="2915102088417824677">অ্যাক্টিভিটি লগ দেখুন</translation> +<translation id="2915873080513663243">অটো-স্ক্যান</translation> <translation id="2916073183900451334">ওয়েবপেজ হাইলাইট লিংক এবং ফরম ফিল্ডে ট্যাব প্রেস করে</translation> <translation id="2916745397441987255">এক্সটেনশানগুলি খুঁজুন</translation> <translation id="2921081876747860777">আপনার স্থানীয় ডেটা রক্ষা করার জন্য দয়া করে একটি পাসওয়ার্ড তৈরি করুন।</translation> @@ -1483,6 +1492,7 @@ <translation id="327147043223061465">সমস্ত কুকি এবং সাইট ডেটা দেখুন</translation> <translation id="3271648667212143903"><ph name="ORIGIN" /> এদের সঙ্গে সংযুক্ত হতে চায়</translation> <translation id="3274763671541996799">আপনি পূর্ণ পর্দায় দেথতে শুরু করেছেন৷</translation> +<translation id="3275778809241512831">ইন্টার্নাল নিরাপত্তা কী বর্তমানে নিরাপদ নয়। যে পরিষেবাগুলিতে এটি ব্যবহার করেছেন, সেগুলি থেকে সরিয়ে দিন। সমস্যার সমাধান করতে নিরাপত্তা কী রিসেট করুন।</translation> <translation id="3275778913554317645">উইন্ডো হিসাবে খুলুন</translation> <translation id="3278001907972365362">আপনার Google অ্যাকাউন্টের(গুলির) প্রতি নজর দেওয়া দরকার</translation> <translation id="3279230909244266691">এতে কয়েক মিনিট সময় লাগতে পারে। ভার্চুয়াল মেশিন শুরু করা হচ্ছে।</translation> @@ -1572,6 +1582,7 @@ <translation id="3412265149091626468">নির্বাচনে যান</translation> <translation id="3413122095806433232">CA ইস্যুকারীগণ: <ph name="LOCATION" /></translation> <translation id="3414952576877147120">মাপ:</translation> +<translation id="3420501302812554910">ইন্টার্নাল নিরাপত্তা কী রিসেটের প্রয়োজন</translation> <translation id="3421387094817716717">এলিপ্টিক কার্ভ সর্বজনীন কী</translation> <translation id="3423463006624419153">আপনার '<ph name="PHONE_NAME_1" />' এবং '<ph name="PHONE_NAME_2" />' এ:</translation> <translation id="3423858849633684918">দয়া করে <ph name="PRODUCT_NAME" />-কে পুনঃলঞ্চ করুন</translation> @@ -1600,6 +1611,7 @@ <translation id="3450157232394774192">নিষ্ক্রিয় স্থিতির ওকুপেন্সির শতকরা হার</translation> <translation id="3453612417627951340">অনুমোদনের প্রয়োজন</translation> <translation id="3454157711543303649">সক্রিয়করণ সমাপ্ত</translation> +<translation id="3454213325559396544">এই <ph name="DEVICE_TYPE" />-এর জন্য এটি হল সফ্টওয়্যার এবং নিরাপত্তা সংক্রান্ত শেষ অটোমেটিক আপডেট। ভবিষ্যতে আপডেট পেতে আরও কোনও একটি নতুন মডেলে আপগ্রেড করুন।</translation> <translation id="345693547134384690">&ছবি নতুন ট্যাবে খুলুন</translation> <translation id="3457500881955698515">আপনার কোম্পানি বা সংস্থার প্রয়োজন অনুযায়ী আপনাকে এখনই এই ডিভাইস আপডেট করতে হবে</translation> <translation id="3459509316159669723">প্রিন্ট হচ্ছে</translation> @@ -1757,6 +1769,7 @@ <translation id="3672681487849735243">একটি ফ্যাক্টরি ত্রুটি শনাক্ত করা হয়েছে</translation> <translation id="367645871420407123">যদি আপনি ডিফল্ট টেস্ট ইমেজ মানে রুট পাসওয়ার্ড সেট করতে চান তবে খালি ছাড়ুন</translation> <translation id="3677657024345889897">অত্যন্ত কম আওয়াজ</translation> +<translation id="3677911431265050325">মোবাইল সাইটের জন্য অনুরোধ করুন</translation> <translation id="3678156199662914018">এক্সটেনশন: <ph name="EXTENSION_NAME" /></translation> <translation id="3681311097828166361">আপনার প্রতিক্রিয়ার জন্য ধন্যবাদ। আপনি এখন অফলাইনে আছেন, এবং আপনার প্রতিবেদনটি পরে পাঠানো হবে।</translation> <translation id="3682824389861648626">মুভমেন্ট থ্রেশহোল্ড</translation> @@ -2140,6 +2153,12 @@ <translation id="4242577469625748426">ডিভাইসে নীতি সেটিংস ইনস্টল করা যায়নি: <ph name="VALIDATION_ERROR" />৷</translation> <translation id="4244238649050961491">আরও স্টাইলাস স্টাইলাস অ্যাপ খুঁজুন</translation> <translation id="424726838611654458">সর্বদা Adobe Reader এ খুলুন</translation> +<translation id="4247274662191902962">এই ভিআর প্রেজেন্টেশন চলাকালীনই শুধু সেন্সর ডেটা শেয়ার করা হবে। সাইটটি আপনার সম্পর্কে কিছু তথ্য জানতে পারে, যেমন: + - আপনার লোকেশন + - আপনার শারীরিক বৈশিষ্ট্য, যেমন চোখের অবস্থান + - আপনার গতিবিধি, যেমন আপনি কেমন করে হাঁটেন + + অ্যাক্সেসের অনুমতি দেওয়ার আগে সাইটটি বিশ্বস্ত কিনা দেখে নিতে ভুলবেন না।</translation> <translation id="4247901771970415646"><ph name="USERNAME" />-এর সাথে সিঙ্ক করা যাবে না</translation> <translation id="4249248555939881673">নেটওয়ার্ক সংযোগের জন্য অপেক্ষা করা হচ্ছে...</translation> <translation id="4249373718504745892">এই পৃষ্ঠাটিকে আপনার ক্যামেরা এবং মাইক্রোফোন অ্যাক্সেস করা থেকে অবরুদ্ধ করা হয়েছে৷</translation> @@ -2202,6 +2221,7 @@ <translation id="4350019051035968019">এই ডিভাইসটি একটি ভিন্ন ডোমেনের দ্বারা পরিচালনার জন্য চিহ্নিত হওয়ায় আপনার অ্যাকাউন্টটি যে ডোমেনের আওতায় রয়েছে তাতে নথিভুক্ত করা যাবে না৷</translation> <translation id="4354344420232759511">আপনার দেখা সাইটগুলি এখানে দেখানো হবে</translation> <translation id="435527878592612277">আপনার ফটো বেছে নিন</translation> +<translation id="4358313196493694334">ক্লিক লোকেশন স্টেবিলাইজ করুন</translation> <translation id="4359408040881008151">নির্ভরশীল এক্সটেনশন(গুলি) বলে ইনস্টল রয়েছে৷</translation> <translation id="4359717112757026264">শহরের দৃশ্য</translation> <translation id="4361142739114356624">এই ক্লায়েন্ট সার্টিফিকেটের জন্য ব্যক্তিগত কী পাওয়া যাচ্ছে না বা এটি ভুল</translation> @@ -2326,6 +2346,7 @@ <translation id="4558426062282641716">স্বয়ংক্রিয়ভাবে লঞ্চের অনুমতি অনুরোধ করা হয়েছে</translation> <translation id="4558491878126948419">Google প্রোডাক্ট সম্পর্কে পরামর্শ ও আপডেট <ph name="DEVICE_TYPE" /> পান এবং মতামত শেয়ার করুন। যেকোনও সময় আনসাবস্ক্রাইব করুন।</translation> <translation id="4559617833001311418">এই সাইটটি আপনার মোশন এবং লাইট সেন্সর অ্যাক্সেস করছে।</translation> +<translation id="4561098487691395071">অথবা প্রিন্টারের জন্য PPD বেছে নিন</translation> <translation id="4562155214028662640">আঙ্গুলের ছাপ যোগ করুন</translation> <translation id="4563880231729913339">আঙ্গুল ৩</translation> <translation id="4565377596337484307">পাসওয়ার্ড লুকান</translation> @@ -2570,6 +2591,7 @@ <translation id="494286511941020793">প্রক্সি কনফিগারেশন সহায়তা</translation> <translation id="4943368462779413526">ফুটবল</translation> <translation id="4943691134276646401">"<ph name="CHROME_EXTENSION_NAME" />" সিরিয়াল পোর্টে কানেক্ট করতে চাইছে</translation> +<translation id="4944310289250773232"><ph name="SAML_DOMAIN" />-এর মাধ্যমে যাচাইকরণ পরিষেবা হোস্ট করা হয়েছে</translation> <translation id="495170559598752135">ক্রিয়াসমূহ</translation> <translation id="4953689047182316270">ব্যবহারযোগ্যতা সংক্রান্ত ইভেন্টে প্রতিবার্তা দিতে চায়</translation> <translation id="4953808748584563296">ডিফল্ট কমলা রঙের অবতার</translation> @@ -2662,6 +2684,7 @@ <translation id="5094721898978802975">সহযোগী ন্যাটিভ অ্যাপ্লিকেশানগুলির সাথে যোগাযোগ করুন</translation> <translation id="5097002363526479830">'<ph name="NAME" />': <ph name="DETAILS" /> নেটওয়ার্কে সংযোগ করা গেল না </translation> <translation id="5101042277149003567">সব বুকমার্ক খুলুন</translation> +<translation id="5101839224773798795">মাউস কার্সার বন্ধ হয়ে গেলে অটোমেটিক ক্লিক হবে</translation> <translation id="5108967062857032718">সেটিংস - Android অ্যাপ্লিকেশানগুলি সরান</translation> <translation id="5109044022078737958">মিয়া</translation> <translation id="5111646998522066203">ছদ্মবেশী মোড থেকে বেরিয়ে আসুন</translation> @@ -3146,6 +3169,7 @@ <translation id="5852112051279473187">ওহো! এই ডিভাইসটি নথিভুক্তির চেষ্টা করার সময় সত্যই কোনও গোলোযোগ হয়েছিল৷ দয়া করে আবার চেষ্টা করুন৷</translation> <translation id="5852137567692933493">পুনরায় আরম্ভ করুন এবং পাওয়ারওয়াশ করুন</translation> <translation id="5854912040170951372">স্লাইস</translation> +<translation id="5855643921295613558">০.৬ সেকেন্ড</translation> <translation id="5855773610748894548">নিরাপদ মডিউল তৈরি করতে ত্রুটি হয়েছে।</translation> <translation id="5856721540245522153">ডিবাগিং বৈশিষ্ট্যাবলী চালু করুন</translation> <translation id="5857090052475505287">নতুন ফোল্ডার</translation> @@ -3436,6 +3460,7 @@ <translation id="6279183038361895380">আপনার কার্সার দেখাতে |<ph name="ACCELERATOR" />| চাপুন</translation> <translation id="6280215091796946657">অন্য একটি অ্যাকাউন্ট দিয়ে সাইন-ইন করুন</translation> <translation id="6280912520669706465">ARC</translation> +<translation id="628352644014831790">৪ সেকেন্ড</translation> <translation id="6285120108426285413"><ph name="FILE_NAME" /> সাধারণভাবে ডাউনলোড করা হয় না এবং এটি বিপজ্জনক হতে পারে।</translation> <translation id="6285120908535925801">{NUM_PRINTER,plural, =1{আপনার নেটওয়ার্কে নতুন প্রিন্টারটি}one{আপনার নেটওয়ার্কে নতুন প্রিন্টারগুলি}other{আপনার নেটওয়ার্কে নতুন প্রিন্টারগুলি}}</translation> <translation id="6286708577777130801">সংরক্ষিত পাসওয়ার্ডের বিশদ বিবরণ</translation> @@ -3642,6 +3667,7 @@ <translation id="6612358246767739896">সুরক্ষিত কন্টেন্ট</translation> <translation id="6613452264606394692">এই পৃষ্ঠাটি বুকমার্ক করে দ্রুত এখানে ফিরে আসুন</translation> <translation id="6615455863669487791">আমাকে দেখান</translation> +<translation id="6617100836880592260">স্ক্যান করার গতি: <ph name="SPEED_WITH_UNITS" /></translation> <translation id="6618097958368085618">তবুও রাখতে চাই</translation> <translation id="6619058681307408113">লাইন প্রিন্টার ডেমন (LPD)</translation> <translation id="661907246513853610">সাইটটি আপনার লোকেশন ট্র্যাক করতে পারে</translation> @@ -4455,6 +4481,7 @@ <translation id="7831491651892296503">নেটওয়ার্ক কনফিগার করার সময় ত্রুটি</translation> <translation id="7831754656372780761"><ph name="TAB_TITLE" /> <ph name="EMOJI_MUTING" /></translation> <translation id="7832084384634357321">শেষের সময়</translation> +<translation id="783214144752121388">Flash-এর ব্যবহার আটকাতে সাইট ব্লক করুন (সাজেস্ট করা হয়েছে)</translation> <translation id="7833720883933317473">সংরক্ষিত কাস্টম শব্দ এখানে দেখা যাবে</translation> <translation id="7835178595033117206">বুকমার্ক সরানো হয়েছে</translation> <translation id="7837776265184002579">আপনার হোমপেজটি <ph name="URL" />-তে কপি করা হয়েছে।</translation> @@ -4510,6 +4537,7 @@ <translation id="7911118814695487383">Linux</translation> <translation id="7912080627461681647">সার্ভারে আপনার পাসওয়ার্ড পাল্টানো হয়েছে। অনুগ্রহ করে সাইন-আউট করে আবার সাইন-ইন করুন।</translation> <translation id="7915471803647590281">প্রতিক্রিয়াটি প্রেরণের আগে কী ঘটছে তা দয়া করে আমাদের জানান৷ </translation> +<translation id="7919210519031517829"><ph name="DURATION" /> সেকেন্ড</translation> <translation id="792514962475806987">ডক করা জুম লেভেল:</translation> <translation id="7925247922861151263">AAA চেক করা যায়নি</translation> <translation id="7925285046818567682"><ph name="HOST_NAME" />-এর জন্য অপেক্ষা করা হচ্ছে...</translation> @@ -4567,6 +4595,7 @@ <translation id="7987814697832569482">সবসময় এই ভিপিএনের মাধ্যমে কানেক্ট করুন</translation> <translation id="798835209536175951">Chromebook থেকে টেক্সট মেসেজ পাঠান ও পান। <ph name="LINK_BEGIN" />আরও জানুন<ph name="LINK_END" /></translation> <translation id="7988355189918024273">ব্যবহারযোগ্যতার বৈশিষ্ট্যগুলি চালু করুন</translation> +<translation id="7991296728590311172">সুইচ অ্যাক্সেস সেটিংস</translation> <translation id="7994702968232966508">EAP পদ্ধতি</translation> <translation id="7997826902155442747">প্রক্রিয়ার অগ্রাধিকার</translation> <translation id="7999229196265990314">নিম্নোক্ত ফাইলগুলি তৈরি হয়েছে: @@ -4779,6 +4808,8 @@ <translation id="8308179586020895837"><ph name="HOST" /> আপনার ক্যামেরা অ্যাক্সেস করতে চায় কিনা জিজ্ঞাসা করুন</translation> <translation id="830868413617744215">বিটা</translation> <translation id="8309458809024885768">সার্টিফিকেট ইতিমধ্যে বিদ্যমান</translation> +<translation id="8314381333424235892">আনইনস্টল অথবা অনুপস্থিত এক্সটেনশন</translation> +<translation id="8316618172731049784"><ph name="DEVICE_NAME" />-এ পাঠান</translation> <translation id="8317671367883557781">নেটওয়ার্ক সংযোগ যোগ করুন</translation> <translation id="8319414634934645341">প্রসারিত কী ব্যবহার</translation> <translation id="8320459152843401447">আপনার সম্পূর্ণ স্ক্রিন</translation> @@ -4936,6 +4967,7 @@ <translation id="8588866096426746242">প্রোফাইল পরিসংখ্যান দেখান</translation> <translation id="8588868914509452556"><ph name="WINDOW_TITLE" /> - হেডসেটে ভিআর (VR) কন্টেন্ট দেখানো হচ্ছে</translation> <translation id="8590375307970699841">স্বয়ংক্রিয় আপডেটগুলো সেটআপ করুন</translation> +<translation id="8591783563402255548">১ সেকেন্ড</translation> <translation id="8592141010104017453">কোনও বিজ্ঞপ্তি দেখতে চাই না</translation> <translation id="8593121833493516339">ব্যবহার এবং ডায়াগনস্টিক ডেটা পাঠান। Google-এ নিজে থেকে ডায়াগনস্টিক, ডিভাইস এবং অ্যাপ ব্যবহারের ডেটা পাঠিয়ে, আপনার সন্তানের Android অভিজ্ঞতাকে উন্নত করতে সাহায্য করুন। এটি আপনার সন্তানকে শনাক্ত করতে ব্যবহার করা হবে না এবং সিস্টেম ও অ্যাপের স্থিতিশীলতা এবং অন্যান্য উন্নতিতে সাহায্য করবে। ব্যবহারকারীদের কিছু সম্মিলিত ডেটা Google অ্যাপ এবং Android ডেভেলপারদের মতো পার্টনারদের কাজে লাগবে। অতিরিক্ত ওয়েব ও অ্যাপ অ্যাক্টিভিটি সেটিংটি আপনার সন্তানের ডিভাইসের জন্য চালু করা থাকলে, এই ডেটা তাদের Google অ্যাকাউন্টে সেভ করা হতে পারে। <ph name="BEGIN_LINK1" />আরও জানুন<ph name="END_LINK1" /></translation> <translation id="8594908476761052472">ভিডিও ক্যাপচার করুন</translation> @@ -4965,6 +4997,7 @@ <translation id="8637688295594795546">সিস্টেম আপডেট উপলভ্য৷ ডাউনলোড করতে প্রস্তুত হচ্ছে...</translation> <translation id="8639047128869322042">ক্ষতিকর সফ্টওয়্যার খোঁজা হচ্ছে...</translation> <translation id="8642171459927087831">অ্যাক্সেস টোকেন</translation> +<translation id="8642900771896232685">২ সেকেন্ড</translation> <translation id="8642947597466641025">পাঠ্যকে আরও বড় করুন</translation> <translation id="8643418457919840804">চালিয়ে যেতে, একটি বিকল্প বেছে নিন:</translation> <translation id="8644655801811752511">এই নিরাপত্তা কী রিসেট করা যাবে না। কী লেখার পরেই সেটি রিসেট করার চেষ্টা করুন।</translation> @@ -5166,6 +5199,7 @@ <translation id="8910222113987937043">আপনার বুকমার্ক, ইতিহাস, পাসওয়ার্ড এবং অন্যান্য সেটিংসের পরিবর্তনগুলি এখন আর আপনার Google অ্যাকাউন্টের সাথে সিঙ্ক করা হবে না। তবে, আপনার বর্তমান ডেটা আপনার Google অ্যাকাউন্টে সঞ্চিত থাকবে এবং <ph name="BEGIN_LINK" />Google ড্যাশবোর্ড<ph name="END_LINK" /> থেকে ম্যানেজ করা যাবে।</translation> <translation id="8912362522468806198">Google অ্যাকাউন্ট</translation> <translation id="8912793549644936705">বিস্তার</translation> +<translation id="8912810933860534797">অটো-স্ক্যান চালু করুন</translation> <translation id="891365694296252935">ব্যবহার এবং ডায়াগনস্টিক ডেটা পাঠান। এখন এই ডিভাইসটি নিজে থেকেই Google-এ ডায়াগনিস্টিক, ডিভাইস এবং অ্যাপ ব্যবহারের ডেটা পাঠাচ্ছে। এটি আপনার সন্তানকে শনাক্ত করতে ব্যবহার করা হবে না এবং সিস্টেম ও অ্যাপের স্থিতিশীলতা এবং অন্যান্য উন্নতিতে সাহায্য করবে। ব্যবহারকারীদের কিছু সম্মিলিত ডেটা Google অ্যাপ এবং Android ডেভেলপারদের মতো পার্টনারদের কাজে লাগবে। এই সেটিং মালিকের নিয়ন্ত্রণে রয়েছে। অতিরিক্ত ওয়েব ও অ্যাপ অ্যাক্টিভিটি সেটিংটি আপনার সন্তানের ডিভাইসের জন্য চালু করা থাকলে, এই ডেটা তাদের Google অ্যাকাউন্টে সেভ করা হতে পারে। <ph name="BEGIN_LINK1" />আরও জানুন<ph name="END_LINK1" /></translation> <translation id="8915370057835397490">লোড করার প্রস্তাব</translation> <translation id="8916476537757519021">ছদ্মবেশী সাবফ্রেম: <ph name="SUBFRAME_SITE" /></translation> @@ -5318,6 +5352,7 @@ <translation id="9153934054460603056">পরিচয় এবং পাসওয়ার্ড সেভ করুন</translation> <translation id="9154194610265714752">আপডেট রয়েছে</translation> <translation id="91568222606626347">শর্টকাট তৈরি করুন...</translation> +<translation id="9157096865782046368">০.৮ সেকেন্ড</translation> <translation id="9157697743260533322">সকল ব্যবহারকারীর জন্য স্বয়ংক্রিয় আপডেট সেট-আপ পারেনি (প্রিফ্লাইট লঞ্চ ত্রুটি: <ph name="ERROR_NUMBER" />)</translation> <translation id="9158715103698450907">ওহো! যাচাইকরণের সময় একটি নেটওয়ার্ক যোগাযোগ সমস্যা ঘটেছে৷ অনুগ্রহ করে আপনার নেটওয়ার্ক সংযোগ পরীক্ষা করুন এবং আবার চেষ্টা করুন৷</translation> <translation id="916607977885256133">ছবির-মধ্যে-ছবি</translation>
diff --git a/chrome/app/resources/generated_resources_ca.xtb b/chrome/app/resources/generated_resources_ca.xtb index 43ae2d3..c430304 100644 --- a/chrome/app/resources/generated_resources_ca.xtb +++ b/chrome/app/resources/generated_resources_ca.xtb
@@ -1,6 +1,7 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="ca"> +<translation id="1002469766576243227">Aquest servei d'autenticació s'allotja a <ph name="EXTENSION_NAME" /></translation> <translation id="1003088604756913841">Obre l'enllaç en una nova finestra de l'aplicació <ph name="APP" /></translation> <translation id="1004218526896219317">Accés al lloc web</translation> <translation id="1005274289863221750">Utilitzar el micròfon i la càmera</translation> @@ -34,7 +35,7 @@ <translation id="1039337018183941703">Fitxer no vàlid o malmès</translation> <translation id="1041175011127912238">Aquesta pàgina no respon</translation> <translation id="1042174272890264476">L'ordinador també incorpora la biblioteca RLZ de <ph name="SHORT_PRODUCT_NAME" />. La biblioteca RLZ assigna una etiqueta no única i sense identificació personal per mesurar les cerques i l'ús de <ph name="SHORT_PRODUCT_NAME" /> derivats d'una campanya promocional concreta. De vegades, aquestes etiquetes apareixen a les consultes de la Cerca de Google a <ph name="PRODUCT_NAME" />.</translation> -<translation id="1045692658517323508">{0,plural, =1{Actualitza el dispositiu en un termini d'1 minut}other{Actualitza el dispositiu en un termini de # minuts}}</translation> +<translation id="1045692658517323508">{0,plural, =1{Actualitza el dispositiu en 1 minut}other{Actualitza el dispositiu en # minuts}}</translation> <translation id="1046059554679513793">Aquest nom ja s'està utilitzant.</translation> <translation id="1046635659603195359">Sembla que ja has configurat Voice Match amb l'Assistent de Google en un altre dispositiu. Aquestes gravacions anteriors es poden utilitzar per crear un model de veu en aquest dispositiu. Aquest procés hauria de tardar menys d'un minut.</translation> <translation id="1047431265488717055">Copia el te&xt de l'enllaç</translation> @@ -289,6 +290,7 @@ <translation id="1429300045468813835">S'han esborrat totes</translation> <translation id="143027896309062157">Llegir i canviar totes les dades de l'ordinador i els llocs web que es visitin</translation> <translation id="1430915738399379752">Imprimeix</translation> +<translation id="1431188203598586230">Última actualització de programari</translation> <translation id="1432581352905426595">Gestiona els motors de cerca</translation> <translation id="1433811987160647649">Pregunta abans d'accedir</translation> <translation id="1434696352799406980">Aquesta funció restablirà la pàgina d'inici, la pàgina Pestanya nova, el motor de cerca i les pestanyes fixades que tingueu configurades. També desactivarà totes les extensions i esborrarà les dades temporals, com ara les galetes. Les adreces d'interès, l'historial i les contrasenyes desades no s'esborraran.</translation> @@ -528,6 +530,7 @@ <translation id="1781771911845953849">Comptes i sincronització</translation> <translation id="1782196717298160133">S'està cercant el telèfon</translation> <translation id="1784849162047402014">Queda poc espai al disc del dispositiu</translation> +<translation id="1790194216133135334">Envia l'enllaç a <ph name="DEVICE_NAME" /></translation> <translation id="1792619191750875668">Pantalla ampliada</translation> <translation id="1794791083288629568">Envia suggeriments per ajudar-nos a solucionar el problema.</translation> <translation id="1795214765651529549">Utilitza el tema clàssic</translation> @@ -590,6 +593,7 @@ <translation id="1875312262568496299">Comença</translation> <translation id="1875387611427697908">Només pot afegir-se des de <ph name="CHROME_WEB_STORE" /></translation> <translation id="1877520246462554164">No s'ha pogut obtenir el testimoni d'autenticació. Tanca la sessió i torna-la a iniciar per tornar-ho a provar.</translation> +<translation id="1877860345998737529">Assignació d'accions a interruptors</translation> <translation id="1879000426787380528">Inicia la sessió com a</translation> <translation id="1880905663253319515">Voleu suprimir el certificat "<ph name="CERTIFICATE_NAME" />"?</translation> <translation id="1886996562706621347">Permet que els llocs web sol·licitin esdevenir gestors predeterminats de protocols (opció recomanada)</translation> @@ -869,7 +873,9 @@ <translation id="230927227160767054">Aquesta pàgina vol instal·lar un gestor de serveis.</translation> <translation id="2309620859903500144">Aquest lloc web no té permís per accedir als sensors de llum o moviment.</translation> <translation id="2315414688463285945">S'ha produït un error en configurar els fitxers de Linux. Torna-ho a provar.</translation> +<translation id="2315587498123194634">Envia l'enllaç a <ph name="DEVICE_NAME" /></translation> <translation id="2316129865977710310">No, gràcies</translation> +<translation id="2316739859433277603">Per fer cerques des del menú d'aplicacions es fa servir la <ph name="BEGIN_LINK" />configuració del motor de cerca<ph name="END_LINK" /> del navegador.</translation> <translation id="2317842250900878657"><ph name="PROGRESS_PERCENT" />% complet</translation> <translation id="2318143611928805047">Mida del paper</translation> <translation id="2318817390901984578">Per utilitzar les aplicacions d'Android, canvia i actualitza el dispositiu <ph name="DEVICE_TYPE" />.</translation> @@ -909,6 +915,7 @@ <translation id="2365507699358342471">Aquest lloc web pot veure el text i les imatges copiats al porta-retalls.</translation> <translation id="2367199180085172140">Afegeix un nou ús compartit de fitxers</translation> <translation id="2367972762794486313">Mostra les aplicacions</translation> +<translation id="2369105924912929484">Commuta el contingut sintetitzat de la pàgina</translation> <translation id="2371076942591664043">Obre quan &acabi</translation> <translation id="2375406435414127095">Connecta't al telèfon</translation> <translation id="2377667304966270281">Errors greus</translation> @@ -1113,7 +1120,7 @@ <translation id="2677748264148917807">Surt</translation> <translation id="2678063897982469759">Torna a activar</translation> <translation id="268053382412112343">Hi&storial</translation> -<translation id="2682374361574804119">{0,plural, =1{Actualitza el dispositiu en un termini d'1 hora}other{Actualitza el dispositiu en un termini de # hores}}</translation> +<translation id="2682374361574804119">{0,plural, =1{Actualitza el dispositiu en 1 hora}other{Actualitza el dispositiu en # hores}}</translation> <translation id="2682498795777673382">El pare o la mare han introduït un canvi</translation> <translation id="2683638487103917598">Carpeta ordenada</translation> <translation id="2684004000387153598">Per continuar, fes clic a D'acord i, a continuació, a Afegeix una persona per crear un perfil per a la teva adreça electrònica.</translation> @@ -1157,6 +1164,7 @@ <translation id="2739191690716947896">Depura</translation> <translation id="2739240477418971307">Canvia la configuració d'accessibilitat</translation> <translation id="2740393541869613458">revisa els llocs web que l'usuari supervisat ha visitat i</translation> +<translation id="2741912629735277980">Mostra la IU a la pàgina d'inici de sessió</translation> <translation id="274290345632688601">S'estan restaurant els fitxers i les aplicacions de Linux</translation> <translation id="2743387203779672305">Copia al porta-retalls</translation> <translation id="2745080116229976798">Subordinació qualificada de Microsoft</translation> @@ -1273,6 +1281,7 @@ <translation id="2910318910161511225">Connecta't a una xarxa i torna-ho a provar</translation> <translation id="2913331724188855103">Permet que els llocs web desin i llegeixin les dades de les galetes (opció recomanada)</translation> <translation id="2915102088417824677">Mostra el registre d'activitat</translation> +<translation id="2915873080513663243">Cerca automàtica</translation> <translation id="2916073183900451334">En prémer la tecla de tabulació en una pàgina web, es ressalten els enllaços i els camps de formulari</translation> <translation id="2916745397441987255">Cerca extensions</translation> <translation id="2921081876747860777">Crea una contrasenya per protegir les teves dades locals.</translation> @@ -1479,6 +1488,7 @@ <translation id="327147043223061465">Mostra totes les galetes i les dades del lloc web</translation> <translation id="3271648667212143903"><ph name="ORIGIN" /> es vol connectar</translation> <translation id="3274763671541996799">Heu activat el mode de pantalla completa.</translation> +<translation id="3275778809241512831">En aquests moments la clau de seguretat interna no és segura. Suprimeix-la dels serveis en què l'hagis fet servir. Per resoldre aquest problema, restableix la clau de seguretat.</translation> <translation id="3275778913554317645">Obre com a finestra</translation> <translation id="3278001907972365362">Els teus Comptes de Google requereixen atenció</translation> <translation id="3279230909244266691">Aquest procés pot tardar uns quants minuts. S'està iniciant la màquina virtual.</translation> @@ -1570,6 +1580,7 @@ <translation id="3412265149091626468">Ves directament a la selecció</translation> <translation id="3413122095806433232">Emissors de CA: <ph name="LOCATION" /></translation> <translation id="3414952576877147120">Mida:</translation> +<translation id="3420501302812554910">Cal restablir la clau de seguretat interna</translation> <translation id="3421387094817716717">Clau pública de la corba el·líptica</translation> <translation id="3423463006624419153">A <ph name="PHONE_NAME_1" /> i <ph name="PHONE_NAME_2" />:</translation> <translation id="3423858849633684918">Torneu a iniciar <ph name="PRODUCT_NAME" /></translation> @@ -1598,6 +1609,7 @@ <translation id="3450157232394774192">Percentatge d'ocupació de l'estat d'inactivitat</translation> <translation id="3453612417627951340">Necessita una autorització.</translation> <translation id="3454157711543303649">S'ha completat l'activació</translation> +<translation id="3454213325559396544">Aquesta actualització de programari i seguretat és l'última que rebràs per a aquest dispositiu de tipus <ph name="DEVICE_TYPE" />. Per obtenir actualitzacions en el futur, canvia el dispositiu per un model més nou.</translation> <translation id="345693547134384690">Obre la &imatge en una pestanya nova</translation> <translation id="3457500881955698515">La teva empresa o organització requereix que s'actualitzi immediatament aquest dispositiu</translation> <translation id="3459509316159669723">Imprimeix</translation> @@ -1756,11 +1768,12 @@ <translation id="3672681487849735243">S'ha detectat un error de fàbrica</translation> <translation id="367645871420407123">deixeu-ho en blanc si voleu establir el valor predeterminat de la imatge de prova com a contrasenya arrel</translation> <translation id="3677657024345889897">Volum mínim</translation> +<translation id="3677911431265050325">Sol·licita el lloc web per a mòbils</translation> <translation id="3678156199662914018">Extensió: <ph name="EXTENSION_NAME" /></translation> <translation id="3681311097828166361">Gràcies pels teus suggeriments. Ara mateix no tens connexió, de manera que el teu informe s'enviarà més tard.</translation> <translation id="3682824389861648626">Llindar de moviment</translation> <translation id="3683023058278427253">Hem detectat diversos tipus de llicències per al teu domini. Tria'n un per continuar.</translation> -<translation id="3683524264665795342">Sol·licitud de <ph name="APP_NAME" /> per compartir la pantalla</translation> +<translation id="3683524264665795342">Sol·licitud de compartició de pantalla de <ph name="APP_NAME" /></translation> <translation id="368789413795732264">S'ha produït un error quan s'intentava escriure el fitxer: <ph name="ERROR_TEXT" /></translation> <translation id="3688507211863392146">Escriure en fitxers i carpetes que s'obrin a l'aplicació</translation> <translation id="3688526734140524629">Canvia el canal</translation> @@ -2139,6 +2152,12 @@ <translation id="4242577469625748426">No s'ha pogut instal·lar la configuració de la política al dispositiu: <ph name="VALIDATION_ERROR" />.</translation> <translation id="4244238649050961491">Cerca més aplicacions de llapis òptic</translation> <translation id="424726838611654458">Obre sempre a Adobe Reader</translation> +<translation id="4247274662191902962">Les dades del sensor només es podran compartir mentre duri l'experiència de RV. Pot ser que el lloc web aprengui coses sobre tu a partir de certa informació, per exemple: + - la teva ubicació + - els teus trets físics, com ara la posició dels ulls + - els teus moviments, com ara la manera de caminar + + Assegura't que confies en aquest lloc web abans de donar-li accés.</translation> <translation id="4247901771970415646">No es pot sincronitzar amb <ph name="USERNAME" /></translation> <translation id="4249248555939881673">S'està esperant la connexió de xarxa...</translation> <translation id="4249373718504745892">S'ha bloquejat l'accés d'aquesta pàgina a la càmera i al micròfon</translation> @@ -2201,6 +2220,7 @@ <translation id="4350019051035968019">No es pot inscriure aquest dispositiu al domini del vostre compte perquè s'ha indicat que el dispositiu es gestiona en un altre domini.</translation> <translation id="4354344420232759511">Els llocs web que visitis es mostraran aquí</translation> <translation id="435527878592612277">Selecciona la teva foto</translation> +<translation id="4358313196493694334">Estabilitza la ubicació del clic</translation> <translation id="4359408040881008151">S'ha instal·lat perquè té extensions que en depenen.</translation> <translation id="4359717112757026264">Paisatge urbà</translation> <translation id="4361142739114356624">Falta la clau privada d'aquest certificat del client o no és vàlida</translation> @@ -2325,6 +2345,7 @@ <translation id="4558426062282641716">S'ha sol·licitat permís per iniciar-se automàticament</translation> <translation id="4558491878126948419">Obtén consells sobre el dispositiu <ph name="DEVICE_TYPE" /> i informació sobre productes de Google, i comparteix suggeriments. Pots cancel·lar la subscripció en qualsevol moment.</translation> <translation id="4559617833001311418">Aquest lloc web està accedint als teus sensors de llum i moviment.</translation> +<translation id="4561098487691395071">També pots especificar el fitxer PPD de la teva impressora</translation> <translation id="4562155214028662640">Afegeix una empremta digital</translation> <translation id="4563880231729913339">Dit 3</translation> <translation id="4565377596337484307">Oculta la contrasenya</translation> @@ -2569,6 +2590,7 @@ <translation id="494286511941020793">Ajuda per configurar servidors intermediaris</translation> <translation id="4943368462779413526">Pilota de futbol americà</translation> <translation id="4943691134276646401">"<ph name="CHROME_EXTENSION_NAME" />" vol connectar-se a un port en sèrie</translation> +<translation id="4944310289250773232">Aquest servei d'autenticació s'allotja a <ph name="SAML_DOMAIN" /></translation> <translation id="495170559598752135">Accions</translation> <translation id="4953689047182316270">Respondre als esdeveniments d'accessibilitat</translation> <translation id="4953808748584563296">Avatar taronja predeterminat</translation> @@ -2587,7 +2609,7 @@ <translation id="4973307593867026061">Afegeix impressores</translation> <translation id="4973325300212422370">{NUM_TABS,plural, =1{Silencia el lloc web}other{Silencia els llocs web}}</translation> <translation id="4974733135013075877">Surt i estableix el bloqueig infantil</translation> -<translation id="4976795213394241669">{0,plural, =0{Actualitza ara el dispositiu}=1{Actualitza el dispositiu en un termini d'1 segon}other{Actualitza el dispositiu en un termini de # segons}}</translation> +<translation id="4976795213394241669">{0,plural, =0{Actualitza ara el dispositiu}=1{Actualitza el dispositiu en 1 segon}other{Actualitza el dispositiu en # segons}}</translation> <translation id="4977942889532008999">Confirmació de l'accés</translation> <translation id="4980805016576257426">Aquesta extensió conté programari maliciós.</translation> <translation id="4981449534399733132">Per esborrar les dades de navegació de tots els dispositius sincronitzats i del Compte de Google, <ph name="BEGIN_LINK" />inicia la sessió<ph name="END_LINK" />.</translation> @@ -2661,6 +2683,7 @@ <translation id="5094721898978802975">Comunicació amb aplicacions natives cooperatives</translation> <translation id="5097002363526479830">S'ha produït un error en connectar amb la xarxa "<ph name="NAME" />": <ph name="DETAILS" /></translation> <translation id="5101042277149003567">Obre totes les adreces d'interès</translation> +<translation id="5101839224773798795">Fes clic automàticament quan el cursor s'aturi</translation> <translation id="5108967062857032718">Configuració: suprimeix les aplicacions per a Android</translation> <translation id="5109044022078737958">Atleta</translation> <translation id="5111646998522066203">Surt del mode d'incògnit</translation> @@ -3146,6 +3169,7 @@ <translation id="5852112051279473187">Vaja! Ha fallat alguna cosa en inscriure aquest dispositiu. Torneu-ho a provar o contacteu amb el vostre representant d'assistència.</translation> <translation id="5852137567692933493">Reinicia i utilitza Powerwash</translation> <translation id="5854912040170951372">Pizza</translation> +<translation id="5855643921295613558">0,6 segons</translation> <translation id="5855773610748894548">S'ha produït un error en el mòdul de seguretat.</translation> <translation id="5856721540245522153">Activar les funcions de depuració</translation> <translation id="5857090052475505287">Carpeta nova</translation> @@ -3435,6 +3459,7 @@ <translation id="6279183038361895380">Premeu |<ph name="ACCELERATOR" />| per veure el cursor</translation> <translation id="6280215091796946657">Inicia la sessió amb un altre compte</translation> <translation id="6280912520669706465">ARC</translation> +<translation id="628352644014831790">4 segons</translation> <translation id="6285120108426285413"><ph name="FILE_NAME" /> no se sol baixar i podria ser perillós.</translation> <translation id="6285120908535925801">{NUM_PRINTER,plural, =1{Impressora nova a la xarxa}other{Impressores noves a la xarxa}}</translation> <translation id="6286708577777130801">Detalls de la contrasenya desada</translation> @@ -3641,6 +3666,7 @@ <translation id="6612358246767739896">Contingut protegit</translation> <translation id="6613452264606394692">Afegeix aquesta pàgina a les adreces d'interès per poder-hi tornar ràpidament</translation> <translation id="6615455863669487791">Mostra-m'ho</translation> +<translation id="6617100836880592260">Velocitat de cerca: <ph name="SPEED_WITH_UNITS" /></translation> <translation id="6618097958368085618">Desa de totes maneres</translation> <translation id="6619058681307408113">Protocol Line Printer Daemon (LPD)</translation> <translation id="661907246513853610">El lloc web pot fer un seguiment de la teva ubicació</translation> @@ -4453,6 +4479,7 @@ <translation id="7831491651892296503">S'ha produït un error en configurar la xarxa</translation> <translation id="7831754656372780761"><ph name="TAB_TITLE" /> <ph name="EMOJI_MUTING" /></translation> <translation id="7832084384634357321">Hora de finalització</translation> +<translation id="783214144752121388">Impedeix que els llocs web executin Flash (opció recomanada)</translation> <translation id="7833720883933317473">Les paraules personalitzades desades es mostraran aquí</translation> <translation id="7835178595033117206">L'adreça d'interès s'ha suprimit</translation> <translation id="7837776265184002579">La pàgina d'inici ha canviat a <ph name="URL" />.</translation> @@ -4508,6 +4535,7 @@ <translation id="7911118814695487383">Linux</translation> <translation id="7912080627461681647">La contrasenya s'ha canviat al servidor. Tanca la sessió i torna-la a iniciar.</translation> <translation id="7915471803647590281">Indica'ns el problema abans d'enviar els comentaris.</translation> +<translation id="7919210519031517829"><ph name="DURATION" /> s</translation> <translation id="792514962475806987">Nivell de zoom acoblat:</translation> <translation id="7925247922861151263">Error en la comprovació d'AAA</translation> <translation id="7925285046818567682">Esperant <ph name="HOST_NAME" />...</translation> @@ -4565,6 +4593,7 @@ <translation id="7987814697832569482">Connecta't sempre a través d'aquesta VPN</translation> <translation id="798835209536175951">Envia i rep missatges de text amb Chromebook. <ph name="LINK_BEGIN" />Més informació<ph name="LINK_END" /></translation> <translation id="7988355189918024273">Activa les funcions d'accessibilitat</translation> +<translation id="7991296728590311172">Configuració d'accés amb interruptors</translation> <translation id="7994702968232966508">Mètode EAP</translation> <translation id="7997826902155442747">Prioritat del procés</translation> <translation id="7999229196265990314">S'han creat els fitxers següents: @@ -4777,6 +4806,8 @@ <translation id="8308179586020895837">Pregunta si <ph name="HOST" /> vol accedir a la càmera</translation> <translation id="830868413617744215">Beta</translation> <translation id="8309458809024885768">El certificat ja existeix</translation> +<translation id="8314381333424235892">Falta una extensió o està desinstal·lada</translation> +<translation id="8316618172731049784">Envia a <ph name="DEVICE_NAME" /></translation> <translation id="8317671367883557781">Afegeix una connexió de xarxa</translation> <translation id="8319414634934645341">Ús ampliat de claus</translation> <translation id="8320459152843401447">La pantalla completa</translation> @@ -4933,6 +4964,7 @@ <translation id="8588866096426746242">Mostra les estadístiques del perfil</translation> <translation id="8588868914509452556"><ph name="WINDOW_TITLE" />: està mostrant contingut de realitat virtual en un visor</translation> <translation id="8590375307970699841">Configurar actualitzacions automàtiques</translation> +<translation id="8591783563402255548">1 segon</translation> <translation id="8592141010104017453">No mostris cap notificació</translation> <translation id="8593121833493516339">Envia dades d'ús i de diagnòstic. Ajuda a millorar l'experiència a Android del teu fill enviant automàticament a Google dades de diagnòstic, del dispositiu i d'ús d'aplicacions. Aquestes dades no es faran servir per identificar el teu fill i ajudaran a millorar l'estabilitat del sistema i de les aplicacions, entre altres característiques. Una part de les dades agregades també serà útil per a les aplicacions i els col·laboradors de Google, com ara els desenvolupadors d'Android. Si l'opció Activitat al web i en aplicacions addicional està activada per al teu fill, és possible que aquestes dades es desin al seu Compte de Google. <ph name="BEGIN_LINK1" />Més informació<ph name="END_LINK1" /></translation> <translation id="8594908476761052472">Captura un vídeo</translation> @@ -4962,6 +4994,7 @@ <translation id="8637688295594795546">Actualització del sistema disponible. S'està preparant la baixada…</translation> <translation id="8639047128869322042">S'està cercant programari nociu...</translation> <translation id="8642171459927087831">Testimoni d'accés</translation> +<translation id="8642900771896232685">2 segons</translation> <translation id="8642947597466641025">Fa el text més gran</translation> <translation id="8643418457919840804">Per continuar, tria una opció:</translation> <translation id="8644655801811752511">Aquesta clau de seguretat no es pot restablir. Prova de restablir la clau immediatament després d'inserir-la.</translation> @@ -5163,6 +5196,7 @@ <translation id="8910222113987937043">Els canvis que es facin a les adreces d'interès, l'historial, les contrasenyes i altres opcions de configuració es deixaran de sincronitzar amb el Compte de Google. No obstant això, les dades actuals hi continuaran emmagatzemades i es podran gestionar al <ph name="BEGIN_LINK" />Tauler de control de Google<ph name="END_LINK" />.</translation> <translation id="8912362522468806198">Compte de Google</translation> <translation id="8912793549644936705">Amplia</translation> +<translation id="8912810933860534797">Activa la cerca automàtica</translation> <translation id="891365694296252935">Envia dades d'ús i de diagnòstic. En aquests moments aquest dispositiu envia automàticament a Google dades de diagnòstic, del dispositiu i d''ús d'aplicacions. Aquestes dades no es faran servir per identificar el teu fill i ajudaran a millorar l'estabilitat del sistema i de les aplicacions, entre altres característiques. Una part de les dades agregades també serà útil per a les aplicacions i els col·laboradors de Google, com ara els desenvolupadors d'Android. El propietari ha aplicat aquesta opció de configuració. Si l'opció Activitat al web i en aplicacions addicional està activada per al teu fill, és possible que aquestes dades es desin al seu Compte de Google. <ph name="BEGIN_LINK1" />Més informació<ph name="END_LINK1" /></translation> <translation id="8915370057835397490">S'estan carregant els suggeriments</translation> <translation id="8916476537757519021">Submarc d'incògnit: <ph name="SUBFRAME_SITE" /></translation> @@ -5187,7 +5221,7 @@ <translation id="8948939328578167195"><ph name="WEBSITE" /> vol veure la marca i el model de la clau de seguretat</translation> <translation id="8951256747718668828">La restauració no s'ha pogut completar a causa d'un error</translation> <translation id="895347679606913382">S'està iniciant...</translation> -<translation id="8956941634583033512">{0,plural, =1{Actualitza el dispositiu en un termini d'1 dia}other{Actualitza el dispositiu en un termini de # dies}}</translation> +<translation id="8956941634583033512">{0,plural, =1{Actualitza el dispositiu en 1 dia}other{Actualitza el dispositiu en # dies}}</translation> <translation id="895944840846194039">Memòria de JavaScript</translation> <translation id="8959810181433034287">L'usuari supervisat haurà de fer servir aquesta contrasenya per iniciar la sessió, de manera que cal que escolliu una contrasenya segura i que us recordeu de proporcionar-la a l'usuari supervisat.</translation> <translation id="8962083179518285172">Amaga els detalls</translation> @@ -5315,6 +5349,7 @@ <translation id="9153934054460603056">Desa la identitat i la contrasenya</translation> <translation id="9154194610265714752">S'ha actualitzat.</translation> <translation id="91568222606626347">Crea una drecera...</translation> +<translation id="9157096865782046368">0,8 segons</translation> <translation id="9157697743260533322">No s'han pogut configurar les actualitzacions automàtiques per a tots els usuaris (error de llançament preliminar: <ph name="ERROR_NUMBER" />)</translation> <translation id="9158715103698450907">S'ha produït un problema de comunicació de xarxa durant l'autenticació. Comproveu la connexió de xarxa i torneu-ho a provar.</translation> <translation id="916607977885256133">Pantalla en pantalla</translation>
diff --git a/chrome/app/resources/generated_resources_cs.xtb b/chrome/app/resources/generated_resources_cs.xtb index 6f3c475..5bea4016 100644 --- a/chrome/app/resources/generated_resources_cs.xtb +++ b/chrome/app/resources/generated_resources_cs.xtb
@@ -1,6 +1,7 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="cs"> +<translation id="1002469766576243227">Tato ověřovací služba je hostována v doméně <ph name="EXTENSION_NAME" /></translation> <translation id="1003088604756913841">Otevřít odkaz v novém okně aplikace <ph name="APP" /></translation> <translation id="1004218526896219317">Přístup k webu</translation> <translation id="1005274289863221750">Používat mikrofon a fotoaparát</translation> @@ -289,6 +290,7 @@ <translation id="1429300045468813835">Vše bylo vymazáno</translation> <translation id="143027896309062157">Číst a upravovat všechna data v počítači a na navštívených webech</translation> <translation id="1430915738399379752">Tisk</translation> +<translation id="1431188203598586230">Poslední aktualizace softwaru</translation> <translation id="1432581352905426595">Spravovat vyhledávače</translation> <translation id="1433811987160647649">Před přístupem se zeptat</translation> <translation id="1434696352799406980">Bude resetována vaše počáteční stránka, stránka Nová karta, vyhledávač a připnuté karty. Budou také zakázána všechna rozšíření a vymazána dočasná data, jako jsou soubory cookie. Uložené záložky, historie ani hesla vymazána nebudou.</translation> @@ -528,6 +530,7 @@ <translation id="1781771911845953849">Účty a synchronizace</translation> <translation id="1782196717298160133">Nalezení telefonu</translation> <translation id="1784849162047402014">V zařízení dochází místo na disku</translation> +<translation id="1790194216133135334">Odeslat odkaz na zařízení <ph name="DEVICE_NAME" /></translation> <translation id="1792619191750875668">Sekundární obrazovka</translation> <translation id="1794791083288629568">Odeslat zpětnou vazbu, která nám pomůže při řešení tohoto problému</translation> <translation id="1795214765651529549">Použít klasický motiv</translation> @@ -590,6 +593,7 @@ <translation id="1875312262568496299">Začít</translation> <translation id="1875387611427697908">Lze přidat pouze ze stránek <ph name="CHROME_WEB_STORE" /></translation> <translation id="1877520246462554164">Nepodařilo se získat ověřovací token. Chcete-li to zkusit znovu, odhlaste se a poté se znovu přihlaste.</translation> +<translation id="1877860345998737529">Přepnout přiřazení akcí</translation> <translation id="1879000426787380528">Přihlásit se jako</translation> <translation id="1880905663253319515">Smazat certifikát <ph name="CERTIFICATE_NAME" />?</translation> <translation id="1886996562706621347">Povolit dotazy stránek, zda je chcete použít jako výchozí obslužný nástroj protokolů (doporučeno)</translation> @@ -869,7 +873,9 @@ <translation id="230927227160767054">Stránka chce instalovat obslužný nástroj služby.</translation> <translation id="2309620859903500144">Tomuto webu byl zablokován přístup k senzorům pohybu nebo osvětlení.</translation> <translation id="2315414688463285945">Při konfiguraci souborů systému Linux došlo k chybě. Zkuste to znovu.</translation> +<translation id="2315587498123194634">Odeslat odkaz na zařízení <ph name="DEVICE_NAME" /></translation> <translation id="2316129865977710310">Ne, děkuji</translation> +<translation id="2316739859433277603">Pro vyhledávání ze spouštěče aplikací se používá <ph name="BEGIN_LINK" />nastavení vyhledávačů<ph name="END_LINK" /> z prohlížeče.</translation> <translation id="2317842250900878657">Dokončeno <ph name="PROGRESS_PERCENT" /> %</translation> <translation id="2318143611928805047">Velikost papíru</translation> <translation id="2318817390901984578">Chcete-li používat aplikace Android, nabijte a aktualizujte své zařízení typu <ph name="DEVICE_TYPE" />.</translation> @@ -909,6 +915,7 @@ <translation id="2365507699358342471">Tato stránka má přístup k textu a obrázkům zkopírovaným do schránky.</translation> <translation id="2367199180085172140">Přidat sdílenou složku</translation> <translation id="2367972762794486313">Zobrazit aplikace</translation> +<translation id="2369105924912929484">Přepnout zhuštěný obsah stránky</translation> <translation id="2371076942591664043">Po dokončení otevřít</translation> <translation id="2375406435414127095">Připojte se k telefonu</translation> <translation id="2377667304966270281">Chyby stránkování na disk</translation> @@ -1158,6 +1165,7 @@ <translation id="2739191690716947896">Ladit</translation> <translation id="2739240477418971307">Změnit nastavení přístupnosti</translation> <translation id="2740393541869613458">kontrolovat weby, které dozorovaný uživatel navštívil, a</translation> +<translation id="2741912629735277980">Zobrazit uživatelské rozhraní na přihlašovací obrazovce</translation> <translation id="274290345632688601">Obnovování aplikací a souborů systému Linux</translation> <translation id="2743387203779672305">Zkopírovat do schránky</translation> <translation id="2745080116229976798">Kvalifikované podřízení Microsoft</translation> @@ -1274,6 +1282,7 @@ <translation id="2910318910161511225">Připojte se k síti a zkuste to znovu</translation> <translation id="2913331724188855103">Povolit webům ukládat a číst data souborů cookie (doporučeno)</translation> <translation id="2915102088417824677">Zobrazit protokol aktivity</translation> +<translation id="2915873080513663243">Automatické prohledávání</translation> <translation id="2916073183900451334">Stiskem klávesy Tab zvýrazníte na webové stránce odkazy a pole formulářů</translation> <translation id="2916745397441987255">Hledat rozšíření</translation> <translation id="2921081876747860777">Ochraňte svá místní data pomocí hesla.</translation> @@ -1482,6 +1491,7 @@ <translation id="327147043223061465">Zobrazit všechny soubory cookie a data webů</translation> <translation id="3271648667212143903">Web <ph name="ORIGIN" /> žádá o připojení</translation> <translation id="3274763671541996799">Přepnuli jste do režimu celé obrazovky.</translation> +<translation id="3275778809241512831">Váš interní bezpečnostní klíč momentálně není bezpečný. Odeberte jej ze všech služeb, se kterými jste jej použili. Tento problém vyřešíte tím, že bezpečnostní klíč resetujete.</translation> <translation id="3275778913554317645">Otevřít jako okno</translation> <translation id="3278001907972365362">Váš účet Google vyžaduje pozornost</translation> <translation id="3279230909244266691">Tento proces může trvat několik minut. Probíhá spouštění virtuálního počítače.</translation> @@ -1572,6 +1582,7 @@ <translation id="3412265149091626468">Přejít na výběr</translation> <translation id="3413122095806433232">Vydavatelé CA: <ph name="LOCATION" /></translation> <translation id="3414952576877147120">Velikost:</translation> +<translation id="3420501302812554910">Interní bezpečnostní klíč je potřeba resetovat</translation> <translation id="3421387094817716717">Veřejný klíč založený na eliptické křivce</translation> <translation id="3423463006624419153">V telefonu <ph name="PHONE_NAME_1" /> a <ph name="PHONE_NAME_2" />:</translation> <translation id="3423858849633684918">Restartujte prosím <ph name="PRODUCT_NAME" /></translation> @@ -1600,6 +1611,7 @@ <translation id="3450157232394774192">Procentuální zastoupení stavu nečinnosti</translation> <translation id="3453612417627951340">Vyžaduje oprávnění</translation> <translation id="3454157711543303649">Aktivace dokončena</translation> +<translation id="3454213325559396544">Toto je poslední automatická aktualizace softwaru a zabezpečení pro toto zařízení typu <ph name="DEVICE_TYPE" />. Chcete-li dostávat budoucí aktualizace, upgradujte na novější model.</translation> <translation id="345693547134384690">Otevřít o&brázek na nové kartě</translation> <translation id="3457500881955698515">Vaše společnost nebo organizace vyžaduje okamžitou aktualizaci tohoto zařízení</translation> <translation id="3459509316159669723">Tisk</translation> @@ -1757,6 +1769,7 @@ <translation id="3672681487849735243">Byla zjištěna chyba z výroby</translation> <translation id="367645871420407123">Chcete-li heslo uživatele root nastavit na výchozí hodnotu testovacího obrazu, ponechte toto pole prázdné.</translation> <translation id="3677657024345889897">Nejtišší</translation> +<translation id="3677911431265050325">Požadovat mobilní web</translation> <translation id="3678156199662914018">Rozšíření: <ph name="EXTENSION_NAME" /></translation> <translation id="3681311097828166361">Děkujeme vám za zpětnou vazbu. Nyní jste offline, zpráva bude odeslána později.</translation> <translation id="3682824389861648626">Limit pohybu</translation> @@ -2140,6 +2153,12 @@ <translation id="4242577469625748426">Instalace nastavení zásady v zařízení se nezdařila: <ph name="VALIDATION_ERROR" />.</translation> <translation id="4244238649050961491">Najít další aplikace pro dotyková pera</translation> <translation id="424726838611654458">Vždy otevřít v aplikaci Adobe Reader</translation> +<translation id="4247274662191902962">Data ze senzorů se budou sdílet, pouze dokud budete v této virtuální realitě. Z některých údajů si o vás web může udělat určitou představu. Příklady takových údajů: + – poloha, + – fyzické znaky, např. pozice očí, + – pohyby, například způsob chůze. + + Přístup webu povolte pouze v případě, že mu důvěřujete.</translation> <translation id="4247901771970415646">Synchronizace na účet <ph name="USERNAME" /> se nezdařila</translation> <translation id="4249248555939881673">Čeká se na připojení k síti...</translation> <translation id="4249373718504745892">Přístup této stránky k vaší webové kameře a mikrofonu je zablokován.</translation> @@ -2202,6 +2221,7 @@ <translation id="4350019051035968019">Toto zařízení nelze zaregistrovat do domény, do které patří váš účet, protože je označeno pro správu jinou doménou.</translation> <translation id="4354344420232759511">Zde se zobrazí weby, které navštívíte</translation> <translation id="435527878592612277">Vyberte svou fotografii</translation> +<translation id="4358313196493694334">Stabilizovat místo kliknutí</translation> <translation id="4359408040881008151">Rozšíření bylo nainstalováno kvůli závislým rozšířením.</translation> <translation id="4359717112757026264">Města</translation> <translation id="4361142739114356624">Soukromý klíč tohoto klientského certifikátu chybí nebo je neplatný</translation> @@ -2326,6 +2346,7 @@ <translation id="4558426062282641716">Jsou požadována oprávnění k automatickému spuštění</translation> <translation id="4558491878126948419">Dostávejte tipy k zařízení <ph name="DEVICE_TYPE" /> a aktuality o službách Google a sdílejte s námi zpětnou vazbu. Odběr můžete kdykoli zrušit.</translation> <translation id="4559617833001311418">Tento web používá vaše senzory pohybu nebo osvětlení.</translation> +<translation id="4561098487691395071">Případně zadejte PPD tiskárny</translation> <translation id="4562155214028662640">Přidat otisk prstu</translation> <translation id="4563880231729913339">Prst 3</translation> <translation id="4565377596337484307">Skrýt heslo</translation> @@ -2570,6 +2591,7 @@ <translation id="494286511941020793">Nápověda ke konfiguraci proxy serveru</translation> <translation id="4943368462779413526">Americký fotbal</translation> <translation id="4943691134276646401">Rozšíření <ph name="CHROME_EXTENSION_NAME" /> se chce připojit k sériovému portu</translation> +<translation id="4944310289250773232">Tato ověřovací služba je hostována v doméně <ph name="SAML_DOMAIN" /></translation> <translation id="495170559598752135">Akce</translation> <translation id="4953689047182316270">Reagovat na události přístupnosti</translation> <translation id="4953808748584563296">Výchozí oranžový avatar</translation> @@ -2662,6 +2684,7 @@ <translation id="5094721898978802975">Komunikovat se spolupracujícími nativními aplikacemi</translation> <translation id="5097002363526479830">Připojení k síti <ph name="NAME" /> se nezdařilo: <ph name="DETAILS" /></translation> <translation id="5101042277149003567">Otevřít všechny záložky</translation> +<translation id="5101839224773798795">Při zastavení kurzoru automaticky kliknout</translation> <translation id="5108967062857032718">Nastavení – odstranit aplikace Android</translation> <translation id="5109044022078737958">Mia</translation> <translation id="5111646998522066203">Ukončit anonymní režim</translation> @@ -3145,6 +3168,7 @@ <translation id="5852112051279473187">Při registraci zařízení došlo k závažnému problému. Zkuste to prosím znovu nebo kontaktujte zástupce podpory.</translation> <translation id="5852137567692933493">Restartovat a použít funkci Powerwash</translation> <translation id="5854912040170951372">Svačinka</translation> +<translation id="5855643921295613558">0,6 sekundy</translation> <translation id="5855773610748894548">Jejda, došlo k chybě modulu zabezpečení</translation> <translation id="5856721540245522153">Aktivovat funkce ladění</translation> <translation id="5857090052475505287">Nová složka</translation> @@ -3434,6 +3458,7 @@ <translation id="6279183038361895380">Kurzor zobrazíte stisknutím klávesy |<ph name="ACCELERATOR" />|</translation> <translation id="6280215091796946657">Přihlásit se pomocí jiného účtu</translation> <translation id="6280912520669706465">ARC</translation> +<translation id="628352644014831790">4 sekundy</translation> <translation id="6285120108426285413">Soubor <ph name="FILE_NAME" /> se běžně nestahuje a může být nebezpečný.</translation> <translation id="6285120908535925801">{NUM_PRINTER,plural, =1{Nová tiskárna v síti}few{Nové tiskárny v síti}many{Nové tiskárny v síti}other{Nové tiskárny v síti}}</translation> <translation id="6286708577777130801">Podrobnosti uloženého hesla</translation> @@ -3640,6 +3665,7 @@ <translation id="6612358246767739896">Chráněný obsah</translation> <translation id="6613452264606394692">Přidejte si stránku do záložek, abyste sem mohli rychle přejít</translation> <translation id="6615455863669487791">Ukázat</translation> +<translation id="6617100836880592260">Rychlost prohledávání: <ph name="SPEED_WITH_UNITS" /></translation> <translation id="6618097958368085618">Přesto ponechat</translation> <translation id="6619058681307408113">Line Printer Daemon (LPD)</translation> <translation id="661907246513853610">Web může sledovat vaši polohu</translation> @@ -4452,6 +4478,7 @@ <translation id="7831491651892296503">Chyba při konfiguraci sítě</translation> <translation id="7831754656372780761"><ph name="TAB_TITLE" /> <ph name="EMOJI_MUTING" /></translation> <translation id="7832084384634357321">Čas ukončení</translation> +<translation id="783214144752121388">Blokovat webům spouštění obsahu Flash (doporučeno)</translation> <translation id="7833720883933317473">Tady se budou zobrazovat uložená vlastní slova</translation> <translation id="7835178595033117206">Záložka byla odstraněna</translation> <translation id="7837776265184002579">Domovská stránka byla změněna na <ph name="URL" />.</translation> @@ -4507,6 +4534,7 @@ <translation id="7911118814695487383">Linux</translation> <translation id="7912080627461681647">Vaše heslo bylo na serveru změněno. Odhlaste se a poté se znovu přihlaste.</translation> <translation id="7915471803647590281">Než nám odešlete zpětnou vazbu, sdělte nám prosím, co se děje.</translation> +<translation id="7919210519031517829"><ph name="DURATION" /> s</translation> <translation id="792514962475806987">Úroveň přiblížení zadokované lupy:</translation> <translation id="7925247922861151263">Selhala bezpečnostní kontrola AAA</translation> <translation id="7925285046818567682">Čekání na <ph name="HOST_NAME" />...</translation> @@ -4564,6 +4592,7 @@ <translation id="7987814697832569482">Vždy se připojovat prostřednictvím této sítě VPN</translation> <translation id="798835209536175951">Odesílejte a přijímejte na Chromebooku textové zprávy. <ph name="LINK_BEGIN" />Další informace<ph name="LINK_END" /></translation> <translation id="7988355189918024273">Aktivovat funkce usnadnění přístupu</translation> +<translation id="7991296728590311172">Nastavení přístupu pomocí přepínačů</translation> <translation id="7994702968232966508">Metoda EAP</translation> <translation id="7997826902155442747">Priorita procesu</translation> <translation id="7999229196265990314">Byly vytvořeny následující soubory: @@ -4776,6 +4805,8 @@ <translation id="8308179586020895837">Zobrazit dotaz, pokud bude chtít web <ph name="HOST" /> používat kameru</translation> <translation id="830868413617744215">Beta</translation> <translation id="8309458809024885768">Certifikát již existuje</translation> +<translation id="8314381333424235892">Rozšíření chybí nebo nebylo nainstalováno</translation> +<translation id="8316618172731049784">Odeslat na zařízení <ph name="DEVICE_NAME" /></translation> <translation id="8317671367883557781">Přidat připojení k síti</translation> <translation id="8319414634934645341">Rozšířené použití klíče</translation> <translation id="8320459152843401447">Celá vaše obrazovka</translation> @@ -4932,6 +4963,7 @@ <translation id="8588866096426746242">Zobrazit statistiky profilu</translation> <translation id="8588868914509452556"><ph name="WINDOW_TITLE" /> – VR obsah odesílaný do náhlavní soupravy</translation> <translation id="8590375307970699841">Nastavit automatické aktualizace</translation> +<translation id="8591783563402255548">1 sekunda</translation> <translation id="8592141010104017453">Oznámení vůbec nezobrazovat</translation> <translation id="8593121833493516339">Odesílat údaje o využití a diagnostice. Pomozte prostředí Android svého dítěte zlepšit tím, že necháte do Googlu automaticky odesílat diagnostické údaje a údaje o využití zařízení a aplikací. Tyto údaje nebudou používány ke zjištění totožnosti dítěte a pomohou nám se zvyšováním stability systému a aplikací a dalšími vylepšeními. Některá souhrnná data budou moci využít také naši partneři, např. vývojáři aplikací pro Android. Bude-li mít dítě zapnutou ještě Aktivitu na webu a v aplikacích, mohou se tato data ukládat do jeho účtu Google. <ph name="BEGIN_LINK1" />Další informace<ph name="END_LINK1" /></translation> <translation id="8594908476761052472">Natočit video</translation> @@ -4961,6 +4993,7 @@ <translation id="8637688295594795546">K dispozici je aktualizace systému. Příprava stahování...</translation> <translation id="8639047128869322042">Vyhledávání škodlivého softwaru...</translation> <translation id="8642171459927087831">Přístupový token</translation> +<translation id="8642900771896232685">2 sekundy</translation> <translation id="8642947597466641025">Zvětšit text</translation> <translation id="8643418457919840804">Chcete-li pokračovat, vyberte jednu možnost:</translation> <translation id="8644655801811752511">Tento bezpečnostní klíč nelze resetovat. Zkuste tento klíč resetovat ihned po vložení.</translation> @@ -5162,6 +5195,7 @@ <translation id="8910222113987937043">Změny záložek, historie, hesel a dalších nastavení se již nebudou synchronizovat do účtu Google. Vaše existující data v účtu Google uložena zůstanou a lze je spravovat na <ph name="BEGIN_LINK" />Hlavním panelu Google<ph name="END_LINK" />.</translation> <translation id="8912362522468806198">Účet Google</translation> <translation id="8912793549644936705">Roztáhnout</translation> +<translation id="8912810933860534797">Zapnout automatické prohledávání</translation> <translation id="891365694296252935">Odesílat údaje o využití a diagnostice. Toto zařízení aktuálně automaticky odesílá do Googlu diagnostické údaje a údaje o zařízení a využití. Tyto údaje nebudou používány ke zjištění totožnosti dítěte a pomohou nám se zvyšováním stability systému a aplikací a dalšími vylepšeními. Některá souhrnná data budou moci využít také naši partneři, např. vývojáři aplikací pro Android. Toto nastavení je vyžadováno vlastníkem. Bude-li mít dítě zapnutou ještě Aktivitu na webu a v aplikacích, mohou se tato data ukládat do jeho účtu Google. <ph name="BEGIN_LINK1" />Další informace<ph name="END_LINK1" /></translation> <translation id="8915370057835397490">Načítá se návrh</translation> <translation id="8916476537757519021">Anonymní podrámec: <ph name="SUBFRAME_SITE" /></translation> @@ -5314,6 +5348,7 @@ <translation id="9153934054460603056">Uložit identitu a heslo</translation> <translation id="9154194610265714752">Aktualizováno</translation> <translation id="91568222606626347">Vytvořit zástupce...</translation> +<translation id="9157096865782046368">0,8 sekundy</translation> <translation id="9157697743260533322">Nastavení automatických aktualizací pro všechny uživatele se nezdařilo (chyba předběžného spuštění: <ph name="ERROR_NUMBER" />)</translation> <translation id="9158715103698450907">Jejda! Během ověřování došlo k problému s komunikací se sítí. Zkontrolujte prosím připojení k síti a zkuste to znovu.</translation> <translation id="916607977885256133">Obraz v obraze</translation>
diff --git a/chrome/app/resources/generated_resources_da.xtb b/chrome/app/resources/generated_resources_da.xtb index db08908..791fb8cf 100644 --- a/chrome/app/resources/generated_resources_da.xtb +++ b/chrome/app/resources/generated_resources_da.xtb
@@ -306,7 +306,7 @@ <translation id="146000042969587795">Denne ramme blev blokeret, da den indeholder usikkert indhold.</translation> <translation id="146219525117638703">ONC-tilstand</translation> <translation id="146220085323579959">Forbindelsen til internettet blev afbrudt. Kontrollér din internetforbindelse, og prøv igen.</translation> -<translation id="1463112138205428654"><ph name="FILE_NAME" /> blev blokeret af Avanceret beskyttelse</translation> +<translation id="1463112138205428654"><ph name="FILE_NAME" /> blev blokeret af Avanceret beskyttelse.</translation> <translation id="1464258312790801189">Dine konti</translation> <translation id="1465176863081977902">K&opiér webadressen til lyden</translation> <translation id="1465827627707997754">Pizzastykke</translation> @@ -2142,6 +2142,12 @@ <translation id="4242577469625748426">Det lykkedes ikke at installere politikindstillinger på enheden: <ph name="VALIDATION_ERROR" />.</translation> <translation id="4244238649050961491">Find flere apps til styluspenne</translation> <translation id="424726838611654458">Altid åben i Adobe Reader</translation> +<translation id="4247274662191902962">Sensordata deles kun, når du er i denne VR-oplevelse. Websitet kan muligvis få oplysninger om dig ved hjælp af bestemte oplysninger som f.eks.: + - Din placering + - Dine fysiske træk, f.eks. øjnenes placering + - Dine bevægelser, f.eks. den måde, du går på + + Det er vigtigt, at du har tillid til websitet, før du giver adgang.</translation> <translation id="4247901771970415646">Der kan ikke synkroniseres med <ph name="USERNAME" /></translation> <translation id="4249248555939881673">Venter på netværksforbindelse...</translation> <translation id="4249373718504745892">Denne sides adgang til dit kamera og din mikrofon er blevet blokeret.</translation>
diff --git a/chrome/app/resources/generated_resources_de.xtb b/chrome/app/resources/generated_resources_de.xtb index dcaa546c..2594d40 100644 --- a/chrome/app/resources/generated_resources_de.xtb +++ b/chrome/app/resources/generated_resources_de.xtb
@@ -151,7 +151,7 @@ <translation id="1206407435587370571">Ihr Chromebook kennenlernen</translation> <translation id="1209796539517632982">Automatische Wahl des Nameservers</translation> <translation id="1211364473545090084">In einem Inkognitofenster können Sie surfen, ohne dass Ihr Browserverlauf gespeichert wird</translation> -<translation id="1211769675100312947">Verknüpfungen werden von Ihnen ausgewählt</translation> +<translation id="1211769675100312947">Sie können die Verknüpfungen personalisieren</translation> <translation id="1213037489357051291"><ph name="NUM_FINGERPRINTS" /> Fingerabdrücke eingerichtet</translation> <translation id="1215411991991485844">Neue Hintergrund-App hinzugefügt</translation> <translation id="1217483152325416304">Ihre lokalen Daten werden bald gelöscht</translation> @@ -655,7 +655,7 @@ <translation id="1983959805486816857">Nach der Erstellung eines neuen betreuten Nutzers können Sie die Einstellungen jederzeit von jedem Gerät aus unter <ph name="MANAGEMENT_URL" /> verwalten.</translation> <translation id="1987317783729300807">Konten</translation> <translation id="1989112275319619282">Durchsuchen</translation> -<translation id="1990512225220753005">Keine Verknüpfungen auf dieser Seite einblenden</translation> +<translation id="1990512225220753005">Keine Verknüpfungen auf dieser Seite anzeigen</translation> <translation id="1992397118740194946">Nicht eingerichtet</translation> <translation id="1994173015038366702">Website-URL</translation> <translation id="1997484222658892567"><ph name="URL" /> möchte umfangreiche Daten dauerhaft auf Ihrem lokalen Computer speichern</translation> @@ -2139,6 +2139,12 @@ <translation id="4242577469625748426">Fehler beim Installieren der Richtlinieneinstellungen auf dem Gerät: <ph name="VALIDATION_ERROR" />.</translation> <translation id="4244238649050961491">Mehr Eingabestift-Apps suchen</translation> <translation id="424726838611654458">Immer mit Adobe Reader öffnen</translation> +<translation id="4247274662191902962">Sensordaten werden nur geteilt, während Sie diese VR-Funktion verwenden. Die Website erhält möglicherweise bestimmte Informationen über Sie. Dazu gehören + – Ihr Standort, + – physische Merkmale wie Ihre Augenposition und + – Bewegungen, wie z. B. Ihre Art, zu gehen. + + Geben Sie dieser Website nur Zugriff, wenn Sie ihr vertrauen.</translation> <translation id="4247901771970415646">Synchronisierung mit <ph name="USERNAME" /> nicht möglich</translation> <translation id="4249248555939881673">Auf Netzwerkverbindung warten...</translation> <translation id="4249373718504745892">Diese Seite darf nicht auf die Kamera und das Mikrofon zugreifen.</translation> @@ -4465,7 +4471,7 @@ <translation id="7849264908733290972">B&ild in neuem Tab öffnen</translation> <translation id="784934925303690534">Zeitraum</translation> <translation id="7850222546481862746"><ph name="BEGIN_PARAGRAPH1" />Damit die Einrichtung der Elternaufsicht auf diesem Gerät abgeschlossen werden kann, müssen Sie sich aus dem Konto von <ph name="USER_NAME" /> abmelden.<ph name="END_PARAGRAPH1" /> - <ph name="BEGIN_PARAGRAPH2" />Sie können Family Link für Eltern auf Ihrem eigenen Gerät installieren, um die Jugendschutzeinstellungen Ihres Kindes zu verwalten.<ph name="END_PARAGRAPH2" /></translation> + <ph name="BEGIN_PARAGRAPH2" />Sie können die Jugendschutzeinstellungen für Ihr Kind verwalten, indem Sie Family Link für Eltern auf Ihrem eigenen Gerät installieren.<ph name="END_PARAGRAPH2" /></translation> <translation id="7851457902707056880">Die Anmeldung ist nur über das Eigentümerkonto möglich. Bitte starten Sie das Gerät neu und melden Sie sich dann mit dem Eigentümerkonto an. Das Gerät wird in 30 Sekunden automatisch neu gestartet.</translation> <translation id="7851716364080026749">Zugriff auf Kamera und Mikrofon immer blockieren</translation> <translation id="7853747251428735">Weitere Too&ls</translation>
diff --git a/chrome/app/resources/generated_resources_el.xtb b/chrome/app/resources/generated_resources_el.xtb index f2180d4..d518b3c 100644 --- a/chrome/app/resources/generated_resources_el.xtb +++ b/chrome/app/resources/generated_resources_el.xtb
@@ -1,6 +1,7 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="el"> +<translation id="1002469766576243227">Αυτή η υπηρεσία ελέγχου ταυτότητας φιλοξενείται από <ph name="EXTENSION_NAME" /></translation> <translation id="1003088604756913841">Άνοιγμα Συνδέσμου σε νέο παράθυρο <ph name="APP" /></translation> <translation id="1004218526896219317">Πρόσβαση στον ιστότοπο</translation> <translation id="1005274289863221750">Χρήση του μικροφώνου και της κάμεράς σας</translation> @@ -289,6 +290,7 @@ <translation id="1429300045468813835">Έγινε εκκαθάριση όλων</translation> <translation id="143027896309062157">Ανάγνωση και αλλαγή όλων των δεδομένων σας στον υπολογιστή σας και τους ιστότοπους που επισκέπτεστε</translation> <translation id="1430915738399379752">Εκτύπωση</translation> +<translation id="1431188203598586230">Τελική ενημέρωση λογισμικού</translation> <translation id="1432581352905426595">Διαχείριση μηχανών αναζήτησης</translation> <translation id="1433811987160647649">Ερώτηση πριν από την πρόσβαση</translation> <translation id="1434696352799406980">Με αυτήν την ενέργεια, θα γίνει επαναφορά της σελίδας εκκίνησης, της σελίδας σε νέα καρτέλα, της μηχανής αναζήτησης και των καρφιτσωμένων καρτελών σας. Επιπλέον, θα απενεργοποιηθούν όλες οι επεκτάσεις και θα γίνει διαγραφή των προσωρινών δεδομένων σας, όπως είναι τα cookie. Οι σελιδοδείκτες, το ιστορικό και οι αποθηκευμένοι κωδικοί πρόσβασής σας δεν θα διαγραφούν.</translation> @@ -528,6 +530,7 @@ <translation id="1781771911845953849">Λογαριασμοί και συγχρονισμός</translation> <translation id="1782196717298160133">Εύρεση του τηλεφώνου σας</translation> <translation id="1784849162047402014">Ο ελεύθερος χώρος στον δίσκο της συσκευής είναι περιορισμένος</translation> +<translation id="1790194216133135334">Αποστολή συνδέσμου σε <ph name="DEVICE_NAME" /></translation> <translation id="1792619191750875668">Διευρυμένη οθόνη</translation> <translation id="1794791083288629568">Στείλτε τα σχόλιά σας για να μας βοηθήσετε να επιλύσουμε αυτό το πρόβλημα.</translation> <translation id="1795214765651529549">Χρήση κλασικού</translation> @@ -590,6 +593,7 @@ <translation id="1875312262568496299">Έναρξη</translation> <translation id="1875387611427697908">Η προσθήκη αυτού του στοιχείου είναι δυνατή μόνο από το <ph name="CHROME_WEB_STORE" /></translation> <translation id="1877520246462554164">Απέτυχε η λήψη του διακριτικού ελέγχου ταυτότητας. Αποσυνδεθείτε και συνδεθείτε εκ νέου για να προσπαθήσετε ξανά.</translation> +<translation id="1877860345998737529">Εναλλαγή εκχώρησης ενέργειας</translation> <translation id="1879000426787380528">Σύνδεση ως</translation> <translation id="1880905663253319515">Να διαγραφεί το πιστοποιητικό "<ph name="CERTIFICATE_NAME" />";</translation> <translation id="1886996562706621347">Να επιτρέπεται σε ιστότοπους να ζητούν να γίνονται προεπιλεγμένα προγράμματα χειρισμού για πρωτόκολλα (συνιστάται)</translation> @@ -869,7 +873,9 @@ <translation id="230927227160767054">Αυτή η σελίδα θέλει να κάνει εγκατάσταση ενός δείκτη χειρισμού υπηρεσιών.</translation> <translation id="2309620859903500144">Έχει αποκλειστεί η πρόσβαση αυτού του ιστοτόπου στους αισθητήρες κίνησης και φωτός.</translation> <translation id="2315414688463285945">Παρουσιάστηκε σφάλμα κατά τη διαμόρφωση αρχείων Linux. Δοκιμάστε ξανά.</translation> +<translation id="2315587498123194634">Αποστολή συνδέσμου σε <ph name="DEVICE_NAME" /></translation> <translation id="2316129865977710310">Όχι, ευχαριστώ</translation> +<translation id="2316739859433277603">Οι αναζητήσεις από την εφαρμογή εκκίνησης χρησιμοποιούν τη <ph name="BEGIN_LINK" />ρύθμιση μηχανής αναζήτησης<ph name="END_LINK" /> του προγράμματος περιήγησής σας.</translation> <translation id="2317842250900878657">Ολοκληρώθηκε<ph name="PROGRESS_PERCENT" />%</translation> <translation id="2318143611928805047">Μέγεθος χαρτιού</translation> <translation id="2318817390901984578">Για να χρησιμοποιήσετε εφαρμογές Android, φορτίστε και ενημερώστε τη συσκευή <ph name="DEVICE_TYPE" />.</translation> @@ -909,6 +915,7 @@ <translation id="2365507699358342471">Αυτός ο ιστότοπος μπορεί να δει το κείμενο και τις εικόνες που έχουν αντιγραφεί στο πρόχειρο.</translation> <translation id="2367199180085172140">Προσθήκη κοινόχρηστου αρχείου</translation> <translation id="2367972762794486313">Εμφάνιση εφαρμογών</translation> +<translation id="2369105924912929484">Εναλλαγή φιλτραρισμένου περιεχομένου σελίδας</translation> <translation id="2371076942591664043">Άνοιγμα κατά την &ολοκλήρωση</translation> <translation id="2375406435414127095">Συνδεθείτε στο τηλέφωνό σας</translation> <translation id="2377667304966270281">Σοβαρά σφάλματα</translation> @@ -1159,6 +1166,7 @@ <translation id="2739191690716947896">Εντοπισμός σφαλμάτων</translation> <translation id="2739240477418971307">Αλλαγή των ρυθμίσεων προσβασιμότητας</translation> <translation id="2740393541869613458">ελέγξτε τους ιστότοπους που επισκέφτηκε ο εποπτευόμενος χρήστης και</translation> +<translation id="2741912629735277980">Εμφάνιση διεπαφής χρήστη στην οθόνη σύνδεσης</translation> <translation id="274290345632688601">Επαναφορά εφαρμογών και αρχείων Linux</translation> <translation id="2743387203779672305">Αντιγραφή στο πρόχειρο</translation> <translation id="2745080116229976798">Microsoft Qualified Subordination</translation> @@ -1275,6 +1283,7 @@ <translation id="2910318910161511225">Συνδεθείτε σε ένα δίκτυο και δοκιμάστε ξανά</translation> <translation id="2913331724188855103">Να επιτρέπεται στους ιστότοπους η αποθήκευση και η ανάγνωση δεδομένων cookie (συνιστάται)</translation> <translation id="2915102088417824677">Προβολή αρχείου καταγραφής δραστηριοτήτων</translation> +<translation id="2915873080513663243">Αυτόματη σάρωση</translation> <translation id="2916073183900451334">Εάν πατήσετε το πλήκτρο Tab σε μια ιστοσελίδα, επισημαίνονται οι σύνδεσμοι, καθώς και τα πεδία φόρμας</translation> <translation id="2916745397441987255">Αναζήτηση επεκτάσεων</translation> <translation id="2921081876747860777">Δημιουργήστε έναν κωδικό πρόσβασης για να προστατεύσετε τα τοπικά δεδομένα σας.</translation> @@ -1483,6 +1492,7 @@ <translation id="327147043223061465">Εμφάνιση όλων των cookie και των δεδομένων ιστοτόπων</translation> <translation id="3271648667212143903">Ο ιστότοπος <ph name="ORIGIN" /> επιθυμεί σύνδεση</translation> <translation id="3274763671541996799">Έχετε μεταβεί σε πλήρη οθόνη.</translation> +<translation id="3275778809241512831">Το εσωτερικό κλειδί ασφαλείας είναι προς το παρόν μη ασφαλές. Καταργήστε το από οποιαδήποτε υπηρεσία με την οποία το χρησιμοποιήσατε. Προκειμένου να επιλύσετε αυτό το ζήτημα, επαναφέρετε το κλειδί ασφαλείας.</translation> <translation id="3275778913554317645">Άνοιγμα σε παράθυρο</translation> <translation id="3278001907972365362">Απαιτείται η προσοχή σας σχετικά με τον Λογαριασμό σας Google</translation> <translation id="3279230909244266691">Αυτή η διαδικασία μπορεί να διαρκέσει μερικά λεπτά. Έναρξη του εικονικού μηχανήματος.</translation> @@ -1575,6 +1585,7 @@ <translation id="3412265149091626468">Μετάβαση στην Επιλογή</translation> <translation id="3413122095806433232">Εκδότες CA: <ph name="LOCATION" /></translation> <translation id="3414952576877147120">Μέγεθος:</translation> +<translation id="3420501302812554910">Το εσωτερικό κλειδί ασφαλείας απαιτεί επαναφορά</translation> <translation id="3421387094817716717">Δημόσιο κλειδί ελλειπτικής καμπύλης</translation> <translation id="3423463006624419153">Στα τηλέφωνα "<ph name="PHONE_NAME_1" />" και "<ph name="PHONE_NAME_2" />":</translation> <translation id="3423858849633684918">Επανεκκινήστε το <ph name="PRODUCT_NAME" /></translation> @@ -1603,6 +1614,7 @@ <translation id="3450157232394774192">Ποσοστό κατοχής κατάστασης αδράνειας</translation> <translation id="3453612417627951340">Χρειάζεται εξουσιοδότηση</translation> <translation id="3454157711543303649">Η ενεργοποίηση ολοκληρώθηκε</translation> +<translation id="3454213325559396544">Αυτή είναι η τελευταία αυτόματη ενημέρωση λογισμικού και ασφαλείας για αυτήν τη συσκευή <ph name="DEVICE_TYPE" />. Για να λαμβάνετε μελλοντικές ενημερώσεις, αναβαθμίστε σε νεότερο μοντέλο.</translation> <translation id="345693547134384690">Άνοιγμα ε&ικόνας σε νέα καρτέλα</translation> <translation id="3457500881955698515">Η εταιρεία ή ο οργανισμός σας απαιτεί άμεση ενημέρωση αυτής της συσκευής</translation> <translation id="3459509316159669723">Εκτύπωση</translation> @@ -1760,6 +1772,7 @@ <translation id="3672681487849735243">Εντοπίστηκε ένα εργοστασιακό σφάλμα</translation> <translation id="367645871420407123">αφήστε κενό εάν θέλετε να ορίσετε τον ριζικό κωδικό πρόσβασης στην προεπιλεγμένη τιμή δοκιμαστικής εικόνας</translation> <translation id="3677657024345889897">Χαμηλότερη ένταση</translation> +<translation id="3677911431265050325">Αίτηση ιστοτόπου για κινητά</translation> <translation id="3678156199662914018">Επέκταση: <ph name="EXTENSION_NAME" /></translation> <translation id="3681311097828166361">Σας ευχαριστούμε για τα σχόλιά σας. Βρίσκεστε εκτός σύνδεσης αυτήν τη στιγμή. Η αναφορά σας θα σταλεί αργότερα.</translation> <translation id="3682824389861648626">Ελάχιστο όριο κίνησης</translation> @@ -2144,6 +2157,12 @@ <translation id="4242577469625748426">Αποτυχία εγκατάστασης ρυθμίσεων πολιτικής στη συσκευή: <ph name="VALIDATION_ERROR" />.</translation> <translation id="4244238649050961491">Εύρεση περισσότερων εφαρμογών γραφίδας</translation> <translation id="424726838611654458">Να είναι πάντα ανοικτό στο Adobe Reader</translation> +<translation id="4247274662191902962">Τα δεδομένα αισθητήρα θα κοινοποιούνται μόνο όταν χρησιμοποιείτε αυτήν την εμπειρία VR. Ο ιστότοπος μπορεί να έχει τη δυνατότητα να σας μαθαίνει για εσάς χρησιμοποιώντας ορισμένες πληροφορίες, όπως είναι οι εξής: + - Η τοποθεσία σας + - Τα φυσικά σας χαρακτηριστικά, όπως η θέση των ματιών + - Οι κινήσεις σας, όπως ο τρόπος που περπατάτε + + Προτού επιτρέψετε την πρόσβαση, βεβαιωθείτε ότι μπορείτε να εμπιστευτείτε αυτόν τον ιστότοπο.</translation> <translation id="4247901771970415646">Δεν είναι δυνατός ο συγχρονισμός με τον χρήστη <ph name="USERNAME" /></translation> <translation id="4249248555939881673">Αναμονή για σύνδεση δικτύου…</translation> <translation id="4249373718504745892">Αποκλείστηκε η πρόσβαση αυτής της σελίδας στην κάμερα και στο μικρόφωνό σας.</translation> @@ -2206,6 +2225,7 @@ <translation id="4350019051035968019">Δεν είναι δυνατή η εγγραφή αυτής της συσκευής στον τομέα στον οποίο ανήκει ο λογαριασμός σας, επειδή η συσκευή έχει επισημανθεί για διαχείριση από κάποιον άλλο τομέα.</translation> <translation id="4354344420232759511">Οι ιστότοποι που επισκέπτεστε θα εμφανίζονται εδώ</translation> <translation id="435527878592612277">Επιλέξτε τη φωτογραφία σας</translation> +<translation id="4358313196493694334">Σταθεροποίηση τοποθεσίας κλικ</translation> <translation id="4359408040881008151">Εγκαταστάθηκε λόγω των εξαρτώμενων επεκτάσεων</translation> <translation id="4359717112757026264">Αστικό τοπίο</translation> <translation id="4361142739114356624">Το Ιδιωτικό κλειδί για αυτό το Πιστοποιητικό πελάτη λείπει ή δεν είναι έγκυρο</translation> @@ -2330,6 +2350,7 @@ <translation id="4558426062282641716">Απαιτείται άδεια αυτόματης εκκίνησης</translation> <translation id="4558491878126948419">Λάβετε συμβουλές και ενημερώσεις για <ph name="DEVICE_TYPE" /> σχετικά με προϊόντα Google και μοιραστείτε σχόλια. Μπορείτε να καταργήσετε την εγγραφή σας ανά πάσα στιγμή.</translation> <translation id="4559617833001311418">Αυτός ο ιστότοπος έχει πρόσβαση στους αισθητήρες κίνησης ή φωτός.</translation> +<translation id="4561098487691395071">Εναλλακτικά, καθορίστε το PPD του εκτυπωτή σας</translation> <translation id="4562155214028662640">Προσθήκη δακτυλικού αποτυπώματος</translation> <translation id="4563880231729913339">Δάκτυλο 3</translation> <translation id="4565377596337484307">Απόκρυψη κωδικού πρόσβασης</translation> @@ -2574,6 +2595,7 @@ <translation id="494286511941020793">Βοήθεια για τη διαμόρφωση διακομιστή μεσολάβησης</translation> <translation id="4943368462779413526">Αμερικάνικο ποδόσφαιρο</translation> <translation id="4943691134276646401">Το "<ph name="CHROME_EXTENSION_NAME" />" θέλει να συνδεθεί σε μια σειριακή θύρα</translation> +<translation id="4944310289250773232">Αυτή η υπηρεσία ελέγχου ταυτότητας φιλοξενείται από <ph name="SAML_DOMAIN" /></translation> <translation id="495170559598752135">Ενέργειες</translation> <translation id="4953689047182316270">Απάντηση σε συμβάντα προσβασιμότητας</translation> <translation id="4953808748584563296">Προεπιλεγμένο πορτοκαλί avatar</translation> @@ -2666,6 +2688,7 @@ <translation id="5094721898978802975">Επικοινωνία με συνεργαζόμενες εγγενείς εφαρμογές</translation> <translation id="5097002363526479830">Δεν ήταν δυνατή η σύνδεση στο δίκτυο '<ph name="NAME" />': <ph name="DETAILS" /></translation> <translation id="5101042277149003567">Άνοιγμα όλων των σελιδοδεικτών</translation> +<translation id="5101839224773798795">Να γίνεται αυτόματα κλικ όταν σταματά ο δείκτης του ποντικιού</translation> <translation id="5108967062857032718">Ρυθμίσεις - Κατάργηση εφαρμογών Android</translation> <translation id="5109044022078737958">Mia</translation> <translation id="5111646998522066203">Έξοδος από ανώνυμη περιήγηση</translation> @@ -3150,6 +3173,7 @@ <translation id="5852112051279473187">Ωχ! Κάτι πήγε στραβά κατά την εγγραφή αυτής της συσκευής. Δοκιμάστε ξανά αργότερα ή επικοινωνήστε με τον αντιπρόσωπό σας υποστήριξης.</translation> <translation id="5852137567692933493">Επανεκκίνηση και Powerwash</translation> <translation id="5854912040170951372">Κομμάτι</translation> +<translation id="5855643921295613558">0,6 δευτερόλεπτα</translation> <translation id="5855773610748894548">Δυστυχώς, παρουσιάστηκε σφάλμα στην ασφαλή λειτουργική μονάδα.</translation> <translation id="5856721540245522153">Ενεργοποίηση λειτουργιών εντοπισμού σφαλμάτων</translation> <translation id="5857090052475505287">Νέος φάκελος</translation> @@ -3439,6 +3463,7 @@ <translation id="6279183038361895380">Πιέστε |<ph name="ACCELERATOR" />| για να εμφανιστεί ο δρομέας</translation> <translation id="6280215091796946657">Συνδεθείτε με διαφορετικό λογαριασμό</translation> <translation id="6280912520669706465">ARC</translation> +<translation id="628352644014831790">4 δευτερόλεπτα</translation> <translation id="6285120108426285413">Η λήψη του αρχείου <ph name="FILE_NAME" /> δεν είναι συνήθης και μπορεί να είναι επικίνδυνη.</translation> <translation id="6285120908535925801">{NUM_PRINTER,plural, =1{Εντοπίστηκε νέος εκτυπωτής στο δίκτυό σας}other{Εντοπίστηκαν νέοι εκτυπωτές στο δίκτυό σας}}</translation> <translation id="6286708577777130801">Λεπτομέρειες αποθηκευμένου κωδικού πρόσβασης</translation> @@ -3645,6 +3670,7 @@ <translation id="6612358246767739896">Προστατ. περιεχ.</translation> <translation id="6613452264606394692">Προσθέστε σελιδοδείκτη σε αυτήν τη σελίδα για να επιστρέψετε εδώ γρήγορα</translation> <translation id="6615455863669487791">Εμφάνιση</translation> +<translation id="6617100836880592260">Ταχύτητα σάρωσης: <ph name="SPEED_WITH_UNITS" /></translation> <translation id="6618097958368085618">Διατήρηση</translation> <translation id="6619058681307408113">Daemon εκτυπωτή γραμμής (LPD)</translation> <translation id="661907246513853610">Ο ιστότοπος μπορεί να παρακολουθεί την τοποθεσία σας</translation> @@ -4459,6 +4485,7 @@ <translation id="7831491651892296503">Σφάλμα κατά τη διαμόρφωση του δικτύου</translation> <translation id="7831754656372780761"><ph name="TAB_TITLE" /> <ph name="EMOJI_MUTING" /></translation> <translation id="7832084384634357321">Ώρα λήξης</translation> +<translation id="783214144752121388">Αποκλεισμός εκτέλεσης Flash από ιστοτόπους (συνιστάται)</translation> <translation id="7833720883933317473">Οι αποθηκευμένες προσαρμοσμένες λέξεις θα εμφανίζονται εδώ</translation> <translation id="7835178595033117206">Ο σελιδοδείκτης καταργήθηκε</translation> <translation id="7837776265184002579">Η αρχική σελίδα σας άλλαξε σε <ph name="URL" />.</translation> @@ -4514,6 +4541,7 @@ <translation id="7911118814695487383">Linux</translation> <translation id="7912080627461681647">Ο κωδικός πρόσβασής σας έχει αλλάξει στον διακομιστή. Αποσυνδεθείτε και συνδεθείτε ξανά.</translation> <translation id="7915471803647590281">Πριν από την αποστολή σχολίων, πείτε μας τι συμβαίνει.</translation> +<translation id="7919210519031517829"><ph name="DURATION" /> δ.</translation> <translation id="792514962475806987">Επίπεδο εστίασης σε παράθυρο:</translation> <translation id="7925247922861151263">Ο έλεγχος ΑΑΑ απέτυχε</translation> <translation id="7925285046818567682">Αναμονή για κεντρικό υπολογιστή <ph name="HOST_NAME" />...</translation> @@ -4571,6 +4599,7 @@ <translation id="7987814697832569482">Πάντα σύνδεση μέσω αυτού του VPN</translation> <translation id="798835209536175951">Στείλτε και λάβετε μηνύματα κειμένου μέσω του Chromebook. <ph name="LINK_BEGIN" />Μάθετε περισσότερα<ph name="LINK_END" /></translation> <translation id="7988355189918024273">Ενεργοποιήστε τις λειτουργίες προσβασιμότητας</translation> +<translation id="7991296728590311172">Ρυθμίσεις Πρόσβασης με διακόπτη</translation> <translation id="7994702968232966508">Μέθοδος EAP</translation> <translation id="7997826902155442747">Προτεραιότητα διεργασίας</translation> <translation id="7999229196265990314">Δημιουργήθηκαν τα παρακάτω αρχεία: @@ -4784,6 +4813,8 @@ <translation id="8308179586020895837">Ερώτηση αν το <ph name="HOST" /> επιθυμεί να αποκτήσει πρόσβαση στην κάμερά σας</translation> <translation id="830868413617744215">Beta</translation> <translation id="8309458809024885768">Το πιστοποιητικό υπάρχει ήδη</translation> +<translation id="8314381333424235892">Λείπει ή απεγκαταστάθηκε επέκταση</translation> +<translation id="8316618172731049784">Αποστολή στη διεύθυνση <ph name="DEVICE_NAME" /></translation> <translation id="8317671367883557781">Προσθήκη σύνδεσης δικτύου</translation> <translation id="8319414634934645341">Εκτεταμένη χρήση κλειδιού</translation> <translation id="8320459152843401447">Ολόκληρη η οθόνη σας</translation> @@ -4940,6 +4971,7 @@ <translation id="8588866096426746242">Εμφάνιση στατιστικών στοιχείων προφίλ</translation> <translation id="8588868914509452556"><ph name="WINDOW_TITLE" /> - Παρουσίαση VR στη μάσκα VR</translation> <translation id="8590375307970699841">Ρύθμιση αυτόματων ενημερώσεων</translation> +<translation id="8591783563402255548">1 δευτερόλεπτο</translation> <translation id="8592141010104017453">Να μην εμφανίζονται ειδοποιήσεις</translation> <translation id="8593121833493516339">Αποστολή δεδομένων χρήσης και διαγνωστικών. Συμβάλλετε στη βελτίωση της εμπειρίας Android του παιδιού σας με την αυτόματη αποστολή διαγνωστικών δεδομένων και δεδομένων συσκευής και χρήσης εφαρμογών στην Google. Αυτά τα δεδομένα δεν θα χρησιμοποιηθούν για την ταυτοποίηση του παιδιού σας και θα βοηθήσουν με τη σταθερότητα του συστήματος και των εφαρμογών και την παροχή άλλων βελτιώσεων. Ορισμένα συγκεντρωτικά δεδομένα θα βοηθήσουν επίσης τις εφαρμογές και τους συνεργάτες της Google, όπως τους προγραμματιστές Android. Εάν είναι ενεργή η πρόσθετη Δραστηριότητα ιστού και εφαρμογών για το παιδί σας, αυτά τα δεδομένα μπορεί να αποθηκευτούν στον Λογαριασμό του Google. <ph name="BEGIN_LINK1" />Μάθετε περισσότερα<ph name="END_LINK1" /></translation> <translation id="8594908476761052472">Λήψη βίντεο</translation> @@ -4969,6 +5001,7 @@ <translation id="8637688295594795546">Υπάρχει διαθέσιμη ενημέρωση του συστήματος. Προετοιμασία για λήψη...</translation> <translation id="8639047128869322042">Έλεγχος για επιβλαβές λογισμικό…</translation> <translation id="8642171459927087831">Διακριτικό πρόσβασης</translation> +<translation id="8642900771896232685">2 δευτερόλεπτα</translation> <translation id="8642947597466641025">Μεγέθυνση κειμένου</translation> <translation id="8643418457919840804">Για να συνεχίσετε, ορίστε μια επιλογή:</translation> <translation id="8644655801811752511">Δεν είναι δυνατή η επαναφορά αυτού του κλειδιού ασφαλείας. Δοκιμάστε να επαναφέρετε το κλειδί αμέσως μετά την τοποθέτησή του.</translation> @@ -5168,6 +5201,7 @@ <translation id="8910222113987937043">Οι αλλαγές στους σελιδοδείκτες, το ιστορικό, τους κωδικούς πρόσβασης και άλλες ρυθμίσεις δεν θα συγχρονίζονται πλέον με τον Λογαριασμό σας Google. Ωστόσο, τα υπάρχοντα δεδομένα θα παραμείνουν αποθηκευμένα στον Λογαριασμό σας Google και η διαχείρισή τους μπορεί να γίνεται στον <ph name="BEGIN_LINK" />Πίνακα ελέγχου Google<ph name="END_LINK" />.</translation> <translation id="8912362522468806198">Λογαριασμός Google</translation> <translation id="8912793549644936705">Επέκταση</translation> +<translation id="8912810933860534797">Ενεργοποίηση αυτόματης σάρωσης</translation> <translation id="891365694296252935">Αποστολή δεδομένων χρήσης και διαγνωστικών. Επί του παρόντος, αυτή η συσκευή στέλνει αυτόματα διαγνωστικά δεδομένα, δεδομένα συσκευής και χρήσης εφαρμογών στην Google. Αυτά τα δεδομένα δεν θα χρησιμοποιηθούν για την ταυτοποίηση του παιδιού σας και θα βοηθήσουν με τη σταθερότητα του συστήματος και των εφαρμογών και την παροχή άλλων βελτιώσεων. Ορισμένα συγκεντρωτικά δεδομένα θα βοηθήσουν επίσης τις εφαρμογές και τους συνεργάτες της Google, όπως τους προγραμματιστές Android. Αυτή η ρύθμιση επιβάλλεται από τον κάτοχο. Εάν είναι ενεργή η πρόσθετη Δραστηριότητα ιστού και εφαρμογών για το παιδί σας, αυτά τα δεδομένα μπορεί να αποθηκευτούν στον Λογαριασμό του Google. <ph name="BEGIN_LINK1" />Μάθετε περισσότερα<ph name="END_LINK1" /></translation> <translation id="8915370057835397490">Φόρτωση πρότασης</translation> <translation id="8916476537757519021">Υποπλαίσιο ανώνυμης περιήγησης: <ph name="SUBFRAME_SITE" /></translation> @@ -5320,6 +5354,7 @@ <translation id="9153934054460603056">Αποθήκευση ταυτότητας και κωδικού πρόσβασης</translation> <translation id="9154194610265714752">Ενημερώθηκε</translation> <translation id="91568222606626347">Δημιουργία συντόμευσης…</translation> +<translation id="9157096865782046368">0,8 δευτερόλεπτα</translation> <translation id="9157697743260533322">Αποτυχία ρύθμισης αυτόματων ενημερώσεων για όλους τους χρήστες (σφάλμα προληπτικής εκκίνησης: <ph name="ERROR_NUMBER" />)</translation> <translation id="9158715103698450907">Ωχ! Προέκυψε κάποιο πρόβλημα σχετικά με την επικοινωνία του δικτύου κατά τη διάρκεια του ελέγχου ταυτότητας. Ελέγξτε τη σύνδεση του δικτύου σας και δοκιμάστε ξανά.</translation> <translation id="916607977885256133">Παράθεση εικόνων</translation>
diff --git a/chrome/app/resources/generated_resources_en-GB.xtb b/chrome/app/resources/generated_resources_en-GB.xtb index 2ff1c50..894b636 100644 --- a/chrome/app/resources/generated_resources_en-GB.xtb +++ b/chrome/app/resources/generated_resources_en-GB.xtb
@@ -1,6 +1,7 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="en-GB"> +<translation id="1002469766576243227">This authentication service is hosted by <ph name="EXTENSION_NAME" /></translation> <translation id="1003088604756913841">Open Link in New <ph name="APP" /> Window</translation> <translation id="1004218526896219317">Site access</translation> <translation id="1005274289863221750">Use your microphone and camera</translation> @@ -289,6 +290,7 @@ <translation id="1429300045468813835">Cleared all</translation> <translation id="143027896309062157">Read and change all your data on your computer and the websites that you visit</translation> <translation id="1430915738399379752">Print</translation> +<translation id="1431188203598586230">Final software update</translation> <translation id="1432581352905426595">Manage search engines</translation> <translation id="1433811987160647649">Ask before accessing</translation> <translation id="1434696352799406980">This will reset your startup page, new tab page, search engine and pinned tabs. It will also disable all extensions and clear temporary data like cookies. Your bookmarks, history and saved passwords will not be cleared.</translation> @@ -528,6 +530,7 @@ <translation id="1781771911845953849">Accounts and sync</translation> <translation id="1782196717298160133">Finding your phone</translation> <translation id="1784849162047402014">Device is low on disk space</translation> +<translation id="1790194216133135334">Send link to <ph name="DEVICE_NAME" /></translation> <translation id="1792619191750875668">Extended display</translation> <translation id="1794791083288629568">Send feedback to help us fix this issue.</translation> <translation id="1795214765651529549">Use Classic</translation> @@ -590,6 +593,7 @@ <translation id="1875312262568496299">Begin</translation> <translation id="1875387611427697908">This can only be added from the <ph name="CHROME_WEB_STORE" /></translation> <translation id="1877520246462554164">Failed to get authentication token. Please sign out then sign in again to try again.</translation> +<translation id="1877860345998737529">Switch action assignment</translation> <translation id="1879000426787380528">Sign in as</translation> <translation id="1880905663253319515">Delete certificate "<ph name="CERTIFICATE_NAME" />"?</translation> <translation id="1886996562706621347">Allow sites to ask to become default handlers for protocols (recommended)</translation> @@ -869,7 +873,9 @@ <translation id="230927227160767054">This page wants to install a service handler.</translation> <translation id="2309620859903500144">This site has been blocked from accessing your motion or light sensors.</translation> <translation id="2315414688463285945">Error configuring Linux files. Please try again.</translation> +<translation id="2315587498123194634">Send link to <ph name="DEVICE_NAME" /></translation> <translation id="2316129865977710310">No, thanks</translation> +<translation id="2316739859433277603">Searches from the app launcher use your browser <ph name="BEGIN_LINK" />search engine setting<ph name="END_LINK" />.</translation> <translation id="2317842250900878657"><ph name="PROGRESS_PERCENT" />% done</translation> <translation id="2318143611928805047">Paper size</translation> <translation id="2318817390901984578">To use Android apps, charge & update your <ph name="DEVICE_TYPE" />.</translation> @@ -909,6 +915,7 @@ <translation id="2365507699358342471">This site can see text and images copied to the clipboard.</translation> <translation id="2367199180085172140">Add File Share</translation> <translation id="2367972762794486313">Show apps</translation> +<translation id="2369105924912929484">Toggle distilled page contents</translation> <translation id="2371076942591664043">Open when &done</translation> <translation id="2375406435414127095">Connect to your phone</translation> <translation id="2377667304966270281">Hard Faults</translation> @@ -1158,6 +1165,7 @@ <translation id="2739191690716947896">Debug</translation> <translation id="2739240477418971307">Change your accessibility settings</translation> <translation id="2740393541869613458">review websites the supervised user has visited, and</translation> +<translation id="2741912629735277980">Display UI on the login screen</translation> <translation id="274290345632688601">Restoring Linux apps & files</translation> <translation id="2743387203779672305">Copy to clipboard</translation> <translation id="2745080116229976798">Microsoft Qualified Subordination</translation> @@ -1274,6 +1282,7 @@ <translation id="2910318910161511225">Connect to a network and try again</translation> <translation id="2913331724188855103">Allow sites to save and read cookie data (recommended)</translation> <translation id="2915102088417824677">View activity log</translation> +<translation id="2915873080513663243">Auto-scan</translation> <translation id="2916073183900451334">Pressing Tab on a web page highlights links, as well as form fields</translation> <translation id="2916745397441987255">Search extensions</translation> <translation id="2921081876747860777">Please create a password to protect your local data.</translation> @@ -1482,6 +1491,7 @@ <translation id="327147043223061465">See all cookies and site data</translation> <translation id="3271648667212143903"><ph name="ORIGIN" /> wants to connect</translation> <translation id="3274763671541996799">You have gone full screen.</translation> +<translation id="3275778809241512831">Your internal security key is currently insecure. Please remove it from any services that you used it with. In order to resolve the issue, please reset the security key.</translation> <translation id="3275778913554317645">Open as window</translation> <translation id="3278001907972365362">Your Google Account(s) need attention</translation> <translation id="3279230909244266691">This process may take a few minutes. Starting the virtual machine.</translation> @@ -1574,6 +1584,7 @@ <translation id="3412265149091626468">Jump to Selection</translation> <translation id="3413122095806433232">CA Issuers: <ph name="LOCATION" /></translation> <translation id="3414952576877147120">Size:</translation> +<translation id="3420501302812554910">Internal security key requires reset</translation> <translation id="3421387094817716717">Elliptic Curve Public Key</translation> <translation id="3423463006624419153">On your '<ph name="PHONE_NAME_1" />' and '<ph name="PHONE_NAME_2" />':</translation> <translation id="3423858849633684918">Please Relaunch <ph name="PRODUCT_NAME" /></translation> @@ -1602,6 +1613,7 @@ <translation id="3450157232394774192">Idle State Occupancy Percentage</translation> <translation id="3453612417627951340">Needs authorisation</translation> <translation id="3454157711543303649">Activation complete</translation> +<translation id="3454213325559396544">This is the last automatic software and security update for this <ph name="DEVICE_TYPE" />. To get future updates, upgrade to a newer model.</translation> <translation id="345693547134384690">Open &image in new tab</translation> <translation id="3457500881955698515">Your company or organisation requires an update to this device straight away</translation> <translation id="3459509316159669723">Printing</translation> @@ -1759,6 +1771,7 @@ <translation id="3672681487849735243">A factory error has been detected</translation> <translation id="367645871420407123">leave empty if you want to set the root password to the default test image value</translation> <translation id="3677657024345889897">Quietest</translation> +<translation id="3677911431265050325">Request mobile site</translation> <translation id="3678156199662914018">Extension: <ph name="EXTENSION_NAME" /></translation> <translation id="3681311097828166361">Thank you for your feedback. You are offline now, and your report will be sent later.</translation> <translation id="3682824389861648626">Movement threshold</translation> @@ -2143,6 +2156,12 @@ <translation id="4242577469625748426">Failed to install policy settings on the device: <ph name="VALIDATION_ERROR" />.</translation> <translation id="4244238649050961491">Find more stylus apps</translation> <translation id="424726838611654458">Always open in Adobe Reader</translation> +<translation id="4247274662191902962">Sensor data will only be shared while you're in this VR experience. The site may be able to learn about you using certain info, such as: + - Your location + - Your physical features, like eye position + - Your movements, like how you walk + + Make sure that you trust this site before you allow access.</translation> <translation id="4247901771970415646">Can't sync to <ph name="USERNAME" /></translation> <translation id="4249248555939881673">Waiting for network connection...</translation> <translation id="4249373718504745892">This page has been blocked from accessing your camera and microphone.</translation> @@ -2205,6 +2224,7 @@ <translation id="4350019051035968019">This device cannot be enrolled to the domain that your account belongs to because the device is marked for management by a different domain.</translation> <translation id="4354344420232759511">Sites that you visit will appear here</translation> <translation id="435527878592612277">Select your photo</translation> +<translation id="4358313196493694334">Stabilise click location</translation> <translation id="4359408040881008151">Installed because of dependent extension(s).</translation> <translation id="4359717112757026264">Cityscape</translation> <translation id="4361142739114356624">The Private Key for this Client Certificate is missing or invalid</translation> @@ -2329,6 +2349,7 @@ <translation id="4558426062282641716">Auto-launch permission requested</translation> <translation id="4558491878126948419">Get <ph name="DEVICE_TYPE" /> tips and updates on Google products and share feedback. Unsubscribe at any time.</translation> <translation id="4559617833001311418">This site is accessing your motion or light sensors.</translation> +<translation id="4561098487691395071">Or specify your printer PPD</translation> <translation id="4562155214028662640">Add Fingerprint</translation> <translation id="4563880231729913339">Finger 3</translation> <translation id="4565377596337484307">Hide password</translation> @@ -2573,6 +2594,7 @@ <translation id="494286511941020793">Proxy Configuration Help</translation> <translation id="4943368462779413526">Football</translation> <translation id="4943691134276646401">'<ph name="CHROME_EXTENSION_NAME" />' wants to connect to a serial port</translation> +<translation id="4944310289250773232">This authentication service is hosted by <ph name="SAML_DOMAIN" /></translation> <translation id="495170559598752135">Actions</translation> <translation id="4953689047182316270">Respond to Accessibility Events</translation> <translation id="4953808748584563296">Default orange avatar</translation> @@ -2665,6 +2687,7 @@ <translation id="5094721898978802975">Communicate with cooperating native applications</translation> <translation id="5097002363526479830">Failed to connect to the network '<ph name="NAME" />': <ph name="DETAILS" /></translation> <translation id="5101042277149003567">Open all bookmarks</translation> +<translation id="5101839224773798795">Automatically click when the cursor stops</translation> <translation id="5108967062857032718">Settings – Remove Android apps</translation> <translation id="5109044022078737958">Mia</translation> <translation id="5111646998522066203">Exit incognito</translation> @@ -3148,6 +3171,7 @@ <translation id="5852112051279473187">Oops! Something went really wrong while enrolling this device. Please try again or contact your support representative.</translation> <translation id="5852137567692933493">Restart and Powerwash</translation> <translation id="5854912040170951372">Pizza</translation> +<translation id="5855643921295613558">0.6 seconds</translation> <translation id="5855773610748894548">Oops, secure module error.</translation> <translation id="5856721540245522153">Enable debugging features</translation> <translation id="5857090052475505287">New Folder</translation> @@ -3437,6 +3461,7 @@ <translation id="6279183038361895380">Press |<ph name="ACCELERATOR" />| to show your cursor</translation> <translation id="6280215091796946657">Sign in with a different account</translation> <translation id="6280912520669706465">ARC</translation> +<translation id="628352644014831790">4 seconds</translation> <translation id="6285120108426285413"><ph name="FILE_NAME" /> is not commonly downloaded and may be dangerous.</translation> <translation id="6285120908535925801">{NUM_PRINTER,plural, =1{New printer on your network}other{New printers on your network}}</translation> <translation id="6286708577777130801">Saved password details</translation> @@ -3643,6 +3668,7 @@ <translation id="6612358246767739896">Protected content</translation> <translation id="6613452264606394692">Get back here fast by bookmarking this page</translation> <translation id="6615455863669487791">Show me</translation> +<translation id="6617100836880592260">Scanning speed: <ph name="SPEED_WITH_UNITS" /></translation> <translation id="6618097958368085618">Keep Anyway</translation> <translation id="6619058681307408113">Line Printer Daemon (LPD)</translation> <translation id="661907246513853610">Site can track your location</translation> @@ -4457,6 +4483,7 @@ <translation id="7831491651892296503">Error configuring network</translation> <translation id="7831754656372780761"><ph name="TAB_TITLE" /> <ph name="EMOJI_MUTING" /></translation> <translation id="7832084384634357321">End time</translation> +<translation id="783214144752121388">Block sites from running Flash (recommended)</translation> <translation id="7833720883933317473">Saved custom words will appear here</translation> <translation id="7835178595033117206">Bookmark removed</translation> <translation id="7837776265184002579">Your homepage was changed to <ph name="URL" />.</translation> @@ -4512,6 +4539,7 @@ <translation id="7911118814695487383">Linux</translation> <translation id="7912080627461681647">Your password has been changed on the server. Please sign out then sign in again.</translation> <translation id="7915471803647590281">Please tell us what is happening before sending the feedback.</translation> +<translation id="7919210519031517829"><ph name="DURATION" /> s</translation> <translation id="792514962475806987">Docked zoom level:</translation> <translation id="7925247922861151263">AAA check failed</translation> <translation id="7925285046818567682">Waiting for <ph name="HOST_NAME" />...</translation> @@ -4569,6 +4597,7 @@ <translation id="7987814697832569482">Always connect through this VPN</translation> <translation id="798835209536175951">Send and receive text messages from your Chromebook. <ph name="LINK_BEGIN" />Find out more<ph name="LINK_END" /></translation> <translation id="7988355189918024273">Enable accessibility features</translation> +<translation id="7991296728590311172">Switch Access settings</translation> <translation id="7994702968232966508">EAP method</translation> <translation id="7997826902155442747">Process Priority</translation> <translation id="7999229196265990314">Created the following files: @@ -4782,6 +4811,8 @@ <translation id="8308179586020895837">Ask if <ph name="HOST" /> wants to access your camera</translation> <translation id="830868413617744215">Beta</translation> <translation id="8309458809024885768">Certificate already exists</translation> +<translation id="8314381333424235892">Missing or uninstalled extension</translation> +<translation id="8316618172731049784">Send to <ph name="DEVICE_NAME" /></translation> <translation id="8317671367883557781">Add network connection</translation> <translation id="8319414634934645341">Extended Key Usage</translation> <translation id="8320459152843401447">Your Entire Screen</translation> @@ -4938,6 +4969,7 @@ <translation id="8588866096426746242">Show profile stats</translation> <translation id="8588868914509452556"><ph name="WINDOW_TITLE" /> - VR presenting to headset</translation> <translation id="8590375307970699841">Set up automatic updates</translation> +<translation id="8591783563402255548">1 second</translation> <translation id="8592141010104017453">Don't show notifications at all</translation> <translation id="8593121833493516339">Send usage and diagnostic data. Help improve your child's Android experience by automatically sending diagnostic, device and app usage data to Google. This won't be used to identify your child, and will help system and app stability and other improvements. Some aggregate data will also help Google apps and partners, such as Android developers. If additional Web & App Activity is turned on for your child, this data may be saved to their Google Account. <ph name="BEGIN_LINK1" />Find out more<ph name="END_LINK1" /></translation> <translation id="8594908476761052472">Capture video</translation> @@ -4967,6 +4999,7 @@ <translation id="8637688295594795546">System update available. Preparing to download…</translation> <translation id="8639047128869322042">Checking for harmful software…</translation> <translation id="8642171459927087831">Access Token</translation> +<translation id="8642900771896232685">2 seconds</translation> <translation id="8642947597466641025">Make Text Larger</translation> <translation id="8643418457919840804">To continue, choose an option:</translation> <translation id="8644655801811752511">Can’t reset this security key. Try resetting the key immediately after inserting it.</translation> @@ -5168,6 +5201,7 @@ <translation id="8910222113987937043">Changes to your bookmarks, history, passwords and other settings will no longer be synced to your Google Account. However, your existing data will remain stored in your Google Account and can be managed on <ph name="BEGIN_LINK" />Google Dashboard<ph name="END_LINK" />.</translation> <translation id="8912362522468806198">Google Account</translation> <translation id="8912793549644936705">Stretch</translation> +<translation id="8912810933860534797">Enable auto-scan</translation> <translation id="891365694296252935">Send usage and diagnostic data. This device is currently automatically sending diagnostic, device and app usage data to Google. This won't be used to identify your child, and will help system and app stability and other improvements. Some aggregate data will also help Google apps and partners, such as Android developers. This setting is enforced by the owner. If additional Web & App Activity is turned on for your child, this data may be saved to their Google Account. <ph name="BEGIN_LINK1" />Find out more<ph name="END_LINK1" /></translation> <translation id="8915370057835397490">Loading suggestion</translation> <translation id="8916476537757519021">Incognito Subframe: <ph name="SUBFRAME_SITE" /></translation> @@ -5320,6 +5354,7 @@ <translation id="9153934054460603056">Save identity and password</translation> <translation id="9154194610265714752">Updated</translation> <translation id="91568222606626347">Create Shortcut...</translation> +<translation id="9157096865782046368">0.8 seconds</translation> <translation id="9157697743260533322">Failed to set up automatic updates for all users (preflight launch error: <ph name="ERROR_NUMBER" />)</translation> <translation id="9158715103698450907">Oops! A network communication problem occurred during authentication. Please check your network connection and try again.</translation> <translation id="916607977885256133">Picture in Picture</translation>
diff --git a/chrome/app/resources/generated_resources_es-419.xtb b/chrome/app/resources/generated_resources_es-419.xtb index 37e4169f..090e85d 100644 --- a/chrome/app/resources/generated_resources_es-419.xtb +++ b/chrome/app/resources/generated_resources_es-419.xtb
@@ -2141,6 +2141,12 @@ <translation id="4242577469625748426">Se produjo un error al instalar la configuración de la política en el dispositivo: <ph name="VALIDATION_ERROR" />.</translation> <translation id="4244238649050961491">Encontrar más apps para la pluma stylus</translation> <translation id="424726838611654458">Abrir siempre en Adobe Reader</translation> +<translation id="4247274662191902962">Los datos del sensor solo se compartirán cuando estés disfrutando de esta experiencia en RV. Es posible que el sitio te reconozca con cierta información, por ejemplo: + - Tu ubicación + - Tus características físicas, como la posición de los ojos + - Tus movimientos, como la manera de caminar + + Antes de permitir el acceso, asegúrate de que confías en este sitio.</translation> <translation id="4247901771970415646">No se puede sincronizar con <ph name="USERNAME" /></translation> <translation id="4249248555939881673">Esperando la conexión de red...</translation> <translation id="4249373718504745892">Se bloqueó el acceso de esta página a la cámara y el micrófono.</translation>
diff --git a/chrome/app/resources/generated_resources_es.xtb b/chrome/app/resources/generated_resources_es.xtb index 8fdc9fe..bbd40a4 100644 --- a/chrome/app/resources/generated_resources_es.xtb +++ b/chrome/app/resources/generated_resources_es.xtb
@@ -34,7 +34,7 @@ <translation id="1039337018183941703">El archivo no es válido o está dañado</translation> <translation id="1041175011127912238">La página no responde</translation> <translation id="1042174272890264476">El ordenador también incluye la biblioteca RLZ de <ph name="SHORT_PRODUCT_NAME" />. RLZ asigna una etiqueta identificable, no exclusiva y no personal para medir las búsquedas y el uso de <ph name="SHORT_PRODUCT_NAME" /> derivados de una determinada campaña promocional. Estas etiquetas aparecen a veces en las consultas de la Búsqueda de Google realizadas en <ph name="PRODUCT_NAME" />.</translation> -<translation id="1045692658517323508">{0,plural, =1{Actualizar dentro de 1 minuto}other{Actualizar dentro de # minutos}}</translation> +<translation id="1045692658517323508">{0,plural, =1{Actualizar en el transcurso de 1 minuto}other{Actualizar en el transcurso de # minutos}}</translation> <translation id="1046059554679513793">¡Vaya! Este nombre ya está en uso.</translation> <translation id="1046635659603195359">Parece que ya has configurado Voice Match con el Asistente de Google en otro dispositivo. Esas grabaciones anteriores pueden servir para crear un modelo de voz en este dispositivo. No debería llevar más de un minuto.</translation> <translation id="1047431265488717055">Copiar te&xto de enlace</translation> @@ -1115,7 +1115,7 @@ <translation id="2677748264148917807">Salir</translation> <translation id="2678063897982469759">Volver a habilitar</translation> <translation id="268053382412112343">Hi&storial</translation> -<translation id="2682374361574804119">{0,plural, =1{Actualizar dentro de 1 hora}other{Actualizar dentro de # horas}}</translation> +<translation id="2682374361574804119">{0,plural, =1{Actualizar en el transcurso de 1 hora}other{Actualizar en el transcurso de # horas}}</translation> <translation id="2682498795777673382">Actualizado por tu padre o madre</translation> <translation id="2683638487103917598">Carpeta ordenada</translation> <translation id="2684004000387153598">Para continuar, haz clic en Aceptar y, a continuación, en Añadir perfil para crear un perfil con tu dirección de correo electrónico.</translation> @@ -2141,6 +2141,12 @@ <translation id="4242577469625748426">Se ha producido un error al instalar la configuración de política en el dispositivo (<ph name="VALIDATION_ERROR" />).</translation> <translation id="4244238649050961491">Buscar más aplicaciones para el lápiz óptico</translation> <translation id="424726838611654458">Abrir siempre en Adobe Reader</translation> +<translation id="4247274662191902962">Los datos de los sensores solo se podrán compartir mientras estés inmerso en esta experiencia de realidad virtual. Es posible que el sitio web aprenda sobre ti usando cierta información, como la siguiente: + - Tu ubicación + - Tus características físicas, como la posición de los ojos + - Tus movimientos, p. ej., tu forma de andar + + Antes de permitirle el acceso, asegúrate de que el sitio web sea de confianza.</translation> <translation id="4247901771970415646">No se puede sincronizar con <ph name="USERNAME" /></translation> <translation id="4249248555939881673">Esperando conexión de red...</translation> <translation id="4249373718504745892">Esta página no tiene permiso para acceder a la cámara y al micrófono.</translation> @@ -2589,7 +2595,7 @@ <translation id="4973307593867026061">Añadir impresoras</translation> <translation id="4973325300212422370">{NUM_TABS,plural, =1{Silenciar sitio web}other{Silenciar sitios web}}</translation> <translation id="4974733135013075877">Salir y bloquear</translation> -<translation id="4976795213394241669">{0,plural, =0{Actualizar ahora}=1{Actualizar dentro de 1 segundo}other{Actualizar dentro de # segundos}}</translation> +<translation id="4976795213394241669">{0,plural, =0{Actualizar ahora}=1{Actualizar en el transcurso de 1 segundo}other{Actualizar en el transcurso de # segundos}}</translation> <translation id="4977942889532008999">Confirmar acceso</translation> <translation id="4980805016576257426">Esta extensión contiene software malicioso.</translation> <translation id="4981449534399733132">Para borrar los datos de navegación de todos los dispositivos sincronizados y de tu cuenta de Google, <ph name="BEGIN_LINK" />inicia sesión<ph name="END_LINK" />.</translation> @@ -3149,7 +3155,7 @@ <translation id="5855773610748894548">Vaya, se ha producido un error en el módulo de seguridad.</translation> <translation id="5856721540245522153">Habilitar funciones de depuración</translation> <translation id="5857090052475505287">Nueva carpeta</translation> -<translation id="5857171483910641802">Se mostrarán sugerencias de accesos directos a los sitios web que visites más a menudo</translation> +<translation id="5857171483910641802">Se sugieren accesos directos a los sitios web que visitas más a menudo</translation> <translation id="5858490737742085133">Terminal</translation> <translation id="585979798156957858">Tecla meta externa</translation> <translation id="5860033963881614850">No</translation> @@ -5190,7 +5196,7 @@ <translation id="8948939328578167195"><ph name="WEBSITE" /> quiere ver la marca y el modelo de tu llave de seguridad</translation> <translation id="8951256747718668828">No se ha podido completar la restauración debido a un error</translation> <translation id="895347679606913382">Iniciando...</translation> -<translation id="8956941634583033512">{0,plural, =1{Actualizar dentro de 1 día}other{Actualizar dentro de # días}}</translation> +<translation id="8956941634583033512">{0,plural, =1{Actualizar en el transcurso de 1 día}other{Actualizar en el transcurso de # días}}</translation> <translation id="895944840846194039">Memoria de JavaScript</translation> <translation id="8959810181433034287">El usuario supervisado deberá utilizar esta contraseña para iniciar sesión, por lo que debes seleccionar una contraseña segura que deberás comunicar al usuario supervisado.</translation> <translation id="8962083179518285172">Ocultar detalles</translation>
diff --git a/chrome/app/resources/generated_resources_et.xtb b/chrome/app/resources/generated_resources_et.xtb index 6848b7df..a8fa0cc 100644 --- a/chrome/app/resources/generated_resources_et.xtb +++ b/chrome/app/resources/generated_resources_et.xtb
@@ -1,6 +1,7 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="et"> +<translation id="1002469766576243227">Autentimisteenust hostib <ph name="EXTENSION_NAME" /></translation> <translation id="1003088604756913841">Lingi avamine rakenduse <ph name="APP" /> uues aknas</translation> <translation id="1004218526896219317">Juurdepääs saitidele</translation> <translation id="1005274289863221750">Mikrofoni ja kaamera kasutamine</translation> @@ -289,6 +290,7 @@ <translation id="1429300045468813835">Kustutati kõik</translation> <translation id="143027896309062157">Kõikide arvutis olevate ja külastatavate veebisaitide andmete lugemine ja muutmine</translation> <translation id="1430915738399379752">Printimine</translation> +<translation id="1431188203598586230">Viimane tarkvaravärskendus</translation> <translation id="1432581352905426595">Halda otsingumootoreid</translation> <translation id="1433811987160647649">Küsi enne juurdepääsemist</translation> <translation id="1434696352799406980">See lähtestab käivitamisel avatava lehe, uue vahelehe, otsingumootori ja vähendatud vahelehed. See keelab ka kõik laiendused ja kustutab kõik ajutised andmed (nt küpsised). Teie järjehoidjaid, ajalugu ega salvestatud paroole ei kustutata.</translation> @@ -528,6 +530,7 @@ <translation id="1781771911845953849">Kontod ja sünkroonimine</translation> <translation id="1782196717298160133">Teie telefoni otsimine</translation> <translation id="1784849162047402014">Seadmes on vähe kettaruumi</translation> +<translation id="1790194216133135334">Saada link seadmesse <ph name="DEVICE_NAME" /></translation> <translation id="1792619191750875668">Lisaekraan</translation> <translation id="1794791083288629568">Saatke tagasisidet, et aidata meil see probleem lahendada.</translation> <translation id="1795214765651529549">Kasuta klassikalist</translation> @@ -590,6 +593,7 @@ <translation id="1875312262568496299">Alusta</translation> <translation id="1875387611427697908">Seda on võimalik lisada vaid teenusest <ph name="CHROME_WEB_STORE" /></translation> <translation id="1877520246462554164">Autentimismärgi hankimine ebaõnnestus. Uuesti proovimiseks logige välja ja seejärel uuesti sisse.</translation> +<translation id="1877860345998737529">Lüliti toimingu määramine</translation> <translation id="1879000426787380528">Logi sisse kasutajanimega</translation> <translation id="1880905663253319515">Kas kustutada sertifikaat „<ph name="CERTIFICATE_NAME" />”?</translation> <translation id="1886996562706621347">Võimalda saitidel küsida luba protokollide vaikimisi töötlemiseks (soovitatav)</translation> @@ -869,7 +873,9 @@ <translation id="230927227160767054">Leht soovib installida teenusetöötleja.</translation> <translation id="2309620859903500144">Sellel saidil on juurdepääs teie liikumis- ja valgusanduritele blokeeritud.</translation> <translation id="2315414688463285945">Linuxi failide seadistamisel ilmnes viga. Proovige uuesti.</translation> +<translation id="2315587498123194634">Saada link seadmesse <ph name="DEVICE_NAME" /></translation> <translation id="2316129865977710310">Ei, aitäh</translation> +<translation id="2316739859433277603">Otsib rakenduste käivitajast teie brauseri <ph name="BEGIN_LINK" />otsingumootori seadete<ph name="END_LINK" /> alusel.</translation> <translation id="2317842250900878657"><ph name="PROGRESS_PERCENT" />% on valmis</translation> <translation id="2318143611928805047">Paberi suurus</translation> <translation id="2318817390901984578">Androidi rakenduste kasutamiseks laadige ja värskendage oma seadet <ph name="DEVICE_TYPE" />.</translation> @@ -909,6 +915,7 @@ <translation id="2365507699358342471">See sait näeb lõikelauale kopeeritud teksti ja kujutisi.</translation> <translation id="2367199180085172140">Lisa failide võrguhoidla</translation> <translation id="2367972762794486313">Rakenduste kuvamine</translation> +<translation id="2369105924912929484">Lülita destilleeritud lehe sisu sisse/välja</translation> <translation id="2371076942591664043">Ava, kui on &valmis</translation> <translation id="2375406435414127095">Looge ühendus telefoniga</translation> <translation id="2377667304966270281">Tõsised vead</translation> @@ -1159,6 +1166,7 @@ <translation id="2739191690716947896">Silu</translation> <translation id="2739240477418971307">Juurdepääsetavuse seadete muutmine</translation> <translation id="2740393541869613458">üle vaadata valvatava kasutaja külastatud veebisaite ja</translation> +<translation id="2741912629735277980">Sisselogimiskuval kasutajaliidese kuvamine</translation> <translation id="274290345632688601">Linuxi rakenduste ja failide taastamine</translation> <translation id="2743387203779672305">Kopeeri lõikelauale</translation> <translation id="2745080116229976798">Microsofti piiratud subordinatsioon</translation> @@ -1275,6 +1283,7 @@ <translation id="2910318910161511225">Looge võrguühendus ja proovige uuesti</translation> <translation id="2913331724188855103">Lubab saitidel salvestada küpsiseid ja lugeda küpsiste andmeid (soovitatav)</translation> <translation id="2915102088417824677">Kuva tegevuste logi</translation> +<translation id="2915873080513663243">Automaatne skannimine</translation> <translation id="2916073183900451334">Veebilehel tabeldusklahvi vajutades tõstetakse esile lingid ja ka vormiväljad</translation> <translation id="2916745397441987255">Otsige laiendusi</translation> <translation id="2921081876747860777">Looge parool, et oma kohalikke andmeid kaitsta.</translation> @@ -1483,6 +1492,7 @@ <translation id="327147043223061465">Kuva kõik küpsisefailid ja saidiandmed</translation> <translation id="3271648667212143903"><ph name="ORIGIN" /> soovib ühenduse luua</translation> <translation id="3274763671541996799">Lülitasite täisekraanile.</translation> +<translation id="3275778809241512831">Teie sisemine turvavõti on praegu ebaturvaline. Eemaldage see kõigist teenustest, kus seda kasutanud olete. Probleemi lahendamiseks lähtestage turvavõti.</translation> <translation id="3275778913554317645">Ava aknana</translation> <translation id="3278001907972365362">Teie Google'i kontod vajavad tähelepanu</translation> <translation id="3279230909244266691">Protsess võib võtta mõne minuti. Virtuaalset masinat käivitatakse.</translation> @@ -1575,6 +1585,7 @@ <translation id="3412265149091626468">Hüppa valikusse</translation> <translation id="3413122095806433232">CA väljastajad: <ph name="LOCATION" /></translation> <translation id="3414952576877147120">Suurus:</translation> +<translation id="3420501302812554910">Sisemine turvavõti tuleb lähtestada</translation> <translation id="3421387094817716717">Elliptilise kõveraga avalik võti</translation> <translation id="3423463006624419153">Teie seadmetes <ph name="PHONE_NAME_1" /> ja <ph name="PHONE_NAME_2" />:</translation> <translation id="3423858849633684918">Taaskäivitage rakendus <ph name="PRODUCT_NAME" /></translation> @@ -1603,6 +1614,7 @@ <translation id="3450157232394774192">Jõudeoleku protsent</translation> <translation id="3453612417627951340">Vajab volitust</translation> <translation id="3454157711543303649">Aktiveerimine lõpetatud</translation> +<translation id="3454213325559396544">See on seadme <ph name="DEVICE_TYPE" /> viimane automaatne tarkvara- ja turbevärskendus. Tulevaste värskenduste hankimiseks võtke kasutusele uuem mudel.</translation> <translation id="345693547134384690">Ava pilt uuel &vahelehel</translation> <translation id="3457500881955698515">Teie ettevõte või organisatsioon nõuab selle seadme kohest värskendamist</translation> <translation id="3459509316159669723">Printimine</translation> @@ -1760,6 +1772,7 @@ <translation id="3672681487849735243">Tuvastati tehaseviga</translation> <translation id="367645871420407123">jätke tühjaks, kui soovite määrata testkujutise vaikeväärtusele juurparooli</translation> <translation id="3677657024345889897">Kõige vaiksem</translation> +<translation id="3677911431265050325">Taotle mobiilisaiti</translation> <translation id="3678156199662914018">Laiend: <ph name="EXTENSION_NAME" /></translation> <translation id="3681311097828166361">Täname teid tagasiside eest. Te pole praegu võrguga ühendatud ja aruanne saadetakse hiljem.</translation> <translation id="3682824389861648626">Liikumislävi</translation> @@ -2144,6 +2157,12 @@ <translation id="4242577469625748426">Reegli seadeid ei õnnestunud seadmesse installida: <ph name="VALIDATION_ERROR" />.</translation> <translation id="4244238649050961491">Otsi rohkem elektronpliiatsi rakendusi</translation> <translation id="424726838611654458">Ava alati programmis Adobe Reader</translation> +<translation id="4247274662191902962">Anduri andmeid jagatakse ainult virtuaalreaalsuse kogemuse ajal. Sait võib teid tundma õppida, kasutades järgmist teavet. + - Teie asukoht + - Teie füüsilised omadused, nt silmade asend + - Teie liigutused, nt teie kõnnak + + Enne juurdepääsu andmist veenduge, et usaldaksite seda saiti.</translation> <translation id="4247901771970415646">Kasutajaga <ph name="USERNAME" /> ei saa sünkroonida</translation> <translation id="4249248555939881673">Võrguühenduse ootamine ...</translation> <translation id="4249373718504745892">Sellele lehele on juurdepääs teie kaamerale ja mikrofonile blokeeritud.</translation> @@ -2206,6 +2225,7 @@ <translation id="4350019051035968019">Seda seadet ei saa registreerida domeenil, kuhu teie konto kuulub, sest seade on märgitud teisel domeenil haldamiseks.</translation> <translation id="4354344420232759511">Külastatud saidid kuvatakse siin</translation> <translation id="435527878592612277">Valige foto</translation> +<translation id="4358313196493694334">Stabiliseeri kliki asukohta</translation> <translation id="4359408040881008151">Installitud sõltuva(te) laiendus(t)e tõttu.</translation> <translation id="4359717112757026264">Linna panoraam</translation> <translation id="4361142739114356624">Selle kliendi sertifikaadi privaatvõti puudub või on sobimatu</translation> @@ -2330,6 +2350,7 @@ <translation id="4558426062282641716">Automaatse käivitamise loa taotlus</translation> <translation id="4558491878126948419">Võimaldab teil hankida seadme <ph name="DEVICE_TYPE" /> nõuandeid ja Google'i toodetega seotud uudiseid ning saata tagasisidet. Võite tellimuse igal ajal tühistada.</translation> <translation id="4559617833001311418">Saidil on juurdepääs teie liikumis- või valgusanduritele.</translation> +<translation id="4561098487691395071">Võite ka määrata printeri PPD</translation> <translation id="4562155214028662640">Lisa sõrmejälg</translation> <translation id="4563880231729913339">3. sõrm</translation> <translation id="4565377596337484307">Peida parool</translation> @@ -2574,6 +2595,7 @@ <translation id="494286511941020793">Puhverserveri konfigureerimise abi</translation> <translation id="4943368462779413526">Jalgpall</translation> <translation id="4943691134276646401">„<ph name="CHROME_EXTENSION_NAME" />” soovib järjestikpordiga ühendust luua</translation> +<translation id="4944310289250773232">Autentimisteenust hostib <ph name="SAML_DOMAIN" /></translation> <translation id="495170559598752135">Toimingud</translation> <translation id="4953689047182316270">Juurdepääsetavuse sündmustele vastamine</translation> <translation id="4953808748584563296">Oranž vaikeavatar</translation> @@ -2666,6 +2688,7 @@ <translation id="5094721898978802975">Side koostööd tegevate omarakendustega</translation> <translation id="5097002363526479830">Võrguga „<ph name="NAME" />” ühenduse loomine ebaõnnestus: <ph name="DETAILS" /></translation> <translation id="5101042277149003567">Ava kõik järjehoidjad</translation> +<translation id="5101839224773798795">Automaatne klõpsamine kursori peatumisel</translation> <translation id="5108967062857032718">Seaded – Androidi rakenduste eemaldamine</translation> <translation id="5109044022078737958">Mia</translation> <translation id="5111646998522066203">Välju inkognito režiimist</translation> @@ -3149,6 +3172,7 @@ <translation id="5852112051279473187">Vabandust! Seadme registreerimisel läks miski väga valesti. Proovige uuesti või võtke ühendust toe esindajaga.</translation> <translation id="5852137567692933493">Taaskäivita ja tee Powerwash</translation> <translation id="5854912040170951372">Pitsa</translation> +<translation id="5855643921295613558">0,6 sekundit</translation> <translation id="5855773610748894548">Vabandust! Turvamooduli viga.</translation> <translation id="5856721540245522153">Silumisfunktsioonide lubamine</translation> <translation id="5857090052475505287">Uus kaust</translation> @@ -3438,6 +3462,7 @@ <translation id="6279183038361895380">Kursori kuvamiseks vajutage klahvi |<ph name="ACCELERATOR" />|</translation> <translation id="6280215091796946657">Logige sisse teise kontoga</translation> <translation id="6280912520669706465">ARC</translation> +<translation id="628352644014831790">4 sekundit</translation> <translation id="6285120108426285413">Faili <ph name="FILE_NAME" /> ei laadita sageli alla ja see võib olla ohtlik.</translation> <translation id="6285120908535925801">{NUM_PRINTER,plural, =1{Teie võrgus on uus printer}other{Teie võrgus on uued printerid}}</translation> <translation id="6286708577777130801">Salvestatud parooli üksikasjad</translation> @@ -3644,6 +3669,7 @@ <translation id="6612358246767739896">Kaitstud sisu</translation> <translation id="6613452264606394692">Naaske siia kiiresti, lisades selle lehe järjehoidjatesse</translation> <translation id="6615455863669487791">Kuva mulle</translation> +<translation id="6617100836880592260">Skannimiskiirus: <ph name="SPEED_WITH_UNITS" /></translation> <translation id="6618097958368085618">Säilita ikkagi</translation> <translation id="6619058681307408113">Reaprinteriprotokoll (LPD)</translation> <translation id="661907246513853610">Sait võib teie asukohta jälgida</translation> @@ -4458,6 +4484,7 @@ <translation id="7831491651892296503">Viga võrgu seadistamisel</translation> <translation id="7831754656372780761"><ph name="TAB_TITLE" /> <ph name="EMOJI_MUTING" /></translation> <translation id="7832084384634357321">Lõppaeg</translation> +<translation id="783214144752121388">Blokeeri Flashi käitamine saitidel (soovitatav)</translation> <translation id="7833720883933317473">Salvestatud kohandatud sõnad kuvatakse siin</translation> <translation id="7835178595033117206">Järjehoidja on eemaldatud</translation> <translation id="7837776265184002579">Avaleheks määrati <ph name="URL" />.</translation> @@ -4513,6 +4540,7 @@ <translation id="7911118814695487383">Linux</translation> <translation id="7912080627461681647">Teie parool serveris on muutunud. Logige välja ja seejärel uuesti sisse.</translation> <translation id="7915471803647590281">Teatage meile enne tagasiside saatmist, mis toimub.</translation> +<translation id="7919210519031517829"><ph name="DURATION" /> s</translation> <translation id="792514962475806987">Dokitud luubi suumitase:</translation> <translation id="7925247922861151263">AAA kontrollimine nurjus</translation> <translation id="7925285046818567682"><ph name="HOST_NAME" /> vastuse ootel...</translation> @@ -4570,6 +4598,7 @@ <translation id="7987814697832569482">Loo alati ühendus selle VPN-i kaudu</translation> <translation id="798835209536175951">Saatke ja võtke oma Chromebookis vastu tekstisõnumeid. <ph name="LINK_BEGIN" />Lisateave<ph name="LINK_END" /></translation> <translation id="7988355189918024273">Luba juurdepääsetavuse funktsioonid</translation> +<translation id="7991296728590311172">Lülitiga juurdepääsu seaded</translation> <translation id="7994702968232966508">EAP meetod</translation> <translation id="7997826902155442747">Protsessi prioriteet</translation> <translation id="7999229196265990314">Loodi järgmised failid: @@ -4783,6 +4812,8 @@ <translation id="8308179586020895837">Küsi, kui sait <ph name="HOST" /> soovib juurdepääsu kaamerale</translation> <translation id="830868413617744215">Beeta</translation> <translation id="8309458809024885768">Sertifikaat on juba olemas</translation> +<translation id="8314381333424235892">Laiendus puudub või on installimata</translation> +<translation id="8316618172731049784">Saada seadmesse <ph name="DEVICE_NAME" /></translation> <translation id="8317671367883557781">Lisa võrguühendus</translation> <translation id="8319414634934645341">Laiendatud võtmekasutus</translation> <translation id="8320459152843401447">Kogu teie ekraan</translation> @@ -4940,6 +4971,7 @@ <translation id="8588866096426746242">Kuva profiili statistika</translation> <translation id="8588868914509452556"><ph name="WINDOW_TITLE" /> – VR-i esitatakse peakomplektis</translation> <translation id="8590375307970699841">Automaatsete värskenduste seadistamine</translation> +<translation id="8591783563402255548">1 sekund</translation> <translation id="8592141010104017453">Ära kuva märguandeid üldse</translation> <translation id="8593121833493516339">Saada kasutus- ja diagnostikaandmeid. Aidake täiustada oma lapse Androidi kasutuskogemust, saates Google'ile automaatselt seadme teavet ning rakenduse kasutus- ja diagnostikaandmeid. Neid andmeid ei kasutata teie lapse isiku tuvastamiseks ning need aitavad parandada süsteemi ja rakenduse stabiilsust ning muud. Teatud koondandmed on abiks ka Google'i rakendustele ja partneritele, näiteks Androidi arendajatele. Kui täiendavad veebi- ja rakendustegevused on teie lapse jaoks sisse lülitatud, võidakse need andmed salvestada tema Google'i kontole. <ph name="BEGIN_LINK1" />Lisateave<ph name="END_LINK1" /></translation> <translation id="8594908476761052472">Jäädvusta video</translation> @@ -4969,6 +5001,7 @@ <translation id="8637688295594795546">Süsteemiuuendus on saadaval. Allalaadimiseks valmistumine …</translation> <translation id="8639047128869322042">Ohtliku tarkvara otsimine …</translation> <translation id="8642171459927087831">Juurdepääsuluba</translation> +<translation id="8642900771896232685">2 sekundit</translation> <translation id="8642947597466641025">Saate teksti suurendada</translation> <translation id="8643418457919840804">Jätkamiseks tehke valik:</translation> <translation id="8644655801811752511">Seda turvavõtit ei saa lähtestada. Proovige võti lähtestada kohe pärast sisestamist.</translation> @@ -5170,6 +5203,7 @@ <translation id="8910222113987937043">Teie järjehoidjate, ajaloo, paroolide ja muude seadete muudatusi ei sünkroonita enam teie Google'i kontoga. Teie olemasolevad andmed jäävad aga teie Google'i kontole alles ja neid saab hallata <ph name="BEGIN_LINK" />Google'i juhtpaneelil<ph name="END_LINK" />.</translation> <translation id="8912362522468806198">Google'i konto</translation> <translation id="8912793549644936705">Venitatud</translation> +<translation id="8912810933860534797">Automaatse skannimise lubamine</translation> <translation id="891365694296252935">Saada kasutus- ja diagnostikaandmeid. See seade saadab Google'ile praegu automaatselt seadme teavet ning rakenduse kasutus- ja diagnostikaandmeid. Neid andmeid ei kasutata teie lapse isiku tuvastamiseks ning need aitavad parandada süsteemi ja rakenduse stabiilsust ning muud. Teatud koondandmed on abiks ka Google'i rakendustele ja partneritele, näiteks Androidi arendajatele. Selle seade on jõustanud omanik. Kui täiendavad veebi- ja rakendustegevused on teie lapse jaoks sisse lülitatud, võidakse need andmed salvestada tema Google'i kontole. <ph name="BEGIN_LINK1" />Lisateave<ph name="END_LINK1" /></translation> <translation id="8915370057835397490">Soovituste laadimine</translation> <translation id="8916476537757519021">Inkognito alamraam: <ph name="SUBFRAME_SITE" /></translation> @@ -5322,6 +5356,7 @@ <translation id="9153934054460603056">Salvesta identiteet ja parool</translation> <translation id="9154194610265714752">Värskendatud</translation> <translation id="91568222606626347">Otsetee loomine ...</translation> +<translation id="9157096865782046368">0,8 sekundit</translation> <translation id="9157697743260533322">Automaatvärskenduste seadistamine kõikidele kasutajatele ebaõnnestus (esituseelne käivitamisviga: <ph name="ERROR_NUMBER" />)</translation> <translation id="9158715103698450907">Vabandust! Autentimise ajal ilmnes võrguside probleem. Kontrollige võrguühendust ja proovige uuesti.</translation> <translation id="916607977885256133">Pilt pildis</translation>
diff --git a/chrome/app/resources/generated_resources_fa.xtb b/chrome/app/resources/generated_resources_fa.xtb index 4951ac6..196c18f 100644 --- a/chrome/app/resources/generated_resources_fa.xtb +++ b/chrome/app/resources/generated_resources_fa.xtb
@@ -2140,6 +2140,12 @@ <translation id="4242577469625748426">تنظیمات خطمشی روی دستگاه نصب نشد: <ph name="VALIDATION_ERROR" />.</translation> <translation id="4244238649050961491">پیدا کردن برنامههای قلم بیشتر</translation> <translation id="424726838611654458">همیشه در Adobe Reader باز شود</translation> +<translation id="4247274662191902962">دادههای حسگر فقط زمانی همرسانی میشود که در این تجربه واقعیت مجازی باشید. این سایت ممکن است ازطریق بعضی از اطلاعات زیر، اطلاعاتی درباره شما دریافت کند: + - مکان شما + - ویژگیهای فیزیکی شما، مانند موقعیت چشمانتان + - حرکتهای شما، مانند نحوه راه رفتنتان + + قبل از دسترسی به این سایت، مطمئن شوید به آن اعتماد دارید.</translation> <translation id="4247901771970415646">همگامسازی با <ph name="USERNAME" /> نمیتواند انجام شود</translation> <translation id="4249248555939881673">در انتظار اتصال شبکه...</translation> <translation id="4249373718504745892">این صفحه از دسترسی به دوربین و میکروفون شما بازداشته شده است.</translation>
diff --git a/chrome/app/resources/generated_resources_fi.xtb b/chrome/app/resources/generated_resources_fi.xtb index 8d506a5d..aefa475 100644 --- a/chrome/app/resources/generated_resources_fi.xtb +++ b/chrome/app/resources/generated_resources_fi.xtb
@@ -1,6 +1,7 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="fi"> +<translation id="1002469766576243227">Todennuspalvelun tarjoaa <ph name="EXTENSION_NAME" /></translation> <translation id="1003088604756913841">Avaa linkki uudessa ikkunassa (<ph name="APP" />)</translation> <translation id="1004218526896219317">Sivustojen käyttöoikeudet</translation> <translation id="1005274289863221750">Käyttää mikrofonia ja kameraa</translation> @@ -289,6 +290,7 @@ <translation id="1429300045468813835">Kaikki tyhjennetty</translation> <translation id="143027896309062157">Lukea ja muokata kaikkia tietojasi tietokoneellasi ja käyttämissäsi verkkosivustoissa</translation> <translation id="1430915738399379752">Tulosta</translation> +<translation id="1431188203598586230">Viimeinen ohjelmistopäivitys</translation> <translation id="1432581352905426595">Hallinnoi hakukoneita</translation> <translation id="1433811987160647649">Kysy ennen käyttöä</translation> <translation id="1434696352799406980">Tämä nollaa aloitussivun, Uusi välilehti ‑sivun, hakukoneen ja kiinnitetyt välilehdet. Lisäksi kaikki laajennukset poistetaan käytöstä ja väliaikaiset tiedot kuten evästeet poistetaan. Kirjanmerkkejä, selaushistoriaa tai tallennettuja salasanoja ei poisteta.</translation> @@ -528,6 +530,7 @@ <translation id="1781771911845953849">Tilit ja synkronointi</translation> <translation id="1782196717298160133">Etsitään puhelintasi</translation> <translation id="1784849162047402014">Laitteen tallennustila on vähissä.</translation> +<translation id="1790194216133135334">Lähetä linkki: <ph name="DEVICE_NAME" /></translation> <translation id="1792619191750875668">Laajennettu näyttö</translation> <translation id="1794791083288629568">Lähetä palautetta, niin autat meitä korjaamaan ongelman.</translation> <translation id="1795214765651529549">Ota käyttöön perinteinen</translation> @@ -590,6 +593,7 @@ <translation id="1875312262568496299">Aloita</translation> <translation id="1875387611427697908"><ph name="CHROME_WEB_STORE" /> on ainoa lähde, josta tämä voidaan lisätä.</translation> <translation id="1877520246462554164">Todennustunnisteen hakeminen epäonnistui. Kirjaudu ulos ja uudelleen sisään, niin voit yrittää uudelleen.</translation> +<translation id="1877860345998737529">Kytkintoiminnon määritys</translation> <translation id="1879000426787380528">Kirjaa sisään</translation> <translation id="1880905663253319515">Poistetaanko varmenne <ph name="CERTIFICATE_NAME" />?</translation> <translation id="1886996562706621347">Anna sivustojen ehdottaa protokollien oletuskäsittelypalveluiden määrittämistä (suositus)</translation> @@ -869,7 +873,9 @@ <translation id="230927227160767054">Sivu haluaa asentaa palvelukäsittelijän.</translation> <translation id="2309620859903500144">Tältä sivustolta on estetty liikkeen- tai valontunnistimien käyttö.</translation> <translation id="2315414688463285945">Virhe Linux-tiedostojen määrittämisessä. Yritä uudelleen.</translation> +<translation id="2315587498123194634">Lähetä linkki: <ph name="DEVICE_NAME" /></translation> <translation id="2316129865977710310">Ei kiitos</translation> +<translation id="2316739859433277603">Sovelluksien käynnistysohjelmasta tehdyt haut käyttävät selaimen <ph name="BEGIN_LINK" />hakukoneasetusta<ph name="END_LINK" />.</translation> <translation id="2317842250900878657"><ph name="PROGRESS_PERCENT" /> % valmis</translation> <translation id="2318143611928805047">Paperin koko</translation> <translation id="2318817390901984578">Jos haluat käyttää Android-sovelluksia, lataa ja päivitä <ph name="DEVICE_TYPE" />.</translation> @@ -909,6 +915,7 @@ <translation id="2365507699358342471">Tämä sivu näkee leikepöydälle kopioidun tekstin ja kuvat.</translation> <translation id="2367199180085172140">Lisää jaettu tiedosto</translation> <translation id="2367972762794486313">Näytä sovellukset</translation> +<translation id="2369105924912929484">Tiivistetty sivun sisältö päälle/pois</translation> <translation id="2371076942591664043">Avaa, kun val&mis</translation> <translation id="2375406435414127095">Muodosta yhteys puhelimeen</translation> <translation id="2377667304966270281">Levyn sivuvirheet</translation> @@ -1160,6 +1167,7 @@ <translation id="2739191690716947896">Vianetsintä</translation> <translation id="2739240477418971307">Muokata esteettömyysasetuksia</translation> <translation id="2740393541869613458">tarkastaa verkkosivustot, joilla valvottu käyttäjä on käynyt, ja</translation> +<translation id="2741912629735277980">Näytä käyttöliittymä kirjautumisnäytöllä</translation> <translation id="274290345632688601">Palautetaan Linux-sovellukset ja ‑tiedostot</translation> <translation id="2743387203779672305">Kopioi leikepöydälle</translation> <translation id="2745080116229976798">Microsoftin kelpaava alistaminen</translation> @@ -1276,6 +1284,7 @@ <translation id="2910318910161511225">Muodosta yhteys verkkoon ja yritä uudelleen.</translation> <translation id="2913331724188855103">Salli sivustojen tallentaa ja lukea evästetietoja (suositus).</translation> <translation id="2915102088417824677">Näytä tapahtumaloki</translation> +<translation id="2915873080513663243">Automaattinen skannaus</translation> <translation id="2916073183900451334">Sarkaimen painaminen verkkosivulla korostaa linkit ja lomakekentät</translation> <translation id="2916745397441987255">Hae laajennuksia</translation> <translation id="2921081876747860777">Suojaa paikalliset tiedot luomalla salasana</translation> @@ -1484,6 +1493,7 @@ <translation id="327147043223061465">Näytä kaikki evästeet ja sivuston tiedot</translation> <translation id="3271648667212143903"><ph name="ORIGIN" /> haluaa muodostaa yhteyden</translation> <translation id="3274763671541996799">Koko näytön tila on käytössä.</translation> +<translation id="3275778809241512831">Sisäinen suojausavaimesi ei ole tällä hetkellä turvallinen. Poista se palveluista, joissa käytit sitä. Nollaa suojausavain ongelman ratkaisemiseksi.</translation> <translation id="3275778913554317645">Avaa ikkunana</translation> <translation id="3278001907972365362">Google-tilisi vaativat toimenpiteitä</translation> <translation id="3279230909244266691">Tämä voi kestää muutaman minuutin. Käynnistetään virtuaalikonetta.</translation> @@ -1576,6 +1586,7 @@ <translation id="3412265149091626468">Siirry valintaan</translation> <translation id="3413122095806433232">Varmenteiden myöntäjät: <ph name="LOCATION" /></translation> <translation id="3414952576877147120">Koko:</translation> +<translation id="3420501302812554910">Sisäinen suojausavain on nollattava</translation> <translation id="3421387094817716717">Julkinen avain: elliptinen käyrä</translation> <translation id="3423463006624419153"><ph name="PHONE_NAME_1" /> ja <ph name="PHONE_NAME_2" />:</translation> <translation id="3423858849633684918">Käynnistä <ph name="PRODUCT_NAME" /> uudelleen</translation> @@ -1604,6 +1615,7 @@ <translation id="3450157232394774192">Käyttämätön-tilan käyttöprosentti</translation> <translation id="3453612417627951340">Tarvitsee luvan</translation> <translation id="3454157711543303649">Aktivointi valmis</translation> +<translation id="3454213325559396544">Tämä on viimeinen automaattinen ohjelmisto- ja tietoturvapäivitys, jonka <ph name="DEVICE_TYPE" /> saa. Vaihda uudempaan malliin, jos haluat jatkossa päivityksiä.</translation> <translation id="345693547134384690">Avaa &kuva uudessa välilehdessä</translation> <translation id="3457500881955698515">Yritys tai organisaatio edellyttää laitteen päivittämistä heti</translation> <translation id="3459509316159669723">Tulostaminen</translation> @@ -1761,6 +1773,7 @@ <translation id="3672681487849735243">Tehdasvirhe on havaittu</translation> <translation id="367645871420407123">Jätä tyhjäksi, jos haluat asettaa pääkäyttäjän salasanaksi oletustestikuvan arvon.</translation> <translation id="3677657024345889897">Hiljaisin</translation> +<translation id="3677911431265050325">Pyydä mobiilisivustoa</translation> <translation id="3678156199662914018">Laajennus: <ph name="EXTENSION_NAME" /></translation> <translation id="3681311097828166361">Kiitos palautteestasi. Olet nyt offline-tilassa, joten ilmoituksesi lähetetään myöhemmin.</translation> <translation id="3682824389861648626">Liikkeen raja-arvo</translation> @@ -2142,6 +2155,12 @@ <translation id="4242577469625748426">Käytäntöasetuksien asentaminen laitteelle epäonnistui: <ph name="VALIDATION_ERROR" />.</translation> <translation id="4244238649050961491">Hae lisää näyttökynäsovelluksia</translation> <translation id="424726838611654458">Avaa aina Adobe Readerissa</translation> +<translation id="4247274662191902962">Anturidataa jaetaan vain, kun käytät tätä VR-kokemusta. Sivusto voi saada sinusta tietoa käyttämällä esimerkiksi + – sijaintiasi + – fyysisiä piirteitäsi, kuten silmiesi sijaintia + – liikkeitäsi, kuten kävelytapaasi. + + Varmista, että sivusto on luotettava, ennen kuin myönnät sille käyttöoikeuden.</translation> <translation id="4247901771970415646">Synkronointi tilille <ph name="USERNAME" /> epäonnistui</translation> <translation id="4249248555939881673">Odotetaan verkkoyhteyttä…</translation> <translation id="4249373718504745892">Tältä sivulta on estetty kameran ja mikrofonin käyttö.</translation> @@ -2204,6 +2223,7 @@ <translation id="4350019051035968019">Tätä laitetta ei voi rekisteröidä verkkotunnukselle, johon tilisi kuuluu, koska laite on merkitty eri verkkotunnuksen hallinnoitavaksi.</translation> <translation id="4354344420232759511">Käyttämäsi sivustot tulevat näkyviin tähän</translation> <translation id="435527878592612277">Valitse valokuva</translation> +<translation id="4358313196493694334">Vakauta kursorin sijainti</translation> <translation id="4359408040881008151">Asennettiin, koska muut laajennukset ovat riippuvaisia tästä laajennuksesta.</translation> <translation id="4359717112757026264">Kaupunkimaisema</translation> <translation id="4361142739114356624">Tämän käyttöoikeusvarmenteen yksityinen avain puuttuu tai on virheellinen.</translation> @@ -2328,6 +2348,7 @@ <translation id="4558426062282641716">Automaattisen käynnistyksen lupaa pyydetty</translation> <translation id="4558491878126948419">Vastaanota vinkkejä (<ph name="DEVICE_TYPE" />) ja Google-tuotteiden päivityksiä ja anna palautetta. Voit lopettaa tilauksen milloin vain.</translation> <translation id="4559617833001311418">Tämä sivusto käyttää liikkeen- ja valontunnistimiasi.</translation> +<translation id="4561098487691395071">Tai määritä tulostimen PPD</translation> <translation id="4562155214028662640">Lisää sormenjälki</translation> <translation id="4563880231729913339">Sormi 3</translation> <translation id="4565377596337484307">Piilota salasana</translation> @@ -2572,6 +2593,7 @@ <translation id="494286511941020793">Välityspalvelinmäärityksen ohje</translation> <translation id="4943368462779413526">Jalkapallo</translation> <translation id="4943691134276646401"><ph name="CHROME_EXTENSION_NAME" /> haluaa yhdistää sarjaporttiin</translation> +<translation id="4944310289250773232">Todennuspalvelun tarjoaa <ph name="SAML_DOMAIN" /></translation> <translation id="495170559598752135">Toiminnot</translation> <translation id="4953689047182316270">Vastata esteettömyystapahtumiin</translation> <translation id="4953808748584563296">Oranssi oletusavatar</translation> @@ -2664,6 +2686,7 @@ <translation id="5094721898978802975">Kommunikoida yhteistyötä tekevien natiivisovellusten kanssa</translation> <translation id="5097002363526479830">Yhteyden muodostaminen verkkoon "<ph name="NAME" />" epäonnistui: <ph name="DETAILS" /></translation> <translation id="5101042277149003567">Avaa kaikki kirjanmerkit</translation> +<translation id="5101839224773798795">Klikkaa automaattisesti, kun osoitin pysähtyy</translation> <translation id="5108967062857032718">Asetukset – Poista Android-sovellukset</translation> <translation id="5109044022078737958">Mia</translation> <translation id="5111646998522066203">Poistu incognito-tilasta</translation> @@ -3147,6 +3170,7 @@ <translation id="5852112051279473187">Hups! Jotakin meni vikaan laitteen käyttöönoton yhteydessä. Yritä uudelleen tai ota yhteyttä tukipalveluun.</translation> <translation id="5852137567692933493">Käynnistä uudelleen ja suorita Powerwash</translation> <translation id="5854912040170951372">Pizza</translation> +<translation id="5855643921295613558">0,6 sekuntia</translation> <translation id="5855773610748894548">Hups, tapahtui suojausmoduulivirhe.</translation> <translation id="5856721540245522153">Ota käyttöön virheenkorjausominaisuudet</translation> <translation id="5857090052475505287">Uusi kansio</translation> @@ -3438,6 +3462,7 @@ <translation id="6279183038361895380">Näytä kursori painamalla |<ph name="ACCELERATOR" />|.</translation> <translation id="6280215091796946657">Kirjaudu sisään toisella tilillä</translation> <translation id="6280912520669706465">ARC</translation> +<translation id="628352644014831790">4 sekuntia</translation> <translation id="6285120108426285413"><ph name="FILE_NAME" /> on harvinainen ladattava tiedosto, ja se voi olla vaarallinen.</translation> <translation id="6285120908535925801">{NUM_PRINTER,plural, =1{Verkossasi on uusi tulostin}other{Verkossasi on uusia tulostimia}}</translation> <translation id="6286708577777130801">Tallennettujen salasanojen tiedot</translation> @@ -3644,6 +3669,7 @@ <translation id="6612358246767739896">Suojattu sisältö</translation> <translation id="6613452264606394692">Lisää sivu kirjanmerkiksi, niin voit palata tähän nopeasti.</translation> <translation id="6615455863669487791">Näytä</translation> +<translation id="6617100836880592260">Skannausnopeus: <ph name="SPEED_WITH_UNITS" /></translation> <translation id="6618097958368085618">Säilytä silti</translation> <translation id="6619058681307408113">Line Printer Daemon ‑protokolla (LPD)</translation> <translation id="661907246513853610">Sivusto voi seurata sijaintiasi</translation> @@ -4457,6 +4483,7 @@ <translation id="7831491651892296503">Verkon määritysvirhe</translation> <translation id="7831754656372780761"><ph name="TAB_TITLE" /> <ph name="EMOJI_MUTING" /></translation> <translation id="7832084384634357321">Päättymisaika</translation> +<translation id="783214144752121388">Estä sivustoja käyttämästä Flashia (suositus)</translation> <translation id="7833720883933317473">Tässä näytetään tallennetut muokatut sanat.</translation> <translation id="7835178595033117206">Kirjanmerkki poistettu</translation> <translation id="7837776265184002579">Etusivuksi vaihdettiin <ph name="URL" />.</translation> @@ -4512,6 +4539,7 @@ <translation id="7911118814695487383">Linux</translation> <translation id="7912080627461681647">Salasana vaihdettiin palvelimella. Kirjaudu ulos ja sitten uudelleen sisään.</translation> <translation id="7915471803647590281">Kerro meille tapahtumista ennen kun lähetät palautteen.</translation> +<translation id="7919210519031517829"><ph name="DURATION" /> s</translation> <translation id="792514962475806987">Kiinnitetyn zoomauksen taso:</translation> <translation id="7925247922861151263">AAA-testi epäonnistui</translation> <translation id="7925285046818567682">Odotetaan palvelinta osoitteessa <ph name="HOST_NAME" />...</translation> @@ -4569,6 +4597,7 @@ <translation id="7987814697832569482">Muodosta tähän aina VPN-yhteys</translation> <translation id="798835209536175951">Lähetä ja vastaanota tekstiviestejä Chromebookilla. <ph name="LINK_BEGIN" />Lisätietoja<ph name="LINK_END" /></translation> <translation id="7988355189918024273">Ota käyttöön esteettömyystoimintoja</translation> +<translation id="7991296728590311172">Kytkimen käytön asetukset</translation> <translation id="7994702968232966508">EAP-tapa</translation> <translation id="7997826902155442747">Prosessien tärkeysjärjestys</translation> <translation id="7999229196265990314">Luotiin seuraavat tiedostot: @@ -4782,6 +4811,8 @@ <translation id="8308179586020895837">Kysy, jos <ph name="HOST" /> haluaa käyttää kameraasi</translation> <translation id="830868413617744215">Beta</translation> <translation id="8309458809024885768">Sertifikaatti on jo olemassa.</translation> +<translation id="8314381333424235892">Puuttuva tai virheellinen laajennus</translation> +<translation id="8316618172731049784">Lähetä: <ph name="DEVICE_NAME" /></translation> <translation id="8317671367883557781">Lisää verkkoyhteys</translation> <translation id="8319414634934645341">Laajennettu avaimen käyttö</translation> <translation id="8320459152843401447">Koko näyttösi</translation> @@ -4938,6 +4969,7 @@ <translation id="8588866096426746242">Näytä profiilitiedot</translation> <translation id="8588868914509452556"><ph name="WINDOW_TITLE" /> – VR esittää headsetiin</translation> <translation id="8590375307970699841">Ota käyttöön automaattiset päivitykset</translation> +<translation id="8591783563402255548">1 sekunti</translation> <translation id="8592141010104017453">Älä näytä ilmoituksia lainkaan</translation> <translation id="8593121833493516339">Lähetä käyttö- ja diagnostiikkadataa. Auta parantamaan lapsesi Android-käyttökokemusta lähettämällä diagnostiikkadataa sekä laitteen ja sovellusten käyttödataa automaattisesti Googlelle. Dataa ei käytetä lapsesi henkilöllisyyden selvittämiseen – sen avulla parannetaan esimerkiksi järjestelmän ja sovellusten vakautta. Kootusta datasta on hyötyä myös Googlen sovelluksille ja kumppaneille, kuten Android-kehittäjille. Jos muun verkko- ja sovellustoiminnan asetus on lapsella käytössä, tätä dataa voidaan tallentaa hänen Google-tililleen. <ph name="BEGIN_LINK1" />Lue lisää<ph name="END_LINK1" /></translation> <translation id="8594908476761052472">Tallenna video</translation> @@ -4967,6 +4999,7 @@ <translation id="8637688295594795546">Järjestelmäpäivitys saatavilla. Valmistellaan latausta...</translation> <translation id="8639047128869322042">Etsitään haittaohjelmia…</translation> <translation id="8642171459927087831">Käyttötunnus</translation> +<translation id="8642900771896232685">2 sekuntia</translation> <translation id="8642947597466641025">Suurenna tekstiä</translation> <translation id="8643418457919840804">Jatka valitsemalla vaihtoehto:</translation> <translation id="8644655801811752511">Tätä suojausavainta ei voi nollata. Yritä nollata avain heti sen asettamisen jälkeen.</translation> @@ -5168,6 +5201,7 @@ <translation id="8910222113987937043">Kirjanmerkkeihin, historiaan, salasanoihin ja muihin asetuksiin tehtyjä muutoksia ei enää synkronoida Google-tilillesi. Nykyiset tietosi pysyvät kuitenkin Google-tilillä ja niitä voidaan hallinnoida <ph name="BEGIN_LINK" />Google Hallintapaneelissa<ph name="END_LINK" />.</translation> <translation id="8912362522468806198">Google-tilisi avulla</translation> <translation id="8912793549644936705">Venytä</translation> +<translation id="8912810933860534797">Ota automaattinen skannaus käyttöön</translation> <translation id="891365694296252935">Lähetä käyttö- ja diagnostiikkadataa. Laite lähettää tällä hetkellä diagnostiikkadataa sekä laitteen ja sovellusten käyttödataa automaattisesti Googlelle. Dataa ei käytetä lapsesi henkilöllisyyden selvittämiseen – sen avulla parannetaan esimerkiksi järjestelmän ja sovellusten vakautta. Kootusta datasta on hyötyä myös Googlen sovelluksille ja kumppaneille, kuten Android-kehittäjille. Omistaja on ottanut tämän asetuksen käyttöön. Jos muun verkko- ja sovellustoiminnan asetus on lapsella käytössä, tätä dataa voidaan tallentaa hänen Google-tililleen. <ph name="BEGIN_LINK1" />Lue lisää<ph name="END_LINK1" /></translation> <translation id="8915370057835397490">Ladataan ehdotusta</translation> <translation id="8916476537757519021">Incognito-alakehys: <ph name="SUBFRAME_SITE" /></translation> @@ -5320,6 +5354,7 @@ <translation id="9153934054460603056">Tallenna henkilöllisyys ja salasana</translation> <translation id="9154194610265714752">Päivitetty</translation> <translation id="91568222606626347">Luo pikakuvake…</translation> +<translation id="9157096865782046368">0,8 sekuntia</translation> <translation id="9157697743260533322">Automaattisten päivitysten käyttöönotto kaikille käyttäjille epäonnistui (käynnistysvirhe valmistelun aikana: <ph name="ERROR_NUMBER" />).</translation> <translation id="9158715103698450907">Hups! Todennuksen aikana tapahtui verkkovirhe. Tarkista internetyhteytesi ja yritä uudelleen.</translation> <translation id="916607977885256133">Kuva kuvassa</translation>
diff --git a/chrome/app/resources/generated_resources_fil.xtb b/chrome/app/resources/generated_resources_fil.xtb index 8e17c9b..caa9739 100644 --- a/chrome/app/resources/generated_resources_fil.xtb +++ b/chrome/app/resources/generated_resources_fil.xtb
@@ -1232,7 +1232,7 @@ <translation id="284975061945174219">Nabigo ang pag-clean up</translation> <translation id="2849936225196189499">Kritikal</translation> <translation id="2850541429955027218">Magdagdag ng tema</translation> -<translation id="2858138569776157458">Sikat site</translation> +<translation id="2858138569776157458">Top na sites</translation> <translation id="2859806420264540918">Nagpapakita ang site na ito ng mga nakakasagabal o nakakapanlinlang na ad.</translation> <translation id="2861301611394761800">Kumpleto na ang pag-update ng system. Paki-restart ang system.</translation> <translation id="2861941300086904918">Tagapamahala ng seguridad ng Native Client</translation> @@ -2144,6 +2144,12 @@ <translation id="4242577469625748426">Nabigong i-install ang mga setting ng patakaran sa device: <ph name="VALIDATION_ERROR" />.</translation> <translation id="4244238649050961491">Maghanap ng higit pang app ng stylus</translation> <translation id="424726838611654458">Palaging buksan sa Adobe Reader</translation> +<translation id="4247274662191902962">Ibabahagi lang ang data ng sensor habang ikaw ay nasa VR experience na ito. Puwedeng matuto ang site tungkol sa iyo gamit ang ilang partikular na impormasyon, gaya ng: + - Iyong lokasyon + - Iyong mga pisikal na feature, gaya ng posisyon ng mata + - Iyong mga pagkilos, gaya ng kung paano ka maglakad + + Tiyaking pinagkakatiwalaan mo ang site na ito bago mo payagan ang pag-access.</translation> <translation id="4247901771970415646">Hindi ma-sync sa <ph name="USERNAME" /></translation> <translation id="4249248555939881673">Naghihintay ng koneksyon sa network...</translation> <translation id="4249373718504745892">Na-block ang pahinang ito sa pag-access ng iyong camera at mikropono.</translation>
diff --git a/chrome/app/resources/generated_resources_fr.xtb b/chrome/app/resources/generated_resources_fr.xtb index 277c2d78..1735f8e 100644 --- a/chrome/app/resources/generated_resources_fr.xtb +++ b/chrome/app/resources/generated_resources_fr.xtb
@@ -1,6 +1,7 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="fr"> +<translation id="1002469766576243227">Ce service d'authentification est hébergé par <ph name="EXTENSION_NAME" /></translation> <translation id="1003088604756913841">Ouvrir le lien dans une nouvelle fenêtre <ph name="APP" /></translation> <translation id="1004218526896219317">Accès au site</translation> <translation id="1005274289863221750">Utiliser votre micro et votre caméra</translation> @@ -151,7 +152,7 @@ <translation id="1206407435587370571">Explorez votre Chromebook</translation> <translation id="1209796539517632982">Serveurs de noms automatiques</translation> <translation id="1211364473545090084">Parcourez le Web sans enregistrer votre historique de navigation à l'aide d'une fenêtre de navigation privée</translation> -<translation id="1211769675100312947">Les raccourcis affichés sont ceux que vous avez organisés</translation> +<translation id="1211769675100312947">Les raccourcis affichés sont ceux que vous avez vous-même définis</translation> <translation id="1213037489357051291"><ph name="NUM_FINGERPRINTS" /> empreintes digitales configurées</translation> <translation id="1215411991991485844">Nouvelle application en arrière-plan ajoutée</translation> <translation id="1217483152325416304">Vos données locales seront bientôt supprimées</translation> @@ -289,6 +290,7 @@ <translation id="1429300045468813835">Toutes les entrées ont été supprimées</translation> <translation id="143027896309062157">Accéder à toutes vos données sur votre ordinateur et sur les sites Web que vous consultez et les modifier</translation> <translation id="1430915738399379752">Imprimer</translation> +<translation id="1431188203598586230">Dernière mise à jour logicielle</translation> <translation id="1432581352905426595">Gérer les moteurs de recherche</translation> <translation id="1433811987160647649">Demander avant d'accéder</translation> <translation id="1434696352799406980">Cette fonctionnalité réinitialise la page de démarrage, la page Nouvel onglet, le moteur de recherche et les onglets épinglés. Elle désactive en outre toutes les extensions, et efface les données temporaires telles que les cookies. Vos favoris, votre historique et vos mots de passe enregistrés ne sont pas supprimés.</translation> @@ -306,7 +308,7 @@ <translation id="146000042969587795">Ce cadre a été bloqué, car il contient des éléments non sécurisés.</translation> <translation id="146219525117638703">État ONC</translation> <translation id="146220085323579959">Internet a été déconnecté. Veuillez vérifier votre connexion, puis réessayer.</translation> -<translation id="1463112138205428654"><ph name="FILE_NAME" /> a été bloqué par le programme Protection Avancée.</translation> +<translation id="1463112138205428654"><ph name="FILE_NAME" /> a été bloqué par la Protection Avancée.</translation> <translation id="1464258312790801189">Vos comptes</translation> <translation id="1465176863081977902">C&opier l'adresse audio</translation> <translation id="1465827627707997754">Part de pizza</translation> @@ -378,7 +380,7 @@ <translation id="1567750922576943685">La validation de votre identité contribue à protéger vos informations personnelles</translation> <translation id="1567993339577891801">Console JavaScript</translation> <translation id="1568323446248056064">Ouvrir les paramètres de l'écran</translation> -<translation id="1572139610531470719"><ph name="WINDOW_TITLE" /> (Invité)</translation> +<translation id="1572139610531470719"><ph name="WINDOW_TITLE" /> (invité)</translation> <translation id="1572266655485775982">Activation du Wi-Fi</translation> <translation id="1572876035008611720">Saisissez votre adresse e-mail</translation> <translation id="1576594961618857597">Avatar blanc par défaut</translation> @@ -528,6 +530,7 @@ <translation id="1781771911845953849">Comptes et synchronisation</translation> <translation id="1782196717298160133">Rechercher votre téléphone</translation> <translation id="1784849162047402014">Peu d'espace disque disponible sur l'appareil</translation> +<translation id="1790194216133135334">Envoyer le lien sur <ph name="DEVICE_NAME" /></translation> <translation id="1792619191750875668">Affichage étendu</translation> <translation id="1794791083288629568">Envoyer des commentaires pour nous aider à résoudre ce problème.</translation> <translation id="1795214765651529549">Utiliser le thème classique</translation> @@ -590,6 +593,7 @@ <translation id="1875312262568496299">Commencer</translation> <translation id="1875387611427697908">Cet élément doit être installé depuis le <ph name="CHROME_WEB_STORE" /></translation> <translation id="1877520246462554164">Échec de l'obtention du jeton d'authentification. Veuillez vous déconnecter, puis vous reconnecter, ou bien réessayez.</translation> +<translation id="1877860345998737529">Attribuer des actions à des commutateurs</translation> <translation id="1879000426787380528">Se connecter à l'aide du compte</translation> <translation id="1880905663253319515">Supprimer le certificat "<ph name="CERTIFICATE_NAME" />" ?</translation> <translation id="1886996562706621347">Permettre aux sites de demander l'autorisation de devenir gestionnaires par défaut des protocoles (recommandé)</translation> @@ -869,7 +873,9 @@ <translation id="230927227160767054">Cette page veut installer un gestionnaire de services</translation> <translation id="2309620859903500144">L'accès à vos capteurs de mouvement ou de lumière a été bloqué pour ce site.</translation> <translation id="2315414688463285945">Erreur lors de la configuration des fichiers Linux. Veuillez réessayer.</translation> +<translation id="2315587498123194634">Envoyer le lien sur <ph name="DEVICE_NAME" /></translation> <translation id="2316129865977710310">Non merci</translation> +<translation id="2316739859433277603">Les recherches lancées depuis le lanceur d'applications utilisent les <ph name="BEGIN_LINK" />paramètres du moteur de recherche<ph name="END_LINK" /> de votre navigateur.</translation> <translation id="2317842250900878657"><ph name="PROGRESS_PERCENT" /> % terminés</translation> <translation id="2318143611928805047">Taille du papier</translation> <translation id="2318817390901984578">Pour utiliser des applications Android, rechargez et mettez à jour votre <ph name="DEVICE_TYPE" />.</translation> @@ -909,6 +915,7 @@ <translation id="2365507699358342471">Ce site peut voir le texte et les images copiés dans le presse-papiers.</translation> <translation id="2367199180085172140">Ajouter un partage de fichiers</translation> <translation id="2367972762794486313">Afficher les applications</translation> +<translation id="2369105924912929484">Activer/Désactiver les contenus de page simplifiés</translation> <translation id="2371076942591664043">Ouvrir une fois le téléchargement &terminé</translation> <translation id="2375406435414127095">Connexion à votre téléphone</translation> <translation id="2377667304966270281">Défauts matériels</translation> @@ -1159,6 +1166,7 @@ <translation id="2739191690716947896">Déboguer</translation> <translation id="2739240477418971307">Modifier vos paramètres d'accessibilité</translation> <translation id="2740393541869613458">examiner les sites Web que l'utilisateur supervisé a consultés ;</translation> +<translation id="2741912629735277980">Afficher l'UI sur l'écran de connexion</translation> <translation id="274290345632688601">Restauration des applications et fichiers Linux</translation> <translation id="2743387203779672305">Copier dans le Presse-papier</translation> <translation id="2745080116229976798">Subordination qualifiée Microsoft</translation> @@ -1232,7 +1240,7 @@ <translation id="284975061945174219">Échec du nettoyage</translation> <translation id="2849936225196189499">Essentielle</translation> <translation id="2850541429955027218">Ajouter un thème</translation> -<translation id="2858138569776157458">Sites prisés</translation> +<translation id="2858138569776157458">Sites populaires</translation> <translation id="2859806420264540918">Ce site affiche des annonces intrusives ou trompeuses.</translation> <translation id="2861301611394761800">Mise à jour terminée. Veuillez redémarrer le système.</translation> <translation id="2861941300086904918">Gestionnaire de sécurité Native Client</translation> @@ -1275,6 +1283,7 @@ <translation id="2910318910161511225">Connectez-vous à un réseau et réessayez</translation> <translation id="2913331724188855103">Autoriser les sites à enregistrer et à lire les données des cookies (recommandé)</translation> <translation id="2915102088417824677">Afficher le journal d'activité</translation> +<translation id="2915873080513663243">Recherche automatique</translation> <translation id="2916073183900451334">La touche TAB permet de sélectionner des liens et d'accéder à des champs de formulaire sur une page Web.</translation> <translation id="2916745397441987255">Rechercher dans les extensions</translation> <translation id="2921081876747860777">Veuillez créer un mot de passe pour protéger vos données locales</translation> @@ -1483,6 +1492,7 @@ <translation id="327147043223061465">Afficher l'ensemble des cookies et données de sites</translation> <translation id="3271648667212143903"><ph name="ORIGIN" /> tente de se connecter</translation> <translation id="3274763671541996799">Le mode plein écran a été activé.</translation> +<translation id="3275778809241512831">Votre clé de sécurité interne n'est plus sécurisée. Veuillez la supprimer dans tous les services avec lesquels vous l'utilisez. Pour résoudre ce problème, veuillez réinitialiser la clé de sécurité.</translation> <translation id="3275778913554317645">Ouvrir dans une fenêtre</translation> <translation id="3278001907972365362">Vos comptes Google nécessitent votre attention</translation> <translation id="3279230909244266691">Cette opération peut prendre quelques minutes. Démarrage de la machine virtuelle…</translation> @@ -1575,6 +1585,7 @@ <translation id="3412265149091626468">Aller à la sélection</translation> <translation id="3413122095806433232">Émetteurs de l'autorité de certification : <ph name="LOCATION" /></translation> <translation id="3414952576877147120">Taille :</translation> +<translation id="3420501302812554910">Une réinitialisation est requise pour la clé de sécurité interne</translation> <translation id="3421387094817716717">Clé publique de la courbe elliptique</translation> <translation id="3423463006624419153">Sur votre <ph name="PHONE_NAME_1" /> et votre <ph name="PHONE_NAME_2" /> :</translation> <translation id="3423858849633684918">Veuillez relancer <ph name="PRODUCT_NAME" />.</translation> @@ -1603,8 +1614,9 @@ <translation id="3450157232394774192">Taux d'occupation en veille</translation> <translation id="3453612417627951340">Autorisation requise</translation> <translation id="3454157711543303649">Activation effectuée</translation> +<translation id="3454213325559396544">C'est la dernière mise à jour logicielle de sécurité automatique pour votre <ph name="DEVICE_TYPE" />. Pour bénéficier des futures mises à jour, passez à un modèle plus récent.</translation> <translation id="345693547134384690">Ouvrir l'&image dans un nouvel onglet</translation> -<translation id="3457500881955698515">Votre entreprise ou votre organisation exige que cet appareil soit mis à jour immédiatement</translation> +<translation id="3457500881955698515">Votre entreprise ou organisation exige que cet appareil soit mis à jour immédiatement</translation> <translation id="3459509316159669723">Impression</translation> <translation id="3459697287128633276">Pour accéder au Google Play Store avec votre compte, authentifiez-vous à l'aide de votre fournisseur d'identité.</translation> <translation id="3459774175445953971">Dernière modification :</translation> @@ -1673,7 +1685,7 @@ <translation id="3552780134252864554">Effacé en fin de session</translation> <translation id="3555812735919707620">Supprimer l'extension</translation> <translation id="3556000484321257665">Votre moteur de recherche a été remplacé par <ph name="URL" />.</translation> -<translation id="3557101512409028104">Définissez des restrictions liées aux sites Web et des limites relatives au temps d'utilisation avec Family Link</translation> +<translation id="3557101512409028104">Définissez des restrictions liées aux sites Web et des limites de temps d'utilisation avec Family Link</translation> <translation id="3559262020195162408">Échec de l'installation de la règle sur l'appareil.</translation> <translation id="3560034655160545939">&Correcteur orthographique</translation> <translation id="3562423906127931518">Cette opération peut prendre quelques minutes. Configuration du conteneur Linux…</translation> @@ -1760,6 +1772,7 @@ <translation id="3672681487849735243">Une erreur a été détectée dans la configuration d'usine</translation> <translation id="367645871420407123">N'indiquez rien si vous voulez définir le mot de passe racine sur la valeur d'image test par défaut.</translation> <translation id="3677657024345889897">Volume minimal</translation> +<translation id="3677911431265050325">Demander le site mobile</translation> <translation id="3678156199662914018">Extension : <ph name="EXTENSION_NAME" /></translation> <translation id="3681311097828166361">Merci de vos commentaires. Vous êtes hors connexion pour le moment, et votre rapport sera envoyé plus tard.</translation> <translation id="3682824389861648626">Seuil de mouvement</translation> @@ -2144,6 +2157,12 @@ <translation id="4242577469625748426">Échec de l'installation des paramètres des règles sur l'appareil : <ph name="VALIDATION_ERROR" />.</translation> <translation id="4244238649050961491">Trouver plus d'applications de stylet</translation> <translation id="424726838611654458">Toujours ouvrir dans Adobe Reader</translation> +<translation id="4247274662191902962">Les données du capteur ne seront partagées que durant l'expérience de réalité virtuelle. Le site peut retenir certaines informations vous concernant, par exemple : + – Votre position + – Vos caractéristiques physiques, par exemple la position de vos yeux + – Vos mouvements, par exemple votre démarche + + N'autorisez l'accès que si vous faites confiance à ce site.</translation> <translation id="4247901771970415646">Impossible de synchroniser avec <ph name="USERNAME" /></translation> <translation id="4249248555939881673">Connexion réseau en attente…</translation> <translation id="4249373718504745892">L'accès à votre caméra et à votre micro est bloqué pour cette page</translation> @@ -2206,6 +2225,7 @@ <translation id="4350019051035968019">Impossible d'enregistrer cet appareil dans le domaine auquel appartient votre compte, car il est marqué pour être géré par un autre domaine.</translation> <translation id="4354344420232759511">Les sites que vous consultez s'affichent ici</translation> <translation id="435527878592612277">Sélectionner votre photo</translation> +<translation id="4358313196493694334">Stabiliser la position du curseur</translation> <translation id="4359408040881008151">Installée, car une ou plusieurs extensions dépendent de celle-ci.</translation> <translation id="4359717112757026264">Paysage urbain</translation> <translation id="4361142739114356624">La clé privée de ce certificat client est manquante ou incorrecte</translation> @@ -2330,6 +2350,7 @@ <translation id="4558426062282641716">Autorisation de lancement automatique demandée</translation> <translation id="4558491878126948419">Recevez des conseils sur les appareils <ph name="DEVICE_TYPE" />, restez informé sur les produits Google et partagez vos commentaires. Sachez que vous pouvez vous désabonner à tout moment.</translation> <translation id="4559617833001311418">Ce site accède à vos capteurs de mouvement ou de lumière.</translation> +<translation id="4561098487691395071">Vous pouvez également préciser le fichier PPD correspondant à votre imprimante</translation> <translation id="4562155214028662640">Ajouter empreinte digitale</translation> <translation id="4563880231729913339">Doigt 3</translation> <translation id="4565377596337484307">Masquer le mot de passe</translation> @@ -2574,6 +2595,7 @@ <translation id="494286511941020793">Aide pour la configuration de proxy</translation> <translation id="4943368462779413526">Football américain</translation> <translation id="4943691134276646401">"<ph name="CHROME_EXTENSION_NAME" />" tente de se connecter à un port de série</translation> +<translation id="4944310289250773232">Ce service d'authentification est hébergé par <ph name="SAML_DOMAIN" /></translation> <translation id="495170559598752135">Actions</translation> <translation id="4953689047182316270">Répondre aux événements d'accessibilité</translation> <translation id="4953808748584563296">Avatar orange par défaut</translation> @@ -2592,7 +2614,7 @@ <translation id="4973307593867026061">Ajouter des imprimantes</translation> <translation id="4973325300212422370">{NUM_TABS,plural, =1{Couper le son du site}one{Couper le son du site}other{Couper le son des sites}}</translation> <translation id="4974733135013075877">Fermer et activer le verrouillage enfant</translation> -<translation id="4976795213394241669">{0,plural, =0{Mettre à jour}=1{Mettre à jour d'ici 1 seconde}one{Mettre à jour d'ici # seconde}other{Mettre à jour d'ici # secondes}}</translation> +<translation id="4976795213394241669">{0,plural, =0{Mettre à jour tout de suite}=1{Mettre à jour d'ici 1 seconde}one{Mettre à jour d'ici # seconde}other{Mettre à jour d'ici # secondes}}</translation> <translation id="4977942889532008999">Confirmer l'accès</translation> <translation id="4980805016576257426">Cette extension contient des logiciels malveillants.</translation> <translation id="4981449534399733132">Pour effacer les données de navigation sur tous vos appareils synchronisés et dans votre compte Google, <ph name="BEGIN_LINK" />connectez-vous<ph name="END_LINK" />.</translation> @@ -2624,7 +2646,7 @@ <translation id="5029568752722684782">Effacer la copie</translation> <translation id="5030338702439866405">Émis par</translation> <translation id="5033266061063942743">Formes géométriques</translation> -<translation id="5033619151015094114">Votre entreprise ou votre organisation exige que cet appareil soit mis à jour</translation> +<translation id="5033619151015094114">Votre entreprise ou organisation exige que cet appareil soit mis à jour</translation> <translation id="503498442187459473"><ph name="HOST" /> souhaite utiliser votre appareil photo et votre micro</translation> <translation id="5036662165765606524">N'autoriser le téléchargement automatique de plusieurs fichiers pour aucun site</translation> <translation id="5037676449506322593">Tout sélectionner</translation> @@ -2666,6 +2688,7 @@ <translation id="5094721898978802975">Communiquer avec les applications natives associées</translation> <translation id="5097002363526479830">Échec de la connexion au réseau "<ph name="NAME" />" : <ph name="DETAILS" />.</translation> <translation id="5101042277149003567">Ouvrir tous les favoris</translation> +<translation id="5101839224773798795">Cliquer automatiquement en cas d'arrêt du curseur</translation> <translation id="5108967062857032718">Paramètres – Supprimer des applications Android</translation> <translation id="5109044022078737958">Mia</translation> <translation id="5111646998522066203">Quitter le mode navigation privée</translation> @@ -3150,10 +3173,11 @@ <translation id="5852112051279473187">Petit problème ! Une erreur est survenue lors de l'inscription de cet appareil. Veuillez réessayer ou contacter votre représentant de l'assistance technique.</translation> <translation id="5852137567692933493">Redémarrer et lancer Powerwash</translation> <translation id="5854912040170951372">Pizza</translation> +<translation id="5855643921295613558">0,6 seconde</translation> <translation id="5855773610748894548">Une erreur liée au module sécurisé s'est produite.</translation> <translation id="5856721540245522153">Activer les fonctionnalités de débogage</translation> <translation id="5857090052475505287">Nouveau dossier</translation> -<translation id="5857171483910641802">Les raccourcis sont proposés en fonction des sites Web que vous consultez souvent</translation> +<translation id="5857171483910641802">Les raccourcis affichés sont des suggestions fondées sur les sites Web que vous consultez souvent</translation> <translation id="5858490737742085133">Terminal</translation> <translation id="585979798156957858">Métadonnées externes</translation> <translation id="5860033963881614850">Désactivé</translation> @@ -3323,7 +3347,7 @@ <translation id="6097480669505687979">Si vous ne libérez pas de l'espace, sachez que des utilisateurs et des données risquent d'être supprimés automatiquement.</translation> <translation id="6100736666660498114">Menu Démarrer</translation> <translation id="6101226222197207147">Nouvelle application (<ph name="EXTENSION_NAME" />) ajoutée.</translation> -<translation id="6102043788063419338">Ce fichier a été bloqué par le Programme Protection Avancée.</translation> +<translation id="6102043788063419338">Ce fichier a été bloqué par la Protection Avancée.</translation> <translation id="6103681770816982672">Avertissement : Vous êtes sur le point de passer à la version développeur</translation> <translation id="6104068876731806426">Comptes Google</translation> <translation id="6104311680260824317">Impossible d'associer l'appareil au domaine. Le serveur n'accepte pas les types de chiffrement Kerberos spécifiés. Pour consulter les paramètres de chiffrement, sélectionnez "Plus d'options".</translation> @@ -3439,6 +3463,7 @@ <translation id="6279183038361895380">Appuyez sur |<ph name="ACCELERATOR" />| pour afficher le curseur.</translation> <translation id="6280215091796946657">Se connecter avec un autre compte</translation> <translation id="6280912520669706465">ARC</translation> +<translation id="628352644014831790">4 secondes</translation> <translation id="6285120108426285413"><ph name="FILE_NAME" /> n'est pas un fichier couramment téléchargé. Il est peut-être dangereux.</translation> <translation id="6285120908535925801">{NUM_PRINTER,plural, =1{Nouvelle imprimante sur le réseau}one{Nouvelle imprimante sur le réseau}other{Nouvelles imprimantes sur le réseau}}</translation> <translation id="6286708577777130801">Détails du mot de passe enregistré</translation> @@ -3645,6 +3670,7 @@ <translation id="6612358246767739896">Contenu protégé</translation> <translation id="6613452264606394692">Revenez facilement sur cette page en l'ajoutant à vos favoris</translation> <translation id="6615455863669487791">Démonstration</translation> +<translation id="6617100836880592260">Vitesse de recherche : <ph name="SPEED_WITH_UNITS" /></translation> <translation id="6618097958368085618">Conserver quand même</translation> <translation id="6619058681307408113">Line Printer Daemon (LPD)</translation> <translation id="661907246513853610">Le site peut vous localiser</translation> @@ -4459,6 +4485,7 @@ <translation id="7831491651892296503">Erreur lors de la configuration du réseau</translation> <translation id="7831754656372780761"><ph name="TAB_TITLE" /> <ph name="EMOJI_MUTING" /></translation> <translation id="7832084384634357321">Heure de fin</translation> +<translation id="783214144752121388">Empêcher les sites d'exécuter Flash (recommandé)</translation> <translation id="7833720883933317473">Les mots personnalisés enregistrés s'afficheront ici</translation> <translation id="7835178595033117206">Favori supprimé</translation> <translation id="7837776265184002579">Votre page d'accueil a été remplacée par <ph name="URL" />.</translation> @@ -4470,8 +4497,8 @@ <translation id="7847212883280406910">Appuyez sur Ctrl+Alt+S pour passer à <ph name="IDS_SHORT_PRODUCT_OS_NAME" />.</translation> <translation id="7849264908733290972">Ouvrir l'&image dans un nouvel onglet</translation> <translation id="784934925303690534">Période</translation> -<translation id="7850222546481862746"><ph name="BEGIN_PARAGRAPH1" />Pour finaliser la configuration de la supervision sur cet appareil, vous devez vous déconnecter du compte de <ph name="USER_NAME" />.<ph name="END_PARAGRAPH1" /> - <ph name="BEGIN_PARAGRAPH2" />Vous pouvez gérer le contrôle parental concernant votre enfant en installant Family Link pour les parents sur votre propre appareil.<ph name="END_PARAGRAPH2" /></translation> +<translation id="7850222546481862746"><ph name="BEGIN_PARAGRAPH1" />Pour terminer de configurer la supervision sur cet appareil, vous devez vous déconnecter du compte de <ph name="USER_NAME" />.<ph name="END_PARAGRAPH1" /> + <ph name="BEGIN_PARAGRAPH2" />Vous pouvez gérer le contrôle parental pour votre enfant en installant Family Link pour les parents sur votre propre appareil.<ph name="END_PARAGRAPH2" /></translation> <translation id="7851457902707056880">La connexion a été limitée au seul compte du propriétaire. Veuillez redémarrer et vous connecter à ce compte. L'appareil redémarrera automatiquement dans 30 secondes.</translation> <translation id="7851716364080026749">Toujours bloquer l'accès à la caméra et au micro</translation> <translation id="7853747251428735">Plus d'outi&ls</translation> @@ -4514,6 +4541,7 @@ <translation id="7911118814695487383">Linux</translation> <translation id="7912080627461681647">Votre mot de passe a été modifié sur le serveur. Veuillez vous déconnecter, puis vous reconnecter.</translation> <translation id="7915471803647590281">Veuillez nous indiquer ce qu'il se passe avant d'envoyer votre rapport.</translation> +<translation id="7919210519031517829"><ph name="DURATION" /> s</translation> <translation id="792514962475806987">Niveau de zoom ancré :</translation> <translation id="7925247922861151263">Échec de la vérification AAA</translation> <translation id="7925285046818567682">En attente de <ph name="HOST_NAME" />...</translation> @@ -4571,6 +4599,7 @@ <translation id="7987814697832569482">Toujours se connecter via ce VPN</translation> <translation id="798835209536175951">Envoyez et recevez des SMS depuis votre Chromebook. <ph name="LINK_BEGIN" />En savoir plus<ph name="LINK_END" /></translation> <translation id="7988355189918024273">Activer les fonctionnalités d'accessibilité</translation> +<translation id="7991296728590311172">Paramètres de Switch Access</translation> <translation id="7994702968232966508">Méthode EAP</translation> <translation id="7997826902155442747">Priorité de traitement</translation> <translation id="7999229196265990314">Les fichiers suivants ont été créés : @@ -4784,6 +4813,8 @@ <translation id="8308179586020895837">Demander si l'accès à votre caméra est requis sur <ph name="HOST" /></translation> <translation id="830868413617744215">Bêta</translation> <translation id="8309458809024885768">Ce certificat existe déjà</translation> +<translation id="8314381333424235892">Extension manquante ou non installée</translation> +<translation id="8316618172731049784">Envoyer sur l'appareil : <ph name="DEVICE_NAME" /></translation> <translation id="8317671367883557781">Ajouter une connexion réseau</translation> <translation id="8319414634934645341">Utilisation étendue de la clé</translation> <translation id="8320459152843401447">L'intégralité de votre écran</translation> @@ -4940,6 +4971,7 @@ <translation id="8588866096426746242">Afficher les statistiques du profil</translation> <translation id="8588868914509452556"><ph name="WINDOW_TITLE" /> – RV diffusée sur un casque</translation> <translation id="8590375307970699841">Configurer les mises à jour automatiques</translation> +<translation id="8591783563402255548">1 seconde</translation> <translation id="8592141010104017453">N'afficher aucune notification</translation> <translation id="8593121833493516339">Envoyer des données d'utilisation et de diagnostic. Contribuez à l'amélioration de l'expérience de votre enfant sur Android en envoyant automatiquement à Google des données relatives aux diagnostics et à l'utilisation de l'appareil et des applications. Ces informations ne seront pas utilisées pour identifier votre enfant, mais elles nous aideront à améliorer, entre autres, la stabilité du système et des applications. Certaines données globales seront également utiles aux développeurs des applications Google et à nos partenaires, tels que les développeurs Android. Si vous activez le paramètre relatif à l'activité supplémentaire sur le Web et les applications pour votre enfant, ces données peuvent être enregistrées dans son compte Google. <ph name="BEGIN_LINK1" />En savoir plus<ph name="END_LINK1" /></translation> <translation id="8594908476761052472">Enregistrer une vidéo</translation> @@ -4969,6 +5001,7 @@ <translation id="8637688295594795546">Mise à jour du système disponible. Préparation du téléchargement…</translation> <translation id="8639047128869322042">Recherche de logiciels malveillants…</translation> <translation id="8642171459927087831">Jeton d'accès</translation> +<translation id="8642900771896232685">2 secondes</translation> <translation id="8642947597466641025">Augmente la taille du texte</translation> <translation id="8643418457919840804">Pour continuer, sélectionnez une option :</translation> <translation id="8644655801811752511">Impossible de réinitialiser cette clé de sécurité. Essayez de la réinitialiser immédiatement après l’avoir insérée.</translation> @@ -5143,7 +5176,7 @@ <translation id="8871974300055371298">Paramètres du contenu</translation> <translation id="8872155268274985541">Fichier manifeste de mise à jour externe de kiosque non valide. Échec de la mise à jour de l'application kiosque. Veuillez débrancher la clé USB.</translation> <translation id="8874184842967597500">Non connecté</translation> -<translation id="887550310442005096">Votre entreprise ou votre organisation vous demande de mettre à jour cet appareil</translation> +<translation id="887550310442005096">Votre entreprise ou organisation vous demande de mettre à jour cet appareil</translation> <translation id="8876307312329369159">Impossible de modifier ce paramètre dans une session de démonstration.</translation> <translation id="8877448029301136595">[répertoire parent]</translation> <translation id="8879284080359814990">Afficher dan&s un onglet</translation> @@ -5170,6 +5203,7 @@ <translation id="8910222113987937043">Les modifications apportées à vos favoris, à votre historique, à vos mots de passe et à d'autres paramètres ne seront plus synchronisées avec votre compte Google. Cependant, les données déjà stockées sur votre compte Google y seront conservées et pourront être gérées dans le <ph name="BEGIN_LINK" />Google Dashboard<ph name="END_LINK" />.</translation> <translation id="8912362522468806198">Compte Google</translation> <translation id="8912793549644936705">Étirer</translation> +<translation id="8912810933860534797">Activer la recherche automatique</translation> <translation id="891365694296252935">Envoyer des données d'utilisation et de diagnostic. À l'heure actuelle, cet appareil envoie automatiquement à Google des données relatives aux diagnostics et à l'utilisation de l'appareil et des applications. Ces informations ne seront pas utilisées pour identifier votre enfant, mais elles nous aideront à améliorer, entre autres, la stabilité du système et des applications. Certaines données globales seront également utiles aux développeurs des applications Google et à nos partenaires, tels que les développeurs Android. Ce paramètre est appliqué par le propriétaire. Si vous activez le paramètre relatif à l'activité supplémentaire sur le Web et les applications pour votre enfant, ces données peuvent être enregistrées dans son compte Google. <ph name="BEGIN_LINK1" />En savoir plus<ph name="END_LINK1" /></translation> <translation id="8915370057835397490">Chargement des suggestions en cours…</translation> <translation id="8916476537757519021">Sous-cadre de navigation privée : <ph name="SUBFRAME_SITE" /></translation> @@ -5322,6 +5356,7 @@ <translation id="9153934054460603056">Enregistrer l'authentification et le mot de passe</translation> <translation id="9154194610265714752">Mis à jour</translation> <translation id="91568222606626347">Créer un raccourci…</translation> +<translation id="9157096865782046368">0,8 seconde</translation> <translation id="9157697743260533322">Échec de la configuration des mises à jour automatiques pour tous les utilisateurs (erreur de lancement avant la période de diffusion : <ph name="ERROR_NUMBER" />)</translation> <translation id="9158715103698450907">Petit problème… Une erreur de communication réseau s'est produite lors de l'authentification. Veuillez vérifier votre connexion réseau, puis réessayer.</translation> <translation id="916607977885256133">Picture-in-picture</translation>
diff --git a/chrome/app/resources/generated_resources_gu.xtb b/chrome/app/resources/generated_resources_gu.xtb index b4ac0c3..35cdee0 100644 --- a/chrome/app/resources/generated_resources_gu.xtb +++ b/chrome/app/resources/generated_resources_gu.xtb
@@ -2140,6 +2140,12 @@ <translation id="4242577469625748426">આ ઉપકરણ પર નીતિ સેટિંગ્સ ઇન્સ્ટોલ કરવામાં નિષ્ફળ ગયું: <ph name="VALIDATION_ERROR" />.</translation> <translation id="4244238649050961491">વધુ સ્ટાઇલસ ઍપ મેમરીનો શોધો</translation> <translation id="424726838611654458">હંમેશાં Adobe Reader માં ખોલો</translation> +<translation id="4247274662191902962">તમે આ VR અનુભવમાં હશો, ત્યારે જ સેન્સરનો ડેટા શેર કરવામાં આવશે. આ સાઇટ અમુક ચોક્કસ માહિતીનો ઉપયોગ કરીને કદાચ તમારા વિશેની માહિતી મેળવી શકશે, જેમ કે: + - તમારું સ્થાન + - તમારી શારીરિક લાક્ષણિકતાઓ, જેમ કે તમારી આંખની સ્થિતિ + - તમારું હલનચલન, જેમ કે તમારી ચાલવાની રીત + + તમે ઍક્સેસ માટે મંજૂરી આપો તે પહેલાં ખાતરી કરો કે તમે આ સાઇટ પર વિશ્વાસ મૂકો છો.</translation> <translation id="4247901771970415646"><ph name="USERNAME" /> સાથે સિંક કરી શકાતું નથી</translation> <translation id="4249248555939881673">નેટવર્ક કનેક્શનની રાહ જોઈ રહ્યાં છે...</translation> <translation id="4249373718504745892">આ પૃષ્ઠને તમારા કૅમેરા અને માઇક્રોફોનને ઍક્સેસ કરવાથી અવરોધિત કરવામાં આવ્યું છે.</translation>
diff --git a/chrome/app/resources/generated_resources_hi.xtb b/chrome/app/resources/generated_resources_hi.xtb index f31d5871..d9d221e 100644 --- a/chrome/app/resources/generated_resources_hi.xtb +++ b/chrome/app/resources/generated_resources_hi.xtb
@@ -1604,7 +1604,7 @@ <translation id="3453612417627951340">अनुमति की ज़रुरत है</translation> <translation id="3454157711543303649">चालू करना पूरा हुआ</translation> <translation id="345693547134384690">नए टैब में &छवि खोलें</translation> -<translation id="3457500881955698515">आपकी कंपनी या संगठन को यह डिवाइस तुरंत अपडेट करना होगा</translation> +<translation id="3457500881955698515">आपकी कंपनी या संगठन को इस डिवाइस के अपडेट की तुरंत ज़रुरत है</translation> <translation id="3459509316159669723">प्रिंट करना</translation> <translation id="3459697287128633276">Google Play स्टोर एक्सेस करने को अपना खाता चालू करने के लिए, कृपया अपनी पहचान देने वाली सेवा के ज़रिए पुष्टि करें.</translation> <translation id="3459774175445953971">अंतिम बार संशोधित:</translation> @@ -2143,6 +2143,12 @@ <translation id="4242577469625748426">डिवाइस पर नीति सेटिंग इंस्टॉल करने में विफल रहा: <ph name="VALIDATION_ERROR" />.</translation> <translation id="4244238649050961491">और ज़्यादा स्टाइलस ऐप ढूंढें</translation> <translation id="424726838611654458">हमेशा Adobe Reader में खोलें</translation> +<translation id="4247274662191902962">कुछ सेंसर डेटा को तब ही शेयर किया जाएगा जब आप इस VR अनुभव में होंगे. खास जानकारी का इस्तेमाल करके साइट आपको पहचान सकती है, जैसे: + - आपकी जगह की जानकारी + - आपकी शारीरिक बनावट, जैसे कि आँखों की स्थिति + - आपकी गतिविधि, जैसे कि आप कैसे चलते हैं + + एक्सेस देने से पहले इस बात की पुष्टि कर लें कि आप इस साइट पर भरोसा करते हैं.</translation> <translation id="4247901771970415646"><ph name="USERNAME" /> से सिंक नहीं किया जा सकता</translation> <translation id="4249248555939881673">नेटवर्क कनेक्शन के लिए प्रतीक्षारत...</translation> <translation id="4249373718504745892">इस पेज को आपके कैमरे और माइक्रोफ़ोन को एक्सेस करने से अवरोधित कर दिया गया है.</translation> @@ -2175,7 +2181,7 @@ <translation id="4289540628985791613">संक्षिप्त विवरण</translation> <translation id="4291934469232591280">वर्शन: <ph name="VERSION" /></translation> <translation id="4295072614469448764">ऐप्लिकेशन आपके 'टर्मिनल' में उपलब्ध है. आपके 'लॉन्चर' में एक आइकॉन भी मौजूद हो सकता है.</translation> -<translation id="4295979599050707005">कृपया साइन इन करके यह पुष्टि करें कि आपका खाता <ph name="USER_EMAIL" /> वेबसाइट, ऐप्लिकेशन, और Chrome या Google Play के एक्सटेंशन के लिए इस्तेमाल किया जा सकता है. आप यह खाता हटा भी सकते हैं. <ph name="LINK_BEGIN" />ज़्यादा जानें<ph name="LINK_END" /></translation> +<translation id="4295979599050707005">कृपया साइन इन करके यह पुष्टि करें कि आपका खाता <ph name="USER_EMAIL" /> वेबसाइट, ऐप्लिकेशन और Chrome या Google Play के एक्सटेंशन के लिए इस्तेमाल किया जा सकता है. आप यह खाता हटा भी सकते हैं. <ph name="LINK_BEGIN" />ज़्यादा जानें<ph name="LINK_END" /></translation> <translation id="4296575653627536209">'निगरानी में रखा गया उपयोगकर्ता' जोड़ें</translation> <translation id="4297219207642690536">रीस्टार्ट करें और रीसेट करें</translation> <translation id="4297322094678649474">भाषाएं बदलें</translation> @@ -2623,7 +2629,7 @@ <translation id="5029568752722684782">स्पष्ट कॉपी</translation> <translation id="5030338702439866405">जारीकर्ता</translation> <translation id="5033266061063942743">जियोमेट्री (रेखागणित) के आकार</translation> -<translation id="5033619151015094114">आपकी कंपनी या संगठन को यह डिवाइस अपडेट करना होगा</translation> +<translation id="5033619151015094114">आपकी कंपनी या संगठन को इस डिवाइस के अपडेट की ज़रुरत है</translation> <translation id="503498442187459473"><ph name="HOST" /> आपके कैमरा और माइक्रोफ़ोन का उपयोग करना चाहता है</translation> <translation id="5036662165765606524">किसी भी साइट को स्वचालित रूप से एकाधिक फ़ाइलें डाउनलोड न करने दें</translation> <translation id="5037676449506322593">सभी को चुनें</translation> @@ -3109,7 +3115,7 @@ <translation id="5785583009707899920">Chrome की फ़ाइल सुविधाएं</translation> <translation id="5787146423283493983">मुख्य अनुबंध</translation> <translation id="5788367137662787332">क्षमा करें, डिवाइस <ph name="DEVICE_LABEL" /> पर कम-से-कम एक विभाजन माउंट नहीं हो सका.</translation> -<translation id="5792728279623964091">पावर बटन पर टैप करें</translation> +<translation id="5792728279623964091">'पावर बटन' पर टैप करें</translation> <translation id="5793339252089865437">अगर आप अपने मोबाइल नेटवर्क पर अपडेट डाउनलोड करते हैं, तो इसकी वजह से आपको ज़्यादा शुल्क का भुगतान करना पड़ सकता है.</translation> <translation id="5794414402486823030">हमेशा सिस्टम व्यूअर से खोलें</translation> <translation id="5794786537412027208">सभी Chrome Apps से बाहर निकलें</translation> @@ -3659,7 +3665,7 @@ <translation id="6641138807883536517">बिना किसी क्रम से जनरेट किया गया सुरक्षित मॉड्यूल पासवर्ड उपलब्ध नहीं है. Powerwash के बाद आमतौर पर ऐसा होता है.</translation> <translation id="6643016212128521049">साफ़ करें</translation> <translation id="6644512095122093795">पासवर्ड सेव करने की पेशकश करें</translation> -<translation id="6644513150317163574">यूआरएल फ़ॉर्मैट अमान्य हैं एसएसओ (SSO) प्रमाणीकरण का इस्तेमाल होने पर सर्वर को होस्ट नाम के तौर पर लिखा जाना चाहिए.</translation> +<translation id="6644513150317163574">यूआरएल फ़ॉर्मैट अमान्य है एसएसओ (SSO) प्रमाणीकरण का इस्तेमाल होने पर सर्वर को होस्ट नाम के तौर पर लिखा जाना चाहिए.</translation> <translation id="6644846457769259194">आपका डिवाइस अपडेट हो रहा है (<ph name="PROGRESS_PERCENT" />)</translation> <translation id="6645437135153136856">चुना गया 'Google क्लाउड प्रिंट' डिवाइस अब काम नहीं करता है. <ph name="BR" /> अपने कंप्यूटर की सिस्टम सेटिंग में जाकर प्रिंटर सेटअप करके देखें.</translation> <translation id="6647228709620733774">Netscape प्रमाणन प्राधिकरण खण्डन यूआरएल</translation> @@ -5191,7 +5197,7 @@ <translation id="8948939328578167195"><ph name="WEBSITE" /> आपकी सुरक्षा कुंजी के निर्माता और मॉडल को देखना चाहती है</translation> <translation id="8951256747718668828">गड़बड़ी की वजह से इंपोर्ट पूरा नहीं किया जा सका</translation> <translation id="895347679606913382">प्रारंभ कर रहा है...</translation> -<translation id="8956941634583033512">{0,plural, =1{एक दिन में अपडेट करें}one{# दिनों में अपडेट करें}other{# दिनों में अपडेट करें}}</translation> +<translation id="8956941634583033512">{0,plural, =1{एक दिन में अपडेट करें}one{# दिन में अपडेट करें}other{# दिन में अपडेट करें}}</translation> <translation id="895944840846194039">JavaScript मेमोरी</translation> <translation id="8959810181433034287">'निगरानी में रखे गए उपयोगकर्ता' को साइन इन करने के लिए इस पासवर्ड की ज़रूरत होगी इसलिए एक सुरक्षित पासवर्ड चुनें. यह पासवर्ड 'निगरानी में रखे गए उपयोगकर्ता' को बताना न भूलें.</translation> <translation id="8962083179518285172">विवरण छुपाएं</translation>
diff --git a/chrome/app/resources/generated_resources_hr.xtb b/chrome/app/resources/generated_resources_hr.xtb index 56f9878..6fb68da 100644 --- a/chrome/app/resources/generated_resources_hr.xtb +++ b/chrome/app/resources/generated_resources_hr.xtb
@@ -1,6 +1,7 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="hr"> +<translation id="1002469766576243227">Tu uslugu provjere autentičnosti hostira <ph name="EXTENSION_NAME" /></translation> <translation id="1003088604756913841">Otvori vezu u novom prozoru aplikacije <ph name="APP" /></translation> <translation id="1004218526896219317">Pristup web-lokaciji</translation> <translation id="1005274289863221750">upotrijebiti vaš mikrofon i kameru</translation> @@ -289,6 +290,7 @@ <translation id="1429300045468813835">Sve je izbrisano</translation> <translation id="143027896309062157">čitati i mijenjati sve vaše podatke na računalu i s posjećenih web-lokacija</translation> <translation id="1430915738399379752">Ispis</translation> +<translation id="1431188203598586230">Zadnje ažuriranje softvera</translation> <translation id="1432581352905426595">Upravljaj tražilicama</translation> <translation id="1433811987160647649">Pitaj prije pristupanja</translation> <translation id="1434696352799406980">Polazna stranica, web-stranica nove kartice, tražilica i prikvačene kartice vratit će se na zadano. Onemogućit će se sva proširenja i izbrisati privremeni podaci kao što su kolačići. Vaše oznake, povijest i spremljene zaporke neće se izbrisati.</translation> @@ -528,6 +530,7 @@ <translation id="1781771911845953849">Računi i sinkronizacija</translation> <translation id="1782196717298160133">Pronalaženje vašeg telefona</translation> <translation id="1784849162047402014">Na uređaju nema dovoljno prostora</translation> +<translation id="1790194216133135334">Pošalji vezu na <ph name="DEVICE_NAME" /></translation> <translation id="1792619191750875668">Prošireni zaslon</translation> <translation id="1794791083288629568">Pošaljite povratne informacije da biste nam pomogli riješiti taj problem.</translation> <translation id="1795214765651529549">Koristi klasičnu</translation> @@ -590,6 +593,7 @@ <translation id="1875312262568496299">Započni</translation> <translation id="1875387611427697908">Može se dodati jedino s usluge <ph name="CHROME_WEB_STORE" /></translation> <translation id="1877520246462554164">Dohvaćanje oznake za autentifikaciju nije uspjelo. Odjavite se pa se opet prijavite da biste pokušali ponovo.</translation> +<translation id="1877860345998737529">Dodjela prekidača radnjama</translation> <translation id="1879000426787380528">Prijavite se kao</translation> <translation id="1880905663253319515">Izbrisati certifikat "<ph name="CERTIFICATE_NAME" />"?</translation> <translation id="1886996562706621347">Dopusti web-lokacijama traženje dopuštenja da postanu zadani rukovatelji za protokole (preporučeno)</translation> @@ -869,7 +873,9 @@ <translation id="230927227160767054">Ova stranica želi instalirati rukovatelja usluge.</translation> <translation id="2309620859903500144">Web-lokaciji je zabranjen pristup vašim senzorima pokreta ili svjetla.</translation> <translation id="2315414688463285945">Pogreška tijekom konfiguracije Linux datoteka. Pokušajte ponovo.</translation> +<translation id="2315587498123194634">Pošalji vezu na <ph name="DEVICE_NAME" /></translation> <translation id="2316129865977710310">Ne, hvala</translation> +<translation id="2316739859433277603">Pretraživanja iz pokretača aplikacija upotrebljavaju <ph name="BEGIN_LINK" />postavku tražilice<ph name="END_LINK" /> vašeg preglednika.</translation> <translation id="2317842250900878657"><ph name="PROGRESS_PERCENT" />% dovršeno</translation> <translation id="2318143611928805047">Veličina papira</translation> <translation id="2318817390901984578">Da biste upotrebljavali Android aplikacije, napunite i ažurirajte svoj <ph name="DEVICE_TYPE" />.</translation> @@ -909,6 +915,7 @@ <translation id="2365507699358342471">Ova web-lokacija može vidjeti tekst i slike kopirane u međuspremnik.</translation> <translation id="2367199180085172140">Dodaj dijeljenje datoteka</translation> <translation id="2367972762794486313">Prikaz aplikacija</translation> +<translation id="2369105924912929484">Isključi/uključi sažeti sadržaj web-stranice</translation> <translation id="2371076942591664043">Otvori nakon &dovršetka</translation> <translation id="2375406435414127095">Povežite se s telefonom</translation> <translation id="2377667304966270281">Pogreške tvrdog diska</translation> @@ -1159,6 +1166,7 @@ <translation id="2739191690716947896">Otkloni pogrešku</translation> <translation id="2739240477418971307">promijeniti postavke pristupačnosti</translation> <translation id="2740393541869613458">pregledavati web-lokacije koje je nadzirani korisnik posjetio i</translation> +<translation id="2741912629735277980">Prikaži korisničko sučelje na zaslonu za prijavu</translation> <translation id="274290345632688601">Vraćanje Linux aplikacija i datoteka</translation> <translation id="2743387203779672305">Kopiraj u međuspremnik</translation> <translation id="2745080116229976798">Microsoftova kvalificirana podređenost</translation> @@ -1275,6 +1283,7 @@ <translation id="2910318910161511225">Povežite se s mrežom i pokušajte ponovo</translation> <translation id="2913331724188855103">Dopusti web-lokacijama da spremaju i čitaju podatke kolačića (preporučeno)</translation> <translation id="2915102088417824677">Pregledajte zapisnik aktivnosti</translation> +<translation id="2915873080513663243">Automatsko traženje</translation> <translation id="2916073183900451334">Pritiskom na Tab na web-stranici ističu se veze, isto kao i iz polja</translation> <translation id="2916745397441987255">Pretražite proširenja</translation> <translation id="2921081876747860777">Napravite zaporku da biste zaštitili lokalne podatke.</translation> @@ -1483,6 +1492,7 @@ <translation id="327147043223061465">Pogledajte sve kolačiće i podatke o web-lokaciji</translation> <translation id="3271648667212143903">Web-lokacija <ph name="ORIGIN" /> želi se povezati</translation> <translation id="3274763671541996799">Prešli ste u način prikaza na cijelom zaslonu.</translation> +<translation id="3275778809241512831">Vaš interni sigurnosni ključ trenutačno nije siguran. Uklonite ga iz svih usluga za koje ste ga upotrebljavali. Da biste riješili taj problem, vratite sigurnosni ključ na zadano.</translation> <translation id="3275778913554317645">Otvori kao prozor</translation> <translation id="3278001907972365362">Morate učiniti nešto u vezi sa svojim Google računima</translation> <translation id="3279230909244266691">Taj postupak može potrajati nekoliko minuta. Pokreće se virtualno računalo.</translation> @@ -1575,6 +1585,7 @@ <translation id="3412265149091626468">Skoči na odabir</translation> <translation id="3413122095806433232">CA izdavači: <ph name="LOCATION" /></translation> <translation id="3414952576877147120">Veličina:</translation> +<translation id="3420501302812554910">Potrebno je vratiti interni sigurnosni ključ na zadano</translation> <translation id="3421387094817716717">Javni ključ s eliptičnom krivuljom</translation> <translation id="3423463006624419153">Na telefonima <ph name="PHONE_NAME_1" /> i <ph name="PHONE_NAME_2" />:</translation> <translation id="3423858849633684918">Ponovo pokrenite <ph name="PRODUCT_NAME" /></translation> @@ -1603,6 +1614,7 @@ <translation id="3450157232394774192">Postotak zauzetosti u stanju mirovanja</translation> <translation id="3453612417627951340">Potrebna je autorizacija</translation> <translation id="3454157711543303649">Aktivacija dovršena</translation> +<translation id="3454213325559396544">To je posljednje automatsko ažuriranje softvera i sigurnosno ažuriranje za taj <ph name="DEVICE_TYPE" />. Za buduća ažuriranja potrebna je nadogradnja na noviji model.</translation> <translation id="345693547134384690">Otvori &sliku u novoj &kartici</translation> <translation id="3457500881955698515">Vaša tvrtka ili organizacija zahtijeva trenutačno ažuriranje ovog uređaja</translation> <translation id="3459509316159669723">Ispis</translation> @@ -1760,6 +1772,7 @@ <translation id="3672681487849735243">Otkrivena je tvornička pogreška</translation> <translation id="367645871420407123">ostavite prazno ako želite postaviti korijensku zaporku na zadanu vrijednost testne slike</translation> <translation id="3677657024345889897">Najtiše</translation> +<translation id="3677911431265050325">Zatraži web-lokaciju za mobilne uređaje</translation> <translation id="3678156199662914018">Proširenje: <ph name="EXTENSION_NAME" /></translation> <translation id="3681311097828166361">Zahvaljujemo vam na povratnim informacijama. Trenutačno ste offline, pa će se izvješće poslati kasnije.</translation> <translation id="3682824389861648626">Prag pokreta</translation> @@ -2144,6 +2157,12 @@ <translation id="4242577469625748426">Instalacija postavki pravila nije uspjela na uređaju: <ph name="VALIDATION_ERROR" />.</translation> <translation id="4244238649050961491">Pronađite više aplikacija pisaljke</translation> <translation id="424726838611654458">Uvijek otvaraj u Adobe Readeru</translation> +<translation id="4247274662191902962">Podaci senzora dijelit će se samo dok ste u tom VR doživljaju. Web-lokacija možda može saznati nešto o vama na temelju određenih informacija, na primjer: + – vaše lokacije + – vaših fizičkih značajki, primjerice položaja očiju + – vašeg kretanja, primjerice načina hoda. + + Prije nego što omogućite pristup, provjerite je li ta web-lokacija pouzdana.</translation> <translation id="4247901771970415646">Nije moguće sinkronizirati s korisničkim imenom <ph name="USERNAME" /></translation> <translation id="4249248555939881673">Čekanje mrežne veze...</translation> <translation id="4249373718504745892">Stranici je blokiran pristup vašoj kameri i vašem mikrofonu.</translation> @@ -2206,6 +2225,7 @@ <translation id="4350019051035968019">Uređaj se ne može prijaviti na domenu kojoj pripada vaš račun jer je postavljen za upravljanje na nekoj drugoj domeni.</translation> <translation id="4354344420232759511">Web-lokacije koje posjetite pojavit će se ovdje</translation> <translation id="435527878592612277">Odaberite fotografiju</translation> +<translation id="4358313196493694334">Stabiliziraj lokaciju klika</translation> <translation id="4359408040881008151">Instalirano zbog ovisnih proširenja.</translation> <translation id="4359717112757026264">Gradski krajolik</translation> <translation id="4361142739114356624">Privatni ključ za ovaj certifikat klijenta nedostaje ili nije važeći</translation> @@ -2330,6 +2350,7 @@ <translation id="4558426062282641716">Zatraženo je dopuštenje za automatsko pokretanje</translation> <translation id="4558491878126948419">Saznajte savjete za <ph name="DEVICE_TYPE" /> i novosti o Googleovim proizvodima te dijelite povratne informacije. Pretplatu možete otkazati kad god želite.</translation> <translation id="4559617833001311418">Ova web-lokacija pristupa vašim senzorima pokreta ili svjetla.</translation> +<translation id="4561098487691395071">Ili navedite PPD pisača</translation> <translation id="4562155214028662640">Dodaj otisak prsta</translation> <translation id="4563880231729913339">Treći prst</translation> <translation id="4565377596337484307">Sakrij zaporku</translation> @@ -2574,6 +2595,7 @@ <translation id="494286511941020793">Pomoć za proxy konfiguraciju</translation> <translation id="4943368462779413526">Američki nogomet</translation> <translation id="4943691134276646401">"<ph name="CHROME_EXTENSION_NAME" />" želi se povezati sa serijskim priključkom</translation> +<translation id="4944310289250773232">Tu uslugu provjere autentičnosti hostira <ph name="SAML_DOMAIN" /></translation> <translation id="495170559598752135">Radnje</translation> <translation id="4953689047182316270">Odgovori na događaje pristupačnosti</translation> <translation id="4953808748584563296">Zadani narančasti avatar</translation> @@ -2666,6 +2688,7 @@ <translation id="5094721898978802975">komunicirati sa suradničkim nativnim aplikacijama</translation> <translation id="5097002363526479830">Neuspješno povezivanje s mrežom "<ph name="NAME" />": <ph name="DETAILS" /></translation> <translation id="5101042277149003567">Otvori sve oznake</translation> +<translation id="5101839224773798795">Automatski klikni kada se pokazivač zaustavi</translation> <translation id="5108967062857032718">Postavke – uklanjanje Android aplikacija</translation> <translation id="5109044022078737958">Blanka</translation> <translation id="5111646998522066203">Zatvori anonimnu upotrebu</translation> @@ -3149,6 +3172,7 @@ <translation id="5852112051279473187">Ups! Došlo je do problema prilikom prijavljivanja ovog uređaja. Pokušajte ponovo ili kontaktirajte svog predstavnika podrške.</translation> <translation id="5852137567692933493">Pokreni ponovo i izvrši Powerwash</translation> <translation id="5854912040170951372">Kriška</translation> +<translation id="5855643921295613558">0,6 sekundi</translation> <translation id="5855773610748894548">Ups, pogreška sigurnog modula.</translation> <translation id="5856721540245522153">Omogućivanje značajki za otklanjanje pogrešaka</translation> <translation id="5857090052475505287">Nova mapa</translation> @@ -3438,6 +3462,7 @@ <translation id="6279183038361895380">Pritisnite |<ph name="ACCELERATOR" />| da bi se prikazao pokazivač</translation> <translation id="6280215091796946657">Prijavite se drugim računom</translation> <translation id="6280912520669706465">ARC</translation> +<translation id="628352644014831790">Četiri sekunde</translation> <translation id="6285120108426285413">Datoteka <ph name="FILE_NAME" /> obično se ne preuzima i mogla bi biti opasna.</translation> <translation id="6285120908535925801">{NUM_PRINTER,plural, =1{Novi pisač na vašoj mreži}one{Novi pisači na vašoj mreži}few{Novi pisači na vašoj mreži}other{Novi pisači na vašoj mreži}}</translation> <translation id="6286708577777130801">Podaci o spremljenim zaporkama</translation> @@ -3644,6 +3669,7 @@ <translation id="6612358246767739896">Zaštićeni sadržaj</translation> <translation id="6613452264606394692">Označite ovu stranicu da biste se brzo vratili na nju</translation> <translation id="6615455863669487791">Pokaži mi</translation> +<translation id="6617100836880592260">Brzina traženja: <ph name="SPEED_WITH_UNITS" /></translation> <translation id="6618097958368085618">Svejedno zadrži</translation> <translation id="6619058681307408113">Line Printer Daemon (LPD)</translation> <translation id="661907246513853610">Web-lokacija može pratiti vašu lokaciju</translation> @@ -4458,6 +4484,7 @@ <translation id="7831491651892296503">Pogreška prilikom konfiguriranja mreže</translation> <translation id="7831754656372780761"><ph name="TAB_TITLE" /> <ph name="EMOJI_MUTING" /></translation> <translation id="7832084384634357321">Vrijeme završetka</translation> +<translation id="783214144752121388">Onemogući web-lokacijama pokretanje Flasha (preporučeno)</translation> <translation id="7833720883933317473">Ovdje će se pojaviti spremljene prilagođene riječi</translation> <translation id="7835178595033117206">Oznaka je uklonjena</translation> <translation id="7837776265184002579">Vaša je početna stranica promijenjena u <ph name="URL" />.</translation> @@ -4513,6 +4540,7 @@ <translation id="7911118814695487383">Linux</translation> <translation id="7912080627461681647">Zaporka se promijenila na poslužitelju. Odjavite se pa se ponovo prijavite.</translation> <translation id="7915471803647590281">Recite nam što se događa prije nego što nam pošaljete povratnu informaciju.</translation> +<translation id="7919210519031517829"><ph name="DURATION" /> s</translation> <translation id="792514962475806987">Razina zumiranja za usidreno povećalo:</translation> <translation id="7925247922861151263">Provjera AAA nije uspjela</translation> <translation id="7925285046818567682">Čekanje <ph name="HOST_NAME" />...</translation> @@ -4570,6 +4598,7 @@ <translation id="7987814697832569482">Uvijek se povezuj putem ovog VPN-a</translation> <translation id="798835209536175951">Šaljite i primajte tekstne poruke na Chromebooku. <ph name="LINK_BEGIN" />Saznajte više<ph name="LINK_END" /></translation> <translation id="7988355189918024273">Omogući značajke dostupnosti</translation> +<translation id="7991296728590311172">Postavke prekidača za pristup</translation> <translation id="7994702968232966508">EAP metoda</translation> <translation id="7997826902155442747">Prioritet obrade</translation> <translation id="7999229196265990314">Stvorene su sljedeće datoteke: @@ -4783,6 +4812,8 @@ <translation id="8308179586020895837">Pitaj ako <ph name="HOST" /> želi pristupiti kameri</translation> <translation id="830868413617744215">Beta</translation> <translation id="8309458809024885768">Certifikat već postoji</translation> +<translation id="8314381333424235892">Proširenje nedostaje ili je nevažeće</translation> +<translation id="8316618172731049784">Pošalji na <ph name="DEVICE_NAME" /></translation> <translation id="8317671367883557781">Dodaj mrežnu vezu</translation> <translation id="8319414634934645341">Produžena upotreba ključa</translation> <translation id="8320459152843401447">Cijeli zaslon</translation> @@ -4940,6 +4971,7 @@ <translation id="8588866096426746242">Prikaži statističke podatke o profilu</translation> <translation id="8588868914509452556"><ph name="WINDOW_TITLE" /> – VR se prikazuje u masci</translation> <translation id="8590375307970699841">Postavi automatsko ažuriranje</translation> +<translation id="8591783563402255548">Jedna sekunda</translation> <translation id="8592141010104017453">Uopće ne prikazuj obavijesti</translation> <translation id="8593121833493516339">Slanje podataka o upotrebi i dijagnostici. Pomognite poboljšati djetetov doživljaj Androida automatskim slanjem dijagnostičkih podataka i podataka o upotrebi uređaja i aplikacija Googleu. Ti se podaci neće upotrebljavati za identifikaciju vašeg djeteta, a pomoći će poboljšati sustav, stabilnost aplikacija i drugo. Neki skupni podaci pomoći će i Googleovim aplikacijama i partnerima, na primjer razvojnim programerima za Android. Ako je za vaše dijete uključena dodatna postavka Aktivnost na webu i u aplikacijama, ti se podaci mogu spremati na djetetov Google račun. <ph name="BEGIN_LINK1" />Saznajte više<ph name="END_LINK1" /></translation> <translation id="8594908476761052472">Snimi videozapis</translation> @@ -4969,6 +5001,7 @@ <translation id="8637688295594795546">Dostupno ažuriranje sustava. Priprema za preuzimanje…</translation> <translation id="8639047128869322042">Traženje štetnog softvera...</translation> <translation id="8642171459927087831">Token pristupa</translation> +<translation id="8642900771896232685">Dvije sekunde</translation> <translation id="8642947597466641025">Uvećaj tekst</translation> <translation id="8643418457919840804">Da biste nastavili, odaberite opciju:</translation> <translation id="8644655801811752511">Taj se sigurnosni ključ ne može vratiti na zadano. Pokušajte vratiti ključ na zadano odmah nakon što ga umetnete.</translation> @@ -5170,6 +5203,7 @@ <translation id="8910222113987937043">Promjene vaših oznaka, povijesti, zaporki i drugih postavki više se neće sinkronizirati s vašim Google računom. No vaši podaci ostat će pohranjeni na vašem Google računu i možete upravljati njima na <ph name="BEGIN_LINK" />Google nadzornoj ploči<ph name="END_LINK" />.</translation> <translation id="8912362522468806198">Google Račun</translation> <translation id="8912793549644936705">Rastegni</translation> +<translation id="8912810933860534797">Omogući automatsko traženje</translation> <translation id="891365694296252935">Slanje podataka o upotrebi i dijagnostici. Ovaj uređaj trenutačno Googleu automatski šalje dijagnostičke podatke te podatke o upotrebi uređaja i aplikacija. Ti se podaci neće upotrebljavati za identifikaciju vašeg djeteta, a pomoći će poboljšati sustav, stabilnost aplikacija i drugo. Neki skupni podaci pomoći će i Googleovim aplikacijama i partnerima, na primjer razvojnim programerima za Android. Ovu postavku zadao je vlasnik. Ako je za vaše dijete uključena dodatna postavka Aktivnost na webu i u aplikacijama, ti se podaci mogu spremati na djetetov Google račun. <ph name="BEGIN_LINK1" />Saznajte više<ph name="END_LINK1" /></translation> <translation id="8915370057835397490">Učitavanje prijedloga</translation> <translation id="8916476537757519021">Anonimni podokvir: <ph name="SUBFRAME_SITE" /></translation> @@ -5322,6 +5356,7 @@ <translation id="9153934054460603056">Spremi identitet i zaporku</translation> <translation id="9154194610265714752">Ažurirano</translation> <translation id="91568222606626347">Napravi prečac...</translation> +<translation id="9157096865782046368">0,8 sekundi</translation> <translation id="9157697743260533322">Postavljanje automatskih ažuriranja za sve korisnike nije uspjelo (pogreška prilikom pokretanja pripremne provjere: <ph name="ERROR_NUMBER" />)</translation> <translation id="9158715103698450907">Ups! Tijekom autentifikacije došlo je do problema u mrežnoj komunikaciji. Provjerite svoju mrežnu vezu i pokušajte ponovo.</translation> <translation id="916607977885256133">Slika u slici</translation>
diff --git a/chrome/app/resources/generated_resources_hu.xtb b/chrome/app/resources/generated_resources_hu.xtb index fd52ce8..517e9c71 100644 --- a/chrome/app/resources/generated_resources_hu.xtb +++ b/chrome/app/resources/generated_resources_hu.xtb
@@ -1,6 +1,7 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="hu"> +<translation id="1002469766576243227">Ezt a hitelesítési szolgáltatást a(z) <ph name="EXTENSION_NAME" /> biztosítja</translation> <translation id="1003088604756913841">Link megnyitása új <ph name="APP" />-ablakban</translation> <translation id="1004218526896219317">Webhelyhozzáférés</translation> <translation id="1005274289863221750">Mikrofon és kamera használata</translation> @@ -289,6 +290,7 @@ <translation id="1429300045468813835">Összes törölve</translation> <translation id="143027896309062157">A számítógépén és az Ön által felkeresett webhelyeken lévő adatainak olvasása és módosítása</translation> <translation id="1430915738399379752">Nyomtatás</translation> +<translation id="1431188203598586230">Utolsó szoftverfrissítés</translation> <translation id="1432581352905426595">Keresőmotorok beállítása</translation> <translation id="1433811987160647649">Kérdezzen rá hozzáférés előtt</translation> <translation id="1434696352799406980">Ez a művelet visszaállítja a kezdőoldalt, az új lap oldalt, a keresőmotort és a rögzített lapokat. Kikapcsol továbbá minden bővítményt, és törli az ideiglenes adatokat, például a cookie-kat. Könyvjelzői, előzményei és mentett jelszavai megmaradnak.</translation> @@ -528,6 +530,7 @@ <translation id="1781771911845953849">Fiókok és szinkronizálás</translation> <translation id="1782196717298160133">Telefon megtalálása</translation> <translation id="1784849162047402014">Az eszközön kevés a lemezterület</translation> +<translation id="1790194216133135334">Link küldése ide: <ph name="DEVICE_NAME" /></translation> <translation id="1792619191750875668">Kiterjesztett kijelző</translation> <translation id="1794791083288629568">Küldjön visszajelzést, hogy segítsen a probléma megoldásában.</translation> <translation id="1795214765651529549">Klasszikus téma használata</translation> @@ -590,6 +593,7 @@ <translation id="1875312262568496299">Indítás</translation> <translation id="1875387611427697908">Ez csak a következő helyről adható hozzá: <ph name="CHROME_WEB_STORE" /></translation> <translation id="1877520246462554164">Nem sikerült lekérni a hitelesítési tokent. Jelentkezzen ki, majd jelentkezzen be újra.</translation> +<translation id="1877860345998737529">Művelet hozzárendelése kapcsolóhoz</translation> <translation id="1879000426787380528">Bejelentkezés mint</translation> <translation id="1880905663253319515">Törli a "<ph name="CERTIFICATE_NAME" />" tanúsítványt?</translation> <translation id="1886996562706621347">A webhelyek kérhetik, hogy protokollok alapértelmezett kezelői legyenek (ajánlott)</translation> @@ -869,7 +873,9 @@ <translation id="230927227160767054">Ez az oldal szolgáltatáskezelőt akar telepíteni.</translation> <translation id="2309620859903500144">Ennél a webhelynél le van tiltva a hozzáférés a felhasználó mozgás- vagy fényérzékelőihez.</translation> <translation id="2315414688463285945">Hiba történt a Linux-fájlok konfigurálása során. Próbálja újra.</translation> +<translation id="2315587498123194634">Link küldése ide: <ph name="DEVICE_NAME" /></translation> <translation id="2316129865977710310">Köszönöm, nem</translation> +<translation id="2316739859433277603">Az alkalmazásindítóból végzett keresések a böngésző <ph name="BEGIN_LINK" />keresőmotorját<ph name="END_LINK" /> használják.</translation> <translation id="2317842250900878657"><ph name="PROGRESS_PERCENT" />% kész</translation> <translation id="2318143611928805047">Papírméret</translation> <translation id="2318817390901984578">Android-alkalmazások használatához előbb töltse fel és frissítse a(z) <ph name="DEVICE_TYPE" /> eszközt.</translation> @@ -909,6 +915,7 @@ <translation id="2365507699358342471">Ez a webhely megtekintheti a vágólapra másolt szövegeket és képeket.</translation> <translation id="2367199180085172140">Fájlmegosztás hozzáadása</translation> <translation id="2367972762794486313">Alkalmazások megjelenítése</translation> +<translation id="2369105924912929484">Szűrt oldaltartalmak be- vagy kikapcsolása</translation> <translation id="2371076942591664043">Megnyitás, amikor &kész</translation> <translation id="2375406435414127095">Kapcsolódjon telefonjához</translation> <translation id="2377667304966270281">Súlyos laphiba</translation> @@ -1160,6 +1167,7 @@ <translation id="2739191690716947896">Hibakeresés</translation> <translation id="2739240477418971307">Kisegítő beállítások módosítása</translation> <translation id="2740393541869613458">a felügyelt felhasználó által felkeresett webhelyek áttekintése, valamint</translation> +<translation id="2741912629735277980">Kezelőfelület megjelenítése a bejelentkezési képernyőn</translation> <translation id="274290345632688601">Linux-alkalmazások és -fájlok visszaállítása</translation> <translation id="2743387203779672305">Másolás a vágólapra</translation> <translation id="2745080116229976798">Microsoft minősített altanúsítvány-kibocsátók</translation> @@ -1276,6 +1284,7 @@ <translation id="2910318910161511225">Csatlakozzon egy hálózathoz, és próbálja újra</translation> <translation id="2913331724188855103">Cookie-adatok mentésének és olvasásának engedélyezése a webhelyeken (ajánlott)</translation> <translation id="2915102088417824677">Tevékenységnapló megtekintése</translation> +<translation id="2915873080513663243">Automatikus keresés</translation> <translation id="2916073183900451334">A Tab billentyű megnyomása a weboldalakon kiemeli a linkeket és a beviteli mezőket</translation> <translation id="2916745397441987255">Bővítmények keresése</translation> <translation id="2921081876747860777">Hozzon létre jelszót a helyi adatok védelme érdekében.</translation> @@ -1484,6 +1493,7 @@ <translation id="327147043223061465">Az összes cookie és webhelyadat megtekintése</translation> <translation id="3271648667212143903">A(z) <ph name="ORIGIN" /> csatlakozni szeretne</translation> <translation id="3274763671541996799">Teljes képernyős módra váltott.</translation> +<translation id="3275778809241512831">A belső biztonsági hardverkulcs jelenleg nem biztonságos. Távolítsa el az összes olyan szolgáltatásból, amelyben használja. A probléma megoldásához állítsa vissza alaphelyzetbe.</translation> <translation id="3275778913554317645">Megnyitás ablakként</translation> <translation id="3278001907972365362">Google-fiókjaival kapcsolatban teendői akadtak</translation> <translation id="3279230909244266691">Ez a folyamat néhány percet is igénybe vehet. A virtuális gép indítása folyamatban van.</translation> @@ -1576,6 +1586,7 @@ <translation id="3412265149091626468">Ugrás a kijelöléshez</translation> <translation id="3413122095806433232">CA kibocsátók: <ph name="LOCATION" /></translation> <translation id="3414952576877147120">Méret:</translation> +<translation id="3420501302812554910">A belső biztonsági hardverkulcsot vissza kell állítani</translation> <translation id="3421387094817716717">Nyilvános kulcs elliptikus görbéje</translation> <translation id="3423463006624419153">„<ph name="PHONE_NAME_1" />” és „<ph name="PHONE_NAME_2" />” telefonján:</translation> <translation id="3423858849633684918">Kérjük, indítsa újra a <ph name="PRODUCT_NAME" /> alkalmazást</translation> @@ -1604,6 +1615,7 @@ <translation id="3450157232394774192">Tétlenségi állapot lefoglaltsága százalékban</translation> <translation id="3453612417627951340">Engedélyt igényel</translation> <translation id="3454157711543303649">Aktiválás befejezve</translation> +<translation id="3454213325559396544">Ez az utolsó automatikus szoftver- és biztonsági frissítés ehhez a <ph name="DEVICE_TYPE" /> eszközhöz. Ha a jövőben is szeretne frissítéseket kapni, váltson újabb modellre.</translation> <translation id="345693547134384690">Kép &megnyitása új lapon</translation> <translation id="3457500881955698515">Vállalata vagy szervezete megköveteli az eszköz azonnali frissítését</translation> <translation id="3459509316159669723">Nyomtatás</translation> @@ -1761,6 +1773,7 @@ <translation id="3672681487849735243">A rendszer gyári hibát észlelt</translation> <translation id="367645871420407123">hagyja üresen, ha a root jelszót az alapértelmezett tesztkép értékére szeretné állítani</translation> <translation id="3677657024345889897">Leghalkabb</translation> +<translation id="3677911431265050325">Mobilwebhely kérése</translation> <translation id="3678156199662914018">Bővítmény: <ph name="EXTENSION_NAME" /></translation> <translation id="3681311097828166361">Köszönjük visszajelzését. Most nincs internetkapcsolata, ezért a jelentést később küldi el a böngésző.</translation> <translation id="3682824389861648626">Mozgási küszöbérték</translation> @@ -2144,6 +2157,12 @@ <translation id="4242577469625748426">Az irányelv-beállítások telepítése az eszközre sikertelen: <ph name="VALIDATION_ERROR" />.</translation> <translation id="4244238649050961491">További érintőceruza-alkalmazások keresése</translation> <translation id="424726838611654458">Megnyitás mindig az Adobe Readerben</translation> +<translation id="4247274662191902962">A szenzoradatok megosztására csak addig kerül sor, amíg fut ez a VR-élmény. A webhely tanulhat Önről bizonyos információk, például a következők alapján: + – tartózkodási hely; + – fizikai jellemzők (például a szemei elhelyezkedése); + – mozgás (például a járásmódja). + + A hozzáférés engedélyezése előtt bizonyosodjon meg arról, hogy a webhely megbízható.</translation> <translation id="4247901771970415646">Nem lehet vele szinkronizálni: <ph name="USERNAME" /></translation> <translation id="4249248555939881673">Várakozás a hálózati kapcsolatra...</translation> <translation id="4249373718504745892">Az oldal nem férhet hozzá az Ön kamerájához és mikrofonjához.</translation> @@ -2206,6 +2225,7 @@ <translation id="4350019051035968019">Ez az eszköz nem regisztrálható annál a domainnél, amelyhez fiókja tartozik, mert az eszköz felügyeletére egy másik domain van kijelölve.</translation> <translation id="4354344420232759511">Az Ön által felkeresett webhelyek itt jelennek meg</translation> <translation id="435527878592612277">Válassza ki a fotóját</translation> +<translation id="4358313196493694334">Kattintási hely stabilizálása</translation> <translation id="4359408040881008151">Telepítve az ezt nélkülözni nem tudó bővítmény(ek) miatt.</translation> <translation id="4359717112757026264">Városkép</translation> <translation id="4361142739114356624">Az ügyféltanúsítvány privát kulcsa hiányzik vagy érvénytelen</translation> @@ -2330,6 +2350,7 @@ <translation id="4558426062282641716">Automatikus indítási engedély kérelmezve</translation> <translation id="4558491878126948419">Tippeket kaphat a(z) <ph name="DEVICE_TYPE" /> eszközről, és friss híreket olvashat a Google-termékekkel kapcsolatban, emellett visszajelzést is küldhet. Bármikor leiratkozhat.</translation> <translation id="4559617833001311418">Ez a webhely hozzáfér az Ön mozgás- vagy fényérzékelőihez.</translation> +<translation id="4561098487691395071">Vagy adja meg a nyomtatóhoz tartozó PPD-fájlt</translation> <translation id="4562155214028662640">Ujjlenyomat hozzáadása</translation> <translation id="4563880231729913339">3. ujj</translation> <translation id="4565377596337484307">Jelszó elrejtése</translation> @@ -2574,6 +2595,7 @@ <translation id="494286511941020793">Proxykonfigurációs súgó</translation> <translation id="4943368462779413526">Focilabda</translation> <translation id="4943691134276646401">A(z) „<ph name="CHROME_EXTENSION_NAME" />” soros porthoz szeretne csatlakozni</translation> +<translation id="4944310289250773232">Ezt a hitelesítési szolgáltatást a(z) <ph name="SAML_DOMAIN" /> biztosítja</translation> <translation id="495170559598752135">Műveletek</translation> <translation id="4953689047182316270">Válasz kisegítő lehetőségekkel kapcsolatos eseményekre</translation> <translation id="4953808748584563296">Alapértelmezett narancssárga avatar</translation> @@ -2666,6 +2688,7 @@ <translation id="5094721898978802975">Kommunikáció az együttműködő natív alkalmazásokkal</translation> <translation id="5097002363526479830">Nem sikerült csatlakozni a(z) <ph name="NAME" /> hálózathoz: <ph name="DETAILS" /></translation> <translation id="5101042277149003567">Az összes könyvjelző megnyitása</translation> +<translation id="5101839224773798795">Automatikus kattintás, amikor a kurzor megáll</translation> <translation id="5108967062857032718">Beállítások – Android-alkalmazások eltávolítása</translation> <translation id="5109044022078737958">Sport</translation> <translation id="5111646998522066203">Kilépés az inkognitómódból</translation> @@ -3151,6 +3174,7 @@ <translation id="5852112051279473187">Hoppá! Az eszköz rögzítése közben hiba történt. Kérjük, próbálja újra, vagy forduljon a támogatási képviselőhöz.</translation> <translation id="5852137567692933493">Újraindítás és Powerwash</translation> <translation id="5854912040170951372">Pizza</translation> +<translation id="5855643921295613558">0,6 másodperc</translation> <translation id="5855773610748894548">Hoppá! Biztonsági modult érintő hiba történt.</translation> <translation id="5856721540245522153">Hibakeresési funkciók bekapcsolása</translation> <translation id="5857090052475505287">Új mappa</translation> @@ -3440,6 +3464,7 @@ <translation id="6279183038361895380">Az egérmutató megjelenítéséhez nyomja meg a következő billentyűt: |<ph name="ACCELERATOR" />|</translation> <translation id="6280215091796946657">Bejelentkezés másik fiókkal</translation> <translation id="6280912520669706465">ARC</translation> +<translation id="628352644014831790">4 másodperc</translation> <translation id="6285120108426285413">A(z) <ph name="FILE_NAME" /> fájlt nem gyakran töltik le, és veszélyes lehet.</translation> <translation id="6285120908535925801">{NUM_PRINTER,plural, =1{Új nyomtató a hálózaton}other{Új nyomtatók a hálózaton}}</translation> <translation id="6286708577777130801">Mentett jelszavak adatai</translation> @@ -3646,6 +3671,7 @@ <translation id="6612358246767739896">Védett tartalom</translation> <translation id="6613452264606394692">Gyorsan visszajuthat ide, ha hozzáadja az oldalt a könyvjelzőkhöz</translation> <translation id="6615455863669487791">Megjelenítés</translation> +<translation id="6617100836880592260">Keresési sebesség: <ph name="SPEED_WITH_UNITS" /></translation> <translation id="6618097958368085618">Megtartás</translation> <translation id="6619058681307408113">Line Printer Daemon (LPD)</translation> <translation id="661907246513853610">A webhely nyomon tudja követni a tartózkodási helyét</translation> @@ -4460,6 +4486,7 @@ <translation id="7831491651892296503">Hiba történt a hálózat konfigurálásakor</translation> <translation id="7831754656372780761"><ph name="TAB_TITLE" /> <ph name="EMOJI_MUTING" /></translation> <translation id="7832084384634357321">Befejezés ideje</translation> +<translation id="783214144752121388">A Flash futtatásának letiltása a webhelyeken (ajánlott)</translation> <translation id="7833720883933317473">A mentett egyéni szavak itt jelennek meg</translation> <translation id="7835178595033117206">Könyvjelző eltávolítva</translation> <translation id="7837776265184002579">Kezdőlapja a következőre módosult: <ph name="URL" />.</translation> @@ -4515,6 +4542,7 @@ <translation id="7911118814695487383">Linux</translation> <translation id="7912080627461681647">A jelszó megváltozott a szerveren. Jelentkezzen ki, majd jelentkezzen be újra.</translation> <translation id="7915471803647590281">Kérjük, mondja el, mi történik, mielőtt elküldené a visszajelzést.</translation> +<translation id="7919210519031517829"><ph name="DURATION" /> mp</translation> <translation id="792514962475806987">Dokkolt állapotú nagyítási szint:</translation> <translation id="7925247922861151263">AAA-ellenőrzés sikertelen</translation> <translation id="7925285046818567682">Várakozás a szerverre: <ph name="HOST_NAME" />...</translation> @@ -4572,6 +4600,7 @@ <translation id="7987814697832569482">Mindig ezen a VPN-en keresztül csatlakozzon</translation> <translation id="798835209536175951">SMS-eket küldhet és fogadhat a Chromebookon. <ph name="LINK_BEGIN" />További információ<ph name="LINK_END" />.</translation> <translation id="7988355189918024273">Kisegítő lehetőségek bekapcsolása</translation> +<translation id="7991296728590311172">A kapcsolóalapú hozzáférés beállításai</translation> <translation id="7994702968232966508">EAP módszer</translation> <translation id="7997826902155442747">Folyamatprioritás</translation> <translation id="7999229196265990314">A rendszer a következő fájlokat hozta létre: @@ -4785,6 +4814,8 @@ <translation id="8308179586020895837">Kérdezzen rá, ha a(z) <ph name="HOST" /> hozzá szeretne férni a kamerához</translation> <translation id="830868413617744215">Béta</translation> <translation id="8309458809024885768">A tanúsítvány már létezik</translation> +<translation id="8314381333424235892">Hiányzó vagy eltávolított bővítmény</translation> +<translation id="8316618172731049784">Küldés: <ph name="DEVICE_NAME" /></translation> <translation id="8317671367883557781">Hálózati kapcsolat hozzáadása</translation> <translation id="8319414634934645341">Bővített kulcshasználat</translation> <translation id="8320459152843401447">A teljes képernyő</translation> @@ -4941,6 +4972,7 @@ <translation id="8588866096426746242">Profilstatisztikák megjelenítése</translation> <translation id="8588868914509452556"><ph name="WINDOW_TITLE" /> – VR-tartalmat jelenít meg egy headseten</translation> <translation id="8590375307970699841">Automatikus frissítések beállítása</translation> +<translation id="8591783563402255548">1 másodperc</translation> <translation id="8592141010104017453">Semmilyen értesítés ne jelenjen meg</translation> <translation id="8593121833493516339">Használati és diagnosztikai adatok küldése. Segítsen gyermeke Android-élményének továbbfejlesztésében azzal, hogy automatikusan diagnosztikai, valamint eszköz- és alkalmazáshasználati adatokat küld a Google-nak. Az adatok a rendszer- és alkalmazásstabilitás javításában, valamint más fejlesztésekben segítenek, nem használjuk fel őket az Ön gyermekének azonosítására. Bizonyos összesített adatok a Google-alkalmazásoknak és -partnereknek, például az Android-fejlesztőknek is segítenek. Ha az Internetes és alkalmazástevékenységek beállítás is be van kapcsolva a gyermekénél, akkor a rendszer ezeket az adatokat mentheti a gyermek Google-fiókjába. <ph name="BEGIN_LINK1" />További információ.<ph name="END_LINK1" /></translation> <translation id="8594908476761052472">Videó rögzítése</translation> @@ -4970,6 +5002,7 @@ <translation id="8637688295594795546">Megjelent egy rendszerfrissítés. Felkészülés a letöltésre...</translation> <translation id="8639047128869322042">Kártékony szoftverek keresése…</translation> <translation id="8642171459927087831">Hozzáférési token</translation> +<translation id="8642900771896232685">2 másodperc</translation> <translation id="8642947597466641025">Szöveg nagyítása</translation> <translation id="8643418457919840804">A folytatáshoz válasszon a lehetőségek közül:</translation> <translation id="8644655801811752511">Nem lehetséges a biztonsági hardverkulcs visszaállítása. Próbálkozzon meg a hardverkulcs visszaállításával közvetlenül az eszköz csatlakoztatása után.</translation> @@ -5171,6 +5204,7 @@ <translation id="8910222113987937043">A könyvjelzők, előzmények, jelszavak és egyéb beállítások módosításai nem lesznek szinkronizálva Google-fiókjával. Meglévő adatait azonban továbbra is tárolni fogja Google-fiókja, és azokat a <ph name="BEGIN_LINK" />Google Irányítópulton<ph name="END_LINK" /> kezelheti.</translation> <translation id="8912362522468806198">Google Fiókjába</translation> <translation id="8912793549644936705">Nyújtva</translation> +<translation id="8912810933860534797">Automatikus keresés engedélyezése</translation> <translation id="891365694296252935">Használati és diagnosztikai adatok küldése. Ez az eszköz jelenleg automatikusan küld diagnosztikai, eszköz- és alkalmazáshasználati adatokat a Google-nak. Az adatok a rendszer- és alkalmazásstabilitás javításában, valamint más fejlesztésekben segítenek, nem használjuk fel őket az Ön gyermekének azonosítására. Bizonyos összesített adatok a Google-alkalmazásoknak és -partnereknek, például az Android-fejlesztőknek is segítenek. Ezt a beállítást kötelezővé tette az eszköz tulajdonosa. Ha az Internetes és alkalmazástevékenységek beállítás is be van kapcsolva a gyermekénél, akkor a rendszer ezeket az adatokat mentheti a gyermek Google-fiókjába. <ph name="BEGIN_LINK1" />További információ.<ph name="END_LINK1" /></translation> <translation id="8915370057835397490">Javaslatok betöltése</translation> <translation id="8916476537757519021">Inkognitó subframe: <ph name="SUBFRAME_SITE" /></translation> @@ -5323,6 +5357,7 @@ <translation id="9153934054460603056">Azonosítás és jelszó mentése</translation> <translation id="9154194610265714752">Frissítve</translation> <translation id="91568222606626347">Parancsikon létrehozása</translation> +<translation id="9157096865782046368">0,8 másodperc</translation> <translation id="9157697743260533322">Nem sikerült beállítani az automatikus frissítéseket az összes felhasználó számára (előzetes lekérdezés indítási hibája: <ph name="ERROR_NUMBER" />)</translation> <translation id="9158715103698450907">Hoppá! Hálózati kommunikációs probléma merült fel a hitelesítés során. Kérjük, ellenőrizze hálózati kapcsolatát, és próbálkozzon újra.</translation> <translation id="916607977885256133">Kép a képben</translation>
diff --git a/chrome/app/resources/generated_resources_id.xtb b/chrome/app/resources/generated_resources_id.xtb index 4accea8..ae4f0a0 100644 --- a/chrome/app/resources/generated_resources_id.xtb +++ b/chrome/app/resources/generated_resources_id.xtb
@@ -2142,6 +2142,12 @@ <translation id="4242577469625748426">Gagal memasang setelan kebijakan di perangkat: <ph name="VALIDATION_ERROR" />.</translation> <translation id="4244238649050961491">Temukan aplikasi stilus lainnya</translation> <translation id="424726838611654458">Selalu buka di Adobe Reader</translation> +<translation id="4247274662191902962">Data sensor hanya akan dibagikan selama Anda berada di pengalaman VR ini. Situs mungkin dapat mempelajari Anda dengan menggunakan informasi tertentu, seperti: + - Lokasi Anda + - Ciri fisik Anda, seperti posisi mata + - Gerakan Anda, seperti cara Anda berjalan + + Pastikan Anda memercayai situs ini sebelum mengizinkan akses.</translation> <translation id="4247901771970415646">Tidak dapat disinkronkan ke <ph name="USERNAME" /></translation> <translation id="4249248555939881673">Menunggu sambungan jaringan...</translation> <translation id="4249373718504745892">Halaman ini telah diblokir agar tidak dapat mengakses kamera dan mikrofon Anda.</translation>
diff --git a/chrome/app/resources/generated_resources_it.xtb b/chrome/app/resources/generated_resources_it.xtb index b4fdc2d..8ad31a8 100644 --- a/chrome/app/resources/generated_resources_it.xtb +++ b/chrome/app/resources/generated_resources_it.xtb
@@ -1,6 +1,7 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="it"> +<translation id="1002469766576243227">Questo servizio di autenticazione è in hosting su <ph name="EXTENSION_NAME" /></translation> <translation id="1003088604756913841">Apri link in nuova finestra di <ph name="APP" /></translation> <translation id="1004218526896219317">Accesso al sito</translation> <translation id="1005274289863221750">Utilizzo del microfono e della fotocamera</translation> @@ -289,6 +290,7 @@ <translation id="1429300045468813835">Tutte le voci cancellate</translation> <translation id="143027896309062157">Lettura e modifica di tutti i dati sul computer e sui siti web visitati</translation> <translation id="1430915738399379752">Stampa</translation> +<translation id="1431188203598586230">Aggiornamento software finale</translation> <translation id="1432581352905426595">Gestisci motori di ricerca</translation> <translation id="1433811987160647649">Chiedi prima di accedere</translation> <translation id="1434696352799406980">L'operazione reimposterà la pagina iniziale, la pagina Nuova scheda, il motore di ricerca e le schede bloccate. Inoltre, disattiverà tutte le estensioni e rimuoverà i dati temporanei, come i cookie. La cronologia, le password salvate e i preferiti non saranno invece cancellati.</translation> @@ -528,6 +530,7 @@ <translation id="1781771911845953849">Account e sincronizzazioni</translation> <translation id="1782196717298160133">Ricerca del tuo telefono</translation> <translation id="1784849162047402014">Spazio insufficiente sul disco del dispositivo</translation> +<translation id="1790194216133135334">Invia link a <ph name="DEVICE_NAME" /></translation> <translation id="1792619191750875668">Display esteso</translation> <translation id="1794791083288629568">Invia feedback per aiutarci a risolvere questo problema.</translation> <translation id="1795214765651529549">Usa classico</translation> @@ -590,6 +593,7 @@ <translation id="1875312262568496299">Inizia</translation> <translation id="1875387611427697908">È possibile aggiungerla soltanto dal <ph name="CHROME_WEB_STORE" /></translation> <translation id="1877520246462554164">Recupero del token di autenticazione non riuscito. Esci e accedi nuovamente per riprovare.</translation> +<translation id="1877860345998737529">Cambia assegnazione azione</translation> <translation id="1879000426787380528">Accesso eseguito come</translation> <translation id="1880905663253319515">Eliminare il certificato "<ph name="CERTIFICATE_NAME" />"?</translation> <translation id="1886996562706621347">Consenti ai siti di chiedere di diventare gestori predefiniti dei protocolli (consigliata)</translation> @@ -869,7 +873,9 @@ <translation id="230927227160767054">Questa pagina vuole installare un gestore di servizi.</translation> <translation id="2309620859903500144">A questo sito è stato impedito l'accesso ai sensori di movimento o della luce.</translation> <translation id="2315414688463285945">Errore durante la configurazione dei file Linux. Riprova.</translation> +<translation id="2315587498123194634">Invia link a <ph name="DEVICE_NAME" /></translation> <translation id="2316129865977710310">No, grazie</translation> +<translation id="2316739859433277603">Le ricerche dell'Avvio applicazioni utilizzano l'<ph name="BEGIN_LINK" />impostazione del motore di ricerca<ph name="END_LINK" /> del tuo browser.</translation> <translation id="2317842250900878657">Percentuale di completamento: <ph name="PROGRESS_PERCENT" />%</translation> <translation id="2318143611928805047">Formato carta</translation> <translation id="2318817390901984578">Per utilizzare le app Android, metti sotto carica il tuo dispositivo <ph name="DEVICE_TYPE" /> e aggiornalo.</translation> @@ -909,6 +915,7 @@ <translation id="2365507699358342471">Questo sito può leggere testo e immagini copiati negli appunti</translation> <translation id="2367199180085172140">Aggiungi Condivisione file</translation> <translation id="2367972762794486313">Mostra app</translation> +<translation id="2369105924912929484">Attiva i contenuti della pagina distill</translation> <translation id="2371076942591664043">Apri al &termine</translation> <translation id="2375406435414127095">Collegati al telefono</translation> <translation id="2377667304966270281">Errori hardware</translation> @@ -1157,6 +1164,7 @@ <translation id="2739191690716947896">Debug</translation> <translation id="2739240477418971307">Modifica delle impostazioni di accesibilità</translation> <translation id="2740393541869613458">controllare i siti web visitati dall'utente supervisionato e</translation> +<translation id="2741912629735277980">Visualizza UI sulla schermata di accesso</translation> <translation id="274290345632688601">Ripristino app e file Linux in corso</translation> <translation id="2743387203779672305">Copia negli appunti</translation> <translation id="2745080116229976798">Subordinazione qualificata Microsoft</translation> @@ -1273,6 +1281,7 @@ <translation id="2910318910161511225">Collegati a una rete e riprova</translation> <translation id="2913331724188855103">Consenti ai siti di salvare e leggere i dati dei cookie (opzione consigliata)</translation> <translation id="2915102088417824677">Apri log delle attività</translation> +<translation id="2915873080513663243">Scansione automatica</translation> <translation id="2916073183900451334">Se premi Tab in una pagina web vengono evidenziati i link, così come i campi dei moduli</translation> <translation id="2916745397441987255">Cerca tra le estensioni</translation> <translation id="2921081876747860777">Crea una password per proteggere i tuoi dati locali.</translation> @@ -1481,6 +1490,7 @@ <translation id="327147043223061465">Mostra tutti i cookie e i dati dei siti</translation> <translation id="3271648667212143903">Il sito <ph name="ORIGIN" /> desidera collegarsi</translation> <translation id="3274763671541996799">Sei passato a schermo intero.</translation> +<translation id="3275778809241512831">Il tuo token di sicurezza interno al momento non è sicuro. Rimuovilo dai servizi con cui l'hai utilizzato. Per risolvere il problema, reimposta il token di sicurezza.</translation> <translation id="3275778913554317645">Apri come finestra</translation> <translation id="3278001907972365362">I tuoi Account Google richiedono la tua attenzione</translation> <translation id="3279230909244266691">Questa procedura potrebbe richiedere alcuni minuti. Avvio della macchina virtuale in corso.</translation> @@ -1571,6 +1581,7 @@ <translation id="3412265149091626468">Passa alla selezione</translation> <translation id="3413122095806433232">Autorità emittenti di CA: <ph name="LOCATION" /></translation> <translation id="3414952576877147120">Dimensioni:</translation> +<translation id="3420501302812554910">È necessario reimpostare il token di sicurezza interno</translation> <translation id="3421387094817716717">Chiave pubblica della curva ellittica</translation> <translation id="3423463006624419153">Sui telefoni "<ph name="PHONE_NAME_1" />" e "<ph name="PHONE_NAME_2" />":</translation> <translation id="3423858849633684918">Riavvia <ph name="PRODUCT_NAME" /></translation> @@ -1599,6 +1610,7 @@ <translation id="3450157232394774192">Percentuale di occupazione dello stato di inattività</translation> <translation id="3453612417627951340">Occorre l'autorizzazione</translation> <translation id="3454157711543303649">Attivazione completata</translation> +<translation id="3454213325559396544">Questo è l'ultimo aggiornamento software e di sicurezza per il dispositivo <ph name="DEVICE_TYPE" />. Per ricevere gli aggiornamenti futuri, esegui l'upgrade a un modello più recente.</translation> <translation id="345693547134384690">Apri &immagine in un'altra scheda</translation> <translation id="3457500881955698515">La tua organizzazione o azienda richiede un aggiornamento immediato di questo dispositivo</translation> <translation id="3459509316159669723">Stampa</translation> @@ -1756,6 +1768,7 @@ <translation id="3672681487849735243">È stato rilevato un errore di fabbrica</translation> <translation id="367645871420407123">lascia vuoto questo campo se desideri impostare la password root sul valore dell'immagine di test predefinita</translation> <translation id="3677657024345889897">Al minimo</translation> +<translation id="3677911431265050325">Richiedi sito per dispositivi mobili</translation> <translation id="3678156199662914018">Estensione: <ph name="EXTENSION_NAME" /></translation> <translation id="3681311097828166361">Grazie per il tuo feedback. Adesso sei offline; il tuo rapporto verrà inviato in un secondo momento.</translation> <translation id="3682824389861648626">Soglia del movimento</translation> @@ -2140,6 +2153,12 @@ <translation id="4242577469625748426">Installazione delle impostazioni criterio sul dispositivo non riuscita. <ph name="VALIDATION_ERROR" />.</translation> <translation id="4244238649050961491">Trova altre app per stilo</translation> <translation id="424726838611654458">Apri sempre in Adobe Reader</translation> +<translation id="4247274662191902962">I dati dei sensori verranno condivisi solo quando ti trovi in questa esperienza VR. Questo sito potrebbe essere in grado di apprendere le tue abitudini utilizzando determinate informazioni, ad esempio: + - La tua località + - Le tue caratteristiche fisiche, come la posizione degli occhi + - I tuoi movimenti, come il modo di camminare + + Prima di consentire l'accesso, controlla che questo sito sia attendibile.</translation> <translation id="4247901771970415646">Impossibile sincronizzare con <ph name="USERNAME" /></translation> <translation id="4249248555939881673">In attesa della connessione di rete...</translation> <translation id="4249373718504745892">A questa pagina è stato impedito l'accesso alla webcam e al microfono.</translation> @@ -2202,6 +2221,7 @@ <translation id="4350019051035968019">Questo dispositivo non può essere registrato sul dominio a cui appartiene il tuo account perché è contrassegnato per essere gestito da un altro dominio.</translation> <translation id="4354344420232759511">Qui verranno visualizzati i siti visitati</translation> <translation id="435527878592612277">Seleziona la foto</translation> +<translation id="4358313196493694334">Stabilizza la posizione dei clic</translation> <translation id="4359408040881008151">Installata a causa di estensioni dipendenti.</translation> <translation id="4359717112757026264">Cityscape</translation> <translation id="4361142739114356624">La chiave privata per il certificato client manca o non è valida</translation> @@ -2326,6 +2346,7 @@ <translation id="4558426062282641716">Autorizzazione di avvio automatico richiesta</translation> <translation id="4558491878126948419">Ricevi suggerimenti per <ph name="DEVICE_TYPE" />, aggiornamenti sui prodotti Google e condividi il tuo feedback. Puoi annullare l'iscrizione in qualsiasi momento.</translation> <translation id="4559617833001311418">Questo sito ha accesso ai sensori di movimento o della luce.</translation> +<translation id="4561098487691395071">Oppure specifica il file PPD della stampante</translation> <translation id="4562155214028662640">Aggiungi impronta digitale</translation> <translation id="4563880231729913339">Dito 3</translation> <translation id="4565377596337484307">Nascondi password</translation> @@ -2570,6 +2591,7 @@ <translation id="494286511941020793">Guida configurazione proxy</translation> <translation id="4943368462779413526">Calcio</translation> <translation id="4943691134276646401">"<ph name="CHROME_EXTENSION_NAME" />" vuole collegarsi a una porta seriale</translation> +<translation id="4944310289250773232">Questo servizio di autenticazione è in hosting su <ph name="SAML_DOMAIN" /></translation> <translation id="495170559598752135">Azioni</translation> <translation id="4953689047182316270">Rispondi agli eventi di accessibilità</translation> <translation id="4953808748584563296">Avatar arancione predefinito</translation> @@ -2662,6 +2684,7 @@ <translation id="5094721898978802975">Comunicazione con applicazioni native interoperative</translation> <translation id="5097002363526479830">Connessione alla rete "<ph name="NAME" />" non riuscita: <ph name="DETAILS" /></translation> <translation id="5101042277149003567">Apri tutti i Preferiti</translation> +<translation id="5101839224773798795">Clic automatico all'arresto del puntatore del cursore</translation> <translation id="5108967062857032718">Impostazioni - Rimuovi app Android</translation> <translation id="5109044022078737958">Mia</translation> <translation id="5111646998522066203">Esci dalla modalità in incognito</translation> @@ -3145,6 +3168,7 @@ <translation id="5852112051279473187">Spiacenti. Si è verificato un grave problema durante la registrazione di questo dispositivo. Riprova o contatta un rappresentante dell'assistenza.</translation> <translation id="5852137567692933493">Riavvia ed esegui Powerwash</translation> <translation id="5854912040170951372">Fetta</translation> +<translation id="5855643921295613558">0,6 secondi</translation> <translation id="5855773610748894548">Spiacenti, errore del modulo per la sicurezza.</translation> <translation id="5856721540245522153">Attiva funzioni di debug</translation> <translation id="5857090052475505287">Nuova cartella</translation> @@ -3434,6 +3458,7 @@ <translation id="6279183038361895380">Premi |<ph name="ACCELERATOR" />| per mostrare il puntatore</translation> <translation id="6280215091796946657">Accedi con un altro account</translation> <translation id="6280912520669706465">ARC</translation> +<translation id="628352644014831790">4 secondi</translation> <translation id="6285120108426285413"><ph name="FILE_NAME" /> non viene scaricato spesso e potrebbe essere pericoloso.</translation> <translation id="6285120908535925801">{NUM_PRINTER,plural, =1{Nuova stampante in rete}other{Nuove stampanti in rete}}</translation> <translation id="6286708577777130801">Dettagli password salvata</translation> @@ -3640,6 +3665,7 @@ <translation id="6612358246767739896">Contenuti protetti</translation> <translation id="6613452264606394692">Aggiungi questa pagina ai preferiti per ritrovarla rapidamente</translation> <translation id="6615455863669487791">Mostrami</translation> +<translation id="6617100836880592260">Velocità di scansione: <ph name="SPEED_WITH_UNITS" /></translation> <translation id="6618097958368085618">Mantieni comunque</translation> <translation id="6619058681307408113">Line Printer Daemon (LPD)</translation> <translation id="661907246513853610">Il sito può monitorare la tua posizione</translation> @@ -4452,6 +4478,7 @@ <translation id="7831491651892296503">Errore durante la configurazione della rete</translation> <translation id="7831754656372780761"><ph name="TAB_TITLE" /> <ph name="EMOJI_MUTING" /></translation> <translation id="7832084384634357321">Ora di fine</translation> +<translation id="783214144752121388">Impedisci ai siti di eseguire Flash (opzione consigliata)</translation> <translation id="7833720883933317473">Le parole personalizzate salvate verranno visualizzate qui</translation> <translation id="7835178595033117206">Segnalibro rimosso</translation> <translation id="7837776265184002579">Home page sostituita con: <ph name="URL" />.</translation> @@ -4507,6 +4534,7 @@ <translation id="7911118814695487383">Linux</translation> <translation id="7912080627461681647">La password è stata modificata sul server. Esci e accedi nuovamente.</translation> <translation id="7915471803647590281">Comunicaci cosa sta accadendo prima di inviare il feedback.</translation> +<translation id="7919210519031517829"><ph name="DURATION" /> s</translation> <translation id="792514962475806987">Livello di zoom ancorato:</translation> <translation id="7925247922861151263">Controllo AAA non riuscito</translation> <translation id="7925285046818567682">In attesa di risposta da <ph name="HOST_NAME" />...</translation> @@ -4564,6 +4592,7 @@ <translation id="7987814697832569482">Connettiti sempre tramite questa VPN</translation> <translation id="798835209536175951">Invia e ricevi SMS dal Chromebook. <ph name="LINK_BEGIN" />Ulteriori informazioni<ph name="LINK_END" /></translation> <translation id="7988355189918024273">Attiva funzioni di accessibilità</translation> +<translation id="7991296728590311172">Impostazioni Switch Access</translation> <translation id="7994702968232966508">Metodo EAP</translation> <translation id="7997826902155442747">Priorità processo</translation> <translation id="7999229196265990314">Sono stati creati i file seguenti: @@ -4776,6 +4805,8 @@ <translation id="8308179586020895837">Chiedi conferma se <ph name="HOST" /> vuole accedere alla webcam</translation> <translation id="830868413617744215">Beta</translation> <translation id="8309458809024885768">Il certificato esiste già</translation> +<translation id="8314381333424235892">Estensione mancante o non installata</translation> +<translation id="8316618172731049784">Invia a <ph name="DEVICE_NAME" /></translation> <translation id="8317671367883557781">Aggiungi connesione di rete</translation> <translation id="8319414634934645341">Utilizzo chiave esteso</translation> <translation id="8320459152843401447">Il tuo intero schermo</translation> @@ -4932,6 +4963,7 @@ <translation id="8588866096426746242">Mostra le statistiche del profilo</translation> <translation id="8588868914509452556"><ph name="WINDOW_TITLE" /> - Contenuti VR mostrati a un auricolare</translation> <translation id="8590375307970699841">Imposta aggiornamenti automatici</translation> +<translation id="8591783563402255548">1 secondo</translation> <translation id="8592141010104017453">Non mostrare le notifiche</translation> <translation id="8593121833493516339">Invia dati diagnostici e sull'utilizzo. Contribuisci a migliorare l'esperienza Android di tuo figlio tramite l'invio automatico a Google di dati diagnostici e sull'utilizzo delle app e del dispositivo. Non verranno utilizzati per identificare tuo figlio e contribuiranno alla stabilità di app e sistema, nonché ad altri miglioramenti. Alcuni dati aggregati saranno utili anche alle app e ai partner di Google, ad esempio agli sviluppatori Android. Se l'impostazione Attività web e app aggiuntiva è attiva per tuo figlio, queste informazioni potrebbero essere salvate nel suo Account Google. <ph name="BEGIN_LINK1" />Ulteriori informazioni<ph name="END_LINK1" /></translation> <translation id="8594908476761052472">Acquisisci video</translation> @@ -4961,6 +4993,7 @@ <translation id="8637688295594795546">Aggiornamento del sistema disponibile. Preparazione per il download in corso…</translation> <translation id="8639047128869322042">Controllo della presenza di software dannoso...</translation> <translation id="8642171459927087831">Token di accesso</translation> +<translation id="8642900771896232685">2 secondi</translation> <translation id="8642947597466641025">Ingrandisci le dimensioni del testo</translation> <translation id="8643418457919840804">Per continuare, scegli un'opzione:</translation> <translation id="8644655801811752511">Impossibile reimpostare questo token di sicurezza. Prova a reimpostare il token subito dopo averlo inserito.</translation> @@ -5162,6 +5195,7 @@ <translation id="8910222113987937043">Le modifiche ai preferiti, alla cronologia, alle password e ad altre impostazioni non verranno più sincronizzate con il tuo Account Google. I dati esistenti rimarranno invece memorizzati nel tuo Account Google e potranno essere gestiti su <ph name="BEGIN_LINK" />Google Dashboard<ph name="END_LINK" />.</translation> <translation id="8912362522468806198">Google Account</translation> <translation id="8912793549644936705">Allunga</translation> +<translation id="8912810933860534797">Attiva scansione automatica</translation> <translation id="891365694296252935">Invia dati diagnostici e sull'utilizzo. Questo dispositivo attualmente invia a Google dati diagnostici e sull'utilizzo delle app e del dispositivo. Non verranno utilizzati per identificare tuo figlio e contribuiranno alla stabilità di app e sistema, nonché ad altri miglioramenti. Alcuni dati aggregati saranno utili anche alle app e ai partner di Google, ad esempio agli sviluppatori Android. Questa impostazione è applicata dal proprietario. Se l'impostazione Attività web e app aggiuntiva è attiva per tuo figlio, queste informazioni potrebbero essere salvate nel suo Account Google. <ph name="BEGIN_LINK1" />Ulteriori informazioni<ph name="END_LINK1" /></translation> <translation id="8915370057835397490">Caricamento suggerimento</translation> <translation id="8916476537757519021">Frame secondario modalità di navigazione in incognito: <ph name="SUBFRAME_SITE" /></translation> @@ -5314,6 +5348,7 @@ <translation id="9153934054460603056">Salva identità e password</translation> <translation id="9154194610265714752">Aggiornato</translation> <translation id="91568222606626347">Crea scorciatoia...</translation> +<translation id="9157096865782046368">0,8 secondi</translation> <translation id="9157697743260533322">Impostazione degli aggiornamenti automatici per tutti gli utenti non riuscita (errore di avvio preliminare: <ph name="ERROR_NUMBER" />)</translation> <translation id="9158715103698450907">Spiacenti. Si è verificato un problema di comunicazione sulla rete durante l'autenticazione. Controlla la connessione di rete e riprova.</translation> <translation id="916607977885256133">Picture in picture</translation>
diff --git a/chrome/app/resources/generated_resources_iw.xtb b/chrome/app/resources/generated_resources_iw.xtb index e202e2e..de53b0b 100644 --- a/chrome/app/resources/generated_resources_iw.xtb +++ b/chrome/app/resources/generated_resources_iw.xtb
@@ -370,7 +370,7 @@ <translation id="155865706765934889">לוח מגע</translation> <translation id="1564414980088536597">לא ניתן להשתמש בתמונה הזו. צריך לבחור תמונה אחרת.</translation> <translation id="1566049601598938765">אתר</translation> -<translation id="15662109988763471">המדפסת שנבחרה אינה זמינה או שאינה מותקנת כראוי. יש לבדוק את המדפסת או לנסות לבחור מדפסת אחרת</translation> +<translation id="15662109988763471">המדפסת שנבחרה אינה זמינה או שאינה מותקנת כראוי. יש לבדוק את המדפסת או לנסות לבחור מדפסת אחרת.</translation> <translation id="1567387640189251553">חוברה מקלדת אחרת מאז שהזנת את הסיסמה בפעם האחרונה. ייתכן שהיא מנסה לתעד את ההקשות שלך.</translation> <translation id="1567750922576943685">אימות הזהות עוזר להגן על המידע האישי</translation> <translation id="1567993339577891801">קונסולת JavaScript</translation> @@ -2141,6 +2141,12 @@ <translation id="4242577469625748426">התקנת הגדרות המדיניות במכשיר: <ph name="VALIDATION_ERROR" /> נכשלה.</translation> <translation id="4244238649050961491">חפש עוד אפליקציות לשימוש בסטיילוס</translation> <translation id="424726838611654458">פתח תמיד ב-Adobe Reader</translation> +<translation id="4247274662191902962">שיתוף נתוני החיישן יתבצע רק במהלך ההשתתפות בחוויית ה-VR הזו. ייתכן שהאתר ילמד עליך באמצעות פרטים מסוימים, למשל: + - המיקום שלך + - המאפיינים הגופניים שלך, כמו מיקום העיניים + - התנועות שלך, למשל צורת ההליכה + + לפני הענקת הגישה, יש לוודא שמדובר באתר מהימן.</translation> <translation id="4247901771970415646">לא ניתן לסנכרן עם <ph name="USERNAME" /></translation> <translation id="4249248555939881673">תיכף נתחבר לרשת…</translation> <translation id="4249373718504745892">הגישה של הדף הזה למצלמה ולמיקרופון נחסמה.</translation> @@ -4464,7 +4470,7 @@ <translation id="7849264908733290972">פתיחת &תמונה בכרטיסייה חדשה</translation> <translation id="784934925303690534">טווח זמן</translation> <translation id="7850222546481862746"><ph name="BEGIN_PARAGRAPH1" />כדי לסיים את הגדרת הפיקוח במכשיר הזה יש לצאת מהחשבון של <ph name="USER_NAME" />.<ph name="END_PARAGRAPH1" /> - <ph name="BEGIN_PARAGRAPH2" />כדי לנהל את בקרת הורים עליך להתקין את Family Link להורים במכשיר שלך.<ph name="END_PARAGRAPH2" /></translation> + <ph name="BEGIN_PARAGRAPH2" />כדי לנהל את בקרת ההורים בשביל ילדך עליך להתקין את Family Link להורים במכשיר שלך.<ph name="END_PARAGRAPH2" /></translation> <translation id="7851457902707056880">הכניסה הוגבלה לחשבון הבעלים בלבד. בצע אתחול מחדש והיכנס באמצעות חשבון הבעלים. המחשב יבצע אתחול מחדש אוטומטי בתוך 30 שניות.</translation> <translation id="7851716364080026749">חסום תמיד גישה למצלמה ולמיקרופון</translation> <translation id="7853747251428735">&כלים נוספים</translation>
diff --git a/chrome/app/resources/generated_resources_ja.xtb b/chrome/app/resources/generated_resources_ja.xtb index 356a232..4b3f1e5 100644 --- a/chrome/app/resources/generated_resources_ja.xtb +++ b/chrome/app/resources/generated_resources_ja.xtb
@@ -2144,6 +2144,12 @@ <translation id="4242577469625748426">デバイスにポリシー設定をインストールできませんでした: <ph name="VALIDATION_ERROR" />。</translation> <translation id="4244238649050961491">他のタッチペン アプリを探す</translation> <translation id="424726838611654458">常に Adobe Reader で開く</translation> +<translation id="4247274662191902962">センサーデータは、この VR 空間を利用している間のみ共有されます。次のような特定の情報により、サイトがお客様を記憶できる場合があります。 + - お客様の位置情報 + - お客様の身体的特徴(目の位置など) + - お客様の動き(歩き方など) + + アクセスを許可する前に、このサイトを信頼できるかどうか確認してください。</translation> <translation id="4247901771970415646"><ph name="USERNAME" /> に同期できません</translation> <translation id="4249248555939881673">ネットワークに接続しています...</translation> <translation id="4249373718504745892">このページではカメラとマイクへのアクセスがブロックされています。</translation>
diff --git a/chrome/app/resources/generated_resources_kn.xtb b/chrome/app/resources/generated_resources_kn.xtb index f477efa..a6634828 100644 --- a/chrome/app/resources/generated_resources_kn.xtb +++ b/chrome/app/resources/generated_resources_kn.xtb
@@ -2144,6 +2144,12 @@ <translation id="4242577469625748426">ಸಾಧನದಲ್ಲಿ ನೀತಿಯ ಸೆಟ್ಟಿಂಗ್ಗಳನ್ನು ಸ್ಥಾಪಿಸಲು ವಿಫಲವಾಗಿದೆ: <ph name="VALIDATION_ERROR" />.</translation> <translation id="4244238649050961491">ಇನ್ನಷ್ಟು ಸ್ಟೈಲಸ್ ಅಪ್ಲಿಕೇಶನ್ಗಳನ್ನು ಹುಡುಕಿ</translation> <translation id="424726838611654458">ಯಾವಾಗಲೂ Adobe Reader ನಲ್ಲಿ ತೆರೆಯಿರಿ</translation> +<translation id="4247274662191902962">ನೀವು ಈ VR ಅನುಭವ ಪಡೆಯುತ್ತಿರುವಾಗ ಮಾತ್ರವೇ ಸೆನ್ಸರ್ ಡೇಟಾವನ್ನು ಹಂಚಿಕೊಳ್ಳಲಾಗುತ್ತದೆ. ಈ ಸೈಟ್ ಕೆಲವು ಮಾಹಿತಿಯನ್ನು ಬಳಸಿಕೊಂಡು ನಿಮ್ಮ ಬಗೆಗೆ ತಿಳಿದುಕೊಳ್ಳಲು ಸಾಧ್ಯವಾಗಬಹುದು, ಅಂತಹ ಮಾಹಿತಿಗಳೆಂದರೆ: + - ನಿಮ್ಮ ಸ್ಥಳ + - ನಿಮ್ಮ ದೈಹಿಕ ಲಕ್ಷಣಗಳು, ಉದಾಹರಣೆಗೆ ಕಣ್ಣಿನ ಸ್ಥಿತಿ + - ನಿಮ್ಮ ಚಲನೆಗಳು, ಉದಾಹರಣೆಗೆ ನಿಮ್ಮ ನಡಿಗೆಯ ಶೈಲಿ + + ಈ ಸೈಟ್ಗೆ ಪ್ರವೇಶವನ್ನು ನೀಡುವುದಕ್ಕೂ ಮೊದಲು ಅದನ್ನು ನೀವು ನಂಬುತ್ತೀರಾ ಎಂದು ಖಚಿತಪಡಿಸಿಕೊಳ್ಳಿ.</translation> <translation id="4247901771970415646"><ph name="USERNAME" /> ಗೆ ಸಿಂಕ್ ಮಾಡಲಾಗುವುದಿಲ್ಲ</translation> <translation id="4249248555939881673">ನೆಟ್ವರ್ಕ್ ಸಂಪರ್ಕಕ್ಕಾಗಿ ನಿರೀಕ್ಷಿಸಲಾಗುತ್ತಿದೆ...</translation> <translation id="4249373718504745892">ನಿಮ್ಮ ಕ್ಯಾಮರಾ ಹಾಗೂ ಮೈಕ್ರೋಫೋನ್ ಅನ್ನು ಪ್ರವೇಶಿಸುವುದರಿಂದ ಈ ಪುಟವನ್ನು ನಿರ್ಬಂಧಿಸಲಾಗಿದೆ.</translation>
diff --git a/chrome/app/resources/generated_resources_ko.xtb b/chrome/app/resources/generated_resources_ko.xtb index 9a800ac..cfcbff45 100644 --- a/chrome/app/resources/generated_resources_ko.xtb +++ b/chrome/app/resources/generated_resources_ko.xtb
@@ -2142,6 +2142,12 @@ <translation id="4242577469625748426">기기에 정책 설정을 설치하지 못함: <ph name="VALIDATION_ERROR" />.</translation> <translation id="4244238649050961491">스타일러스 앱 더보기</translation> <translation id="424726838611654458">항상 Adobe Reader에서 열기</translation> +<translation id="4247274662191902962">이 VR 경험을 사용하는 동안에만 센서 데이터가 공유됩니다. 사이트에서 다음과 같은 특정 정보를 사용해 나에 관한 정보를 학습할 수 있습니다. + - 위치 + - 눈 위치와 같은 신체적 특징 + - 걸음걸이와 같은 움직임 + + 액세스를 허용하기 전에 사이트를 신뢰할 수 있는지 확인하세요.</translation> <translation id="4247901771970415646"><ph name="USERNAME" />과(와) 동기화할 수 없음</translation> <translation id="4249248555939881673">네트워크 연결 대기 중...</translation> <translation id="4249373718504745892">카메라와 마이크 액세스가 차단된 페이지입니다.</translation>
diff --git a/chrome/app/resources/generated_resources_lt.xtb b/chrome/app/resources/generated_resources_lt.xtb index c542736..954cb89 100644 --- a/chrome/app/resources/generated_resources_lt.xtb +++ b/chrome/app/resources/generated_resources_lt.xtb
@@ -1,6 +1,7 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="lt"> +<translation id="1002469766576243227">Ši autentifikavimo paslauga priglobiama „<ph name="EXTENSION_NAME" />“</translation> <translation id="1003088604756913841">Atidarykite nuorodą naujame „<ph name="APP" />“ lange</translation> <translation id="1004218526896219317">Prieiga prie svetainės</translation> <translation id="1005274289863221750">Naudoti mikrofoną ir kamerą</translation> @@ -289,6 +290,7 @@ <translation id="1429300045468813835">Viskas išvalyta</translation> <translation id="143027896309062157">Skaityti ir keisti visus jūsų duomenis kompiuteryje ir lankomose svetainėse</translation> <translation id="1430915738399379752">Spausdinti</translation> +<translation id="1431188203598586230">Paskutinis programinės įrangos naujinys</translation> <translation id="1432581352905426595">Tvarkyti paieškos sistemas</translation> <translation id="1433811987160647649">Klausti prieš pasiekiant</translation> <translation id="1434696352799406980">Atlikus šį veiksmą paleidimo puslapis, naujo skirtuko puslapis, paieškos variklis ir prisegti skirtukai bus iš nustatyti naujo. Taip pat bus išjungti visi plėtiniai ir išvalyti laikini duomenys, pvz., slapukai. Žymės, istorija ir išsaugoti slaptažodžiai išvalyti nebus.</translation> @@ -528,6 +530,7 @@ <translation id="1781771911845953849">Paskyros ir sinchronizavimas</translation> <translation id="1782196717298160133">Telefono paieška</translation> <translation id="1784849162047402014">Mažai laisvos vietos įrenginio diske</translation> +<translation id="1790194216133135334">Siųsti nuorodą į „<ph name="DEVICE_NAME" />“</translation> <translation id="1792619191750875668">Išplėstas vaizdas</translation> <translation id="1794791083288629568">Atsiųskite atsiliepimų, kad padėtumėte mums išspręsti šią problemą.</translation> <translation id="1795214765651529549">Naudoti klasikinę</translation> @@ -590,6 +593,7 @@ <translation id="1875312262568496299">Pradėti</translation> <translation id="1875387611427697908">Tai galima pridėti tik iš sistemos <ph name="CHROME_WEB_STORE" /></translation> <translation id="1877520246462554164">Nepavyko gauti tapatybės nustatymo prieigos rakto. Atsijunkite ir vėl prisijunkite, kad galėtumėte bandyti dar kartą.</translation> +<translation id="1877860345998737529">Jungiklio veiksmo priskyrimas</translation> <translation id="1879000426787380528">Prisijungti kaip</translation> <translation id="1880905663253319515">Ištrinti „<ph name="CERTIFICATE_NAME" />“ sertifikatą?</translation> <translation id="1886996562706621347">Leisti svetainėms prašyti tapti numatytosiomis protokolų doroklėmis (rekomenduojama)</translation> @@ -869,7 +873,9 @@ <translation id="230927227160767054">Puslapis prašo leidimo įdiegti paslaugos doroklę.</translation> <translation id="2309620859903500144">Ši svetainė užblokuota, kad nebūtų naudojami judesio ar šviesos jutikliai.</translation> <translation id="2315414688463285945">Konfigūruojant „Linux“ failus įvyko klaida. Bandykite dar kartą.</translation> +<translation id="2315587498123194634">Siųsti nuorodą į „<ph name="DEVICE_NAME" />“</translation> <translation id="2316129865977710310">Ne, ačiū</translation> +<translation id="2316739859433277603">Vykdant paieškas programų paleidimo priemonėje naudojamas naršyklės <ph name="BEGIN_LINK" />paieškos variklio nustatymas<ph name="END_LINK" />.</translation> <translation id="2317842250900878657">Atlikta: <ph name="PROGRESS_PERCENT" /> %</translation> <translation id="2318143611928805047">Popieriaus lapo dydis</translation> <translation id="2318817390901984578">Jei norite naudoti „Android“ programas, įkraukite ir atnaujinkite savo „<ph name="DEVICE_TYPE" />“.</translation> @@ -909,6 +915,7 @@ <translation id="2365507699358342471">Ši svetainė gali peržiūrėti tekstą ir vaizdus, nukopijuotus į iškarpinę.</translation> <translation id="2367199180085172140">Nustatyti failo bendrinimą</translation> <translation id="2367972762794486313">Rodyti programas</translation> +<translation id="2369105924912929484">Perjungti skaityti pritaikyto puslapio turinį</translation> <translation id="2371076942591664043">Baigus &atidaryti</translation> <translation id="2375406435414127095">Susieti su telefonu</translation> <translation id="2377667304966270281">Sunkūs gedimai</translation> @@ -1159,6 +1166,7 @@ <translation id="2739191690716947896">Derinti</translation> <translation id="2739240477418971307">Keisti pasiekiamumo nustatymus</translation> <translation id="2740393541869613458">peržiūrėti prižiūrimo naudotojo aplankytas svetaines ir</translation> +<translation id="2741912629735277980">Rodyti NS prisijungimo ekrane</translation> <translation id="274290345632688601">Atkuriami „Linux“ failai ir programos</translation> <translation id="2743387203779672305">Kopijuoti į iškarpinę</translation> <translation id="2745080116229976798">„Microsoft“ tinkamas pavaldumas</translation> @@ -1275,6 +1283,7 @@ <translation id="2910318910161511225">Prisijunkite prie tinklo ir bandykite dar kartą</translation> <translation id="2913331724188855103">Leisti svetainėms išsaugoti ir nuskaityti slapukų duomenis (rekomenduojama)</translation> <translation id="2915102088417824677">Žr. veiklos žurnalą</translation> +<translation id="2915873080513663243">Automatinis nuskaitymas</translation> <translation id="2916073183900451334">Paspaudus tinklalapio skirtuką paryškinamos nuorodos ir formos laukai</translation> <translation id="2916745397441987255">Ieškoti plėtinių</translation> <translation id="2921081876747860777">Sukurkite slaptažodį, kad apsaugotumėte vietinius duomenis.</translation> @@ -1483,6 +1492,7 @@ <translation id="327147043223061465">Žr. visus slapukus ir svetainės duomenis</translation> <translation id="3271648667212143903"><ph name="ORIGIN" /> nori prisijungti</translation> <translation id="3274763671541996799">Naudojate viso ekrano režimą.</translation> +<translation id="3275778809241512831">Vidinis saugos raktas šiuo metu yra nesaugus. Pašalinkite jį iš visų paslaugų, kuriose jį naudojote. Norėdami išspręsti problemą, iš naujo nustatykite saugos raktą.</translation> <translation id="3275778913554317645">Atidaryti kaip langą</translation> <translation id="3278001907972365362">Reikia atkreipti dėmesį į „Google“ paskyrą (-as)</translation> <translation id="3279230909244266691">Šis procesas gali užtrukti kelias minutes. Paleidžiamas virtualus įrenginys.</translation> @@ -1575,6 +1585,7 @@ <translation id="3412265149091626468">Nukreipti į pasirinkimą</translation> <translation id="3413122095806433232">CA išdavėjai: <ph name="LOCATION" /></translation> <translation id="3414952576877147120">Dydis:</translation> +<translation id="3420501302812554910">Reikia iš naujo nustatyti vidinį saugos raktą</translation> <translation id="3421387094817716717">Elipsės formos kreivės viešasis raktas</translation> <translation id="3423463006624419153">Telefonuose „<ph name="PHONE_NAME_1" />“ ir „<ph name="PHONE_NAME_2" />“:</translation> <translation id="3423858849633684918">Iš naujo paleiskite „<ph name="PRODUCT_NAME" />“</translation> @@ -1603,6 +1614,7 @@ <translation id="3450157232394774192">Neveikos būsenos užėmimo procentas</translation> <translation id="3453612417627951340">Reikalingas leidimas</translation> <translation id="3454157711543303649">Aktyvinimas baigtas</translation> +<translation id="3454213325559396544">Tai yra paskutinis automatinis programinės įrangos ir saugos naujinys, skirtas „<ph name="DEVICE_TYPE" />“. Kad gautumėte būsimus naujinius, įsigykite naujesnį modelį.</translation> <translation id="345693547134384690">Atidaryti &paveikslėlį naujame skirtuke</translation> <translation id="3457500881955698515">Įmonė ar organizacija reikalauja iškart atnaujinti šį įrenginį</translation> <translation id="3459509316159669723">Spausdinimas</translation> @@ -1760,6 +1772,7 @@ <translation id="3672681487849735243">Aptikta gamyklos klaida</translation> <translation id="367645871420407123">Jei norite nustatyti numatytojo bandomojo vaizdo vertės pagrindinį slaptažodį, palikite lauką tuščią.</translation> <translation id="3677657024345889897">Tyliausiai</translation> +<translation id="3677911431265050325">Pateikti užklausą dėl svetainės mobiliesiems</translation> <translation id="3678156199662914018">Plėtinys: <ph name="EXTENSION_NAME" /></translation> <translation id="3681311097828166361">Dėkojame už atsiliepimus. Dabar esate neprisijungę, todėl jūsų pranešimas bus išsiųstas vėliau.</translation> <translation id="3682824389861648626">Judesių slenkstis</translation> @@ -2144,6 +2157,12 @@ <translation id="4242577469625748426">Diegiant politikos nustatymus įrenginyje įvyko klaida: <ph name="VALIDATION_ERROR" />.</translation> <translation id="4244238649050961491">Rasti daugiau rašiklio programų</translation> <translation id="424726838611654458">Visada atidaryti naudojant „Adobe Reader“</translation> +<translation id="4247274662191902962">Jutiklių duomenys bus bendrinami, tik kol naudositės šiomis VR funkcijomis. Svetainė gali sužinoti apie jus pagal tam tikrą informaciją, pavyzdžiui: + – jūsų vietovę; + – jūsų fizines savybes, pvz., akių padėtį; + – jūsų judesius, pvz., eiseną. + + Prieš suteikdami prieigą įsitikinkite, kad pasitikite šia svetaine.</translation> <translation id="4247901771970415646">Negalima sinchronizuoti su <ph name="USERNAME" /></translation> <translation id="4249248555939881673">Laukiama tinklo ryšio...</translation> <translation id="4249373718504745892">Šis puslapis užblokuotas, kad nepasiektų fotoaparato ir mikrofono.</translation> @@ -2206,6 +2225,7 @@ <translation id="4350019051035968019">Šio įrenginio negalima užregistruoti domene, kuriam priklauso paskyra, nes pažymėta, kad įrenginys tvarkomas kito domeno.</translation> <translation id="4354344420232759511">Lankytos svetainės bus rodomos čia</translation> <translation id="435527878592612277">Pasirinkite nuotrauką</translation> +<translation id="4358313196493694334">Stabilizuoti paspaudimo vietą</translation> <translation id="4359408040881008151">Įdiegta, nes priklauso nuo plėtinio (-ių).</translation> <translation id="4359717112757026264">Miesto architektūra</translation> <translation id="4361142739114356624">Trūksta šio kliento sertifikato privataus rakto arba jis netinkamas</translation> @@ -2330,6 +2350,7 @@ <translation id="4558426062282641716">Pateikta užklausa dėl leidimo automatiškai paleisti</translation> <translation id="4558491878126948419">Gaukite „<ph name="DEVICE_TYPE" />“ patarimų, „Google“ produktų naujinius ir bendrinkite atsiliepimus. Atsisakyti prenumeratos galėsite bet kuriuo metu.</translation> <translation id="4559617833001311418">Ši svetainė pasiekia judesio ir šviesos jutiklius.</translation> +<translation id="4561098487691395071">Arba nurodykite spausdintuvo PPD</translation> <translation id="4562155214028662640">Pridėti piršto antspaudą</translation> <translation id="4563880231729913339">Trečias pirštas</translation> <translation id="4565377596337484307">Slėpti slaptažodį</translation> @@ -2574,6 +2595,7 @@ <translation id="494286511941020793">Tarpinio serverio konfigūracijos pagalba</translation> <translation id="4943368462779413526">Futbolas</translation> <translation id="4943691134276646401">„<ph name="CHROME_EXTENSION_NAME" />“ nori prisijungti prie nuosekliojo prievado</translation> +<translation id="4944310289250773232">Ši autentifikavimo paslauga priglobiama <ph name="SAML_DOMAIN" /></translation> <translation id="495170559598752135">Veiksmai</translation> <translation id="4953689047182316270">Reaguoti į pritaikymo neįgaliesiems įvykius</translation> <translation id="4953808748584563296">Numatytasis oranžinis pseudoportretas</translation> @@ -2666,6 +2688,7 @@ <translation id="5094721898978802975">Sąveikauti su atitinkamomis vietinėmis programomis</translation> <translation id="5097002363526479830">Nepavyko prisijungti prie tinklo „<ph name="NAME" />“: <ph name="DETAILS" /></translation> <translation id="5101042277149003567">Atidaryti visas žymas</translation> +<translation id="5101839224773798795">Automatiškai spustelėti sustojus žymekliui</translation> <translation id="5108967062857032718">Nustatymai – „Android“ programų pašalinimas</translation> <translation id="5109044022078737958">Austra</translation> <translation id="5111646998522066203">Išjungti inkognito režimą</translation> @@ -3150,6 +3173,7 @@ <translation id="5852112051279473187">Oi! Bandant užregistruoti šį įrenginį iškilo rimtų problemų. Bandykite dar kartą arba susisiekite su palaikymo atstovu.</translation> <translation id="5852137567692933493">Paleisti iš naujo ir naudoti „Powerwash“</translation> <translation id="5854912040170951372">Gabaliukas</translation> +<translation id="5855643921295613558">0,6 sek.</translation> <translation id="5855773610748894548">Oi, saugaus modulio klaida.</translation> <translation id="5856721540245522153">Įgalinti derinimo funkcijas</translation> <translation id="5857090052475505287">Naujas aplankas</translation> @@ -3439,6 +3463,7 @@ <translation id="6279183038361895380">Paspauskite |<ph name="ACCELERATOR" />|, kad būtų rodomas žymeklis</translation> <translation id="6280215091796946657">Prisijunkite naudodami kitą paskyrą</translation> <translation id="6280912520669706465">ARC</translation> +<translation id="628352644014831790">4 sek.</translation> <translation id="6285120108426285413">„<ph name="FILE_NAME" />“ nėra įprastai atsisiunčiamas ir gali būti pavojingas.</translation> <translation id="6285120908535925801">{NUM_PRINTER,plural, =1{Naujas spausdintuvas tinkle}one{Nauji spausdintuvai tinkle}few{Nauji spausdintuvai tinkle}many{Nauji spausdintuvai tinkle}other{Nauji spausdintuvai tinkle}}</translation> <translation id="6286708577777130801">Išsaugota išsami slaptažodžių informacija</translation> @@ -3645,6 +3670,7 @@ <translation id="6612358246767739896">Apsaugotas turinys</translation> <translation id="6613452264606394692">Grįžkite čia greičiau ir patogiau pasižymėję šį puslapį</translation> <translation id="6615455863669487791">Rodyti</translation> +<translation id="6617100836880592260">Nuskaitymo sparta: <ph name="SPEED_WITH_UNITS" /></translation> <translation id="6618097958368085618">Vis tiek palikti</translation> <translation id="6619058681307408113">Eilutinio spausdintuvo paslaugų teikimo sistema (LPD)</translation> <translation id="661907246513853610">Svetainė gali stebėti jūsų vietą</translation> @@ -4459,6 +4485,7 @@ <translation id="7831491651892296503">Klaida konfigūruojant tinklą</translation> <translation id="7831754656372780761">„<ph name="TAB_TITLE" />“ <ph name="EMOJI_MUTING" /></translation> <translation id="7832084384634357321">Pabaigos laikas</translation> +<translation id="783214144752121388">Blokuoti, kad svetainėse nebūtų vykdoma „Flash“ (rekomenduojama)</translation> <translation id="7833720883933317473">Išsaugoti tinkinti žodžiai bus rodomi čia</translation> <translation id="7835178595033117206">Žymė pašalinta</translation> <translation id="7837776265184002579">Pagrindinis puslapis pakeistas į <ph name="URL" />.</translation> @@ -4514,6 +4541,7 @@ <translation id="7911118814695487383">Linux</translation> <translation id="7912080627461681647">Slaptažodis pakeistas serveryje. Atsijunkite, tada vėl prisijunkite.</translation> <translation id="7915471803647590281">Prieš atsiųsdami atsiliepimą, aprašykite problemą.</translation> +<translation id="7919210519031517829"><ph name="DURATION" /> sek.</translation> <translation id="792514962475806987">Prie doko prijungto didintuvo mastelio keitimo lygis:</translation> <translation id="7925247922861151263">AAA patikra nepavyko</translation> <translation id="7925285046818567682">Laukiama <ph name="HOST_NAME" />...</translation> @@ -4571,6 +4599,7 @@ <translation id="7987814697832569482">Visada susieti naudojant šį VPN</translation> <translation id="798835209536175951">Siųskite ir gaukite teksto pranešimus naudodami „Chromebook“ įrenginį. <ph name="LINK_BEGIN" />Sužinokite daugiau<ph name="LINK_END" /></translation> <translation id="7988355189918024273">Įgalinti pasiekiamumo funkcijas</translation> +<translation id="7991296728590311172">Prieigos jungikliu nustatymai</translation> <translation id="7994702968232966508">EAP metodas</translation> <translation id="7997826902155442747">Apdorojimo pirmumas</translation> <translation id="7999229196265990314">Sukurti šie failai: @@ -4784,6 +4813,8 @@ <translation id="8308179586020895837">Klausti, jei <ph name="HOST" /> nori pasiekti fotoaparatą</translation> <translation id="830868413617744215">Beta versija</translation> <translation id="8309458809024885768">Sertifikatas jau yra</translation> +<translation id="8314381333424235892">Plėtinio nėra arba jis pašalintas</translation> +<translation id="8316618172731049784">Siųsti į „<ph name="DEVICE_NAME" />“</translation> <translation id="8317671367883557781">Pridėti tinklo ryšį</translation> <translation id="8319414634934645341">Išplėstinis rakto naudojimas</translation> <translation id="8320459152843401447">Visas ekranas</translation> @@ -4940,6 +4971,7 @@ <translation id="8588866096426746242">Rodyti profilio statistiką</translation> <translation id="8588868914509452556">„<ph name="WINDOW_TITLE" />“ – VR perdavimas į ausines</translation> <translation id="8590375307970699841">Nustatyti automatinius naujinius</translation> +<translation id="8591783563402255548">1 sek.</translation> <translation id="8592141010104017453">Visiškai nerodyti pranešimų</translation> <translation id="8593121833493516339">Siųskite naudojimo ir diagnostikos duomenis. Padėkite tobulinti vaiko „Android“ funkcijas automatiškai siųsdami „Google“ diagnostikos, įrenginio ir programų naudojimo duomenis. Tai nebus naudojama siekiant nustatyti jūsų vaiko tapatybę ir padės pagerinti sistemos bei programos stabilumą ir teikti kitus patobulinimus. Kai kurie sukaupti duomenys taip pat bus naudingi „Google“ programoms ir partneriams, pvz., „Android“ kūrėjams. Jei papildomas „Žiniatinklio ir programų veiklos“ nustatymas įjungtas vaiko įrenginyje, šie duomenys gali būti išsaugoti vaiko „Google“ paskyroje. <ph name="BEGIN_LINK1" />Sužinokite daugiau<ph name="END_LINK1" /></translation> <translation id="8594908476761052472">Užfiksuoti vaizdo įrašą</translation> @@ -4969,6 +5001,7 @@ <translation id="8637688295594795546">Galimas sistemos naujinys. Ruošiamasi atsisiųsti...</translation> <translation id="8639047128869322042">Tikrinama, ar nėra kenkėjiškos programinės įrangos...</translation> <translation id="8642171459927087831">Prieigos raktas</translation> +<translation id="8642900771896232685">2 sek.</translation> <translation id="8642947597466641025">Padidinti tekstą</translation> <translation id="8643418457919840804">Norėdami tęsti pasirinkite toliau pateiktą parinktį.</translation> <translation id="8644655801811752511">Šio saugos rakto nustatyti iš naujo nepavyko. Pabandykite nustatyti raktą iš naujo iš karto jį įdėję.</translation> @@ -5170,6 +5203,7 @@ <translation id="8910222113987937043">Žymių, istorijos, slaptažodžių ir kitų nustatymų pakeitimai nebebus sinchronizuojami su „Google“ paskyra. Tačiau esami duomenys toliau bus saugomi „Google“ paskyroje ir juos bus galima tvarkyti <ph name="BEGIN_LINK" />„Google“ informacijos suvestinėje<ph name="END_LINK" />.</translation> <translation id="8912362522468806198">„Google“ paskyra</translation> <translation id="8912793549644936705">Ištemptas</translation> +<translation id="8912810933860534797">Įgalinti automatinį nuskaitymą</translation> <translation id="891365694296252935">Siųskite naudojimo ir diagnostikos duomenis. Šiuo metu šis įrenginys automatiškai siunčia „Google“ diagnostikos, įrenginio ir programų naudojimo duomenis. Tai nebus naudojama siekiant nustatyti jūsų vaiko tapatybę ir padės pagerinti sistemos bei programos stabilumą ir teikti kitus patobulinimus. Kai kurie sukaupti duomenys taip pat bus naudingi „Google“ programoms ir partneriams, pvz., „Android“ kūrėjams. Šį nustatymą taiko savininkas. Jei papildomas „Žiniatinklio ir programų veiklos“ nustatymas įjungtas vaiko įrenginyje, šie duomenys gali būti išsaugoti vaiko „Google“ paskyroje. <ph name="BEGIN_LINK1" />Sužinokite daugiau<ph name="END_LINK1" /></translation> <translation id="8915370057835397490">Įkeliamas pasiūlymas</translation> <translation id="8916476537757519021">Inkognito antrinis kadras: <ph name="SUBFRAME_SITE" /></translation> @@ -5322,6 +5356,7 @@ <translation id="9153934054460603056">Išsaugoti tapatybę ir slaptažodį</translation> <translation id="9154194610265714752">Atnaujinta</translation> <translation id="91568222606626347">Kurti spartųjį klavišą...</translation> +<translation id="9157096865782046368">0,8 sek.</translation> <translation id="9157697743260533322">Nepavyko nustatyti automatinių naujinių visiems naudotojams (išankstinio paleidimo klaida: <ph name="ERROR_NUMBER" />)</translation> <translation id="9158715103698450907">Deja, nustatant tapatybę iškilo tinklo ryšio problema. Patikrinkite tinklo ryšį ir bandykite dar kartą.</translation> <translation id="916607977885256133">Vaizdas vaizde</translation>
diff --git a/chrome/app/resources/generated_resources_lv.xtb b/chrome/app/resources/generated_resources_lv.xtb index af2504ac..5d4e166 100644 --- a/chrome/app/resources/generated_resources_lv.xtb +++ b/chrome/app/resources/generated_resources_lv.xtb
@@ -1,6 +1,7 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="lv"> +<translation id="1002469766576243227">Šo autentifikācijas pakalpojumu mitina <ph name="EXTENSION_NAME" /></translation> <translation id="1003088604756913841">Atvērt saiti jaunā <ph name="APP" /> logā</translation> <translation id="1004218526896219317">Piekļuve vietnēm</translation> <translation id="1005274289863221750">Izmantot jūsu mikrofonu un videokameru</translation> @@ -289,6 +290,7 @@ <translation id="1429300045468813835">Viss tika notīrīts</translation> <translation id="143027896309062157">Lasīt un mainīt visus jūsu datus jūsu datorā un jūsu apmeklētajās vietnēs</translation> <translation id="1430915738399379752">Drukāt</translation> +<translation id="1431188203598586230">Pēdējais programmatūras atjauninājums</translation> <translation id="1432581352905426595">Pārvaldīt meklējumprogrammas</translation> <translation id="1433811987160647649">Jautāt pirms piekļūšanas</translation> <translation id="1434696352799406980">Tādējādi tiks atiestatīta jūsu sākumlapa, jaunas cilnes lapa, meklētājprogramma un piespraustās cilnes. Turklāt tiks atspējoti visi paplašinājumi, kā arī tiks notīrīti pagaidu dati, piemēram, sīkfaili. Netiks notīrītas jūsu grāmatzīmes, vēsture un saglabātās paroles.</translation> @@ -528,6 +530,7 @@ <translation id="1781771911845953849">Konti un sinhronizācija</translation> <translation id="1782196717298160133">Tālruņa atrašana</translation> <translation id="1784849162047402014">Ierīces diskā ir maz vietas.</translation> +<translation id="1790194216133135334">Nosūtīt saiti uz: <ph name="DEVICE_NAME" /></translation> <translation id="1792619191750875668">Paplašinātais attēlojums</translation> <translation id="1794791083288629568">Sūtīt atsauksmes, lai palīdzētu novērst šo problēmu.</translation> <translation id="1795214765651529549">Izmantot klasisko motīvu</translation> @@ -590,6 +593,7 @@ <translation id="1875312262568496299">Sākt</translation> <translation id="1875387611427697908">To var pievienot tikai no veikala <ph name="CHROME_WEB_STORE" />.</translation> <translation id="1877520246462554164">Neizdevās iegūt autentifikācijas pilnvaru. Lai mēģinātu vēlreiz, izrakstieties un vēlreiz pierakstieties.</translation> +<translation id="1877860345998737529">Pārslēgšanas darbību piešķiršana</translation> <translation id="1879000426787380528">Pierakstīties kā</translation> <translation id="1880905663253319515">Vai dzēst sertifikātu “<ph name="CERTIFICATE_NAME" />”?</translation> <translation id="1886996562706621347">Ļaut vietnēm lūgt kļūt par protokolu noklusējuma apdarinātājiem (ieteicams)</translation> @@ -869,7 +873,9 @@ <translation id="230927227160767054">Šī lapa vēlas instalēt pakalpojumu apdarinātāju.</translation> <translation id="2309620859903500144">Šīs vietnes piekļuve kustību vai gaismas sensoriem ir bloķēta.</translation> <translation id="2315414688463285945">Konfigurējot Linux failus, radās kļūda. Lūdzu, mēģiniet vēlreiz.</translation> +<translation id="2315587498123194634">Nosūtīt saiti uz: <ph name="DEVICE_NAME" /></translation> <translation id="2316129865977710310">Nē, paldies</translation> +<translation id="2316739859433277603">Meklēšanas vaicājumiem no lietotņu palaidēja tiek izmantots jūsu pārlūkprogrammas <ph name="BEGIN_LINK" />meklētājprogrammas iestatījums<ph name="END_LINK" />.</translation> <translation id="2317842250900878657">Pabeigti: <ph name="PROGRESS_PERCENT" />%</translation> <translation id="2318143611928805047">Papīra izmēri</translation> <translation id="2318817390901984578">Lai izmantotu Android lietotnes, uzlādējiet un atjauniniet savu ierīci (<ph name="DEVICE_TYPE" />).</translation> @@ -909,6 +915,7 @@ <translation id="2365507699358342471">Šī vietne var skatīt starpliktuvē kopēto tekstu un attēlus.</translation> <translation id="2367199180085172140">Pievienot failu kopīgošanu</translation> <translation id="2367972762794486313">Rādīt lietotnes</translation> +<translation id="2369105924912929484">Pārslēgt filtrētu lapas saturu</translation> <translation id="2371076942591664043">Atvērt, kad esat beidzis</translation> <translation id="2375406435414127095">Savienošana ar tālruni</translation> <translation id="2377667304966270281">Nopietnas kļūdas</translation> @@ -1159,6 +1166,7 @@ <translation id="2739191690716947896">Atkļūdot</translation> <translation id="2739240477418971307">Mainītu jūsu pieejamības iestatījumus</translation> <translation id="2740393541869613458">pārskatīt vietnes, kuras apmeklējis uzraudzītais lietotājs;</translation> +<translation id="2741912629735277980">Attēlot lietotāja saskarni pieteikšanās ekrānā</translation> <translation id="274290345632688601">Linux lietotņu un failu atjaunošana</translation> <translation id="2743387203779672305">Kopēt starpliktuvē</translation> <translation id="2745080116229976798">Microsoft pilnīga pakārtotība</translation> @@ -1275,6 +1283,7 @@ <translation id="2910318910161511225">Izveidojiet savienojumu ar tīklu un mēģiniet vēlreiz.</translation> <translation id="2913331724188855103">Atļaut vietnēm saglabāt un lasīt sīkfailu datus (ieteicams)</translation> <translation id="2915102088417824677">Skatīt darbību žurnālu</translation> +<translation id="2915873080513663243">Automātiska meklēšana</translation> <translation id="2916073183900451334">Tabulēšanas taustiņa piespiešana tīmekļa lapā izgaismo saites, kā arī veidlapu laukus</translation> <translation id="2916745397441987255">Meklēt paplašinājumus</translation> <translation id="2921081876747860777">Paroles izveide lokālo datu aizsardzībai</translation> @@ -1483,6 +1492,7 @@ <translation id="327147043223061465">Skatīt visus sīkfailus un vietņu datus</translation> <translation id="3271648667212143903"><ph name="ORIGIN" /> vēlas izveidot savienojumu</translation> <translation id="3274763671541996799">Ir atvērts pilnekrāna režīms.</translation> +<translation id="3275778809241512831">Jūsu iekšējā drošības atslēga šobrīd nav droša. Lūdzu, noņemiet drošības atslēgu no jebkādiem pakalpojumiem, kuros to izmantojāt. Lai atrisinātu šo problēmu, atiestatiet drošības atslēgu.</translation> <translation id="3275778913554317645">Atvērt kā logu</translation> <translation id="3278001907972365362">Pievērsiet uzmanību savam(-iem) Google kontam(-iem).</translation> <translation id="3279230909244266691">Šis process var ilgt dažas minūtes. Notiek virtuālās mašīnas startēšana.</translation> @@ -1575,6 +1585,7 @@ <translation id="3412265149091626468">Pāriet uz atlasi</translation> <translation id="3413122095806433232">CA izsniedzēji: <ph name="LOCATION" /></translation> <translation id="3414952576877147120">Lielums:</translation> +<translation id="3420501302812554910">Jāatiestata iekšējā drošības atslēga</translation> <translation id="3421387094817716717">Eliptiskas līknes publiskā atslēga</translation> <translation id="3423463006624419153">Jūsu tālruņos “<ph name="PHONE_NAME_1" />” un “<ph name="PHONE_NAME_2" />”:</translation> <translation id="3423858849633684918">Restartējiet <ph name="PRODUCT_NAME" /></translation> @@ -1603,6 +1614,7 @@ <translation id="3450157232394774192">Neaktīvs stāvoklis — noslogojuma procentuālais daudzums</translation> <translation id="3453612417627951340">Nepieciešama pilnvara</translation> <translation id="3454157711543303649">Aktivizācija pabeigta</translation> +<translation id="3454213325559396544">Šis ir pēdējais automātiskais programmatūras un drošības atjauninājums šai ierīcei (<ph name="DEVICE_TYPE" />). Lai saņemtu turpmākus atjauninājumus, veiciet jaunināšanu uz jaunāku modeli.</translation> <translation id="345693547134384690">Atvērt attēlu jaunā cilnē</translation> <translation id="3457500881955698515">Saskaņā ar jūsu uzņēmuma vai organizācijas prasībām šī ierīce ir nekavējoties jāatjaunina</translation> <translation id="3459509316159669723">Drukāšana</translation> @@ -1760,6 +1772,7 @@ <translation id="3672681487849735243">Konstatēta rūpnīcas kļūda</translation> <translation id="367645871420407123">Atstājiet tukšu, ja vēlaties iestatīt saknes paroli kā noklusējuma testa attēla vērtību.</translation> <translation id="3677657024345889897">Visklusāk</translation> +<translation id="3677911431265050325">Pieprasīt mobilo vietni</translation> <translation id="3678156199662914018">Paplašinājums: <ph name="EXTENSION_NAME" /></translation> <translation id="3681311097828166361">Paldies par atsauksmēm! Pašlaik esat bezsaistē, un jūsu ziņojums tiks nosūtīts vēlāk.</translation> <translation id="3682824389861648626">Kustības slieksnis</translation> @@ -2144,6 +2157,12 @@ <translation id="4242577469625748426">Neizdevās ierīcē instalēt politikas iestatījumus: <ph name="VALIDATION_ERROR" />.</translation> <translation id="4244238649050961491">Atrast citas skārienekrāna pildspalvas lietotnes</translation> <translation id="424726838611654458">Vienmēr atvērt programmā Adobe Reader</translation> +<translation id="4247274662191902962">Sensoru dati tiks kopīgoti tikai šajā VR pieredzē. Vietne var jūs atpazīt, izmantojot noteiktu informāciju, piemēram: + - jūsu atrašanās vietu; + - jūsu sejas vaibstus, piemēram, acu izvietojumu; + - jūsu kustības, piemēram, gaitas īpatnības. + + Atļaujiet piekļuvi tikai tad, ja uzticaties šai vietnei.</translation> <translation id="4247901771970415646">Nevar sinhronizēt ar lietotāju <ph name="USERNAME" /></translation> <translation id="4249248555939881673">Tiek gaidīta savienojuma izveide ar tīklu...</translation> <translation id="4249373718504745892">Šīs lapas piekļuve jūsu kamerai un mikrofonam ir bloķēta.</translation> @@ -2206,6 +2225,7 @@ <translation id="4350019051035968019">Šo ierīci nevar reģistrēt domēnā, kuram pieder jūsu konts, jo tā ir iestatīta pārvaldībai citā domēnā.</translation> <translation id="4354344420232759511">Šeit tiks rādītas jūsu apmeklētās vietnes.</translation> <translation id="435527878592612277">Atlasiet savu fotoattēlu</translation> +<translation id="4358313196493694334">Stabilizēt klikšķa atrašanās vietu</translation> <translation id="4359408040881008151">Paplašinājums tika instalēts atkarīga(-u) paplašinājuma(-u) dēļ.</translation> <translation id="4359717112757026264">Pilsētu fotoattēli</translation> <translation id="4361142739114356624">Nav norādīta šī klienta sertifikāta privātā atslēga, vai tā nav derīga.</translation> @@ -2330,6 +2350,7 @@ <translation id="4558426062282641716">Pieprasīta automātiskās palaišanas atļauja</translation> <translation id="4558491878126948419">Saņemiet <ph name="DEVICE_TYPE" /> padomus un Google produktu atjauninājumus un kopīgojiet atsauksmes. Varat jebkurā brīdī anulēt abonementu</translation> <translation id="4559617833001311418">Šī vietne var piekļūt jūsu kustību vai gaismas sensoriem.</translation> +<translation id="4561098487691395071">Vai norādiet printera PPD</translation> <translation id="4562155214028662640">Pievienot pirksta nospiedumu</translation> <translation id="4563880231729913339">3. pirksts</translation> <translation id="4565377596337484307">Slēpt paroli</translation> @@ -2574,6 +2595,7 @@ <translation id="494286511941020793">Starpniekservera konfigurācijas palīdzība</translation> <translation id="4943368462779413526">Futbols</translation> <translation id="4943691134276646401">Paplašinājums “<ph name="CHROME_EXTENSION_NAME" />” vēlas izveidot savienojumu ar seriālo pieslēgvietu</translation> +<translation id="4944310289250773232">Šo autentifikācijas pakalpojumu mitina <ph name="SAML_DOMAIN" /></translation> <translation id="495170559598752135">Darbības</translation> <translation id="4953689047182316270">Atbildēt uz pieejamības notikumiem</translation> <translation id="4953808748584563296">Noklusējuma iemiesojums oranžā krāsā</translation> @@ -2666,6 +2688,7 @@ <translation id="5094721898978802975">Sazināties ar iebūvētām lietojumprogrammām, kas sadarbojas</translation> <translation id="5097002363526479830">Neizdevās izveidot savienojumu ar tīklu <ph name="NAME" />: <ph name="DETAILS" /></translation> <translation id="5101042277149003567">Atvērt visas grāmatzīmes</translation> +<translation id="5101839224773798795">Automātiski noklikšķināt, kad kursors apstājas</translation> <translation id="5108967062857032718">Iestatījumi — Android lietotņu noņemšana</translation> <translation id="5109044022078737958">Atlēte</translation> <translation id="5111646998522066203">Iziet no inkognito režīma</translation> @@ -3149,6 +3172,7 @@ <translation id="5852112051279473187">Vai! Palaižot ierīci, kaut kas nogāja greizi. Lūdzu, mēģiniet vēlreiz vai sazinieties ar savu atbalsta pārstāvi.</translation> <translation id="5852137567692933493">Restartēt un aktivizēt funkciju Powerwash</translation> <translation id="5854912040170951372">Pica</translation> +<translation id="5855643921295613558">0,6 sekundes</translation> <translation id="5855773610748894548">Diemžēl radās drošības moduļa kļūda</translation> <translation id="5856721540245522153">Atkļūdošanas funkciju iespējošana</translation> <translation id="5857090052475505287">Jauna mape</translation> @@ -3438,6 +3462,7 @@ <translation id="6279183038361895380">Lai tiktu parādīts kursors, nospiediet |<ph name="ACCELERATOR" />|</translation> <translation id="6280215091796946657">Pierakstīties ar citu kontu</translation> <translation id="6280912520669706465">ARC</translation> +<translation id="628352644014831790">4 sekundes</translation> <translation id="6285120108426285413">Fails <ph name="FILE_NAME" /> parasti netiek lejupielādēts, un tas var būt bīstams.</translation> <translation id="6285120908535925801">{NUM_PRINTER,plural, =1{Jauns printeris jūsu tīklā}zero{Jauni printeri jūsu tīklā}one{Jauni printeri jūsu tīklā}other{Jauni printeri jūsu tīklā}}</translation> <translation id="6286708577777130801">Informācija par saglabāto paroli</translation> @@ -3644,6 +3669,7 @@ <translation id="6612358246767739896">Aizsargāts saturs</translation> <translation id="6613452264606394692">Saglabājiet šo lapu kā grāmatzīmi, lai vēlāk to vieglāk atrastu</translation> <translation id="6615455863669487791">Rādīt man</translation> +<translation id="6617100836880592260">Meklēšanas ātrums: <ph name="SPEED_WITH_UNITS" /></translation> <translation id="6618097958368085618">Tik un tā paturēt</translation> <translation id="6619058681307408113">Line Printer Daemon (LPD)</translation> <translation id="661907246513853610">Vietne var izsekot jūsu atrašanās vietu.</translation> @@ -4457,6 +4483,7 @@ <translation id="7831491651892296503">Tīkla konfigurācijas kļūda</translation> <translation id="7831754656372780761"><ph name="TAB_TITLE" /> <ph name="EMOJI_MUTING" /></translation> <translation id="7832084384634357321">Beigu laiks</translation> +<translation id="783214144752121388">Bloķēt Flash aktivizēšanu vietnēs (ieteicams)</translation> <translation id="7833720883933317473">Šeit tiks parādīti saglabātie pielāgotie vārdi.</translation> <translation id="7835178595033117206">Grāmatzīme ir noņemta</translation> <translation id="7837776265184002579">Jūsu sākumlapa tika mainīta uz: <ph name="URL" />.</translation> @@ -4512,6 +4539,7 @@ <translation id="7911118814695487383">Linux</translation> <translation id="7912080627461681647">Jūsu parole serverī ir mainīta. Lūdzu, izrakstieties un vēlreiz pierakstieties.</translation> <translation id="7915471803647590281">Pirms atsauksmes nosūtīšanas lūdzam jūs pastāstīt, kas notiek.</translation> +<translation id="7919210519031517829"><ph name="DURATION" /> s</translation> <translation id="792514962475806987">Dokotās tālummaiņas līmenis:</translation> <translation id="7925247922861151263">AAA pārbaude neizdevās</translation> <translation id="7925285046818567682">Gaida <ph name="HOST_NAME" />...</translation> @@ -4569,6 +4597,7 @@ <translation id="7987814697832569482">Savienojuma izveidei vienmēr izmantot šo VPN</translation> <translation id="798835209536175951">Sūtiet īsziņas no sava Chromebook datora, kā arī saņemiet īsziņas tajā. <ph name="LINK_BEGIN" />Uzziniet vairāk<ph name="LINK_END" />.</translation> <translation id="7988355189918024273">Iespējot pieejamības funkcijas</translation> +<translation id="7991296728590311172">Slēdžu piekļuves iestatījumi</translation> <translation id="7994702968232966508">EAP metode</translation> <translation id="7997826902155442747">Procesa prioritāte</translation> <translation id="7999229196265990314">Tika izveidoti šādi faili: @@ -4782,6 +4811,8 @@ <translation id="8308179586020895837">Vaicāt, vai vietne <ph name="HOST" /> vēlas piekļūt kamerai</translation> <translation id="830868413617744215">Beta</translation> <translation id="8309458809024885768">Sertifikāts jau pastāv.</translation> +<translation id="8314381333424235892">Trūkst paplašinājuma, vai tas ir atinstalēts</translation> +<translation id="8316618172731049784">Sūtīt: <ph name="DEVICE_NAME" /></translation> <translation id="8317671367883557781">Pievienot tīkla savienojumu</translation> <translation id="8319414634934645341">Paplašināta atslēgas lietošana</translation> <translation id="8320459152843401447">Viss jūsu ekrāns</translation> @@ -4939,6 +4970,7 @@ <translation id="8588866096426746242">Rādīt profila statistiku</translation> <translation id="8588868914509452556"><ph name="WINDOW_TITLE" /> — VR rādīšana skatītājā</translation> <translation id="8590375307970699841">Iestatīt automātiskos atjauninājumus</translation> +<translation id="8591783563402255548">1 sekunde</translation> <translation id="8592141010104017453">Nerādīt paziņojumus vispār</translation> <translation id="8593121833493516339">Lietojuma un diagnostikas datu sūtīšana. Palīdziet uzlabot bērna Android lietošanas pieredzi, automātiski nosūtot diagnostikas, ierīces un lietotņu lietojuma datus uzņēmumam Google. Šī informācija netiks izmantota jūsu bērna identificēšanai, un tā palīdzēs uzlabot sistēmas un lietotņu stabilitāti un daudz ko citu. Noteiktus apkopotus datus izmantos arī Google lietotņu izstrādātāji un partneri, piemēram, Android izstrādātāji. Ja jūsu bērnam ir ieslēgts papildu iestatījums “Darbības tīmeklī un lietotnēs”, šie dati var tikt saglabāti bērna Google kontā. <ph name="BEGIN_LINK1" />Uzzināt vairāk<ph name="END_LINK1" /></translation> <translation id="8594908476761052472">Ierakstīt videoklipu</translation> @@ -4968,6 +5000,7 @@ <translation id="8637688295594795546">Ir pieejams sistēmas atjauninājums. Notiek sagatavošana lejupielādei…</translation> <translation id="8639047128869322042">Notiek kaitīgas programmatūras meklēšana...</translation> <translation id="8642171459927087831">Piekļuves pilnvara</translation> +<translation id="8642900771896232685">2 sekundes</translation> <translation id="8642947597466641025">Palielināt tekstu</translation> <translation id="8643418457919840804">Lai turpinātu, izvēlieties opciju:</translation> <translation id="8644655801811752511">Nevar atiestatīt šo drošības atslēgu. Mēģiniet atiestatīt atslēgu uzreiz pēc tās ievietošanas.</translation> @@ -5169,6 +5202,7 @@ <translation id="8910222113987937043">Jūsu grāmatzīmju, vēstures, paroļu un citu iestatījumu dati vairs netiks sinhronizēti jūsu Google kontā. Tomēr jūsu esošie dati joprojām tiks glabāti jūsu Google kontā un tos var pārvaldīt <ph name="BEGIN_LINK" />Google informācijas panelī<ph name="END_LINK" />.</translation> <translation id="8912362522468806198">Google konts</translation> <translation id="8912793549644936705">Izstiept</translation> +<translation id="8912810933860534797">Iespējot automātisko meklēšanu</translation> <translation id="891365694296252935">Lietojuma un diagnostikas datu sūtīšana. Pašlaik dati par šo ierīci un ierīces diagnostikas un lietotņu lietojuma dati tiek automātiski sūtīti uzņēmumam Google. Šī informācija netiks izmantota jūsu bērna identificēšanai, un tā palīdzēs uzlabot sistēmas un lietotņu stabilitāti un daudz ko citu. Noteiktus apkopotus datus izmantos arī Google lietotņu izstrādātāji un partneri, piemēram, Android izstrādātāji. Šo iestatījumu ir noteicis īpašnieks. Ja jūsu bērnam ir ieslēgts papildu iestatījums “Darbības tīmeklī un lietotnēs”, šie dati var tikt saglabāti bērna Google kontā. <ph name="BEGIN_LINK1" />Uzzināt vairāk<ph name="END_LINK1" /></translation> <translation id="8915370057835397490">Notiek ieteikumu ielāde...</translation> <translation id="8916476537757519021">Inkognito apakšrāmis: <ph name="SUBFRAME_SITE" /></translation> @@ -5321,6 +5355,7 @@ <translation id="9153934054460603056">Saglabāt identitāti un paroli</translation> <translation id="9154194610265714752">Atjaunināts</translation> <translation id="91568222606626347">Saīsnes izveide...</translation> +<translation id="9157096865782046368">0,8 sekundes</translation> <translation id="9157697743260533322">Neizdevās iestatīt automātiskos atjauninājumus visiem lietotājiem (pirmslidojuma palaišanas kļūda: <ph name="ERROR_NUMBER" />).</translation> <translation id="9158715103698450907">Hmm... Autentificēšanas laikā radās tīkla komunikācijas problēma. Lūdzu, pārbaudiet tīkla savienojumu un mēģiniet vēlreiz.</translation> <translation id="916607977885256133">Attēls attēlā</translation>
diff --git a/chrome/app/resources/generated_resources_ml.xtb b/chrome/app/resources/generated_resources_ml.xtb index 3107b8f..550397d0 100644 --- a/chrome/app/resources/generated_resources_ml.xtb +++ b/chrome/app/resources/generated_resources_ml.xtb
@@ -306,7 +306,7 @@ <translation id="146000042969587795">ഈ ഫ്രെയിം തടഞ്ഞു കാരണം ഇതില് ചില സുരക്ഷിതമല്ലാത്ത ഉള്ളടക്കം അടങ്ങിയിരിക്കുന്നു.</translation> <translation id="146219525117638703">ONC സ്റ്റേറ്റ്</translation> <translation id="146220085323579959">ഇന്റർനെറ്റ് വിച്ഛേദിച്ചു. നിങ്ങളുടെ ഇന്റർനെറ്റ് കണക്ഷൻ പരിശോധിച്ച് വീണ്ടും ശ്രമിക്കുക.</translation> -<translation id="1463112138205428654">വിപുലമായ പരിരക്ഷ <ph name="FILE_NAME" /> ബ്ലോക്ക് ചെയ്തു</translation> +<translation id="1463112138205428654"><ph name="FILE_NAME" /> എന്നതിനെ വിപുലമായ പരിരക്ഷ ബ്ലോക്ക് ചെയ്തു</translation> <translation id="1464258312790801189">നിങ്ങളുടെ അക്കൗണ്ടുകൾ</translation> <translation id="1465176863081977902">ഓഡിയോ വിലാസം പകർത്തുക</translation> <translation id="1465827627707997754">പിസ്സാ സ്ലൈസ്</translation> @@ -370,7 +370,7 @@ <translation id="155865706765934889">ടച്ച്പാഡ്</translation> <translation id="1564414980088536597">ഈ ചിത്രം ഉപയോഗിക്കാനാവുന്നില്ല. മറ്റൊരു ചിത്രം തിരഞ്ഞെടുക്കുക.</translation> <translation id="1566049601598938765">വെബ്സൈറ്റ്</translation> -<translation id="15662109988763471">തിരഞ്ഞെടുത്ത പ്രിൻ്റർ ലഭ്യമല്ല, അല്ലെങ്കിൽ ശരിയായി ഇൻസ്റ്റാൾ ചെയ്തിട്ടില്ല. നിങ്ങളുടെ പ്രിൻ്റർ പരിശോധിക്കുകയോ മറ്റൊരു പ്രിൻ്റർ തിരഞ്ഞെടുക്കുകയോ ചെയ്യുക.</translation> +<translation id="15662109988763471">തിരഞ്ഞെടുത്ത പ്രിൻ്റർ ലഭ്യമല്ല, അല്ലെങ്കിൽ ശരിയായി ഇൻസ്റ്റാൾ ചെയ്തിട്ടില്ല. നിങ്ങളുടെ പ്രിൻ്റർ പരിശോധിക്കുകയോ മറ്റൊരു പ്രിൻ്റർ തിരഞ്ഞെടുത്ത് ശ്രമിക്കുകയോ ചെയ്യുക.</translation> <translation id="1567387640189251553">നിങ്ങൾ അവസാനം പാസ്വേഡ് നൽകിയത് മുതൽ ഒരു വ്യത്യസ്ത കീബോർഡ് കണക്റ്റ് ചെയ്തിട്ടുണ്ട്. ഇത് നിങ്ങളുടെ കീസ്ട്രോക്കുകൾ മോഷ്ടിക്കാൻ ശ്രമിക്കുന്നുണ്ടാകാം.</translation> <translation id="1567750922576943685">ഐഡൻറിറ്റി പരിശോധിച്ചുറപ്പിക്കുന്നത്, നിങ്ങളുടെ വ്യക്തിഗത വിവരം പരിരക്ഷിക്കാൻ സഹായിക്കുന്നു</translation> <translation id="1567993339577891801">JavaScript കണ്സോള്</translation> @@ -2140,6 +2140,12 @@ <translation id="4242577469625748426">ഉപകരണത്തിൽ നയ ക്രമീകരണങ്ങൾ ഇൻസ്റ്റാൾ ചെയ്യുന്നതിൽ പരാജയപ്പെട്ടു: <ph name="VALIDATION_ERROR" />.</translation> <translation id="4244238649050961491">കൂടുതൽ സ്റ്റൈലസ് ആപ്പുകൾ കാണുക</translation> <translation id="424726838611654458">എപ്പോഴും Adobe Reader-ൽ തുറക്കുക</translation> +<translation id="4247274662191902962">നിങ്ങൾ ഈ VR അനുഭവത്തിലായിരിക്കുമ്പോൾ മാത്രമേ സെൻസർ ഡാറ്റ പങ്കിടൂ. ചുവടെ പറയുന്നത് പോലുള്ള ചില വിവരങ്ങൾ ഉപയോഗിച്ച് ഈ സൈറ്റിന് നിങ്ങളെ കുറിച്ച് അറിയാനാകും: + - നിങ്ങളുടെ ലൊക്കേഷൻ + - കണ്ണിൻ്റെ സ്ഥാനം പോലെയുള്ള നിങ്ങളുടെ ശാരീരിക സവിശേഷതകൾ + - നിങ്ങളുടെ നടപ്പിൻ്റെ ശൈലി പോലെയുള്ള ചലനങ്ങൾ + + ആക്സസ് അനുവദിക്കുന്നതിന് മുമ്പ് നിങ്ങൾ ഈ സൈറ്റിനെ വിശ്വസിക്കുന്നുണ്ടെന്ന് ഉറപ്പാക്കുക.</translation> <translation id="4247901771970415646"><ph name="USERNAME" /> എന്ന ഉപയോക്താവിലേക്ക് സമന്വയിപ്പിക്കാനാവില്ല</translation> <translation id="4249248555939881673">നെറ്റ്വർക്ക് കണക്ഷനുവേണ്ടി കാത്തിരിക്കുന്നു...</translation> <translation id="4249373718504745892">നിങ്ങളുടെ ക്യാമറയും മൈക്രോഫോണും ആക്സസ്സുചെയ്യുന്നതിൽ നിന്ന് ഈ പേജിനെ തടഞ്ഞിരിക്കുന്നു.</translation> @@ -4308,7 +4314,7 @@ <translation id="7644543211198159466">വർണ്ണവും തീമും</translation> <translation id="7645176681409127223"><ph name="USER_NAME" /> (ഉടമ)</translation> <translation id="7647403192093989392">സമീപകാല പ്രവര്ത്തനങ്ങളൊന്നുമില്ല</translation> -<translation id="7648142322539582331">രക്ഷാകർതൃ നിയന്ത്രണങ്ങൾ സജ്ജീകരിക്കാൻ ഇൻ്റർനെറ്റുമായി കണക്റ്റ് ചെയ്യുക</translation> +<translation id="7648142322539582331">രക്ഷാകർതൃ നിയന്ത്രണങ്ങൾ സജ്ജീകരിക്കാൻ ഇൻ്റർനെറ്റിലേക്ക് കണക്റ്റ് ചെയ്യുക</translation> <translation id="7648992873808071793">ഈ ഉപകരണത്തിൽ ഫയലുകൾ സംഭരിക്കുക</translation> <translation id="7649070708921625228">സഹായം</translation> <translation id="7650511557061837441">"<ph name="TRIGGERING_EXTENSION_NAME" />", "<ph name="EXTENSION_NAME" />" നീക്കംചെയ്യാൻ താൽപ്പര്യപ്പെടുന്നു.</translation> @@ -4743,7 +4749,7 @@ <translation id="8253198102038551905">നെറ്റ്വർക്ക് പ്രോപ്പർട്ടികൾ ലഭിക്കാൻ '+' ക്ലിക്ക് ചെയ്യുക</translation> <translation id="825483282309623688">നിങ്ങളുടെ ഡാറ്റ പുനഃസ്ഥാപിക്കാൻ, ഇന്റർനെറ്റ് കണക്ഷൻ ആവശ്യമാണ്.</translation> <translation id="8254954272268479918">Linux (ബീറ്റ) ഷട്ട് ഡൗൺ ചെയ്യുക</translation> -<translation id="8255451560461371599">പശ്ചാത്തലം ഇല്ല</translation> +<translation id="8255451560461371599">പശ്ചാത്തലം ഇല്ലാത്തത്</translation> <translation id="8256319818471787266">സ്പാർക്കി</translation> <translation id="8257950718085972371">ക്യാമറ ആക്സസ് തടയുന്നത് തുടരുക</translation> <translation id="8259239505248583312">നമുക്ക് ആരംഭിക്കാം</translation>
diff --git a/chrome/app/resources/generated_resources_mr.xtb b/chrome/app/resources/generated_resources_mr.xtb index ce8c0a1e..24447bd 100644 --- a/chrome/app/resources/generated_resources_mr.xtb +++ b/chrome/app/resources/generated_resources_mr.xtb
@@ -2143,6 +2143,12 @@ <translation id="4242577469625748426">डिव्हाइसवर धोरण सेटिंग्ज इंस्टॉल करण्यात अयशस्वी: <ph name="VALIDATION_ERROR" />.</translation> <translation id="4244238649050961491">अधिक स्टायलस अॅप्स शोधा</translation> <translation id="424726838611654458">Adobe Reader मध्ये नेहमी उघडा</translation> +<translation id="4247274662191902962">तुम्ही VR अनुभवामध्ये असता तेव्हाच फक्त सेन्सर डेटा शेअर करू शकता. ही साइट खालील विशिष्ट माहिती वापरून तुमच्याबद्दल अधिक जाणून घेऊ शकते: + - तुमचे स्थान + - तुमची शारीरिक वैशिष्ट्ये, जसे की, डोळ्यांची रचना + - तुमच्या हालचाली, जसे की, तुम्ही कसे चालता + + ॲक्सेसची अनुमती देण्यापूर्वी तुम्ही या साइवर विश्वास ठेवता याची खात्री करा.</translation> <translation id="4247901771970415646"><ph name="USERNAME" /> शी सिंक करू शकत नाही</translation> <translation id="4249248555939881673">नेटवर्क कनेक्शनची प्रतीक्षा करत आहे...</translation> <translation id="4249373718504745892">हे पृष्ठ तुमचा कॅमेरा आणि मायक्रोफोनवर प्रवेश करण्यापासून अवरोधित केले गेले आहे.</translation>
diff --git a/chrome/app/resources/generated_resources_ms.xtb b/chrome/app/resources/generated_resources_ms.xtb index 457f21c..baccdbc 100644 --- a/chrome/app/resources/generated_resources_ms.xtb +++ b/chrome/app/resources/generated_resources_ms.xtb
@@ -2145,6 +2145,12 @@ <translation id="4242577469625748426">Gagal memasang tetapan dasar pada peranti: <ph name="VALIDATION_ERROR" />.</translation> <translation id="4244238649050961491">Dapatkan lagi apl stilus</translation> <translation id="424726838611654458">Sentiasa buka dalam Adobe Reader</translation> +<translation id="4247274662191902962">Data penderia hanya akan dikongsi semasa anda dalam pengalaman VR ini. Tapak ini mungkin dapat mengetahui tentang anda menggunakan maklumat tertentu, seperti: + - Lokasi anda + - Ciri fizikal anda, seperti kedudukan mata + - Pergerakan anda, seperti cara anda berjalan + + Pastikan anda mempercayai tapak ini sebelum anda membenarkan akses.</translation> <translation id="4247901771970415646">Tidak dapat disegerakkan ke <ph name="USERNAME" /></translation> <translation id="4249248555939881673">Menunggu sambungan rangkaian...</translation> <translation id="4249373718504745892">Halaman ini telah disekat daripada mengakses kamera dan mikrofon anda.</translation>
diff --git a/chrome/app/resources/generated_resources_nl.xtb b/chrome/app/resources/generated_resources_nl.xtb index e4194755..a50998c1 100644 --- a/chrome/app/resources/generated_resources_nl.xtb +++ b/chrome/app/resources/generated_resources_nl.xtb
@@ -4,7 +4,7 @@ <translation id="1003088604756913841">Link openen in een nieuw <ph name="APP" />-venster</translation> <translation id="1004218526896219317">Toegang tot site</translation> <translation id="1005274289863221750">Je microfoon en camera gebruiken</translation> -<translation id="1005608198058526414">Bekijk e Family Link-instellingen</translation> +<translation id="1005608198058526414">Bekijk je Family Link-instellingen</translation> <translation id="1006873397406093306">Deze extensie kan je gegevens op sites lezen en wijzigen. Je bepaalt tot welke sites de extensie toegang heeft.</translation> <translation id="1007408791287232274">Kan apparaten niet laden.</translation> <translation id="1008186147501209563">Bladwijzers exporteren</translation> @@ -2144,6 +2144,12 @@ <translation id="4242577469625748426">Kan geen beleidsinstellingen op het apparaat installeren: <ph name="VALIDATION_ERROR" />.</translation> <translation id="4244238649050961491">Meer stylus-apps zoeken</translation> <translation id="424726838611654458">Altijd in Adobe Reader openen</translation> +<translation id="4247274662191902962">Sensorgegevens worden alleen gedeeld wanneer je deze VR-functie gebruikt. De site kan je mogelijk herkennen aan de hand van bepaalde gegevens, zoals: + - Je locatie + - Je fysieke kenmerken, zoals de positie van je ogen + - Je bewegingen, zoals hoe je loopt + + Controleer of je de site vertrouwt voordat je deze toegang geeft.</translation> <translation id="4247901771970415646">Kan niet synchroniseren met <ph name="USERNAME" /></translation> <translation id="4249248555939881673">Wachten op netwerkverbinding...</translation> <translation id="4249373718504745892">Deze pagina heeft geen toegang tot je camera en microfoon.</translation>
diff --git a/chrome/app/resources/generated_resources_no.xtb b/chrome/app/resources/generated_resources_no.xtb index 68b2985..ea2b035 100644 --- a/chrome/app/resources/generated_resources_no.xtb +++ b/chrome/app/resources/generated_resources_no.xtb
@@ -1,6 +1,7 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="no"> +<translation id="1002469766576243227">Verten for denne autentiseringstjenesten er <ph name="EXTENSION_NAME" />.</translation> <translation id="1003088604756913841">Åpne linken i et nytt <ph name="APP" />-vindu</translation> <translation id="1004218526896219317">Nettstedstilgang</translation> <translation id="1005274289863221750">bruke mikrofonen din og kameraet ditt</translation> @@ -289,6 +290,7 @@ <translation id="1429300045468813835">Fjernet alle</translation> <translation id="143027896309062157">lese og endre alle dataene på datamaskinen din og nettstedene du besøker</translation> <translation id="1430915738399379752">Skriv ut</translation> +<translation id="1431188203598586230">Siste programvareoppdatering</translation> <translation id="1432581352905426595">Administrer søkemotorer</translation> <translation id="1433811987160647649">Spør før bruk</translation> <translation id="1434696352799406980">Dette tilbakestiller oppstartssiden, nye faner, søkemotoren og eventuelle festede faner. I tillegg slår det av alle utvidelser og fjerner midlertidige data, for eksempel informasjonskapsler. Bokmerker, loggoppføringer og lagrede passord slettes ikke.</translation> @@ -525,6 +527,7 @@ <translation id="1781771911845953849">Kontoer og synkronisering</translation> <translation id="1782196717298160133">Finner telefonen din</translation> <translation id="1784849162047402014">Det er lite plass på enheten</translation> +<translation id="1790194216133135334">Send link til <ph name="DEVICE_NAME" /></translation> <translation id="1792619191750875668">Utvidet skjerm</translation> <translation id="1794791083288629568">Send tilbakemelding så vi kan prøve å løse problemet.</translation> <translation id="1795214765651529549">Bruk klassisk</translation> @@ -587,6 +590,7 @@ <translation id="1875312262568496299">Start</translation> <translation id="1875387611427697908">Dette kan bare legges til fra <ph name="CHROME_WEB_STORE" /></translation> <translation id="1877520246462554164">Kunne ikke hente autentiseringstokenet. Logg av og på igjen for å prøve på nytt.</translation> +<translation id="1877860345998737529">Tilordning av bryterhandlinger</translation> <translation id="1879000426787380528">Logg på som</translation> <translation id="1880905663253319515">Vil du slette sertifikatet «<ph name="CERTIFICATE_NAME" />»?</translation> <translation id="1886996562706621347">Tillat at nettsteder kan be om å bli standardbehandlere for protokoller (anbefalt)</translation> @@ -866,7 +870,9 @@ <translation id="230927227160767054">Denne nettsiden ber om å få installere en behandlingssnarvei for en tjeneste.</translation> <translation id="2309620859903500144">Bevegelses- og lyssensorene er blokkert fra dette nettstedet.</translation> <translation id="2315414688463285945">Feil ved konfigurering av Linux-filer. Prøv på nytt.</translation> +<translation id="2315587498123194634">Send link til <ph name="DEVICE_NAME" /></translation> <translation id="2316129865977710310">Nei takk</translation> +<translation id="2316739859433277603">Når du søker i appvelgeren, brukes <ph name="BEGIN_LINK" />søkemotorinnstillingen<ph name="END_LINK" /> i nettleseren.</translation> <translation id="2317842250900878657"><ph name="PROGRESS_PERCENT" /> % ferdig</translation> <translation id="2318143611928805047">Papirstørrelse</translation> <translation id="2318817390901984578">For å bruke Android-apper, lad og oppdater <ph name="DEVICE_TYPE" />-enheten din.</translation> @@ -906,6 +912,7 @@ <translation id="2365507699358342471">Dette nettstedet kan se tekst og bilder som er kopiert til utklippstavlen.</translation> <translation id="2367199180085172140">Legg til fildeling</translation> <translation id="2367972762794486313">Vis apper</translation> +<translation id="2369105924912929484">Slå av/på destillert sideinnhold</translation> <translation id="2371076942591664043">Åpne når ne&dlastingen er ferdig</translation> <translation id="2375406435414127095">Koble til telefonen din</translation> <translation id="2377667304966270281">Harde feil</translation> @@ -1155,6 +1162,7 @@ <translation id="2739191690716947896">Feilsøk</translation> <translation id="2739240477418971307">endre innstillingene for tilgjengelighet</translation> <translation id="2740393541869613458">gjennomgå nettstedene den administrerte brukeren har besøkt, og</translation> +<translation id="2741912629735277980">Vis UI på påloggingsskjermen</translation> <translation id="274290345632688601">Gjenoppretter Linux-apper og -filer</translation> <translation id="2743387203779672305">Kopiér til utklippstavlen</translation> <translation id="2745080116229976798">Microsoft kvalifisert underordning</translation> @@ -1271,6 +1279,7 @@ <translation id="2910318910161511225">Koble til et nettverk og prøv igjen</translation> <translation id="2913331724188855103">Tillat at nettsteder lagrer og leser data i informasjonskapsler (anbefales).</translation> <translation id="2915102088417824677">Se aktivitetsloggen</translation> +<translation id="2915873080513663243">Automatisk skanning</translation> <translation id="2916073183900451334">Trykk på Tab på en nettside for å utheve linker og skjemafelter</translation> <translation id="2916745397441987255">Søk i utvidelser</translation> <translation id="2921081876747860777">Opprett et passord for å beskytte de lokale dataene dine.</translation> @@ -1479,6 +1488,7 @@ <translation id="327147043223061465">Se alle informasjonskapsler og nettstedsdata</translation> <translation id="3271648667212143903"><ph name="ORIGIN" /> vil koble til</translation> <translation id="3274763671541996799">Du bruker full skjerm.</translation> +<translation id="3275778809241512831">Den interne sikkerhetsnøkkelen din er ikke sikker. Fjern den fra eventuelle tjenester du har brukt den på. For å løse problemet må du tilbakestille sikkerhetsnøkkelen.</translation> <translation id="3275778913554317645">Åpne som vindu</translation> <translation id="3278001907972365362">Sjekk Google-kontoen(e) din(e)</translation> <translation id="3279230909244266691">Denne prosessen kan ta noen minutter. Starter den virtuelle maskinen.</translation> @@ -1570,6 +1580,7 @@ <translation id="3412265149091626468">Gå til utvalg</translation> <translation id="3413122095806433232">Sertifiseringsinstanser: <ph name="LOCATION" /></translation> <translation id="3414952576877147120">Størrelse:</translation> +<translation id="3420501302812554910">Den interne sikkerhetsnøkkelen må tilbakestilles</translation> <translation id="3421387094817716717">Offentlig nøkkel basert på elliptiske kurver</translation> <translation id="3423463006624419153">På «<ph name="PHONE_NAME_1" />» og «<ph name="PHONE_NAME_2" />»:</translation> <translation id="3423858849633684918">Start <ph name="PRODUCT_NAME" /> på nytt</translation> @@ -1598,6 +1609,7 @@ <translation id="3450157232394774192">Utnyttelsesgrad for hviletilstand</translation> <translation id="3453612417627951340">Trenger autorisasjon</translation> <translation id="3454157711543303649">Aktiveringen er fullført</translation> +<translation id="3454213325559396544">Dette er den siste automatiske programvare- og sikkerhetsoppdateringen for denne <ph name="DEVICE_TYPE" />-enheten. For å få fremtidige oppdateringer, oppgrader til en nyere modell.</translation> <translation id="345693547134384690">Åpne b&ilde i ny fane</translation> <translation id="3457500881955698515">Bedriften eller organisasjonen din krever at denne enheten oppdateres med det samme</translation> <translation id="3459509316159669723">Utskrift</translation> @@ -1755,6 +1767,7 @@ <translation id="3672681487849735243">En fabrikkfeil har blitt oppdaget</translation> <translation id="367645871420407123">la stå tomt hvis du ønsker å sette rot-passordet til standard testbildeverdi</translation> <translation id="3677657024345889897">Stillest</translation> +<translation id="3677911431265050325">Be om mobilversjonen av nettstedet</translation> <translation id="3678156199662914018">Utvidelse: <ph name="EXTENSION_NAME" /></translation> <translation id="3681311097828166361">Takk for tilbakemeldingen. Siden du er uten nett akkurat nå, sendes rapporten senere.</translation> <translation id="3682824389861648626">Bevegelsesterskel</translation> @@ -2137,6 +2150,12 @@ <translation id="4242577469625748426">Kunne ikke installere angivelse av innstillinger på enheten: <ph name="VALIDATION_ERROR" />.</translation> <translation id="4244238649050961491">Finn flere pekepennapper</translation> <translation id="424726838611654458">Åpne alltid i Adobe Reader</translation> +<translation id="4247274662191902962">Sensordata deles bare mens du er i denne VR-opplevelsen. Nettstedet kan kanskje finne ut ting om deg ved å bruke visse opplysninger, for eksempel + - posisjonen din + - fysiske kjennetegn, som plassering av øyne + - bevegelsene dine, for eksempel måten du går på + + Forsikre deg om at du stoler på dette nettstedet før du gir tilgang.</translation> <translation id="4247901771970415646">Kan ikke synkronisere med <ph name="USERNAME" /></translation> <translation id="4249248555939881673">Venter på nettverkstilkobling …</translation> <translation id="4249373718504745892">Kameraet og mikrofonen er blokkert for denne siden.</translation> @@ -2199,6 +2218,7 @@ <translation id="4350019051035968019">Denne enheten kan ikke registreres for domenet kontoen din tilhører. Enheten er merket for administrering av et annet domene.</translation> <translation id="4354344420232759511">Nettsteder du besøker, vises her</translation> <translation id="435527878592612277">Velg bilde</translation> +<translation id="4358313196493694334">Stabiliser klikkposisjon</translation> <translation id="4359408040881008151">Installert på grunn av avhengige utvidelser.</translation> <translation id="4359717112757026264">Bybilde</translation> <translation id="4361142739114356624">Privatnøkkelen for dette klientsertifikatet mangler eller er ugyldig</translation> @@ -2323,6 +2343,7 @@ <translation id="4558426062282641716">Tillatelse om autostart er forespurt</translation> <translation id="4558491878126948419">Få tips og oppdateringer for <ph name="DEVICE_TYPE" /> om Google-produkter, og del tilbakemeldinger. Du kan avslutte abonnementet når som helst.</translation> <translation id="4559617833001311418">Dette nettstedet bruker bevegelses- eller lyssensorene dine.</translation> +<translation id="4561098487691395071">Eller spesifiser PPD for skriveren</translation> <translation id="4562155214028662640">Legg til fingeravtrykk</translation> <translation id="4563880231729913339">Finger 3</translation> <translation id="4565377596337484307">Skjul passord</translation> @@ -2567,6 +2588,7 @@ <translation id="494286511941020793">Hjelp for konfigurering av mellomtjenere</translation> <translation id="4943368462779413526">Fotball</translation> <translation id="4943691134276646401">«<ph name="CHROME_EXTENSION_NAME" />» vil koble til en seriell port</translation> +<translation id="4944310289250773232">Verten for denne autentiseringstjenesten er <ph name="SAML_DOMAIN" />.</translation> <translation id="495170559598752135">Handlinger</translation> <translation id="4953689047182316270">Svar på tilgjengelighetshendelser</translation> <translation id="4953808748584563296">Oransje standardbrukerbilde</translation> @@ -2659,6 +2681,7 @@ <translation id="5094721898978802975">kommunisere med samarbeidende integrerte apper</translation> <translation id="5097002363526479830">Kunne ikke koble til nettverket «<ph name="NAME" />»: <ph name="DETAILS" /></translation> <translation id="5101042277149003567">Åpne alle bokmerker</translation> +<translation id="5101839224773798795">Klikk automatisk når pekeren stopper</translation> <translation id="5108967062857032718">Innstillinger – Fjern Android-apper</translation> <translation id="5109044022078737958">Sporty</translation> <translation id="5111646998522066203">Avslutt inkognitomodus</translation> @@ -3142,6 +3165,7 @@ <translation id="5852112051279473187">Beklager! Det oppstod et problem under registrering av enheten din. Prøv på nytt eller kontakt din brukerstøtterepresentant.</translation> <translation id="5852137567692933493">Omstart og Powerwash</translation> <translation id="5854912040170951372">Pizzaelsker</translation> +<translation id="5855643921295613558">0,6 sekunder</translation> <translation id="5855773610748894548">Beklager – feil i den sikre modulen.</translation> <translation id="5856721540245522153">Slå på feilsøkingsfunksjoner</translation> <translation id="5857090052475505287">Ny mappe</translation> @@ -3431,6 +3455,7 @@ <translation id="6279183038361895380">Trykk på |<ph name="ACCELERATOR" />| for å se markøren</translation> <translation id="6280215091796946657">Logg på med en annen konto</translation> <translation id="6280912520669706465">ARC</translation> +<translation id="628352644014831790">4 sekunder</translation> <translation id="6285120108426285413"><ph name="FILE_NAME" /> lastes sjelden ned og kan være farlig.</translation> <translation id="6285120908535925801">{NUM_PRINTER,plural, =1{Ny skriver på nettverket}other{Nye skrivere på nettverket}}</translation> <translation id="6286708577777130801">Lagrede passorddetaljer</translation> @@ -3637,6 +3662,7 @@ <translation id="6612358246767739896">Beskyttet innhold</translation> <translation id="6613452264606394692">Kom raskt tilbake hit ved å sette denne siden som bokmerke</translation> <translation id="6615455863669487791">Vis meg</translation> +<translation id="6617100836880592260">Skannehastighet: <ph name="SPEED_WITH_UNITS" /></translation> <translation id="6618097958368085618">Behold likevel</translation> <translation id="6619058681307408113">Line Printer Daemon (LPD)</translation> <translation id="661907246513853610">Nettstedet kan spore posisjonen din</translation> @@ -4449,6 +4475,7 @@ <translation id="7831491651892296503">En feil oppsto under konfigureringen av nettverket</translation> <translation id="7831754656372780761"><ph name="TAB_TITLE" /> <ph name="EMOJI_MUTING" /></translation> <translation id="7832084384634357321">Sluttid</translation> +<translation id="783214144752121388">Blokkér nettsteder fra å kjøre Flash (anbefales)</translation> <translation id="7833720883933317473">Lagrede egendefinerte ord vises her</translation> <translation id="7835178595033117206">Bokmerket er fjernet</translation> <translation id="7837776265184002579">Startsiden er endret til <ph name="URL" />.</translation> @@ -4504,6 +4531,7 @@ <translation id="7911118814695487383">Linux</translation> <translation id="7912080627461681647">Passordet ditt er endret på tjeneren. Logg av og på igjen.</translation> <translation id="7915471803647590281">Fortell oss hva som skjer før du sender tilbakemeldingen.</translation> +<translation id="7919210519031517829"><ph name="DURATION" /> s</translation> <translation id="792514962475806987">Dokket zoomnivå:</translation> <translation id="7925247922861151263">AAA-kontroll mislyktes</translation> <translation id="7925285046818567682">Venter på <ph name="HOST_NAME" />...</translation> @@ -4561,6 +4589,7 @@ <translation id="7987814697832569482">Koble alltid til via dette VPN-et</translation> <translation id="798835209536175951">Send og motta tekstmeldinger fra Chromebooken. <ph name="LINK_BEGIN" />Finn ut mer<ph name="LINK_END" /></translation> <translation id="7988355189918024273">Aktiver funksjoner for tilgjengelighet</translation> +<translation id="7991296728590311172">Innstillinger for brytertilgang</translation> <translation id="7994702968232966508">EAP-metode</translation> <translation id="7997826902155442747">Prosessprioritet</translation> <translation id="7999229196265990314">Opprettet følgende filer: @@ -4774,6 +4803,8 @@ <translation id="8308179586020895837">Spør om <ph name="HOST" /> vil bruke kameraet ditt</translation> <translation id="830868413617744215">Beta</translation> <translation id="8309458809024885768">Sertifikatet finnes allerede</translation> +<translation id="8314381333424235892">Manglende eller avinstallert utvidelse</translation> +<translation id="8316618172731049784">Send til <ph name="DEVICE_NAME" /></translation> <translation id="8317671367883557781">Legg til nettverkstilkobling</translation> <translation id="8319414634934645341">Utvidet bruk av nøkkel</translation> <translation id="8320459152843401447">Hele skjermen</translation> @@ -4930,6 +4961,7 @@ <translation id="8588866096426746242">Vis profilstatistikk</translation> <translation id="8588868914509452556"><ph name="WINDOW_TITLE" /> – VR vises på VR-briller</translation> <translation id="8590375307970699841">Valg av automatiske oppdateringer</translation> +<translation id="8591783563402255548">1 sekund</translation> <translation id="8592141010104017453">Ikke vis varsler i det hele tatt</translation> <translation id="8593121833493516339">Send bruks- og diagnostikkdata. Hjelp til med å gjøre Android-opplevelsen bedre for barnet ditt ved å sende diagnostikk-, enhets- og appbruksdata til Google automatisk. Disse dataene brukes ikke til å identifisere barnet ditt, men bidrar til å gjøre systemet og appene bedre og mer stabile. Noen aggregerte data hjelper også Google-apper og -partnere, for eksempel Android-utviklere. Hvis du har slått på annen nett- og appaktivitet for barnet ditt, kan disse dataene bli lagret i barnets Google-konto. <ph name="BEGIN_LINK1" />Finn ut mer<ph name="END_LINK1" /></translation> <translation id="8594908476761052472">Spill inn video</translation> @@ -4959,6 +4991,7 @@ <translation id="8637688295594795546">Systemoppdatering er tilgjengelig. Forbereder nedlasting ...</translation> <translation id="8639047128869322042">Ser etter skadelig programvare …</translation> <translation id="8642171459927087831">Tilgangstoken</translation> +<translation id="8642900771896232685">2 sekunder</translation> <translation id="8642947597466641025">Forstørr teksten</translation> <translation id="8643418457919840804">Velg et alternativ for å fortsette:</translation> <translation id="8644655801811752511">Kan ikke tilbakestille denne sikkerhetsnøkkelen. Prøv å tilbakestille nøkkelen like etter at du setter den inn.</translation> @@ -5160,6 +5193,7 @@ <translation id="8910222113987937043">Endringer i bokmerkene, loggen, passordene og andre innstillinger du har, blir ikke lenger synkronisert med Google-kontoen din. Data som allerede er lagret i Google-kontoen din, blir imidlertid værende og kan administreres ved hjelp av <ph name="BEGIN_LINK" />Google Oversikt<ph name="END_LINK" />.</translation> <translation id="8912362522468806198">Google-konto</translation> <translation id="8912793549644936705">Strekk ut</translation> +<translation id="8912810933860534797">Aktivér automatisk skanning</translation> <translation id="891365694296252935">Send bruks- og diagnostikkdata. Denne enheten sender for øyeblikket diagnostikk-, enhets- og appbruksdata til Google automatisk. Disse dataene brukes ikke til å identifisere barnet ditt, men bidrar til å gjøre systemet og appene bedre og mer stabile. Noen aggregerte data hjelper også Google-apper og -partnere, for eksempel Android-utviklere. Denne innstillingen håndheves av eieren. Hvis du har slått på annen nett- og appaktivitet for barnet ditt, kan disse dataene bli lagret i barnets Google-konto. <ph name="BEGIN_LINK1" />Finn ut mer<ph name="END_LINK1" /></translation> <translation id="8915370057835397490">Laster inn forslag …</translation> <translation id="8916476537757519021">Inkognito-underramme: <ph name="SUBFRAME_SITE" /></translation> @@ -5312,6 +5346,7 @@ <translation id="9153934054460603056">Lagre identitet og passord</translation> <translation id="9154194610265714752">Oppdatert</translation> <translation id="91568222606626347">Opprett snarvei</translation> +<translation id="9157096865782046368">0,8 sekunder</translation> <translation id="9157697743260533322">Kunne ikke konfigurere automatiske oppdateringer for alle brukerne (feil ved start av forhåndskontroll: <ph name="ERROR_NUMBER" />)</translation> <translation id="9158715103698450907">Beklager. Det oppsto et kommunikasjonsproblem på nettverket under godkjenningen. Sjekk nettverksforbindelsen din, og prøv på nytt.</translation> <translation id="916607977885256133">Bilde i bilde</translation>
diff --git a/chrome/app/resources/generated_resources_pl.xtb b/chrome/app/resources/generated_resources_pl.xtb index 451ab0d..03de96b 100644 --- a/chrome/app/resources/generated_resources_pl.xtb +++ b/chrome/app/resources/generated_resources_pl.xtb
@@ -1,6 +1,7 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="pl"> +<translation id="1002469766576243227">Ta usługa uwierzytelniania jest obsługiwana przez rozszerzenie <ph name="EXTENSION_NAME" /></translation> <translation id="1003088604756913841">Otwórz link w nowym oknie aplikacji <ph name="APP" /></translation> <translation id="1004218526896219317">Dostęp do stron</translation> <translation id="1005274289863221750">Korzystanie z Twojego mikrofonu i kamery</translation> @@ -289,6 +290,7 @@ <translation id="1429300045468813835">Wyczyszczono wszystko</translation> <translation id="143027896309062157">Odczyt i zmiana wszystkich Twoich danych na komputerze i otwieranych stronach</translation> <translation id="1430915738399379752">Drukuj</translation> +<translation id="1431188203598586230">Ostatnia aktualizacja oprogramowania</translation> <translation id="1432581352905426595">Zarządzaj wyszukiwarkami</translation> <translation id="1433811987160647649">Pytaj przed uzyskaniem dostępu</translation> <translation id="1434696352799406980">Spowoduje to zresetowanie Twojej strony startowej, strony nowej karty, wyszukiwarki i przypiętych kart. Oprócz tego przeglądarka wyłączy wszystkie rozszerzenia i usunie dane tymczasowe takie jak pliki cookie. Twoje zakładki, historia i zapisane hasła nie zostaną usunięte.</translation> @@ -528,6 +530,7 @@ <translation id="1781771911845953849">Konta i synchronizacja</translation> <translation id="1782196717298160133">Znajdowanie Twojego telefonu</translation> <translation id="1784849162047402014">Na urządzeniu jest mało miejsca.</translation> +<translation id="1790194216133135334">Wyślij link na: <ph name="DEVICE_NAME" /></translation> <translation id="1792619191750875668">Ekran rozszerzony</translation> <translation id="1794791083288629568">Wyślij opinię, by pomóc nam rozwiązać ten problem.</translation> <translation id="1795214765651529549">Użyj motywu klasycznego</translation> @@ -590,6 +593,7 @@ <translation id="1875312262568496299">Rozpocznij</translation> <translation id="1875387611427697908">Możesz to pobrać tylko z <ph name="CHROME_WEB_STORE" /></translation> <translation id="1877520246462554164">Nie udało się uzyskać tokena uwierzytelnienia. Wyloguj się, a potem zaloguj się jeszcze raz, by ponowić próbę.</translation> +<translation id="1877860345998737529">Przypisanie przełączników do działań</translation> <translation id="1879000426787380528">Zaloguj się jako</translation> <translation id="1880905663253319515">Czy usunąć certyfikat „<ph name="CERTIFICATE_NAME" />”?</translation> <translation id="1886996562706621347">Zezwól, by strony prosiły użytkownika o ustawienie ich jako domyślnego modułu obsługi protokołu (zalecane)</translation> @@ -869,7 +873,9 @@ <translation id="230927227160767054">Ta strona chce zainstalować moduł do obsługiwania usługi.</translation> <translation id="2309620859903500144">Ta witryna ma zablokowany dostęp do czujników ruchu i oświetlenia.</translation> <translation id="2315414688463285945">Błąd podczas konfigurowania plików Linuksa. Spróbuj ponownie.</translation> +<translation id="2315587498123194634">Wyślij link na: <ph name="DEVICE_NAME" /></translation> <translation id="2316129865977710310">Nie, dziękuję</translation> +<translation id="2316739859433277603">Podczas wyszukiwania z poziomu menu z aplikacjami używana jest <ph name="BEGIN_LINK" />wyszukiwarka ustawiona w przeglądarce<ph name="END_LINK" />.</translation> <translation id="2317842250900878657">Gotowe: <ph name="PROGRESS_PERCENT" />%</translation> <translation id="2318143611928805047">Rozmiar papieru</translation> <translation id="2318817390901984578">Aby korzystać z aplikacji na Androida, naładuj i zaktualizuj urządzenie <ph name="DEVICE_TYPE" />.</translation> @@ -909,6 +915,7 @@ <translation id="2365507699358342471">Ta witryna ma dostęp do tekstu i obrazów skopiowanych do schowka.</translation> <translation id="2367199180085172140">Dodaj udział plików</translation> <translation id="2367972762794486313">Pokaż aplikacje</translation> +<translation id="2369105924912929484">Przełącz wydestylowaną zawartość strony</translation> <translation id="2371076942591664043">Otwórz po &zakończeniu</translation> <translation id="2375406435414127095">Połącz ze swoim telefonem</translation> <translation id="2377667304966270281">Poważne błędy</translation> @@ -1159,6 +1166,7 @@ <translation id="2739191690716947896">Debugowanie</translation> <translation id="2739240477418971307">Zmiana ustawień ułatwień dostępu</translation> <translation id="2740393541869613458">sprawdzać, na jakie strony wszedł użytkownik nadzorowany, oraz</translation> +<translation id="2741912629735277980">Wyświetlanie UI na ekranie logowania</translation> <translation id="274290345632688601">Przywracam aplikacje i pliki Linuksa</translation> <translation id="2743387203779672305">Skopiuj do schowka</translation> <translation id="2745080116229976798">Subordynacja kwalifikowana firmy Microsoft</translation> @@ -1275,6 +1283,7 @@ <translation id="2910318910161511225">Połącz się z siecią i spróbuj ponownie</translation> <translation id="2913331724188855103">Zezwalaj witrynom na zapisywanie danych w plikach cookie i ich odczytywanie (zalecane)</translation> <translation id="2915102088417824677">Wyświetl historię aktywności</translation> +<translation id="2915873080513663243">Automatyczne skanowanie</translation> <translation id="2916073183900451334">Naciśnięcie klawisza Tab na stronie internetowej powoduje podświetlenie linków, a także pól formularza</translation> <translation id="2916745397441987255">Szukaj w rozszerzeniach</translation> <translation id="2921081876747860777">Utwórz hasło, by chronić swoje dane lokalne.</translation> @@ -1483,6 +1492,7 @@ <translation id="327147043223061465">Wyświetl wszystkie pliki cookie i dane witryn</translation> <translation id="3271648667212143903"><ph name="ORIGIN" /> chce się połączyć</translation> <translation id="3274763671541996799">Pracujesz w trybie pełnoekranowym.</translation> +<translation id="3275778809241512831">Twój wewnętrzny klucz bezpieczeństwa obecnie nie jest bezpieczny. Usuń go ze wszystkich usług, w których go używasz. Aby rozwiązać problem, zresetuj klucz bezpieczeństwa.</translation> <translation id="3275778913554317645">Otwórz jako okno</translation> <translation id="3278001907972365362">Musisz się zająć swoimi kontami Google</translation> <translation id="3279230909244266691">Może to potrwać kilka minut. Uruchamiam maszynę wirtualną.</translation> @@ -1575,6 +1585,7 @@ <translation id="3412265149091626468">Przejdź do zaznaczenia</translation> <translation id="3413122095806433232">Wystawcy urzędu certyfikacji: <ph name="LOCATION" /></translation> <translation id="3414952576877147120">Rozmiar:</translation> +<translation id="3420501302812554910">Wymagane jest zresetowanie wewnętrznego klucza bezpieczeństwa</translation> <translation id="3421387094817716717">Kryptografia klucza publicznego oparta na krzywych eliptycznych</translation> <translation id="3423463006624419153">Na telefonach „<ph name="PHONE_NAME_1" />” oraz „<ph name="PHONE_NAME_2" />”:</translation> <translation id="3423858849633684918">Ponownie uruchom przeglądarkę <ph name="PRODUCT_NAME" /></translation> @@ -1603,6 +1614,7 @@ <translation id="3450157232394774192">Stan bezczynności – procentowo</translation> <translation id="3453612417627951340">Wymaga autoryzacji</translation> <translation id="3454157711543303649">Aktywacja ukończona</translation> +<translation id="3454213325559396544">To jest ostatnia automatyczna aktualizacja oprogramowania i zabezpieczeń, którą otrzymuje to urządzenie (<ph name="DEVICE_TYPE" />). Aby otrzymywać aktualizacje w przyszłości, przejdź na nowszy model.</translation> <translation id="345693547134384690">Otwórz &grafikę w nowej karcie</translation> <translation id="3457500881955698515">Twoja firma lub instytucja wymaga natychmiastowego zaktualizowania tego urządzenia</translation> <translation id="3459509316159669723">Drukowanie</translation> @@ -1760,6 +1772,7 @@ <translation id="3672681487849735243">Wykryto błąd fabryczny</translation> <translation id="367645871420407123">pozostaw puste, jeśli chcesz ustawić hasło główne na domyślną wartość obrazu testowego</translation> <translation id="3677657024345889897">Najciszej</translation> +<translation id="3677911431265050325">Otwórz stronę mobilną</translation> <translation id="3678156199662914018">Rozszerzenie: <ph name="EXTENSION_NAME" /></translation> <translation id="3681311097828166361">Dziękujemy za opinię. Jesteś teraz offline, więc Twoje zgłoszenie zostanie wysłane później.</translation> <translation id="3682824389861648626">Próg ruchu</translation> @@ -2144,6 +2157,12 @@ <translation id="4242577469625748426">Instalacja ustawień zasad na urządzeniu nie powiodła się: <ph name="VALIDATION_ERROR" />.</translation> <translation id="4244238649050961491">Znajdź więcej aplikacji dla rysika</translation> <translation id="424726838611654458">Zawsze otwieraj w Adobe Reader</translation> +<translation id="4247274662191902962">Dane z czujników będą udostępniane tylko wtedy, gdy będziesz używać tego doświadczenia związanego z VR. Strona może być w stanie poznać Cię na podstawie pewnych informacji, takich jak: + – Twoja lokalizacja; + – Twoje cechy fizyczne, na przykład położenie oczu; + – Twoje ruchy, na przykład sposób chodzenia. + + Zanim zezwolisz stronie na dostęp, upewnij się, że możesz jej zaufać.</translation> <translation id="4247901771970415646">Nie można zsynchronizować z <ph name="USERNAME" /></translation> <translation id="4249248555939881673">Czekam na połączenie z siecią...</translation> <translation id="4249373718504745892">Ta strona ma zablokowany dostęp do kamery i mikrofonu.</translation> @@ -2206,6 +2225,7 @@ <translation id="4350019051035968019">To urządzenie jest oznaczone jako zarządzane przez inną domenę i nie można go przypisać do domeny, do której należy Twoje konto.</translation> <translation id="4354344420232759511">Tutaj pojawią się odwiedzone przez Ciebie strony</translation> <translation id="435527878592612277">Wybierz swoje zdjęcie</translation> +<translation id="4358313196493694334">Stabilizacja miejsca kliknięcia</translation> <translation id="4359408040881008151">Zainstalowane ponieważ jest wymagane przez inne rozszerzenia.</translation> <translation id="4359717112757026264">Pejzaż miejski</translation> <translation id="4361142739114356624">Klucz prywatny tego certyfikatu klienta jest nieprawidłowy lub nie istnieje</translation> @@ -2330,6 +2350,7 @@ <translation id="4558426062282641716">Przesłano prośbę o pozwolenie na automatyczne uruchamianie</translation> <translation id="4558491878126948419">Otrzymuj wskazówki na temat urządzeń typu <ph name="DEVICE_TYPE" /> i najnowsze wiadomości o produktach i usługach Google. Podziel się swoją opinią. W każdej chwili możesz zrezygnować z subskrypcji.</translation> <translation id="4559617833001311418">Ta witryna ma dostęp do czujników ruchu lub oświetlenia.</translation> +<translation id="4561098487691395071">Możesz też wybrać plik PPD dla drukarki</translation> <translation id="4562155214028662640">Dodaj odcisk palca</translation> <translation id="4563880231729913339">Palec 3</translation> <translation id="4565377596337484307">Ukryj hasło</translation> @@ -2574,6 +2595,7 @@ <translation id="494286511941020793">Konfiguracja serwera proxy – pomoc</translation> <translation id="4943368462779413526">Piłka futbolowa</translation> <translation id="4943691134276646401">„<ph name="CHROME_EXTENSION_NAME" />” chce się połączyć z portem szeregowym</translation> +<translation id="4944310289250773232">Ta usługa uwierzytelniania pochodzi z domeny <ph name="SAML_DOMAIN" /></translation> <translation id="495170559598752135">Czynności</translation> <translation id="4953689047182316270">Odpowiadanie na zdarzenia dotyczące ułatwień dostępu</translation> <translation id="4953808748584563296">Domyślny pomarańczowy awatar</translation> @@ -2666,6 +2688,7 @@ <translation id="5094721898978802975">Komunikowanie się ze współpracującymi aplikacjami natywnymi</translation> <translation id="5097002363526479830">Nie udało się połączyć z siecią „<ph name="NAME" />”: <ph name="DETAILS" /></translation> <translation id="5101042277149003567">Otwórz wszystkie zakładki</translation> +<translation id="5101839224773798795">Automatyczne kliknięcie po zatrzymaniu kursora</translation> <translation id="5108967062857032718">Ustawienia – Usuń aplikacje na Androida</translation> <translation id="5109044022078737958">Mia</translation> <translation id="5111646998522066203">Zamknij tryb incognito</translation> @@ -3149,10 +3172,11 @@ <translation id="5852112051279473187">Ups, coś się kompletnie nie udało podczas próby zarejestrowania tego urządzenia. Spróbuj ponownie lub skontaktuj się z przedstawicielem obsługi klienta.</translation> <translation id="5852137567692933493">Uruchom ponownie i wykonaj Powerwash</translation> <translation id="5854912040170951372">Kawałek pizzy</translation> +<translation id="5855643921295613558">0,6 s</translation> <translation id="5855773610748894548">Ups, błąd modułu zabezpieczeń.</translation> <translation id="5856721540245522153">Włącz funkcje debugowania</translation> <translation id="5857090052475505287">Nowy folder</translation> -<translation id="5857171483910641802">Proponowane skróty zależą od stron, które często odwiedzasz</translation> +<translation id="5857171483910641802">Skróty proponowane są na podstawie stron, które często odwiedzasz</translation> <translation id="5858490737742085133">Terminal</translation> <translation id="585979798156957858">Zewnętrzny klawisz Meta</translation> <translation id="5860033963881614850">Wyłączone</translation> @@ -3438,6 +3462,7 @@ <translation id="6279183038361895380">Naciśnij |<ph name="ACCELERATOR" />|, by wyświetlić kursor</translation> <translation id="6280215091796946657">Zaloguj się na inne konto</translation> <translation id="6280912520669706465">ARC</translation> +<translation id="628352644014831790">4 s</translation> <translation id="6285120108426285413">Plik <ph name="FILE_NAME" /> jest rzadko pobierany i może być niebezpieczny.</translation> <translation id="6285120908535925801">{NUM_PRINTER,plural, =1{Nowa drukarka w Twojej sieci}few{Nowe drukarki w Twojej sieci}many{Nowe drukarki w Twojej sieci}other{Nowe drukarki w Twojej sieci}}</translation> <translation id="6286708577777130801">Szczegóły zapisanych haseł</translation> @@ -3644,6 +3669,7 @@ <translation id="6612358246767739896">Treść chroniona</translation> <translation id="6613452264606394692">Dodaj tę stronę do zakładek, by szybko na nią wrócić</translation> <translation id="6615455863669487791">Pokaż mi</translation> +<translation id="6617100836880592260">Szybkość skanowania: <ph name="SPEED_WITH_UNITS" /></translation> <translation id="6618097958368085618">Zachowaj mimo to</translation> <translation id="6619058681307408113">Line Printer Daemon (LPD)</translation> <translation id="661907246513853610">Strona może śledzić Twoją lokalizację</translation> @@ -4458,6 +4484,7 @@ <translation id="7831491651892296503">Podczas konfigurowania sieci wystąpił błąd</translation> <translation id="7831754656372780761"><ph name="TAB_TITLE" /> <ph name="EMOJI_MUTING" /></translation> <translation id="7832084384634357321">Godzina zakończenia</translation> +<translation id="783214144752121388">Zablokuj uruchamianie Flasha na stronach (zalecane)</translation> <translation id="7833720883933317473">Tutaj pojawią się zapisane słowa niestandardowe</translation> <translation id="7835178595033117206">Zakładka została usunięta</translation> <translation id="7837776265184002579">Strona główna została zmieniona na <ph name="URL" />.</translation> @@ -4513,6 +4540,7 @@ <translation id="7911118814695487383">Linux</translation> <translation id="7912080627461681647">Twoje hasło zostało zmienione na serwerze. Wyloguj się i zaloguj się ponownie.</translation> <translation id="7915471803647590281">Zanim wyślesz opinię, powiedz nam, co się dzieje.</translation> +<translation id="7919210519031517829"><ph name="DURATION" /> s</translation> <translation id="792514962475806987">Poziom powiększenia lupy zadokowanej:</translation> <translation id="7925247922861151263">Sprawdzenie AAA nie powiodło się</translation> <translation id="7925285046818567682">Czekam na <ph name="HOST_NAME" />...</translation> @@ -4570,6 +4598,7 @@ <translation id="7987814697832569482">Zawsze łącz się przez tę sieć VPN</translation> <translation id="798835209536175951">Wysyłanie i odbieranie SMS-ów na Chromebooku. <ph name="LINK_BEGIN" />Więcej informacji<ph name="LINK_END" /></translation> <translation id="7988355189918024273">Włącz ułatwienia dostępu</translation> +<translation id="7991296728590311172">Ustawienia funkcji Switch Access</translation> <translation id="7994702968232966508">Metoda EAP</translation> <translation id="7997826902155442747">Priorytet procesu</translation> <translation id="7999229196265990314">Utworzono następujące pliki: @@ -4783,6 +4812,8 @@ <translation id="8308179586020895837">Pytaj, gdy witryna <ph name="HOST" /> chce mieć dostęp do kamery</translation> <translation id="830868413617744215">Beta</translation> <translation id="8309458809024885768">Certyfikat już istnieje</translation> +<translation id="8314381333424235892">Brakujące lub odinstalowane rozszerzenie</translation> +<translation id="8316618172731049784">Wyślij na: <ph name="DEVICE_NAME" /></translation> <translation id="8317671367883557781">Dodaj połączenie sieciowe</translation> <translation id="8319414634934645341">Rozszerzone użycie klucza</translation> <translation id="8320459152843401447">Cały ekran</translation> @@ -4940,6 +4971,7 @@ <translation id="8588866096426746242">Wyświetl statystyki profilu</translation> <translation id="8588868914509452556"><ph name="WINDOW_TITLE" /> – prezentowanie treści VR na goglach</translation> <translation id="8590375307970699841">Skonfiguruj aktualizacje automatyczne</translation> +<translation id="8591783563402255548">1 s</translation> <translation id="8592141010104017453">Nie pokazuj żadnych powiadomień</translation> <translation id="8593121833493516339">Wysyłaj dane diagnostyczne oraz informacje o użyciu. Pomóż ulepszyć działanie Androida na urządzeniu dziecka, automatycznie wysyłając do Google dane diagnostyczne oraz informacje o używaniu urządzenia i aplikacji. Nie zostaną one użyte do zidentyfikowania Twojego dziecka. Wykorzystamy je, by poprawić stabilność systemu i aplikacji oraz wprowadzić inne ulepszenia. Niektóre dane zbiorcze pomogą nam też udoskonalić aplikacje Google lub zostaną wykorzystane przez naszych partnerów, na przykład deweloperów aplikacji na Androida. Jeśli na koncie Google dziecka włączysz Dodatkową aktywność w internecie i aplikacjach, te dane mogą być zapisywane na tym koncie. <ph name="BEGIN_LINK1" />Więcej informacji<ph name="END_LINK1" /></translation> <translation id="8594908476761052472">Nagraj film</translation> @@ -4969,6 +5001,7 @@ <translation id="8637688295594795546">Jest dostępna aktualizacja systemu. Trwa przygotowanie do pobrania…</translation> <translation id="8639047128869322042">Szukam szkodliwego oprogramowania…</translation> <translation id="8642171459927087831">Token dostępu</translation> +<translation id="8642900771896232685">2 s</translation> <translation id="8642947597466641025">Powiększ tekst</translation> <translation id="8643418457919840804">Aby kontynuować, wybierz opcję:</translation> <translation id="8644655801811752511">Nie udało się zresetować tego klucza bezpieczeństwa. Spróbuj go zresetować zaraz po włożeniu.</translation> @@ -5170,6 +5203,7 @@ <translation id="8910222113987937043">Twoje zakładki, historia, hasła i inne ustawienia nie będą już synchronizowane z kontem Google. Wcześniejsze dane pozostaną zapisane na koncie Google. Możesz nimi zarządzać w <ph name="BEGIN_LINK" />Panelu Google<ph name="END_LINK" />.</translation> <translation id="8912362522468806198">Konta Google</translation> <translation id="8912793549644936705">Rozciągnij</translation> +<translation id="8912810933860534797">Włącz automatyczne skanowanie</translation> <translation id="891365694296252935">Wysyłaj dane diagnostyczne oraz informacje o użyciu. To urządzenie automatycznie wysyła do Google dane diagnostyczne oraz informacje o używaniu urządzenia i aplikacji. Nie zostaną one użyte do zidentyfikowania Twojego dziecka. Wykorzystamy je, by poprawić stabilność systemu i aplikacji oraz wprowadzić inne ulepszenia. Niektóre dane zbiorcze pomogą nam też udoskonalić aplikacje Google lub zostaną wykorzystane przez naszych partnerów, na przykład deweloperów aplikacji na Androida. To ustawienie jest wymuszone przez właściciela. Jeśli dodatkowo na koncie Google dziecka włączysz ustawienie Aktywność w internecie i aplikacjach, te dane mogą być zapisywane na tym koncie. <ph name="BEGIN_LINK1" />Więcej informacji<ph name="END_LINK1" /></translation> <translation id="8915370057835397490">Ładuję sugestie</translation> <translation id="8916476537757519021">Ramka podrzędna incognito: <ph name="SUBFRAME_SITE" /></translation> @@ -5322,6 +5356,7 @@ <translation id="9153934054460603056">Zapisz tożsamość i hasło</translation> <translation id="9154194610265714752">Zaktualizowano</translation> <translation id="91568222606626347">Utwórz skrót...</translation> +<translation id="9157096865782046368">0,8 s</translation> <translation id="9157697743260533322">Nie można skonfigurować automatycznych aktualizacji dla wszystkich użytkowników (błąd uruchomienia procesu wstępnego: <ph name="ERROR_NUMBER" />)</translation> <translation id="9158715103698450907">Ups! Podczas uwierzytelniania wystąpił problem z komunikacją sieciową. Sprawdź połączenie z siecią i spróbuj ponownie.</translation> <translation id="916607977885256133">Obraz w obrazie</translation>
diff --git a/chrome/app/resources/generated_resources_pt-BR.xtb b/chrome/app/resources/generated_resources_pt-BR.xtb index e8df0d02..b61e903 100644 --- a/chrome/app/resources/generated_resources_pt-BR.xtb +++ b/chrome/app/resources/generated_resources_pt-BR.xtb
@@ -2144,6 +2144,12 @@ <translation id="4242577469625748426">Falha ao instalar configurações da política no dispositivo: <ph name="VALIDATION_ERROR" />.</translation> <translation id="4244238649050961491">Encontrar mais apps para usar com a stylus</translation> <translation id="424726838611654458">Sempre abrir com o Adobe Reader</translation> +<translation id="4247274662191902962">Os dados do sensor serão compartilhados apenas enquanto você estiver nesta experiência de RV. É possível que o site aprenda sobre você usando algumas informações, como estas: + - Sua localização + - Suas características físicas, como a posição dos olhos + - Seus movimentos, como a maneira como você caminha + + Certifique-se de que esse site seja confiável antes de conceder acesso.</translation> <translation id="4247901771970415646">Não é possível sincronizar com <ph name="USERNAME" /></translation> <translation id="4249248555939881673">Aguardando conexão da rede...</translation> <translation id="4249373718504745892">Esta página foi impedida de acessar sua câmera e seu microfone.</translation>
diff --git a/chrome/app/resources/generated_resources_pt-PT.xtb b/chrome/app/resources/generated_resources_pt-PT.xtb index 2b0da45..6b870816 100644 --- a/chrome/app/resources/generated_resources_pt-PT.xtb +++ b/chrome/app/resources/generated_resources_pt-PT.xtb
@@ -1,6 +1,7 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="pt-PT"> +<translation id="1002469766576243227">Este serviço de autenticação é alojado por <ph name="EXTENSION_NAME" /></translation> <translation id="1003088604756913841">Abrir link numa nova janela da aplicação <ph name="APP" /></translation> <translation id="1004218526896219317">Acesso a sites</translation> <translation id="1005274289863221750">Utilizar o seu microfone e a câmara</translation> @@ -289,6 +290,7 @@ <translation id="1429300045468813835">Tudo limpo</translation> <translation id="143027896309062157">Ler e alterar todos os dados no computador e os Sites que visita</translation> <translation id="1430915738399379752">Imprimir</translation> +<translation id="1431188203598586230">Atualização final do software</translation> <translation id="1432581352905426595">Gerir motores de pesquisa</translation> <translation id="1433811987160647649">Perguntar antes de aceder</translation> <translation id="1434696352799406980">Repõe a página inicial, a página novo separador, o motor de pesquisa e os separadores fixos. Também desativa todas as extensões e limpa os dados temporários como os cookies. Os marcadores, o histórico e as palavras-passe guardadas não são limpos.</translation> @@ -528,6 +530,7 @@ <translation id="1781771911845953849">Contas e sincronização</translation> <translation id="1782196717298160133">A localizar o seu telemóvel</translation> <translation id="1784849162047402014">O dispositivo tem pouco espaço em disco</translation> +<translation id="1790194216133135334">Enviar link para <ph name="DEVICE_NAME" /></translation> <translation id="1792619191750875668">Ecrã expandido</translation> <translation id="1794791083288629568">Envie-nos comentários para nos ajudar a corrigir este problema.</translation> <translation id="1795214765651529549">Utilizar tema clássico</translation> @@ -590,6 +593,7 @@ <translation id="1875312262568496299">Começar</translation> <translation id="1875387611427697908">Só é possível adicioná-la a partir da <ph name="CHROME_WEB_STORE" />.</translation> <translation id="1877520246462554164">Falha ao obter o símbolo de autenticação. Termine e inicie sessão novamente para tentar de novo.</translation> +<translation id="1877860345998737529">Atribuição de ações do acesso por comutador</translation> <translation id="1879000426787380528">Iniciar sessão como</translation> <translation id="1880905663253319515">Eliminar o certificado "<ph name="CERTIFICATE_NAME" />"?</translation> <translation id="1886996562706621347">Permitir que os Web sites peçam para se tornarem os processadores de protocolos predefinidos (recomendado)</translation> @@ -869,7 +873,9 @@ <translation id="230927227160767054">Esta página pretende instalar um controlador de serviço.</translation> <translation id="2309620859903500144">Este site foi impedido de aceder aos seus sensores de movimento ou de luz.</translation> <translation id="2315414688463285945">Ocorreu um erro ao configurar os ficheiros Linux. Tente novamente.</translation> +<translation id="2315587498123194634">Enviar link para <ph name="DEVICE_NAME" /></translation> <translation id="2316129865977710310">Não, obrigado</translation> +<translation id="2316739859433277603">As pesquisas do Iniciador de Aplicações utilizam a <ph name="BEGIN_LINK" />definição do motor de pesquisa<ph name="END_LINK" /> do seu navegador.</translation> <translation id="2317842250900878657"><ph name="PROGRESS_PERCENT" />% concluída</translation> <translation id="2318143611928805047">Tamanho do papel</translation> <translation id="2318817390901984578">Para utilizar aplicações para Android, carregue e atualize o seu <ph name="DEVICE_TYPE" />.</translation> @@ -909,6 +915,7 @@ <translation id="2365507699358342471">Este site pode ver o texto e as imagens copiados para a área de transferência.</translation> <translation id="2367199180085172140">Adicionar partilha de ficheiros</translation> <translation id="2367972762794486313">Mostrar aplicações</translation> +<translation id="2369105924912929484">Ativar/desativar conteúdos da página destilados</translation> <translation id="2371076942591664043">Abrir quando estiver concluí&do</translation> <translation id="2375406435414127095">Associar ao seu telemóvel</translation> <translation id="2377667304966270281">Falhas de hardware</translation> @@ -1158,6 +1165,7 @@ <translation id="2739191690716947896">Depurar</translation> <translation id="2739240477418971307">Alterar as definições de acessibilidade</translation> <translation id="2740393541869613458">analisar Sites que o utilizador supervisionado visitou e</translation> +<translation id="2741912629735277980">Apresentar a IU no ecrã de início de sessão</translation> <translation id="274290345632688601">A restaurar aplicações e ficheiros do Linux…</translation> <translation id="2743387203779672305">Copiar para a área de transferência</translation> <translation id="2745080116229976798">Subordinação qualificada Microsoft</translation> @@ -1274,6 +1282,7 @@ <translation id="2910318910161511225">Estabeleça ligação a uma rede e tente novamente.</translation> <translation id="2913331724188855103">Permitir que os sites guardem e leiam dados de cookies (recomendado)</translation> <translation id="2915102088417824677">Ver o registo de atividade</translation> +<translation id="2915873080513663243">Análise automática</translation> <translation id="2916073183900451334">Premir Separador numa página Web realça links e campos de formulários</translation> <translation id="2916745397441987255">Pesquisar extensões</translation> <translation id="2921081876747860777">Crie uma palavra-passe para proteger os seus dados locais.</translation> @@ -1483,6 +1492,7 @@ <translation id="327147043223061465">Ver todos os cookies e os dados de sites</translation> <translation id="3271648667212143903"><ph name="ORIGIN" /> pretende estabelecer ligação</translation> <translation id="3274763671541996799">Mudou para o ecrã inteiro.</translation> +<translation id="3275778809241512831">A sua chave de segurança interna é atualmente insegura. Remova-a de todos os serviços nos quais a utilizou. Para resolver o problema, reponha a chave de segurança.</translation> <translation id="3275778913554317645">Abrir como janela</translation> <translation id="3278001907972365362">A(s) sua(s) Conta(s) Google necessita(m) de atenção</translation> <translation id="3279230909244266691">Este processo pode demorar alguns minutos. A iniciar a máquina virtual…</translation> @@ -1575,6 +1585,7 @@ <translation id="3412265149091626468">Passar para a selecção</translation> <translation id="3413122095806433232">Emissores de AC: <ph name="LOCATION" /></translation> <translation id="3414952576877147120">Tamanho:</translation> +<translation id="3420501302812554910">É necessário repor a chave de segurança interna</translation> <translation id="3421387094817716717">Chave pública curva elíptica</translation> <translation id="3423463006624419153">No "<ph name="PHONE_NAME_1" />" e no "<ph name="PHONE_NAME_2" />":</translation> <translation id="3423858849633684918">Reiniciar o <ph name="PRODUCT_NAME" /></translation> @@ -1603,6 +1614,7 @@ <translation id="3450157232394774192">Percentagem de ocupação no estado inativo</translation> <translation id="3453612417627951340">Necessita de autorização</translation> <translation id="3454157711543303649">Activação concluída</translation> +<translation id="3454213325559396544">Esta é a última atualização automática de software e de segurança para este <ph name="DEVICE_TYPE" />. Para obter atualizações futuras, atualize para um modelo mais recente.</translation> <translation id="345693547134384690">Abrir imagem num novo separador</translation> <translation id="3457500881955698515">A sua empresa ou entidade requer uma atualização imediata a este dispositivo.</translation> <translation id="3459509316159669723">Impressão</translation> @@ -1760,6 +1772,7 @@ <translation id="3672681487849735243">Foi detetado um erro de fábrica</translation> <translation id="367645871420407123">deixe em branco se pretender definir a palavra-passe de raiz como o valor da imagem de teste predefinido.</translation> <translation id="3677657024345889897">O mais baixo</translation> +<translation id="3677911431265050325">Pedir site para dispositivos móveis</translation> <translation id="3678156199662914018">Extensão: <ph name="EXTENSION_NAME" /></translation> <translation id="3681311097828166361">Obrigado pelos seus comentários. Neste modo, está offline, pelo que o seu relatório será enviado mais tarde.</translation> <translation id="3682824389861648626">Limite de movimentos</translation> @@ -2144,6 +2157,12 @@ <translation id="4242577469625748426">Falha ao instalar as definições da política no dispositivo: <ph name="VALIDATION_ERROR" />.</translation> <translation id="4244238649050961491">Encontrar mais aplicações para a caneta stylus</translation> <translation id="424726838611654458">Sempre aberto no Adobe Reader</translation> +<translation id="4247274662191902962">Os dados de sensores apenas serão partilhados enquanto estiver nesta experiência de RV. O site pode conhecê-lo através de determinadas informações, como: + - A sua localização. + - As suas caraterísticas físicas, como a posição dos olhos. + - Os seus movimentos, como o seu modo de caminhar. + + Certifique-se de que confia neste site antes de permitir o acesso.</translation> <translation id="4247901771970415646">Não é possível sincronizar com <ph name="USERNAME" /></translation> <translation id="4249248555939881673">A aguardar ligação à rede...</translation> <translation id="4249373718504745892">Esta página foi impedida de aceder à sua câmara e microfone.</translation> @@ -2206,6 +2225,7 @@ <translation id="4350019051035968019">Não é possível inscrever este dispositivo no domínio a que pertence a sua conta, porque está marcado para gestão por um domínio diferente.</translation> <translation id="4354344420232759511">Os sites que visitar aparecem aqui</translation> <translation id="435527878592612277">Selecionar a sua foto</translation> +<translation id="4358313196493694334">Estabilizar a localização do clique</translation> <translation id="4359408040881008151">Instalada devido a extensão(ões) dependente(s).</translation> <translation id="4359717112757026264">Paisagens urbanas</translation> <translation id="4361142739114356624">A chave privada para este certificado de cliente está em falta ou é inválida</translation> @@ -2330,6 +2350,7 @@ <translation id="4558426062282641716">Permissão para início automático solicitado</translation> <translation id="4558491878126948419">Receba sugestões e atualizações do <ph name="DEVICE_TYPE" /> sobre produtos Google e partilhe comentários. Anule a subscrição em qualquer altura.</translation> <translation id="4559617833001311418">Este site está a aceder aos seus sensores de movimento ou de luz.</translation> +<translation id="4561098487691395071">Em alternativa, especifique o PPD da impressora</translation> <translation id="4562155214028662640">Adicionar impressão digital</translation> <translation id="4563880231729913339">Dedo 3</translation> <translation id="4565377596337484307">Ocultar palavra-passe</translation> @@ -2574,6 +2595,7 @@ <translation id="494286511941020793">Ajuda de configuração de proxy</translation> <translation id="4943368462779413526">Bola de futebol</translation> <translation id="4943691134276646401">"<ph name="CHROME_EXTENSION_NAME" />" pretende estabelecer ligação a uma porta de série</translation> +<translation id="4944310289250773232">Este serviço de autenticação é alojado por <ph name="SAML_DOMAIN" /></translation> <translation id="495170559598752135">Ações</translation> <translation id="4953689047182316270">Responder a eventos de acessibilidade</translation> <translation id="4953808748584563296">Avatar cor de laranja predefinido</translation> @@ -2666,6 +2688,7 @@ <translation id="5094721898978802975">Comunicar com aplicações nativas cooperantes</translation> <translation id="5097002363526479830">Falha ao ligar à rede "<ph name="NAME" />": <ph name="DETAILS" /></translation> <translation id="5101042277149003567">Abrir todos os marcadores</translation> +<translation id="5101839224773798795">Clicar automaticamente quando o cursor parar</translation> <translation id="5108967062857032718">Definições – Remover aplicações para Android</translation> <translation id="5109044022078737958">Mia</translation> <translation id="5111646998522066203">Sair do modo de navegação anónima</translation> @@ -3150,6 +3173,7 @@ <translation id="5852112051279473187">Ups! Ocorreu um problema sério ao tentar inscrever este dispositivo. Tente novamente ou contacte o seu técnico de suporte.</translation> <translation id="5852137567692933493">Reiniciar e executar o Powerwash</translation> <translation id="5854912040170951372">Fatia</translation> +<translation id="5855643921295613558">0,6 segundos</translation> <translation id="5855773610748894548">Ups! Ocorreu um erro no módulo seguro.</translation> <translation id="5856721540245522153">Ativar funcionalidades de depuração</translation> <translation id="5857090052475505287">Nova pasta</translation> @@ -3439,6 +3463,7 @@ <translation id="6279183038361895380">Premir |<ph name="ACCELERATOR" />| para mostrar o cursor</translation> <translation id="6280215091796946657">Iniciar sessão com uma conta diferente</translation> <translation id="6280912520669706465">ARC</translation> +<translation id="628352644014831790">4 segundos</translation> <translation id="6285120108426285413"><ph name="FILE_NAME" /> não é habitualmente transferido e pode ser perigoso.</translation> <translation id="6285120908535925801">{NUM_PRINTER,plural, =1{Nova impressora na rede}other{Novas impressoras na rede}}</translation> <translation id="6286708577777130801">Detalhes de palavras-passe guardadas</translation> @@ -3645,6 +3670,7 @@ <translation id="6612358246767739896">Conteúdo protegido</translation> <translation id="6613452264606394692">Volte aqui rapidamente ao adicionar esta página aos marcadores</translation> <translation id="6615455863669487791">Mostrar</translation> +<translation id="6617100836880592260">Velocidade de análise: <ph name="SPEED_WITH_UNITS" /></translation> <translation id="6618097958368085618">Manter na mesma</translation> <translation id="6619058681307408113">Line Printer Daemon (LPD)</translation> <translation id="661907246513853610">O site pode monitorizar a sua localização.</translation> @@ -4459,6 +4485,7 @@ <translation id="7831491651892296503">Ocorreu um erro ao configurar a rede.</translation> <translation id="7831754656372780761"><ph name="TAB_TITLE" /> <ph name="EMOJI_MUTING" /></translation> <translation id="7832084384634357321">Hora de fim</translation> +<translation id="783214144752121388">Impedir que os sites executem o Flash (recomendado)</translation> <translation id="7833720883933317473">As palavras personalizadas guardadas aparecem aqui</translation> <translation id="7835178595033117206">Marcador removido</translation> <translation id="7837776265184002579">A sua página inicial foi alterada para <ph name="URL" />.</translation> @@ -4514,6 +4541,7 @@ <translation id="7911118814695487383">Linux</translation> <translation id="7912080627461681647">A sua palavra-passe foi alterada no servidor. Termine e inicie sessão novamente.</translation> <translation id="7915471803647590281">Indique-nos o que está a acontecer antes de enviar os comentários.</translation> +<translation id="7919210519031517829"><ph name="DURATION" /> s</translation> <translation id="792514962475806987">Nível de zoom da lupa ancorada:</translation> <translation id="7925247922861151263">A verificação AAA falhou</translation> <translation id="7925285046818567682">A aguardar por <ph name="HOST_NAME" />...</translation> @@ -4571,6 +4599,7 @@ <translation id="7987814697832569482">Ligar sempre através desta VPN</translation> <translation id="798835209536175951">Envie e receba mensagens de texto com o Chromebook. <ph name="LINK_BEGIN" />Saiba mais<ph name="LINK_END" /></translation> <translation id="7988355189918024273">Ativar funcionalidades de acessibilidade</translation> +<translation id="7991296728590311172">Definições do acesso por comutador</translation> <translation id="7994702968232966508">Método EAP</translation> <translation id="7997826902155442747">Prioridade do processo</translation> <translation id="7999229196265990314">Criou os seguintes ficheiros: @@ -4783,6 +4812,8 @@ <translation id="8308179586020895837">Perguntar se <ph name="HOST" /> pretende aceder à sua câmara</translation> <translation id="830868413617744215">Beta</translation> <translation id="8309458809024885768">O certificado já existe</translation> +<translation id="8314381333424235892">Extensão em falta ou desinstalada.</translation> +<translation id="8316618172731049784">Enviar para <ph name="DEVICE_NAME" /></translation> <translation id="8317671367883557781">Adicionar ligação de rede</translation> <translation id="8319414634934645341">Utilização alargada da chave</translation> <translation id="8320459152843401447">O seu ecrã inteiro</translation> @@ -4939,6 +4970,7 @@ <translation id="8588866096426746242">Mostrar estatísticas do perfil</translation> <translation id="8588868914509452556"><ph name="WINDOW_TITLE" /> – a apresentar RV no capacete de realidade virtual</translation> <translation id="8590375307970699841">Configurar actualizações automáticas</translation> +<translation id="8591783563402255548">1 segundo</translation> <translation id="8592141010104017453">Não mostrar qualquer notificação</translation> <translation id="8593121833493516339">Envie dados de utilização e diagnósticos. Ajude a melhorar a experiência Android da criança ao enviar automaticamente dados de diagnóstico, de utilização de aplicações e do dispositivo para a Google. Estes dados não serão utilizados para identificar a criança e ajudarão a melhorar a estabilidade das aplicações e do sistema, entre outras melhorias. Alguns dados agregados também ajudarão as aplicações e os parceiros Google, como os programadores Android. Se a Atividade da Web e de aplicações adicional estiver ativada para a criança, estes dados podem ser guardados na respetiva Conta Google. <ph name="BEGIN_LINK1" />Saiba mais<ph name="END_LINK1" /></translation> <translation id="8594908476761052472">Capturar vídeo</translation> @@ -4968,6 +5000,7 @@ <translation id="8637688295594795546">Actualização do sistema disponível. A preparar para transferir…</translation> <translation id="8639047128869322042">A procurar software prejudicial...</translation> <translation id="8642171459927087831">Chave de Acesso</translation> +<translation id="8642900771896232685">2 segundos</translation> <translation id="8642947597466641025">Aumentar o tamanho do texto</translation> <translation id="8643418457919840804">Para continuar, selecione uma opção:</translation> <translation id="8644655801811752511">Não é possível repor esta chave de segurança. Experimente repor a chave imediatamente depois de a inserir.</translation> @@ -5169,6 +5202,7 @@ <translation id="8910222113987937043">As alterações aos seus marcadores, histórico, palavras-passe e outras definições já não serão sincronizadas com a sua Conta Google. No entanto, os dados existentes continuarão armazenados na Conta Google e podem ser geridos no <ph name="BEGIN_LINK" />Painel de Controlo Google<ph name="END_LINK" />.</translation> <translation id="8912362522468806198">Conta Google</translation> <translation id="8912793549644936705">Esticar</translation> +<translation id="8912810933860534797">Ativar análise automática</translation> <translation id="891365694296252935">Envie dados de utilização e diagnóstico. Agora, este dispositivo está a enviar automaticamente dados de diagnóstico, de utilização de aplicações e do dispositivo para a Google. Estes dados não serão utilizados para identificar a criança e ajudarão a melhorar a estabilidade das aplicações e do sistema, entre outras melhorias. Alguns dados agregados também ajudarão as aplicações e os parceiros Google, como os programadores Android. Esta definição é aplicada pelo proprietário. Se a Atividade da Web e de aplicações adicional estiver ativada para a criança, estes dados podem ser guardados na respetiva Conta Google. <ph name="BEGIN_LINK1" />Saiba mais<ph name="END_LINK1" /></translation> <translation id="8915370057835397490">A carregar sugestão</translation> <translation id="8916476537757519021">Subestrutura da navegação anónima: <ph name="SUBFRAME_SITE" /></translation> @@ -5321,6 +5355,7 @@ <translation id="9153934054460603056">Guardar identidade e palavra-passe</translation> <translation id="9154194610265714752">Atualizado</translation> <translation id="91568222606626347">Criar atalho...</translation> +<translation id="9157096865782046368">0,8 segundos</translation> <translation id="9157697743260533322">Falha ao configurar atualizações automáticas para todos os utilizadores (erro de inicialização da verificação prévia: <ph name="ERROR_NUMBER" />)</translation> <translation id="9158715103698450907">Ups! Ocorreu um problema de comunicação com a rede durante a autenticação. Verifique a ligação de rede e tente novamente.</translation> <translation id="916607977885256133">Ecrã no ecrã</translation>
diff --git a/chrome/app/resources/generated_resources_ro.xtb b/chrome/app/resources/generated_resources_ro.xtb index 88a9ee0..9ab7d4f 100644 --- a/chrome/app/resources/generated_resources_ro.xtb +++ b/chrome/app/resources/generated_resources_ro.xtb
@@ -1,6 +1,7 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="ro"> +<translation id="1002469766576243227">Acest serviciu de autentificare este găzduit de <ph name="EXTENSION_NAME" /></translation> <translation id="1003088604756913841">Deschide linkul într-o fereastră nouă în <ph name="APP" /></translation> <translation id="1004218526896219317">Acces la site</translation> <translation id="1005274289863221750">Utilizează microfonul și camera foto</translation> @@ -289,6 +290,7 @@ <translation id="1429300045468813835">Totul a fost șters</translation> <translation id="143027896309062157">Citește și modifică toate datele de pe computer și de pe site-urile pe care le accesezi</translation> <translation id="1430915738399379752">Printează</translation> +<translation id="1431188203598586230">Actualizare de software finală</translation> <translation id="1432581352905426595">Gestionați motoarele de căutare</translation> <translation id="1433811987160647649">Solicită permisiunea înainte de accesare</translation> <translation id="1434696352799406980">Astfel, pagina de pornire, pagina Filă nouă, motorul de căutare și filele fixate vor fi resetate. De asemenea, vor fi dezactivate toate extensiile, iar datele temporare vor fi șterse, cum ar fi cookie-urile. Marcajele, istoricul și parolele salvate nu vor fi șterse.</translation> @@ -528,6 +530,7 @@ <translation id="1781771911845953849">Conturi și sincronizare</translation> <translation id="1782196717298160133">Se găsește telefonul</translation> <translation id="1784849162047402014">Spațiul de pe hard diskul dispozitivului este redus</translation> +<translation id="1790194216133135334">Trimite linkul la <ph name="DEVICE_NAME" /></translation> <translation id="1792619191750875668">Afișare extinsă</translation> <translation id="1794791083288629568">Trimite feedback pentru a contribui la remedierea problemei.</translation> <translation id="1795214765651529549">Folosește tema clasică</translation> @@ -590,6 +593,7 @@ <translation id="1875312262568496299">Începe</translation> <translation id="1875387611427697908">Aceasta poate fi adăugată numai din <ph name="CHROME_WEB_STORE" /></translation> <translation id="1877520246462554164">Nu s-a putut obține indicativul de autentificare. Pentru a reîncerca, deconectează-te și conectează-te din nou.</translation> +<translation id="1877860345998737529">Atribuirea acțiunii de comutare</translation> <translation id="1879000426787380528">Conectează-te ca</translation> <translation id="1880905663253319515">Șterge certificatul „<ph name="CERTIFICATE_NAME" />”?</translation> <translation id="1886996562706621347">Permiteți site-urilor să solicite să devină handlere prestabilite pentru protocoale (recomandat)</translation> @@ -869,7 +873,9 @@ <translation id="230927227160767054">Această pagină dorește să instaleze un handler de serviciu.</translation> <translation id="2309620859903500144">Accesul acestui site la senzorii de mișcare sau de lumină a fost blocat.</translation> <translation id="2315414688463285945">Eroare la configurarea fișierelor Linux. Încearcă din nou.</translation> +<translation id="2315587498123194634">Trimite linkul la <ph name="DEVICE_NAME" /></translation> <translation id="2316129865977710310">Nu, mulțumesc</translation> +<translation id="2316739859433277603">Căutările din lansatorul aplicației folosesc <ph name="BEGIN_LINK" />setarea motorului de căutare<ph name="END_LINK" />.</translation> <translation id="2317842250900878657">Finalizat: <ph name="PROGRESS_PERCENT" />%</translation> <translation id="2318143611928805047">Dimensiunea hârtiei</translation> <translation id="2318817390901984578">Ca să folosești aplicații Android, încarcă și actualizează dispozitivul <ph name="DEVICE_TYPE" />.</translation> @@ -909,6 +915,7 @@ <translation id="2365507699358342471">Acest site poate să vadă textul și imaginile copiate în clipboard.</translation> <translation id="2367199180085172140">Adaugă un dispozitiv de stocare în rețea</translation> <translation id="2367972762794486313">Afișați aplicații</translation> +<translation id="2369105924912929484">Comută conținutul paginii convertite</translation> <translation id="2371076942591664043">Deschide când s-a &descărcat</translation> <translation id="2375406435414127095">Conectează-te la telefon</translation> <translation id="2377667304966270281">Erori de hardware</translation> @@ -1159,6 +1166,7 @@ <translation id="2739191690716947896">Remediați erorile</translation> <translation id="2739240477418971307">Modifică setările de accesibilitate</translation> <translation id="2740393541869613458">examinați site-urile web accesate de utilizatorul monitorizat și</translation> +<translation id="2741912629735277980">Afișează IU pe ecranul de conectare</translation> <translation id="274290345632688601">Se restabilesc aplicațiile și fișierele Linux</translation> <translation id="2743387203779672305">Copiați în clipboard</translation> <translation id="2745080116229976798">Subordonare calificată Microsoft</translation> @@ -1275,6 +1283,7 @@ <translation id="2910318910161511225">Conectează-te la o rețea și încearcă din nou</translation> <translation id="2913331724188855103">Permite site-urilor să salveze și să citească datele asociate cookie-urilor (recomandat)</translation> <translation id="2915102088417824677">Vezi Jurnalul de activități</translation> +<translation id="2915873080513663243">Scanare automată</translation> <translation id="2916073183900451334">Dacă apeși Tab când ești pe o pagină, se evidențiază linkurile și câmpurile formularelor</translation> <translation id="2916745397441987255">Caută extensii</translation> <translation id="2921081876747860777">Creează o parolă ca să protejezi datele locale.</translation> @@ -1483,6 +1492,7 @@ <translation id="327147043223061465">Vezi toate cookie-urile și datele privind site-urile</translation> <translation id="3271648667212143903"><ph name="ORIGIN" /> dorește să se conecteze</translation> <translation id="3274763671541996799">Ați intrat în modul ecran complet.</translation> +<translation id="3275778809241512831">Cheia de securitate internă nu este sigură. Elimină cheia din toate serviciile cu care ai folosit-o. Pentru a rezolva problema, resetează cheia de securitate.</translation> <translation id="3275778913554317645">Deschide ca fereastră</translation> <translation id="3278001907972365362">Trebuie să te ocupi de Conturile Google.</translation> <translation id="3279230909244266691">Poate dura câteva minute. Se pornește mașina virtuală.</translation> @@ -1575,6 +1585,7 @@ <translation id="3412265149091626468">Accesează selecția</translation> <translation id="3413122095806433232">Emitenți CA: <ph name="LOCATION" /></translation> <translation id="3414952576877147120">Dimensiune:</translation> +<translation id="3420501302812554910">Cheia de securitate internă trebuie resetată</translation> <translation id="3421387094817716717">Cheia publică a curburii eliptice</translation> <translation id="3423463006624419153">Pe „<ph name="PHONE_NAME_1" />” și „<ph name="PHONE_NAME_2" />”:</translation> <translation id="3423858849633684918">Repornește <ph name="PRODUCT_NAME" /></translation> @@ -1603,6 +1614,7 @@ <translation id="3450157232394774192">Procentaj de ocupare în starea inactivă</translation> <translation id="3453612417627951340">Necesită autorizare</translation> <translation id="3454157711543303649">Activarea a fost finalizată</translation> +<translation id="3454213325559396544">Aceasta este cea mai recentă actualizare automată de software și securitate pentru acest dispozitiv <ph name="DEVICE_TYPE" />. Pentru a primi actualizări viitoare, fă upgrade la un model mai nou.</translation> <translation id="345693547134384690">Deschide &imaginea într-o filă nouă</translation> <translation id="3457500881955698515">Compania sau organizația ta solicită o actualizare pentru acest dispozitiv imediat.</translation> <translation id="3459509316159669723">Printare</translation> @@ -1760,6 +1772,7 @@ <translation id="3672681487849735243">A fost detectată o eroare de fabricație</translation> <translation id="367645871420407123">nu completa dacă dorești să setezi parola directorului rădăcină la valoarea prestabilită a imaginii de test</translation> <translation id="3677657024345889897">Cel mai încet</translation> +<translation id="3677911431265050325">Solicită site mobil</translation> <translation id="3678156199662914018">Extensie: <ph name="EXTENSION_NAME" /></translation> <translation id="3681311097828166361">Îți mulțumim pentru feedback. Acum ești offline, iar raportul va fi trimis mai târziu.</translation> <translation id="3682824389861648626">Limită de mișcare</translation> @@ -2144,6 +2157,12 @@ <translation id="4242577469625748426">Setările de politică nu au putut fi instalate pe gadget: <ph name="VALIDATION_ERROR" />.</translation> <translation id="4244238649050961491">Găsește mai multe aplicații pentru creion</translation> <translation id="424726838611654458">Deschide întotdeauna în Adobe Reader</translation> +<translation id="4247274662191902962">Datele de la senzori vor fi distribuite doar când ești în această experiență RV. Acest site te-ar putea recunoaște, folosind anumite informații, precum: + - locația ta, + - trăsăturile tale fizice, cum ar fi poziția ochilor, + - mișcările tale, cum ar fi mersul. + + Asigură-te că ai încredere în acest site înainte să permiți accesul.</translation> <translation id="4247901771970415646">Nu se poate sincroniza cu <ph name="USERNAME" /></translation> <translation id="4249248555939881673">Se așteaptă realizarea conexiunii la rețea...</translation> <translation id="4249373718504745892">Accesul acestei pagini la camera și microfonul dvs. a fost blocat.</translation> @@ -2206,6 +2225,7 @@ <translation id="4350019051035968019">Acest dispozitiv nu poate fi înregistrat pe domeniul căruia îi aparține contul dvs., deoarece dispozitivul este asociat pentru gestionare de alt domeniu.</translation> <translation id="4354344420232759511">Site-urile pe care le accesezi apar aici</translation> <translation id="435527878592612277">Selectează fotografia</translation> +<translation id="4358313196493694334">Stabilizează locația clicului</translation> <translation id="4359408040881008151">Instalată din cauza extensiilor dependente.</translation> <translation id="4359717112757026264">Cityscape</translation> <translation id="4361142739114356624">Cheia privată pentru acest Certificat de client lipsește sau nu este validă</translation> @@ -2330,6 +2350,7 @@ <translation id="4558426062282641716">S-a solicitat permisiunea de lansare automată</translation> <translation id="4558491878126948419">Obține sfaturi referitoare la <ph name="DEVICE_TYPE" />, actualizări pentru produsele Google și trimite feedback. Te poți dezabona în orice moment.</translation> <translation id="4559617833001311418">Acest site îți accesează senzorii de mișcare sau de lumină.</translation> +<translation id="4561098487691395071">Sau specifică fișierul PPD al imprimantei</translation> <translation id="4562155214028662640">Adaugă o amprentă</translation> <translation id="4563880231729913339">Deget 3</translation> <translation id="4565377596337484307">Ascunde parola</translation> @@ -2574,6 +2595,7 @@ <translation id="494286511941020793">Ajutor de configurare pentru proxy</translation> <translation id="4943368462779413526">Minge de fotbal</translation> <translation id="4943691134276646401">„<ph name="CHROME_EXTENSION_NAME" />” dorește să se conecteze la un port serial</translation> +<translation id="4944310289250773232">Acest serviciu de autentificare este găzduit de <ph name="SAML_DOMAIN" /></translation> <translation id="495170559598752135">Acțiuni</translation> <translation id="4953689047182316270">să răspundă evenimentelor de accesibilitate</translation> <translation id="4953808748584563296">Avatar portocaliu prestabilit</translation> @@ -2666,6 +2688,7 @@ <translation id="5094721898978802975">Comunicarea cu aplicațiile native cooperante</translation> <translation id="5097002363526479830">A eșuat conectarea la rețeaua „<ph name="NAME" />”: <ph name="DETAILS" /></translation> <translation id="5101042277149003567">Deschide toate marcajele</translation> +<translation id="5101839224773798795">Se dă clic automat când cursorul se oprește</translation> <translation id="5108967062857032718">Setări – Elimină aplicațiile Android</translation> <translation id="5109044022078737958">Mia</translation> <translation id="5111646998522066203">Ieși din modul incognito</translation> @@ -3149,6 +3172,7 @@ <translation id="5852112051279473187">Hopa! A apărut o eroare gravă la înregistrarea dispozitivului. Încearcă din nou sau contactează reprezentantul de asistență.</translation> <translation id="5852137567692933493">Reporniți și faceți Powerwash</translation> <translation id="5854912040170951372">Feliuță</translation> +<translation id="5855643921295613558">0,6 secunde</translation> <translation id="5855773610748894548">Hopa, eroare privind modulul securizat.</translation> <translation id="5856721540245522153">Activează funcțiile de remediere a erorilor</translation> <translation id="5857090052475505287">Dosar nou</translation> @@ -3438,6 +3462,7 @@ <translation id="6279183038361895380">Apasă pe |<ph name="ACCELERATOR" />| pentru a fi afișat cursorul</translation> <translation id="6280215091796946657">Conectează-te cu alt cont</translation> <translation id="6280912520669706465">ARC</translation> +<translation id="628352644014831790">4 secunde</translation> <translation id="6285120108426285413">Fișierul <ph name="FILE_NAME" /> nu este descărcat de obicei și ar putea fi periculos.</translation> <translation id="6285120908535925801">{NUM_PRINTER,plural, =1{Imprimantă nouă în rețea}few{Imprimante noi în rețea}other{Imprimante noi în rețea}}</translation> <translation id="6286708577777130801">Detalii privind parolele salvate</translation> @@ -3644,6 +3669,7 @@ <translation id="6612358246767739896">Conținut protejat</translation> <translation id="6613452264606394692">Marchează această pagină pentru a o putea accesa din nou rapid</translation> <translation id="6615455863669487791">Afișați</translation> +<translation id="6617100836880592260">Viteza de scanare: <ph name="SPEED_WITH_UNITS" /></translation> <translation id="6618097958368085618">Păstrează oricum</translation> <translation id="6619058681307408113">Line Printer Daemon (LPD)</translation> <translation id="661907246513853610">Site-ul poate să îți urmărească locația</translation> @@ -4458,6 +4484,7 @@ <translation id="7831491651892296503">Eroare la configurarea rețelei</translation> <translation id="7831754656372780761"><ph name="TAB_TITLE" /> <ph name="EMOJI_MUTING" /></translation> <translation id="7832084384634357321">Ora de încheiere</translation> +<translation id="783214144752121388">Împiedică site-urile să ruleze Flash (recomandat)</translation> <translation id="7833720883933317473">Cuvintele personalizate salvate vor fi afișate aici</translation> <translation id="7835178595033117206">Marcajul a fost eliminat</translation> <translation id="7837776265184002579">Pagina principală a fost înlocuită cu <ph name="URL" />.</translation> @@ -4470,7 +4497,7 @@ <translation id="7849264908733290972">Deschide &imaginea într-o filă nouă</translation> <translation id="784934925303690534">Interval de timp</translation> <translation id="7850222546481862746"><ph name="BEGIN_PARAGRAPH1" />Pentru a finaliza configurarea pe acest dispozitiv, trebuie să te deconectezi din contul utilizatorului <ph name="USER_NAME" />.<ph name="END_PARAGRAPH1" /> - <ph name="BEGIN_PARAGRAPH2" />Poți gestiona controlul parental al copilului, instalând Family Link pentru părinți pe dispozitivul tău.<ph name="END_PARAGRAPH2" /></translation> + <ph name="BEGIN_PARAGRAPH2" />Poți gestiona controlul parental al copilului instalând Family Link pentru părinți pe dispozitivul tău.<ph name="END_PARAGRAPH2" /></translation> <translation id="7851457902707056880">Conectarea a fost restricționată la contul proprietarului. Reporniți dispozitivul și conectați-vă folosind contul proprietarului. Dispozitivul va reporni automat în 30 de secunde.</translation> <translation id="7851716364080026749">Blocați întotdeauna accesul la cameră și la microfon</translation> <translation id="7853747251428735">Mai multe instru&mente</translation> @@ -4513,6 +4540,7 @@ <translation id="7911118814695487383">Linux</translation> <translation id="7912080627461681647">Parola a fost modificată pe server. Deconectează-te, apoi conectează-te din nou.</translation> <translation id="7915471803647590281">Spune-ne ce se întâmplă înainte de a trimite feedback.</translation> +<translation id="7919210519031517829"><ph name="DURATION" /> sec.</translation> <translation id="792514962475806987">Nivelul de zoom al lupei andocate:</translation> <translation id="7925247922861151263">Verificarea AAA nu a reușit</translation> <translation id="7925285046818567682">Se așteaptă <ph name="HOST_NAME" />...</translation> @@ -4570,6 +4598,7 @@ <translation id="7987814697832569482">Conectează-te mereu prin această rețea VPN</translation> <translation id="798835209536175951">Trimite și primește mesaje text pe Chromebook. <ph name="LINK_BEGIN" />Află mai multe<ph name="LINK_END" /></translation> <translation id="7988355189918024273">Activați funcțiile de accesibilitate</translation> +<translation id="7991296728590311172">Setările pentru Accesul prin comutare</translation> <translation id="7994702968232966508">Metodă EAP</translation> <translation id="7997826902155442747">Prioritatea procesului</translation> <translation id="7999229196265990314">Au fost create următoarele fișiere: @@ -4783,6 +4812,8 @@ <translation id="8308179586020895837">Întreabă dacă <ph name="HOST" /> solicită acces la cameră</translation> <translation id="830868413617744215">Beta</translation> <translation id="8309458809024885768">Certificatul există deja</translation> +<translation id="8314381333424235892">Extensia lipsește sau a fost dezinstalată</translation> +<translation id="8316618172731049784">Trimite la <ph name="DEVICE_NAME" /></translation> <translation id="8317671367883557781">Adaugă o conexiune la rețea</translation> <translation id="8319414634934645341">Utilizare de cheie extinsă</translation> <translation id="8320459152843401447">Tot ecranul</translation> @@ -4939,6 +4970,7 @@ <translation id="8588866096426746242">Afișează statisticile profilului</translation> <translation id="8588868914509452556"><ph name="WINDOW_TITLE" /> - se prezintă RV pe vizualizator</translation> <translation id="8590375307970699841">Configurează actualizările automate</translation> +<translation id="8591783563402255548">1 secundă</translation> <translation id="8592141010104017453">Nu afișa nicio notificare</translation> <translation id="8593121833493516339">Trimite date de utilizare și diagnosticare. Contribuie la îmbunătățirea experienței Android a copilului trimițând automat la Google date de diagnosticare și utilizare a dispozitivului și a aplicațiilor. Acestea nu vor fi folosite la identificarea copilului și vor ajuta la stabilitatea sistemului, a aplicațiilor și altele. Unele date cumulate vor ajuta aplicațiile și partenerii Google, cum ar fi dezvoltatorii Android. Dacă ai activat setarea Activitatea suplimentară de pe web și din aplicații pentru copilul tău, aceste date pot fi salvate în Contul său Google. <ph name="BEGIN_LINK1" />Află mai multe<ph name="END_LINK1" /></translation> <translation id="8594908476761052472">Înregistrează un videoclip</translation> @@ -4968,6 +5000,7 @@ <translation id="8637688295594795546">Este disponibilă o actualizare de sistem. Se pregătește descărcarea...</translation> <translation id="8639047128869322042">Se caută software dăunător...</translation> <translation id="8642171459927087831">Indicativ de acces</translation> +<translation id="8642900771896232685">2 secunde</translation> <translation id="8642947597466641025">Măriți textul</translation> <translation id="8643418457919840804">Pentru a continua, alege o opțiune:</translation> <translation id="8644655801811752511">Această cheie de securitate nu poate fi resetată. Încearcă să resetezi cheia imediat după ce o introduci.</translation> @@ -5169,6 +5202,7 @@ <translation id="8910222113987937043">Modificările marcajelor, istoricului, parolelor sau ale altor setări nu vor mai fi sincronizate cu Contul Google. Totuși, datele existente vor rămâne stocate în Contul Google și pot fi gestionate din <ph name="BEGIN_LINK" />Tabloul de bord Google<ph name="END_LINK" />.</translation> <translation id="8912362522468806198">Contul Google</translation> <translation id="8912793549644936705">Extins</translation> +<translation id="8912810933860534797">Activează scanarea automată</translation> <translation id="891365694296252935">Trimite date de utilizare și diagnosticare. Momentan, dispozitivul trimite automat date de diagnosticare și de utilizare a dispozitivului și aplicațiilor la Google. Acestea nu vor fi folosite la identificarea copilului și vor ajuta la stabilitatea sistemului, a aplicațiilor și altele. Unele date cumulate vor ajuta aplicațiile și partenerii Google, cum ar fi dezvoltatorii Android. Această setare este impusă de proprietar. Dacă ai activat setarea Activitatea suplimentară de pe web și din aplicații pentru copilul tău, aceste date pot fi salvate în Contul său Google. <ph name="BEGIN_LINK1" />Află mai multe<ph name="END_LINK1" /></translation> <translation id="8915370057835397490">Se încarcă sugestiile</translation> <translation id="8916476537757519021">Subcadru incognito: <ph name="SUBFRAME_SITE" /></translation> @@ -5321,6 +5355,7 @@ <translation id="9153934054460603056">Salvează identitatea și parola</translation> <translation id="9154194610265714752">Actualizat</translation> <translation id="91568222606626347">Creează o comandă rapidă...</translation> +<translation id="9157096865782046368">0,8 secunde</translation> <translation id="9157697743260533322">Actualizările automate nu au putut fi configurate pentru toți utilizatorii (eroare la lansarea testării pe dispozitiv: <ph name="ERROR_NUMBER" />)</translation> <translation id="9158715103698450907">Hopa! A apărut o problemă de comunicare în rețea în timpul autentificării. Verificați conexiunea la rețea și încercați din nou.</translation> <translation id="916607977885256133">Picture-in-Picture</translation>
diff --git a/chrome/app/resources/generated_resources_ru.xtb b/chrome/app/resources/generated_resources_ru.xtb index cfa0fae..7ddcb83 100644 --- a/chrome/app/resources/generated_resources_ru.xtb +++ b/chrome/app/resources/generated_resources_ru.xtb
@@ -2144,6 +2144,12 @@ <translation id="4242577469625748426">Не удалось применить к устройству настройки политики: <ph name="VALIDATION_ERROR" />.</translation> <translation id="4244238649050961491">Другие приложения для стилуса</translation> <translation id="424726838611654458">Всегда открывать в Adobe Reader</translation> +<translation id="4247274662191902962">Данные датчиков будут использоваться только во время сеанса виртуальной реальности. Сайт сможет определять: + – ваше местоположение; + – ваши внешние черты, например положение глаз; + – ваши движения и походку. + + Предоставляйте доступ только тем сайтам, которым вы доверяете.</translation> <translation id="4247901771970415646">Не удалось синхронизироваться с аккаунтом <ph name="USERNAME" /></translation> <translation id="4249248555939881673">Ожидается подключение к сети...</translation> <translation id="4249373718504745892">Этот сайт не имеет доступа к вашим камере и микрофону</translation>
diff --git a/chrome/app/resources/generated_resources_sk.xtb b/chrome/app/resources/generated_resources_sk.xtb index c79e48a..4a8a276 100644 --- a/chrome/app/resources/generated_resources_sk.xtb +++ b/chrome/app/resources/generated_resources_sk.xtb
@@ -1,6 +1,7 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="sk"> +<translation id="1002469766576243227">Túto overovaciu službu hostí <ph name="EXTENSION_NAME" />.</translation> <translation id="1003088604756913841">Otvoriť odkaz v novom okne aplikácie <ph name="APP" /></translation> <translation id="1004218526896219317">Prístup k webom</translation> <translation id="1005274289863221750">Používať mikrofón a fotoaparát</translation> @@ -289,6 +290,7 @@ <translation id="1429300045468813835">Všetko bolo vymazané</translation> <translation id="143027896309062157">Čítať a meniť všetky údaje na počítači a navštevovaných weboch</translation> <translation id="1430915738399379752">Tlačiť</translation> +<translation id="1431188203598586230">Posledná aktualizácia softvéru</translation> <translation id="1432581352905426595">Spravovať vyhľadávače</translation> <translation id="1433811987160647649">Spýtať sa pred pristupovaním</translation> <translation id="1434696352799406980">Týmto sa obnoví vaša stránka pri spustení, stránka na novej karte, vyhľadávač a pripnuté karty. Zakážu sa aj všetky rozšírenia a vymažú dočasné dáta, ako napríklad súbory cookie. Záložky, história a uložené heslá sa nevymažú.</translation> @@ -528,6 +530,7 @@ <translation id="1781771911845953849">Účty a synchronizácia</translation> <translation id="1782196717298160133">Nájsť telefón</translation> <translation id="1784849162047402014">V zariadení je málo miesta na disku</translation> +<translation id="1790194216133135334">Odoslať odkaz do zariadenia <ph name="DEVICE_NAME" /></translation> <translation id="1792619191750875668">Rozšírená obrazovka</translation> <translation id="1794791083288629568">Odoslať spätnú väzbu, ktorá nám pomôže pri riešení tohto problému</translation> <translation id="1795214765651529549">Použiť klasický</translation> @@ -590,6 +593,7 @@ <translation id="1875312262568496299">Začať</translation> <translation id="1875387611427697908">Dá sa pridať iba zo služby <ph name="CHROME_WEB_STORE" /></translation> <translation id="1877520246462554164">Nepodarilo sa získať token na overenie totožnosti. Odhláste sa, potom sa opäť prihláste a skúste to znova.</translation> +<translation id="1877860345998737529">Priradenie akcií prepínačov</translation> <translation id="1879000426787380528">Prihlásený účet</translation> <translation id="1880905663253319515">Odstrániť certifikát „<ph name="CERTIFICATE_NAME" />“?</translation> <translation id="1886996562706621347">Povoliť webovým stránkam požiadať o nastavenie za predvolené obslužné nástroje protokolov (odporúčané)</translation> @@ -869,7 +873,9 @@ <translation id="230927227160767054">Táto stránka chce nainštalovať obslužný nástroj služby.</translation> <translation id="2309620859903500144">Tento web má zablokovaný prístup k senzorom pohybu alebo svetla.</translation> <translation id="2315414688463285945">Pri konfigurovaní súborov systému Linux sa vyskytla chyba. Skúste to znova.</translation> +<translation id="2315587498123194634">Odoslať odkaz do zariadenia <ph name="DEVICE_NAME" /></translation> <translation id="2316129865977710310">Nie, ďakujem</translation> +<translation id="2316739859433277603">Vyhľadávania zo spúšťača aplikácií používajú <ph name="BEGIN_LINK" />nastavenie vyhľadávača<ph name="END_LINK" /> vo vašom prehliadači.</translation> <translation id="2317842250900878657">Dokončené: <ph name="PROGRESS_PERCENT" />%</translation> <translation id="2318143611928805047">Veľkosť papiera</translation> <translation id="2318817390901984578">Ak chcete používať aplikácie pre Android, nabite a aktualizujte zariadenie <ph name="DEVICE_TYPE" />.</translation> @@ -909,6 +915,7 @@ <translation id="2365507699358342471">Tento web má prístup k textu a obrázkom skopírovaným do schránky.</translation> <translation id="2367199180085172140">Pridať zdieľanie súboru</translation> <translation id="2367972762794486313">Zobraziť aplikácie</translation> +<translation id="2369105924912929484">Prepnúť obsah vyčistených stránok</translation> <translation id="2371076942591664043">Po stiahnutí otvoriť</translation> <translation id="2375406435414127095">Pripojenie k telefónu</translation> <translation id="2377667304966270281">Závažné chyby</translation> @@ -1157,6 +1164,7 @@ <translation id="2739191690716947896">Ladiť</translation> <translation id="2739240477418971307">Zmeniť nastavenia dostupnosti</translation> <translation id="2740393541869613458">kontrolovať webové stránky, ktoré kontrolovaný používateľ navštívil, a</translation> +<translation id="2741912629735277980">Zobrazovať používateľské rozhrania na prihlasovacej obrazovke</translation> <translation id="274290345632688601">Obnovujú sa aplikácie a súbory pre Linux</translation> <translation id="2743387203779672305">Kopírovať do schránky</translation> <translation id="2745080116229976798">Oprávnené podriadenie od spoločnosti Microsoft</translation> @@ -1273,6 +1281,7 @@ <translation id="2910318910161511225">Pripojte sa k sieti a skúste to znova</translation> <translation id="2913331724188855103">Povoliť webom ukladať a čítať súbory cookie (odporučané)</translation> <translation id="2915102088417824677">Zobraziť denník aktivít</translation> +<translation id="2915873080513663243">Automatické prehľadávanie</translation> <translation id="2916073183900451334">Zvýrazňovať odkazy a polia formulárov na webovej stránke po stlačení klávesu Tab</translation> <translation id="2916745397441987255">Hľadať rozšírenia</translation> <translation id="2921081876747860777">Vytvorte si heslo na ochranu miestnych dát.</translation> @@ -1481,6 +1490,7 @@ <translation id="327147043223061465">Zobraziť všetky súbory cookie a údaje webu</translation> <translation id="3271648667212143903"><ph name="ORIGIN" /> žiada o pripojenie</translation> <translation id="3274763671541996799">Prepli ste na režim celej obrazovky.</translation> +<translation id="3275778809241512831">Váš interný bezpečnostný kľúč je momentálne nezabezpečený. Odstráňte ho zo všetkých služieb, v ktorých ste ho používali. Problém vyriešite jeho resetovaním.</translation> <translation id="3275778913554317645">Otvárať ako okno</translation> <translation id="3278001907972365362">Vaše účty Google vyžadujú pozornosť</translation> <translation id="3279230909244266691">Tento proces môže trvať niekoľko minút. Spúšťa sa virtuálny počítač.</translation> @@ -1573,6 +1583,7 @@ <translation id="3412265149091626468">Prejsť na výber</translation> <translation id="3413122095806433232">Vydavatelia CA: <ph name="LOCATION" /></translation> <translation id="3414952576877147120">Veľkosť:</translation> +<translation id="3420501302812554910">Vyžaduje sa resetovanie interného bezpečného kľúča</translation> <translation id="3421387094817716717">Verejný kľúč založený na eliptickej krivke</translation> <translation id="3423463006624419153">Vo vašich telefónoch <ph name="PHONE_NAME_1" /> a <ph name="PHONE_NAME_2" />:</translation> <translation id="3423858849633684918">Reštartujte <ph name="PRODUCT_NAME" /></translation> @@ -1601,6 +1612,7 @@ <translation id="3450157232394774192">Percento obsadenia priestoru údajmi stavu nečinnosti</translation> <translation id="3453612417627951340">Vyžaduje autorizáciu</translation> <translation id="3454157711543303649">Aktivácia bola dokončená</translation> +<translation id="3454213325559396544">Toto je posledná automatická aktualizácia softvéru a zabezpečenia pre toto zariadenie (<ph name="DEVICE_TYPE" />). Ak chcete v budúcnosti dostávať aktualizácie, prejdite na novší model.</translation> <translation id="345693547134384690">Otvoriť &obrázok na novej karte</translation> <translation id="3457500881955698515">Vaša spoločnosť alebo organizácia požaduje, aby ste toto zariadenie okamžite aktualizovali</translation> <translation id="3459509316159669723">Tlač</translation> @@ -1758,6 +1770,7 @@ <translation id="3672681487849735243">Zistila sa chyba z výroby</translation> <translation id="367645871420407123">Ak chcete heslo používateľa typu root nastaviť na predvolenú hodnotu testovacieho obrazu, ponechajte toto pole prázdne.</translation> <translation id="3677657024345889897">Najtichšie</translation> +<translation id="3677911431265050325">Vyžiadať mobilný web</translation> <translation id="3678156199662914018">Rozšírenie: <ph name="EXTENSION_NAME" /></translation> <translation id="3681311097828166361">Ďakujeme vám za spätnú väzbu. Teraz ste offline a vaše hlásenie sa odošle neskôr.</translation> <translation id="3682824389861648626">Limit pohybu</translation> @@ -2142,6 +2155,12 @@ <translation id="4242577469625748426">Nastavenia pravidla sa nepodarilo nainštalovať na zariadenie: <ph name="VALIDATION_ERROR" />.</translation> <translation id="4244238649050961491">Nájsť ďalšie aplikácie pre dotykové pero</translation> <translation id="424726838611654458">Vždy otvoriť v programe Adobe Reader</translation> +<translation id="4247274662191902962">Dáta senzorov sa budú zdieľať iba vtedy, keď budete v tomto prostredí VR. Príslušný web o vás môže získať informácie pomocou určitých údajov, napríklad na základe: + – polohy; + – fyzických čŕt, napríklad umiestnenia očí; + – pohybov, napríklad štýlu chôdze. + + Skôr ako povolíte prístup, skontrolujte, či ide o dôveryhodný web.</translation> <translation id="4247901771970415646">Nedá sa synchronizovať do účtu <ph name="USERNAME" /></translation> <translation id="4249248555939881673">Čaká sa na sieťové pripojenie...</translation> <translation id="4249373718504745892">Táto stránka má zablokovaný prístup ku kamere a mikrofónu.</translation> @@ -2204,6 +2223,7 @@ <translation id="4350019051035968019">Toto zariadenie nemôže byť zaregistrované do domény vášho účtu, pretože je označené ako spravované inou doménou.</translation> <translation id="4354344420232759511">Navštívené weby sa zobrazia tu</translation> <translation id="435527878592612277">Vyberte fotku</translation> +<translation id="4358313196493694334">Stabilizovať miesto kliknutia</translation> <translation id="4359408040881008151">Nainštalované pre závislé rozšírenia.</translation> <translation id="4359717112757026264">Mestá</translation> <translation id="4361142739114356624">Súkromný kľúč pre tento klientsky certifikát chýba alebo je neplatný</translation> @@ -2328,6 +2348,7 @@ <translation id="4558426062282641716">Požaduje sa povolenie na automatické spustenie</translation> <translation id="4558491878126948419">Získavajte tipy týkajúce sa zariadenia <ph name="DEVICE_TYPE" />, aktuálne informácie o službách Googlu a podeľte sa o spätnú väzbu. Odber môžete kedykoľvek zrušiť.</translation> <translation id="4559617833001311418">Tento web má prístup k senzorom pohybu alebo svetla.</translation> +<translation id="4561098487691395071">Alebo špecifikujte tlačiareň PPD</translation> <translation id="4562155214028662640">Pridať odtlačok</translation> <translation id="4563880231729913339">3. prst</translation> <translation id="4565377596337484307">Skryť heslo</translation> @@ -2572,6 +2593,7 @@ <translation id="494286511941020793">Pomocník konfigurácie servera proxy</translation> <translation id="4943368462779413526">Futbal</translation> <translation id="4943691134276646401"><ph name="CHROME_EXTENSION_NAME" /> sa chce pripojiť k sériovému portu</translation> +<translation id="4944310289250773232">Túto overovaciu službu hostí <ph name="SAML_DOMAIN" />.</translation> <translation id="495170559598752135">Akcie</translation> <translation id="4953689047182316270">Reagovať na udalosti dostupnosti</translation> <translation id="4953808748584563296">Predvolený oranžový avatar</translation> @@ -2664,6 +2686,7 @@ <translation id="5094721898978802975">Komunikovať so spolupracujúcimi natívnymi aplikáciami</translation> <translation id="5097002363526479830">K sieti „<ph name="NAME" />“ sa nepodarilo pripojiť: <ph name="DETAILS" /></translation> <translation id="5101042277149003567">Otvoriť všetky záložky</translation> +<translation id="5101839224773798795">Automaticky kliknúť po zastavení kurzora</translation> <translation id="5108967062857032718">Nastavenia – odstránenie aplikácií pre Android</translation> <translation id="5109044022078737958">Mia</translation> <translation id="5111646998522066203">Ukončiť režim inkognito</translation> @@ -3147,6 +3170,7 @@ <translation id="5852112051279473187">Ojoj! Pri registrácii tohto zariadenia sa vyskytla závažná chyba. Skúste to znova alebo kontaktujte svojho zástupcu podpory.</translation> <translation id="5852137567692933493">Reštartovať a použiť funkciu Powerwash</translation> <translation id="5854912040170951372">Pizza</translation> +<translation id="5855643921295613558">0,6 sekundy</translation> <translation id="5855773610748894548">Ojoj, chyba bezpečného modulu.</translation> <translation id="5856721540245522153">Aktivácia funkcií ladenia</translation> <translation id="5857090052475505287">Nový priečinok</translation> @@ -3436,6 +3460,7 @@ <translation id="6279183038361895380">Stlačením klávesa |<ph name="ACCELERATOR" />| zobrazíte kurzor</translation> <translation id="6280215091796946657">Prihlásiť sa pomocou iného účtu</translation> <translation id="6280912520669706465">ARC</translation> +<translation id="628352644014831790">4 sekundy</translation> <translation id="6285120108426285413">Súbor <ph name="FILE_NAME" /> sa bežne nesťahuje a môže byť nebezpečný.</translation> <translation id="6285120908535925801">{NUM_PRINTER,plural, =1{Nová tlačiareň v sieti}few{Nové tlačiarne v sieti}many{Nové tlačiarne v sieti}other{Nové tlačiarne v sieti}}</translation> <translation id="6286708577777130801">Podrobnosti uloženého hesla</translation> @@ -3642,6 +3667,7 @@ <translation id="6612358246767739896">Chránený obsah</translation> <translation id="6613452264606394692">Vráťte sa sem rýchlejšie tak, že stránku uložíte ako záložku</translation> <translation id="6615455863669487791">Zobraziť</translation> +<translation id="6617100836880592260">Rýchlosť prehľadávania: <ph name="SPEED_WITH_UNITS" /></translation> <translation id="6618097958368085618">Aj tak ponechať</translation> <translation id="6619058681307408113">Protokol LPD (Line Printer Daemon)</translation> <translation id="661907246513853610">Web môže sledovať vašu polohu</translation> @@ -4456,6 +4482,7 @@ <translation id="7831491651892296503">Chyba pri konfigurácii siete</translation> <translation id="7831754656372780761"><ph name="TAB_TITLE" /> <ph name="EMOJI_MUTING" /></translation> <translation id="7832084384634357321">Čas ukončenia</translation> +<translation id="783214144752121388">Zakázať webom spúšťať Flash (odporúčané)</translation> <translation id="7833720883933317473">Tu sa zobrazia uložené vlastné slová</translation> <translation id="7835178595033117206">Záložka bola odstránená</translation> <translation id="7837776265184002579">Vaša domovská stránka bola zmenená na <ph name="URL" />.</translation> @@ -4511,6 +4538,7 @@ <translation id="7911118814695487383">Linux</translation> <translation id="7912080627461681647">Vaše heslo bolo zmenené na serveri. Odhláste sa a potom sa znova prihláste.</translation> <translation id="7915471803647590281">Pred odoslaním spätnej väzby nám popíšte situáciu.</translation> +<translation id="7919210519031517829"><ph name="DURATION" /> s</translation> <translation id="792514962475806987">Úroveň priblíženia ukotvenej lupy:</translation> <translation id="7925247922861151263">Kontrola AAA zlyhala</translation> <translation id="7925285046818567682">Čakanie na <ph name="HOST_NAME" />...</translation> @@ -4568,6 +4596,7 @@ <translation id="7987814697832569482">Vždy pripájať cez túto sieť VPN</translation> <translation id="798835209536175951">Odosielajte a prijímajte textové správy z Chromebooku. <ph name="LINK_BEGIN" />Ďalšie informácie<ph name="LINK_END" /></translation> <translation id="7988355189918024273">Povoliť funkcie zjednodušeného ovládania</translation> +<translation id="7991296728590311172">Nastavenia ovládania prepínačmi</translation> <translation id="7994702968232966508">Metóda EAP</translation> <translation id="7997826902155442747">Priorita procesov</translation> <translation id="7999229196265990314">Boli vytvorené nasledujúce súbory: @@ -4780,6 +4809,8 @@ <translation id="8308179586020895837">Opýtať sa, ak chcú stránky <ph name="HOST" /> pristupovať ku kamere</translation> <translation id="830868413617744215">Beta</translation> <translation id="8309458809024885768">Certifikát už existuje</translation> +<translation id="8314381333424235892">Chýbajúce alebo neplatné rozšírenie</translation> +<translation id="8316618172731049784">Odoslať do zariadenia <ph name="DEVICE_NAME" /></translation> <translation id="8317671367883557781">Pridať sieťové pripojenie</translation> <translation id="8319414634934645341">Rozšírené použitie kľúča</translation> <translation id="8320459152843401447">Celá vaša obrazovka</translation> @@ -4936,6 +4967,7 @@ <translation id="8588866096426746242">Zobraziť štatistiky profilu</translation> <translation id="8588868914509452556"><ph name="WINDOW_TITLE" /> – VR sa prezentuje do náhlavnej súpravy</translation> <translation id="8590375307970699841">Nastaviť automatické aktualizácie</translation> +<translation id="8591783563402255548">1 sekunda</translation> <translation id="8592141010104017453">Nezobrazovať upozornenia</translation> <translation id="8593121833493516339">Odosielať údaje o využití a diagnostiky. Pomôžte zlepšiť prostredie Androidu svojho dieťaťa automatickým odosielaním diagnostík a údajov o používaní zariadenia a aplikácií do Googlu. Nebudú slúžiť na zistenie totožnosti vášho dieťaťa. Pomôžu zvýšiť stabilitu systému a aplikácií a poskytovať ďalšie vylepšenia. Niektoré súhrnné údaje tiež pomôžu aplikáciám Google a partnerom, ako napríklad vývojárom Androidu. Ak pre dieťa aktivujete dodatočnú aktivitu na internete a v aplikáciách, tieto údaje sa môžu uložiť do jeho účtu Google. <ph name="BEGIN_LINK1" />Ďalšie informácie<ph name="END_LINK1" /></translation> <translation id="8594908476761052472">Nasnímať video</translation> @@ -4965,6 +4997,7 @@ <translation id="8637688295594795546">K dispozícii je systémová aktualizácia. Pripravuje sa stiahnutie...</translation> <translation id="8639047128869322042">Vyhľadáva sa škodlivý softvér…</translation> <translation id="8642171459927087831">Prístupový token</translation> +<translation id="8642900771896232685">2 sekundy</translation> <translation id="8642947597466641025">Zväčšiť text</translation> <translation id="8643418457919840804">Ak chcete pokračovať, vyberte možnosť:</translation> <translation id="8644655801811752511">Tento bezpečnostný kľúč sa nedá resetovať. Skúste ho resetovať ihneď po vložení.</translation> @@ -5166,6 +5199,7 @@ <translation id="8910222113987937043">Záložky, história, heslá a ďalšie nastavenia sa už nebudú ďalej synchronizovať do vášho účtu Google. Vaše existujúce údaje však zostanú uložené v účte Google a môžete ich spravovať pomocou panela <ph name="BEGIN_LINK" />Google Dashboard<ph name="END_LINK" />.</translation> <translation id="8912362522468806198">účtu Google</translation> <translation id="8912793549644936705">Roztiahnuť</translation> +<translation id="8912810933860534797">Aktivovať automatické prehľadávanie</translation> <translation id="891365694296252935">Odosielať údaje o využití a diagnostiky. Toto zariadenie momentálne automaticky odosiela Googlu diagnostiky a údaje o používaní zariadenia a aplikácií. Nebudú slúžiť na zistenie totožnosti vášho dieťaťa. Pomôžu zvýšiť stabilitu systému a aplikácií a poskytovať ďalšie vylepšenia. Niektoré súhrnné údaje tiež pomôžu aplikáciám Google a partnerom, ako napríklad vývojárom Androidu. Používanie tohto nastavenia je presadzované vlastníkom. Ak pre dieťa aktivujete dodatočnú aktivitu na internete a v aplikáciách, tieto údaje sa môžu uložiť do jeho účtu Google. <ph name="BEGIN_LINK1" />Ďalšie informácie<ph name="END_LINK1" /></translation> <translation id="8915370057835397490">Načítavajú sa návrhy</translation> <translation id="8916476537757519021">Podrámec inkognito: <ph name="SUBFRAME_SITE" /></translation> @@ -5318,6 +5352,7 @@ <translation id="9153934054460603056">Uložiť identitu a heslo</translation> <translation id="9154194610265714752">Aktualizované</translation> <translation id="91568222606626347">Vytvoriť odkaz...</translation> +<translation id="9157096865782046368">0,8 sekundy</translation> <translation id="9157697743260533322">Nepodarilo sa nastaviť automatické aktualizácie pre všetkých používateľov (chyba pri spustení predbežnej kontroly: <ph name="ERROR_NUMBER" />)</translation> <translation id="9158715103698450907">Ojoj! Pri overení totožnosti sa vyskytla chyba sieťovej komunikácie. Skontrolujte pripojenie k sieti a skúste to znova.</translation> <translation id="916607977885256133">Obraz v obraze</translation>
diff --git a/chrome/app/resources/generated_resources_sl.xtb b/chrome/app/resources/generated_resources_sl.xtb index c897402..51137e2 100644 --- a/chrome/app/resources/generated_resources_sl.xtb +++ b/chrome/app/resources/generated_resources_sl.xtb
@@ -1,6 +1,7 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="sl"> +<translation id="1002469766576243227">Storitev preverjanja pristnosti gosti <ph name="EXTENSION_NAME" /></translation> <translation id="1003088604756913841">Odpiranje povezave v novem oknu aplikacije <ph name="APP" /></translation> <translation id="1004218526896219317">Dostop do spletnih mest</translation> <translation id="1005274289863221750">Uporabite mikrofon in kamero</translation> @@ -289,6 +290,7 @@ <translation id="1429300045468813835">Vse je izbrisano</translation> <translation id="143027896309062157">Branje in spreminjanje vseh vaših podatkov v računalniku in na spletnih mestih, ki jih obiščete</translation> <translation id="1430915738399379752">Natisni</translation> +<translation id="1431188203598586230">Zadnja posodobitev programske opreme</translation> <translation id="1432581352905426595">Upravljanje iskalnikov</translation> <translation id="1433811987160647649">Vprašaj pred dostopom</translation> <translation id="1434696352799406980">S tem bodo ponastavljeni začetna stran, nov zavihek s povezavami, iskalnik in pripeti zavihki. Prav tako bodo onemogočene vse razširitve in izbrisani bodo začasni podatki, kot so piškotki. Zaznamki, zgodovina in shranjena gesla ne bodo izbrisani.</translation> @@ -528,6 +530,7 @@ <translation id="1781771911845953849">Računi in sinhronizacija</translation> <translation id="1782196717298160133">Iskanje telefona</translation> <translation id="1784849162047402014">V napravi primanjkuje prostora na disku</translation> +<translation id="1790194216133135334">Pošiljanje povezave v napravo <ph name="DEVICE_NAME" /></translation> <translation id="1792619191750875668">Razširjen zaslon</translation> <translation id="1794791083288629568">Pošiljanje povratnih informacij zaradi odpravljanja te težave.</translation> <translation id="1795214765651529549">Uporabi klasično</translation> @@ -590,6 +593,7 @@ <translation id="1875312262568496299">Začni</translation> <translation id="1875387611427697908">To je mogoče dodati samo z mesta <ph name="CHROME_WEB_STORE" /></translation> <translation id="1877520246462554164">Ni bilo mogoče dobiti žetona za preverjanje pristnosti. Odjavite se, nato se ponovno prijavite in poskusite znova.</translation> +<translation id="1877860345998737529">Dodelitev dejanj stikalom</translation> <translation id="1879000426787380528">Prijava kot</translation> <translation id="1880905663253319515">Ali želite izbrisati potrdilo »<ph name="CERTIFICATE_NAME" />«?</translation> <translation id="1886996562706621347">Dovoli spletnim mestom, da zahtevajo, da postanejo privzete rutine za obravnavo protokolov (priporočeno)</translation> @@ -869,7 +873,9 @@ <translation id="230927227160767054">Ta stran želi namestiti rutino za obravnavo storitev.</translation> <translation id="2309620859903500144">Temu spletnemu mestu je onemogočen dostop do tipal gibanja ali svetlobe.</translation> <translation id="2315414688463285945">Napaka pri konfiguriranju datotek za Linux. Poskusite znova.</translation> +<translation id="2315587498123194634">Pošiljanje povezave v napravo <ph name="DEVICE_NAME" /></translation> <translation id="2316129865977710310">Ne, hvala</translation> +<translation id="2316739859433277603">Iskanja v zaganjalniku aplikacije uporabljajo <ph name="BEGIN_LINK" />nastavitev iskalnika<ph name="END_LINK" /> v brskalniku.</translation> <translation id="2317842250900878657">Dokončano: <ph name="PROGRESS_PERCENT" />%</translation> <translation id="2318143611928805047">Velikost papirja</translation> <translation id="2318817390901984578">Če želite uporabljati aplikacije za Android, napolnite in uporabite napravo <ph name="DEVICE_TYPE" />.</translation> @@ -909,6 +915,7 @@ <translation id="2365507699358342471">To spletno mesto si ne more ogledati besedila in slik, kopiranih v odložišče.</translation> <translation id="2367199180085172140">Dodajanje naprave za skupno rabo datotek</translation> <translation id="2367972762794486313">Pokaži aplikacije</translation> +<translation id="2369105924912929484">Preklop strnjene vsebine na strani</translation> <translation id="2371076942591664043">Odpri, ko je &dokončano</translation> <translation id="2375406435414127095">Povežite se s telefonom</translation> <translation id="2377667304966270281">Težke napake</translation> @@ -1159,6 +1166,7 @@ <translation id="2739191690716947896">Odpravljanje napak</translation> <translation id="2739240477418971307">Sprememba nastavitev funkcij za ljudi s posebnimi potrebami</translation> <translation id="2740393541869613458">pregled spletnih mest, ki jih je obiskal zaščiteni uporabnik, in</translation> +<translation id="2741912629735277980">Prikaz uporabniškega vmesnika na zaslonu za prijavo</translation> <translation id="274290345632688601">Obnavljanje aplikacij in datotek za Linux</translation> <translation id="2743387203779672305">Kopiraj v odložišče</translation> <translation id="2745080116229976798">Microsoftova kvalificirana podrejenost</translation> @@ -1275,6 +1283,7 @@ <translation id="2910318910161511225">Vzpostavite povezavo z omrežjem in poskusite znova</translation> <translation id="2913331724188855103">Dovoli spletnim mestom shranjevanje in branje podatkov piškotkov (priporočljivo)</translation> <translation id="2915102088417824677">Ogled dnevnika dejavnosti</translation> +<translation id="2915873080513663243">Samodejno iskanje</translation> <translation id="2916073183900451334">S pritiskom tabulatorke na spletni strani označite povezavo in tudi polja obrazcev</translation> <translation id="2916745397441987255">Iskanje razširitev</translation> <translation id="2921081876747860777">Ustvarite geslo za zaščito lokalnih podatkov.</translation> @@ -1483,6 +1492,7 @@ <translation id="327147043223061465">Ogled vseh piškotkov in podatkov spletnih mest</translation> <translation id="3271648667212143903"><ph name="ORIGIN" /> se želi povezati</translation> <translation id="3274763671541996799">Odprli ste način celotnega zaslona.</translation> +<translation id="3275778809241512831">Vaš notranji varnostni ključ trenutno ni varen. Odstranite ga iz storitev, s katerimi ga uporabljate. Ponastavite varnostni ključ, da težavo odpravite.</translation> <translation id="3275778913554317645">Odpri kot okno</translation> <translation id="3278001907972365362">V računih Google je potrebno ukrepanje</translation> <translation id="3279230909244266691">To lahko traja nekaj minut. Zagon navideznega računalnika.</translation> @@ -1575,6 +1585,7 @@ <translation id="3412265149091626468">Skoči na izbor</translation> <translation id="3413122095806433232">Izdajatelji overiteljev potrdil: <ph name="LOCATION" /></translation> <translation id="3414952576877147120">Velikost:</translation> +<translation id="3420501302812554910">Notranji varnostni ključ je treba ponastaviti</translation> <translation id="3421387094817716717">Javni ključ z eliptično krivuljo</translation> <translation id="3423463006624419153">V telefonu »<ph name="PHONE_NAME_1" />« in »<ph name="PHONE_NAME_2" />«:</translation> <translation id="3423858849633684918">Znova zaženite <ph name="PRODUCT_NAME" /></translation> @@ -1603,6 +1614,7 @@ <translation id="3450157232394774192">Odstotek zasedenosti stanja nedejavnosti</translation> <translation id="3453612417627951340">Potrebuje pooblastitev</translation> <translation id="3454157711543303649">Aktiviranje končano</translation> +<translation id="3454213325559396544">To je zadnja samodejna posodobitev programske opreme in varnostna posodobitev za to napravo <ph name="DEVICE_TYPE" />. Če želite v prihodnje prejemati posodobitve, nagradite na novejši model.</translation> <translation id="345693547134384690">Odpri &sliko v novem zavihku</translation> <translation id="3457500881955698515">Vaše podjetje ali organizacija zahteva takojšnjo posodobitev te naprave</translation> <translation id="3459509316159669723">Tiskanje</translation> @@ -1760,6 +1772,7 @@ <translation id="3672681487849735243">Zaznana je tovarniška napaka</translation> <translation id="367645871420407123">pustite prazno, če želite korensko geslo nastaviti na privzeto vrednost preskusne slike</translation> <translation id="3677657024345889897">Najtišje</translation> +<translation id="3677911431265050325">Zahtevaj spletno mesto za mobilno napravo</translation> <translation id="3678156199662914018">Razširitev: <ph name="EXTENSION_NAME" /></translation> <translation id="3681311097828166361">Hvala za povratne informacije. Trenutno nimate povezave, zato bo poročilo poslano pozneje.</translation> <translation id="3682824389861648626">Prag gibanja</translation> @@ -2144,6 +2157,12 @@ <translation id="4242577469625748426">Namestitev nastavitev pravilnika v napravi ni uspela: <ph name="VALIDATION_ERROR" />.</translation> <translation id="4244238649050961491">Iskanje več aplikacij za pisalo</translation> <translation id="424726838611654458">Vedno odpri v Adobe Readerju</translation> +<translation id="4247274662191902962">Podatki tipal bodo razkriti samo, ko boste sredi izkušnje VR. Spletno mesto morda lahko izve več o vas prek nekaterih podatkov, kot so: + – vaša lokacija, + – vaše fizične poteze, na primer položaj očes, + – vaše gibanje, na primer vaša hoja. + + Prepričajte se, da temu spletnemu mestu zaupate, preden mu odobrite dostop.</translation> <translation id="4247901771970415646">Ni mogoče sinhronizirati z uporabnikom <ph name="USERNAME" /></translation> <translation id="4249248555939881673">Čakanje na povezavo z omrežjem ...</translation> <translation id="4249373718504745892">Tej strani je onemogočen dostop do kamere in mikrofona.</translation> @@ -2206,6 +2225,7 @@ <translation id="4350019051035968019">Te naprave ni mogoče včlaniti v domeno vašega računa, ker je naprava označena za upravljanje v drugi domeni.</translation> <translation id="4354344420232759511">Spletna mesta, ki jih obiščete, bodo prikazana tu</translation> <translation id="435527878592612277">Izberite fotografijo</translation> +<translation id="4358313196493694334">Stabiliziranje mesta klika</translation> <translation id="4359408040881008151">Nameščeno zaradi odvisnih razširitev.</translation> <translation id="4359717112757026264">Urbana pokrajina</translation> <translation id="4361142739114356624">Zasebni ključ za to potrdilo odjemalca manjka ali je neveljaven</translation> @@ -2330,6 +2350,7 @@ <translation id="4558426062282641716">Zahtevano je dovoljenje za samodejni zagon</translation> <translation id="4558491878126948419">Prejemajte nasvete za <ph name="DEVICE_TYPE" />, novice o Googlovih izdelkih in pošiljajte povratne informacije. Odjavite se lahko kadar koli.</translation> <translation id="4559617833001311418">To spletno mesto dostopa do tipal gibanja ali svetlobe.</translation> +<translation id="4561098487691395071">Ali določite datoteko PPD tiskalnika</translation> <translation id="4562155214028662640">Dodaj prstni odtis</translation> <translation id="4563880231729913339">Prst 3</translation> <translation id="4565377596337484307">Skrij geslo</translation> @@ -2574,6 +2595,7 @@ <translation id="494286511941020793">Pomoč pri nastavitvi strežnika proxy</translation> <translation id="4943368462779413526">Žoga</translation> <translation id="4943691134276646401">»<ph name="CHROME_EXTENSION_NAME" />« se želi povezati z zaporednimi vrati</translation> +<translation id="4944310289250773232">Storitev preverjanja pristnosti gosti <ph name="SAML_DOMAIN" /></translation> <translation id="495170559598752135">Dejanja</translation> <translation id="4953689047182316270">Odzivanje na dogodke funkcij za ljudi s posebnimi potrebami</translation> <translation id="4953808748584563296">Privzeti oranžni avatar</translation> @@ -2666,6 +2688,7 @@ <translation id="5094721898978802975">Komuniciranje s sodelujočimi izvornimi aplikacijami</translation> <translation id="5097002363526479830">Povezava z omrežjem »<ph name="NAME" />« ni uspela: <ph name="DETAILS" /></translation> <translation id="5101042277149003567">Odpri vse zaznamke</translation> +<translation id="5101839224773798795">Samodejni klik, ko se kazalec ustavi</translation> <translation id="5108967062857032718">Nastavitve – odstranitev aplikacij za Android</translation> <translation id="5109044022078737958">Mia</translation> <translation id="5111646998522066203">Zapri način brez beleženja zgodovine</translation> @@ -3151,6 +3174,7 @@ <translation id="5852112051279473187">Ojoj, pri prijavljanju te naprave je prišlo do hude napake. Poskusite znova ali poiščite pomoč.</translation> <translation id="5852137567692933493">Ponovni zagon in izvedba funkcije Powerwash</translation> <translation id="5854912040170951372">Kos</translation> +<translation id="5855643921295613558">0,6 sekunde</translation> <translation id="5855773610748894548">Napaka varnega modula.</translation> <translation id="5856721540245522153">Omogočanje funkcij za odpravljanje napak</translation> <translation id="5857090052475505287">Nova mapa</translation> @@ -3440,6 +3464,7 @@ <translation id="6279183038361895380">Pritisnite |<ph name="ACCELERATOR" />| za prikaz kazalca</translation> <translation id="6280215091796946657">Prijava z drugim računom</translation> <translation id="6280912520669706465">ARC</translation> +<translation id="628352644014831790">4 sekunde</translation> <translation id="6285120108426285413">Datoteka <ph name="FILE_NAME" /> ni pogosto prenesena in je lahko nevarna.</translation> <translation id="6285120908535925801">{NUM_PRINTER,plural, =1{Nov tiskalnik v vašem omrežju}one{Novi tiskalniki v vašem omrežju}two{Novi tiskalniki v vašem omrežju}few{Novi tiskalniki v vašem omrežju}other{Novi tiskalniki v vašem omrežju}}</translation> <translation id="6286708577777130801">Podrobnosti shranjenih gesel</translation> @@ -3646,6 +3671,7 @@ <translation id="6612358246767739896">Zaščitena vsebina</translation> <translation id="6613452264606394692">Hitro se vrnite na to stran tako, da jo dodate med zaznamke</translation> <translation id="6615455863669487791">Pokaži mi</translation> +<translation id="6617100836880592260">Hitrost iskanja: <ph name="SPEED_WITH_UNITS" /></translation> <translation id="6618097958368085618">Vseeno obdrži</translation> <translation id="6619058681307408113">Line Printer Daemon (LPD)</translation> <translation id="661907246513853610">Spletno mesto lahko spremlja vašo lokacijo</translation> @@ -4460,6 +4486,7 @@ <translation id="7831491651892296503">Napaka pri konfiguriranju omrežja</translation> <translation id="7831754656372780761"><ph name="TAB_TITLE" /> <ph name="EMOJI_MUTING" /></translation> <translation id="7832084384634357321">Končni čas</translation> +<translation id="783214144752121388">Mestom prepreči izvajanje Flasha (priporočeno)</translation> <translation id="7833720883933317473">Shranjene besede po meri bodo prikazane tukaj</translation> <translation id="7835178595033117206">Zaznamek je bil odstranjen</translation> <translation id="7837776265184002579">Začetna stran je bila spremenjena v <ph name="URL" />.</translation> @@ -4515,6 +4542,7 @@ <translation id="7911118814695487383">Linux</translation> <translation id="7912080627461681647">Geslo je bilo spremenjeno v strežniku. Odjavite se in se nato znova prijavite.</translation> <translation id="7915471803647590281">Povejte nam, kaj se dogaja, preden nam pošljete povratne informacije.</translation> +<translation id="7919210519031517829"><ph name="DURATION" /> s</translation> <translation id="792514962475806987">Stopnja povečave zasidrane lupe:</translation> <translation id="7925247922861151263">Preverjanje AAA ni uspelo</translation> <translation id="7925285046818567682">Čakam <ph name="HOST_NAME" /> ...</translation> @@ -4572,6 +4600,7 @@ <translation id="7987814697832569482">Vedno poveži prek tega omrežja VPN</translation> <translation id="798835209536175951">Prejemanje in pošiljanje sporočil SMS s Chromebookom <ph name="LINK_BEGIN" />Več o tem<ph name="LINK_END" /></translation> <translation id="7988355189918024273">Omogoči funkcije za ljudi s posebnimi potrebami</translation> +<translation id="7991296728590311172">Nastavitve stikalnega dostopa</translation> <translation id="7994702968232966508">Način EAP</translation> <translation id="7997826902155442747">Prednost postopkov</translation> <translation id="7999229196265990314">Ustvarjene so bile te datoteke: @@ -4785,6 +4814,8 @@ <translation id="8308179586020895837">Vprašaj, ali <ph name="HOST" /> zahteva dostop do kamere</translation> <translation id="830868413617744215">Beta</translation> <translation id="8309458809024885768">Potrdilo že obstaja</translation> +<translation id="8314381333424235892">Manjkajoča ali nenameščena razširitev</translation> +<translation id="8316618172731049784">Pošlji v napravo <ph name="DEVICE_NAME" /></translation> <translation id="8317671367883557781">Dodaj omrežno povezavo</translation> <translation id="8319414634934645341">Razširjena raba ključa</translation> <translation id="8320459152843401447">Vaš celotni zaslon</translation> @@ -4941,6 +4972,7 @@ <translation id="8588866096426746242">Prikaži statistične podatke profila</translation> <translation id="8588868914509452556"><ph name="WINDOW_TITLE" /> – predvajanje VR v slušalkah z mikrofonom</translation> <translation id="8590375307970699841">Nastavitev samodejnih posodobitev</translation> +<translation id="8591783563402255548">1 sekunda</translation> <translation id="8592141010104017453">Ne prikazuj obvestil</translation> <translation id="8593121833493516339">Pošiljanje podatkov o uporabi in diagnostičnih podatkov. Pomagajte izboljšati otrokovo izkušnjo z Androidom s samodejnim pošiljanjem diagnostičnih podatkov ter podatkov o uporabi naprave in aplikacij Googlu. Teh podatkov ne bomo uporabljali, da bi prepoznali vašega otroka, temveč za izboljšanje stabilnosti sistema in izvajanja aplikacij ter drugega. Nekateri združeni podatki bodo pomagali tudi Googlovim aplikacijam in partnerjem, na primer razvijalcem za Android. Če ste za otroka vklopili dodatno beleženje dejavnosti v spletu in aplikacijah, bodo ti podatki morda shranjeni v njegovem računu za Google. <ph name="BEGIN_LINK1" />Več o tem<ph name="END_LINK1" /></translation> <translation id="8594908476761052472">Snemanje videa</translation> @@ -4970,6 +5002,7 @@ <translation id="8637688295594795546">Na voljo je sistemska posodobitev. Priprava za prenos ...</translation> <translation id="8639047128869322042">Iskanje škodljive programske opreme ...</translation> <translation id="8642171459927087831">Žeton za dostop</translation> +<translation id="8642900771896232685">2 sekundi</translation> <translation id="8642947597466641025">Povečaj besedilo</translation> <translation id="8643418457919840804">Če želite nadaljevati, izberite možnost:</translation> <translation id="8644655801811752511">Tega varnostnega ključa ni mogoče ponastaviti. Poskusite ga ponastaviti takoj, ko ga vstavite.</translation> @@ -5171,6 +5204,7 @@ <translation id="8910222113987937043">Spremembe zaznamkov, zgodovine, gesel in drugih nastavitev se ne bodo več sinhronizirale z Google Računom. Vaši obstoječi podatki bodo kljub temu še naprej shranjeni v Google Računu in jih bo mogoče upravljati na <ph name="BEGIN_LINK" />Google Nadzorni plošči<ph name="END_LINK" />.</translation> <translation id="8912362522468806198">Google Račun</translation> <translation id="8912793549644936705">Raztegni</translation> +<translation id="8912810933860534797">Omogočanje samodejnega iskanja</translation> <translation id="891365694296252935">Pošiljanje podatkov o uporabi in diagnostičnih podatkov. Ta naprava trenutno Googlu samodejno pošilja diagnostične podatke ter podatke o uporabi naprave in aplikacij. Teh podatkov ne bomo uporabljali, da bi prepoznali vašega otroka, temveč za izboljšanje stabilnosti sistema in izvajanja aplikacij ter drugega. Nekateri združeni podatki bodo pomagali tudi Googlovim aplikacijam in partnerjem, na primer razvijalcem za Android. To nastavitev je uveljavil lastnik naprave. Če ste za otroka vklopili dodatno beleženje dejavnosti v spletu in aplikacijah, bodo ti podatki morda shranjeni v njegovem računu za Google. <ph name="BEGIN_LINK1" />Več o tem<ph name="END_LINK1" /></translation> <translation id="8915370057835397490">Nalaganje predloga</translation> <translation id="8916476537757519021">Podokvir za način brez beleženja zgodovine: <ph name="SUBFRAME_SITE" /></translation> @@ -5323,6 +5357,7 @@ <translation id="9153934054460603056">Shrani identiteto in geslo</translation> <translation id="9154194610265714752">Posodobljeno</translation> <translation id="91568222606626347">Ustvari bližnjico ...</translation> +<translation id="9157096865782046368">0,8 sekunde</translation> <translation id="9157697743260533322">Nastavitev samodejnih posodobitev za vse uporabnike ni uspela (napaka preverjanj pred zagonom: <ph name="ERROR_NUMBER" />)</translation> <translation id="9158715103698450907">Ojej! Težava z omrežno komunikacijo med preverjanjem pristnosti. Preverite omrežno povezavo in poskusite znova.</translation> <translation id="916607977885256133">Slika v sliki</translation>
diff --git a/chrome/app/resources/generated_resources_sr.xtb b/chrome/app/resources/generated_resources_sr.xtb index 9a58706c..d538da1e 100644 --- a/chrome/app/resources/generated_resources_sr.xtb +++ b/chrome/app/resources/generated_resources_sr.xtb
@@ -1,6 +1,7 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="sr"> +<translation id="1002469766576243227">Ову услугу потврде идентитета хостује <ph name="EXTENSION_NAME" /></translation> <translation id="1003088604756913841">Отвори линк у новом <ph name="APP" /> прозору</translation> <translation id="1004218526896219317">Приступ сајту</translation> <translation id="1005274289863221750">Коришћење микрофона и камере</translation> @@ -289,6 +290,7 @@ <translation id="1429300045468813835">Све је обрисано</translation> <translation id="143027896309062157">Читање и мењање свих ваших података на рачунару и на веб-сајтовима које посећујете</translation> <translation id="1430915738399379752">Штампај</translation> +<translation id="1431188203598586230">Последње ажурирање софтвера</translation> <translation id="1432581352905426595">Управљај претраживачима</translation> <translation id="1433811987160647649">Питај пре приступа</translation> <translation id="1434696352799406980">Ово ће ресетовати почетну страницу, страницу нове картице, претраживач и закачене картице. Такође ће онемогућити све додатке и обрисати привремене податке попут колачића. Обележивачи, историја и сачуване лозинке неће бити обрисани.</translation> @@ -525,6 +527,7 @@ <translation id="1781771911845953849">Налози и синхронизација</translation> <translation id="1782196717298160133">Тражимо телефон</translation> <translation id="1784849162047402014">Уређају понестаје простора на диску</translation> +<translation id="1790194216133135334">Пошаљи везу на уређај <ph name="DEVICE_NAME" /></translation> <translation id="1792619191750875668">Проширени приказ</translation> <translation id="1794791083288629568">Шаљи повратне информације као помоћ за решавање овог проблема.</translation> <translation id="1795214765651529549">Користи класичну</translation> @@ -587,6 +590,7 @@ <translation id="1875312262568496299">Започни</translation> <translation id="1875387611427697908">Ово може да се дода само из услуге <ph name="CHROME_WEB_STORE" /></translation> <translation id="1877520246462554164">Преузимање токена за потврду идентитета није успело. Одјавите се, па се поново пријавите да бисте пробали поново.</translation> +<translation id="1877860345998737529">Додељивање радњи прекидачима</translation> <translation id="1879000426787380528">Пријавите се као</translation> <translation id="1880905663253319515">Желите да избришете сертификат „<ph name="CERTIFICATE_NAME" />“?</translation> <translation id="1886996562706621347">Дозволи сајтовима да захтевају да постану подразумевани обрађивачи за протоколе (препоручено)</translation> @@ -866,7 +870,9 @@ <translation id="230927227160767054">Ова страница жели да инсталира обрађивача услуге.</translation> <translation id="2309620859903500144">Овом сајту је забрањен приступ сензорима за покрет или светло.</translation> <translation id="2315414688463285945">Грешка при конфигурисању Linux датотека. Пробајте поново.</translation> +<translation id="2315587498123194634">Пошаљи везу на уређај <ph name="DEVICE_NAME" /></translation> <translation id="2316129865977710310">Не, хвала</translation> +<translation id="2316739859433277603">Претраге помоћу покретача апликација користе <ph name="BEGIN_LINK" />подешавање претраживача<ph name="END_LINK" /> вашег прегледача.</translation> <translation id="2317842250900878657"><ph name="PROGRESS_PERCENT" />% је готово</translation> <translation id="2318143611928805047">Величина папира</translation> <translation id="2318817390901984578">Да бисте користили Android апликације, напуните и ажурирајте <ph name="DEVICE_TYPE" />.</translation> @@ -906,6 +912,7 @@ <translation id="2365507699358342471">Овај сајт може да види текст и слике који су копирани у привремену меморију.</translation> <translation id="2367199180085172140">Додајте дељење датотека</translation> <translation id="2367972762794486313">Прикажите апликације</translation> +<translation id="2369105924912929484">Укључи/искључи дестиловани садржај странице</translation> <translation id="2371076942591664043">Отвори кад буде &довршено</translation> <translation id="2375406435414127095">Повежите се са телефоном</translation> <translation id="2377667304966270281">Грешке у вези са хард-диском</translation> @@ -1155,6 +1162,7 @@ <translation id="2739191690716947896">Отклони грешке</translation> <translation id="2739240477418971307">Мењање подешавања приступачности</translation> <translation id="2740393541869613458">да прегледате веб-сајтове које је корисник под надзором посетио и</translation> +<translation id="2741912629735277980">Прикажи кориснички интерфејс на екрану за пријављивање</translation> <translation id="274290345632688601">Враћање Linux апликација и датотека</translation> <translation id="2743387203779672305">Копирај у меморију</translation> <translation id="2745080116229976798">Microsoft квалификовано подређивање</translation> @@ -1271,6 +1279,7 @@ <translation id="2910318910161511225">Повежите се на мрежу и пробајте поново</translation> <translation id="2913331724188855103">Дозволи сајтовима да чувају и читају податке колачића (препоручује се)</translation> <translation id="2915102088417824677">Прикажи евиденцију активности</translation> +<translation id="2915873080513663243">Аутоматско прелажење садржаја</translation> <translation id="2916073183900451334">Притиском на Tab на веб страници биће истакнуте везе, као и поља у обрасцу</translation> <translation id="2916745397441987255">Претражите додатке</translation> <translation id="2921081876747860777">Направите лозинку да бисте заштитили локалне податке.</translation> @@ -1479,6 +1488,7 @@ <translation id="327147043223061465">Прегледајте све колачиће и податке о сајтовима</translation> <translation id="3271648667212143903"><ph name="ORIGIN" /> жели да се повеже</translation> <translation id="3274763671541996799">Прешли сте на режим целог екрана.</translation> +<translation id="3275778809241512831">Интерни безбедносни кључ тренутно није безбедан. Уклоните га из свих услуга у којима сте га користили. Ресетујте безбедносни кључ да бисте решили проблем.</translation> <translation id="3275778913554317645">Отвори као прозор</translation> <translation id="3278001907972365362">Треба да проверите Google налоге</translation> <translation id="3279230909244266691">Ово може да потраје неколико минута. Покреће се виртуелна машина.</translation> @@ -1571,6 +1581,7 @@ <translation id="3412265149091626468">Пређи на избор</translation> <translation id="3413122095806433232">CA издаваоци: <ph name="LOCATION" /></translation> <translation id="3414952576877147120">Величина:</translation> +<translation id="3420501302812554910">Интерни безбедносни кључ захтева ресетовање</translation> <translation id="3421387094817716717">Јавни кључ елиптичне криве</translation> <translation id="3423463006624419153">На телефонима „<ph name="PHONE_NAME_1" />“ и „<ph name="PHONE_NAME_2" />“:</translation> <translation id="3423858849633684918">Рестартујте <ph name="PRODUCT_NAME" /></translation> @@ -1599,6 +1610,7 @@ <translation id="3450157232394774192">Проценат заузетости стања мировања</translation> <translation id="3453612417627951340">Потребно је овлашћење</translation> <translation id="3454157711543303649">Активација је довршена</translation> +<translation id="3454213325559396544">Ово је последње аутоматско безбедносно ажурирање и ажурирање софтвера за <ph name="DEVICE_TYPE" />. Надоградите на новији модел да бисте добијали будућа ажурирања.</translation> <translation id="345693547134384690">Отвори &слику на новој картици</translation> <translation id="3457500881955698515">Ваше предузеће или организација захтева ажурирање за овај уређај одмах</translation> <translation id="3459509316159669723">Штампање</translation> @@ -1756,6 +1768,7 @@ <translation id="3672681487849735243">Откривена је фабричка грешка</translation> <translation id="367645871420407123">оставите празно ако желите да подесите основну лозинку на подразумевану вредност слике за тестирање</translation> <translation id="3677657024345889897">Најтише</translation> +<translation id="3677911431265050325">Захтевај мобилни сајт</translation> <translation id="3678156199662914018">Додатак: <ph name="EXTENSION_NAME" /></translation> <translation id="3681311097828166361">Хвала вам на повратним информацијама. Тренутно сте офлајн и касније ћемо вам послати извештај.</translation> <translation id="3682824389861648626">Ограничење кретања</translation> @@ -2140,6 +2153,12 @@ <translation id="4242577469625748426">Није успело инсталирање подешавања смерница на уређају: <ph name="VALIDATION_ERROR" />.</translation> <translation id="4244238649050961491">Пронађи још апликација за писаљку</translation> <translation id="424726838611654458">Увек отвори у Adobe Reader-у</translation> +<translation id="4247274662191902962">Подаци сензора се деле само током овог ВР доживљаја. Сајт ће можда моћи да учи о вама помоћу одређених података, као што су: + - локација + - физичке карактеристике, попут положаја очију + - покрети, попут начина хода + + Уверите се да верујете овом сајту пре него што дозволите приступ.</translation> <translation id="4247901771970415646">Није успела синхронизација за <ph name="USERNAME" /></translation> <translation id="4249248555939881673">Чека се мрежна веза...</translation> <translation id="4249373718504745892">Овој страници је забрањен приступ камери и микрофону.</translation> @@ -2202,6 +2221,7 @@ <translation id="4350019051035968019">Овај уређај не може да се региструје на домену коме припада ваш налог јер је означен као уређај којим управља други домен.</translation> <translation id="4354344420232759511">Овде се приказују сајтови које сте посетили</translation> <translation id="435527878592612277">Изаберите слику</translation> +<translation id="4358313196493694334">Стабилизуј локацију клика</translation> <translation id="4359408040881008151">Инсталиран је због зависних додатака.</translation> <translation id="4359717112757026264">Градски пејзажи</translation> <translation id="4361142739114356624">Приватни кључ за овај сертификат клијента недостаје или је неважећи</translation> @@ -2326,6 +2346,7 @@ <translation id="4558426062282641716">Тражи се дозвола за аутоматско покретање</translation> <translation id="4558491878126948419">Преузмите <ph name="DEVICE_TYPE" /> савете и ажурирања о Google производима и делите повратне информације. Опозовите пријаву било када.</translation> <translation id="4559617833001311418">Овај сајт приступа сензорима за покрет или светло.</translation> +<translation id="4561098487691395071">Или наведите PPD штампача</translation> <translation id="4562155214028662640">Додај дигитални отисак</translation> <translation id="4563880231729913339">Прст 3</translation> <translation id="4565377596337484307">Сакриј лозинку</translation> @@ -2570,6 +2591,7 @@ <translation id="494286511941020793">Помоћ за конфигурацију проксија</translation> <translation id="4943368462779413526">Фудбалска лопта</translation> <translation id="4943691134276646401">„<ph name="CHROME_EXTENSION_NAME" />“ жели да се повеже са серијским портом</translation> +<translation id="4944310289250773232">Ову услугу потврде идентитета хостује <ph name="SAML_DOMAIN" /></translation> <translation id="495170559598752135">Радње</translation> <translation id="4953689047182316270">одговара на догађаје приступачности</translation> <translation id="4953808748584563296">Подразумевани наранџасти аватар</translation> @@ -2662,6 +2684,7 @@ <translation id="5094721898978802975">Комуникација са основним апликацијама за сарадњу</translation> <translation id="5097002363526479830">Повезивање са мрежом „<ph name="NAME" />“ није успело: <ph name="DETAILS" /></translation> <translation id="5101042277149003567">Отвори све обележиваче</translation> +<translation id="5101839224773798795">Аутоматски кликни када се курсор заустави</translation> <translation id="5108967062857032718">Подешавања – Уклони Android апликације</translation> <translation id="5109044022078737958">Мија</translation> <translation id="5111646998522066203">Затвори режим без архивирања</translation> @@ -3147,6 +3170,7 @@ <translation id="5852112051279473187">Упс! Дошло је до озбиљног проблема док смо пријављивали овај уређај. Пробајте поново или контактирајте представника подршке.</translation> <translation id="5852137567692933493">Рестартуј и обави Powerwash</translation> <translation id="5854912040170951372">Парче</translation> +<translation id="5855643921295613558">0,6 секунди</translation> <translation id="5855773610748894548">Упс, грешка са безбедносним модулом.</translation> <translation id="5856721540245522153">Омогућавање функција за отклањање грешака</translation> <translation id="5857090052475505287">Нови директоријум</translation> @@ -3436,6 +3460,7 @@ <translation id="6279183038361895380">Притисните |<ph name="ACCELERATOR" />| да бисте приказали показивач</translation> <translation id="6280215091796946657">Пријави ме на други налог</translation> <translation id="6280912520669706465">ARC</translation> +<translation id="628352644014831790">4 секунде</translation> <translation id="6285120108426285413">Датотека <ph name="FILE_NAME" /> се обично не преузима и може да буде опасна.</translation> <translation id="6285120908535925801">{NUM_PRINTER,plural, =1{Нов штампач на мрежи}one{Нови штампачи на мрежи}few{Нови штампачи на мрежи}other{Нови штампачи на мрежи}}</translation> <translation id="6286708577777130801">Детаљи сачуваних лозинки</translation> @@ -3642,6 +3667,7 @@ <translation id="6612358246767739896">Заштићени садржај</translation> <translation id="6613452264606394692">Можете брзо да се вратите овде ако обележите ову страницу</translation> <translation id="6615455863669487791">Покажи ми</translation> +<translation id="6617100836880592260">Брзина прелажења садржаја: <ph name="SPEED_WITH_UNITS" /></translation> <translation id="6618097958368085618">Ипак задржи</translation> <translation id="6619058681307408113">Line Printer Daemon (LPD)</translation> <translation id="661907246513853610">Сајт може да прати локацију</translation> @@ -4456,6 +4482,7 @@ <translation id="7831491651892296503">Грешка при конфигурацији мреже</translation> <translation id="7831754656372780761"><ph name="TAB_TITLE" /> <ph name="EMOJI_MUTING" /></translation> <translation id="7832084384634357321">Време завршетка</translation> +<translation id="783214144752121388">Не дозвољавај сајтовима да покрећу Flash (препоручено)</translation> <translation id="7833720883933317473">Сачуване прилагођене речи ће се појавити овде</translation> <translation id="7835178595033117206">Обележивач је уклоњен</translation> <translation id="7837776265184002579">Почетна страница је промењена у <ph name="URL" />.</translation> @@ -4511,6 +4538,7 @@ <translation id="7911118814695487383">Linux</translation> <translation id="7912080627461681647">Лозинка је промењена на серверу. Одјавите се, па се поново пријавите.</translation> <translation id="7915471803647590281">Реците нам шта се дешава пре него што пошаљете повратне информације.</translation> +<translation id="7919210519031517829"><ph name="DURATION" /> сек</translation> <translation id="792514962475806987">Ниво зумирања монтиране лупе екрана:</translation> <translation id="7925247922861151263">Провера потврде идентитета, овлашћења и приступа није успела</translation> <translation id="7925285046818567682">Чека се <ph name="HOST_NAME" />...</translation> @@ -4568,6 +4596,7 @@ <translation id="7987814697832569482">Увек се повезуј преко овог VPN-а</translation> <translation id="798835209536175951">Шаљите и примајте SMS-ове помоћу Chromebook-а. <ph name="LINK_BEGIN" />Сазнајте више<ph name="LINK_END" /></translation> <translation id="7988355189918024273">Омогући функције приступачности</translation> +<translation id="7991296728590311172">Подешавања приступа помоћу прекидача</translation> <translation id="7994702968232966508">EAP метод</translation> <translation id="7997826902155442747">Приоритет процеса</translation> <translation id="7999229196265990314">Направљене су следеће датотеке: @@ -4781,6 +4810,8 @@ <translation id="8308179586020895837">Питај ме ако <ph name="HOST" /> жели да приступи камери</translation> <translation id="830868413617744215">Beta</translation> <translation id="8309458809024885768">Сертификат већ постоји</translation> +<translation id="8314381333424235892">Додатак недостаје или је деинсталиран</translation> +<translation id="8316618172731049784">Пошаљи на <ph name="DEVICE_NAME" /></translation> <translation id="8317671367883557781">Додај мрежну везу</translation> <translation id="8319414634934645341">Употреба проширеног кључа</translation> <translation id="8320459152843401447">Цео екран</translation> @@ -4937,6 +4968,7 @@ <translation id="8588866096426746242">Прикажи статистику профила</translation> <translation id="8588868914509452556"><ph name="WINDOW_TITLE" /> – ВР се приказује преко хедсета</translation> <translation id="8590375307970699841">Подеси аутоматска ажурирања</translation> +<translation id="8591783563402255548">1 секунда</translation> <translation id="8592141010104017453">Не приказуј никаква обавештења</translation> <translation id="8593121833493516339">Шаљите податке о коришћењу и дијагностичке податке. Помозите нам да побољшамо Android доживљај за дете тако што ћете аутоматски слати Google-у податке о дијагностици и коришћењу уређаја и апликација. Те информације се неће користити за идентификацију детета и помоћи ће у одржавању стабилности система и апликације и другим подешавањима. Неки обједињени подаци ће такође помоћи Google апликацијама и партнерима, попут Android програмера. Ако за дете укључите додатне активности на вебу и у апликацијама, ти подаци ће се можда чувати на Google налогу детета. <ph name="BEGIN_LINK1" />Сазнајте више<ph name="END_LINK1" /></translation> <translation id="8594908476761052472">Сними видео</translation> @@ -4966,6 +4998,7 @@ <translation id="8637688295594795546">Доступно је ажурирање система. Припрема за преузимање...</translation> <translation id="8639047128869322042">Тражи се штетни софтвер…</translation> <translation id="8642171459927087831">Ознака приступа</translation> +<translation id="8642900771896232685">2 секунде</translation> <translation id="8642947597466641025">Увећај текст</translation> <translation id="8643418457919840804">Да бисте наставили, изаберите неку опцију:</translation> <translation id="8644655801811752511">Ресетовање овог безбедносног кључа није успело. Ресетујте кључ чим га уметнете.</translation> @@ -5167,6 +5200,7 @@ <translation id="8910222113987937043">Промене обележивача, историје, лозинки и других подешавања се више неће синхронизовати са Google налогом. Међутим, постојећи подаци ће се и даље чувати на Google налогу и можете да управљате њима на <ph name="BEGIN_LINK" />Google контролној табли<ph name="END_LINK" />.</translation> <translation id="8912362522468806198">Google налога</translation> <translation id="8912793549644936705">Растегни</translation> +<translation id="8912810933860534797">Омогући аутоматско скенирање</translation> <translation id="891365694296252935">Шаљите податке о коришћењу и дијагностичке податке. Овај уређај тренутно аутоматски шаље податке о дијагностици, уређају и коришћењу апликација Google-у. Те информације се неће користити за идентификацију детета и помоћи ће у одржавању стабилности система и апликације и другим подешавањима. Неки обједињени подаци ће такође помоћи Google апликацијама и партнерима, попут Android програмера. То подешавање примењује власник. Ако за дете укључите додатне активности на вебу и у апликацијама, ти подаци ће се можда чувати на Google налогу детета. <ph name="BEGIN_LINK1" />Сазнајте више<ph name="END_LINK1" /></translation> <translation id="8915370057835397490">Учитавање предлога</translation> <translation id="8916476537757519021">Подоквир Без архивирања: <ph name="SUBFRAME_SITE" /></translation> @@ -5319,6 +5353,7 @@ <translation id="9153934054460603056">Сачувај идентитет и лозинку</translation> <translation id="9154194610265714752">Ажурирано</translation> <translation id="91568222606626347">Направи пречицу...</translation> +<translation id="9157096865782046368">0,8 секунди</translation> <translation id="9157697743260533322">Подешавање аутоматских ажурирања за све кориснике није успело (грешка покретања при провери: <ph name="ERROR_NUMBER" />)</translation> <translation id="9158715103698450907">Упс! Дошло је до проблема са комуникацијом на мрежи током потврде аутентичности. Проверите мрежну везу и покушајте поново.</translation> <translation id="916607977885256133">Слика у слици</translation>
diff --git a/chrome/app/resources/generated_resources_sv.xtb b/chrome/app/resources/generated_resources_sv.xtb index fda74de..ea4f9e65 100644 --- a/chrome/app/resources/generated_resources_sv.xtb +++ b/chrome/app/resources/generated_resources_sv.xtb
@@ -2143,6 +2143,12 @@ <translation id="4242577469625748426">Det gick inte att installera policyinställningar på enheten: <ph name="VALIDATION_ERROR" />.</translation> <translation id="4244238649050961491">Hitta fler appar för e-penna</translation> <translation id="424726838611654458">Öppna alltid i Adobe Reader</translation> +<translation id="4247274662191902962">Sensordata delas bara så länge VR-upplevelsen pågår. Webbplatsen kan ta reda på mer om dig utifrån vissa uppgifter, till exempel: + – din plats + – dina fysiska egenskaper, som ögonens placering + – dina rörelser, som hur du går. + + Tänk efter om du litar på webbplatsen innan du ger den åtkomst.</translation> <translation id="4247901771970415646">Det gick inte att synkronisera med <ph name="USERNAME" /></translation> <translation id="4249248555939881673">Väntar på nätverksanslutning ...</translation> <translation id="4249373718504745892">Den här sidan har blockerats och kan inte komma åt kameran och mikrofonen.</translation>
diff --git a/chrome/app/resources/generated_resources_sw.xtb b/chrome/app/resources/generated_resources_sw.xtb index 199ee65..154000e 100644 --- a/chrome/app/resources/generated_resources_sw.xtb +++ b/chrome/app/resources/generated_resources_sw.xtb
@@ -1,6 +1,7 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="sw"> +<translation id="1002469766576243227">Huduma hii ya uthibitishaji imepangishwa na <ph name="EXTENSION_NAME" /></translation> <translation id="1003088604756913841">Fungua Kiungo katika Dirisha jipya la <ph name="APP" /></translation> <translation id="1004218526896219317">Ufikiaji wa tovuti</translation> <translation id="1005274289863221750">Tumia kipazasauti na kamera yako</translation> @@ -289,6 +290,7 @@ <translation id="1429300045468813835">Imefuta yote</translation> <translation id="143027896309062157">Kusoma na kubadilisha data yako yote kwenye kompyuta yako na tovuti unazozitembelea</translation> <translation id="1430915738399379752">Chapisha</translation> +<translation id="1431188203598586230">Sasisho la mwisho la programu</translation> <translation id="1432581352905426595">Dhibiti mitambo ya kutafuta</translation> <translation id="1433811987160647649">Uliza idhini kabla ya kufikia</translation> <translation id="1434696352799406980">Hatua hii itaweka upya ukurasa wako unaoanza, ukurasa wa kichupo kipya, mtambo wa kutafuta na vichupo vilivyobandikwa. Pia itazima viendelezi na kufuta data ya muda kama vile vidakuzi. Alamisho, historia na manenosiri yako yaliyohifadhiwa hayatafutwa.</translation> @@ -525,6 +527,7 @@ <translation id="1781771911845953849">Akaunti na usawazishaji</translation> <translation id="1782196717298160133">Inatafuta simu yako</translation> <translation id="1784849162047402014">Kifaa hakina nafasi ya hifadhi ya kutosha</translation> +<translation id="1790194216133135334">Tuma kiungo kwa <ph name="DEVICE_NAME" /></translation> <translation id="1792619191750875668">Mwonekano mpana</translation> <translation id="1794791083288629568">Tuma maoni ili utusaidie kutatua tatizo hili.</translation> <translation id="1795214765651529549">Tumia ya Kawaida</translation> @@ -587,6 +590,7 @@ <translation id="1875312262568496299">Anza</translation> <translation id="1875387611427697908">Hii inaweza tu kuongezwa kutoka <ph name="CHROME_WEB_STORE" />.</translation> <translation id="1877520246462554164">Imeshindwa kupata tokeni ya uthibitishaji. Tafadhali ondoka na uingie katika akaunti ili ujaribu tena.</translation> +<translation id="1877860345998737529">Badili ukabidhi wa shughuli</translation> <translation id="1879000426787380528">Ingia ukitumia</translation> <translation id="1880905663253319515">Futa cheti "<ph name="CERTIFICATE_NAME" />"?</translation> <translation id="1886996562706621347">Ruhusu tovuti kutuma ombi la kuwa vishikizi chaguomsingi vya itifaki (inapendekezwa)</translation> @@ -866,7 +870,9 @@ <translation id="230927227160767054">Ukarasa huu anataka kusakinisha kishikizi cha huduma.</translation> <translation id="2309620859903500144">Tovuti hii imezuiliwa ili isifikie vitambuzi vya mwangaza au mwendo.</translation> <translation id="2315414688463285945">Hitilafu imetokea wakati wa kuweka mipangilio ya faili za Linux. Tafadhali jaribu tena.</translation> +<translation id="2315587498123194634">Tuma Kiungo kwa <ph name="DEVICE_NAME" /></translation> <translation id="2316129865977710310">Hapana, asante</translation> +<translation id="2316739859433277603">Utafutaji kutoka kifungua programu hutumia <ph name="BEGIN_LINK" />mipangilio ya mtambo wa kutafuta<ph name="END_LINK" /> katika kivinjari chako.</translation> <translation id="2317842250900878657"><ph name="PROGRESS_PERCENT" />% imekamilika</translation> <translation id="2318143611928805047">Ukubwa wa karatasi</translation> <translation id="2318817390901984578">Ili utumie programu za Android, chaji na usasishe kifaa chako cha <ph name="DEVICE_TYPE" />.</translation> @@ -906,6 +912,7 @@ <translation id="2365507699358342471">Tovuti hii inaweza kuona maandishi na picha zilizonakiliwa kwenye ubao wa kunakili.</translation> <translation id="2367199180085172140">Ongeza Faili Utakayoshiriki</translation> <translation id="2367972762794486313">Onyesha programu</translation> +<translation id="2369105924912929484">Washa maudhui ya kurasa zilizo</translation> <translation id="2371076942591664043">Fungua baada ya &kumaliza</translation> <translation id="2375406435414127095">Unganisha kwenye simu yako</translation> <translation id="2377667304966270281">Mabadilko ya Hifadhi</translation> @@ -1155,6 +1162,7 @@ <translation id="2739191690716947896">Tatua</translation> <translation id="2739240477418971307">Badilisha mipangilio yako ya ufikiaji</translation> <translation id="2740393541869613458">kagua tovuti ambazo mtumiaji anayesimamiwa ametembelea, na</translation> +<translation id="2741912629735277980">Onyesha kiolesura kwenye skrini ya kuingia katika akaunti</translation> <translation id="274290345632688601">Inarejesha programu na faili za Linux</translation> <translation id="2743387203779672305">Nakili kwenye ubao wa kunakili</translation> <translation id="2745080116229976798">Microsoft Qualified Subordination</translation> @@ -1271,6 +1279,7 @@ <translation id="2910318910161511225">Unganisha kwenye mtandao na ujaribu tena</translation> <translation id="2913331724188855103">Ruhusu tovuti zihifadhi na kusoma data ya vidakuzi (imependekezwa)</translation> <translation id="2915102088417824677">Angalia Kumbukumbu ya shughuli</translation> +<translation id="2915873080513663243">Kukagua kiotomatiki</translation> <translation id="2916073183900451334">Kichupo cha Kubonyeza kwenye ukurasa wavuti kinaangazia viungo, pamoja na nyuga za fomu</translation> <translation id="2916745397441987255">Tafuta katika viendelezi</translation> <translation id="2921081876747860777">Tafadhali unda nenosiri la kulinda data yako kwenye kifaa.</translation> @@ -1479,6 +1488,7 @@ <translation id="327147043223061465">Angalia data yote ya vidakuzi na tovuti</translation> <translation id="3271648667212143903"><ph name="ORIGIN" /> inataka kuunganisha</translation> <translation id="3274763671541996799">Umeamua kutumia skrini nzima.</translation> +<translation id="3275778809241512831">Kwa sasa, ufunguo wako wa usalama si salama. Tafadhali uondoe kwenye huduma yoyote ambako uliitumia. Ili utatue tatizo hili, tafadhali badilisha ufunguo wako wa usalama.</translation> <translation id="3275778913554317645">Fungua kama dirisha</translation> <translation id="3278001907972365362">Unahitaji kukagua Akaunti zako za Google</translation> <translation id="3279230909244266691">Huenda mchakato ukachukua dakika kadhaa. Inaanzisha kompyuta iliyo mbali.</translation> @@ -1568,6 +1578,7 @@ <translation id="3412265149091626468">Ruka hadi Iliyochaguliwa</translation> <translation id="3413122095806433232">Watoaji Vyeti wa Kati:<ph name="LOCATION" /></translation> <translation id="3414952576877147120">Ukubwa:</translation> +<translation id="3420501302812554910">Unatakiwa kubadilisha ufunguo wa usalama wa ndani</translation> <translation id="3421387094817716717">Ufunguo wa Umma wa Kizingo cha Mviringo</translation> <translation id="3423463006624419153">Kwenye '<ph name="PHONE_NAME_1" />' na '<ph name="PHONE_NAME_2" />' yako:</translation> <translation id="3423858849633684918">Tafadhali Zindua upya <ph name="PRODUCT_NAME" /></translation> @@ -1596,6 +1607,7 @@ <translation id="3450157232394774192">Asilimia ya Ukaaji wa Hali ya Kutofanya Kitu</translation> <translation id="3453612417627951340">Inahitaji kuidhinishwa</translation> <translation id="3454157711543303649">Uamilishaji umekamilika</translation> +<translation id="3454213325559396544">Hili ndilo sasisho la mwisho la kiotomatiki la programu na usalama wa <ph name="DEVICE_TYPE" />. Ili upate masasisho katika siku zijazo, tumia muundo mpya zaidi.</translation> <translation id="345693547134384690">Fungua p&icha katika kichupo kipya</translation> <translation id="3457500881955698515">Kampuni au shirika lako linataka usasishe kifaa hiki mara moja.</translation> <translation id="3459509316159669723">Kuchapisha</translation> @@ -1753,6 +1765,7 @@ <translation id="3672681487849735243">Hitilafu ya kiwanda imegunduliwa</translation> <translation id="367645871420407123">acha tupu ukitaka kuweka nenosiri msingi kwenye thamani ya picha ya jaribio la chaguomsingi</translation> <translation id="3677657024345889897">Sauti ya chini kabisa</translation> +<translation id="3677911431265050325">Omba tovuti ya kifaa cha mkononi</translation> <translation id="3678156199662914018">Kiendelezi: <ph name="EXTENSION_NAME" /></translation> <translation id="3681311097828166361">Asante sana kwa maoni yako. Sasa uko nje ya mtandao, na ripoti yako itatumwa baadaye.</translation> <translation id="3682824389861648626">Kiasi cha usogezaji</translation> @@ -2135,6 +2148,12 @@ <translation id="4242577469625748426">Imeshindwa kusakinisha mipangilio ya sera kwenye kifaa: <ph name="VALIDATION_ERROR" />.</translation> <translation id="4244238649050961491">Pata programu zaidi za stylus</translation> <translation id="424726838611654458">Fungua katika Adobe Reader wakati wowote</translation> +<translation id="4247274662191902962">Data ya vitambuzi itashirikiwa tu ukiwa katika hali hii ya VR. Tovuti hii inaweza kupata maelezo zaidi kukuhusu kwa kutumia maelezo fulani, kama vile: + - Mahali ulipo + - Umbo lako, kwa mfano nafasi ya macho yako + - Unavyosogea, kama vile jinsi unavyotembea + + Hakikisha kwamba unaamini tovuti hii kabla ya kuruhusu ufikiaji.</translation> <translation id="4247901771970415646">Imeshindwa kusawazisha kwenye <ph name="USERNAME" /></translation> <translation id="4249248555939881673">Inasubiri muunganisho kwa mtandao...</translation> <translation id="4249373718504745892">Ukurasa huu umezuiwa kufikia kamera na maikrofoni yako.</translation> @@ -2197,6 +2216,7 @@ <translation id="4350019051035968019">Kifaa hiki hakiwezi kusajiliwa kwenye kikoa cha akaunti yako kwa sababu kifaa kimewekewa alama kwa usimamizi wa kikoa tofauti.</translation> <translation id="4354344420232759511">Tovuti unazotembelea zitaonekana hapa</translation> <translation id="435527878592612277">Chagua picha yako</translation> +<translation id="4358313196493694334">Imarisha eneo la kubofya</translation> <translation id="4359408040881008151">Kilisakinishwa kwa sababu ya kiendelezi au viendelezi vinavyotegemea.</translation> <translation id="4359717112757026264">Mandhari ya jiji</translation> <translation id="4361142739114356624">Ufunguo wa Faragha wa Cheti hiki cha Seva Teja haupo au si sahihi</translation> @@ -2321,6 +2341,7 @@ <translation id="4558426062282641716">Ombi la ruhusa ya kuzindua kiotomatiki</translation> <translation id="4558491878126948419">Pata vidokezo na taarifa za <ph name="DEVICE_TYPE" /> kwenye bidhaa za Google na ushiriki maoni. Unaweza kujiondoa wakati wowote.</translation> <translation id="4559617833001311418">Tovuti hii inafikia vitambuzi vyako vya mwangaza au mwendo.</translation> +<translation id="4561098487691395071">Au bainisha PPD ya printa yako</translation> <translation id="4562155214028662640">Ongeza Alama ya Kidole</translation> <translation id="4563880231729913339">Kidole cha 3</translation> <translation id="4565377596337484307">Ficha nenosiri</translation> @@ -2565,6 +2586,7 @@ <translation id="494286511941020793">Msaada wa Usanidi wa Proksi</translation> <translation id="4943368462779413526">Kandanda</translation> <translation id="4943691134276646401">"<ph name="CHROME_EXTENSION_NAME" />" inataka kuunganisha kwenye mlango wa kuwekea vifaa</translation> +<translation id="4944310289250773232">Huduma hii ya uthibitishaji imepangishwa na <ph name="SAML_DOMAIN" /></translation> <translation id="495170559598752135">Vitendo</translation> <translation id="4953689047182316270">Kushughulikia Matukio ya Zana za Walio na Matatizo ya Kuona au Kusikia</translation> <translation id="4953808748584563296">Ishara chaguomsingi ya rangi ya machungwa</translation> @@ -2657,6 +2679,7 @@ <translation id="5094721898978802975">Kuwasiliana na programu za asili zinazoshirikiana</translation> <translation id="5097002363526479830">Imeshindwa kuunganisha kwenye mtandao '<ph name="NAME" />': <ph name="DETAILS" /></translation> <translation id="5101042277149003567">Fungua alamisho zote</translation> +<translation id="5101839224773798795">Bofya kiotomatiki kiteuzi kinaposimama</translation> <translation id="5108967062857032718">Mipangilio - Ondoa programu za Android</translation> <translation id="5109044022078737958">Mia</translation> <translation id="5111646998522066203">Funga Hali Fiche</translation> @@ -3140,6 +3163,7 @@ <translation id="5852112051279473187">Lo! Hitilafu imetokea wakati wa kusajili kifaa hiki. Tafadhali jaribu tena au uwasiliane na mwakilishi atakayekusaidia.</translation> <translation id="5852137567692933493">Anzisha upya na Powerwash</translation> <translation id="5854912040170951372">Slaisi</translation> +<translation id="5855643921295613558">Sekunde 0.6</translation> <translation id="5855773610748894548">Lo! Hitilafu ya sehemu salama imetokea.</translation> <translation id="5856721540245522153">Washa vipengele vya kutatua</translation> <translation id="5857090052475505287">Folda Mpya</translation> @@ -3429,6 +3453,7 @@ <translation id="6279183038361895380">Bonyeza |<ph name="ACCELERATOR" />| ili kiteuzi kionekane</translation> <translation id="6280215091796946657">Ingia kwa kutumia akaunti tofauti</translation> <translation id="6280912520669706465">ARC</translation> +<translation id="628352644014831790">Sekunde 4</translation> <translation id="6285120108426285413"><ph name="FILE_NAME" /> haipakuliwi kwa kawaida na huenda ikawa hatari.</translation> <translation id="6285120908535925801">{NUM_PRINTER,plural, =1{Printa mpya kwenye mtandao wako}other{Printa mpya kwenye mtandao wako}}</translation> <translation id="6286708577777130801">Maelezo ya nenosiri lililohifadhiwa</translation> @@ -3635,6 +3660,7 @@ <translation id="6612358246767739896">Maudhui yanayolindwa</translation> <translation id="6613452264606394692">Rejea hapa kwa haraka kwa kualamisha ukurasa huu</translation> <translation id="6615455863669487791">Nionyeshe</translation> +<translation id="6617100836880592260">Kasi ya kukagua: <ph name="SPEED_WITH_UNITS" /></translation> <translation id="6618097958368085618">Hifadhi Tu</translation> <translation id="6619058681307408113">Line Printer Daemon (LPD)</translation> <translation id="661907246513853610">Tovuti inaweza kufuatilia mahali ulipo</translation> @@ -4451,6 +4477,7 @@ <translation id="7831491651892296503">Hitilafu imetokea wakati wa kuweka mipangilio ya mtandao</translation> <translation id="7831754656372780761"><ph name="TAB_TITLE" /> <ph name="EMOJI_MUTING" /></translation> <translation id="7832084384634357321">Wakati wa kuisha</translation> +<translation id="783214144752121388">Zuia tovuti zisitumie Mweko (inapendekezwa)</translation> <translation id="7833720883933317473">Manenosiri maalum yaliyohifadhiwa yataonekana hapa</translation> <translation id="7835178595033117206">Alamisho imeondolewa</translation> <translation id="7837776265184002579">Ukurasa wako wa kwanza umebadilishwa kuwa <ph name="URL" />.</translation> @@ -4506,6 +4533,7 @@ <translation id="7911118814695487383">Linux</translation> <translation id="7912080627461681647">Nenosiri lako limebadilishwa kwenye seva. Tafadhali ondoka na uingie katika akaunti tena.</translation> <translation id="7915471803647590281">Tafadhali tuelezee kinachofanyika kabla ya kutuma mwitiko.</translation> +<translation id="7919210519031517829">Sekunde <ph name="DURATION" /></translation> <translation id="792514962475806987">Kiwango cha ukuzaji uliofungwa:</translation> <translation id="7925247922861151263">Ukaguzi wa AAA umeshindikana</translation> <translation id="7925285046818567682">Inasubiri <ph name="HOST_NAME" />...</translation> @@ -4563,6 +4591,7 @@ <translation id="7987814697832569482">Unganisha kupitia VPN hii wakati wote</translation> <translation id="798835209536175951">Tuma na upokee SMS kupitia Chromebook yako. <ph name="LINK_BEGIN" />Pata maelezo zaidi<ph name="LINK_END" /></translation> <translation id="7988355189918024273">Washa vipengele vya zana za walio na matatizo ya kuona au kusikia</translation> +<translation id="7991296728590311172">Mipangilio ya Kufikia Kupitia Swichi</translation> <translation id="7994702968232966508">Mbinu ya EAP</translation> <translation id="7997826902155442747">Kipaumbele cha Mchakato</translation> <translation id="7999229196265990314">Imeunda faili zifuatazo: @@ -4776,6 +4805,8 @@ <translation id="8308179586020895837">Uliza kama <ph name="HOST" /> anataka kufikia kamera yako</translation> <translation id="830868413617744215">Beta</translation> <translation id="8309458809024885768">Cheti tayari kipo</translation> +<translation id="8314381333424235892">Kiendelezi kinakosekana au hakijasakinishwa</translation> +<translation id="8316618172731049784">Tuma kwenye <ph name="DEVICE_NAME" /></translation> <translation id="8317671367883557781">Ongeza muunganisho wa mtandao</translation> <translation id="8319414634934645341">Matumizi ya Ziada ya Ufunguo</translation> <translation id="8320459152843401447">Skrini Yako Yote</translation> @@ -4933,6 +4964,7 @@ <translation id="8588866096426746242">Onyesha takwimu za wasifu</translation> <translation id="8588868914509452556"><ph name="WINDOW_TITLE" /> - Inawasilisha VR kwenye vifaa vya kutazama uhalisia pepe</translation> <translation id="8590375307970699841">Weka masasisho ya kiotomatiki</translation> +<translation id="8591783563402255548">Sekunde 1</translation> <translation id="8592141010104017453">Usionyeshe arifa kabisa</translation> <translation id="8593121833493516339">Tuma data ya matumizi na uchunguzi. Tusaidie kuboresha jinsi mtoto wako anavyotumia Android kwa kutuma kiotomatiki data ya uchunguzi na matumizi ya kifaa na programu kwa Google. Hatutatumia data hii kumtambulisha mtoto wako na itatusaidia kuboresha uthabiti wa programu na mfumo na maboresho mengine. Baadhi ya maelezo yaliyojumlishwa pia yatasaidia programu za Google na washirika kama vile wasanidi programu za Android. Ikiwa umewasha mipangilio ya historia ya Shughuli za ziada kwenye Wavuti na Programu kwa ajili ya mtoto wako, data hii inaweza kuhifadhiwa kwenye akaunti yake ya Google. <ph name="BEGIN_LINK1" />Pata maelezo zaidi<ph name="END_LINK1" /></translation> <translation id="8594908476761052472">Rekodi video</translation> @@ -4962,6 +4994,7 @@ <translation id="8637688295594795546">Usasishaji wa mfumo unaopatikana. Inajitayarisha kupakua...</translation> <translation id="8639047128869322042">Inatafuta programu hatari...</translation> <translation id="8642171459927087831">Tokeni ya Ufikiaji</translation> +<translation id="8642900771896232685">Sekunde 2</translation> <translation id="8642947597466641025">Fanya Matini Kuwa Makubwa</translation> <translation id="8643418457919840804">Ili uendelee, teua chaguo moja:</translation> <translation id="8644655801811752511">Huruhusiwi kubadilisha ufunguo huu wa usalama. Jaribu kubadilisha ufunguo mara tu baada ya kuuweka.</translation> @@ -5163,6 +5196,7 @@ <translation id="8910222113987937043">Mabadiliko ya alamisho, historia, manenosiri, na mipangilio yako mingine hayatasawazishwa kwenye Akaunti yako ya Google. Hata hivyo, data yako ya sasa itaendelea kuhifadhiwa katika Akaunti yako ya Google na inaweza kudhibitiwa kwenye <ph name="BEGIN_LINK" />Dashibodi ya Google<ph name="END_LINK" />.</translation> <translation id="8912362522468806198">Akaunti ya Google</translation> <translation id="8912793549644936705">Panua</translation> +<translation id="8912810933860534797">Washa ukaguzi wa kiotomatiki</translation> <translation id="891365694296252935">Tuma data ya matumizi na uchunguzi. Kwa sasa, kifaa hiki kinatuma kiotomatiki data ya uchunguzi na matumizi ya programu na kifaa kwa Google. Hatutatumia hatua hii kumtambulisha mtoto wako na itatusaidia kuboresha uthabiti wa programu na mfumo na maboresho mengine. Baadhi ya maelezo yaliyojumlishwa pia yatasaidia programu za Google na washirika kama vile wasanidi programu za Android. Mipangilio hii inatekelezwa na mmiliki. Ikiwa umewasha mipangilio ya historia ya Shughuli za ziada kwenye Wavuti na Programu ya mtoto wako, data hii inaweza kuhifadhiwa kwenye Akaunti yake ya Google. <ph name="BEGIN_LINK1" />Pata maelezo zaidi<ph name="END_LINK1" /></translation> <translation id="8915370057835397490">Inapakia pendekezo</translation> <translation id="8916476537757519021">Fremu ndogo ya Hali Fiche: <ph name="SUBFRAME_SITE" /></translation> @@ -5315,6 +5349,7 @@ <translation id="9153934054460603056">Hifadhi kitambulisho na nenosiri</translation> <translation id="9154194610265714752">Imesasishwa</translation> <translation id="91568222606626347">Unda Njia ya Mkato</translation> +<translation id="9157096865782046368">Sekunde 0.8</translation> <translation id="9157697743260533322">Imeshindwa kuweka mipangilio ya masasisho ya kiotomatiki kwa watumiaji wote (hitilafu ya kutoweka vipengele vya kabla vinayohitajika. <ph name="ERROR_NUMBER" />)</translation> <translation id="9158715103698450907">Lo! Tatizo la mawasiliano katika mtandao lilitokea wakati wa uthibitishaji. Tafadhali kagua muunganisho wa mtandao wako na ujaribu tena.</translation> <translation id="916607977885256133">Picha ndani ya Picha</translation>
diff --git a/chrome/app/resources/generated_resources_ta.xtb b/chrome/app/resources/generated_resources_ta.xtb index 267a72a..39f34e2d 100644 --- a/chrome/app/resources/generated_resources_ta.xtb +++ b/chrome/app/resources/generated_resources_ta.xtb
@@ -1715,7 +1715,7 @@ <translation id="3629631988386925734">Smart Lockகை இயக்க, கடவுச்சொல்லை உள்ளிடவும். அடுத்த முறை <ph name="DEVICE_TYPE" />ஐ உங்கள் மொபைல் திறக்கும். அமைப்புகளில் Smart Lockகை முடக்கலாம்.</translation> <translation id="3630132874740063857">உங்கள் ஃபோன்</translation> <translation id="3630995161997703415">இந்தத் தளத்தை எந்த நேரத்திலும் பயன்படுத்த அதனை உங்கள் ஷெல்ஃபில் சேர்க்கவும்</translation> -<translation id="3635256809897331115">செருகுநிரல் VMமைப் பயன்படுத்த 'தொடங்கு' என்பதைக் கிளிக் செய்யவும் அல்லது தட்டவும். எதிர்காலத்தில் 'தொடக்கியிலுள்ள' ஐகானைத் தேர்வுசெய்வதன் மூலம் செருகுநிரல் VMமைத் தொடங்கலாம்.</translation> +<translation id="3635256809897331115">செருகுநிரல் VMமைப் பயன்படுத்த 'தொடங்கு' என்பதைக் கிளிக் செய்யவும் அல்லது தட்டவும். இனிமேல் 'தொடக்கியிலுள்ள' ஐகானைத் தேர்வுசெய்வதன் மூலம் செருகுநிரல் VMமைத் தொடங்கலாம்.</translation> <translation id="3636096452488277381">நலமா <ph name="USER_GIVEN_NAME" />.</translation> <translation id="3636766455281737684"><ph name="PERCENTAGE" />% - <ph name="TIME" /> மீதமுள்ளது</translation> <translation id="3637682276779847508">பின்னின் தடையை நீக்குவதற்கான சரியான குறியீட்டை உள்ளிடவில்லை எனில், சிம் கார்டு நிரந்தரமாக முடக்கப்படும்.</translation> @@ -2129,6 +2129,12 @@ <translation id="4242577469625748426">சாதனத்தில் கொள்கை அமைப்புகளை நிறுவுவதில் தோல்வி: <ph name="VALIDATION_ERROR" />.</translation> <translation id="4244238649050961491">மேலும் ஸ்டைலஸ் பயன்பாடுகளைக் கண்டறிக</translation> <translation id="424726838611654458">எப்போதும் Adobe Reader இல் திற</translation> +<translation id="4247274662191902962">இந்த VR அனுபவத்தில் இருக்கும்போது மட்டுமே சென்சார் தரவு பகிரப்படும். கீழுள்ளவை போன்ற குறிப்பிட்ட தகவல் மூலம் இந்தத் தளத்தால் உங்களைக் கண்டறிய முடியும்: + - இருப்பிடம் + - கண்ணின் அமைப்பு போன்ற அங்க அடையாளங்கள் + - நடக்கும் விதம் போன்ற அசைவுகள் + + இந்தத் தளம் நம்பத்தகுந்தது எனக் கருதினால் மட்டுமே அணுகல் வழங்கவும்.</translation> <translation id="4247901771970415646"><ph name="USERNAME" />க்கு ஒத்திசைக்க முடியவில்லை</translation> <translation id="4249248555939881673">நெட்வொர்க் இணைப்பிற்காகக் காத்திருக்கிறது...</translation> <translation id="4249373718504745892">உங்கள் கேமராவையும், மைக்ரோஃபோனையும் அணுகுவதிலிருந்து இந்தப் பக்கம் தடுக்கப்பட்டுள்ளது.</translation> @@ -4768,7 +4774,7 @@ <translation id="8339059274628563283">சாதனத்தில் சேமிக்கப்பட்ட <ph name="SITE" /> தரவு</translation> <translation id="833986336429795709">இந்த இணைப்பைத் திறக்க, பயன்பாட்டைத் தேர்வுசெய்யும்</translation> <translation id="8342861492835240085">தொகுப்பைத் தேர்ந்தெடு</translation> -<translation id="8343187330304787218"><ph name="DEVICE_TYPE" />கில் செருகுநிரல் VMமை இயக்குவதற்கான அமைப்புகளை நிர்வகியுங்கள்</translation> +<translation id="8343187330304787218"><ph name="DEVICE_TYPE" />இல் செருகுநிரல் VMமை இயக்குவதற்கான அமைப்புகளை நிர்வகியுங்கள்</translation> <translation id="8343956361364550006">சிறந்த வீடியோ அல்லது அனிமேஷனுக்கு உயர் இணைய வேகத்தைப் பயன்படுத்தவும். வேகம் குறைவான இணைப்புகளைப் பயன்படுத்துபவர்களால் உங்கள் உள்ளடக்கத்தைப் பார்க்க முடியாமல் போகக்கூடும்.</translation> <translation id="8351419472474436977">உங்கள் ப்ராக்ஸி அமைப்புகளை இந்த நீட்டிப்பு கட்டுப்படுத்துகிறது, அதாவது நீங்கள் ஆன்லைனில் செய்யும் எல்லாவற்றையும் அதனால் மாற்றமுடியும், தடுக்க முடியும் அல்லது தெரிந்து கொள்ள முடியும். இது ஏன் நடந்தது என்பது தெரியவில்லை எனில், உங்களுக்கு இந்த மாற்றம் தேவைப்படாதது என்று அர்த்தம்.</translation> <translation id="835238322900896202">நிறுவல் நீக்கும்போது ஒரு பிழை நேர்ந்தது. ’முனையம்’ வழியாக நிறுவல் நீக்கவும்.</translation> @@ -5183,7 +5189,7 @@ <translation id="8978154919215542464">இயக்கத்திலுள்ளது - அனைத்தையும் ஒத்திசை</translation> <translation id="897939795688207351"><ph name="ORIGIN" /> இல்</translation> <translation id="8980951173413349704"><ph name="WINDOW_TITLE" /> - சிதைந்துவிட்டது</translation> -<translation id="8985264973231822211"><ph name="DEVICE_LAST_ACTIVATED_TIME" /> கடைசியாக 1 நாளுக்கு முன் பயன்படுத்தியுள்ளார்</translation> +<translation id="8985264973231822211">கடைசியாக <ph name="DEVICE_LAST_ACTIVATED_TIME" /> நாளுக்கு முன் பயன்படுத்தியுள்ளார்</translation> <translation id="8986362086234534611">மற</translation> <translation id="8986494364107987395">பயன்பாட்டுப் புள்ளிவிவரங்களையும் சிதைவு அறிக்கைகளையும் தானாகவே Google க்கு அனுப்பு</translation> <translation id="8987927404178983737">மாதம்</translation>
diff --git a/chrome/app/resources/generated_resources_te.xtb b/chrome/app/resources/generated_resources_te.xtb index 17c940f..2c575d2 100644 --- a/chrome/app/resources/generated_resources_te.xtb +++ b/chrome/app/resources/generated_resources_te.xtb
@@ -2143,6 +2143,12 @@ <translation id="4242577469625748426">పరికరంలో విధాన సెట్టింగ్లను ఇన్స్టాల్ చేయడంలో విఫలమైంది: <ph name="VALIDATION_ERROR" />.</translation> <translation id="4244238649050961491">మరిన్ని స్టైలస్ యాప్లను కనుగొనండి</translation> <translation id="424726838611654458">ఎల్లప్పుడూ Adobe Readerలో తెరువు</translation> +<translation id="4247274662191902962">మీరు ఈ VR అనుభవంలో ఉన్నప్పుడు మాత్రమే సెన్సార్ డేటా షేర్ చేయబడుతుంది. ఈ కింద ఉన్న నిర్దిష్ట సమాచారం ఆధారంగా ఈ సైట్ మీ గురించి తెలుసుకునే అవకాశం ఉంది: + - మీ స్థానం + - మీ ముఖ స్వరూపం, అంటే కన్ను ఉన్న స్థానం లాంటివి + - మీ కదలికలు, అంటే మీరు ఎలా నడుస్తారు లాంటివి + + మీరు యాక్సెస్ ఇచ్చే ముందు ఈ సైట్ను విశ్వసిస్తున్నట్లు నిర్ధారించండి.</translation> <translation id="4247901771970415646"><ph name="USERNAME" />కి సమకాలీకరించడం సాధ్యం కాదు</translation> <translation id="4249248555939881673">నెట్వర్క్ కనెక్షన్ కోసం వేచి ఉంది...</translation> <translation id="4249373718504745892">మీ కెమెరా మరియు మైక్రోఫోన్ను ప్రాప్యత చేయకుండా ఈ పేజీ బ్లాక్ చేయబడింది.</translation> @@ -3519,7 +3525,7 @@ <translation id="6412931879992742813">కొత్త అజ్ఞాత విండో</translation> <translation id="6415900369006735853">మీ ఫోన్ ద్వారా ఇంటర్నెట్కు కనెక్ట్ అవ్వండి</translation> <translation id="6416743254476733475">మీ కంప్యూటర్లో అనుమతించండి లేదా బ్లాక్ చేయండి.</translation> -<translation id="6417265370957905582">Google సహాయకం</translation> +<translation id="6417265370957905582">Google అసిస్టెంట్</translation> <translation id="6418160186546245112">మునుపు ఇన్స్టాల్ చేసిన <ph name="IDS_SHORT_PRODUCT_NAME" /> వెర్షన్కు తిరిగి మారుస్తోంది</translation> <translation id="6418481728190846787">అన్ని యాప్ల కోసం యాక్సెస్ను శాశ్వతంగా తీసివేయి</translation> <translation id="6418511932144861495">కీలకమైన అప్డేట్ను ఇన్స్టాల్ చేయండి</translation>
diff --git a/chrome/app/resources/generated_resources_th.xtb b/chrome/app/resources/generated_resources_th.xtb index a089d56..93382d2 100644 --- a/chrome/app/resources/generated_resources_th.xtb +++ b/chrome/app/resources/generated_resources_th.xtb
@@ -1,6 +1,7 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="th"> +<translation id="1002469766576243227">บริการการตรวจสอบสิทธิ์นี้โฮสต์โดย <ph name="EXTENSION_NAME" /></translation> <translation id="1003088604756913841">เปิดลิงก์ในหน้าต่าง <ph name="APP" /> ใหม่</translation> <translation id="1004218526896219317">สิทธิ์เข้าถึงเว็บไซต์</translation> <translation id="1005274289863221750">ใช้ไมโครโฟนและกล้องถ่ายรูปของคุณ</translation> @@ -289,6 +290,7 @@ <translation id="1429300045468813835">ล้างทั้งหมดแล้ว</translation> <translation id="143027896309062157">อ่านและเปลี่ยนข้อมูลทั้งหมดของคุณบนคอมพิวเตอร์และเว็บไซต์ที่คุณเข้าชม</translation> <translation id="1430915738399379752">พิมพ์</translation> +<translation id="1431188203598586230">การอัปเดตซอฟต์แวร์ครั้งสุดท้าย</translation> <translation id="1432581352905426595">จัดการเครื่องมือค้นหา</translation> <translation id="1433811987160647649">ถามก่อนที่จะเข้าถึง</translation> <translation id="1434696352799406980">การดำเนินการนี้จะรีเซ็ตหน้าเริ่มต้นใช้งาน หน้าแท็บใหม่ เครื่องมือค้นหา แท็บที่ถูกตรึง และยังปิดใช้ส่วนขยายทั้งหมด ตลอดจนล้างข้อมูลชั่วคราว เช่น คุกกี้ โดยจะไม่ล้างบุ๊กมาร์ก ประวัติ และรหัสผ่านที่บันทึกไว้</translation> @@ -528,6 +530,7 @@ <translation id="1781771911845953849">บัญชีและการซิงค์</translation> <translation id="1782196717298160133">กำลังค้นหาโทรศัพท์ของคุณ</translation> <translation id="1784849162047402014">อุปกรณ์เครื่องนี้เหลือพื้นที่ว่างในดิสก์ต่ำ</translation> +<translation id="1790194216133135334">ส่งลิงก์ไปที่ <ph name="DEVICE_NAME" /></translation> <translation id="1792619191750875668">การแสดงผลแบบขยาย</translation> <translation id="1794791083288629568">ส่งความคิดเห็นเพื่อช่วยเราแก้ไขปัญหานี้</translation> <translation id="1795214765651529549">ใช้แบบคลาสสิก</translation> @@ -590,6 +593,7 @@ <translation id="1875312262568496299">เริ่มต้น</translation> <translation id="1875387611427697908">ต้องเพิ่มจาก <ph name="CHROME_WEB_STORE" /> เท่านั้น</translation> <translation id="1877520246462554164">ไม่ได้รับโทเค็นการตรวจสอบสิทธิ์ โปรดออกจากระบบแล้วลงชื่อเข้าใช้อีกครั้งเพื่อลองอีกครั้ง</translation> +<translation id="1877860345998737529">การกำหนดการดำเนินการด้วยสวิตช์</translation> <translation id="1879000426787380528">ลงชื่อเข้าใช้ด้วย</translation> <translation id="1880905663253319515">ลบใบรับรอง "<ph name="CERTIFICATE_NAME" />" หรือไม่</translation> <translation id="1886996562706621347">อนุญาตให้ไซต์แจ้งขอเป็นเครื่องจัดการเริ่มต้นสำหรับโปรโตคอล (แนะนำ)</translation> @@ -869,7 +873,9 @@ <translation id="230927227160767054">หน้าเว็บนี้ต้องการติดตั้งเครื่องจัดการบริการ</translation> <translation id="2309620859903500144">เว็บไซต์นี้ถูกบล็อกไม่ให้เข้าถึงเซ็นเซอร์ตรวจจับการเคลื่อนไหวหรือแสง</translation> <translation id="2315414688463285945">เกิดข้อผิดพลาดขณะกำหนดค่าไฟล์ Linux โปรดลองอีกครั้ง</translation> +<translation id="2315587498123194634">ส่งลิงก์ไปที่ <ph name="DEVICE_NAME" /></translation> <translation id="2316129865977710310">ไม่ ขอบคุณ</translation> +<translation id="2316739859433277603">การค้นหาจากตัวเปิดแอปจะใช้<ph name="BEGIN_LINK" />การตั้งค่าเครื่องมือค้นหา<ph name="END_LINK" />ของเบราว์เซอร์</translation> <translation id="2317842250900878657">เสร็จแล้ว <ph name="PROGRESS_PERCENT" />%</translation> <translation id="2318143611928805047">ขนาดกระดาษ</translation> <translation id="2318817390901984578">หากต้องการใช้แอป Android ให้ชาร์จและอัปเดต <ph name="DEVICE_TYPE" /></translation> @@ -909,6 +915,7 @@ <translation id="2365507699358342471">เว็บไซต์นี้จะดูข้อความและรูปภาพที่คัดลอกไปยังคลิปบอร์ดได้</translation> <translation id="2367199180085172140">เพิ่มการแชร์ไฟล์</translation> <translation id="2367972762794486313">แสดงแอป</translation> +<translation id="2369105924912929484">สลับเนื้อหาของหน้าที่กลั่นกรองแล้ว</translation> <translation id="2371076942591664043">เปิดเมื่อเ&สร็จ</translation> <translation id="2375406435414127095">เชื่อมต่อโทรศัพท์ของคุณ</translation> <translation id="2377667304966270281">ฮาร์ดฟอลต์</translation> @@ -1159,6 +1166,7 @@ <translation id="2739191690716947896">แก้ปัญหา</translation> <translation id="2739240477418971307">เปลี่ยนแปลงการตั้งค่าการเข้าถึง</translation> <translation id="2740393541869613458">ตรวจสอบเว็บไซต์ที่ผู้ใช้ภายใต้การดูแลได้เข้าชมและ</translation> +<translation id="2741912629735277980">แสดง UI ในหน้าจอการเข้าสู่ระบบ</translation> <translation id="274290345632688601">กำลังคืนค่าแอปและไฟล์ Linux</translation> <translation id="2743387203779672305">คัดลอกไว้ที่คลิปบอร์ด</translation> <translation id="2745080116229976798">ตัวย่อยที่เหมาะสมของ Microsoft</translation> @@ -1275,6 +1283,7 @@ <translation id="2910318910161511225">เชื่อมต่อกับเครือข่ายแล้วลองอีกครั้ง</translation> <translation id="2913331724188855103">อนุญาตให้เว็บไซต์บันทึกและอ่านข้อมูลคุกกี้ (แนะนำ)</translation> <translation id="2915102088417824677">ดูบันทึกกิจกรรม</translation> +<translation id="2915873080513663243">สแกนอัตโนมัติ</translation> <translation id="2916073183900451334">การกดแท็บบนหน้าเว็บจะเน้นลิงก์ และฟิลด์ของฟอร์ม</translation> <translation id="2916745397441987255">ค้นหาส่วนขยาย</translation> <translation id="2921081876747860777">โปรดสร้างรหัสผ่านเพื่อปกป้องข้อมูลในเครื่อง</translation> @@ -1483,6 +1492,7 @@ <translation id="327147043223061465">ดูคุกกี้และข้อมูลเว็บไซต์ทั้งหมด</translation> <translation id="3271648667212143903"><ph name="ORIGIN" /> ต้องการเชื่อมต่อ</translation> <translation id="3274763671541996799">คุณอยู่ในการแสดงแบบเต็มหน้าจอแล้ว</translation> +<translation id="3275778809241512831">ขณะนี้คีย์ความปลอดภัยภายในของคุณไม่ปลอดภัย โปรดนำคีย์ความปลอดภัยออกจากบริการที่คุณใช้ร่วมกับคีย์ดังกล่าว และโปรดรีเซ็ตคีย์ความปลอดภัยเพื่อแก้ปัญหานี้</translation> <translation id="3275778913554317645">เปิดเป็นหน้าต่าง</translation> <translation id="3278001907972365362">บัญชี Google ของคุณต้องการการดำเนินการ</translation> <translation id="3279230909244266691">ขั้นตอนนี้อาจใช้เวลาสักครู่ กำลังเริ่มเครื่องเสมือน</translation> @@ -1575,6 +1585,7 @@ <translation id="3412265149091626468">ข้ามไปที่สิ่งที่เลือก</translation> <translation id="3413122095806433232">ผู้ออก CA: <ph name="LOCATION" /></translation> <translation id="3414952576877147120">ขนาด:</translation> +<translation id="3420501302812554910">ต้องรีเซ็ตคีย์ความปลอดภัยภายใน</translation> <translation id="3421387094817716717">กุญแจสาธารณะแบบ Elliptic Curve</translation> <translation id="3423463006624419153">บนโทรศัพท์ "<ph name="PHONE_NAME_1" />" และ "<ph name="PHONE_NAME_2" />" ของคุณ</translation> <translation id="3423858849633684918">โปรดเปิดใช้งาน <ph name="PRODUCT_NAME" /> ใหม่</translation> @@ -1603,6 +1614,7 @@ <translation id="3450157232394774192">เปอร์เซ็นต์การเกิดขึ้นของสถานะไม่มีการใช้งาน</translation> <translation id="3453612417627951340">ต้องขออนุมัติก่อน</translation> <translation id="3454157711543303649">การเปิดใช้งานเสร็จสมบูรณ์</translation> +<translation id="3454213325559396544">นี่เป็นการอัปเดตซอฟต์แวร์และความปลอดภัยอัตโนมัติครั้งสุดท้ายสำหรับ <ph name="DEVICE_TYPE" /> เครื่องนี้ โปรดอัปเกรดเป็นรุ่นที่ใหม่กว่าเพื่อรับการอัปเดตในอนาคต</translation> <translation id="345693547134384690">เปิด&รูปภาพในแท็บใหม่</translation> <translation id="3457500881955698515">บริษัทหรือองค์กรของคุณกำหนดให้อัปเดตอุปกรณ์นี้ทันที</translation> <translation id="3459509316159669723">การพิมพ์</translation> @@ -1760,6 +1772,7 @@ <translation id="3672681487849735243">ตรวจพบข้อผิดพลาดจากโรงงาน</translation> <translation id="367645871420407123">เว้นว่างไว้หากคุณต้องการตั้งรหัสผ่านระดับรูทเป็นภาพทดสอบเริ่มต้น</translation> <translation id="3677657024345889897">เสียงเบาที่สุด</translation> +<translation id="3677911431265050325">ขอเว็บไซต์ในอุปกรณ์เคลื่อนที่</translation> <translation id="3678156199662914018">ส่วนขยาย: <ph name="EXTENSION_NAME" /></translation> <translation id="3681311097828166361">ขอขอบคุณสำหรับความคิดเห็น คุณกำลังออฟไลน์อยู่ในขณะนี้ และระบบจะส่งรายงานของคุณในภายหลัง</translation> <translation id="3682824389861648626">เกณฑ์การเคลื่อนไหว</translation> @@ -2144,6 +2157,12 @@ <translation id="4242577469625748426">ไม่สามารถติดตั้งการตั้งค่านโยบายบนอุปกรณ์: <ph name="VALIDATION_ERROR" /></translation> <translation id="4244238649050961491">ค้นหาแอปสไตลัสเพิ่มเติม</translation> <translation id="424726838611654458">เปิดใน Adobe Reader ทุกครั้ง</translation> +<translation id="4247274662191902962">ระบบจะแชร์ข้อมูลเซ็นเซอร์เฉพาะตอนที่คุณอยู่ในประสบการณ์ VR นี้ เว็บไซต์นี้อาจดูข้อมูลเกี่ยวกับคุณได้โดยใช้ข้อมูลบางอย่าง เช่น + - ตำแหน่ง + - ลักษณะทางกายภาพ เช่น ตำแหน่งดวงตา + - การเคลื่อนไหว เช่น ลักษณะการเดิน + + โปรดตรวจสอบว่าเว็บไซต์นี้เชื่อถือได้ก่อนอนุญาตการเข้าถึง</translation> <translation id="4247901771970415646">ซิงค์กับ <ph name="USERNAME" /> ไม่ได้</translation> <translation id="4249248555939881673">กำลังรอการเชื่อมต่อเครือข่าย...</translation> <translation id="4249373718504745892">หน้าเว็บนี้ถูกบล็อกไม่ให้เข้าถึงกล้องถ่ายรูปและไมโครโฟนของคุณ</translation> @@ -2206,6 +2225,7 @@ <translation id="4350019051035968019">ไม่สามารถลงทะเบียนอุปกรณ์นี้กับโดเมนที่บัญชีของคุณใช้อยู่ได้ เนื่องจากอุปกรณ์มีการทำเครื่องหมายไว้ว่าได้รับการจัดการจากโดเมนอื่น</translation> <translation id="4354344420232759511">เว็บไซต์ที่คุณเข้าชมจะปรากฏที่นี่</translation> <translation id="435527878592612277">เลือกรูปภาพของคุณ</translation> +<translation id="4358313196493694334">ปรับให้ตำแหน่งการคลิกคงที่</translation> <translation id="4359408040881008151">ติดตั้งแล้วเนื่องจากมีส่วนขยายที่ต้องพึ่งพา</translation> <translation id="4359717112757026264">ทิวทัศน์ของเมือง</translation> <translation id="4361142739114356624">คีย์ส่วนตัวของใบรับรองไคลเอ็นต์นี้หายไปหรือไม่ถูกต้อง</translation> @@ -2330,6 +2350,7 @@ <translation id="4558426062282641716">ขอสิทธิ์การเปิดอัตโนมัติแล้ว</translation> <translation id="4558491878126948419">รับเคล็ดลับ <ph name="DEVICE_TYPE" /> ข้อมูลอัปเดตเกี่ยวกับผลิตภัณฑ์ของ Google และแชร์ความคิดเห็น ยกเลิกการรับข่าวสารได้ทุกเมื่อ</translation> <translation id="4559617833001311418">เว็บไซต์นี้เข้าถึงเซ็นเซอร์ตรวจจับการเคลื่อนไหวหรือแสงอยู่</translation> +<translation id="4561098487691395071">หรือระบุ PPD ของเครื่องพิมพ์</translation> <translation id="4562155214028662640">เพิ่มลายนิ้วมือ</translation> <translation id="4563880231729913339">นิ้วที่ 3</translation> <translation id="4565377596337484307">ซ่อนรหัสผ่าน</translation> @@ -2574,6 +2595,7 @@ <translation id="494286511941020793">ความช่วยเหลือในการกำหนดค่าพร็อกซี</translation> <translation id="4943368462779413526">ฟุตบอล</translation> <translation id="4943691134276646401">"<ph name="CHROME_EXTENSION_NAME" />" ต้องการเชื่อมต่อกับพอร์ตอนุกรม</translation> +<translation id="4944310289250773232">บริการการตรวจสอบสิทธิ์นี้โฮสต์โดย <ph name="SAML_DOMAIN" /></translation> <translation id="495170559598752135">การทำงาน</translation> <translation id="4953689047182316270">ตอบสนองต่อเหตุการณ์การเข้าถึงพิเศษ</translation> <translation id="4953808748584563296">รูปโปรไฟล์เริ่มต้นสีส้ม</translation> @@ -2666,6 +2688,7 @@ <translation id="5094721898978802975">สื่อสารกับแอปพลิเคชันการประสานงานที่มาพร้อมเครื่อง</translation> <translation id="5097002363526479830">ไม่สามารถเชื่อมต่อเครือข่าย "<ph name="NAME" />": <ph name="DETAILS" /></translation> <translation id="5101042277149003567">เปิดบุ๊กมาร์กทั้งหมด</translation> +<translation id="5101839224773798795">คลิกอัตโนมัติเมื่อเคอร์เซอร์หยุด</translation> <translation id="5108967062857032718">การตั้งค่า - นำแอป Android ออก</translation> <translation id="5109044022078737958">มีอา</translation> <translation id="5111646998522066203">ออกจากโหมดไม่ระบุตัวตน</translation> @@ -3149,6 +3172,7 @@ <translation id="5852112051279473187">อ๊ะ! เกิดข้อผิดพลาดขึ้นในขณะลงทะเบียนอุปกรณ์นี้ โปรดลองอีกครั้งหรือติดต่อตัวแทนการสนับสนุนของคุณ</translation> <translation id="5852137567692933493">รีสตาร์ทและ Powerwash</translation> <translation id="5854912040170951372">สไลซ์</translation> +<translation id="5855643921295613558">0.6 วินาที</translation> <translation id="5855773610748894548">อ๊ะ เกิดข้อผิดพลาดกับโมดูลความปลอดภัย</translation> <translation id="5856721540245522153">เปิดใช้ฟีเจอร์การแก้ไขข้อบกพร่อง</translation> <translation id="5857090052475505287">โฟลเดอร์ใหม่</translation> @@ -3438,6 +3462,7 @@ <translation id="6279183038361895380">กด |<ph name="ACCELERATOR" />| เพื่อแสดงเคอร์เซอร์ของคุณ</translation> <translation id="6280215091796946657">ลงชื่อเข้าใช้ด้วยบัญชีอื่น</translation> <translation id="6280912520669706465">ARC</translation> +<translation id="628352644014831790">4 วินาที</translation> <translation id="6285120108426285413"><ph name="FILE_NAME" /> ไม่ได้ถูกดาวน์โหลดตามปกติและอาจเป็นอันตราย</translation> <translation id="6285120908535925801">{NUM_PRINTER,plural, =1{เครื่องพิมพ์ใหม่บนเครือข่ายของคุณ}other{เครื่องพิมพ์ใหม่บนเครือข่ายของคุณ}}</translation> <translation id="6286708577777130801">รายละเอียดรหัสผ่านที่บันทึกไว้</translation> @@ -3644,6 +3669,7 @@ <translation id="6612358246767739896">เนื้อหาที่ได้รับความคุ้มครอง</translation> <translation id="6613452264606394692">บุ๊กมาร์กหน้านี้ไว้เพื่อให้กลับมาได้อย่างรวดเร็ว</translation> <translation id="6615455863669487791">แสดงให้ฉันเห็น</translation> +<translation id="6617100836880592260">ความเร็วในการสแกน: <ph name="SPEED_WITH_UNITS" /></translation> <translation id="6618097958368085618">อย่างไรก็เก็บไว้</translation> <translation id="6619058681307408113">Line Printer Daemon (LPD)</translation> <translation id="661907246513853610">เว็บไซต์ติดตามตำแหน่งของคุณได้</translation> @@ -4458,6 +4484,7 @@ <translation id="7831491651892296503">เกิดข้อผิดพลาดในการกำหนดค่าเครือข่าย</translation> <translation id="7831754656372780761"><ph name="TAB_TITLE" /> <ph name="EMOJI_MUTING" /></translation> <translation id="7832084384634357321">เวลาสิ้นสุด</translation> +<translation id="783214144752121388">บล็อกไม่ให้เว็บไซต์เรียกใช้ Flash (แนะนำ)</translation> <translation id="7833720883933317473">คำที่กำหนดเองที่บันทึกไว้จะแสดงที่นี่</translation> <translation id="7835178595033117206">นำบุ๊กมาร์กออกแล้ว</translation> <translation id="7837776265184002579">หน้าแรกของคุณเปลี่ยนเป็น <ph name="URL" /></translation> @@ -4513,6 +4540,7 @@ <translation id="7911118814695487383">Linux</translation> <translation id="7912080627461681647">มีการเปลี่ยนรหัสผ่านของคุณในเซิร์ฟเวอร์ โปรดออกจากระบบแล้วลงชื่อเข้าใช้อีกครั้ง</translation> <translation id="7915471803647590281">โปรดแจ้งให้เราทราบถึงสิ่งที่เกิดขึ้นก่อนส่งความคิดเห็น</translation> +<translation id="7919210519031517829"><ph name="DURATION" /> วินาที</translation> <translation id="792514962475806987">ระดับการซูมหน้าจอบางส่วน:</translation> <translation id="7925247922861151263">การตรวจสอบ AAA ล้มเหลว</translation> <translation id="7925285046818567682">กำลังรอ <ph name="HOST_NAME" />...</translation> @@ -4570,6 +4598,7 @@ <translation id="7987814697832569482">เชื่อมต่อผ่าน VPN นี้ทุกครั้ง</translation> <translation id="798835209536175951">ส่งและรับข้อความจาก Chromebook <ph name="LINK_BEGIN" />ดูข้อมูลเพิ่มเติม<ph name="LINK_END" /></translation> <translation id="7988355189918024273">เปิดการใช้งานฟีเจอร์การเข้าถึง</translation> +<translation id="7991296728590311172">การตั้งค่าการเข้าถึงด้วยสวิตช์</translation> <translation id="7994702968232966508">วิธีการ EAP</translation> <translation id="7997826902155442747">ลำดับความสำคัญของกระบวนการ</translation> <translation id="7999229196265990314">สร้างไฟล์ต่อไปนี้: @@ -4783,6 +4812,8 @@ <translation id="8308179586020895837">ถามว่า <ph name="HOST" /> ต้องการเข้าถึงกล้องของคุณไหม</translation> <translation id="830868413617744215">เบต้า</translation> <translation id="8309458809024885768">มีใบรับรองนี้อยู่แล้ว</translation> +<translation id="8314381333424235892">ไม่มีส่วนขยายหรือไม่ได้ติดตั้ง</translation> +<translation id="8316618172731049784">ส่งไปที่ <ph name="DEVICE_NAME" /></translation> <translation id="8317671367883557781">เพิ่มการเชื่อมต่อเครือข่าย</translation> <translation id="8319414634934645341">การใช้คีย์เพิ่มเติม</translation> <translation id="8320459152843401447">ทั้งหน้าจอของคุณ</translation> @@ -4939,6 +4970,7 @@ <translation id="8588866096426746242">แสดงสถิติของโปรไฟล์</translation> <translation id="8588868914509452556"><ph name="WINDOW_TITLE" /> - กำลังนำเสนอ VR ไปยังชุดหูฟัง</translation> <translation id="8590375307970699841">ติดตั้งการอัปเดตอัตโนมัติ</translation> +<translation id="8591783563402255548">1 วินาที</translation> <translation id="8592141010104017453">ไม่ต้องแสดงการแจ้งเตือนใดๆ</translation> <translation id="8593121833493516339">ส่งข้อมูลการใช้งานและการวินิจฉัย ช่วยปรับปรุงประสบการณ์การใช้งาน Android ของบุตรหลานให้ดีขึ้นด้วยการส่งข้อมูลการวินิจฉัย อุปกรณ์ และการใช้งานแอปไปยัง Google โดยอัตโนมัติ โดยจะไม่มีการใช้ข้อมูลนี้ในการระบุชื่อบุตรหลานของคุณ และจะช่วยปรับปรุงความเสถียรของแอปและระบบ และอื่นๆ ข้อมูลที่รวบรวมมาบางส่วนจะมีประโยชน์ต่อแอปและพาร์ทเนอร์ของ Google ด้วย เช่น นักพัฒนาซอฟต์แวร์ Android หากเปิดการตั้งค่ากิจกรรมเพิ่มเติมบนเว็บและแอปสำหรับบุตรหลาน ระบบอาจบันทึกข้อมูลนี้ไว้ในบัญชี Google ของบุตรหลาน <ph name="BEGIN_LINK1" />ดูข้อมูลเพิ่มเติม<ph name="END_LINK1" /></translation> <translation id="8594908476761052472">จับภาพวิดีโอ</translation> @@ -4968,6 +5000,7 @@ <translation id="8637688295594795546">มีอัปเดตระบบพร้อมใช้งาน กำลังเตรียมการดาวน์โหลด…</translation> <translation id="8639047128869322042">กำลังตรวจหาซอฟต์แวร์ที่เป็นอันตราย...</translation> <translation id="8642171459927087831">โทเค็นการเข้าถึง</translation> +<translation id="8642900771896232685">2 วินาที</translation> <translation id="8642947597466641025">ทำให้ข้อความใหญ่ขึ้น</translation> <translation id="8643418457919840804">เลือกตัวเลือกใดก็ได้เพื่อดำเนินการต่อ</translation> <translation id="8644655801811752511">รีเซ็ตคีย์ความปลอดภัยนี้ไม่ได้ ลองรีเซ็ตคีย์ทันทีหลังจากเสียบคีย์แล้ว</translation> @@ -5169,6 +5202,7 @@ <translation id="8910222113987937043">การเปลี่ยนแปลงในบุ๊กมาร์ก ประวัติการเข้าชม รหัสผ่าน และการตั้งค่าอื่นๆ จะไม่ซิงค์กับบัญชี Google อีกต่อไป แต่ข้อมูลที่มีอยู่จะยังจัดเก็บไว้ในบัญชี Google และสามารถจัดการได้ใน<ph name="BEGIN_LINK" />แดชบอร์ด Google<ph name="END_LINK" /></translation> <translation id="8912362522468806198">บัญชี Google</translation> <translation id="8912793549644936705">ยืด</translation> +<translation id="8912810933860534797">เปิดใช้การสแกนอัตโนมัติ</translation> <translation id="891365694296252935">ส่งข้อมูลการใช้งานและการวินิจฉัย ปัจจุบันอุปกรณ์นี้ส่งข้อมูลการวินิจฉัย อุปกรณ์ และการใช้งานแอปไปยัง Google โดยอัตโนมัติ โดยจะไม่มีการใช้ข้อมูลนี้ในการระบุชื่อบุตรหลานของคุณ และจะช่วยปรับปรุงความเสถียรของแอปและระบบ และอื่นๆ ข้อมูลที่รวบรวมมาบางส่วนจะมีประโยชน์ต่อแอปและพาร์ทเนอร์ของ Google ด้วย เช่น นักพัฒนาซอฟต์แวร์ Android เจ้าของเป็นผู้บังคับใช้การตั้งค่านี้ หากเปิดการตั้งค่ากิจกรรมเพิ่มเติมบนเว็บและแอปสำหรับบุตรหลาน ระบบอาจบันทึกข้อมูลนี้ไว้ในบัญชี Google ของบุตรหลาน <ph name="BEGIN_LINK1" />ดูข้อมูลเพิ่มเติม<ph name="END_LINK1" /></translation> <translation id="8915370057835397490">กำลังโหลดคำแนะนำ</translation> <translation id="8916476537757519021">เฟรมย่อยแบบไม่ระบุตัวตน: <ph name="SUBFRAME_SITE" /></translation> @@ -5321,6 +5355,7 @@ <translation id="9153934054460603056">บันทึกข้อมูลประจำตัวและรหัสผ่าน</translation> <translation id="9154194610265714752">อัปเดตแล้ว</translation> <translation id="91568222606626347">สร้างทางลัด...</translation> +<translation id="9157096865782046368">0.8 วินาที</translation> <translation id="9157697743260533322">ไม่สามารถตั้งค่าการอัปเดตอัตโนมัติสำหรับผู้ใช้ทุกคน (ข้อผิดพลาดในการเปิดใช้การตรวจสอบล่วงหน้า: <ph name="ERROR_NUMBER" />)</translation> <translation id="9158715103698450907">อ๊ะ! เกิดปัญหาในการสื่อสารกับเครือข่ายในระหว่างการตรวจสอบสิทธิ์ โปรดตรวจสอบการเชื่อมต่อเครือข่ายของคุณและลองอีกครั้ง</translation> <translation id="916607977885256133">การแสดงภาพซ้อนภาพ</translation>
diff --git a/chrome/app/resources/generated_resources_tr.xtb b/chrome/app/resources/generated_resources_tr.xtb index 83ff6582..b11aa3f 100644 --- a/chrome/app/resources/generated_resources_tr.xtb +++ b/chrome/app/resources/generated_resources_tr.xtb
@@ -2144,6 +2144,12 @@ <translation id="4242577469625748426">Politika ayarları cihaza yüklenemedi: <ph name="VALIDATION_ERROR" />.</translation> <translation id="4244238649050961491">Daha fazla ekran kalemi uygulaması bul</translation> <translation id="424726838611654458">Her zaman Adobe Reader programında aç</translation> +<translation id="4247274662191902962">Sensör verileri yalnızca bu VR deneyiminiz sırasında paylaşılacak. Bu site bazı verileri kullanarak hakkınızda bilgi edinebilir. Örneğin: + - Konumunuz + - Fiziksel özellikleriniz (ör. gözünüzün konumu) + - Hareketleriniz (ör. yürüme biçiminiz) + + Erişime izin vermeden önce bu siteye güvendiğinizden emin olun.</translation> <translation id="4247901771970415646"><ph name="USERNAME" /> ile senkronize edilemiyor</translation> <translation id="4249248555939881673">Ağ bağlantısı bekleniyor...</translation> <translation id="4249373718504745892">Bu sayfanın kamera ve mikrofonunuza erişimi engellenmiştir.</translation>
diff --git a/chrome/app/resources/generated_resources_uk.xtb b/chrome/app/resources/generated_resources_uk.xtb index 311d89b7..ae6f739 100644 --- a/chrome/app/resources/generated_resources_uk.xtb +++ b/chrome/app/resources/generated_resources_uk.xtb
@@ -2144,6 +2144,12 @@ <translation id="4242577469625748426">Помилка встановлення налаштувань правил на пристрої: <ph name="VALIDATION_ERROR" />.</translation> <translation id="4244238649050961491">Більше додатків із використанням стилуса</translation> <translation id="424726838611654458">Завжди відкривати в Adobe Reader</translation> +<translation id="4247274662191902962">Доступ до даних датчиків надаватиметься лише впродовж цього сеансу віртуальної реальності. Цей сайт може розпізнавати вас за допомогою певної інформації, як-от: + - вашого місцезнаходження; + - фізичних особливостей (наприклад, положення очей) + - рухів (наприклад, типу ходьби). + + Переконайтеся, що довіряєте цьому сайту, перш ніж надати доступ.</translation> <translation id="4247901771970415646">Не вдалося синхронізуватися з користувачем <ph name="USERNAME" /></translation> <translation id="4249248555939881673">Очікування на з’єднання з мережею…</translation> <translation id="4249373718504745892">Доступ цієї сторінки до ваших камери та мікрофона заблоковано.</translation>
diff --git a/chrome/app/resources/generated_resources_vi.xtb b/chrome/app/resources/generated_resources_vi.xtb index 220b767..9260ecf 100644 --- a/chrome/app/resources/generated_resources_vi.xtb +++ b/chrome/app/resources/generated_resources_vi.xtb
@@ -2144,6 +2144,12 @@ <translation id="4242577469625748426">Không thể cài đặt các cài đặt chính sách trên thiết bị: <ph name="VALIDATION_ERROR" />.</translation> <translation id="4244238649050961491">Tìm thêm ứng dụng bút cảm ứng</translation> <translation id="424726838611654458">Luôn mở trong Adobe Reader</translation> +<translation id="4247274662191902962">Dữ liệu cảm biến sẽ chỉ được chia sẻ khi bạn vào trải nghiệm thực tế ảo này. Trang web này có thể tìm hiểu về bạn thông qua một số thông tin, chẳng hạn như: + - Vị trí của bạn + - Đặc điểm ngoại hình của bạn, như vị trí mắt + - Cử động của bạn, ví dụ như cách đi + + Đảm bảo bạn tin cậy trang web này trước khi cho phép truy cập.</translation> <translation id="4247901771970415646">Không thể đồng bộ hóa với <ph name="USERNAME" /></translation> <translation id="4249248555939881673">Đang chờ kết nối mạng...</translation> <translation id="4249373718504745892">Trang này đã bị chặn truy cập vào máy ảnh và micrô của bạn.</translation>
diff --git a/chrome/app/resources/generated_resources_zh-CN.xtb b/chrome/app/resources/generated_resources_zh-CN.xtb index 7dec90d..6bc200e4 100644 --- a/chrome/app/resources/generated_resources_zh-CN.xtb +++ b/chrome/app/resources/generated_resources_zh-CN.xtb
@@ -2136,6 +2136,12 @@ <translation id="4242577469625748426">无法在设备上安装策略设置:<ph name="VALIDATION_ERROR" />。</translation> <translation id="4244238649050961491">查找更多触控笔应用</translation> <translation id="424726838611654458">始终用Adobe Reader打开</translation> +<translation id="4247274662191902962">仅在您体验此 VR 时才能分享传感器数据。这可能会让网站可以使用某些信息来了解您,例如: + - 您的位置信息 + - 您的身体特征,例如眼睛位置 + - 您的动作,例如走路姿势 + + 请确保您信任此网站,然后再允许访问。</translation> <translation id="4247901771970415646">无法同步到“<ph name="USERNAME" />”</translation> <translation id="4249248555939881673">正在等待建立网络连接…</translation> <translation id="4249373718504745892">已禁止此网页使用您的摄像头和麦克风。</translation>
diff --git a/chrome/app/resources/generated_resources_zh-TW.xtb b/chrome/app/resources/generated_resources_zh-TW.xtb index d0bf7a4..a8a3462 100644 --- a/chrome/app/resources/generated_resources_zh-TW.xtb +++ b/chrome/app/resources/generated_resources_zh-TW.xtb
@@ -2142,6 +2142,12 @@ <translation id="4242577469625748426">無法在裝置上安裝政策設定:<ph name="VALIDATION_ERROR" />。</translation> <translation id="4244238649050961491">尋找其他觸控筆應用程式</translation> <translation id="424726838611654458">一律在 Adobe Reader 中開啟</translation> +<translation id="4247274662191902962">系統只會在你進入這個 VR 時分享感應器資料。網站或許可以使用特定資訊辨識你,例如: + - 你的位置 + - 你的身體特徵,例如眼睛的位置 + - 你的動作,例如走路的方式 + + 允許存取前,請確認你信任這個網站。</translation> <translation id="4247901771970415646">無法與 <ph name="USERNAME" /> 同步</translation> <translation id="4249248555939881673">正在等待網路連線...</translation> <translation id="4249373718504745892">系統已封鎖這個網頁存取你的攝影機和麥克風。</translation> @@ -5003,7 +5009,7 @@ <translation id="8678648549315280022">管理下載設定...</translation> <translation id="8678933587484842200">你希望如何啟動這個應用程式?</translation> <translation id="8680251145628383637">只要登入帳戶,你在任何裝置上都能取得自己的書籤、歷史記錄和密碼,並套用相同的設定。此外,系統還會自動讓您登入各項 Google 服務。</translation> -<translation id="8682730193597992579">已連接 <ph name="PRINTER_NAME" /> 並準備就緒</translation> +<translation id="8682730193597992579"><ph name="PRINTER_NAME" /> 已連接且準備就緒</translation> <translation id="8688579245973331962">找不到你的名稱嗎?</translation> <translation id="8688591111840995413">密碼錯誤</translation> <translation id="8688672835843460752">可用空間</translation>
diff --git a/chrome/app/resources/google_chrome_strings_ar.xtb b/chrome/app/resources/google_chrome_strings_ar.xtb index 94a14f1..c1c0f6f 100644 --- a/chrome/app/resources/google_chrome_strings_ar.xtb +++ b/chrome/app/resources/google_chrome_strings_ar.xtb
@@ -33,6 +33,7 @@ <ph name="USER_DATA_DIRECTORY" /></translation> <translation id="1698376642261615901">إن Google Chrome هو متصفح ويب يشغّل صفحات الويب والتطبيقات بسرعة خاطفة. فهذا المتصفح سريع ويتميز بالثبات وسهولة الاستخدام، ويمكنك من خلاله تصفح الويب بقدر أكبر من الأمان من خلال وجود حماية مضمنة داخله ضد البرامج الضارة والتصيّد.</translation> +<translation id="1713301662689114961">{0,plural, =1{ستتم إعادة تشغيل Chrome في غضون ساعة واحدة}zero{ستتم إعادة تشغيل Chrome في غضون # ساعة}two{ستتم إعادة تشغيل Chrome في غضون ساعتين}few{ستتم إعادة تشغيل Chrome في غضون # ساعات}many{ستتم إعادة تشغيل Chrome في غضون # ساعةً}other{ستتم إعادة تشغيل Chrome في غضون # ساعة}}</translation> <translation id="1718131156967340976">تحديد <ph name="SMALL_PRODUCT_LOGO" /> <ph name="BEGIN_BOLD" />Google Chrome<ph name="END_BOLD" /></translation> <translation id="1734234790201236882">سيحفظ Chrome كلمة المرور هذه في حسابك على Google ولن تحتاج إلى تذكُّرها.</translation> <translation id="174539241580958092">تعذر على Google Chrome مزامنة البيانات نظرًا لوجود خطأ في تسجيل الدخول.</translation> @@ -94,6 +95,7 @@ يُرجى التحقق من بريدك الإلكتروني على <ph name="ACCOUNT_EMAIL" /> للحصول على مزيد من التعليمات.</translation> <translation id="3282568296779691940">تسجيل الدخول إلى Chrome</translation> <translation id="3360895254066713204">مساعد Chrome</translation> +<translation id="3379938682270551431">{0,plural, =0{ستتم إعادة تشغيل Chrome الآن}=1{ستتم إعادة تشغيل Chrome في غضون ثانية واحدة}two{ستتم إعادة تشغيل Chrome في غضون ثانيتين}few{ستتم إعادة تشغيل Chrome في غضون # ثوان}many{ستتم إعادة تشغيل Chrome في غضون # ثانيةً}other{ستتم إعادة تشغيل Chrome في غضون # ثانية}}</translation> <translation id="3395323229510056640">الحصول على مساعدة في نظام التشغيل Chrome</translation> <translation id="3396977131400919238">حدث خطأ في نظام التشغيل أثناء عملية التثبيت. يُرجى تنزيل Google Chrome مرة أخرى.</translation> <translation id="3398288718845740432">الإخفاء في قائمة Chrome</translation> @@ -121,6 +123,7 @@ <translation id="4143243756087420366">الاسم والصورة على Chrome</translation> <translation id="4147555960264124640">إنك تسجل الدخول باستخدام حساب مُدار وتمنح المشرف إمكانية التحكم في ملفك الشخصي في Google Chrome. وسيتم ربط بيانات Chrome التابعة لك، مثل التطبيقات والإشارات المرجعية والسجلّ وكلمات المرور والإعدادات الأخرى بالمستخدم <ph name="USER_NAME" />. وستتمكن من حذف هذه البيانات عبر لوحة تحكم حسابات Google، ولكنك لن تتمكن من إقران هذه البيانات بحساب آخر. <ph name="LEARN_MORE" /></translation> <translation id="4149882025268051530">فشلت أداة المثبِّت في فك ضغط الأرشيف. يُرجى تنزيل Google Chrome مرة أخرى.</translation> +<translation id="4191857738314598978">{0,plural, =1{يجب إعادة تشغيل Chrome في غضون يوم واحد}zero{يجب إعادة تشغيل Chrome في غضون # يوم}two{يجب إعادة تشغيل Chrome في غضون يومين}few{يجب إعادة تشغيل Chrome في غضون # أيام}many{يجب إعادة تشغيل Chrome في غضون # يومًا}other{يجب إعادة تشغيل Chrome في غضون # يوم}}</translation> <translation id="424864128008805179">هل تريد تسجيل الخروج من Chrome؟</translation> <translation id="4251615635259297716">هل ترغب في ربط بياناتك في Chrome بهذا الحساب؟</translation> <translation id="4251625577313994583">الحصول على Chrome على جهاز iPhone</translation> @@ -161,6 +164,7 @@ <translation id="5251420635869119124">يمكن للضيف استخدام Chrome بدون أن يترك أي أثر وراءه.</translation> <translation id="532046782124376502">تحذير: يتعذّر على Google Chrome منع الإضافات من تسجيل سجل تصفحك. لإيقاف هذه الإضافة في وضع التصفح المتخفي، ألغِ تحديد هذا الخيار.</translation> <translation id="5386244825306882791">كما أنها تتحكم في الصفحة التي تظهر عند تشغيل Chrome أو إجراء بحث من المربع متعدد الاستخدامات.</translation> +<translation id="5394833366792865639">مشاركة علامة تبويب Chrome</translation> <translation id="5430073640787465221">ملف التفضيلات تالف أو غير صالح. يتعذر على Google Chrome استرداد إعداداتك.</translation> <translation id="5543953544073077331">هناك نُسخ أخرى من Chrome قيد التشغيل. يُرجى إغلاقها لإجراء التحديث.</translation> <translation id="556024056938947818">يحاول Google Chrome إظهار كلمات المرور.</translation> @@ -267,6 +271,7 @@ <translation id="8568392309447938879">يلزمك تسجيل الدخول إلى Chrome لتتمكن من استخدام التطبيقات. سيتيح هذا للمتصفح Chrome مزامنة تطبيقاتك والإشارات المرجعية والسجل وكلمات المرور وغير ذلك من الإعدادات على جميع الأجهزة.</translation> <translation id="8606668294522778825">قد يستخدم Google Chrome خدمات الويب لتحسين تجربة التصفح. ويمكنك بشكل اختياري إيقاف هذه الخدمات. <ph name="BEGIN_LINK" />مزيد من المعلومات<ph name="END_LINK" /></translation> <translation id="8614913330719544658">لا يستجيب Google Chrome. هل تريد إعادة التشغيل الآن؟</translation> +<translation id="8625237574518804553">{0,plural, =1{ستتم إعادة تشغيل Chrome في غضون دقيقة واحدة}zero{ستتم إعادة تشغيل Chrome في غضون # دقيقة}two{ستتم إعادة تشغيل Chrome في غضون دقيقتين}few{ستتم إعادة تشغيل Chrome في غضون # دقائق}many{ستتم إعادة تشغيل Chrome في غضون # دقيقةً}other{ستتم إعادة تشغيل Chrome في غضون # دقيقة}}</translation> <translation id="8667808506758191620">جهاز <ph name="DEVICE_TYPE" /> مُحدّث.</translation> <translation id="8669527147644353129">مساعد Google Chrome</translation> <translation id="8679801911857917785">كما أنها تتحكم في الصفحة التي تظهر عند تشغيل Chrome.</translation> @@ -278,6 +283,7 @@ <translation id="884296878221830158">كما أنها تتحكم في الصفحة التي تظهر عند تشغيل Chrome أو النقر على زر الصفحة الرئيسية.</translation> <translation id="8862326446509486874">لا تملك الحقوق الكافية للتثبيت على مستوى النظام. جرّب تشغيل المثبِّت بصفة مشرف.</translation> <translation id="8914504000324227558">إعادة تشغيل Chrome</translation> +<translation id="8999208279178790196">{0,plural, =0{يتوفر تحديث لمتصفح Chrome}=1{يتوفر تحديث لمتصفح Chrome}two{يتوفر تحديث لمتصفح Chrome منذ يومين}few{يتوفر تحديث لمتصفح Chrome منذ # أيام}many{يتوفر تحديث لمتصفح Chrome منذ # يومًا}other{يتوفر تحديث لمتصفح Chrome منذ # يوم}}</translation> <translation id="9026991721384951619">تعذر على نظام التشغيل Chrome مزامنة البيانات نظرًا لأن تفاصيل تسجيل الدخول إلى حسابك قديمة.</translation> <translation id="9067395829937117663">يتطلب متصفح Google Chrome نظام التشغيل Windows 7 أو إصدارًا أحدث.</translation> <translation id="911206726377975832">هل تريد أيضًا حذف بيانات التصفح؟</translation>
diff --git a/chrome/app/resources/google_chrome_strings_ca.xtb b/chrome/app/resources/google_chrome_strings_ca.xtb index 88a0a0f..8bb7509 100644 --- a/chrome/app/resources/google_chrome_strings_ca.xtb +++ b/chrome/app/resources/google_chrome_strings_ca.xtb
@@ -121,7 +121,7 @@ <translation id="4143243756087420366">Nom i foto de Chrome</translation> <translation id="4147555960264124640">Esteu a punt d'iniciar la sessió amb un compte gestionat i d'atorgar el control del vostre perfil de Google Chrome a l'administrador corresponent. Les vostres dades de Chrome, com ara aplicacions, adreces d'interès, historial, contrasenyes i altres opcions, s'enllaçaran permanentment amb <ph name="USER_NAME" />. Podreu suprimir aquestes dades mitjançant el tauler de control de comptes de Google, però no les podreu associar amb un altre compte. <ph name="LEARN_MORE" /></translation> <translation id="4149882025268051530">L'instal·lador no ha pogut descomprimir el fitxer. Torna a baixar Google Chrome.</translation> -<translation id="4191857738314598978">{0,plural, =1{Reinicia Chrome en un termini d'1 dia}other{Reinicia Chrome en un termini de # dies}}</translation> +<translation id="4191857738314598978">{0,plural, =1{Reinicia Chrome en 1 dia}other{Reinicia Chrome en # dies}}</translation> <translation id="424864128008805179">Vols tancar la sessió de Chrome?</translation> <translation id="4251615635259297716">Voleu enllaçar les vostres dades de Chrome amb aquest compte?</translation> <translation id="4251625577313994583">baixa Chrome al dispositiu iPhone</translation>
diff --git a/chrome/app/resources/google_chrome_strings_es-419.xtb b/chrome/app/resources/google_chrome_strings_es-419.xtb index 7179c83..3b526f6fe 100644 --- a/chrome/app/resources/google_chrome_strings_es-419.xtb +++ b/chrome/app/resources/google_chrome_strings_es-419.xtb
@@ -121,7 +121,7 @@ <translation id="4143243756087420366">Nombre y foto de Chrome</translation> <translation id="4147555960264124640">Estás por acceder con una cuenta administrada, lo que significa que proporcionarás al administrador el control sobre tu perfil de Google Chrome. Tus datos de Google Chrome, como las aplicaciones, los favoritos, el historial, las contraseñas y otros parámetros de configuración quedarán vinculados a <ph name="USER_NAME" /> de forma permanente. Podrás eliminar estos datos a través del Panel de control de Cuentas de Google, pero no podrás asociarlos a otra cuenta. <ph name="LEARN_MORE" /></translation> <translation id="4149882025268051530">El instalador no pudo descomprimir el archivo. Descargue Google Chrome nuevamente.</translation> -<translation id="4191857738314598978">{0,plural, =1{Reinicia Chrome en el transcurso de día}other{Reinicia Chrome en el transcurso de # días}}</translation> +<translation id="4191857738314598978">{0,plural, =1{Reinicia Chrome en el transcurso de 1 día}other{Reinicia Chrome en el transcurso de # días}}</translation> <translation id="424864128008805179">¿Quieres salir de Chrome?</translation> <translation id="4251615635259297716">¿Quieres vincular tus datos de Google Chrome con esta cuenta?</translation> <translation id="4251625577313994583">obtener Chrome para tu iPhone</translation>
diff --git a/chrome/app/resources/google_chrome_strings_es.xtb b/chrome/app/resources/google_chrome_strings_es.xtb index 2d0b5af..b07b85c9d 100644 --- a/chrome/app/resources/google_chrome_strings_es.xtb +++ b/chrome/app/resources/google_chrome_strings_es.xtb
@@ -35,7 +35,7 @@ <ph name="USER_DATA_DIRECTORY" /></translation> <translation id="1698376642261615901">Google Chrome es un navegador web que ejecuta aplicaciones y páginas web a gran velocidad. Es rápido, estable y fácil de utilizar. Navega por la Web de forma más segura gracias a la protección integrada contra suplantación de identidad y software malicioso.</translation> -<translation id="1713301662689114961">{0,plural, =1{Chrome se reiniciará dentro de 1 hora}other{Chrome se reiniciará dentro de # horas}}</translation> +<translation id="1713301662689114961">{0,plural, =1{Chrome se reiniciará en el transcurso de 1 hora}other{Chrome se reiniciará en el transcurso de # horas}}</translation> <translation id="1718131156967340976">Selecciona <ph name="BEGIN_BOLD" />Google Chrome<ph name="END_BOLD" /> <ph name="SMALL_PRODUCT_LOGO" /></translation> <translation id="1734234790201236882">Chrome guardará esta contraseña en tu cuenta de Google para que no tengas que recordarla.</translation> <translation id="174539241580958092">Google Chrome no ha podido sincronizar los datos debido a un error de inicio de sesión.</translation> @@ -97,7 +97,7 @@ Consulta tu correo electrónico (<ph name="ACCOUNT_EMAIL" />) para obtener más información.</translation> <translation id="3282568296779691940">Iniciar sesión en Chrome</translation> <translation id="3360895254066713204">Ayudante de Chrome</translation> -<translation id="3379938682270551431">{0,plural, =0{Chrome se reiniciará ahora}=1{Chrome se reiniciará dentro de 1 segundo}other{Chrome se reiniciará dentro de # segundos}}</translation> +<translation id="3379938682270551431">{0,plural, =0{Chrome se reiniciará ahora}=1{Chrome se reiniciará en el transcurso de 1 segundo}other{Chrome se reiniciará en el transcurso de # segundos}}</translation> <translation id="3395323229510056640">Obtener ayuda de Chrome OS</translation> <translation id="3396977131400919238">Se ha producido un error de sistema operativo durante el proceso de instalación. Vuelve a descargar Google Chrome.</translation> <translation id="3398288718845740432">Ocultar en el menú de Chrome</translation> @@ -125,7 +125,7 @@ <translation id="4143243756087420366">Nombre y foto de Chrome</translation> <translation id="4147555960264124640">Vas a iniciar sesión con una cuenta gestionada, lo que significa que proporcionarás a su administrador control sobre tu perfil de Google Chrome. Tus datos de Chrome como, por ejemplo, tus aplicaciones, tus marcadores, tu historial, tus contraseñas y otras opciones se vincularán de forma permanente a la cuenta <ph name="USER_NAME" />. Podrás eliminar estos datos a través del Panel de control de cuentas de Google, pero no podrás asociar estos datos a otra cuenta. <ph name="LEARN_MORE" /></translation> <translation id="4149882025268051530">El programa de instalación no ha podido descomprimir el archivo. Vuelve a descargar Google Chrome.</translation> -<translation id="4191857738314598978">{0,plural, =1{Reiniciar Chrome dentro de 1 día}other{Reiniciar Chrome dentro de # días}}</translation> +<translation id="4191857738314598978">{0,plural, =1{Reiniciar Chrome en el transcurso de 1 día}other{Reiniciar Chrome en el transcurso de # días}}</translation> <translation id="424864128008805179">¿Quieres cerrar sesión en Chrome?</translation> <translation id="4251615635259297716">¿Quieres vincular tus datos de Chrome a esta cuenta?</translation> <translation id="4251625577313994583">descarga Chrome en tu iPhone</translation> @@ -275,7 +275,7 @@ <translation id="8568392309447938879">Para usar las aplicaciones, debes iniciar sesión en Chrome. De ese modo, Chrome podrá sincronizar tus aplicaciones, tus marcadores, tu historial, tus contraseñas y otras opciones en distintos dispositivos.</translation> <translation id="8606668294522778825">Google Chrome puede utilizar servicios web para mejorar tu experiencia de navegación. Puedes habilitar o inhabilitar estos servicios. <ph name="BEGIN_LINK" />Más información<ph name="END_LINK" /></translation> <translation id="8614913330719544658">Google Chrome no responde. ¿Quieres reiniciarlo ahora?</translation> -<translation id="8625237574518804553">{0,plural, =1{Chrome se reiniciará dentro de 1 minuto}other{Chrome se reiniciará dentro de # minutos}}</translation> +<translation id="8625237574518804553">{0,plural, =1{Chrome se reiniciará en el transcurso de 1 minuto}other{Chrome se reiniciará en el transcurso de # minutos}}</translation> <translation id="8667808506758191620">El dispositivo <ph name="DEVICE_TYPE" /> está actualizado.</translation> <translation id="8669527147644353129">Ayudante de Google Chrome</translation> <translation id="8679801911857917785">También controla qué página se muestra al iniciar Chrome.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_hi.xtb b/chrome/app/resources/google_chrome_strings_hi.xtb index 02df511..84a2247 100644 --- a/chrome/app/resources/google_chrome_strings_hi.xtb +++ b/chrome/app/resources/google_chrome_strings_hi.xtb
@@ -31,7 +31,7 @@ <translation id="1674870198290878346">Chrome गु&प्त विंडो में लिंक खोलें</translation> <translation id="1682634494516646069">Google Chrome अपनी डेटा निर्देशिका को पढ़ और उस पर लिख नहीं सकता :\n\n<ph name="USER_DATA_DIRECTORY" /></translation> <translation id="1698376642261615901">Google Chrome एक ऐसा वेब ब्राउज़र है, जो वेब पेज और ऐप्स को बिजली की गति से चलाता है. यह तेज़, स्थिर, और उपयोग में आसान है. Google Chrome में अंतर्निहित मैलवेयर और फ़िशिंग सुरक्षा के साथ ज़्यादा सुरक्षित रूप से वेब ब्राउज़ करें.</translation> -<translation id="1713301662689114961">{0,plural, =1{Chrome एक घंटे में फिर से लॉन्च होगा}one{Chrome # घंटों में फिर से लॉन्च होगा}other{Chrome # घंटों में फिर से लॉन्च होगा}}</translation> +<translation id="1713301662689114961">{0,plural, =1{Chrome एक घंटे में फिर से लॉन्च होगा}one{Chrome # घंटे में फिर से लॉन्च होगा}other{Chrome # घंटे में फिर से लॉन्च होगा}}</translation> <translation id="1718131156967340976"><ph name="SMALL_PRODUCT_LOGO" /> <ph name="BEGIN_BOLD" />Google Chrome<ph name="END_BOLD" /> चुनें</translation> <translation id="1734234790201236882">Chrome इस पासवर्ड को आपके Google खाते में सेव कर लेगा. आपको इसे याद रखने की ज़रूरत नहीं है.</translation> <translation id="174539241580958092">प्रवेश करने में गड़बड़ी के कारण Google Chrome आपका डेटा समन्वयित नहीं कर सका.</translation> @@ -93,7 +93,7 @@ कृपया अतिरिक्त निर्देशों के लिए <ph name="ACCOUNT_EMAIL" /> पर अपना ईमेल देखें.</translation> <translation id="3282568296779691940">Chrome में साइन इन करें</translation> <translation id="3360895254066713204">Chrome सहायक</translation> -<translation id="3379938682270551431">{0,plural, =0{अब Chrome फिर से लॉन्च होगा}=1{Chrome 1 सेकंड में फिर से लॉन्च होगा}one{Chrome # सेकंड में फिर से लॉन्च होगा}other{Chrome # सेकंड में फिर से लॉन्च होगा}}</translation> +<translation id="3379938682270551431">{0,plural, =0{Chrome अभी फिर से लॉन्च होगा}=1{Chrome 1 सेकंड में फिर से लॉन्च होगा}one{Chrome # सेकंड में फिर से लॉन्च होगा}other{Chrome # सेकंड में फिर से लॉन्च होगा}}</translation> <translation id="3395323229510056640">Chrome OS में सहायता प्राप्त करें</translation> <translation id="3396977131400919238">स्थापित करने के दौरान ऑपरेटिंग सिस्टम में गड़बड़ी आई. कृपया Google Chrome फिर से डाउनलोड करें.</translation> <translation id="3398288718845740432">Chrome मेन्यू में छिपाएं</translation> @@ -143,7 +143,7 @@ <translation id="4750550185319565338"><ph name="PLUGIN_NAME" /> चालू करने के लिए Chrome को रीस्टार्ट करें</translation> <translation id="4754614261631455953">Google Chrome Canary (mDNS-In)</translation> <translation id="4771048833395599659">यह फ़ाइल खतरनाक हो सकती है, इसलिए Chrome ने इसे रोक दिया है.</translation> -<translation id="479167709087336770">इसमें स्पेलिंग जाँचने वाली उसी सुविधा का इस्तेमाल होता है जिसका इस्तेमाल 'Google सर्च' में किया जाता है. आप ब्राउज़र में जो भी लेख लिखते हैं उसे Google को भेजा जाता है. आप सेटिंग में जाकर इसे कभी भी बदल सकते हैं.</translation> +<translation id="479167709087336770">इसमें स्पेलिंग जाँचने वाली उसी सुविधा का इस्तेमाल होता है जिसका इस्तेमाल 'Google सर्च' में किया जाता है. आप ब्राउज़र में जो भी लेख लिखते हैं उसे Google को भेजा जाता है. आप 'सेटिंग' में जाकर इसे कभी भी बदल सकते हैं.</translation> <translation id="4891791193823137474">Google Chrome को पृष्ठभूमि में चलने दें</translation> <translation id="4895437082222824641">नए Chrome &टैब में लिंक खोलें</translation> <translation id="4921569541910214635">कंप्यूटर शेयर करते हैं? अब आप Chrome जैसा चाहें वैसा सेट कर सकते हैं.</translation> @@ -271,7 +271,7 @@ <translation id="8568392309447938879">ऐप्स का उपयोग करने के लिए आपको Chrome में प्रवेश किए हुए रहना होगा. इससे Chrome को सभी डिवाइस में मौजूद आपके ऐप्स, बुकमार्क, इतिहास, पासवर्ड और अन्य सेटिंग समन्वयित करने की अनुमति मिल जाती है.</translation> <translation id="8606668294522778825">आपके ब्राउज़िंग अनुभव को बेहतर बनाने के लिए Google Chrome, वेब सेवाओं का इस्तेमाल कर सकता है. आप चाहें तो इन सेवाओं को बंद करने का विकल्प चुन सकते हैं. <ph name="BEGIN_LINK" />ज़्यादा जानें<ph name="END_LINK" /></translation> <translation id="8614913330719544658">Google Chrome निष्क्रिय है. अभी फिर से लॉन्च करें?</translation> -<translation id="8625237574518804553">{0,plural, =1{Chrome 1 मिनट में फिर से लॉन्च होगा}one{Chrome # मिनटों में फिर से लॉन्च होगा}other{Chrome # मिनटों में फिर से लॉन्च होगा}}</translation> +<translation id="8625237574518804553">{0,plural, =1{Chrome 1 मिनट में फिर से लॉन्च होगा}one{Chrome # मिनट में फिर से लॉन्च होगा}other{Chrome # मिनट में फिर से लॉन्च होगा}}</translation> <translation id="8667808506758191620">आपका <ph name="DEVICE_TYPE" /> अद्यतित है.</translation> <translation id="8669527147644353129">Google Chrome सहायक</translation> <translation id="8679801911857917785">इससे यह भी नियंत्रित होता है कि जब आप Chrome प्रारंभ करते हैं तब कौन सा पेज दिखाया जाए.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_ml.xtb b/chrome/app/resources/google_chrome_strings_ml.xtb index dd72a93..9bc48283 100644 --- a/chrome/app/resources/google_chrome_strings_ml.xtb +++ b/chrome/app/resources/google_chrome_strings_ml.xtb
@@ -287,7 +287,7 @@ <translation id="884296878221830158">നിങ്ങൾ Chrome ആരംഭിയ്ക്കുമ്പോഴോ ഹോം ബട്ടൺ ക്ലിക്ക് ചെയ്യുമ്പോഴോ ഏത് പേജാണ് കാണിക്കേണ്ടതെന്നും അത് നിയന്ത്രിയ്ക്കുന്നു.</translation> <translation id="8862326446509486874">സിസ്റ്റം-ലെവല് ഇന്സ്റ്റാള് ചെയ്യുന്നതിന് നിങ്ങള്ക്ക് ഉചിതമായ അവകാശങ്ങളില്ല. അഡ്മിനിസ്ട്രേറ്ററായി ഇന്സ്റ്റാളര് പ്രവര്ത്തിപ്പിക്കാന് വീണ്ടും ശ്രമിക്കൂ.</translation> <translation id="8914504000324227558">Chrome വീണ്ടും സമാരംഭിക്കുക</translation> -<translation id="8999208279178790196">{0,plural, =0{ഒരു Chrome അപ്ഡേറ്റ് ലഭ്യമാണ്}=1{ഒരു Chrome അപ്ഡേറ്റ് ലഭ്യമാണ്}other{# ദിവസത്തേക്ക് ഒരു Chrome അപ്ഡേറ്റ് ലഭ്യമാണ്}}</translation> +<translation id="8999208279178790196">{0,plural, =0{Chrome-നൊരു അപ്ഡേറ്റ് ലഭ്യമാണ്}=1{Chrome-നൊരു അപ്ഡേറ്റ് ലഭ്യമാണ്}other{# ദിവസമായി Chrome-നൊരു അപ്ഡേറ്റ് ലഭ്യമാണ്}}</translation> <translation id="9026991721384951619">നിങ്ങളുടെ അക്കൗണ്ടിന്റെ സൈൻ ഇൻ വിശദാംശങ്ങൾ കാലഹരണപ്പെട്ടതിനാൽ Chrome OS-ന് നിങ്ങളുടെ ഡാറ്റ സമന്വയിപ്പിക്കാനായില്ല.</translation> <translation id="9067395829937117663">Google Chrome-ന് Windows 7 അല്ലെങ്കിൽ അതിനുശേഷമുള്ള പതിപ്പ് ആവശ്യമാണ്.</translation> <translation id="911206726377975832">നിങ്ങളുടെ ബ്രൌസിംഗ് ഡാറ്റയും ഇതോടൊപ്പം ഇല്ലാതാക്കണോ?</translation>
diff --git a/chrome/app/settings_strings.grdp b/chrome/app/settings_strings.grdp index c58223d4..45ab61c 100644 --- a/chrome/app/settings_strings.grdp +++ b/chrome/app/settings_strings.grdp
@@ -2537,16 +2537,9 @@ </message> <!-- Languages Page --> - <if expr="chromeos"> - <message name="IDS_SETTINGS_LANGUAGES_PAGE_TITLE" desc="Name of the settings page which displays language and input method preferences."> - Languages and input - </message> - </if> - <if expr="not chromeos"> - <message name="IDS_SETTINGS_LANGUAGES_PAGE_TITLE" desc="Name of the settings page which displays language preferences."> - Languages - </message> - </if> + <message name="IDS_SETTINGS_LANGUAGES_PAGE_TITLE" desc="Name of the settings page which displays language preferences."> + Languages + </message> <message name="IDS_SETTINGS_LANGUAGES_LANGUAGES_LIST_TITLE" desc="Title for the currently used language in the header for the collapsible list of languages."> Language </message>
diff --git a/chrome/browser/BUILD.gn b/chrome/browser/BUILD.gn index bea5fd6..9a7638c 100644 --- a/chrome/browser/BUILD.gn +++ b/chrome/browser/BUILD.gn
@@ -373,18 +373,8 @@ "data_reduction_proxy/data_reduction_proxy_chrome_settings_factory.h", "data_reduction_proxy/data_reduction_proxy_tab_helper.cc", "data_reduction_proxy/data_reduction_proxy_tab_helper.h", - "data_use_measurement/chrome_data_use_ascriber.cc", - "data_use_measurement/chrome_data_use_ascriber.h", - "data_use_measurement/chrome_data_use_ascriber_service.cc", - "data_use_measurement/chrome_data_use_ascriber_service.h", - "data_use_measurement/chrome_data_use_ascriber_service_factory.cc", - "data_use_measurement/chrome_data_use_ascriber_service_factory.h", "data_use_measurement/chrome_data_use_measurement.cc", "data_use_measurement/chrome_data_use_measurement.h", - "data_use_measurement/chrome_data_use_recorder.cc", - "data_use_measurement/chrome_data_use_recorder.h", - "data_use_measurement/data_use_web_contents_observer.cc", - "data_use_measurement/data_use_web_contents_observer.h", "defaults.cc", "defaults.h", "dom_distiller/dom_distiller_service_factory.cc", @@ -1899,7 +1889,6 @@ "//components/data_reduction_proxy/content/browser", "//components/data_reduction_proxy/content/common", "//components/data_reduction_proxy/core/browser", - "//components/data_use_measurement/content", "//components/data_use_measurement/core:ascriber", "//components/device_event_log", "//components/dom_distiller/content/browser", @@ -3886,6 +3875,8 @@ "profiles/avatar_menu_actions_desktop.h", "profiles/avatar_menu_desktop.cc", "profiles/avatar_menu_observer.h", + "profiles/profile_activity_metrics_recorder.cc", + "profiles/profile_activity_metrics_recorder.h", "profiles/profile_list.h", "profiles/profile_list_desktop.cc", "profiles/profile_list_desktop.h",
diff --git a/chrome/browser/DEPS b/chrome/browser/DEPS index 93c5623..cd7a488 100644 --- a/chrome/browser/DEPS +++ b/chrome/browser/DEPS
@@ -90,6 +90,7 @@ "+services/resource_coordinator/public/mojom", "+services/shape_detection/public/mojom", "+services/strings", + "+services/tracing/public/cpp", "+services/video_capture/public", "+services/viz/privileged", "+services/viz/public/interfaces",
diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc index e12102d..89ae12f 100644 --- a/chrome/browser/about_flags.cc +++ b/chrome/browser/about_flags.cc
@@ -2939,12 +2939,6 @@ FEATURE_VALUE_TYPE(features::kViewsCastDialog)}, #endif // defined(TOOLKIT_VIEWS) - {"SupervisedUserCommittedInterstitials", - flag_descriptions::kSupervisedUserCommittedInterstitialsName, - flag_descriptions::kSupervisedUserCommittedInterstitialsDescription, - kOsAll, - FEATURE_VALUE_TYPE(features::kSupervisedUserCommittedInterstitials)}, - #if defined(OS_ANDROID) {"enable-horizontal-tab-switcher", flag_descriptions::kHorizontalTabSwitcherAndroidName, @@ -3909,6 +3903,12 @@ flag_descriptions::kEvDetailsInPageInfoDescription, kOsDesktop, FEATURE_VALUE_TYPE(features::kEvDetailsInPageInfo)}, + {"enable-autofill-credit-card-upload-feedback", + flag_descriptions::kEnableAutofillCreditCardUploadFeedbackName, + flag_descriptions::kEnableAutofillCreditCardUploadFeedbackDescription, + kOsWin | kOsMac | kOsLinux, + FEATURE_VALUE_TYPE(autofill::features::kAutofillCreditCardUploadFeedback)}, + // NOTE: Adding a new flag requires adding a corresponding entry to enum // "LoginCustomFlags" in tools/metrics/histograms/enums.xml. See "Flag // Histograms" in tools/metrics/histograms/README.md (run the
diff --git a/chrome/browser/android/chrome_feature_list.cc b/chrome/browser/android/chrome_feature_list.cc index 87b90cb..20a48aa 100644 --- a/chrome/browser/android/chrome_feature_list.cc +++ b/chrome/browser/android/chrome_feature_list.cc
@@ -210,6 +210,7 @@ &omnibox::kUIExperimentShowSuggestionFavicons, &password_manager::features::kGooglePasswordManager, &password_manager::features::kPasswordsKeyboardAccessory, + &password_manager::features::kTouchToFillAndroid, &safe_browsing::kCaptureSafetyNetId, &signin::kMiceFeature, &switches::kSyncSendTabToSelf,
diff --git a/chrome/browser/android/compositor/scene_layer/tab_list_scene_layer.cc b/chrome/browser/android/compositor/scene_layer/tab_list_scene_layer.cc index 31eac39..c6ac06f 100644 --- a/chrome/browser/android/compositor/scene_layer/tab_list_scene_layer.cc +++ b/chrome/browser/android/compositor/scene_layer/tab_list_scene_layer.cc
@@ -203,7 +203,8 @@ void TabListSceneLayer::PutBackgroundLayer( JNIEnv* env, const base::android::JavaParamRef<jobject>& jobj, - jint resource_id) { + jint resource_id, + jfloat alpha) { int ui_resource_id = resource_manager_->GetUIResourceId( ui::ANDROID_RESOURCE_TYPE_DYNAMIC, resource_id); if (ui_resource_id == 0) @@ -221,6 +222,7 @@ ->GetResource(ui::ANDROID_RESOURCE_TYPE_DYNAMIC, resource_id) ->size(); background_layer_->SetBounds(size); + background_layer_->SetOpacity(alpha); } void TabListSceneLayer::OnDetach() {
diff --git a/chrome/browser/android/compositor/scene_layer/tab_list_scene_layer.h b/chrome/browser/android/compositor/scene_layer/tab_list_scene_layer.h index c4ea30b..dda6671 100644 --- a/chrome/browser/android/compositor/scene_layer/tab_list_scene_layer.h +++ b/chrome/browser/android/compositor/scene_layer/tab_list_scene_layer.h
@@ -110,7 +110,8 @@ void PutBackgroundLayer(JNIEnv* env, const base::android::JavaParamRef<jobject>& jobj, - jint resource_id); + jint resource_id, + jfloat alpha); void OnDetach() override; bool ShouldShowBackground() override;
diff --git a/chrome/browser/android/compositor/tab_content_manager.cc b/chrome/browser/android/compositor/tab_content_manager.cc index 2f67f7b..e9e0bc10 100644 --- a/chrome/browser/android/compositor/tab_content_manager.cc +++ b/chrome/browser/android/compositor/tab_content_manager.cc
@@ -115,13 +115,15 @@ jint approximation_cache_size, jint compression_queue_max_size, jint write_queue_max_size, - jboolean use_approximation_thumbnail) + jboolean use_approximation_thumbnail, + jboolean save_jpeg_thumbnails) : weak_java_tab_content_manager_(env, obj), weak_factory_(this) { thumbnail_cache_ = std::make_unique<ThumbnailCache>( static_cast<size_t>(default_cache_size), static_cast<size_t>(approximation_cache_size), static_cast<size_t>(compression_queue_max_size), - static_cast<size_t>(write_queue_max_size), use_approximation_thumbnail); + static_cast<size_t>(write_queue_max_size), use_approximation_thumbnail, + save_jpeg_thumbnails); thumbnail_cache_->AddThumbnailCacheObserver(this); } @@ -435,11 +437,12 @@ jint approximation_cache_size, jint compression_queue_max_size, jint write_queue_max_size, - jboolean use_approximation_thumbnail) { + jboolean use_approximation_thumbnail, + jboolean save_jpeg_thumbnails) { TabContentManager* manager = new TabContentManager( env, obj, default_cache_size, approximation_cache_size, compression_queue_max_size, write_queue_max_size, - use_approximation_thumbnail); + use_approximation_thumbnail, save_jpeg_thumbnails); return reinterpret_cast<intptr_t>(manager); }
diff --git a/chrome/browser/android/compositor/tab_content_manager.h b/chrome/browser/android/compositor/tab_content_manager.h index 96c54bf..396699ef 100644 --- a/chrome/browser/android/compositor/tab_content_manager.h +++ b/chrome/browser/android/compositor/tab_content_manager.h
@@ -45,7 +45,8 @@ jint approximation_cache_size, jint compression_queue_max_size, jint write_queue_max_size, - jboolean use_approximation_thumbnail); + jboolean use_approximation_thumbnail, + jboolean save_jpeg_thumbnails); virtual ~TabContentManager();
diff --git a/chrome/browser/android/preferences/prefs.h b/chrome/browser/android/preferences/prefs.h index 5c58b0f4..a71d5f3 100644 --- a/chrome/browser/android/preferences/prefs.h +++ b/chrome/browser/android/preferences/prefs.h
@@ -36,7 +36,6 @@ AUTOFILL_CREDIT_CARD_ENABLED, USAGE_STATS_ENABLED, OFFLINE_PREFETCH_USER_SETTING_ENABLED, - CONTENT_SUGGESTIONS_NOTIFICATIONS_ENABLED, // PREF_NUM_PREFS must be the last entry. PREF_NUM_PREFS }; @@ -64,7 +63,6 @@ autofill::prefs::kAutofillCreditCardEnabled, prefs::kUsageStatsEnabled, offline_pages::prefetch_prefs::kUserSettingEnabled, - offline_pages::prefetch_prefs::kContentSuggestionsNotificationsEnabled, }; #endif // CHROME_BROWSER_ANDROID_PREFERENCES_PREFS_H_
diff --git a/chrome/browser/android/preferences/prefs_unittest.cc b/chrome/browser/android/preferences/prefs_unittest.cc index c590bf2..ab2e406 100644 --- a/chrome/browser/android/preferences/prefs_unittest.cc +++ b/chrome/browser/android/preferences/prefs_unittest.cc
@@ -62,9 +62,6 @@ EXPECT_EQ(prefs::kUsageStatsEnabled, GetPrefName(USAGE_STATS_ENABLED)); EXPECT_EQ(offline_pages::prefetch_prefs::kUserSettingEnabled, GetPrefName(OFFLINE_PREFETCH_USER_SETTING_ENABLED)); - EXPECT_EQ( - offline_pages::prefetch_prefs::kContentSuggestionsNotificationsEnabled, - GetPrefName(CONTENT_SUGGESTIONS_NOTIFICATIONS_ENABLED)); // If this check fails, a pref is missing a test case above. EXPECT_EQ(Pref::PREF_NUM_PREFS, pref_count_);
diff --git a/chrome/browser/android/thumbnail/thumbnail_cache.cc b/chrome/browser/android/thumbnail/thumbnail_cache.cc index 0594fa3..8085a57 100644 --- a/chrome/browser/android/thumbnail/thumbnail_cache.cc +++ b/chrome/browser/android/thumbnail/thumbnail_cache.cc
@@ -23,6 +23,7 @@ #include "content/public/browser/browser_task_traits.h" #include "content/public/browser/browser_thread.h" #include "gpu/command_buffer/service/gpu_switches.h" +#include "skia/ext/image_operations.h" #include "third_party/android_opengl/etc1/etc1.h" #include "third_party/skia/include/core/SkBitmap.h" #include "third_party/skia/include/core/SkCanvas.h" @@ -32,6 +33,7 @@ #include "ui/android/resources/ui_resource_provider.h" #include "ui/display/display.h" #include "ui/display/screen.h" +#include "ui/gfx/codec/jpeg_codec.h" #include "ui/gfx/geometry/size_conversions.h" namespace { @@ -123,12 +125,14 @@ size_t approximation_cache_size, size_t compression_queue_max_size, size_t write_queue_max_size, - bool use_approximation_thumbnail) + bool use_approximation_thumbnail, + bool save_jpeg_thumbnails) : file_sequenced_task_runner_( base::CreateSequencedTaskRunnerWithTraits({base::MayBlock()})), compression_queue_max_size_(compression_queue_max_size), write_queue_max_size_(write_queue_max_size), use_approximation_thumbnail_(use_approximation_thumbnail), + save_jpeg_thumbnails_(save_jpeg_thumbnails), compression_tasks_count_(0), write_tasks_count_(0), read_in_progress_(false), @@ -191,8 +195,7 @@ // Vulkan does not yet support compressed texture uploads. Disable compression // and approximation when in experimental Vulkan mode. // TODO(ericrk): Remove this restriction. https://crbug.com/906794 - if (base::CommandLine::ForCurrentProcess()->HasSwitch( - switches::kEnableVulkan)) { + if (base::CommandLine::ForCurrentProcess()->HasSwitch(switches::kUseVulkan)) { return; } @@ -264,6 +267,10 @@ return path.Append(base::NumberToString(tab_id)); } +base::FilePath ThumbnailCache::GetJpegFilePath(TabId tab_id) { + return GetFilePath(tab_id).AddExtension(".jpeg"); +} + bool ThumbnailCache::CheckAndUpdateThumbnailMetaData(TabId tab_id, const GURL& url) { base::Time current_time = base::Time::Now(); @@ -352,6 +359,9 @@ base::FilePath file_path = GetFilePath(tab_id); if (base::PathExists(file_path)) base::DeleteFile(file_path, false); + base::FilePath jpeg_file_path = GetJpegFilePath(tab_id); + if (base::PathExists(jpeg_file_path)) + base::DeleteFile(jpeg_file_path, false); } void ThumbnailCache::WriteThumbnailIfNecessary( @@ -372,6 +382,23 @@ content_size, post_write_task)); } +void ThumbnailCache::WriteJpegThumbnailIfNecessary( + TabId tab_id, + std::vector<uint8_t> compressed_data) { + if (compressed_data.empty()) + return; + if (write_tasks_count_ >= write_queue_max_size_) + return; + + write_tasks_count_++; + + base::Callback<void()> post_write_task = + base::Bind(&ThumbnailCache::PostWriteTask, weak_factory_.GetWeakPtr()); + file_sequenced_task_runner_->PostTask( + FROM_HERE, base::BindOnce(&ThumbnailCache::WriteJpegTask, tab_id, + std::move(compressed_data), post_write_task)); +} + void ThumbnailCache::CompressThumbnailIfNecessary( TabId tab_id, const base::Time& time_stamp, @@ -401,6 +428,19 @@ base::TaskShutdownBehavior::CONTINUE_ON_SHUTDOWN}, base::BindOnce(&ThumbnailCache::CompressionTask, bitmap, encoded_size, post_compression_task)); + + if (save_jpeg_thumbnails_) { + base::Callback<void(std::vector<uint8_t>)> post_jpeg_compression_task = + base::Bind(&ThumbnailCache::WriteJpegThumbnailIfNecessary, + weak_factory_.GetWeakPtr(), tab_id); + + base::PostTaskWithTraits( + FROM_HERE, + {base::TaskPriority::BEST_EFFORT, + base::TaskShutdownBehavior::CONTINUE_ON_SHUTDOWN}, + base::BindOnce(&ThumbnailCache::JpegProcessingTask, bitmap, + post_jpeg_compression_task)); + } } void ThumbnailCache::ReadNextThumbnail() { @@ -570,6 +610,32 @@ post_write_task); } +void ThumbnailCache::WriteJpegTask( + TabId tab_id, + std::vector<uint8_t> compressed_data, + const base::Callback<void()>& post_write_task) { + DCHECK(!compressed_data.empty()); + + base::FilePath file_path = GetJpegFilePath(tab_id); + base::File file(file_path, + base::File::FLAG_CREATE_ALWAYS | base::File::FLAG_WRITE); + + bool success = file.IsValid(); + if (success) { + int bytes_written = + file.Write(0, reinterpret_cast<const char*>(compressed_data.data()), + compressed_data.size()); + success &= bytes_written == static_cast<int>(compressed_data.size()); + file.Close(); + } + + if (!success) + base::DeleteFile(file_path, false); + + base::PostTaskWithTraits(FROM_HERE, {content::BrowserThread::UI}, + post_write_task); +} + void ThumbnailCache::PostWriteTask() { write_tasks_count_--; } @@ -620,6 +686,33 @@ content_size)); } +void ThumbnailCache::JpegProcessingTask( + SkBitmap bitmap, + const base::Callback<void(std::vector<uint8_t>)>& post_processing_task) { + // In portrait mode, we want to show thumbnails in squares. + // Therefore, the thumbnail saved in portrait mode needs to be cropped to + // a square, or it would be vertically center-aligned, and the top would + // be hidden. + // It's fine to horizontally center-align thumbnail saved in landscape + // mode. + int scale = 2; + SkIRect dest_subset = {0, 0, bitmap.width() / scale, + std::min(bitmap.width(), bitmap.height()) / scale}; + SkBitmap result_bitmap = skia::ImageOperations::Resize( + bitmap, skia::ImageOperations::RESIZE_BETTER, bitmap.width() / scale, + bitmap.height() / scale, dest_subset); + + constexpr int kCompressionQuality = 97; + std::vector<uint8_t> data; + const bool result = + gfx::JPEGCodec::Encode(result_bitmap, kCompressionQuality, &data); + DCHECK(result); + + base::PostTaskWithTraits( + FROM_HERE, {content::BrowserThread::UI}, + base::BindOnce(post_processing_task, std::move(data))); +} + void ThumbnailCache::PostCompressionTask( TabId tab_id, const base::Time& time_stamp,
diff --git a/chrome/browser/android/thumbnail/thumbnail_cache.h b/chrome/browser/android/thumbnail/thumbnail_cache.h index 529be1b..acaa935 100644 --- a/chrome/browser/android/thumbnail/thumbnail_cache.h +++ b/chrome/browser/android/thumbnail/thumbnail_cache.h
@@ -47,7 +47,8 @@ size_t approximation_cache_size, size_t compression_queue_max_size, size_t write_queue_max_size, - bool use_approximation_thumbnail); + bool use_approximation_thumbnail, + bool save_jpeg_thumbnails); ~ThumbnailCache() override; @@ -77,6 +78,7 @@ void InvalidateCachedThumbnail(Thumbnail* thumbnail) override; static base::FilePath GetCacheDirectory(); static base::FilePath GetFilePath(TabId tab_id); + static base::FilePath GetJpegFilePath(TabId tab_id); private: class ThumbnailMetaData { @@ -100,6 +102,8 @@ sk_sp<SkPixelRef> compressed_data, float scale, const gfx::Size& content_size); + void WriteJpegThumbnailIfNecessary(TabId tab_id, + std::vector<uint8_t> compressed_data); void CompressThumbnailIfNecessary(TabId tab_id, const base::Time& time_stamp, const SkBitmap& bitmap, @@ -112,12 +116,18 @@ float scale, const gfx::Size& content_size, const base::Callback<void()>& post_write_task); + static void WriteJpegTask(TabId tab_id, + std::vector<uint8_t> compressed_data, + const base::Callback<void()>& post_write_task); void PostWriteTask(); static void CompressionTask( SkBitmap raw_data, gfx::Size encoded_size, const base::Callback<void(sk_sp<SkPixelRef>, const gfx::Size&)>& post_compression_task); + static void JpegProcessingTask( + SkBitmap bitmap, + const base::Callback<void(std::vector<uint8_t>)>& post_processing_task); void PostCompressionTask(TabId tab_id, const base::Time& time_stamp, float scale, @@ -152,6 +162,7 @@ const size_t compression_queue_max_size_; const size_t write_queue_max_size_; const bool use_approximation_thumbnail_; + const bool save_jpeg_thumbnails_; size_t compression_tasks_count_; size_t write_tasks_count_;
diff --git a/chrome/browser/android/vr/arcore_device/arcore_java_utils.cc b/chrome/browser/android/vr/arcore_device/arcore_java_utils.cc index b84d58f71..dee136f 100644 --- a/chrome/browser/android/vr/arcore_device/arcore_java_utils.cc +++ b/chrome/browser/android/vr/arcore_device/arcore_java_utils.cc
@@ -153,7 +153,9 @@ JNIEnv* env, const base::android::JavaParamRef<jobject>& obj) { DVLOG(1) << __func__ << ":::"; - std::move(surface_destroyed_callback_).Run(); + if (surface_destroyed_callback_) { + std::move(surface_destroyed_callback_).Run(); + } } void ArCoreJavaUtils::OnRequestInstallArModuleResult(
diff --git a/chrome/browser/app_controller_mac_browsertest.mm b/chrome/browser/app_controller_mac_browsertest.mm index fcbe58d1..0a0bf508b 100644 --- a/chrome/browser/app_controller_mac_browsertest.mm +++ b/chrome/browser/app_controller_mac_browsertest.mm
@@ -701,12 +701,12 @@ // Create profile 2. base::ScopedAllowBlockingForTesting allow_blocking; base::FilePath path2 = profile_manager->GenerateNextProfileDirectoryPath(); - Profile* profile2 = - Profile::CreateProfile(path2, NULL, Profile::CREATE_MODE_SYNCHRONOUS) - .release(); - profile_manager->RegisterTestingProfile(profile2, false, true); + std::unique_ptr<Profile> profile2 = + Profile::CreateProfile(path2, NULL, Profile::CREATE_MODE_SYNCHRONOUS); + Profile* profile2_ptr = profile2.get(); + profile_manager->RegisterTestingProfile(std::move(profile2), false, true); bookmarks::test::WaitForBookmarkModelToLoad( - BookmarkModelFactory::GetForBrowserContext(profile2)); + BookmarkModelFactory::GetForBrowserContext(profile2_ptr)); // Switch to profile 1, create bookmark 1 and force the menu to build. [ac windowChangedToProfile:profile1]; @@ -717,7 +717,7 @@ [[profile1_submenu delegate] menuNeedsUpdate:profile1_submenu]; // Switch to profile 2, create bookmark 2 and force the menu to build. - [ac windowChangedToProfile:profile2]; + [ac windowChangedToProfile:profile2_ptr]; [ac bookmarkMenuBridge]->GetBookmarkModel()->AddURL( [ac bookmarkMenuBridge]->GetBookmarkModel()->bookmark_bar_node(), 0, title2, url2);
diff --git a/chrome/browser/background/background_contents.cc b/chrome/browser/background/background_contents.cc index d1ba096..b5353da7 100644 --- a/chrome/browser/background/background_contents.cc +++ b/chrome/browser/background/background_contents.cc
@@ -8,7 +8,6 @@ #include "chrome/browser/background/background_contents_service.h" #include "chrome/browser/chrome_notification_types.h" -#include "chrome/browser/data_use_measurement/data_use_web_contents_observer.h" #include "chrome/browser/extensions/chrome_extension_web_contents_observer.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/renderer_preferences_util.h" @@ -69,8 +68,6 @@ web_contents_.get(), extensions::VIEW_TYPE_BACKGROUND_CONTENTS); web_contents_->SetDelegate(this); content::WebContentsObserver::Observe(web_contents_.get()); - data_use_measurement::DataUseWebContentsObserver::CreateForWebContents( - web_contents_.get()); extensions::ChromeExtensionWebContentsObserver::CreateForWebContents( web_contents_.get());
diff --git a/chrome/browser/browser_switcher/browser_switcher_service.cc b/chrome/browser/browser_switcher/browser_switcher_service.cc index b09ec15..7e6b7764 100644 --- a/chrome/browser/browser_switcher/browser_switcher_service.cc +++ b/chrome/browser/browser_switcher/browser_switcher_service.cc
@@ -90,10 +90,9 @@ XmlDownloader::XmlDownloader(Profile* profile, BrowserSwitcherService* service, - std::vector<RulesetSource> sources, + base::TimeDelta first_fetch_delay, base::RepeatingCallback<void()> all_done_callback) : service_(service), - sources_(std::move(sources)), all_done_callback_(std::move(all_done_callback)), weak_ptr_factory_(this) { file_url_factory_ = @@ -102,14 +101,15 @@ content::BrowserContext::GetDefaultStoragePartition(profile) ->GetURLLoaderFactoryForBrowserProcess(); + sources_ = service_->GetRulesetSources(); + for (auto& source : sources_) { if (!source.url.is_valid()) DoneParsing(&source, ParsedXml({})); } - // Schedule a fetch in 1 minute, but avoid doing unnecessary work. - if (HasValidSources()) - ScheduleRefresh(service_->fetch_delay()); + // Fetch in 1 minute. + ScheduleRefresh(first_fetch_delay); } XmlDownloader::~XmlDownloader() = default; @@ -120,6 +120,14 @@ [](const RulesetSource& source) { return source.url.is_valid(); }); } +base::Time XmlDownloader::last_refresh_time() const { + return last_refresh_time_; +} + +base::Time XmlDownloader::next_refresh_time() const { + return next_refresh_time_; +} + void XmlDownloader::FetchXml() { for (auto& source : sources_) { if (!source.url.is_valid()) { @@ -181,16 +189,23 @@ DCHECK(counter_ <= sources_.size()); if (counter_ == sources_.size()) { all_done_callback_.Run(); + if (HasValidSources()) + last_refresh_time_ = base::Time::Now(); ScheduleRefresh(service_->refresh_delay()); } } void XmlDownloader::ScheduleRefresh(base::TimeDelta delay) { + // Avoid doing unnecessary work. + if (!HasValidSources()) + return; + // Refresh in 30 minutes, so the sitelists are never too stale. base::ThreadTaskRunnerHandle::Get()->PostDelayedTask( FROM_HERE, base::BindOnce(&XmlDownloader::Refresh, weak_ptr_factory_.GetWeakPtr()), delay); + next_refresh_time_ = base::Time::Now() + delay; } void XmlDownloader::Refresh() { @@ -218,18 +233,16 @@ BrowserSwitcherService::~BrowserSwitcherService() = default; void BrowserSwitcherService::Init() { - auto sources = GetRulesetSources(); - StartDownload(std::move(sources)); + StartDownload(fetch_delay()); } -void BrowserSwitcherService::StartDownload( - std::vector<RulesetSource>&& sources) { +void BrowserSwitcherService::StartDownload(base::TimeDelta delay) { LoadRulesFromPrefs(); // This destroys the previous XmlDownloader, which cancels any scheduled // refresh operations. sitelist_downloader_ = std::make_unique<XmlDownloader>( - profile_, this, std::move(sources), + profile_, this, delay, base::BindRepeating(&BrowserSwitcherService::OnAllRulesetsParsed, base::Unretained(this))); } @@ -250,6 +263,10 @@ return prefs_; } +XmlDownloader* BrowserSwitcherService::sitelist_downloader() { + return sitelist_downloader_.get(); +} + base::TimeDelta BrowserSwitcherService::fetch_delay() { return fetch_delay_; } @@ -295,7 +312,15 @@ ParsedXml(prefs().GetCachedExternalGreylist(), base::nullopt)); } -void BrowserSwitcherService::OnAllRulesetsParsed() {} +void BrowserSwitcherService::OnAllRulesetsParsed() { + callback_list_.Notify(this); +} + +std::unique_ptr<BrowserSwitcherService::CallbackSubscription> +BrowserSwitcherService::RegisterAllRulesetsParsedCallback( + AllRulesetsParsedCallback callback) { + return callback_list_.Add(callback); +} void BrowserSwitcherService::OnBrowserSwitcherPrefsChanged( BrowserSwitcherPrefs* prefs, @@ -311,7 +336,7 @@ }); if (should_redownload) - StartDownload(std::move(sources)); + StartDownload(fetch_delay()); } void BrowserSwitcherService::OnExternalSitelistParsed(ParsedXml xml) {
diff --git a/chrome/browser/browser_switcher/browser_switcher_service.h b/chrome/browser/browser_switcher/browser_switcher_service.h index 5b4c302..5efc08c 100644 --- a/chrome/browser/browser_switcher/browser_switcher_service.h +++ b/chrome/browser/browser_switcher/browser_switcher_service.h
@@ -9,6 +9,7 @@ #include <string> #include "base/callback.h" +#include "base/callback_list.h" #include "base/macros.h" #include "base/memory/weak_ptr.h" #include "base/optional.h" @@ -20,6 +21,7 @@ #include "services/network/public/cpp/simple_url_loader.h" #include "url/gurl.h" +class BrowserSwitchHandler; class Profile; namespace browser_switcher { @@ -55,19 +57,15 @@ class XmlDownloader { public: - // Posts a task to start downloading+parsing the rulesets after 1 - // minute. Calls each source's callback once they're done (or failed). In - // addition, calls |all_done_callback| once all the rulesets have been - // processed. - // - // Schedules a refresh every 30 minutes, unless this object gets deleted - // in the meantime. XmlDownloader(Profile* profile, BrowserSwitcherService* service, - std::vector<RulesetSource> sources, + base::TimeDelta first_fetch_delay, base::RepeatingCallback<void()> all_done_callback); virtual ~XmlDownloader(); + base::Time last_refresh_time() const; + base::Time next_refresh_time() const; + private: // Returns true if any of the sources requires downloads. This is used to // avoid scheduling download tasks unnecessarily. @@ -107,17 +105,25 @@ // trigger the callback once they've all been parsed. unsigned int counter_ = 0; + base::Time last_refresh_time_; + base::Time next_refresh_time_; + base::WeakPtrFactory<XmlDownloader> weak_ptr_factory_; }; // Manages per-profile resources for BrowserSwitcher. class BrowserSwitcherService : public KeyedService { + private: + using AllRulesetsParsedCallbackSignature = void(BrowserSwitcherService*); + using AllRulesetsParsedCallback = + base::RepeatingCallback<AllRulesetsParsedCallbackSignature>; + using CallbackSubscription = + base::CallbackList<AllRulesetsParsedCallbackSignature>::Subscription; + public: explicit BrowserSwitcherService(Profile* profile); ~BrowserSwitcherService() override; - void Init(); - // KeyedService: void Shutdown() override; @@ -152,10 +158,31 @@ static base::TimeDelta refresh_delay_; private: - void StartDownload(std::vector<RulesetSource>&& sources); + // chrome://browser-switch/internals has access to some + // implementation-specific methods to query this object's state, listen for + // events and trigger a re-download immediately. + friend class ::BrowserSwitchHandler; + + void Init(); + void OnExternalSitelistParsed(ParsedXml xml); void OnExternalGreylistParsed(ParsedXml xml); + // Load cached rules from the PrefStore, then re-download the sitelists after + // |delay|. + void StartDownload(base::TimeDelta delay); + + XmlDownloader* sitelist_downloader(); + + // Triggers a sitelist refresh immediately. Used by + // chrome://browser-switch/internals. + void DownloadNow(); + + // Registers a callback that triggers after the sitelists are done downloading + // and all rules are applied. + std::unique_ptr<CallbackSubscription> RegisterAllRulesetsParsedCallback( + AllRulesetsParsedCallback callback); + std::unique_ptr<XmlDownloader> sitelist_downloader_; Profile* profile_; @@ -163,6 +190,9 @@ std::unique_ptr<BrowserSwitcherPrefs::CallbackSubscription> prefs_subscription_; + // CallbackList for OnAllRulesetsParsed() listeners. + base::CallbackList<AllRulesetsParsedCallbackSignature> callback_list_; + // Per-profile helpers. std::unique_ptr<AlternativeBrowserDriver> driver_; std::unique_ptr<BrowserSwitcherSitelist> sitelist_;
diff --git a/chrome/browser/browser_switcher/browser_switcher_service_win.cc b/chrome/browser/browser_switcher/browser_switcher_service_win.cc index b8f37b7..9d5961d 100644 --- a/chrome/browser/browser_switcher/browser_switcher_service_win.cc +++ b/chrome/browser/browser_switcher/browser_switcher_service_win.cc
@@ -183,6 +183,8 @@ } void BrowserSwitcherServiceWin::OnAllRulesetsParsed() { + BrowserSwitcherService::OnAllRulesetsParsed(); + if (!prefs().IsEnabled()) return;
diff --git a/chrome/browser/chrome_browser_main.cc b/chrome/browser/chrome_browser_main.cc index 82dcb95e..b0642a9 100644 --- a/chrome/browser/chrome_browser_main.cc +++ b/chrome/browser/chrome_browser_main.cc
@@ -150,7 +150,6 @@ #include "components/rappor/rappor_service_impl.h" #include "components/signin/core/browser/account_consistency_method.h" #include "components/startup_metric_utils/browser/startup_metric_utils.h" -#include "components/tracing/common/tracing_sampler_profiler.h" #include "components/tracing/common/tracing_switches.h" #include "components/translate/core/browser/translate_download_manager.h" #include "components/variations/field_trial_config/field_trial_util.h" @@ -188,6 +187,7 @@ #include "printing/buildflags/buildflags.h" #include "rlz/buildflags/buildflags.h" #include "services/service_manager/public/cpp/connector.h" +#include "services/tracing/public/cpp/stack_sampling/tracing_sampler_profiler.h" #include "third_party/blink/public/common/experiments/memory_ablation_experiment.h" #include "third_party/widevine/cdm/buildflags.h" #include "ui/base/layout.h" @@ -262,6 +262,7 @@ #if defined(OS_WIN) || defined(OS_MACOSX) || \ (defined(OS_LINUX) && !defined(OS_CHROMEOS)) #include "chrome/browser/metrics/desktop_session_duration/desktop_session_duration_tracker.h" +#include "chrome/browser/profiles/profile_activity_metrics_recorder.h" #endif #if defined(OS_WIN) @@ -1116,6 +1117,7 @@ #if defined(OS_WIN) || defined(OS_MACOSX) || \ (defined(OS_LINUX) && !defined(OS_CHROMEOS)) metrics::DesktopSessionDurationTracker::Initialize(); + ProfileActivityMetricsRecorder::Initialize(); #endif metrics::RendererUptimeTracker::Initialize();
diff --git a/chrome/browser/chrome_content_browser_client.cc b/chrome/browser/chrome_content_browser_client.cc index 4c39dea..76d70f3 100644 --- a/chrome/browser/chrome_content_browser_client.cc +++ b/chrome/browser/chrome_content_browser_client.cc
@@ -155,6 +155,7 @@ #include "chrome/browser/ui/prefs/pref_watcher.h" #include "chrome/browser/ui/sync/sync_promo_ui.h" #include "chrome/browser/ui/tab_contents/chrome_web_contents_view_delegate.h" +#include "chrome/browser/ui/ui_features.h" #include "chrome/browser/ui/webui/chrome_web_ui_controller_factory.h" #include "chrome/browser/ui/webui/log_web_ui_url.h" #include "chrome/browser/usb/usb_tab_helper.h" @@ -3425,7 +3426,7 @@ } } - auto* native_theme = ui::NativeTheme::GetInstanceForWeb(); + auto* native_theme = GetWebTheme(); #if !defined(OS_ANDROID) if (IsAutoplayAllowedByPolicy(contents, prefs)) { // If autoplay is allowed by policy then force the no user gesture required @@ -3450,6 +3451,15 @@ web_prefs->translate_service_available = TranslateService::IsAvailable(prefs); + // Force a light preferred color scheme on chrome:// pages if kWebUIDarkMode + // is disabled until all UI is correctly themed and OSes support dark mode. + // Note: the WebUI CSS explicitly uses light (instead of not dark), which is + // why we don't reset back to no-preference. https://crbug.com/965811 + if (contents && contents->GetURL().SchemeIs(content::kChromeUIScheme) && + !base::FeatureList::IsEnabled(features::kWebUIDarkMode)) { + web_prefs->preferred_color_scheme = blink::PreferredColorScheme::kLight; + } + // Apply native CaptionStyle parameters. // TODO(ellyjones): Support more native caption styling. ui::CaptionStyle style = native_theme->GetSystemCaptionStyle(); @@ -5301,6 +5311,10 @@ url->host() == chrome::kChromeUISettingsHost; } +const ui::NativeTheme* ChromeContentBrowserClient::GetWebTheme() const { + return ui::NativeTheme::GetInstanceForWeb(); +} + // static void ChromeContentBrowserClient::SetDefaultQuotaSettingsForTesting( const storage::QuotaSettings* settings) {
diff --git a/chrome/browser/chrome_content_browser_client.h b/chrome/browser/chrome_content_browser_client.h index d45a206..18c3804 100644 --- a/chrome/browser/chrome_content_browser_client.h +++ b/chrome/browser/chrome_content_browser_client.h
@@ -65,6 +65,14 @@ class UrlCheckerDelegate; } +namespace ui { +class NativeTheme; +} + +namespace url { +class Origin; +} + namespace user_prefs { class PrefRegistrySyncable; } @@ -73,10 +81,6 @@ enum class Channel; } -namespace url { -class Origin; -} - class ChromeHidDelegate; class ChromeSerialDelegate; @@ -637,6 +641,7 @@ static bool HandleWebUI(GURL* url, content::BrowserContext* browser_context); static bool HandleWebUIReverse(GURL* url, content::BrowserContext* browser_context); + virtual const ui::NativeTheme* GetWebTheme() const; // For testing. private: friend class DisableWebRtcEncryptionFlagTest;
diff --git a/chrome/browser/chrome_content_browser_client_browsertest.cc b/chrome/browser/chrome_content_browser_client_browsertest.cc index ad00d3a8..958f997 100644 --- a/chrome/browser/chrome_content_browser_client_browsertest.cc +++ b/chrome/browser/chrome_content_browser_client_browsertest.cc
@@ -4,6 +4,7 @@ #include "chrome/browser/chrome_content_browser_client.h" +#include <memory> #include <vector> #include "base/base_switches.h" @@ -23,6 +24,7 @@ #include "chrome/browser/ui/browser.h" #include "chrome/browser/ui/search/instant_test_base.h" #include "chrome/browser/ui/tabs/tab_strip_model.h" +#include "chrome/browser/ui/ui_features.h" #include "chrome/common/chrome_features.h" #include "chrome/common/chrome_switches.h" #include "chrome/common/pref_names.h" @@ -36,8 +38,10 @@ #include "content/public/browser/navigation_entry.h" #include "content/public/browser/render_frame_host.h" #include "content/public/browser/render_process_host.h" +#include "content/public/browser/render_view_host.h" #include "content/public/browser/site_isolation_policy.h" #include "content/public/browser/web_contents.h" +#include "content/public/common/content_client.h" #include "content/public/common/content_features.h" #include "content/public/common/content_switches.h" #include "content/public/test/browser_test_utils.h" @@ -49,6 +53,8 @@ #include "net/test/embedded_test_server/http_request.h" #include "net/test/embedded_test_server/http_response.h" #include "testing/gmock/include/gmock/gmock.h" +#include "ui/native_theme/native_theme.h" +#include "ui/native_theme/test_native_theme.h" #include "url/gurl.h" #include "url/origin.h" @@ -545,22 +551,57 @@ class PrefersColorSchemeTest : public testing::WithParamInterface<bool>, public InProcessBrowserTest { protected: - PrefersColorSchemeTest() = default; - const char* ExpectedColorScheme() const { - return ui::NativeTheme::GetInstanceForNativeUi()->SystemDarkModeEnabled() - ? "dark" - : "light"; + PrefersColorSchemeTest() : theme_client_(&test_theme_) {} + + ~PrefersColorSchemeTest() { + CHECK_EQ(&theme_client_, SetBrowserClientForTesting(original_client_)); } + + const char* ExpectedColorScheme() const { + return GetParam() ? "dark" : "light"; + } + void SetUpCommandLine(base::CommandLine* command_line) override { InProcessBrowserTest::SetUpCommandLine(command_line); - command_line->AppendSwitchASCII("enable-blink-features", + command_line->AppendSwitchASCII(switches::kEnableBlinkFeatures, "MediaQueryPrefersColorScheme"); - if (GetParam()) - command_line->AppendSwitch("force-dark-mode"); } + + void SetUpOnMainThread() override { + InProcessBrowserTest::SetUpOnMainThread(); + original_client_ = SetBrowserClientForTesting(&theme_client_); + } + + protected: + ui::TestNativeTheme test_theme_; + + private: + content::ContentBrowserClient* original_client_ = nullptr; + + class ChromeContentBrowserClientWithWebTheme + : public ChromeContentBrowserClient { + public: + explicit ChromeContentBrowserClientWithWebTheme( + const ui::NativeTheme* theme) + : theme_(theme) {} + + protected: + const ui::NativeTheme* GetWebTheme() const override { return theme_; } + + private: + const ui::NativeTheme* const theme_; + }; + + ChromeContentBrowserClientWithWebTheme theme_client_; }; IN_PROC_BROWSER_TEST_P(PrefersColorSchemeTest, PrefersColorScheme) { + test_theme_.SetDarkMode(GetParam()); + browser() + ->tab_strip_model() + ->GetActiveWebContents() + ->GetRenderViewHost() + ->OnWebkitPreferencesChanged(); ui_test_utils::NavigateToURL( browser(), ui_test_utils::GetTestUrl( @@ -571,6 +612,23 @@ EXPECT_EQ(base::ASCIIToUTF16(ExpectedColorScheme()), tab_title); } +IN_PROC_BROWSER_TEST_P(PrefersColorSchemeTest, WebUIFeatureOverrides) { + test_theme_.SetDarkMode(true); + + base::test::ScopedFeatureList features; + features.InitWithFeatureState(features::kWebUIDarkMode, GetParam()); + + ui_test_utils::NavigateToURL(browser(), GURL(chrome::kChromeUIDownloadsURL)); + + bool in_dark_mode; // A default shouldn't matter because of the ASSERT(). + ASSERT_TRUE(ExecuteScriptAndExtractBool( + browser()->tab_strip_model()->GetActiveWebContents(), + "window.domAutomationController.send(" + " window.matchMedia('(prefers-color-scheme: dark)').matches)", + &in_dark_mode)); + EXPECT_EQ(in_dark_mode, GetParam()); +} + INSTANTIATE_TEST_SUITE_P(All, PrefersColorSchemeTest, testing::Bool()); class ProtocolHandlerTest : public InProcessBrowserTest {
diff --git a/chrome/browser/chrome_content_browser_client_unittest.cc b/chrome/browser/chrome_content_browser_client_unittest.cc index 7e8db5b..d4e68931 100644 --- a/chrome/browser/chrome_content_browser_client_unittest.cc +++ b/chrome/browser/chrome_content_browser_client_unittest.cc
@@ -429,7 +429,7 @@ GURL("https://www.google.com/search?notaquery=nope"))); } -TEST(ChromeContentBrowserClient, UserAgentStringFrozen) { +TEST(ChromeContentBrowserClientTest, UserAgentStringFrozen) { base::test::ScopedFeatureList scoped_feature_list; scoped_feature_list.InitAndEnableFeature(blink::features::kFreezeUserAgent); @@ -468,7 +468,7 @@ #endif } -TEST(ChromeContentBrowserClient, UserAgentStringOrdering) { +TEST(ChromeContentBrowserClientTest, UserAgentStringOrdering) { #if defined(OS_ANDROID) const char* const kArguments[] = {"chrome"}; base::test::ScopedCommandLine scoped_command_line; @@ -488,7 +488,7 @@ #endif } -TEST(ChromeContentBrowserClient, UserAgentMetadata) { +TEST(ChromeContentBrowserClientTest, UserAgentMetadata) { ChromeContentBrowserClient content_browser_client; auto metadata = content_browser_client.GetUserAgentMetadata();
diff --git a/chrome/browser/chromeos/accessibility/accessibility_panel.cc b/chrome/browser/chromeos/accessibility/accessibility_panel.cc index 83b7f4e2..fa174187 100644 --- a/chrome/browser/chromeos/accessibility/accessibility_panel.cc +++ b/chrome/browser/chromeos/accessibility/accessibility_panel.cc
@@ -8,7 +8,6 @@ #include "ash/public/interfaces/accessibility_controller.mojom.h" #include "base/macros.h" #include "chrome/browser/chromeos/profiles/profile_helper.h" -#include "chrome/browser/data_use_measurement/data_use_web_contents_observer.h" #include "chrome/browser/extensions/chrome_extension_web_contents_observer.h" #include "chrome/browser/ui/ash/ash_util.h" #include "content/public/browser/web_contents.h" @@ -51,8 +50,6 @@ web_contents_ = web_view->GetWebContents(); web_contents_observer_.reset( new AccessibilityPanelWebContentsObserver(web_contents_, this)); - data_use_measurement::DataUseWebContentsObserver::CreateForWebContents( - web_contents_); web_contents_->SetDelegate(this); extensions::SetViewType(web_contents_, extensions::VIEW_TYPE_COMPONENT); extensions::ChromeExtensionWebContentsObserver::CreateForWebContents(
diff --git a/chrome/browser/chromeos/account_manager/account_manager_migrator.cc b/chrome/browser/chromeos/account_manager/account_manager_migrator.cc index 71cd08d..c83bf021 100644 --- a/chrome/browser/chromeos/account_manager/account_manager_migrator.cc +++ b/chrome/browser/chromeos/account_manager/account_manager_migrator.cc
@@ -98,7 +98,7 @@ protected: bool IsAccountPresentInAccountManager( const AccountManager::AccountKey& account) const { - return base::ContainsValue(account_manager_accounts_, account); + return base::Contains(account_manager_accounts_, account); } bool IsAccountManagerEmpty() const { @@ -107,7 +107,7 @@ void MigrateSecondaryAccount(const std::string& gaia_id, const std::string& email) { - if (base::ContainsValue( + if (base::Contains( account_manager_accounts_, AccountManager::AccountKey{ gaia_id, account_manager::AccountType::ACCOUNT_TYPE_GAIA})) {
diff --git a/chrome/browser/chromeos/android_sms/android_sms_app_setup_controller_impl_unittest.cc b/chrome/browser/chromeos/android_sms/android_sms_app_setup_controller_impl_unittest.cc index b0df60e..623526c 100644 --- a/chrome/browser/chromeos/android_sms/android_sms_app_setup_controller_impl_unittest.cc +++ b/chrome/browser/chromeos/android_sms/android_sms_app_setup_controller_impl_unittest.cc
@@ -137,7 +137,7 @@ void SetHasPwa(const GURL& url) { // If a PWA already exists for this URL, there is nothing to do. - if (base::ContainsKey(url_to_pwa_map_, url)) + if (base::Contains(url_to_pwa_map_, url)) return; // Create a test Extension and add it to |url_to_pwa_map_|. @@ -151,7 +151,7 @@ // AndroidSmsAppSetupControllerImpl::PwaDelegate: const extensions::Extension* GetPwaForUrl(const GURL& install_url, Profile* profile) override { - if (!base::ContainsKey(url_to_pwa_map_, install_url)) + if (!base::Contains(url_to_pwa_map_, install_url)) return nullptr; return url_to_pwa_map_[install_url].get();
diff --git a/chrome/browser/chromeos/arc/bluetooth/arc_bluetooth_bridge.cc b/chrome/browser/chromeos/arc/bluetooth/arc_bluetooth_bridge.cc index 6f9c87b..9ebf492 100644 --- a/chrome/browser/chromeos/arc/bluetooth/arc_bluetooth_bridge.cc +++ b/chrome/browser/chromeos/arc/bluetooth/arc_bluetooth_bridge.cc
@@ -1698,7 +1698,7 @@ } std::string char_id_str = characteristic->GetIdentifier(); - if (base::ContainsKey(notification_session_, char_id_str)) { + if (base::Contains(notification_session_, char_id_str)) { // There can be only one notification session per characteristic. std::move(callback).Run(mojom::BluetoothGattStatus::GATT_FAILURE); return;
diff --git a/chrome/browser/chromeos/arc/fileapi/arc_documents_provider_util.cc b/chrome/browser/chromeos/arc/fileapi/arc_documents_provider_util.cc index 4ee61e2..e8cb928 100644 --- a/chrome/browser/chromeos/arc/fileapi/arc_documents_provider_util.cc +++ b/chrome/browser/chromeos/arc/fileapi/arc_documents_provider_util.cc
@@ -235,7 +235,7 @@ for (const auto& mapping : kAndroidMimeTypeMappings) { std::vector<base::StringPiece> extensions = base::SplitStringPiece( mapping.extensions, ",", base::TRIM_WHITESPACE, base::SPLIT_WANT_ALL); - if (base::ContainsValue(extensions, ext)) + if (base::Contains(extensions, ext)) return mapping.mime_type; } return std::string(); @@ -269,7 +269,7 @@ GetExtensionsForArcMimeType(document->mime_type); if (!possible_extensions.empty() && - !base::ContainsValue(possible_extensions, extension)) { + !base::Contains(possible_extensions, extension)) { // Lookup the extension in the hardcoded map before appending an extension, // as some extensions (eg. 3gp) are typed differently by Android. Only // append the suggested extension if the lookup fails (i.e. no valid mime
diff --git a/chrome/browser/chromeos/arc/input_method_manager/arc_input_method_manager_service.cc b/chrome/browser/chromeos/arc/input_method_manager/arc_input_method_manager_service.cc index b6a56b0..f6701d5 100644 --- a/chrome/browser/chromeos/arc/input_method_manager/arc_input_method_manager_service.cc +++ b/chrome/browser/chromeos/arc/input_method_manager/arc_input_method_manager_service.cc
@@ -392,13 +392,13 @@ // TODO(crbug.com/845079): We should keep the order of the IMEs as same as in // chrome://settings for (const auto& input_method_id : enabled_input_method_ids) { - if (!base::ContainsValue(active_ime_list, input_method_id)) + if (!base::Contains(active_ime_list, input_method_id)) active_ime_list.push_back(input_method_id); } // Disable IMEs that are already disable in the container. base::EraseIf(active_ime_list, [&enabled_input_method_ids](const auto& id) { return chromeos::extension_ime_util::IsArcIME(id) && - !base::ContainsValue(enabled_input_method_ids, id); + !base::Contains(enabled_input_method_ids, id); }); profile_->GetPrefs()->SetString(prefs::kLanguageEnabledImes, base::JoinString(active_ime_list, ","));
diff --git a/chrome/browser/chromeos/arc/input_method_manager/arc_input_method_manager_service_unittest.cc b/chrome/browser/chromeos/arc/input_method_manager/arc_input_method_manager_service_unittest.cc index edb1828c..c98e0f0 100644 --- a/chrome/browser/chromeos/arc/input_method_manager/arc_input_method_manager_service_unittest.cc +++ b/chrome/browser/chromeos/arc/input_method_manager/arc_input_method_manager_service_unittest.cc
@@ -117,7 +117,7 @@ bool IsInputMethodAllowed(const std::string& ime_id) { return allowed_input_methods_.empty() || - base::ContainsValue(allowed_input_methods_, ime_id); + base::Contains(allowed_input_methods_, ime_id); } std::vector<std::tuple<std::string,
diff --git a/chrome/browser/chromeos/assistant/assistant_util.cc b/chrome/browser/chromeos/assistant/assistant_util.cc index 1690a3d..b2f51411 100644 --- a/chrome/browser/chromeos/assistant/assistant_util.cc +++ b/chrome/browser/chromeos/assistant/assistant_util.cc
@@ -77,8 +77,8 @@ // in these test environments. if (!chromeos::switches::IsGaiaServicesDisabled() && !pref_locale.empty()) { base::ReplaceChars(pref_locale, "-", "_", &pref_locale); - bool disallowed = !base::ContainsValue(kAllowedLocales, pref_locale) && - !base::ContainsValue(kAllowedLocales, kRuntimeLocale); + bool disallowed = !base::Contains(kAllowedLocales, pref_locale) && + !base::Contains(kAllowedLocales, kRuntimeLocale); if (disallowed) return ash::mojom::AssistantAllowedState::DISALLOWED_BY_LOCALE;
diff --git a/chrome/browser/chromeos/base/locale_util.cc b/chrome/browser/chromeos/base/locale_util.cc index 0b565fc1..39570d34 100644 --- a/chrome/browser/chromeos/base/locale_util.cc +++ b/chrome/browser/chromeos/base/locale_util.cc
@@ -49,9 +49,9 @@ Profile* profile; }; -// Runs on SequencedWorkerPool thread under PostTaskAndReply(). -// So data is owned by "Reply" part of PostTaskAndReply() process. -void SwitchLanguageDoReloadLocale(SwitchLanguageData* data) { +// Runs on ThreadPool thread under PostTaskAndReply(). +std::unique_ptr<SwitchLanguageData> SwitchLanguageDoReloadLocale( + std::unique_ptr<SwitchLanguageData> data) { DCHECK(!content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); data->result.loaded_locale = @@ -59,6 +59,8 @@ data->result.requested_locale); data->result.success = !data->result.loaded_locale.empty(); + + return data; } // Callback after SwitchLanguageDoReloadLocale() back in UI thread. @@ -142,14 +144,14 @@ const SwitchLanguageCallback& callback, Profile* profile) { DCHECK_CURRENTLY_ON(content::BrowserThread::UI); - std::unique_ptr<SwitchLanguageData> data( - new SwitchLanguageData(locale, enable_locale_keyboard_layouts, - login_layouts_only, callback, profile)); - base::Closure reloader( - base::Bind(&SwitchLanguageDoReloadLocale, base::Unretained(data.get()))); - base::PostTaskWithTraitsAndReply( - FROM_HERE, {base::MayBlock(), base::TaskPriority::BEST_EFFORT}, reloader, - base::Bind(&FinishSwitchLanguage, base::Passed(std::move(data)))); + auto data = std::make_unique<SwitchLanguageData>( + locale, enable_locale_keyboard_layouts, login_layouts_only, callback, + profile); + // USER_BLOCKING because it blocks startup on ChromeOS. crbug.com/968554 + base::PostTaskWithTraitsAndReplyWithResult( + FROM_HERE, {base::MayBlock(), base::TaskPriority::USER_BLOCKING}, + base::BindOnce(&SwitchLanguageDoReloadLocale, std::move(data)), + base::BindOnce(&FinishSwitchLanguage)); } bool IsAllowedLanguage(const std::string& language, const PrefService* prefs) {
diff --git a/chrome/browser/chromeos/child_accounts/usage_time_limit_processor_unittest.cc b/chrome/browser/chromeos/child_accounts/usage_time_limit_processor_unittest.cc index 8c7eb8f..35e8d64 100644 --- a/chrome/browser/chromeos/child_accounts/usage_time_limit_processor_unittest.cc +++ b/chrome/browser/chromeos/child_accounts/usage_time_limit_processor_unittest.cc
@@ -3010,7 +3010,7 @@ std::set<PolicyType> updated_policies = UpdatedPolicyTypes(old_policy, new_policy); ASSERT_EQ(updated_policies.size(), 1u); - EXPECT_TRUE(base::ContainsKey(updated_policies, PolicyType::kUsageLimit)); + EXPECT_TRUE(base::Contains(updated_policies, PolicyType::kUsageLimit)); } // Tests UpdatedPolicyTypes with different time window limits. @@ -3045,7 +3045,7 @@ std::set<PolicyType> updated_policies = UpdatedPolicyTypes(old_policy, new_policy); ASSERT_EQ(updated_policies.size(), 1u); - EXPECT_TRUE(base::ContainsKey(updated_policies, PolicyType::kFixedLimit)); + EXPECT_TRUE(base::Contains(updated_policies, PolicyType::kFixedLimit)); } // Tests UpdatedPolicyTypes with different overrides with duration. @@ -3081,7 +3081,7 @@ std::set<PolicyType> updated_policies = UpdatedPolicyTypes(old_policy, new_policy); ASSERT_EQ(updated_policies.size(), 1u); - EXPECT_TRUE(base::ContainsKey(updated_policies, PolicyType::kOverride)); + EXPECT_TRUE(base::Contains(updated_policies, PolicyType::kOverride)); } // Tests UpdatedPolicyTypes with different time window limits, time usage @@ -3120,9 +3120,9 @@ std::set<PolicyType> updated_policies = UpdatedPolicyTypes(old_policy, new_policy); ASSERT_EQ(updated_policies.size(), 3u); - EXPECT_TRUE(base::ContainsKey(updated_policies, PolicyType::kUsageLimit)); - EXPECT_TRUE(base::ContainsKey(updated_policies, PolicyType::kFixedLimit)); - EXPECT_TRUE(base::ContainsKey(updated_policies, PolicyType::kOverride)); + EXPECT_TRUE(base::Contains(updated_policies, PolicyType::kUsageLimit)); + EXPECT_TRUE(base::Contains(updated_policies, PolicyType::kFixedLimit)); + EXPECT_TRUE(base::Contains(updated_policies, PolicyType::kOverride)); } } // namespace usage_time_limit
diff --git a/chrome/browser/chromeos/crostini/crostini_package_service.cc b/chrome/browser/chromeos/crostini/crostini_package_service.cc index 84395744..30da593fb 100644 --- a/chrome/browser/chromeos/crostini/crostini_package_service.cc +++ b/chrome/browser/chromeos/crostini/crostini_package_service.cc
@@ -229,8 +229,8 @@ bool CrostiniPackageService::ContainerHasRunningOperation( const ContainerId& container_id) const { - return base::ContainsKey(running_notifications_, container_id) || - base::ContainsKey(containers_with_pending_installs_, container_id); + return base::Contains(running_notifications_, container_id) || + base::Contains(containers_with_pending_installs_, container_id); } void CrostiniPackageService::CreateRunningNotification(
diff --git a/chrome/browser/chromeos/extensions/file_manager/device_event_router_unittest.cc b/chrome/browser/chromeos/extensions/file_manager/device_event_router_unittest.cc index 8b9fea9..e6d6710 100644 --- a/chrome/browser/chromeos/extensions/file_manager/device_event_router_unittest.cc +++ b/chrome/browser/chromeos/extensions/file_manager/device_event_router_unittest.cc
@@ -9,8 +9,8 @@ #include <vector> #include "base/macros.h" -#include "base/message_loop/message_loop.h" #include "base/run_loop.h" +#include "base/test/scoped_task_environment.h" #include "chrome/browser/chromeos/file_manager/volume_manager.h" #include "chromeos/disks/disk.h" #include "testing/gtest/include/gtest/gtest.h" @@ -86,7 +86,7 @@ std::unique_ptr<DeviceEventRouterImpl> device_event_router; private: - base::MessageLoop message_loop_; + base::test::ScopedTaskEnvironment scoped_task_environment_; }; TEST_F(DeviceEventRouterTest, AddAndRemoveDevice) {
diff --git a/chrome/browser/chromeos/extensions/file_manager/event_router.cc b/chrome/browser/chromeos/extensions/file_manager/event_router.cc index 372d2e12..294acd4 100644 --- a/chrome/browser/chromeos/extensions/file_manager/event_router.cc +++ b/chrome/browser/chromeos/extensions/file_manager/event_router.cc
@@ -430,7 +430,7 @@ DriveIntegrationServiceFactory::FindForProfile(profile_) ->GetMountPointPath(); return base::FilePath("/").AppendRelativePath(path, &absolute_path) && - base::ContainsKey(*file_watchers_, absolute_path); + base::Contains(*file_watchers_, absolute_path); } void DispatchEventToExtension(
diff --git a/chrome/browser/chromeos/extensions/file_manager/job_event_router_unittest.cc b/chrome/browser/chromeos/extensions/file_manager/job_event_router_unittest.cc index f70f1380..b43935c 100644 --- a/chrome/browser/chromeos/extensions/file_manager/job_event_router_unittest.cc +++ b/chrome/browser/chromeos/extensions/file_manager/job_event_router_unittest.cc
@@ -11,8 +11,8 @@ #include "base/macros.h" #include "base/memory/ptr_util.h" -#include "base/message_loop/message_loop.h" #include "base/run_loop.h" +#include "base/test/scoped_task_environment.h" #include "testing/gtest/include/gtest/gtest.h" namespace file_manager { @@ -94,7 +94,7 @@ std::unique_ptr<JobEventRouterImpl> job_event_router; private: - base::MessageLoop message_loop_; + base::test::ScopedTaskEnvironment scoped_task_environment_; }; TEST_F(JobEventRouterTest, Basic) {
diff --git a/chrome/browser/chromeos/extensions/gfx_utils_unittest.cc b/chrome/browser/chromeos/extensions/gfx_utils_unittest.cc index 00016a7..babaa3d 100644 --- a/chrome/browser/chromeos/extensions/gfx_utils_unittest.cc +++ b/chrome/browser/chromeos/extensions/gfx_utils_unittest.cc
@@ -153,7 +153,7 @@ extension_ids = extensions::util::GetEquivalentInstalledExtensions( profile(), kGmailArcPackage); EXPECT_TRUE(1 == extension_ids.size()); - EXPECT_TRUE(base::ContainsValue(extension_ids, kGmailExtensionId1)); + EXPECT_TRUE(base::Contains(extension_ids, kGmailExtensionId1)); // Install another Gmail extension app. scoped_refptr<const Extension> extension2 = @@ -162,15 +162,15 @@ extension_ids = extensions::util::GetEquivalentInstalledExtensions( profile(), kGmailArcPackage); EXPECT_TRUE(2 == extension_ids.size()); - EXPECT_TRUE(base::ContainsValue(extension_ids, kGmailExtensionId1)); - EXPECT_TRUE(base::ContainsValue(extension_ids, kGmailExtensionId2)); + EXPECT_TRUE(base::Contains(extension_ids, kGmailExtensionId1)); + EXPECT_TRUE(base::Contains(extension_ids, kGmailExtensionId2)); RemoveExtension(extension1.get()); extension_ids = extensions::util::GetEquivalentInstalledExtensions( profile(), kGmailArcPackage); EXPECT_TRUE(1 == extension_ids.size()); - EXPECT_FALSE(base::ContainsValue(extension_ids, kGmailExtensionId1)); - EXPECT_TRUE(base::ContainsValue(extension_ids, kGmailExtensionId2)); + EXPECT_FALSE(base::Contains(extension_ids, kGmailExtensionId1)); + EXPECT_TRUE(base::Contains(extension_ids, kGmailExtensionId2)); RemoveExtension(extension2.get()); extension_ids = extensions::util::GetEquivalentInstalledExtensions(
diff --git a/chrome/browser/chromeos/extensions/quick_unlock_private/quick_unlock_private_api.cc b/chrome/browser/chromeos/extensions/quick_unlock_private/quick_unlock_private_api.cc index e29a6af..63c3cd0 100644 --- a/chrome/browser/chromeos/extensions/quick_unlock_private/quick_unlock_private_api.cc +++ b/chrome/browser/chromeos/extensions/quick_unlock_private/quick_unlock_private_api.cc
@@ -109,7 +109,7 @@ // This is a slow comparison algorithm, but the number of entries in |a| and // |b| will always be very low (0-3 items) so it doesn't matter. for (size_t i = 0; i < a.size(); ++i) { - if (!base::ContainsValue(b, a[i])) + if (!base::Contains(b, a[i])) return false; } @@ -172,7 +172,7 @@ return true; // Check if it is on the list of most common PINs. - if (base::ContainsValue(kMostCommonPins, pin)) + if (base::Contains(kMostCommonPins, pin)) return false; // Check for same digits, increasing and decreasing PIN simultaneously.
diff --git a/chrome/browser/chromeos/extensions/quick_unlock_private/quick_unlock_private_api_unittest.cc b/chrome/browser/chromeos/extensions/quick_unlock_private/quick_unlock_private_api_unittest.cc index 3797c288..9e90689 100644 --- a/chrome/browser/chromeos/extensions/quick_unlock_private/quick_unlock_private_api_unittest.cc +++ b/chrome/browser/chromeos/extensions/quick_unlock_private/quick_unlock_private_api_unittest.cc
@@ -322,20 +322,20 @@ EXPECT_EQ(HasFlag(expected_outcome, PIN_GOOD), errors.empty() && warnings.empty()); EXPECT_EQ(HasFlag(expected_outcome, PIN_TOO_SHORT), - base::ContainsValue( - errors, CredentialProblem::CREDENTIAL_PROBLEM_TOO_SHORT)); - EXPECT_EQ(HasFlag(expected_outcome, PIN_TOO_LONG), - base::ContainsValue( - errors, CredentialProblem::CREDENTIAL_PROBLEM_TOO_LONG)); + base::Contains(errors, + CredentialProblem::CREDENTIAL_PROBLEM_TOO_SHORT)); + EXPECT_EQ( + HasFlag(expected_outcome, PIN_TOO_LONG), + base::Contains(errors, CredentialProblem::CREDENTIAL_PROBLEM_TOO_LONG)); EXPECT_EQ(HasFlag(expected_outcome, PIN_WEAK_WARNING), - base::ContainsValue( - warnings, CredentialProblem::CREDENTIAL_PROBLEM_TOO_WEAK)); - EXPECT_EQ(HasFlag(expected_outcome, PIN_WEAK_ERROR), - base::ContainsValue( - errors, CredentialProblem::CREDENTIAL_PROBLEM_TOO_WEAK)); + base::Contains(warnings, + CredentialProblem::CREDENTIAL_PROBLEM_TOO_WEAK)); + EXPECT_EQ( + HasFlag(expected_outcome, PIN_WEAK_ERROR), + base::Contains(errors, CredentialProblem::CREDENTIAL_PROBLEM_TOO_WEAK)); EXPECT_EQ( HasFlag(expected_outcome, PIN_CONTAINS_NONDIGIT), - base::ContainsValue( + base::Contains( errors, CredentialProblem::CREDENTIAL_PROBLEM_CONTAINS_NONDIGIT)); }
diff --git a/chrome/browser/chromeos/file_manager/file_browser_handlers.cc b/chrome/browser/chromeos/file_manager/file_browser_handlers.cc index 82f76188..5cab2de 100644 --- a/chrome/browser/chromeos/file_manager/file_browser_handlers.cc +++ b/chrome/browser/chromeos/file_manager/file_browser_handlers.cc
@@ -457,7 +457,7 @@ for (FileBrowserHandlerList::const_iterator itr = handlers.begin(); itr != handlers.end(); ++itr) { - if (base::ContainsKey(common_handler_set, *itr)) + if (base::Contains(common_handler_set, *itr)) intersection.push_back(*itr); }
diff --git a/chrome/browser/chromeos/file_manager/file_tasks.cc b/chrome/browser/chromeos/file_manager/file_tasks.cc index d338f7b..2b0e758 100644 --- a/chrome/browser/chromeos/file_manager/file_tasks.cc +++ b/chrome/browser/chromeos/file_manager/file_tasks.cc
@@ -665,7 +665,7 @@ FullTaskDescriptor* task = &tasks->at(i); DCHECK(!task->is_default()); const std::string task_id = TaskDescriptorToId(task->task_descriptor()); - if (base::ContainsKey(default_task_ids, task_id)) { + if (base::Contains(default_task_ids, task_id)) { task->set_is_default(true); return; }
diff --git a/chrome/browser/chromeos/file_manager/volume_manager.cc b/chrome/browser/chromeos/file_manager/volume_manager.cc index 7e137ca3..98fe917 100644 --- a/chrome/browser/chromeos/file_manager/volume_manager.cc +++ b/chrome/browser/chromeos/file_manager/volume_manager.cc
@@ -1067,7 +1067,7 @@ while (!remaining_mount_paths.empty()) { std::string mount_path = remaining_mount_paths.back(); remaining_mount_paths.pop_back(); - if (!base::ContainsKey(disk_mount_manager_->mount_points(), mount_path)) { + if (!base::Contains(disk_mount_manager_->mount_points(), mount_path)) { // The mount point could have already been removed for another reason // (i.e. the disk was removed by the user). continue;
diff --git a/chrome/browser/chromeos/file_manager/volume_manager_unittest.cc b/chrome/browser/chromeos/file_manager/volume_manager_unittest.cc index 18c0464..2f447589 100644 --- a/chrome/browser/chromeos/file_manager/volume_manager_unittest.cc +++ b/chrome/browser/chromeos/file_manager/volume_manager_unittest.cc
@@ -801,8 +801,7 @@ "failed_unmount", }; for (const auto& request : disk_mount_manager_->unmount_requests()) { - EXPECT_TRUE( - base::ContainsKey(expected_unmount_requests, request.mount_path)); + EXPECT_TRUE(base::Contains(expected_unmount_requests, request.mount_path)); expected_unmount_requests.erase(request.mount_path); } EXPECT_TRUE(expected_unmount_requests.empty());
diff --git a/chrome/browser/chromeos/input_method/input_method_manager_impl.cc b/chrome/browser/chromeos/input_method/input_method_manager_impl.cc index 9b17c490..f5a777ef 100644 --- a/chrome/browser/chromeos/input_method/input_method_manager_impl.cc +++ b/chrome/browser/chromeos/input_method/input_method_manager_impl.cc
@@ -276,7 +276,7 @@ const std::string& candidate = candidates[i]; // Not efficient, but should be fine, as the two vectors are very // short (2-5 items). - if (!base::ContainsValue(layouts, candidate) && + if (!base::Contains(layouts, candidate) && manager_->IsLoginKeyboard(candidate) && IsInputMethodAllowed(candidate)) { layouts.push_back(candidate); @@ -354,7 +354,7 @@ return false; } - if (!base::ContainsValue(*new_active_input_method_ids, input_method_id)) + if (!base::Contains(*new_active_input_method_ids, input_method_id)) new_active_input_method_ids->push_back(input_method_id); return true; @@ -471,11 +471,10 @@ return true; } - return base::ContainsValue(allowed_keyboard_layout_input_method_ids, - input_method_id) || - base::ContainsValue( - allowed_keyboard_layout_input_method_ids, - manager_->util_.MigrateInputMethod(input_method_id)); + return base::Contains(allowed_keyboard_layout_input_method_ids, + input_method_id) || + base::Contains(allowed_keyboard_layout_input_method_ids, + manager_->util_.MigrateInputMethod(input_method_id)); } std::string @@ -580,8 +579,8 @@ const InputMethodDescriptor& descriptor = descriptors[i]; const std::string& id = descriptor.id(); extra_input_methods[id] = descriptor; - if (base::ContainsValue(enabled_extension_imes, id)) { - if (!base::ContainsValue(active_input_method_ids, id)) { + if (base::Contains(enabled_extension_imes, id)) { + if (!base::Contains(active_input_method_ids, id)) { active_input_method_ids.push_back(id); } else { DVLOG(1) << "AddInputMethodExtension: already added: " << id << ", " @@ -674,7 +673,7 @@ active_input_method_ids.end(), entry.first); bool active = active_iter != active_input_method_ids.end(); - bool enabled = base::ContainsValue(enabled_extension_imes, entry.first); + bool enabled = base::Contains(enabled_extension_imes, entry.first); if (active && !enabled) active_input_method_ids.erase(active_iter); @@ -840,7 +839,7 @@ bool InputMethodManagerImpl::StateImpl::InputMethodIsActivated( const std::string& input_method_id) const { - return base::ContainsValue(active_input_method_ids, input_method_id); + return base::Contains(active_input_method_ids, input_method_id); } void InputMethodManagerImpl::StateImpl::EnableInputView() {
diff --git a/chrome/browser/chromeos/kiosk_next_home/intent_config_helper.cc b/chrome/browser/chromeos/kiosk_next_home/intent_config_helper.cc index 61412d5..3121bd1 100644 --- a/chrome/browser/chromeos/kiosk_next_home/intent_config_helper.cc +++ b/chrome/browser/chromeos/kiosk_next_home/intent_config_helper.cc
@@ -103,7 +103,7 @@ if (intent_uri.IsStandard()) { if (intent_uri.SchemeIs(url::kHttpsScheme)) - return base::ContainsKey(allowed_hosts_, intent_uri.host()); + return base::Contains(allowed_hosts_, intent_uri.host()); // Other standard schemes besides https are not allowed. return false; }
diff --git a/chrome/browser/chromeos/lock_screen_apps/lock_screen_profile_creator_impl_unittest.cc b/chrome/browser/chromeos/lock_screen_apps/lock_screen_profile_creator_impl_unittest.cc index c8182ce..d0886ece 100644 --- a/chrome/browser/chromeos/lock_screen_apps/lock_screen_profile_creator_impl_unittest.cc +++ b/chrome/browser/chromeos/lock_screen_apps/lock_screen_profile_creator_impl_unittest.cc
@@ -182,8 +182,9 @@ return new TestingProfile(path, NULL); } - Profile* CreateProfileAsyncHelper(const base::FilePath& path, - Delegate* delegate) override { + std::unique_ptr<Profile> CreateProfileAsyncHelper( + const base::FilePath& path, + Delegate* delegate) override { pending_profile_creation_.Set(path, delegate); auto new_profile = @@ -195,7 +196,7 @@ incognito_builder.SetPath(path); incognito_builder.BuildIncognito(new_profile.get()); - return new_profile.release(); + return new_profile; } private: @@ -337,7 +338,7 @@ std::make_unique<TestingProfile>(user_profile_path); primary_profile_ = primary_profile.get(); profile_manager_->RegisterTestingProfile( - primary_profile.release(), false /*add_to_storage*/, + std::move(primary_profile), false /*add_to_storage*/, false /*start_deferred_task_runner*/); InitExtensionSystem(primary_profile_);
diff --git a/chrome/browser/chromeos/login/demo_mode/demo_session.cc b/chrome/browser/chromeos/login/demo_mode/demo_session.cc index 937dc210..9344e58 100644 --- a/chrome/browser/chromeos/login/demo_mode/demo_session.cc +++ b/chrome/browser/chromeos/login/demo_mode/demo_session.cc
@@ -392,8 +392,7 @@ if (!content::GetNetworkConnectionTracker()->IsOffline()) return false; - return base::ContainsValue(ignore_pin_policy_offline_apps_, - app_id_or_package); + return base::Contains(ignore_pin_policy_offline_apps_, app_id_or_package); } void DemoSession::SetExtensionsExternalLoader(
diff --git a/chrome/browser/chromeos/login/easy_unlock/easy_unlock_service_signin_chromeos.cc b/chrome/browser/chromeos/login/easy_unlock/easy_unlock_service_signin_chromeos.cc index 576bc89..e8072fc 100644 --- a/chrome/browser/chromeos/login/easy_unlock/easy_unlock_service_signin_chromeos.cc +++ b/chrome/browser/chromeos/login/easy_unlock/easy_unlock_service_signin_chromeos.cc
@@ -411,6 +411,8 @@ ? SmartLockMetricsRecorder::SmartLockAuthMethodChoice::kSmartLock : SmartLockMetricsRecorder::SmartLockAuthMethodChoice::kOther); + // TODO(crbug.com/972156): A KeyedService shutting itself seems dangerous; + // look into other ways to "reset state" besides this. Shutdown(); } @@ -581,8 +583,8 @@ std::string local_device_id; for (const auto& remote_device : remote_devices) { - if (base::ContainsKey(remote_device.software_features, - multidevice::SoftwareFeature::kSmartLockHost) && + if (base::Contains(remote_device.software_features, + multidevice::SoftwareFeature::kSmartLockHost) && remote_device.software_features.at( multidevice::SoftwareFeature::kSmartLockHost) == multidevice::SoftwareFeatureState::kEnabled) {
diff --git a/chrome/browser/chromeos/login/enterprise_enrollment_browsertest.cc b/chrome/browser/chromeos/login/enterprise_enrollment_browsertest.cc index 743f8626..cb86068 100644 --- a/chrome/browser/chromeos/login/enterprise_enrollment_browsertest.cc +++ b/chrome/browser/chromeos/login/enterprise_enrollment_browsertest.cc
@@ -57,6 +57,8 @@ constexpr char kAdConfigurationSelect[] = "joinConfigSelect"; constexpr char kSubmitButton[] = "submitButton"; constexpr char kNextButton[] = "nextButton"; +constexpr char kWebview[] = "oauth-enroll-auth-view"; +constexpr char kPartitionAttribute[] = ".partition"; constexpr char kAdEncryptionTypesSelect[] = "encryptionList"; constexpr char kAdMachineOrgUnitInput[] = "orgUnitInput"; @@ -525,6 +527,28 @@ enrollment_ui_.WaitForStep(test::ui::kEnrollmentStepSuccess); } +// Verifies that the storage partition is updated when the enrollment screen is +// shown again. +IN_PROC_BROWSER_TEST_F(EnterpriseEnrollmentTest, StoragePartitionUpdated) { + ShowEnrollmentScreen(); + ExecutePendingJavaScript(); + + std::string webview_partition_path = + test::GetOobeElementPath({kEnrollmentUI, kWebview}) + kPartitionAttribute; + std::string webview_partition_name_1 = + test::OobeJS().GetString(webview_partition_path); + + // Simulate navigating over the enrollment screen a second time (without using + // 'Back' and 'Next' buttons). + ShowEnrollmentScreen(); + ExecutePendingJavaScript(); + std::string webview_partition_name_2 = + test::OobeJS().GetString(webview_partition_path); + + // Check that the partition was updated. + EXPECT_NE(webview_partition_name_1, webview_partition_name_2); +} + // Shows the enrollment screen and mocks the enrollment helper to show Active // Directory domain join screen. Verifies the domain join screen is displayed. // Submits Active Directory credentials. Verifies that the AuthpolicyClient
diff --git a/chrome/browser/chromeos/login/existing_user_controller.cc b/chrome/browser/chromeos/login/existing_user_controller.cc index fe27eb1..d3483a8a 100644 --- a/chrome/browser/chromeos/login/existing_user_controller.cc +++ b/chrome/browser/chromeos/login/existing_user_controller.cc
@@ -206,8 +206,14 @@ &TransferHttpAuthCacheToSystemNetworkContext, completion_callback)); } -// Record UMA for password login of regular user when Easy sign-in is enabled. +// Record UMA for password login of regular user when Signin with Smart Lock is +// enabled. Excludes signins in the multi-signin context; only records for the +// signin screen context. void RecordPasswordLoginEvent(const UserContext& user_context) { + // If a user is already logged in, this is a multi-signin attempt. Disregard. + if (session_manager::SessionManager::Get()->IsInSecondaryLoginScreen()) + return; + EasyUnlockService* easy_unlock_service = EasyUnlockService::Get(ProfileHelper::GetSigninProfile()); if (user_context.GetUserType() == user_manager::USER_TYPE_REGULAR &&
diff --git a/chrome/browser/chromeos/login/lock/screen_locker.cc b/chrome/browser/chromeos/login/lock/screen_locker.cc index acbc38b2..65807e3 100644 --- a/chrome/browser/chromeos/login/lock/screen_locker.cc +++ b/chrome/browser/chromeos/login/lock/screen_locker.cc
@@ -247,8 +247,7 @@ } void ScreenLocker::OnAuthSuccess(const UserContext& user_context) { - CHECK(!base::ContainsKey(users_with_disabled_auth_, - user_context.GetAccountId())) + CHECK(!base::Contains(users_with_disabled_auth_, user_context.GetAccountId())) << "Authentication is disabled for this user."; incorrect_passwords_count_ = 0; @@ -338,8 +337,7 @@ << "Invalid user trying to unlock."; // Do not attempt authentication if it is disabled for the user. - if (base::ContainsKey(users_with_disabled_auth_, - user_context.GetAccountId())) { + if (base::Contains(users_with_disabled_auth_, user_context.GetAccountId())) { VLOG(1) << "Authentication disabled for user."; if (auth_status_consumer_) auth_status_consumer_->OnAuthFailure( @@ -603,7 +601,7 @@ } bool ScreenLocker::IsAuthEnabledForUser(const AccountId& account_id) { - return !base::ContainsKey(users_with_disabled_auth_, account_id); + return !base::Contains(users_with_disabled_auth_, account_id); } void ScreenLocker::SetAuthenticatorsForTesting( @@ -708,8 +706,7 @@ quick_unlock::QuickUnlockFactory::GetForUser(active_user); if (!quick_unlock_storage || !quick_unlock_storage->IsFingerprintAuthenticationAvailable() || - base::ContainsKey(users_with_disabled_auth_, - active_user->GetAccountId())) { + base::Contains(users_with_disabled_auth_, active_user->GetAccountId())) { return; } @@ -724,7 +721,7 @@ } UserContext user_context(*active_user); - if (!base::ContainsKey(matches, active_user->username_hash())) { + if (!base::Contains(matches, active_user->username_hash())) { LOG(ERROR) << "Fingerprint unlock failed because it does not match active" << " user's record"; OnFingerprintAuthFailure(*active_user);
diff --git a/chrome/browser/chromeos/login/lock_screen_utils.cc b/chrome/browser/chromeos/login/lock_screen_utils.cc index eb1a1dbd..8a1a2a4 100644 --- a/chrome/browser/chromeos/login/lock_screen_utils.cc +++ b/chrome/browser/chromeos/login/lock_screen_utils.cc
@@ -79,8 +79,8 @@ users_last_input_methods->SetKey(username, base::Value("")); return false; } - if (!base::ContainsValue(ime_state->GetActiveInputMethodIds(), - user_input_method)) { + if (!base::Contains(ime_state->GetActiveInputMethodIds(), + user_input_method)) { if (!ime_state->EnableInputMethod(user_input_method)) { DLOG(ERROR) << "SetUserInputMethod: user input method '" << user_input_method
diff --git a/chrome/browser/chromeos/login/screens/welcome_screen.cc b/chrome/browser/chromeos/login/screens/welcome_screen.cc index 15485fc..c921baa 100644 --- a/chrome/browser/chromeos/login/screens/welcome_screen.cc +++ b/chrome/browser/chromeos/login/screens/welcome_screen.cc
@@ -129,8 +129,7 @@ input_method::InputMethodManager::Get() ->GetActiveIMEState() ->GetActiveInputMethodIds(); - if (input_method.empty() || - !base::ContainsValue(input_methods, input_method)) { + if (input_method.empty() || !base::Contains(input_methods, input_method)) { LOG(WARNING) << "The input method is empty or ineligible!"; return; }
diff --git a/chrome/browser/chromeos/login/test/session_flags_manager.cc b/chrome/browser/chromeos/login/test/session_flags_manager.cc index 20563c43..b99f0542 100644 --- a/chrome/browser/chromeos/login/test/session_flags_manager.cc +++ b/chrome/browser/chromeos/login/test/session_flags_manager.cc
@@ -212,10 +212,10 @@ if (has_restart_job) { const std::vector<std::string>& argv = FakeSessionManagerClient::Get()->restart_job_argv().value(); - DCHECK(base::ContainsValue( - argv, base::StringPrintf("--%s=%s", switches::kLoginUser, - user_manager::kGuestUserName))); - DCHECK(base::ContainsValue( + DCHECK( + base::Contains(argv, base::StringPrintf("--%s=%s", switches::kLoginUser, + user_manager::kGuestUserName))); + DCHECK(base::Contains( argv, base::StringPrintf("--%s=%s", switches::kLoginProfile, "user"))); cached_state.SetKey(kRestartJobKey, GetSwitchesValueFromArgv(argv));
diff --git a/chrome/browser/chromeos/platform_keys/key_permissions.cc b/chrome/browser/chromeos/platform_keys/key_permissions.cc index 4c78fa5..2416ea1 100644 --- a/chrome/browser/chromeos/platform_keys/key_permissions.cc +++ b/chrome/browser/chromeos/platform_keys/key_permissions.cc
@@ -148,8 +148,7 @@ bool IsKeyOnUserSlot( const std::vector<KeyPermissions::KeyLocation>& key_locations) { - return base::ContainsValue(key_locations, - KeyPermissions::KeyLocation::kUserSlot); + return base::Contains(key_locations, KeyPermissions::KeyLocation::kUserSlot); } } // namespace
diff --git a/chrome/browser/chromeos/platform_keys/platform_keys_service.cc b/chrome/browser/chromeos/platform_keys/platform_keys_service.cc index 02974f7..0ea203e1 100644 --- a/chrome/browser/chromeos/platform_keys/platform_keys_service.cc +++ b/chrome/browser/chromeos/platform_keys/platform_keys_service.cc
@@ -478,7 +478,7 @@ certificate->cert_buffer(), &unused_key_size, &actual_key_type); const std::vector<net::X509Certificate::PublicKeyType>& accepted_types = request_.certificate_key_types; - if (!base::ContainsValue(accepted_types, actual_key_type)) + if (!base::Contains(accepted_types, actual_key_type)) continue; }
diff --git a/chrome/browser/chromeos/policy/cloud_external_data_policy_observer.cc b/chrome/browser/chromeos/policy/cloud_external_data_policy_observer.cc index a9b77e9..798adcca 100644 --- a/chrome/browser/chromeos/policy/cloud_external_data_policy_observer.cc +++ b/chrome/browser/chromeos/policy/cloud_external_data_policy_observer.cc
@@ -170,7 +170,7 @@ } const std::string& user_id = user->GetAccountId().GetUserEmail(); - if (base::ContainsKey(logged_in_user_observers_, user_id)) { + if (base::Contains(logged_in_user_observers_, user_id)) { NOTREACHED(); return; } @@ -183,7 +183,7 @@ void CloudExternalDataPolicyObserver::OnPolicyUpdated( const std::string& user_id) { - if (base::ContainsKey(logged_in_user_observers_, user_id)) { + if (base::Contains(logged_in_user_observers_, user_id)) { // When a device-local account is logged in, a policy change triggers both // OnPolicyUpdated() and PolicyServiceObserver::OnPolicyUpdated(). Ignore // the former so that the policy change is handled only once. @@ -252,7 +252,7 @@ for (DeviceLocalAccountEntryMap::iterator it = device_local_account_entries_.begin(); it != device_local_account_entries_.end(); ) { - if (!base::ContainsKey(device_local_accounts, it->first)) { + if (!base::Contains(device_local_accounts, it->first)) { const std::string user_id = it->first; device_local_account_entries_.erase(it++); // When a device-local account whose external data reference was set is
diff --git a/chrome/browser/chromeos/policy/device_local_account_policy_service.cc b/chrome/browser/chromeos/policy/device_local_account_policy_service.cc index e03310db..2dd3576 100644 --- a/chrome/browser/chromeos/policy/device_local_account_policy_service.cc +++ b/chrome/browser/chromeos/policy/device_local_account_policy_service.cc
@@ -111,7 +111,7 @@ for (base::FilePath path = enumerator.Next(); !path.empty(); path = enumerator.Next()) { const std::string subdirectory(path.BaseName().MaybeAsASCII()); - if (!base::ContainsKey(subdirectories_to_keep, subdirectory)) + if (!base::Contains(subdirectories_to_keep, subdirectory)) base::DeleteFile(path, true); } }
diff --git a/chrome/browser/chromeos/policy/network_policy_application_browsertest.cc b/chrome/browser/chromeos/policy/network_policy_application_browsertest.cc new file mode 100644 index 0000000..a7b98ef --- /dev/null +++ b/chrome/browser/chromeos/policy/network_policy_application_browsertest.cc
@@ -0,0 +1,421 @@ +// 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 <sys/types.h> +#include <utility> + +#include "base/command_line.h" +#include "base/macros.h" +#include "base/test/values_test_util.h" +#include "chrome/browser/chromeos/login/login_manager_test.h" +#include "chrome/browser/chromeos/login/startup_utils.h" +#include "chrome/browser/chromeos/profiles/profile_helper.h" +#include "chromeos/constants/chromeos_switches.h" +#include "chromeos/dbus/shill/shill_device_client.h" +#include "chromeos/dbus/shill/shill_manager_client.h" +#include "chromeos/dbus/shill/shill_profile_client.h" +#include "chromeos/dbus/shill/shill_service_client.h" +#include "chromeos/network/managed_network_configuration_handler.h" +#include "chromeos/network/network_handler.h" +#include "chromeos/network/network_policy_observer.h" +#include "components/account_id/account_id.h" +#include "components/policy/core/browser/browser_policy_connector.h" +#include "components/policy/core/common/cloud/policy_builder.h" +#include "components/policy/core/common/mock_configuration_policy_provider.h" +#include "components/policy/core/common/policy_map.h" +#include "components/policy/policy_constants.h" +#include "content/public/test/browser_test.h" +#include "dbus/object_path.h" +#include "third_party/cros_system_api/dbus/service_constants.h" + +using base::test::DictionaryHasValue; + +namespace chromeos { + +namespace { + +constexpr char kUserProfilePath[] = "user_profile"; +constexpr char kSharedProfilePath[] = "/profile/default"; +constexpr char kServiceWifi1[] = "/service/1"; +constexpr char kServiceWifi2[] = "/service/2"; + +// A utility to wait until a FakeShillServiceClient's service has been +// connected. +// Usage: +// (1) Construct a ServiceConnectedWaiter, specifying the shill service path +// that is expected to connect. +// (2) Call ServiceConnectedWaiter::Wait +// Wait will return when the service passed to (1) connects. If the service has +// connected between (1) and (2), Wait returns immediately. Note that this class +// does not evaluate whether the service was connected before (1). +class ServiceConnectedWaiter { + public: + ServiceConnectedWaiter( + ShillServiceClient::TestInterface* shill_service_client_test, + const std::string& service_path) + : shill_service_client_test_(shill_service_client_test), + service_path_(service_path) { + shill_service_client_test_->SetConnectBehavior(service_path_, + run_loop_.QuitClosure()); + } + + // Waits until the |service_path| passed to the constructor has connected. + // If it has connected since the constructor has run, will return immediately. + void Wait() { + run_loop_.Run(); + shill_service_client_test_->SetConnectBehavior(service_path_, + base::RepeatingClosure()); + } + + private: + ShillServiceClient::TestInterface* shill_service_client_test_; + std::string service_path_; + base::RunLoop run_loop_; + + DISALLOW_COPY_AND_ASSIGN(ServiceConnectedWaiter); +}; + +// Registers itself as NetworkPolicyObserver and records events for +// NetworkPolicyObserver::PoliciesApplied and +// NetworkPolicyObserver::PolicyAppliedtoNetwork. +class ScopedNetworkPolicyApplicationObserver : public NetworkPolicyObserver { + public: + ScopedNetworkPolicyApplicationObserver() { + ManagedNetworkConfigurationHandler* managed_network_configuration_handler = + NetworkHandler::Get()->managed_network_configuration_handler(); + managed_network_configuration_handler->AddObserver(this); + } + + ~ScopedNetworkPolicyApplicationObserver() override { + ManagedNetworkConfigurationHandler* managed_network_configuration_handler = + NetworkHandler::Get()->managed_network_configuration_handler(); + managed_network_configuration_handler->RemoveObserver(this); + } + + void PoliciesApplied(const std::string& userhash) override { + policies_applied_events_.push_back(userhash); + } + + void PolicyAppliedToNetwork(const std::string& service_path) override { + policy_applied_to_network_events_.push_back(service_path); + } + + const std::vector<std::string>& policies_applied_events() { + return policies_applied_events_; + } + const std::vector<std::string>& policy_applied_to_network_events() { + return policy_applied_to_network_events_; + } + + // Clears all recorded events. + void ResetEvents() { + policies_applied_events_.clear(); + policy_applied_to_network_events_.clear(); + } + + private: + std::vector<std::string> policies_applied_events_; + std::vector<std::string> policy_applied_to_network_events_; +}; + +} // namespace + +// This class is used for implementing integration tests for network policy +// application across sign-in screen and/or user session. +class NetworkPolicyApplicationTest : public LoginManagerTest { + public: + NetworkPolicyApplicationTest() + : LoginManagerTest(true /* should_launch_browser */, + true /* should_initialize_webui */), + test_account_id_(AccountId::FromUserEmailGaiaId( + policy::PolicyBuilder::kFakeUsername, + policy::PolicyBuilder::kFakeGaiaId)) {} + + protected: + // InProcessBrowserTest: + void SetUp() override { + EXPECT_CALL(policy_provider_, IsInitializationComplete(testing::_)) + .WillRepeatedly(testing::Return(true)); + policy::BrowserPolicyConnector::SetPolicyProviderForTesting( + &policy_provider_); + + LoginManagerTest::SetUp(); + } + + void SetUpCommandLine(base::CommandLine* command_line) override { + LoginManagerTest::SetUpCommandLine(command_line); + + // Allow policy fetches to fail - these tests use + // MockConfigurationPolicyProvider. + command_line->AppendSwitch(switches::kAllowFailedPolicyFetchForTest); + } + + void SetUpInProcessBrowserTestFixture() override { + LoginManagerTest::SetUpInProcessBrowserTestFixture(); + } + + void SetUpOnMainThread() override { + LoginManagerTest::SetUpOnMainThread(); + + shill_manager_client_test_ = ShillManagerClient::Get()->GetTestInterface(); + shill_service_client_test_ = ShillServiceClient::Get()->GetTestInterface(); + shill_profile_client_test_ = ShillProfileClient::Get()->GetTestInterface(); + shill_device_client_test_ = ShillDeviceClient::Get()->GetTestInterface(); + shill_service_client_test_->ClearServices(); + shill_device_client_test_->ClearDevices(); + shill_profile_client_test_->ClearProfiles(); + + shill_manager_client_test_->AddTechnology(shill::kTypeWifi, + true /* enabled */); + shill_device_client_test_->AddDevice("/device/wifi1", shill::kTypeWifi, + "stub_wifi_device1"); + shill_profile_client_test_->AddProfile(kSharedProfilePath, ""); + shill_service_client_test_->ClearServices(); + } + + void SetDeviceOpenNetworkConfiguration( + const std::string& device_onc_policy_blob) { + current_policy_.Set( + policy::key::kDeviceOpenNetworkConfiguration, + policy::POLICY_LEVEL_MANDATORY, policy::POLICY_SCOPE_MACHINE, + policy::POLICY_SOURCE_CLOUD, + std::make_unique<base::Value>(device_onc_policy_blob), nullptr); + policy_provider_.UpdateChromePolicy(current_policy_); + } + + void SetUserOpenNetworkConfiguration( + const std::string& user_onc_policy_blob) { + current_policy_.Set( + policy::key::kOpenNetworkConfiguration, policy::POLICY_LEVEL_MANDATORY, + policy::POLICY_SCOPE_USER, policy::POLICY_SOURCE_CLOUD, + std::make_unique<base::Value>(user_onc_policy_blob), nullptr); + policy_provider_.UpdateChromePolicy(current_policy_); + } + + void OnConnectToServiceFailed(base::OnceClosure run_loop_quit_closure, + const std::string& error_name, + const std::string& error_message) { + ADD_FAILURE() << "Connect failed with " << error_name << " - " + << error_message; + std::move(run_loop_quit_closure).Run(); + } + + void ConnectToService(const std::string& service_path) { + base::RunLoop run_loop; + ShillServiceClient::Get()->Connect( + dbus::ObjectPath(service_path), run_loop.QuitClosure(), + base::BindRepeating( + &NetworkPolicyApplicationTest::OnConnectToServiceFailed, + base::Unretained(this), run_loop.QuitClosure())); + run_loop.Run(); + } + + // Unowned pointers -- just pointers to the singleton instances. + ShillManagerClient::TestInterface* shill_manager_client_test_ = nullptr; + ShillServiceClient::TestInterface* shill_service_client_test_ = nullptr; + ShillProfileClient::TestInterface* shill_profile_client_test_ = nullptr; + ShillDeviceClient::TestInterface* shill_device_client_test_ = nullptr; + + AccountId test_account_id_; + + private: + policy::MockConfigurationPolicyProvider policy_provider_; + policy::PolicyMap current_policy_; + + DISALLOW_COPY_AND_ASSIGN(NetworkPolicyApplicationTest); +}; + +IN_PROC_BROWSER_TEST_F(NetworkPolicyApplicationTest, + PRE_OnlyPolicyAutoconnectWithSlowUserPolicyApplication) { + RegisterUser(test_account_id_); + StartupUtils::MarkOobeCompleted(); +} + +// This test applies a global network policy with +// AllowOnlyPolicyNetworksToAutoconnect set to true. It then performs a user +// log-in and simulates that user policy application is slow. This is a +// regression test for https://crbug.com/936677. +IN_PROC_BROWSER_TEST_F(NetworkPolicyApplicationTest, + OnlyPolicyAutoconnectWithSlowUserPolicyApplication) { + ScopedNetworkPolicyApplicationObserver network_policy_application_observer; + + // Set up two services. + shill_service_client_test_->AddService( + kServiceWifi1, "wifi_orig_guid_1", "WifiOne", shill::kTypeWifi, + shill::kStateOnline, true /* add_to_visible */); + shill_service_client_test_->SetServiceProperty( + kServiceWifi1, shill::kSSIDProperty, base::Value("WifiOne")); + shill_service_client_test_->SetServiceProperty( + kServiceWifi1, shill::kSecurityClassProperty, + base::Value(shill::kSecurityPsk)); + + shill_service_client_test_->AddService( + kServiceWifi2, "wifi_orig_guid_2", "WifiTwo", shill::kTypeWifi, + shill::kStateOnline, true /* add_to_visible */); + shill_service_client_test_->SetServiceProperty( + kServiceWifi2, shill::kSSIDProperty, base::Value("WifiTwo")); + shill_service_client_test_->SetServiceProperty( + kServiceWifi2, shill::kSecurityClassProperty, + base::Value(shill::kSecurityPsk)); + + // Apply device ONC policy and wait until it takes effect (one of the networks + // auto connects). + const char kDeviceONC[] = R"( + { + "GlobalNetworkConfiguration": { + "AllowOnlyPolicyNetworksToAutoconnect": true, + "AllowOnlyPolicyNetworksToConnect": false + }, + "NetworkConfigurations": [ + { + "GUID": "{device-policy-for-Wifi1}", + "Name": "DeviceLevelWifi", + "Type": "WiFi", + "WiFi": { + "AutoConnect": true, + "HiddenSSID": false, + "Passphrase": "DeviceLevelWifiPwd", + "SSID": "WifiOne", + "Security": "WPA-PSK" + } + } + ] + })"; + ServiceConnectedWaiter wifi_one_connected_waiter(shill_service_client_test_, + kServiceWifi1); + shill_manager_client_test_->SetBestServiceToConnect(kServiceWifi1); + SetDeviceOpenNetworkConfiguration(kDeviceONC); + wifi_one_connected_waiter.Wait(); + + EXPECT_THAT( + network_policy_application_observer.policy_applied_to_network_events(), + testing::ElementsAre(kServiceWifi1)); + EXPECT_THAT(network_policy_application_observer.policies_applied_events(), + testing::ElementsAre(std::string() /* shill shared profile */)); + network_policy_application_observer.ResetEvents(); + + base::Optional<std::string> wifi_service = + shill_service_client_test_->FindServiceMatchingGUID( + "{device-policy-for-Wifi1}"); + ASSERT_TRUE(wifi_service); + { + const base::Value* wifi_service_properties = + shill_service_client_test_->GetServiceProperties(wifi_service.value()); + ASSERT_TRUE(wifi_service_properties); + EXPECT_THAT( + *wifi_service_properties, + DictionaryHasValue(shill::kAutoConnectProperty, base::Value(true))); + EXPECT_THAT(*wifi_service_properties, + DictionaryHasValue(shill::kProfileProperty, + base::Value(kSharedProfilePath))); + } + + // Manually connect to the other network. + ConnectToService(kServiceWifi2); + + // Sign-in a user and apply user ONC policy. Simulate that shill takes a while + // to reflect the changes back to chrome by holding back service property + // updates (regression test for https://crbug.com/936677). + shill_service_client_test_->SetHoldBackServicePropertyUpdates(true); + + std::string user_hash = + chromeos::ProfileHelper::GetUserIdHashByUserIdForTesting( + test_account_id_.GetUserEmail()); + LoginUser(test_account_id_); + shill_profile_client_test_->AddProfile(kUserProfilePath, user_hash); + + const char kUserONC[] = R"( + { + "NetworkConfigurations": [ + { + "GUID": "{user-policy-for-Wifi1}", + "Name": "DeviceLevelWifi", + "Type": "WiFi", + "WiFi": { + "AutoConnect": false, + "HiddenSSID": false, + "Passphrase": "DeviceLevelWifiPwd", + "SSID": "WifiOne", + "Security": "WPA-PSK" + } + }, + { + "GUID": "{user-policy-for-Wifi2}", + "Name": "UserLevelWifi", + "Type": "WiFi", + "WiFi": { + "AutoConnect": true, + "HiddenSSID": false, + "Passphrase": "UserLevelWifiPwd", + "SSID": "WifiTwo", + "Security": "WPA-PSK" + } + } + ] + })"; + SetUserOpenNetworkConfiguration(kUserONC); + base::RunLoop().RunUntilIdle(); + + // Expect that the policies have not been signalled as applied yet because + // property updates are being held back by FakeShillServiceClient. + EXPECT_TRUE( + network_policy_application_observer.policy_applied_to_network_events() + .empty()); + EXPECT_TRUE( + network_policy_application_observer.policies_applied_events().empty()); + + shill_service_client_test_->SetHoldBackServicePropertyUpdates(false); + base::RunLoop().RunUntilIdle(); + EXPECT_THAT( + network_policy_application_observer.policy_applied_to_network_events(), + testing::ElementsAre(kServiceWifi1, kServiceWifi2)); + EXPECT_THAT(network_policy_application_observer.policies_applied_events(), + testing::ElementsAre(user_hash)); + + // Expect that the same service path now has the user policy GUID. + { + const base::Value* wifi_service_properties = + shill_service_client_test_->GetServiceProperties(wifi_service.value()); + ASSERT_TRUE(wifi_service_properties); + EXPECT_THAT(*wifi_service_properties, + DictionaryHasValue(shill::kGuidProperty, + base::Value("{user-policy-for-Wifi1}"))); + EXPECT_THAT( + *wifi_service_properties, + DictionaryHasValue(shill::kAutoConnectProperty, base::Value(false))); + EXPECT_THAT(*wifi_service_properties, + DictionaryHasValue(shill::kProfileProperty, + base::Value(kUserProfilePath))); + EXPECT_THAT(*wifi_service_properties, + DictionaryHasValue(shill::kStateProperty, + base::Value(shill::kStateIdle))); + } + + base::Optional<std::string> wifi2_service = + shill_service_client_test_->FindServiceMatchingGUID( + "{user-policy-for-Wifi2}"); + ASSERT_TRUE(wifi2_service); + { + const base::Value* wifi_service_properties = + shill_service_client_test_->GetServiceProperties(wifi2_service.value()); + ASSERT_TRUE(wifi_service_properties); + EXPECT_THAT( + *wifi_service_properties, + DictionaryHasValue(shill::kAutoConnectProperty, base::Value(true))); + // This service is still connected. This is an important check in this + // regression test: + // In https://crbug.com/936677, AutoConnectHandler was already running + // (because OnPoliciesApplied was already triggered) when the NetworkState + // for a policy-managed network was not marked managed yet (because shill + // has not reflected the property changes yet). As a consequence, + // AutoConnectHandler disconnected the current network because of the global + // AllowOnlyPolicyNetworksToAutoconnect policy. Verify that this has not + // happened in this test. + EXPECT_THAT(*wifi_service_properties, + DictionaryHasValue(shill::kStateProperty, + base::Value(shill::kStateOnline))); + } +} + +} // namespace chromeos
diff --git a/chrome/browser/chromeos/policy/server_backed_state_keys_broker.cc b/chrome/browser/chromeos/policy/server_backed_state_keys_broker.cc index ae109b6f..73d2b912 100644 --- a/chrome/browser/chromeos/policy/server_backed_state_keys_broker.cc +++ b/chrome/browser/chromeos/policy/server_backed_state_keys_broker.cc
@@ -71,7 +71,7 @@ requested_ = false; if (state_keys.empty()) { LOG(WARNING) << "Failed to obtain server-backed state keys."; - } else if (base::ContainsValue(state_keys, std::string())) { + } else if (base::Contains(state_keys, std::string())) { LOG(WARNING) << "Bad state keys."; } else { send_notification |= state_keys_ != state_keys;
diff --git a/chrome/browser/chromeos/printing/bulk_printers_calculator.cc b/chrome/browser/chromeos/printing/bulk_printers_calculator.cc index 95b7b26..80050c1 100644 --- a/chrome/browser/chromeos/printing/bulk_printers_calculator.cc +++ b/chrome/browser/chromeos/printing/bulk_printers_calculator.cc
@@ -177,14 +177,14 @@ break; case BulkPrintersCalculator::WHITELIST_ONLY: for (const auto& printer : *printers_cache_) { - if (base::ContainsKey(whitelist_, printer->id())) { + if (base::Contains(whitelist_, printer->id())) { task_data->printers.insert({printer->id(), *printer}); } } break; case BulkPrintersCalculator::BLACKLIST_ONLY: for (const auto& printer : *printers_cache_) { - if (!base::ContainsKey(blacklist_, printer->id())) { + if (!base::Contains(blacklist_, printer->id())) { task_data->printers.insert({printer->id(), *printer}); } }
diff --git a/chrome/browser/chromeos/printing/cups_print_job_manager_impl.cc b/chrome/browser/chromeos/printing/cups_print_job_manager_impl.cc index 9ecff60..1216e9f 100644 --- a/chrome/browser/chromeos/printing/cups_print_job_manager_impl.cc +++ b/chrome/browser/chromeos/printing/cups_print_job_manager_impl.cc
@@ -119,7 +119,7 @@ // Returns true if |job|.state_reasons contains |reason| bool JobContainsReason(const ::printing::CupsJob& job, base::StringPiece reason) { - return base::ContainsValue(job.state_reasons, reason); + return base::Contains(job.state_reasons, reason); } // Extracts an ErrorCode from PrinterStatus#reasons. Returns NO_ERROR if there
diff --git a/chrome/browser/chromeos/printing/cups_print_job_notification_manager.cc b/chrome/browser/chromeos/printing/cups_print_job_notification_manager.cc index 101c5cd..9f36e5b 100644 --- a/chrome/browser/chromeos/printing/cups_print_job_notification_manager.cc +++ b/chrome/browser/chromeos/printing/cups_print_job_notification_manager.cc
@@ -28,7 +28,7 @@ base::WeakPtr<CupsPrintJob> job) { if (!job) return; - if (base::ContainsKey(notification_map_, job.get())) + if (base::Contains(notification_map_, job.get())) return; notification_map_[job.get()] = std::make_unique<CupsPrintJobNotification>(this, job, profile_); @@ -87,7 +87,7 @@ base::WeakPtr<CupsPrintJob> job) { if (!job) return; - DCHECK(base::ContainsKey(notification_map_, job.get())); + DCHECK(base::Contains(notification_map_, job.get())); notification_map_[job.get()]->OnPrintJobStatusUpdated(); }
diff --git a/chrome/browser/chromeos/printing/cups_printers_manager_unittest.cc b/chrome/browser/chromeos/printing/cups_printers_manager_unittest.cc index fbef3bf8..df1142b 100644 --- a/chrome/browser/chromeos/printing/cups_printers_manager_unittest.cc +++ b/chrome/browser/chromeos/printing/cups_printers_manager_unittest.cc
@@ -146,7 +146,7 @@ std::vector<Printer>* target) { auto new_end = std::remove_if(target->begin(), target->end(), [&ids](const Printer& printer) -> bool { - return base::ContainsKey(ids, printer.id()); + return base::Contains(ids, printer.id()); }); target->resize(new_end - target->begin()); @@ -203,7 +203,7 @@ auto new_end = std::remove_if(detections_.begin(), detections_.end(), [&ids](const DetectedPrinter& detection) -> bool { - return base::ContainsKey(ids, detection.printer.id()); + return base::Contains(ids, detection.printer.id()); }); detections_.resize(new_end - detections_.begin());
diff --git a/chrome/browser/chromeos/printing/ppd_resolution_tracker.cc b/chrome/browser/chromeos/printing/ppd_resolution_tracker.cc index ef24e46..c7016a5b 100644 --- a/chrome/browser/chromeos/printing/ppd_resolution_tracker.cc +++ b/chrome/browser/chromeos/printing/ppd_resolution_tracker.cc
@@ -87,7 +87,7 @@ bool PpdResolutionTracker::PrinterStateExists( const std::string& printer_id) const { - return base::ContainsKey(printer_state_, printer_id); + return base::Contains(printer_state_, printer_id); } } // namespace chromeos
diff --git a/chrome/browser/chromeos/printing/printers_map.cc b/chrome/browser/chromeos/printing/printers_map.cc index 2bdbc8d..d63a389 100644 --- a/chrome/browser/chromeos/printing/printers_map.cc +++ b/chrome/browser/chromeos/printing/printers_map.cc
@@ -125,13 +125,13 @@ } bool PrintersMap::HasPrintersInClass(PrinterClass printer_class) const { - return base::ContainsKey(printers_, printer_class); + return base::Contains(printers_, printer_class); } bool PrintersMap::IsPrinterInClass(PrinterClass printer_class, const std::string& printer_id) const { return HasPrintersInClass(printer_class) && - base::ContainsKey(printers_.at(printer_class), printer_id); + base::Contains(printers_.at(printer_class), printer_id); } bool PrintersMap::IsExistingPrinter(const std::string& printer_id) const {
diff --git a/chrome/browser/chromeos/printing/printers_sync_bridge.cc b/chrome/browser/chromeos/printing/printers_sync_bridge.cc index 6daf6bd..395dd3b 100644 --- a/chrome/browser/chromeos/printing/printers_sync_bridge.cc +++ b/chrome/browser/chromeos/printing/printers_sync_bridge.cc
@@ -36,7 +36,7 @@ const sync_pb::PrinterSpecifics& specifics) { auto entity_data = std::make_unique<EntityData>(); *entity_data->specifics.mutable_printer() = specifics; - entity_data->non_unique_name = + entity_data->name = specifics.display_name().empty() ? "PRINTER" : specifics.display_name(); return entity_data; } @@ -188,7 +188,7 @@ // appropriate metadata. for (const auto& entry : all_data_) { const std::string& local_entity_id = entry.first; - if (!base::ContainsKey(sync_entity_ids, local_entity_id)) { + if (!base::Contains(sync_entity_ids, local_entity_id)) { // Only local objects which were not updated are uploaded. Objects for // which there was a remote copy are overwritten. change_processor()->Put(local_entity_id,
diff --git a/chrome/browser/chromeos/printing/usb_printer_notification_controller.cc b/chrome/browser/chromeos/printing/usb_printer_notification_controller.cc index 9cb3042d..e2247d6 100644 --- a/chrome/browser/chromeos/printing/usb_printer_notification_controller.cc +++ b/chrome/browser/chromeos/printing/usb_printer_notification_controller.cc
@@ -23,7 +23,7 @@ } void RemoveNotification(const std::string& printer_id) override { - if (!base::ContainsKey(notifications_, printer_id)) { + if (!base::Contains(notifications_, printer_id)) { return; } notifications_[printer_id]->CloseNotification(); @@ -31,7 +31,7 @@ } bool IsNotificationDisplayed(const std::string& printer_id) const override { - return base::ContainsKey(notifications_, printer_id); + return base::Contains(notifications_, printer_id); } void ShowSavedNotification(const Printer& printer) override { @@ -50,7 +50,7 @@ return; } - if (base::ContainsKey(notifications_, printer.id())) { + if (base::Contains(notifications_, printer.id())) { return; }
diff --git a/chrome/browser/chromeos/printing/zeroconf_printer_detector.cc b/chrome/browser/chromeos/printing/zeroconf_printer_detector.cc index 2abe2ea..43629c7 100644 --- a/chrome/browser/chromeos/printing/zeroconf_printer_detector.cc +++ b/chrome/browser/chromeos/printing/zeroconf_printer_detector.cc
@@ -304,7 +304,7 @@ this, discovery_client_.get(), service_type); lister->Start(); lister->DiscoverNewDevices(); - DCHECK(!base::ContainsKey(device_listers_, service_type)); + DCHECK(!base::Contains(device_listers_, service_type)); device_listers_[service_type] = std::move(lister); }
diff --git a/chrome/browser/chromeos/printing/zeroconf_printer_detector_unittest.cc b/chrome/browser/chromeos/printing/zeroconf_printer_detector_unittest.cc index fc1b06d7..a320f72d 100644 --- a/chrome/browser/chromeos/printing/zeroconf_printer_detector_unittest.cc +++ b/chrome/browser/chromeos/printing/zeroconf_printer_detector_unittest.cc
@@ -254,7 +254,7 @@ private: void SendUpdate(const ServiceDescription& description) { bool is_new; - if (!base::ContainsKey(announced_services_, description.service_name)) { + if (!base::Contains(announced_services_, description.service_name)) { is_new = true; announced_services_.insert(description.service_name); } else {
diff --git a/chrome/browser/chromeos/settings/device_settings_provider.cc b/chrome/browser/chromeos/settings/device_settings_provider.cc index 46650a74..66a3a6c7 100644 --- a/chrome/browser/chromeos/settings/device_settings_provider.cc +++ b/chrome/browser/chromeos/settings/device_settings_provider.cc
@@ -859,7 +859,7 @@ // static bool DeviceSettingsProvider::IsDeviceSetting(const std::string& name) { - return base::ContainsValue(kKnownSettings, name); + return base::Contains(kKnownSettings, name); } // static
diff --git a/chrome/browser/chromeos/wilco_dtc_supportd/mojo_utils.cc b/chrome/browser/chromeos/wilco_dtc_supportd/mojo_utils.cc index 503acc4a..778ff814 100644 --- a/chrome/browser/chromeos/wilco_dtc_supportd/mojo_utils.cc +++ b/chrome/browser/chromeos/wilco_dtc_supportd/mojo_utils.cc
@@ -4,67 +4,43 @@ #include "chrome/browser/chromeos/wilco_dtc_supportd/mojo_utils.h" -#include <cstdint> -#include <cstring> -#include <utility> - -#include "base/file_descriptor_posix.h" -#include "base/files/file.h" -#include "base/memory/shared_memory_handle.h" -#include "base/unguessable_token.h" -#include "mojo/public/c/system/types.h" +#include "base/memory/read_only_shared_memory_region.h" +#include "mojo/public/cpp/system/buffer.h" #include "mojo/public/cpp/system/platform_handle.h" namespace chromeos { base::StringPiece GetStringPieceFromMojoHandle( mojo::ScopedHandle handle, - std::unique_ptr<base::SharedMemory>* shared_memory) { - base::PlatformFile platform_file; - auto result = mojo::UnwrapPlatformFile(std::move(handle), &platform_file); - shared_memory->reset(); - if (result != MOJO_RESULT_OK) { - return base::StringPiece(); - } - base::UnguessableToken guid = base::UnguessableToken::Create(); - *shared_memory = std::make_unique<base::SharedMemory>( - base::SharedMemoryHandle( - base::FileDescriptor(platform_file, true /* iauto_close */), 0u, - guid), - true /* read_only */); + base::ReadOnlySharedMemoryMapping* shared_memory) { + mojo::ScopedSharedBufferHandle buffer_handle( + mojo::SharedBufferHandle(handle.release().value())); + base::ReadOnlySharedMemoryRegion memory_region = + UnwrapReadOnlySharedMemoryRegion(std::move(buffer_handle)); - base::SharedMemoryHandle dup_shared_memory_handle = - base::SharedMemory::DuplicateHandle((*shared_memory)->handle()); - const int64_t file_size = - base::File(dup_shared_memory_handle.GetHandle()).GetLength(); - if (file_size <= 0) { - shared_memory->reset(); + *shared_memory = memory_region.Map(); + if (!shared_memory->IsValid()) return base::StringPiece(); - } - if (!(*shared_memory)->Map(file_size)) { - shared_memory->reset(); - return base::StringPiece(); - } - return base::StringPiece(static_cast<const char*>((*shared_memory)->memory()), - (*shared_memory)->mapped_size()); + + return base::StringPiece(static_cast<const char*>(shared_memory->memory()), + shared_memory->size()); } mojo::ScopedHandle CreateReadOnlySharedMemoryMojoHandle( const std::string& content) { - if (content.empty()) { + if (content.empty()) return mojo::ScopedHandle(); - } - base::SharedMemory shared_memory; - base::SharedMemoryCreateOptions options; - options.size = content.length(); - options.share_read_only = true; - if (!shared_memory.Create(base::SharedMemoryCreateOptions(options)) || - !shared_memory.Map(content.length())) { + base::MappedReadOnlyRegion shm = + base::ReadOnlySharedMemoryRegion::Create(content.size()); + if (!shm.IsValid()) return mojo::ScopedHandle(); - } - memcpy(shared_memory.memory(), content.data(), content.length()); - return mojo::WrapPlatformFile(shared_memory.TakeHandle().GetHandle()); + memcpy(shm.mapping.memory(), content.data(), content.length()); + + mojo::ScopedSharedBufferHandle buffer_handle = + mojo::WrapReadOnlySharedMemoryRegion(std::move(shm.region)); + mojo::ScopedHandle handle(mojo::Handle(buffer_handle.release().value())); + return handle; } } // namespace chromeos
diff --git a/chrome/browser/chromeos/wilco_dtc_supportd/mojo_utils.h b/chrome/browser/chromeos/wilco_dtc_supportd/mojo_utils.h index 6f6c1b6..6bb828f3 100644 --- a/chrome/browser/chromeos/wilco_dtc_supportd/mojo_utils.h +++ b/chrome/browser/chromeos/wilco_dtc_supportd/mojo_utils.h
@@ -8,30 +8,28 @@ #include <memory> #include <string> -#include "base/memory/shared_memory.h" +#include "base/memory/shared_memory_mapping.h" #include "base/strings/string_piece.h" #include "mojo/public/cpp/system/handle.h" namespace chromeos { // Allows to get access to the buffer in read only shared memory. It converts -// mojo::Handle to base::SharedMemory and returns a string content. +// mojo::Handle to base::ReadOnlySharedMemoryMapping and returns a string +// content. // // |handle| must be a valid mojo handle of the non-empty buffer in the shared // memory. -// |shared_memory| must be a valid allocated unique pointer. // -// Returns an empty string and nullptr |shared_memory| if error. +// Returns an empty string and an invalid |shared_memory| if error. base::StringPiece GetStringPieceFromMojoHandle( mojo::ScopedHandle handle, - std::unique_ptr<base::SharedMemory>* shared_memory); + base::ReadOnlySharedMemoryMapping* shared_memory); // Allocates buffer in shared memory, copies |content| to the buffer and // converts shared buffer handle into |mojo::ScopedHandle|. // // Allocated shared memory is read only for another process. -// -// Returns invalid |mojo::ScopedHandle| if |content| is empty or error happened. mojo::ScopedHandle CreateReadOnlySharedMemoryMojoHandle( const std::string& content);
diff --git a/chrome/browser/chromeos/wilco_dtc_supportd/wilco_dtc_supportd_bridge.cc b/chrome/browser/chromeos/wilco_dtc_supportd/wilco_dtc_supportd_bridge.cc index 06dc2788..6a6bd7f 100644 --- a/chrome/browser/chromeos/wilco_dtc_supportd/wilco_dtc_supportd_bridge.cc +++ b/chrome/browser/chromeos/wilco_dtc_supportd/wilco_dtc_supportd_bridge.cc
@@ -9,7 +9,7 @@ #include "base/bind.h" #include "base/location.h" #include "base/logging.h" -#include "base/memory/shared_memory.h" +#include "base/memory/shared_memory_mapping.h" #include "base/process/process_handle.h" #include "base/strings/string_piece.h" #include "base/threading/thread_task_runner_handle.h" @@ -251,9 +251,9 @@ // Extract a GURL value from a ScopedHandle. GURL gurl; if (url.is_valid()) { - std::unique_ptr<base::SharedMemory> shared_memory; + base::ReadOnlySharedMemoryMapping shared_memory; gurl = GURL(GetStringPieceFromMojoHandle(std::move(url), &shared_memory)); - if (!shared_memory) { + if (!shared_memory.IsValid()) { LOG(ERROR) << "Failed to read data from mojo handle"; std::move(callback).Run( wilco_dtc_supportd::mojom::WilcoDtcSupportdWebRequestStatus:: @@ -265,16 +265,16 @@ // Extract headers from ScopedHandle's. std::vector<base::StringPiece> header_contents; - std::vector<std::unique_ptr<base::SharedMemory>> shared_memories; + std::vector<base::ReadOnlySharedMemoryMapping> shared_memories; for (auto& header : headers) { if (!header.is_valid()) { header_contents.push_back(""); continue; } - shared_memories.push_back(nullptr); + shared_memories.emplace_back(); header_contents.push_back(GetStringPieceFromMojoHandle( std::move(header), &shared_memories.back())); - if (!shared_memories.back()) { + if (!shared_memories.back().IsValid()) { LOG(ERROR) << "Failed to read data from mojo handle"; std::move(callback).Run( wilco_dtc_supportd::mojom::WilcoDtcSupportdWebRequestStatus:: @@ -287,10 +287,10 @@ // Extract a string value from a ScopedHandle. std::string request_body_content; if (request_body.is_valid()) { - std::unique_ptr<base::SharedMemory> shared_memory; + base::ReadOnlySharedMemoryMapping shared_memory; request_body_content = std::string( GetStringPieceFromMojoHandle(std::move(request_body), &shared_memory)); - if (!shared_memory) { + if (!shared_memory.IsValid()) { LOG(ERROR) << "Failed to read data from mojo handle"; std::move(callback).Run( wilco_dtc_supportd::mojom::WilcoDtcSupportdWebRequestStatus:: @@ -316,7 +316,7 @@ SendWilcoDtcMessageToUiCallback callback) { // Extract the string value of the received message. DCHECK(json_message); - std::unique_ptr<base::SharedMemory> json_message_shared_memory; + base::ReadOnlySharedMemoryMapping json_message_shared_memory; base::StringPiece json_message_string = GetStringPieceFromMojoHandle( std::move(json_message), &json_message_shared_memory); if (json_message_string.empty()) {
diff --git a/chrome/browser/chromeos/wilco_dtc_supportd/wilco_dtc_supportd_manager_unittest.cc b/chrome/browser/chromeos/wilco_dtc_supportd/wilco_dtc_supportd_manager_unittest.cc index f634dd03..24ee8c0 100644 --- a/chrome/browser/chromeos/wilco_dtc_supportd/wilco_dtc_supportd_manager_unittest.cc +++ b/chrome/browser/chromeos/wilco_dtc_supportd/wilco_dtc_supportd_manager_unittest.cc
@@ -6,8 +6,8 @@ #include "base/barrier_closure.h" #include "base/memory/ptr_util.h" -#include "base/message_loop/message_loop.h" #include "base/run_loop.h" +#include "base/test/scoped_task_environment.h" #include "chrome/browser/chromeos/login/users/fake_chrome_user_manager.h" #include "chrome/browser/chromeos/settings/scoped_testing_cros_settings.h" #include "chrome/browser/chromeos/settings/stub_cros_settings_provider.h" @@ -129,7 +129,7 @@ } private: - base::MessageLoop message_loop_; + base::test::ScopedTaskEnvironment scoped_task_environment_; ScopedTestingCrosSettings scoped_testing_cros_settings_; std::unique_ptr<TestUpstartClient> upstart_client_; FakeChromeUserManager* fake_user_manager_{new FakeChromeUserManager()};
diff --git a/chrome/browser/chromeos/wilco_dtc_supportd/wilco_dtc_supportd_messaging.cc b/chrome/browser/chromeos/wilco_dtc_supportd/wilco_dtc_supportd_messaging.cc index 58d7dd95..0d268a99 100644 --- a/chrome/browser/chromeos/wilco_dtc_supportd/wilco_dtc_supportd_messaging.cc +++ b/chrome/browser/chromeos/wilco_dtc_supportd/wilco_dtc_supportd_messaging.cc
@@ -12,7 +12,7 @@ #include "base/callback.h" #include "base/logging.h" #include "base/macros.h" -#include "base/memory/shared_memory.h" +#include "base/memory/shared_memory_mapping.h" #include "base/memory/weak_ptr.h" #include "base/strings/string_piece.h" #include "base/threading/thread_task_runner_handle.h" @@ -164,7 +164,7 @@ return; } - std::unique_ptr<base::SharedMemory> response_json_shared_memory; + base::ReadOnlySharedMemoryMapping response_json_shared_memory; base::StringPiece response_json_string = GetStringPieceFromMojoHandle( std::move(response_json_message), &response_json_shared_memory); if (response_json_string.empty()) {
diff --git a/chrome/browser/chromeos/wilco_dtc_supportd/wilco_dtc_supportd_messaging_unittest.cc b/chrome/browser/chromeos/wilco_dtc_supportd/wilco_dtc_supportd_messaging_unittest.cc index 0131863..88d66198 100644 --- a/chrome/browser/chromeos/wilco_dtc_supportd/wilco_dtc_supportd_messaging_unittest.cc +++ b/chrome/browser/chromeos/wilco_dtc_supportd/wilco_dtc_supportd_messaging_unittest.cc
@@ -10,7 +10,7 @@ #include "base/callback.h" #include "base/logging.h" #include "base/memory/scoped_refptr.h" -#include "base/memory/shared_memory.h" +#include "base/memory/shared_memory_mapping.h" #include "base/run_loop.h" #include "base/test/scoped_task_environment.h" #include "chrome/browser/chromeos/wilco_dtc_supportd/mojo_utils.h" @@ -52,7 +52,7 @@ std::string AssertGetStringFromMojoHandle(mojo::ScopedHandle handle) { if (!handle) return std::string(); - std::unique_ptr<base::SharedMemory> shared_memory; + base::ReadOnlySharedMemoryMapping shared_memory; std::string contents = GetStringPieceFromMojoHandle(std::move(handle), &shared_memory) .as_string();
diff --git a/chrome/browser/chromeos/wilco_dtc_supportd/wilco_dtc_supportd_web_request_service_unittest.cc b/chrome/browser/chromeos/wilco_dtc_supportd/wilco_dtc_supportd_web_request_service_unittest.cc index da4af570..66a9804 100644 --- a/chrome/browser/chromeos/wilco_dtc_supportd/wilco_dtc_supportd_web_request_service_unittest.cc +++ b/chrome/browser/chromeos/wilco_dtc_supportd/wilco_dtc_supportd_web_request_service_unittest.cc
@@ -10,11 +10,11 @@ #include "base/bind.h" #include "base/logging.h" #include "base/memory/scoped_refptr.h" -#include "base/memory/shared_memory.h" -#include "base/message_loop/message_loop.h" +#include "base/memory/shared_memory_mapping.h" #include "base/run_loop.h" #include "base/strings/string_piece.h" #include "base/strings/stringprintf.h" +#include "base/test/scoped_task_environment.h" #include "chrome/browser/chromeos/wilco_dtc_supportd/mojo_utils.h" #include "chrome/services/wilco_dtc_supportd/public/mojom/wilco_dtc_supportd.mojom.h" #include "net/base/net_errors.h" @@ -53,10 +53,10 @@ response_body = ""; return; } - std::unique_ptr<base::SharedMemory> shared_memory; + base::ReadOnlySharedMemoryMapping shared_memory; response_body = std::string(GetStringPieceFromMojoHandle( std::move(response_body_handle), &shared_memory)); - if (!shared_memory) { + if (!shared_memory.IsValid()) { response_body = ""; return; } @@ -150,7 +150,7 @@ std::unique_ptr<WilcoDtcSupportdWebRequestService> web_request_service_; network::TestURLLoaderFactory test_url_loader_factory_; - base::MessageLoop message_loop_; + base::test::ScopedTaskEnvironment scoped_task_environment_; }; } // namespace
diff --git a/chrome/browser/data_use_measurement/chrome_data_use_ascriber.cc b/chrome/browser/data_use_measurement/chrome_data_use_ascriber.cc deleted file mode 100644 index f03e697..0000000 --- a/chrome/browser/data_use_measurement/chrome_data_use_ascriber.cc +++ /dev/null
@@ -1,671 +0,0 @@ -// Copyright 2016 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/data_use_measurement/chrome_data_use_ascriber.h" - -#include <string> -#include <utility> -#include <vector> - -#include "base/feature_list.h" -#include "build/build_config.h" -#include "chrome/browser/data_use_measurement/chrome_data_use_measurement.h" -#include "chrome/browser/data_use_measurement/chrome_data_use_recorder.h" -#include "components/data_use_measurement/content/content_url_request_classifier.h" -#include "components/data_use_measurement/core/data_use_network_delegate.h" -#include "components/data_use_measurement/core/data_use_recorder.h" -#include "components/data_use_measurement/core/data_use_user_data.h" -#include "components/data_use_measurement/core/url_request_classifier.h" -#include "content/public/browser/browser_thread.h" -#include "content/public/browser/navigation_handle.h" -#include "content/public/browser/render_frame_host.h" -#include "content/public/browser/resource_request_info.h" -#include "ipc/ipc_message.h" -#include "net/url_request/url_request.h" - -namespace data_use_measurement { - -// This flag allows us to enable ChromeDataUseAscriber for data saver users -// using Finch. The default is to disable ChromeDataUseAscriber. -const base::Feature kDisableAscriberIfDataSaverDisabled{ - "DisableAscriberIfDataSaverDisabled", base::FEATURE_ENABLED_BY_DEFAULT}; - -// static -const void* const ChromeDataUseAscriber::DataUseRecorderEntryAsUserData:: - kDataUseAscriberUserDataKey = - &ChromeDataUseAscriber::DataUseRecorderEntryAsUserData:: - kDataUseAscriberUserDataKey; - -ChromeDataUseAscriber::DataUseRecorderEntryAsUserData:: - DataUseRecorderEntryAsUserData(DataUseRecorderEntry entry) - : entry_(entry) {} - -ChromeDataUseAscriber::DataUseRecorderEntryAsUserData:: - ~DataUseRecorderEntryAsUserData() {} - -ChromeDataUseAscriber::MainRenderFrameEntry::MainRenderFrameEntry( - ChromeDataUseAscriber::DataUseRecorderEntry data_use_recorder) - : data_use_recorder(data_use_recorder), is_visible(false) {} - -ChromeDataUseAscriber::MainRenderFrameEntry::~MainRenderFrameEntry() {} - -ChromeDataUseAscriber::ChromeDataUseAscriber() { - DCHECK_CURRENTLY_ON(content::BrowserThread::IO); -} - -ChromeDataUseAscriber::~ChromeDataUseAscriber() { - DCHECK_CURRENTLY_ON(content::BrowserThread::IO); - DCHECK(main_render_frame_entry_map_.empty()); - DCHECK(subframe_to_mainframe_map_.empty()); - - // DCHECK(pending_navigation_data_use_map_.empty()); - // DCHECK(data_use_recorders_.empty()); -} - -ChromeDataUseRecorder* ChromeDataUseAscriber::GetOrCreateDataUseRecorder( - net::URLRequest* request) { - auto entry = GetOrCreateDataUseRecorderEntry(request); - return entry == data_use_recorders_.end() ? nullptr : &(*entry); -} - -ChromeDataUseRecorder* ChromeDataUseAscriber::GetDataUseRecorder( - const net::URLRequest& request) { - DCHECK_CURRENTLY_ON(content::BrowserThread::IO); - - // If a DataUseRecorder has already been set as user data, then return that. - auto* user_data = - static_cast<DataUseRecorderEntryAsUserData*>(request.GetUserData( - DataUseRecorderEntryAsUserData::kDataUseAscriberUserDataKey)); - return user_data ? &(*user_data->recorder_entry()) : nullptr; -} - -ChromeDataUseAscriber::DataUseRecorderEntry -ChromeDataUseAscriber::GetDataUseRecorderEntry(const net::URLRequest* request) { - DCHECK_CURRENTLY_ON(content::BrowserThread::IO); - - // If a DataUseRecorder has already been set as user data, then return that. - auto* user_data = - static_cast<DataUseRecorderEntryAsUserData*>(request->GetUserData( - DataUseRecorderEntryAsUserData::kDataUseAscriberUserDataKey)); - return user_data ? user_data->recorder_entry() : data_use_recorders_.end(); -} - -ChromeDataUseAscriber::DataUseRecorderEntry -ChromeDataUseAscriber::GetOrCreateDataUseRecorderEntry( - net::URLRequest* request) { - DCHECK_CURRENTLY_ON(content::BrowserThread::IO); - - // If a DataUseRecorder has already been created, then return that. - auto recorder = GetDataUseRecorderEntry(request); - if (recorder != data_use_recorders_.end()) - return recorder; - - // If request is associated with a ChromeService, create a new - // DataUseRecorder for it. There is no reason to aggregate URLRequests - // from ChromeServices into the same DataUseRecorder instance. - DataUseUserData* service = static_cast<DataUseUserData*>( - request->GetUserData(DataUseUserData::kUserDataKey)); - if (service) { - auto entry = - CreateNewDataUseRecorder(request, DataUse::TrafficType::SERVICES); - entry->data_use().set_description(""); - return entry; - } - - if (!request->url().SchemeIsHTTPOrHTTPS()) - return data_use_recorders_.end(); - - content::ResourceRequestInfo* request_info = - content::ResourceRequestInfo::ForRequest(request); - if (!request_info || - request_info->GetGlobalRequestID() == content::GlobalRequestID()) { - // Create a new DataUseRecorder for all non-content initiated requests. - auto entry = - CreateNewDataUseRecorder(request, DataUse::TrafficType::UNKNOWN); - DataUse& data_use = entry->data_use(); - data_use.set_url(request->url()); - return entry; - } - - if (request_info->GetResourceType() == content::ResourceType::kMainFrame) { - auto new_entry = - CreateNewDataUseRecorder(request, DataUse::TrafficType::USER_TRAFFIC); - new_entry->set_main_frame_request_id(request_info->GetGlobalRequestID()); - pending_navigation_data_use_map_.insert( - std::make_pair(request_info->GetGlobalRequestID(), new_entry)); - return new_entry; - } - - int render_process_id = -1; - int render_frame_id = -1; - bool has_valid_frame = content::ResourceRequestInfo::GetRenderFrameForRequest( - request, &render_process_id, &render_frame_id); - if (has_valid_frame && - render_frame_id != SpecialRoutingIDs::MSG_ROUTING_NONE) { - // Browser tests may not set up DataUseWebContentsObservers in which case - // this class never sees navigation and frame events so DataUseRecorders - // will never be destroyed. To avoid this, we ignore requests whose - // render frames don't have a record. However, this can also be caused by - // URLRequests racing the frame create events. - // TODO(kundaji): Add UMA. - content::GlobalFrameRoutingId frame_key(render_process_id, render_frame_id); - const auto main_frame_key_iter = subframe_to_mainframe_map_.find(frame_key); - if (main_frame_key_iter == subframe_to_mainframe_map_.end()) { - return data_use_recorders_.end(); - } - const auto main_frame_it = - main_render_frame_entry_map_.find(main_frame_key_iter->second); - if (main_frame_it == main_render_frame_entry_map_.end() || - main_frame_it->second.data_use_recorder == data_use_recorders_.end()) { - return data_use_recorders_.end(); - } - - AscribeRecorderWithRequest(request, - main_frame_it->second.data_use_recorder); - return main_frame_it->second.data_use_recorder; - } - - // Create a new DataUseRecorder for all other requests. - auto entry = CreateNewDataUseRecorder( - request, - content::ResourceRequestInfo::OriginatedFromServiceWorker(request) - ? DataUse::TrafficType::SERVICE_WORKER - : DataUse::TrafficType::UNKNOWN); - DataUse& data_use = entry->data_use(); - data_use.set_url(request->url()); - return entry; -} - -void ChromeDataUseAscriber::OnBeforeUrlRequest(net::URLRequest* request) { - DCHECK_CURRENTLY_ON(content::BrowserThread::IO); - DCHECK(request); - - if (IsDisabled()) - return; - - requests_.insert(request); - DataUseAscriber::OnBeforeUrlRequest(request); -} - -void ChromeDataUseAscriber::OnUrlRequestCompleted(net::URLRequest* request, - bool started) { - DCHECK_CURRENTLY_ON(content::BrowserThread::IO); - DCHECK(request); - - if (IsDisabled()) - return; - - if (requests_.find(request) == requests_.end()) - return; - - const DataUseRecorderEntry entry = GetDataUseRecorderEntry(request); - - if (entry == data_use_recorders_.end()) { - requests_.erase(request); - return; - } - - for (auto& observer : observers_) - observer.OnPageResourceLoad(*request, &entry->data_use()); - - OnUrlRequestCompletedOrDestroyed(request); -} - -void ChromeDataUseAscriber::OnUrlRequestDestroyed(net::URLRequest* request) { - DCHECK_CURRENTLY_ON(content::BrowserThread::IO); - DCHECK(request); - - if (IsDisabled()) - return; - - if (requests_.find(request) == requests_.end()) - return; - - OnUrlRequestCompletedOrDestroyed(request); -} - -void ChromeDataUseAscriber::OnUrlRequestCompletedOrDestroyed( - net::URLRequest* request) { - DCHECK_CURRENTLY_ON(content::BrowserThread::IO); - DCHECK(request); - - if (IsDisabled()) - return; - - DCHECK(request); - - const DataUseRecorderEntry entry = GetDataUseRecorderEntry(request); - - if (entry == data_use_recorders_.end()) { - requests_.erase(request); - return; - } - - { - content::ResourceRequestInfo* request_info = - content::ResourceRequestInfo::ForRequest(request); - if (request_info && - request_info->GetResourceType() == content::ResourceType::kMainFrame && - !request->status().is_success()) { - // If mainframe request was not successful, then NavigationHandle in - // DidFinishMainFrameNavigation will not have GlobalRequestID. So we erase - // the DataUseRecorderEntry here. - pending_navigation_data_use_map_.erase(entry->main_frame_request_id()); - } - } - - const auto main_frame_it = - main_render_frame_entry_map_.find(entry->main_frame_id()); - - // Check whether the frame is tracked in the main render frame map, and if it - // is, check if |entry| is currently tracked by that frame. - bool frame_is_tracked = - main_frame_it != main_render_frame_entry_map_.end() && - main_frame_it->second.data_use_recorder != data_use_recorders_.end() && - main_frame_it->second.data_use_recorder == entry; - - // For non-main frame requests, the page load can only be tracked in the frame - // map. - bool page_load_is_tracked = frame_is_tracked; - - content::ResourceRequestInfo* request_info = - content::ResourceRequestInfo::ForRequest(request); - - // If the frame is not tracked, but this is a main frame request, it might be - // the case that the navigation has not commit yet. - if (!frame_is_tracked && request_info && - request_info->GetResourceType() == content::ResourceType::kMainFrame) { - page_load_is_tracked = - pending_navigation_data_use_map_.find(entry->main_frame_request_id()) != - pending_navigation_data_use_map_.end(); - } - - entry->OnUrlRequestDestroyed(request); - request->RemoveUserData( - DataUseRecorderEntryAsUserData::kDataUseAscriberUserDataKey); - - // If all requests are done for |entry| and no more requests can be attributed - // to it, it is safe to delete. - if (entry->IsDataUseComplete() && !page_load_is_tracked) { - NotifyPageLoadConcluded(entry); - data_use_recorders_.erase(entry); - } - - requests_.erase(request); -} - -void ChromeDataUseAscriber::RenderFrameCreated(int render_process_id, - int render_frame_id, - int main_render_process_id, - int main_render_frame_id) { - DCHECK_CURRENTLY_ON(content::BrowserThread::IO); - if (IsDisabled()) - return; - - const auto render_frame = - content::GlobalFrameRoutingId(render_process_id, render_frame_id); - - if (main_render_process_id != -1 && main_render_frame_id != -1) { - // Create an entry in |subframe_to_mainframe_map_| for this frame mapped to - // it's parent frame. - subframe_to_mainframe_map_.insert(std::make_pair( - render_frame, content::GlobalFrameRoutingId(main_render_process_id, - main_render_frame_id))); - } else { - subframe_to_mainframe_map_.insert( - std::make_pair(render_frame, render_frame)); - DCHECK(main_render_frame_entry_map_.find(render_frame) == - main_render_frame_entry_map_.end()); - auto entry = - CreateNewDataUseRecorder(nullptr, DataUse::TrafficType::USER_TRAFFIC); - entry->set_main_frame_id(render_frame); - main_render_frame_entry_map_.emplace(std::piecewise_construct, - std::forward_as_tuple(render_frame), - std::forward_as_tuple(entry)); - } -} - -void ChromeDataUseAscriber::RenderFrameDeleted(int render_process_id, - int render_frame_id, - int main_render_process_id, - int main_render_frame_id) { - DCHECK_CURRENTLY_ON(content::BrowserThread::IO); - - if (IsDisabled()) - return; - - content::GlobalFrameRoutingId key(render_process_id, render_frame_id); - - if (main_render_process_id == -1 && main_render_frame_id == -1) { - auto main_frame_it = main_render_frame_entry_map_.find(key); - - if (main_render_frame_entry_map_.end() != main_frame_it) { - auto entry = main_frame_it->second.data_use_recorder; - - // Stop tracking requests for the old frame. - std::vector<net::URLRequest*> pending_url_requests; - entry->GetPendingURLRequests(&pending_url_requests); - for (net::URLRequest* request : pending_url_requests) { - OnUrlRequestCompletedOrDestroyed(request); - } - ValidateAndCleanUp(entry); - DCHECK(entry->IsDataUseComplete()); - NotifyPageLoadConcluded(entry); - data_use_recorders_.erase(entry); - main_render_frame_entry_map_.erase(main_frame_it); - } - } - subframe_to_mainframe_map_.erase(key); -} - -void ChromeDataUseAscriber::ValidateAndCleanUp(DataUseRecorderEntry entry) { - DCHECK_CURRENTLY_ON(content::BrowserThread::IO); - - for (auto it = requests_.begin(); it != requests_.end();) { - const net::URLRequest* request = *it; - - DCHECK(request); - - const DataUseRecorderEntry request_entry = GetDataUseRecorderEntry(request); - - if (request_entry == data_use_recorders_.end()) { - requests_.erase(it++); - continue; - } - // All requests that point to |entry| should have been deleted. - DCHECK(entry != request_entry); - - if (entry == request_entry) { - requests_.erase(it++); - } else { - ++it; - } - } -} - -void ChromeDataUseAscriber::ReadyToCommitMainFrameNavigation( - content::GlobalRequestID global_request_id, - int render_process_id, - int render_frame_id) { - DCHECK_CURRENTLY_ON(content::BrowserThread::IO); - if (IsDisabled()) - return; - - main_render_frame_entry_map_ - .find(content::GlobalFrameRoutingId(render_process_id, render_frame_id)) - ->second.pending_navigation_global_request_id = global_request_id; -} - -void ChromeDataUseAscriber::DidFinishMainFrameNavigation( - int render_process_id, - int render_frame_id, - const GURL& gurl, - bool is_same_document_navigation, - uint32_t page_transition, - base::TimeTicks time) { - DCHECK_CURRENTLY_ON(content::BrowserThread::IO); - if (IsDisabled()) - return; - - content::GlobalFrameRoutingId main_frame(render_process_id, render_frame_id); - - auto main_frame_it = main_render_frame_entry_map_.find(main_frame); - if (main_frame_it == main_render_frame_entry_map_.end()) - return; - - // Find the global request id of the pending navigation. - auto global_request_id = - main_frame_it->second.pending_navigation_global_request_id; - main_frame_it->second.pending_navigation_global_request_id = - content::GlobalRequestID(); - - // TODO(rajendrant): Analyze why global request ID was not found in - // pending navigation map, in tests. - if (global_request_id == content::GlobalRequestID()) - return; - - // Find the pending navigation entry. - auto navigation_iter = - pending_navigation_data_use_map_.find(global_request_id); - - // We might not find a navigation entry since the pending navigation may not - // have caused any HTTP or HTTPS URLRequests to be made. - if (navigation_iter == pending_navigation_data_use_map_.end()) { - // No pending navigation entry to worry about. However, the old frame entry - // must be removed from frame map, and possibly marked complete and deleted. - if (main_frame_it != main_render_frame_entry_map_.end()) { - const DataUseRecorderEntry old_frame_entry = - main_frame_it->second.data_use_recorder; - DataUse::TrafficType old_traffic_type = - old_frame_entry->data_use().traffic_type(); - old_frame_entry->set_page_transition(page_transition); - main_frame_it->second.data_use_recorder = data_use_recorders_.end(); - NotifyPageLoadCommit(old_frame_entry); - if (old_frame_entry->IsDataUseComplete()) { - NotifyPageLoadConcluded(old_frame_entry); - data_use_recorders_.erase(old_frame_entry); - } - - // Add a new recorder to the render frame map to replace the deleted one. - main_frame_it->second.data_use_recorder = data_use_recorders_.emplace( - data_use_recorders_.end(), old_traffic_type); - main_frame_it->second.data_use_recorder->set_main_frame_id(main_frame); - } - return; - } - - const DataUseRecorderEntry entry = navigation_iter->second; - pending_navigation_data_use_map_.erase(navigation_iter); - entry->set_main_frame_id(main_frame); - - // If the frame has already been deleted then mark this navigation as having - // concluded its data use. - if (main_frame_it == main_render_frame_entry_map_.end()) { - entry->set_page_transition(page_transition); - NotifyPageLoadCommit(entry); - if (entry->IsDataUseComplete()) { - NotifyPageLoadConcluded(entry); - data_use_recorders_.erase(entry); - } - return; - } - auto old_frame_entry = main_frame_it->second.data_use_recorder; - old_frame_entry->set_page_transition(page_transition); - - if (old_frame_entry == entry) - return; - - if (is_same_document_navigation) { - std::vector<net::URLRequest*> pending_url_requests; - entry->GetPendingURLRequests(&pending_url_requests); - for (net::URLRequest* request : pending_url_requests) { - entry->MovePendingURLRequestTo(&(*old_frame_entry), request); - request->RemoveUserData( - DataUseRecorderEntryAsUserData::kDataUseAscriberUserDataKey); - AscribeRecorderWithRequest(request, old_frame_entry); - } - entry->RemoveAllPendingURLRequests(); - DCHECK(entry->IsDataUseComplete()); - data_use_recorders_.erase(entry); - - NotifyPageLoadCommit(old_frame_entry); - } else { - DataUse& data_use = entry->data_use(); - DCHECK(!data_use.url().is_valid() || data_use.url() == gurl) - << "is valid: " << data_use.url().is_valid() - << "; data_use.url(): " << data_use.url().spec() - << "; gurl: " << gurl.spec(); - if (!data_use.url().is_valid()) { - data_use.set_url(gurl); - } - - // |time| is when navigation commit finished in UI thread. Before this - // navigation finish is processed in IO thread, there could be some - // subresource requests started and get asribed to |old_frame_entry|. Move - // these requests that started after |time| but ascribed to the previous - // page load to page load |entry|. - std::vector<net::URLRequest*> pending_url_requests; - old_frame_entry->GetPendingURLRequests(&pending_url_requests); - for (net::URLRequest* request : pending_url_requests) { - DCHECK( - !old_frame_entry->GetPendingURLRequestStartTime(request).is_null()); - if (old_frame_entry->GetPendingURLRequestStartTime(request) > time) { - old_frame_entry->MovePendingURLRequestTo(&*entry, request); - request->RemoveUserData( - DataUseRecorderEntryAsUserData::kDataUseAscriberUserDataKey); - AscribeRecorderWithRequest(request, entry); - } - } - - // Stop tracking requests for the old frame. - pending_url_requests.clear(); - old_frame_entry->GetPendingURLRequests(&pending_url_requests); - for (net::URLRequest* request : pending_url_requests) { - OnUrlRequestCompletedOrDestroyed(request); - } - DCHECK(old_frame_entry->IsDataUseComplete()); - ValidateAndCleanUp(old_frame_entry); - - NotifyPageLoadConcluded(old_frame_entry); - data_use_recorders_.erase(old_frame_entry); - - entry->set_is_visible(main_frame_it->second.is_visible); - main_frame_it->second.data_use_recorder = entry; - NotifyPageLoadCommit(entry); - } -} - -void ChromeDataUseAscriber::DidFinishLoad(int render_process_id, - int render_frame_id, - const GURL& validated_url) { - // Only continue for validated HTTP* URLs (e.g., not internal error pages). - if (!validated_url.SchemeIsHTTPOrHTTPS()) - return; - - content::GlobalFrameRoutingId main_frame(render_process_id, render_frame_id); - - auto main_frame_it = main_render_frame_entry_map_.find(main_frame); - if (main_frame_it == main_render_frame_entry_map_.end()) - return; - - // Check that the DataUse entry has a committed URL. - auto entry = main_frame_it->second.data_use_recorder; - DataUse& data_use = entry->data_use(); - if (data_use.url().is_valid()) { - NotifyDidFinishLoad(entry); - } -} - -void ChromeDataUseAscriber::NotifyPageLoadCommit(DataUseRecorderEntry entry) { - for (auto& observer : observers_) - observer.OnPageLoadCommit(&entry->data_use()); -} - -void ChromeDataUseAscriber::NotifyDidFinishLoad(DataUseRecorderEntry entry) { - for (auto& observer : observers_) - observer.OnPageDidFinishLoad(&entry->data_use()); -} - -void ChromeDataUseAscriber::NotifyPageLoadConcluded( - DataUseRecorderEntry entry) { - for (auto& observer : observers_) - observer.OnPageLoadConcluded(&entry->data_use()); -} - -std::unique_ptr<net::NetworkDelegate> -ChromeDataUseAscriber::CreateNetworkDelegate( - std::unique_ptr<net::NetworkDelegate> wrapped_network_delegate) { - return std::make_unique<data_use_measurement::DataUseNetworkDelegate>( - std::move(wrapped_network_delegate), this, - std::make_unique<ChromeDataUseMeasurement>( - CreateURLRequestClassifier(), this, - /*network_connection_tracker=*/nullptr, /*local_state=*/nullptr)); -} - -std::unique_ptr<URLRequestClassifier> -ChromeDataUseAscriber::CreateURLRequestClassifier() const { - return std::make_unique<ContentURLRequestClassifier>(); -} - -ChromeDataUseAscriber::DataUseRecorderEntry -ChromeDataUseAscriber::CreateNewDataUseRecorder( - net::URLRequest* request, - DataUse::TrafficType traffic_type) { - auto entry = - data_use_recorders_.emplace(data_use_recorders_.end(), traffic_type); - if (request) - AscribeRecorderWithRequest(request, entry); - return entry; -} - -void ChromeDataUseAscriber::AscribeRecorderWithRequest( - net::URLRequest* request, - DataUseRecorderEntry entry) { - entry->AddPendingURLRequest(request); - request->SetUserData( - DataUseRecorderEntryAsUserData::kDataUseAscriberUserDataKey, - std::make_unique<DataUseRecorderEntryAsUserData>(entry)); -} - -void ChromeDataUseAscriber::WasShownOrHidden(int main_render_process_id, - int main_render_frame_id, - bool visible) { - DCHECK_CURRENTLY_ON(content::BrowserThread::IO); - if (IsDisabled()) - return; - - auto main_frame_it = - main_render_frame_entry_map_.find(content::GlobalFrameRoutingId( - main_render_process_id, main_render_frame_id)); - if (main_frame_it != main_render_frame_entry_map_.end()) { - main_frame_it->second.is_visible = visible; - if (main_frame_it->second.data_use_recorder != data_use_recorders_.end()) - main_frame_it->second.data_use_recorder->set_is_visible(visible); - } -} - -void ChromeDataUseAscriber::RenderFrameHostChanged(int old_render_process_id, - int old_render_frame_id, - int new_render_process_id, - int new_render_frame_id) { - DCHECK_CURRENTLY_ON(content::BrowserThread::IO); - if (IsDisabled()) - return; - - auto old_frame_iter = - main_render_frame_entry_map_.find(content::GlobalFrameRoutingId( - old_render_process_id, old_render_frame_id)); - - if (old_frame_iter != main_render_frame_entry_map_.end()) { - WasShownOrHidden(new_render_process_id, new_render_frame_id, true); - if (old_frame_iter->second.pending_navigation_global_request_id != - content::GlobalRequestID()) { - // Transfer the pending navigation global request ID from old to new main - // frame. - main_render_frame_entry_map_ - .find(content::GlobalFrameRoutingId(new_render_process_id, - new_render_frame_id)) - ->second.pending_navigation_global_request_id = - old_frame_iter->second.pending_navigation_global_request_id; - old_frame_iter->second.pending_navigation_global_request_id = - content::GlobalRequestID(); - } - } -} - -bool ChromeDataUseAscriber::IsDisabled() const { - DCHECK_CURRENTLY_ON(content::BrowserThread::IO); - - // TODO(rajendrant): Disable and deprecate the ChromeDataUseAscriber - // altogether. - return base::FeatureList::IsEnabled(kDisableAscriberIfDataSaverDisabled) && - disable_ascriber_; -} - -void ChromeDataUseAscriber::DisableAscriber() { - DCHECK_CURRENTLY_ON(content::BrowserThread::IO); - disable_ascriber_ = true; -} - -} // namespace data_use_measurement
diff --git a/chrome/browser/data_use_measurement/chrome_data_use_ascriber.h b/chrome/browser/data_use_measurement/chrome_data_use_ascriber.h deleted file mode 100644 index d28c399..0000000 --- a/chrome/browser/data_use_measurement/chrome_data_use_ascriber.h +++ /dev/null
@@ -1,237 +0,0 @@ -// Copyright 2016 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_DATA_USE_MEASUREMENT_CHROME_DATA_USE_ASCRIBER_H_ -#define CHROME_BROWSER_DATA_USE_MEASUREMENT_CHROME_DATA_USE_ASCRIBER_H_ - -#include <list> -#include <map> -#include <memory> -#include <string> -#include <tuple> -#include <unordered_set> -#include <utility> - -#include "base/feature_list.h" -#include "base/hash/hash.h" -#include "base/macros.h" -#include "base/supports_user_data.h" -#include "base/time/time.h" -#include "chrome/browser/data_use_measurement/chrome_data_use_recorder.h" -#include "components/data_use_measurement/core/data_use_ascriber.h" -#include "content/public/browser/global_request_id.h" -#include "content/public/browser/global_routing_id.h" -#include "url/gurl.h" - -namespace content { -class RenderFrameHost; -} - -namespace data_use_measurement { - -// Disables data use ascriber if data saver is disabled. -extern const base::Feature kDisableAscriberIfDataSaverDisabled; - -class URLRequestClassifier; - -// Browser implementation of DataUseAscriber. Maintains a list of -// DataUseRecorder instances, one for each source of data, such as a page -// load. -// -// A page includes all resources loaded in response to a main page navigation. -// The scope of a page load ends either when the tab is closed or a new page -// load is initiated by clicking on a link, entering a new URL, window location -// change, etc. -// -// For URLRequests initiated outside the context of a page load, such as -// Service Workers, Chrome Services, etc, a new instance of DataUseRecorder -// will be created for each URLRequest. -// -// Each page load will be associated with an instance of DataUseRecorder. -// Each URLRequest initiated in the context of a page load will be mapped to -// the DataUseRecorder instance for page load. -// -// This class lives entirely on the IO thread. It maintains a copy of frame and -// navigation information on the IO thread. -class ChromeDataUseAscriber : public DataUseAscriber { - public: - ChromeDataUseAscriber(); - - ~ChromeDataUseAscriber() override; - - // DataUseAscriber implementation: - ChromeDataUseRecorder* GetOrCreateDataUseRecorder( - net::URLRequest* request) override; - ChromeDataUseRecorder* GetDataUseRecorder( - const net::URLRequest& request) override; - - void OnBeforeUrlRequest(net::URLRequest* request) override; - void OnUrlRequestCompleted(net::URLRequest* request, bool started) override; - void OnUrlRequestDestroyed(net::URLRequest* request) override; - std::unique_ptr<net::NetworkDelegate> CreateNetworkDelegate( - std::unique_ptr<net::NetworkDelegate> wrapped_network_delegate) override; - std::unique_ptr<URLRequestClassifier> CreateURLRequestClassifier() - const override; - - // Called when a render frame host is created. When the render frame is a main - // frame, |main_render_process_id| and |main_render_frame_id| should be -1. - void RenderFrameCreated(int render_process_id, - int render_frame_id, - int main_render_process_id, - int main_render_frame_id); - - // Called when a render frame host is deleted. When the render frame is a main - // frame, |main_render_process_id| and |main_render_frame_id| should be -1. - void RenderFrameDeleted(int render_process_id, - int render_frame_id, - int main_render_process_id, - int main_render_frame_id); - - // Called when a main frame navigation is ready to be committed in a - // renderer. - void ReadyToCommitMainFrameNavigation( - content::GlobalRequestID global_request_id, - int render_process_id, - int render_frame_id); - - // Called when the main frame navigation is committed in the renderer. - void DidFinishMainFrameNavigation(int render_process_id, - int render_frame_id, - const GURL& gurl, - bool is_same_document_navigation, - uint32_t page_transition, - base::TimeTicks time); - - // Called every time the WebContents changes visibility. - void WasShownOrHidden(int main_render_process_id, - int main_render_frame_id, - bool visible); - - // Called whenever one of the render frames of a WebContents is swapped. - void RenderFrameHostChanged(int old_render_process_id, - int old_render_frame_id, - int new_render_process_id, - int new_render_frame_id); - - // Called when the load is finished. - void DidFinishLoad(int render_process_id, - int render_frame_id, - const GURL& validated_url); - - private: - friend class ChromeDataUseAscriberTest; - - void OnUrlRequestCompletedOrDestroyed(net::URLRequest* request); - - // Entry in the |data_use_recorders_| list which owns all instances of - // DataUseRecorder. std::list is used so that iterators remain valid until the - // lifetime of the container, and will not be invalidated when container is - // modified. - typedef std::list<ChromeDataUseRecorder> DataUseRecorderList; - typedef DataUseRecorderList::iterator DataUseRecorderEntry; - - class DataUseRecorderEntryAsUserData : public base::SupportsUserData::Data { - public: - explicit DataUseRecorderEntryAsUserData(DataUseRecorderEntry entry); - - ~DataUseRecorderEntryAsUserData() override; - - DataUseRecorderEntry recorder_entry() { return entry_; } - - static const void* const kDataUseAscriberUserDataKey; - - private: - DataUseRecorderEntry entry_; - }; - - // Contains the details of a main render frame. - struct MainRenderFrameEntry { - explicit MainRenderFrameEntry( - ChromeDataUseAscriber::DataUseRecorderEntry data_use_recorder); - - ~MainRenderFrameEntry(); - - // DataUseRecorderEntry in |data_use_recorders_| that the main frame - // ascribes data use to. - DataUseRecorderEntry data_use_recorder; - - // Global requestid of the pending navigation in the main frame, if any. - // This is needed to support navigations that transfer from one mainframe to - // another. - content::GlobalRequestID pending_navigation_global_request_id; - - // Visibility of the main frame, whether it is currently shown to the user. - // This is updated on WasShownOrHidden(), and passed down to DataUseRecorder - // when created. Visibility is used to record data use brokend by tab state - // histograms. - bool is_visible; - - private: - DISALLOW_COPY_AND_ASSIGN(MainRenderFrameEntry); - }; - - DataUseRecorderEntry GetDataUseRecorderEntry(const net::URLRequest* request); - - // Validate and cleanup the URL requests that point to |entry|. - void ValidateAndCleanUp(DataUseRecorderEntry entry); - - DataUseRecorderEntry GetOrCreateDataUseRecorderEntry( - net::URLRequest* request); - - void NotifyPageLoadCommit(DataUseRecorderEntry entry); - void NotifyDidFinishLoad(DataUseRecorderEntry entry); - void NotifyPageLoadConcluded(DataUseRecorderEntry entry); - - DataUseRecorderEntry CreateNewDataUseRecorder( - net::URLRequest* request, - DataUse::TrafficType traffic_type); - - bool IsRecorderInPendingNavigationMap(net::URLRequest* request); - - bool IsRecorderInRenderFrameMap(net::URLRequest* request); - - void AscribeRecorderWithRequest(net::URLRequest* request, - DataUseRecorderEntry entry); - - void DisableAscriber() override; - - // Returns true if data use ascriber is disabled. - bool IsDisabled() const; - - // Owner for all instances of DataUseRecorder. An instance is kept in this - // list if any entity (render frame hosts, URLRequests, pending navigations) - // that ascribe data use to the instance exists, and deleted when all - // ascribing entities go away. - DataUseRecorderList data_use_recorders_; - - // Map from RenderFrameHost to the MainRenderFrameEntry which contains all - // details of the main frame. New entry is added on main render frame creation - // and removed on its deletion. - std::map<content::GlobalFrameRoutingId, MainRenderFrameEntry> - main_render_frame_entry_map_; - - // Maps subframe IDs to the mainframe ID, so the mainframe lifetime can have - // ownership over the lifetime of entries in |data_use_recorders_|. Mainframes - // are mapped to themselves. - std::map<content::GlobalFrameRoutingId, content::GlobalFrameRoutingId> - subframe_to_mainframe_map_; - - // Map from pending navigations to the DataUseRecorderEntry in - // |data_use_recorders_| that the navigation ascribes data use to. - std::map<content::GlobalRequestID, DataUseRecorderEntry> - pending_navigation_data_use_map_; - - // True if the data use ascriber should be disabled. The ascriber is disabled - // by default. - bool disable_ascriber_ = true; - - // Set of requests that are currently in-flight. - std::unordered_set<const net::URLRequest*> requests_; - - DISALLOW_COPY_AND_ASSIGN(ChromeDataUseAscriber); -}; - -} // namespace data_use_measurement - -#endif // CHROME_BROWSER_DATA_USE_MEASUREMENT_CHROME_DATA_USE_ASCRIBER_H_
diff --git a/chrome/browser/data_use_measurement/chrome_data_use_ascriber_service.cc b/chrome/browser/data_use_measurement/chrome_data_use_ascriber_service.cc deleted file mode 100644 index 55aaf86..0000000 --- a/chrome/browser/data_use_measurement/chrome_data_use_ascriber_service.cc +++ /dev/null
@@ -1,245 +0,0 @@ -// Copyright 2016 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/data_use_measurement/chrome_data_use_ascriber_service.h" - -#include "base/bind.h" -#include "base/task/post_task.h" -#include "base/time/time.h" -#include "chrome/browser/browser_process.h" -#include "chrome/browser/data_use_measurement/chrome_data_use_ascriber.h" -#include "chrome/browser/io_thread.h" -#include "content/public/browser/browser_task_traits.h" -#include "content/public/browser/browser_thread.h" -#include "content/public/browser/navigation_handle.h" -#include "content/public/browser/render_frame_host.h" -#include "content/public/browser/render_process_host.h" -#include "content/public/browser/web_contents.h" - -namespace { - -data_use_measurement::ChromeDataUseAscriber* InitOnIOThread( - IOThread* io_thread) { - DCHECK(io_thread); - DCHECK_CURRENTLY_ON(content::BrowserThread::IO); - - return io_thread->globals()->data_use_ascriber.get(); -} - -// Returns the top most parent of |render_frame_host|. -content::RenderFrameHost* GetMainFrame( - content::RenderFrameHost* render_frame_host) { - content::RenderFrameHost* render_main_frame_host = render_frame_host; - while (render_main_frame_host->GetParent()) - render_main_frame_host = render_main_frame_host->GetParent(); - return render_main_frame_host; -} - -} // namespace - -namespace data_use_measurement { - -ChromeDataUseAscriberService::ChromeDataUseAscriberService() - : ascriber_(nullptr), is_initialized_(false) { - DCHECK_CURRENTLY_ON(content::BrowserThread::UI); - - // Skip IO thread initialization if there is no IO thread. This check is - // required because unit tests that do no set up an IO thread can cause this - // code to execute. - if (!g_browser_process->io_thread()) { - is_initialized_ = true; - return; - } - - base::PostTaskWithTraitsAndReplyWithResult( - FROM_HERE, {content::BrowserThread::IO}, - base::Bind(&InitOnIOThread, g_browser_process->io_thread()), - base::Bind(&ChromeDataUseAscriberService::SetDataUseAscriber, - base::Unretained(this))); -} - -ChromeDataUseAscriberService::~ChromeDataUseAscriberService() { - DCHECK_CURRENTLY_ON(content::BrowserThread::UI); -} - -void ChromeDataUseAscriberService::RenderFrameCreated( - content::RenderFrameHost* render_frame_host) { - DCHECK_CURRENTLY_ON(content::BrowserThread::UI); - - if (!is_initialized_) { - pending_frames_queue_.push_back(render_frame_host); - return; - } - - if (!ascriber_) - return; - - int main_render_process_id = -1; - int main_render_frame_id = -1; - content::RenderFrameHost* main_frame = GetMainFrame(render_frame_host); - if (main_frame != render_frame_host) { - main_render_process_id = main_frame->GetProcess()->GetID(); - main_render_frame_id = main_frame->GetRoutingID(); - } - - base::PostTaskWithTraits( - FROM_HERE, {content::BrowserThread::IO}, - base::BindOnce(&ChromeDataUseAscriber::RenderFrameCreated, - base::Unretained(ascriber_), - render_frame_host->GetProcess()->GetID(), - render_frame_host->GetRoutingID(), main_render_process_id, - main_render_frame_id)); -} - -void ChromeDataUseAscriberService::RenderFrameDeleted( - content::RenderFrameHost* render_frame_host) { - DCHECK_CURRENTLY_ON(content::BrowserThread::UI); - - if (!is_initialized_) { - // While remove() is a O(n) operation, the pending queue is not expected - // to have a significant number of elements. - DCHECK_GE(50u, pending_frames_queue_.size()); - pending_frames_queue_.remove(render_frame_host); - return; - } - - if (!ascriber_) - return; - - int main_render_process_id = -1; - int main_render_frame_id = -1; - content::RenderFrameHost* main_frame = GetMainFrame(render_frame_host); - if (main_frame != render_frame_host) { - main_render_process_id = main_frame->GetProcess()->GetID(); - main_render_frame_id = main_frame->GetRoutingID(); - } - - base::PostTaskWithTraits( - FROM_HERE, {content::BrowserThread::IO}, - base::BindOnce(&ChromeDataUseAscriber::RenderFrameDeleted, - base::Unretained(ascriber_), - render_frame_host->GetProcess()->GetID(), - render_frame_host->GetRoutingID(), main_render_process_id, - main_render_frame_id)); -} - -void ChromeDataUseAscriberService::ReadyToCommitNavigation( - content::NavigationHandle* navigation_handle) { - DCHECK_CURRENTLY_ON(content::BrowserThread::UI); - - if (!navigation_handle->IsInMainFrame()) - return; - - if (!ascriber_) - return; - - content::WebContents* web_contents = navigation_handle->GetWebContents(); - base::PostTaskWithTraits( - FROM_HERE, {content::BrowserThread::IO}, - base::BindOnce(&ChromeDataUseAscriber::ReadyToCommitMainFrameNavigation, - base::Unretained(ascriber_), - navigation_handle->GetGlobalRequestID(), - web_contents->GetMainFrame()->GetProcess()->GetID(), - web_contents->GetMainFrame()->GetRoutingID())); -} - -void ChromeDataUseAscriberService::DidFinishNavigation( - content::NavigationHandle* navigation_handle) { - DCHECK_CURRENTLY_ON(content::BrowserThread::UI); - - if (!navigation_handle->IsInMainFrame()) - return; - - if (!ascriber_) - return; - - content::WebContents* web_contents = navigation_handle->GetWebContents(); - base::PostTaskWithTraits( - FROM_HERE, {content::BrowserThread::IO}, - base::BindOnce(&ChromeDataUseAscriber::DidFinishMainFrameNavigation, - base::Unretained(ascriber_), - web_contents->GetMainFrame()->GetProcess()->GetID(), - web_contents->GetMainFrame()->GetRoutingID(), - navigation_handle->GetURL(), - navigation_handle->IsSameDocument(), - navigation_handle->HasCommitted() - ? navigation_handle->GetPageTransition() - : ui::PAGE_TRANSITION_CORE_MASK, - base::TimeTicks::Now())); -} - -void ChromeDataUseAscriberService::DidFinishLoad( - content::RenderFrameHost* main_render_frame_host, - const GURL& validated_url) { - DCHECK_CURRENTLY_ON(content::BrowserThread::UI); - - if (!ascriber_) - return; - - base::PostTaskWithTraits( - FROM_HERE, {content::BrowserThread::IO}, - base::BindOnce(&ChromeDataUseAscriber::DidFinishLoad, - base::Unretained(ascriber_), - main_render_frame_host->GetProcess()->GetID(), - main_render_frame_host->GetRoutingID(), validated_url)); -} - -void ChromeDataUseAscriberService::SetDataUseAscriber( - ChromeDataUseAscriber* ascriber) { - DCHECK(!is_initialized_); - DCHECK_CURRENTLY_ON(content::BrowserThread::UI); - - ascriber_ = ascriber; - is_initialized_ = true; - - for (auto* it : pending_frames_queue_) { - RenderFrameCreated(it); - if (pending_visible_main_frames_.find(it) != - pending_visible_main_frames_.end()) { - WasShownOrHidden(it, true); - } - } - pending_frames_queue_.clear(); - pending_visible_main_frames_.clear(); -} - -void ChromeDataUseAscriberService::WasShownOrHidden( - content::RenderFrameHost* main_render_frame_host, - bool visible) { - DCHECK_CURRENTLY_ON(content::BrowserThread::UI); - - if (!ascriber_) { - if (visible) - pending_visible_main_frames_.insert(main_render_frame_host); - else - pending_visible_main_frames_.erase(main_render_frame_host); - return; - } - - base::PostTaskWithTraits( - FROM_HERE, {content::BrowserThread::IO}, - base::BindOnce(&ChromeDataUseAscriber::WasShownOrHidden, - base::Unretained(ascriber_), - main_render_frame_host->GetProcess()->GetID(), - main_render_frame_host->GetRoutingID(), visible)); -} - -void ChromeDataUseAscriberService::RenderFrameHostChanged( - content::RenderFrameHost* old_host, - content::RenderFrameHost* new_host) { - if (!ascriber_) - return; - - if (old_host) { - base::PostTaskWithTraits( - FROM_HERE, {content::BrowserThread::IO}, - base::BindOnce( - &ChromeDataUseAscriber::RenderFrameHostChanged, - base::Unretained(ascriber_), old_host->GetProcess()->GetID(), - old_host->GetRoutingID(), new_host->GetProcess()->GetID(), - new_host->GetRoutingID())); - } -} - -} // namespace data_use_measurement
diff --git a/chrome/browser/data_use_measurement/chrome_data_use_ascriber_service.h b/chrome/browser/data_use_measurement/chrome_data_use_ascriber_service.h deleted file mode 100644 index 296570a..0000000 --- a/chrome/browser/data_use_measurement/chrome_data_use_ascriber_service.h +++ /dev/null
@@ -1,98 +0,0 @@ -// Copyright 2016 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_DATA_USE_MEASUREMENT_CHROME_DATA_USE_ASCRIBER_SERVICE_H_ -#define CHROME_BROWSER_DATA_USE_MEASUREMENT_CHROME_DATA_USE_ASCRIBER_SERVICE_H_ - -#include <list> -#include <unordered_set> - -#include "base/macros.h" -#include "components/keyed_service/core/keyed_service.h" -#include "url/gurl.h" - -namespace content { -class NavigationHandle; -class RenderFrameHost; -} - -namespace data_use_measurement { -class ChromeDataUseAscriber; - -// UI thread functionality of ChromeDataUseAscriber. -// -// Listens to navigation and frame events on the UI thread and propagates them -// to ChromeDataUseAscriber on the IO thread. This class depends on external -// WebContentsObservers to propagate events to itself because each -// WebContents instance requires its own WebContentsObserver instance. -// -// Created, destroyed, and used only on the UI thread. -class ChromeDataUseAscriberService : public KeyedService { - public: - ChromeDataUseAscriberService(); - ~ChromeDataUseAscriberService() override; - - // Called when a render frame host is created. Propagates this information to - // |ascriber_| on the IO thread. |RenderFrameHost| methods cannot be called - // on the IO thread, so only routing IDs of |render_frame_host| and its parent - // are propagated. - void RenderFrameCreated(content::RenderFrameHost* render_frame_host); - - // Called when a render frame host is deleted. Propagates this information to - // |ascriber_| on the IO thread. RenderFrameHost methods cannot be called - // on the IO thread, so only routing IDs of |render_frame_host| and its parent - // are propagated. - void RenderFrameDeleted(content::RenderFrameHost* render_frame_host); - - // Called when the navigation is ready to be committed in a renderer. - // Propagates the event to the |ascriber_| on the IO thread. NavigationHandle - // methods cannot be called on the IO thread, so the pointer is cast to void*. - void ReadyToCommitNavigation(content::NavigationHandle* navigation_handle); - - // Called every time the WebContents changes visibility. Propagates the event - // to the |ascriber_| on the IO thread. - void WasShownOrHidden(content::RenderFrameHost* main_render_frame_host, - bool visible); - - // Called when one of the render frames of a WebContents is swapped. - void RenderFrameHostChanged(content::RenderFrameHost* old_host, - content::RenderFrameHost* new_host); - - // Forwarded from DataUseWebContentsObserver - void DidFinishNavigation(content::NavigationHandle* navigation_handle); - - // Forwarded from DataUseWebContentsObserver - void DidFinishLoad(content::RenderFrameHost* main_render_frame_host, - const GURL& validated_url); - - private: - friend class ChromeDataUseAscriberServiceTest; - - void SetDataUseAscriber(ChromeDataUseAscriber* ascriber); - - // |ascriber_| outlives this instance. - ChromeDataUseAscriber* ascriber_; - - // Tracks whether |ascriber_| was set. This field is required because tests - // might set |ascriber_| to nullptr. - bool is_initialized_; - - // Frame events might arrive from the UI thread before |ascriber_| is set. A - // queue of frame events that arrive before |ascriber_| is set is maintained - // in this field so that they can be propagated immediately after |ascriber_| - // is set. The RenderFrameHost pointers in the queues are valid for the - // duration that they are in the queue. - std::list<content::RenderFrameHost*> pending_frames_queue_; - - // WebContents visibility change events might arrive from the UI thread before - // |ascriber_| is set. Sucn pending main render frame visible events are - // maintained in this set and propagated immediately after |ascriber_| is set. - std::unordered_set<content::RenderFrameHost*> pending_visible_main_frames_; - - DISALLOW_COPY_AND_ASSIGN(ChromeDataUseAscriberService); -}; - -} // namespace data_use_measurement - -#endif // CHROME_BROWSER_DATA_USE_MEASUREMENT_CHROME_DATA_USE_ASCRIBER_SERVICE_H_
diff --git a/chrome/browser/data_use_measurement/chrome_data_use_ascriber_service_factory.cc b/chrome/browser/data_use_measurement/chrome_data_use_ascriber_service_factory.cc deleted file mode 100644 index bace5944..0000000 --- a/chrome/browser/data_use_measurement/chrome_data_use_ascriber_service_factory.cc +++ /dev/null
@@ -1,39 +0,0 @@ -// Copyright 2016 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/data_use_measurement/chrome_data_use_ascriber_service_factory.h" - -#include "base/bind.h" -#include "chrome/browser/data_use_measurement/chrome_data_use_ascriber_service.h" -#include "components/keyed_service/content/browser_context_dependency_manager.h" - -namespace data_use_measurement { - -// static -ChromeDataUseAscriberService* -ChromeDataUseAscriberServiceFactory::GetForBrowserContext( - content::BrowserContext* context) { - return static_cast<ChromeDataUseAscriberService*>( - GetInstance()->GetServiceForBrowserContext(context, true)); -} - -// static -ChromeDataUseAscriberServiceFactory* -ChromeDataUseAscriberServiceFactory::GetInstance() { - return base::Singleton<ChromeDataUseAscriberServiceFactory>::get(); -} - -ChromeDataUseAscriberServiceFactory::ChromeDataUseAscriberServiceFactory() - : BrowserContextKeyedServiceFactory( - "ChromeDataUseAscriberService", - BrowserContextDependencyManager::GetInstance()) {} - -ChromeDataUseAscriberServiceFactory::~ChromeDataUseAscriberServiceFactory() {} - -KeyedService* ChromeDataUseAscriberServiceFactory::BuildServiceInstanceFor( - content::BrowserContext* context) const { - return new ChromeDataUseAscriberService(); -} - -} // namespace data_use_measurement
diff --git a/chrome/browser/data_use_measurement/chrome_data_use_ascriber_service_factory.h b/chrome/browser/data_use_measurement/chrome_data_use_ascriber_service_factory.h deleted file mode 100644 index eb76d38..0000000 --- a/chrome/browser/data_use_measurement/chrome_data_use_ascriber_service_factory.h +++ /dev/null
@@ -1,44 +0,0 @@ -// Copyright 2016 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_DATA_USE_MEASUREMENT_CHROME_DATA_USE_ASCRIBER_SERVICE_FACTORY_H_ -#define CHROME_BROWSER_DATA_USE_MEASUREMENT_CHROME_DATA_USE_ASCRIBER_SERVICE_FACTORY_H_ - -#include "base/macros.h" -#include "base/memory/singleton.h" -#include "components/keyed_service/content/browser_context_keyed_service_factory.h" -#include "components/keyed_service/core/keyed_service.h" - -namespace data_use_measurement { - -class ChromeDataUseAscriberService; - -class ChromeDataUseAscriberServiceFactory - : public BrowserContextKeyedServiceFactory { - public: - static ChromeDataUseAscriberService* GetForBrowserContext( - content::BrowserContext* context); - - static ChromeDataUseAscriberServiceFactory* GetInstance(); - - private: - friend struct base::DefaultSingletonTraits<ChromeDataUseAscriberService>; - - ChromeDataUseAscriberServiceFactory(); - ~ChromeDataUseAscriberServiceFactory() override; - - // BrowserContextKeyedServiceFactory: - KeyedService* BuildServiceInstanceFor( - content::BrowserContext* context) const override; - - private: - friend struct base::DefaultSingletonTraits< - ChromeDataUseAscriberServiceFactory>; - - DISALLOW_COPY_AND_ASSIGN(ChromeDataUseAscriberServiceFactory); -}; - -} // namespace data_use_measurement - -#endif // CHROME_BROWSER_DATA_USE_MEASUREMENT_CHROME_DATA_USE_ASCRIBER_SERVICE_FACTORY_H_
diff --git a/chrome/browser/data_use_measurement/chrome_data_use_ascriber_unittest.cc b/chrome/browser/data_use_measurement/chrome_data_use_ascriber_unittest.cc deleted file mode 100644 index 9e6fcefa..0000000 --- a/chrome/browser/data_use_measurement/chrome_data_use_ascriber_unittest.cc +++ /dev/null
@@ -1,566 +0,0 @@ -// Copyright 2016 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/data_use_measurement/chrome_data_use_ascriber.h" - -#include <list> -#include <memory> - -#include "base/run_loop.h" -#include "base/test/scoped_feature_list.h" -#include "build/build_config.h" -#include "components/data_use_measurement/core/data_use_recorder.h" -#include "content/public/browser/resource_request_info.h" -#include "content/public/common/previews_state.h" -#include "content/public/common/process_type.h" -#include "content/public/test/mock_resource_context.h" -#include "content/public/test/test_browser_thread_bundle.h" -#include "net/traffic_annotation/network_traffic_annotation_test_helper.h" -#include "net/url_request/url_request_test_util.h" -#include "testing/gmock/include/gmock/gmock.h" -#include "testing/gtest/include/gtest/gtest.h" - -namespace { - -int kRenderProcessId = 1; -int kRenderFrameId = 2; -int kRequestId = 3; -uint32_t kPageTransition = 5; -void* kNavigationHandle = &kNavigationHandle; - -class MockPageLoadObserver - : public data_use_measurement::DataUseAscriber::PageLoadObserver { - public: - MOCK_METHOD1(OnPageLoadCommit, void(data_use_measurement::DataUse* data_use)); - MOCK_METHOD2(OnPageResourceLoad, - void(const net::URLRequest& request, - data_use_measurement::DataUse* data_use)); - MOCK_METHOD1(OnPageDidFinishLoad, - void(data_use_measurement::DataUse* data_use)); - MOCK_METHOD1(OnPageLoadConcluded, - void(data_use_measurement::DataUse* data_use)); - MOCK_METHOD2(OnNetworkBytesUpdate, - void(const net::URLRequest& request, - data_use_measurement::DataUse* data_use)); -}; - -} // namespace - -namespace data_use_measurement { - -class ChromeDataUseAscriberTest : public testing::Test { - protected: - ChromeDataUseAscriberTest() - : thread_bundle_(content::TestBrowserThreadBundle::IO_MAINLOOP) {} - - void SetUp() override {} - - void TearDown() override { recorders().clear(); } - - void CreateAscriber() { - ascriber_ = std::make_unique<ChromeDataUseAscriber>(); - // Enable ascriber for tests. - ascriber_->disable_ascriber_ = false; - } - - std::list<ChromeDataUseRecorder>& recorders() { - return ascriber_->data_use_recorders_; - } - - net::TestURLRequestContext* context() { return &context_; } - - ChromeDataUseAscriber* ascriber() { return ascriber_.get(); } - - std::unique_ptr<net::URLRequest> CreateNewRequest(std::string url, - bool is_main_frame, - int request_id, - int render_process_id, - int render_frame_id) { - std::unique_ptr<net::URLRequest> request = context()->CreateRequest( - GURL(url), net::IDLE, nullptr, TRAFFIC_ANNOTATION_FOR_TESTS); - // TODO(kundaji): Allow request_id to be specified in AllocateForTesting. - content::ResourceRequestInfo::AllocateForTesting( - request.get(), - is_main_frame ? content::ResourceType::kMainFrame - : content::ResourceType::kScript, - /*resource_context*/ nullptr, render_process_id, - /*render_view_id=*/-1, render_frame_id, is_main_frame, - content::ResourceInterceptPolicy::kAllowNone, - /*is_async=*/true, content::PREVIEWS_OFF, - /*navigation_ui_data*/ nullptr); - return request; - } - - private: - content::TestBrowserThreadBundle thread_bundle_; - std::unique_ptr<ChromeDataUseAscriber> ascriber_; - net::TestURLRequestContext context_; -}; - -TEST_F(ChromeDataUseAscriberTest, NoRecorderWithoutFrame) { - CreateAscriber(); - std::unique_ptr<net::URLRequest> request = CreateNewRequest( - "http://test.com", true, kRequestId, kRenderProcessId, kRenderFrameId); - - // Main frame request causes a recorder to be created. - ascriber()->OnBeforeUrlRequest(request.get()); - EXPECT_EQ(1u, recorders().size()); - - // Frame is created. - ascriber()->RenderFrameCreated(kRenderProcessId, kRenderFrameId, -1, -1); - EXPECT_EQ(2u, recorders().size()); - - // Same mainframe request should not cause another recorder to be created. - ascriber()->OnBeforeUrlRequest(request.get()); - EXPECT_EQ(2u, recorders().size()); - - ascriber()->OnUrlRequestDestroyed(request.get()); - - ascriber()->ReadyToCommitMainFrameNavigation( - content::GlobalRequestID(kRenderProcessId, 0), kRenderProcessId, - kRenderFrameId); - ascriber()->DidFinishMainFrameNavigation( - kRenderProcessId, kRenderFrameId, GURL("http://test.com"), false, - kPageTransition, base::TimeTicks::Now()); - EXPECT_EQ(1u, recorders().size()); - - ascriber()->RenderFrameDeleted(kRenderProcessId, kRenderFrameId, -1, -1); - EXPECT_EQ(0u, recorders().size()); -} - -TEST_F(ChromeDataUseAscriberTest, RenderFrameShownAndHidden) { - CreateAscriber(); - std::unique_ptr<net::URLRequest> request = CreateNewRequest( - "http://test.com", true, kRequestId, kRenderProcessId, kRenderFrameId); - - ascriber()->RenderFrameCreated(kRenderProcessId, kRenderFrameId, -1, -1); - ascriber()->OnBeforeUrlRequest(request.get()); - ascriber()->ReadyToCommitMainFrameNavigation( - content::GlobalRequestID(kRenderProcessId, 0), kRenderProcessId, - kRenderFrameId); - ascriber()->DidFinishMainFrameNavigation( - kRenderProcessId, kRenderFrameId, GURL("http://test.com"), false, - kPageTransition, base::TimeTicks::Now()); - ascriber()->WasShownOrHidden(kRenderProcessId, kRenderFrameId, true); - - EXPECT_TRUE(ascriber()->GetDataUseRecorder(*request)->is_visible()); - - // Hide the frame, and the visibility should be updated. - ascriber()->WasShownOrHidden(kRenderProcessId, kRenderFrameId, false); - EXPECT_FALSE(ascriber()->GetDataUseRecorder(*request)->is_visible()); - - ascriber()->RenderFrameDeleted(kRenderProcessId, kRenderFrameId, -1, -1); - - ascriber()->OnUrlRequestDestroyed(request.get()); - EXPECT_EQ(0u, recorders().size()); -} - -TEST_F(ChromeDataUseAscriberTest, RenderFrameHiddenAndShown) { - CreateAscriber(); - std::unique_ptr<net::URLRequest> request = CreateNewRequest( - "http://test.com", true, kRequestId, kRenderProcessId, kRenderFrameId); - - ascriber()->RenderFrameCreated(kRenderProcessId, kRenderFrameId, -1, -1); - ascriber()->OnBeforeUrlRequest(request.get()); - ascriber()->ReadyToCommitMainFrameNavigation( - content::GlobalRequestID(kRenderProcessId, 0), kRenderProcessId, - kRenderFrameId); - ascriber()->DidFinishMainFrameNavigation( - kRenderProcessId, kRenderFrameId, GURL("http://test.com"), false, - kPageTransition, base::TimeTicks::Now()); - ascriber()->WasShownOrHidden(kRenderProcessId, kRenderFrameId, false); - - EXPECT_FALSE(ascriber()->GetDataUseRecorder(*request)->is_visible()); - - // Show the frame, and the visibility should be updated. - ascriber()->WasShownOrHidden(kRenderProcessId, kRenderFrameId, true); - EXPECT_TRUE(ascriber()->GetDataUseRecorder(*request)->is_visible()); - - ascriber()->RenderFrameDeleted(kRenderProcessId, kRenderFrameId, -1, -1); - - ascriber()->OnUrlRequestDestroyed(request.get()); - EXPECT_EQ(0u, recorders().size()); -} - -TEST_F(ChromeDataUseAscriberTest, RenderFrameHostChanged) { - CreateAscriber(); - std::unique_ptr<net::URLRequest> request = CreateNewRequest( - "http://test.com", true, kRequestId, kRenderProcessId, kRenderFrameId); - - ascriber()->RenderFrameCreated(kRenderProcessId, kRenderFrameId, -1, -1); - ascriber()->OnBeforeUrlRequest(request.get()); - ascriber()->ReadyToCommitMainFrameNavigation( - content::GlobalRequestID(kRenderProcessId, 0), kRenderProcessId, - kRenderFrameId); - ascriber()->DidFinishMainFrameNavigation( - kRenderProcessId, kRenderFrameId, GURL("http://test.com"), false, - kPageTransition, base::TimeTicks::Now()); - ascriber()->WasShownOrHidden(kRenderProcessId, kRenderFrameId, true); - EXPECT_TRUE(ascriber()->GetDataUseRecorder(*request)->is_visible()); - - // Create a new render frame and swap it. - ascriber()->RenderFrameCreated(kRenderProcessId + 1, kRenderFrameId + 1, -1, - -1); - ascriber()->RenderFrameHostChanged(kRenderProcessId, kRenderFrameId, - kRenderProcessId + 1, kRenderFrameId + 1); - ascriber()->RenderFrameDeleted(kRenderProcessId, kRenderFrameId, -1, -1); - - ascriber()->WasShownOrHidden(kRenderProcessId + 1, kRenderFrameId + 1, true); - ascriber()->RenderFrameDeleted(kRenderProcessId + 1, kRenderFrameId + 1, -1, - -1); - - ascriber()->OnUrlRequestDestroyed(request.get()); - EXPECT_EQ(0u, recorders().size()); -} - -TEST_F(ChromeDataUseAscriberTest, MainFrameNavigation) { - CreateAscriber(); - std::unique_ptr<net::URLRequest> request = CreateNewRequest( - "http://test.com", true, kRequestId, kRenderProcessId, kRenderFrameId); - - // Mainframe is created. - ascriber()->RenderFrameCreated(kRenderProcessId, kRenderFrameId, -1, -1); - EXPECT_EQ(1u, recorders().size()); - - // Request should cause a recorder to be created. - ascriber()->OnBeforeUrlRequest(request.get()); - EXPECT_EQ(2u, recorders().size()); - - // Navigation commits. - ascriber()->ReadyToCommitMainFrameNavigation( - content::GlobalRequestID(kRenderProcessId, 0), kRenderProcessId, - kRenderFrameId); - ascriber()->DidFinishMainFrameNavigation( - kRenderProcessId, kRenderFrameId, GURL("http://mobile.test.com"), false, - kPageTransition, base::TimeTicks::Now()); - - // Navigation commit should merge the two data use recorder entries. - EXPECT_EQ(1u, recorders().size()); - auto& recorder_entry = recorders().front(); - EXPECT_EQ(content::GlobalFrameRoutingId(kRenderProcessId, kRenderFrameId), - recorder_entry.main_frame_id()); - EXPECT_EQ(content::GlobalRequestID(kRenderProcessId, 0), - recorder_entry.main_frame_request_id()); - EXPECT_EQ(GURL("http://mobile.test.com"), recorder_entry.data_use().url()); - EXPECT_EQ(DataUse::TrafficType::USER_TRAFFIC, - recorder_entry.data_use().traffic_type()); - - ascriber()->RenderFrameDeleted(kRenderProcessId, kRenderFrameId, -1, -1); - ascriber()->OnUrlRequestDestroyed(request.get()); - - EXPECT_EQ(0u, recorders().size()); -} - -TEST_F(ChromeDataUseAscriberTest, SubResourceRequestsAttributed) { - CreateAscriber(); - // A regression test that verifies that subframe requests in the second page - // load in the same frame get attributed to the entry correctly. - std::unique_ptr<net::URLRequest> page_load_a_main_frame_request = - CreateNewRequest("http://test.com", true, kRequestId, kRenderProcessId, - kRenderFrameId); - - ascriber()->RenderFrameCreated(kRenderProcessId, kRenderFrameId, -1, -1); - - // Start the main frame reuqest. - ascriber()->OnBeforeUrlRequest(page_load_a_main_frame_request.get()); - - // Commit the page load. - ascriber()->ReadyToCommitMainFrameNavigation( - content::GlobalRequestID(kRenderProcessId, 0), kRenderProcessId, - kRenderFrameId); - ascriber()->DidFinishMainFrameNavigation( - kRenderProcessId, kRenderFrameId, GURL("http://mobile.test.com"), false, - kPageTransition, base::TimeTicks::Now()); - - std::unique_ptr<net::URLRequest> page_load_b_main_frame_request = - CreateNewRequest("http://test_2.com", true, kRequestId + 1, - kRenderProcessId, kRenderFrameId); - std::unique_ptr<net::URLRequest> page_load_b_sub_request = - CreateNewRequest("http://test_2.com/s", false, kRequestId + 2, - kRenderProcessId, kRenderFrameId); - - // Start the second main frame request. - ascriber()->OnBeforeUrlRequest(page_load_b_main_frame_request.get()); - - // Commit the second page load. - ascriber()->ReadyToCommitMainFrameNavigation( - content::GlobalRequestID(kRenderProcessId, 0), kRenderProcessId, - kRenderFrameId); - ascriber()->DidFinishMainFrameNavigation( - kRenderProcessId, kRenderFrameId, GURL("http://mobile.test_2.com"), false, - kPageTransition, base::TimeTicks::Now()); - - // Delete the first main frame request. - ascriber()->OnUrlRequestDestroyed(page_load_a_main_frame_request.get()); - - // Start the sub resource request for the second page load. - ascriber()->OnBeforeUrlRequest(page_load_b_sub_request.get()); - ascriber()->OnNetworkBytesReceived(page_load_b_sub_request.get(), 100); - - EXPECT_EQ(1u, recorders().size()); - auto& recorder_entry = recorders().front(); - EXPECT_EQ(content::GlobalFrameRoutingId(kRenderProcessId, kRenderFrameId), - recorder_entry.main_frame_id()); - EXPECT_EQ(content::GlobalRequestID(kRenderProcessId, 0), - recorder_entry.main_frame_request_id()); - EXPECT_EQ(GURL("http://mobile.test_2.com"), recorder_entry.data_use().url()); - EXPECT_EQ(DataUse::TrafficType::USER_TRAFFIC, - recorder_entry.data_use().traffic_type()); - // Verify that the data usage for the sub-resource was counted towards the - // entry. - EXPECT_EQ(100, recorder_entry.data_use().total_bytes_received()); - - ascriber()->OnUrlRequestDestroyed(page_load_b_sub_request.get()); - ascriber()->OnUrlRequestDestroyed(page_load_b_main_frame_request.get()); - ascriber()->RenderFrameDeleted(kRenderProcessId, kRenderFrameId, -1, -1); - EXPECT_EQ(0u, recorders().size()); -} - -// Verifies that navigation finish acts as the event that separates pageloads. -// subresource requests started before the navigation commit has finished are -// ascribed to the previous page load at the time of the commit, and requests -// started after are ascribed to the next page load. -TEST_F(ChromeDataUseAscriberTest, SubResourceRequestsAfterNavigationFinish) { - CreateAscriber(); - std::unique_ptr<net::URLRequest> page_load_a_mainresource = CreateNewRequest( - "http://test.com", true, kRequestId, kRenderProcessId, kRenderFrameId); - std::unique_ptr<net::URLRequest> page_load_a_subresource = - CreateNewRequest("http://test.com/subresource", false, kRequestId + 1, - kRenderProcessId, kRenderFrameId); - - // First page load 'a'. - ascriber()->RenderFrameCreated(kRenderProcessId, kRenderFrameId, -1, -1); - ascriber()->OnBeforeUrlRequest(page_load_a_mainresource.get()); - ascriber()->ReadyToCommitMainFrameNavigation( - content::GlobalRequestID(kRenderProcessId, 0), kRenderProcessId, - kRenderFrameId); - ascriber()->DidFinishMainFrameNavigation( - kRenderProcessId, kRenderFrameId, GURL("http://mobile.test.com"), false, - kPageTransition, base::TimeTicks::Now()); - - ascriber()->OnBeforeUrlRequest(page_load_a_subresource.get()); - ascriber()->OnUrlRequestDestroyed(page_load_a_mainresource.get()); - - ascriber()->OnNetworkBytesReceived(page_load_a_subresource.get(), 100); - - EXPECT_EQ(1u, recorders().size()); - auto& page_load_a_recorder = recorders().front(); - EXPECT_EQ(content::GlobalFrameRoutingId(kRenderProcessId, kRenderFrameId), - page_load_a_recorder.main_frame_id()); - EXPECT_EQ(content::GlobalRequestID(kRenderProcessId, 0), - page_load_a_recorder.main_frame_request_id()); - EXPECT_EQ(GURL("http://mobile.test.com"), - page_load_a_recorder.data_use().url()); - EXPECT_EQ(DataUse::TrafficType::USER_TRAFFIC, - page_load_a_recorder.data_use().traffic_type()); - - std::unique_ptr<net::URLRequest> page_load_b_mainresource = - CreateNewRequest("http://test_2.com", true, kRequestId + 2, - kRenderProcessId, kRenderFrameId); - std::unique_ptr<net::URLRequest> page_load_b_subresource = - CreateNewRequest("http://test_2.com/subresource", false, kRequestId + 3, - kRenderProcessId, kRenderFrameId); - - // Second page load 'b' on the same main render frame. - ascriber()->OnBeforeUrlRequest(page_load_b_mainresource.get()); - EXPECT_EQ(100, page_load_a_recorder.data_use().total_bytes_received()); - ascriber()->ReadyToCommitMainFrameNavigation( - content::GlobalRequestID(kRenderProcessId, 0), kRenderProcessId, - kRenderFrameId); - ascriber()->DidFinishMainFrameNavigation( - kRenderProcessId, kRenderFrameId, GURL("http://mobile.test_2.com"), false, - kPageTransition, base::TimeTicks::Now()); - - ascriber()->OnBeforeUrlRequest(page_load_b_subresource.get()); - ascriber()->OnNetworkBytesReceived(page_load_b_subresource.get(), 200); - ascriber()->OnNetworkBytesReceived(page_load_a_subresource.get(), 100); - - // Previous page recorder is gone. - EXPECT_EQ(1u, recorders().size()); - auto& page_load_b_recorder = recorders().back(); - EXPECT_EQ(content::GlobalFrameRoutingId(kRenderProcessId, kRenderFrameId), - page_load_b_recorder.main_frame_id()); - EXPECT_EQ(content::GlobalRequestID(kRenderProcessId, 0), - page_load_b_recorder.main_frame_request_id()); - EXPECT_EQ(GURL("http://mobile.test_2.com"), - page_load_b_recorder.data_use().url()); - EXPECT_EQ(DataUse::TrafficType::USER_TRAFFIC, - page_load_b_recorder.data_use().traffic_type()); - - // Verify the data usage. - EXPECT_EQ(200, page_load_b_recorder.data_use().total_bytes_received()); - - std::unique_ptr<net::URLRequest> page_load_c_mainresource = - CreateNewRequest("http://test_c.com", true, kRequestId + 2, - kRenderProcessId, kRenderFrameId); - std::unique_ptr<net::URLRequest> page_load_c_subresource = - CreateNewRequest("http://test_c.com/subresource", false, kRequestId + 3, - kRenderProcessId, kRenderFrameId); - - // Third page load 'c' on the same main render frame with - // same_document_navigation set. - ascriber()->OnBeforeUrlRequest(page_load_c_mainresource.get()); - ascriber()->ReadyToCommitMainFrameNavigation( - content::GlobalRequestID(kRenderProcessId, 0), kRenderProcessId, - kRenderFrameId); - ascriber()->DidFinishMainFrameNavigation( - kRenderProcessId, kRenderFrameId, GURL("http://mobile.test_c.com"), true, - kPageTransition, base::TimeTicks::Now()); - - ascriber()->OnBeforeUrlRequest(page_load_c_subresource.get()); - ascriber()->OnNetworkBytesReceived(page_load_c_subresource.get(), 2000); - ascriber()->OnNetworkBytesReceived(page_load_b_subresource.get(), 1000); - - // Data usage of page load 'c' should get merged to page load 'b'. - EXPECT_EQ(3200, page_load_b_recorder.data_use().total_bytes_received()); - - ascriber()->OnUrlRequestDestroyed(page_load_a_subresource.get()); - ascriber()->OnUrlRequestDestroyed(page_load_b_subresource.get()); - ascriber()->OnUrlRequestDestroyed(page_load_b_mainresource.get()); - ascriber()->OnUrlRequestDestroyed(page_load_c_subresource.get()); - ascriber()->OnUrlRequestDestroyed(page_load_c_mainresource.get()); - ascriber()->RenderFrameDeleted(kRenderProcessId, kRenderFrameId, -1, -1); - EXPECT_EQ(0u, recorders().size()); -} - -TEST_F(ChromeDataUseAscriberTest, FailedMainFrameNavigation) { - CreateAscriber(); - std::unique_ptr<net::URLRequest> request = CreateNewRequest( - "http://test.com", true, kRequestId, kRenderProcessId, kRenderFrameId); - - // Mainframe is created. - ascriber()->RenderFrameCreated(kRenderProcessId, kRenderFrameId, -1, -1); - EXPECT_EQ(1u, recorders().size()); - - // Request should cause a recorder to be created. - ascriber()->OnBeforeUrlRequest(request.get()); - EXPECT_EQ(2u, recorders().size()); - - // Failed request will remove the pending entry. - request->Cancel(); - ascriber()->OnUrlRequestCompleted(request.get(), false); - - ascriber()->RenderFrameDeleted(kRenderProcessId, kRenderFrameId, -1, -1); - ascriber()->OnUrlRequestDestroyed(request.get()); - - EXPECT_EQ(0u, recorders().size()); -} - -TEST_F(ChromeDataUseAscriberTest, PageLoadObserverNotified) { - CreateAscriber(); - // TODO(rajendrant): Handle PlzNavigate (http://crbug/664233). - MockPageLoadObserver mock_observer; - ascriber()->AddObserver(&mock_observer); - - std::unique_ptr<net::URLRequest> request = CreateNewRequest( - "http://test.com", true, kRequestId, kRenderProcessId, kRenderFrameId); - - // Mainframe is created. - ascriber()->RenderFrameCreated(kRenderProcessId, kRenderFrameId, -1, -1); - EXPECT_EQ(1u, recorders().size()); - - ascriber()->OnBeforeUrlRequest(request.get()); - - // Navigation starts and is ready to commit. - ascriber()->ReadyToCommitMainFrameNavigation( - content::GlobalRequestID(kRenderProcessId, 0), kRenderProcessId, - kRenderFrameId); - - EXPECT_EQ(2u, recorders().size()); - DataUse* data_use = &recorders().back().data_use(); - - EXPECT_CALL(mock_observer, OnNetworkBytesUpdate(testing::_, data_use)) - .Times(2); - ascriber()->OnNetworkBytesSent(request.get(), 2); - ascriber()->OnNetworkBytesReceived(request.get(), 2); - - EXPECT_CALL(mock_observer, OnPageResourceLoad(testing::_, data_use)).Times(1); - ascriber()->OnUrlRequestCompleted(request.get(), false); - - EXPECT_CALL(mock_observer, OnPageLoadCommit(data_use)).Times(1); - EXPECT_CALL(mock_observer, OnPageLoadConcluded(testing::_)).Times(1); - ascriber()->DidFinishMainFrameNavigation( - kRenderProcessId, kRenderFrameId, GURL("http://mobile.test.com"), false, - kPageTransition, base::TimeTicks::Now()); - - EXPECT_EQ(1u, recorders().size()); - auto& recorder_entry = recorders().front(); - EXPECT_EQ(content::GlobalFrameRoutingId(kRenderProcessId, kRenderFrameId), - recorder_entry.main_frame_id()); - EXPECT_EQ(content::GlobalRequestID(kRenderProcessId, 0), - recorder_entry.main_frame_request_id()); - EXPECT_EQ(GURL("http://mobile.test.com"), recorder_entry.data_use().url()); - - EXPECT_CALL(mock_observer, OnPageDidFinishLoad(&recorder_entry.data_use())) - .Times(1); - ascriber()->DidFinishLoad(kRenderProcessId, kRenderFrameId, - GURL("http://mobile.test.com")); - - EXPECT_CALL(mock_observer, OnPageLoadConcluded(&recorder_entry.data_use())) - .Times(1); - ascriber()->RenderFrameDeleted(kRenderProcessId, kRenderFrameId, -1, -1); - ascriber()->OnUrlRequestDestroyed(request.get()); - - EXPECT_EQ(0u, recorders().size()); -} - -TEST_F(ChromeDataUseAscriberTest, PageLoadObserverForErrorPageValidatedURL) { - CreateAscriber(); - MockPageLoadObserver mock_observer; - ascriber()->AddObserver(&mock_observer); - - std::unique_ptr<net::URLRequest> request = CreateNewRequest( - "http://test.com", true, kRequestId, kRenderProcessId, kRenderFrameId); - - // Mainframe is created. - ascriber()->RenderFrameCreated(kRenderProcessId, kRenderFrameId, -1, -1); - EXPECT_EQ(1u, recorders().size()); - - ascriber()->OnBeforeUrlRequest(request.get()); - - // Navigation starts and is ready to commit. - ascriber()->ReadyToCommitMainFrameNavigation( - content::GlobalRequestID(kRenderProcessId, 0), kRenderProcessId, - kRenderFrameId); - - EXPECT_EQ(2u, recorders().size()); - DataUse* data_use = &recorders().back().data_use(); - - EXPECT_CALL(mock_observer, OnNetworkBytesUpdate(testing::_, data_use)) - .Times(2); - ascriber()->OnNetworkBytesSent(request.get(), 2); - ascriber()->OnNetworkBytesReceived(request.get(), 2); - - EXPECT_CALL(mock_observer, OnPageResourceLoad(testing::_, data_use)).Times(1); - ascriber()->OnUrlRequestCompleted(request.get(), false); - - EXPECT_CALL(mock_observer, OnPageLoadCommit(data_use)).Times(1); - EXPECT_CALL(mock_observer, OnPageLoadConcluded(testing::_)).Times(1); - ascriber()->DidFinishMainFrameNavigation( - kRenderProcessId, kRenderFrameId, GURL("http://mobile.test.com"), false, - kPageTransition, base::TimeTicks::Now()); - - EXPECT_EQ(1u, recorders().size()); - auto& recorder_entry = recorders().front(); - EXPECT_EQ(content::GlobalFrameRoutingId(kRenderProcessId, kRenderFrameId), - recorder_entry.main_frame_id()); - EXPECT_EQ(content::GlobalRequestID(kRenderProcessId, 0), - recorder_entry.main_frame_request_id()); - EXPECT_EQ(GURL("http://mobile.test.com"), recorder_entry.data_use().url()); - - // Now expect no DidFinishLoad observer call for "about:blank" validated URL. - EXPECT_CALL(mock_observer, OnPageDidFinishLoad(&recorder_entry.data_use())) - .Times(0); - ascriber()->DidFinishLoad(kRenderProcessId, kRenderFrameId, - GURL("about:blank")); - - EXPECT_CALL(mock_observer, OnPageLoadConcluded(&recorder_entry.data_use())) - .Times(1); - ascriber()->RenderFrameDeleted(kRenderProcessId, kRenderFrameId, -1, -1); - ascriber()->OnUrlRequestDestroyed(request.get()); - - EXPECT_EQ(0u, recorders().size()); -} - -} // namespace data_use_measurement
diff --git a/chrome/browser/data_use_measurement/chrome_data_use_measurement.cc b/chrome/browser/data_use_measurement/chrome_data_use_measurement.cc index 97144396..9e3c267 100644 --- a/chrome/browser/data_use_measurement/chrome_data_use_measurement.cc +++ b/chrome/browser/data_use_measurement/chrome_data_use_measurement.cc
@@ -13,8 +13,6 @@ #include "base/task/task_traits.h" #include "build/build_config.h" #include "chrome/browser/browser_process.h" -#include "components/data_use_measurement/core/data_use_ascriber.h" -#include "components/data_use_measurement/core/url_request_classifier.h" #include "components/metrics/data_use_tracker.h" #include "content/public/browser/browser_task_traits.h" #include "content/public/browser/browser_thread.h" @@ -75,7 +73,7 @@ return; g_chrome_data_use_measurement = new ChromeDataUseMeasurement( - nullptr, nullptr, content::GetNetworkConnectionTracker(), local_state); + content::GetNetworkConnectionTracker(), local_state); } // static @@ -95,28 +93,13 @@ } ChromeDataUseMeasurement::ChromeDataUseMeasurement( - std::unique_ptr<URLRequestClassifier> url_request_classifier, - DataUseAscriber* ascriber, network::NetworkConnectionTracker* network_connection_tracker, PrefService* local_state) - : DataUseMeasurement(std::move(url_request_classifier), - ascriber, - network_connection_tracker), + : DataUseMeasurement(network_connection_tracker), local_state_(local_state) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); } -void ChromeDataUseMeasurement::UpdateDataUseToMetricsService( - int64_t total_bytes, - bool is_cellular, - bool is_metrics_service_usage) { - DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - // Update data use of user traffic and services distinguishing cellular and - // metrics services data use. - UpdateMetricsUsagePrefsOnUIThread(total_bytes, is_cellular, - is_metrics_service_usage); -} - void ChromeDataUseMeasurement::ReportNetworkServiceDataUse( int32_t network_traffic_annotation_id_hash, int64_t recv_bytes, @@ -192,20 +175,4 @@ is_metrics_service_usage, local_state); } -// This function is for forwarding metrics usage pref changes to the metrics -// service on the appropriate thread. -// TODO(gayane): Reduce the frequency of posting tasks from IO to UI thread. -void ChromeDataUseMeasurement::UpdateMetricsUsagePrefsOnUIThread( - int64_t total_bytes, - bool is_cellular, - bool is_metrics_service_usage) { - DCHECK_CURRENTLY_ON(content::BrowserThread::IO); - - base::PostTaskWithTraits( - FROM_HERE, content::BrowserThread::UI, - base::BindOnce(&ChromeDataUseMeasurement::UpdateMetricsUsagePrefs, - base::Unretained(this), total_bytes, is_cellular, - is_metrics_service_usage)); -} - } // namespace data_use_measurement
diff --git a/chrome/browser/data_use_measurement/chrome_data_use_measurement.h b/chrome/browser/data_use_measurement/chrome_data_use_measurement.h index ba1fee85..3315f1a 100644 --- a/chrome/browser/data_use_measurement/chrome_data_use_measurement.h +++ b/chrome/browser/data_use_measurement/chrome_data_use_measurement.h
@@ -9,14 +9,11 @@ #include "base/macros.h" #include "components/data_use_measurement/core/data_use_measurement.h" -#include "components/data_use_measurement/core/url_request_classifier.h" class PrefService; namespace data_use_measurement { -class DataUseAscriber; - class ChromeDataUseMeasurement : public DataUseMeasurement { public: static void CreateInstance(PrefService* local_state); @@ -24,15 +21,9 @@ static void DeleteInstance(); ChromeDataUseMeasurement( - std::unique_ptr<URLRequestClassifier> url_request_classifier, - DataUseAscriber* ascriber, network::NetworkConnectionTracker* network_connection_tracker, PrefService* local_state); - void UpdateDataUseToMetricsService(int64_t total_bytes, - bool is_cellular, - bool is_metrics_service_usage) override; - // Called when requests complete from NetworkService. void ReportNetworkServiceDataUse(int32_t network_traffic_annotation_id_hash, int64_t recv_bytes, @@ -50,9 +41,6 @@ void UpdateMetricsUsagePrefs(int64_t total_bytes, bool is_cellular, bool is_metrics_service_usage); - void UpdateMetricsUsagePrefsOnUIThread(int64_t total_bytes, - bool is_cellular, - bool is_metrics_service_usage); PrefService* local_state_ = nullptr; };
diff --git a/chrome/browser/data_use_measurement/chrome_data_use_recorder.cc b/chrome/browser/data_use_measurement/chrome_data_use_recorder.cc deleted file mode 100644 index 0c39e13..0000000 --- a/chrome/browser/data_use_measurement/chrome_data_use_recorder.cc +++ /dev/null
@@ -1,17 +0,0 @@ -// Copyright 2016 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/data_use_measurement/chrome_data_use_recorder.h" -#include "ui/base/page_transition_types.h" - -namespace data_use_measurement { - -ChromeDataUseRecorder::ChromeDataUseRecorder(DataUse::TrafficType traffic_type) - : DataUseRecorder(traffic_type), main_frame_id_(-1, -1) { - set_page_transition(ui::PAGE_TRANSITION_LAST_CORE + 1); -} - -ChromeDataUseRecorder::~ChromeDataUseRecorder() {} - -} // namespace data_use_measurement
diff --git a/chrome/browser/data_use_measurement/chrome_data_use_recorder.h b/chrome/browser/data_use_measurement/chrome_data_use_recorder.h deleted file mode 100644 index 88bce23..0000000 --- a/chrome/browser/data_use_measurement/chrome_data_use_recorder.h +++ /dev/null
@@ -1,50 +0,0 @@ -// Copyright 2016 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_DATA_USE_MEASUREMENT_CHROME_DATA_USE_RECORDER_H_ -#define CHROME_BROWSER_DATA_USE_MEASUREMENT_CHROME_DATA_USE_RECORDER_H_ - -#include <utility> - -#include "base/macros.h" -#include "components/data_use_measurement/core/data_use_recorder.h" -#include "content/public/browser/global_request_id.h" -#include "content/public/browser/global_routing_id.h" - -namespace data_use_measurement { - -class ChromeDataUseRecorder : public DataUseRecorder { - public: - explicit ChromeDataUseRecorder(DataUse::TrafficType traffic_type); - ~ChromeDataUseRecorder() override; - - content::GlobalFrameRoutingId main_frame_id() const { return main_frame_id_; } - - void set_main_frame_id(content::GlobalFrameRoutingId frame_id) { - main_frame_id_ = frame_id; - } - - content::GlobalRequestID main_frame_request_id() const { - return main_frame_request_id_; - } - - void set_main_frame_request_id(content::GlobalRequestID request_id) { - main_frame_request_id_ = request_id; - } - - private: - // Identifier for the main frame for the page load this recorder is tracking. - // Only valid if the data use is associated with a page load. - content::GlobalFrameRoutingId main_frame_id_; - - // Identifier for the MAIN_FRAME request for this page load. Only valid if - // the data use is associated with a page load. - content::GlobalRequestID main_frame_request_id_; - - DISALLOW_COPY_AND_ASSIGN(ChromeDataUseRecorder); -}; - -} // namespace data_use_measurement - -#endif // CHROME_BROWSER_DATA_USE_MEASUREMENT_CHROME_DATA_USE_RECORDER_H_
diff --git a/chrome/browser/data_use_measurement/data_use_web_contents_observer.cc b/chrome/browser/data_use_measurement/data_use_web_contents_observer.cc deleted file mode 100644 index 8885a2f..0000000 --- a/chrome/browser/data_use_measurement/data_use_web_contents_observer.cc +++ /dev/null
@@ -1,94 +0,0 @@ -// Copyright 2016 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/data_use_measurement/data_use_web_contents_observer.h" - -#include "base/memory/ptr_util.h" -#include "chrome/browser/data_use_measurement/chrome_data_use_ascriber_service.h" -#include "chrome/browser/data_use_measurement/chrome_data_use_ascriber_service_factory.h" -#include "content/public/browser/navigation_handle.h" -#include "content/public/browser/render_frame_host.h" - -namespace data_use_measurement { - -// static -void DataUseWebContentsObserver::CreateForWebContents( - content::WebContents* web_contents) { - DCHECK(web_contents); - - ChromeDataUseAscriberService* service = - ChromeDataUseAscriberServiceFactory::GetForBrowserContext( - web_contents->GetBrowserContext()); - - // Nothing to do if there is no service (Incognito), or if instance already - // exists. - if (!service || FromWebContents(web_contents)) - return; - - // |DataUseWebContentsObserver| is a |WebContentsUserData| so its lifetime - // is scoped to |web_contents|. - // |ChromeDataUseAscriberService| is a |KeyedService| and its lifetime is - // tied to a profile. Since profiles outlive |WebContents|, |service| will - // outlive |DataUseWebContentsObserver|. - web_contents->SetUserData( - UserDataKey(), - base::WrapUnique(new DataUseWebContentsObserver(web_contents, service))); -} - -DataUseWebContentsObserver::DataUseWebContentsObserver( - content::WebContents* web_contents, - ChromeDataUseAscriberService* service) - : content::WebContentsObserver(web_contents), service_(service) { - // Call RenderFrameCreated for live frames so that |service_| knows about - // all the RenderFrameHosts. - for (content::RenderFrameHost* frame : web_contents->GetAllFrames()) { - if (frame->IsRenderFrameLive()) { - service_->RenderFrameCreated(frame); - } - } -} - -DataUseWebContentsObserver::~DataUseWebContentsObserver() {} - -void DataUseWebContentsObserver::RenderFrameCreated( - content::RenderFrameHost* render_frame_host) { - service_->RenderFrameCreated(render_frame_host); -} - -void DataUseWebContentsObserver::RenderFrameDeleted( - content::RenderFrameHost* render_frame_host) { - service_->RenderFrameDeleted(render_frame_host); -} - -void DataUseWebContentsObserver::ReadyToCommitNavigation( - content::NavigationHandle* navigation_handle) { - service_->ReadyToCommitNavigation(navigation_handle); -} - -void DataUseWebContentsObserver::OnVisibilityChanged( - content::Visibility visibility) { - service_->WasShownOrHidden(web_contents()->GetMainFrame(), - visibility == content::Visibility::VISIBLE); -} - -void DataUseWebContentsObserver::RenderFrameHostChanged( - content::RenderFrameHost* old_host, - content::RenderFrameHost* new_host) { - service_->RenderFrameHostChanged(old_host, new_host); -} - -void DataUseWebContentsObserver::DidFinishNavigation( - content::NavigationHandle* navigation_handle) { - service_->DidFinishNavigation(navigation_handle); -} - -void DataUseWebContentsObserver::DidFinishLoad( - content::RenderFrameHost* render_frame_host, - const GURL& validated_url) { - service_->DidFinishLoad(render_frame_host, validated_url); -} - -WEB_CONTENTS_USER_DATA_KEY_IMPL(DataUseWebContentsObserver) - -} // namespace data_use_measurement
diff --git a/chrome/browser/data_use_measurement/data_use_web_contents_observer.h b/chrome/browser/data_use_measurement/data_use_web_contents_observer.h deleted file mode 100644 index af35ed39..0000000 --- a/chrome/browser/data_use_measurement/data_use_web_contents_observer.h +++ /dev/null
@@ -1,61 +0,0 @@ -// Copyright 2016 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_DATA_USE_MEASUREMENT_DATA_USE_WEB_CONTENTS_OBSERVER_H_ -#define CHROME_BROWSER_DATA_USE_MEASUREMENT_DATA_USE_WEB_CONTENTS_OBSERVER_H_ - -#include "base/macros.h" -#include "content/public/browser/web_contents_observer.h" -#include "content/public/browser/web_contents_user_data.h" - -namespace content { -class NavigationHandle; -class RenderFrameHost; -} - -namespace data_use_measurement { - -class ChromeDataUseAscriberService; - -// Propagates navigation and frame events to ChromeDataUseAscriberService. -// We use this class instead of having ChromeDataUseAscriberService derive from -// WebContentsObserver because each instance of WebContents needs its own -// instance of WebContentsObserver, and ChromeDataUseAscriberService needs to -// observe all WebContents. -class DataUseWebContentsObserver - : public content::WebContentsObserver, - public content::WebContentsUserData<DataUseWebContentsObserver> { - public: - // Creates a DataUseWebContentsObserver for the given WebContents. - static void CreateForWebContents(content::WebContents* web_contents); - - ~DataUseWebContentsObserver() override; - - // WebContentsObserver implementation: - void RenderFrameCreated(content::RenderFrameHost* render_frame_host) override; - void RenderFrameDeleted(content::RenderFrameHost* render_frame_host) override; - void ReadyToCommitNavigation( - content::NavigationHandle* navigation_handle) override; - void OnVisibilityChanged(content::Visibility visibility) override; - void RenderFrameHostChanged(content::RenderFrameHost* old_host, - content::RenderFrameHost* new_host) override; - void DidFinishNavigation( - content::NavigationHandle* navigation_handle) override; - void DidFinishLoad(content::RenderFrameHost* render_frame_host, - const GURL& validated_url) override; - - private: - friend class content::WebContentsUserData<DataUseWebContentsObserver>; - DataUseWebContentsObserver(content::WebContents* web_contents, - ChromeDataUseAscriberService* service); - ChromeDataUseAscriberService* const service_; - - WEB_CONTENTS_USER_DATA_KEY_DECL(); - - DISALLOW_COPY_AND_ASSIGN(DataUseWebContentsObserver); -}; - -} // namespace data_use_measurement - -#endif // CHROME_BROWSER_DATA_USE_MEASUREMENT_DATA_USE_WEB_CONTENTS_OBSERVER_H_
diff --git a/chrome/browser/devtools/devtools_window.cc b/chrome/browser/devtools/devtools_window.cc index 40f761e..3dbd95ca 100644 --- a/chrome/browser/devtools/devtools_window.cc +++ b/chrome/browser/devtools/devtools_window.cc
@@ -17,7 +17,6 @@ #include "base/time/time.h" #include "base/values.h" #include "chrome/browser/certificate_viewer.h" -#include "chrome/browser/data_use_measurement/data_use_web_contents_observer.h" #include "chrome/browser/devtools/chrome_devtools_manager_delegate.h" #include "chrome/browser/devtools/devtools_eye_dropper.h" #include "chrome/browser/file_select_helper.h" @@ -942,8 +941,6 @@ main_web_contents_->SetDelegate(this); // Bindings take ownership over devtools as its delegate. bindings_->SetDelegate(this); - data_use_measurement::DataUseWebContentsObserver::CreateForWebContents( - main_web_contents_); // DevTools uses PageZoom::Zoom(), so main_web_contents_ requires a // ZoomController. zoom::ZoomController::CreateForWebContents(main_web_contents_); @@ -1194,8 +1191,6 @@ // UserData so that it shows up in the task manager. task_manager::WebContentsTags::CreateForDevToolsContents( toolbox_web_contents_); - data_use_measurement::DataUseWebContentsObserver::CreateForWebContents( - toolbox_web_contents_); // The toolbox holds a placeholder for the inspected WebContents. When the // placeholder is resized, a frame is requested. The inspected WebContents
diff --git a/chrome/browser/download/save_package_file_picker.cc b/chrome/browser/download/save_package_file_picker.cc index 9033233..de6c9a01 100644 --- a/chrome/browser/download/save_package_file_picker.cc +++ b/chrome/browser/download/save_package_file_picker.cc
@@ -128,16 +128,10 @@ // error pages (failed DNS lookups, SSL errors, etc), which shouldn't affect // functionality. bool IsErrorPage(content::WebContents* web_contents) { - if (base::FeatureList::IsEnabled( - features::kSupervisedUserCommittedInterstitials)) { - if (web_contents->GetController().GetActiveEntry() == NULL) - return false; - return web_contents->GetController() - .GetLastCommittedEntry() - ->GetPageType() == content::PAGE_TYPE_ERROR; - } - // Fallback if someone ever disables committed interstitials. - return web_contents->ShowingInterstitialPage(); + if (web_contents->GetController().GetActiveEntry() == NULL) + return false; + return web_contents->GetController().GetLastCommittedEntry()->GetPageType() == + content::PAGE_TYPE_ERROR; } } // anonymous namespace
diff --git a/chrome/browser/extensions/api/chrome_extensions_api_client.cc b/chrome/browser/extensions/api/chrome_extensions_api_client.cc index 4b71741..b90abe9 100644 --- a/chrome/browser/extensions/api/chrome_extensions_api_client.cc +++ b/chrome/browser/extensions/api/chrome_extensions_api_client.cc
@@ -12,7 +12,6 @@ #include "base/strings/string_util.h" #include "base/task/post_task.h" #include "build/build_config.h" -#include "chrome/browser/data_use_measurement/data_use_web_contents_observer.h" #include "chrome/browser/extensions/api/automation_internal/chrome_automation_internal_api_delegate.h" #include "chrome/browser/extensions/api/chrome_device_permissions_prompt.h" #include "chrome/browser/extensions/api/declarative_content/chrome_content_rules_registry.h" @@ -99,8 +98,6 @@ pdf::PDFWebContentsHelper::CreateForWebContentsWithClient( web_contents, std::make_unique<ChromePDFWebContentsHelperClient>()); - data_use_measurement::DataUseWebContentsObserver::CreateForWebContents( - web_contents); extensions::ChromeExtensionWebContentsObserver::CreateForWebContents( web_contents); if (performance_manager::PerformanceManager::GetInstance()) {
diff --git a/chrome/browser/extensions/api/feedback_private/feedback_browsertest.cc b/chrome/browser/extensions/api/feedback_private/feedback_browsertest.cc index 5e1ea66b..5556209 100644 --- a/chrome/browser/extensions/api/feedback_private/feedback_browsertest.cc +++ b/chrome/browser/extensions/api/feedback_private/feedback_browsertest.cc
@@ -10,6 +10,8 @@ #include "chrome/browser/extensions/component_loader.h" #include "chrome/browser/extensions/extension_browsertest.h" #include "chrome/browser/feedback/feedback_dialog_utils.h" +#include "chrome/browser/feedback/feedback_uploader_chrome.h" +#include "chrome/browser/feedback/feedback_uploader_factory_chrome.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/ui/browser.h" #include "chrome/common/extensions/extension_constants.h" @@ -94,6 +96,18 @@ } }; +class TestFeedbackUploaderDelegate + : public feedback::FeedbackUploaderChrome::Delegate { + public: + explicit TestFeedbackUploaderDelegate(base::RunLoop* quit_on_dispatch) + : quit_on_dispatch_(quit_on_dispatch) {} + + void OnStartDispatchingReport() override { quit_on_dispatch_->Quit(); } + + private: + base::RunLoop* quit_on_dispatch_; +}; + // Disabled for ASan due to flakiness on Mac ASan 64 Tests (1). // See crbug.com/757243. #if defined(ADDRESS_SANITIZER) @@ -303,7 +317,7 @@ EXPECT_TRUE(bool_result); } #endif // if defined(CHROME_OS) - + IN_PROC_BROWSER_TEST_F(FeedbackTest, GetTargetTabUrl) { const std::pair<std::string, std::string> test_cases[] = { {"https://www.google.com/", "https://www.google.com/"}, @@ -340,4 +354,49 @@ DevToolsWindowTesting::CloseDevToolsWindowSync(devtools_window); } } + +IN_PROC_BROWSER_TEST_F(FeedbackTest, SubmissionTest) { + WaitForExtensionViewsToLoad(); + + ASSERT_TRUE(IsFeedbackAppAvailable()); + StartFeedbackUI(FeedbackFlow::FEEDBACK_FLOW_GOOGLEINTERNAL, std::string()); + VerifyFeedbackAppLaunch(); + + AppWindow* const window = + PlatformAppBrowserTest::GetFirstAppWindowForBrowser(browser()); + ASSERT_TRUE(window); + content::WebContents* const content = window->web_contents(); + + // Set a delegate for the uploader which will be invoked when the report + // normally would have been uploaded. We have it setup to then quit the + // RunLoop which will then allow us to terminate. + base::RunLoop run_loop; + TestFeedbackUploaderDelegate delegate(&run_loop); + feedback::FeedbackUploaderFactoryChrome::GetInstance() + ->GetForBrowserContext(browser()->profile()) + ->set_feedback_uploader_delegate(&delegate); + + // Click the send button. + bool bool_result = false; + ASSERT_TRUE(content::ExecuteScriptAndExtractBool( + content, + "domAutomationController.send(" + " ((function() {" + " if ($('send-report-button') != null) {" + " document.getElementById('send-report-button').click();" + " return true;" + " }" + " return false;" + " })()));", + &bool_result)); + EXPECT_TRUE(bool_result); + + // This will DCHECK if the JS private API call doesn't return a value, which + // is the main case we are concerned about. + run_loop.Run(); + feedback::FeedbackUploaderFactoryChrome::GetInstance() + ->GetForBrowserContext(browser()->profile()) + ->set_feedback_uploader_delegate(nullptr); +} + } // namespace extensions
diff --git a/chrome/browser/extensions/api/web_request/web_request_apitest.cc b/chrome/browser/extensions/api/web_request/web_request_apitest.cc index 6ce2a04..5a1be17 100644 --- a/chrome/browser/extensions/api/web_request/web_request_apitest.cc +++ b/chrome/browser/extensions/api/web_request/web_request_apitest.cc
@@ -2690,4 +2690,65 @@ profile()->GetOffTheRecordProfile(), extension->id(), kScript)); } +// A request handler that sets the Access-Control-Allow-Origin header. +std::unique_ptr<net::test_server::HttpResponse> HandleXHRRequest( + const net::test_server::HttpRequest& request) { + auto http_response = std::make_unique<net::test_server::BasicHttpResponse>(); + http_response->set_code(net::HTTP_OK); + http_response->AddCustomHeader("Access-Control-Allow-Origin", "*"); + return http_response; +} + +// Regression test for http://crbug.com/971206. The responseHeaders should still +// be present in onBeforeRedirect even for HSTS upgrade. +IN_PROC_BROWSER_TEST_F(ExtensionWebRequestApiTest, + ExtraHeadersWithHSTSUpgrade) { + net::EmbeddedTestServer https_test_server( + net::EmbeddedTestServer::TYPE_HTTPS); + https_test_server.RegisterRequestHandler( + base::BindRepeating(&HandleXHRRequest)); + ASSERT_TRUE(https_test_server.Start()); + + TestExtensionDir test_dir; + test_dir.WriteManifest(R"({ + "name": "Web Request HSTS Test", + "manifest_version": 2, + "version": "0.1", + "background": { "scripts": ["background.js"] }, + "permissions": ["<all_urls>", "webRequest", "webRequestBlocking"] + })"); + test_dir.WriteFile(FILE_PATH_LITERAL("background.js"), R"( + chrome.webRequest.onBeforeRedirect.addListener(function(details) { + window.headerCount = details.responseHeaders.length; + }, {urls: ['<all_urls>']}, + ['responseHeaders', 'extraHeaders']); + + chrome.test.sendMessage('ready'); + )"); + + ExtensionTestMessageListener listener("ready", false); + const Extension* extension = LoadExtension(test_dir.UnpackedPath()); + ASSERT_TRUE(extension); + EXPECT_TRUE(listener.WaitUntilSatisfied()); + + ui_test_utils::NavigateToURL(browser(), https_test_server.GetURL("/echo")); + + content::StoragePartition* partition = + content::BrowserContext::GetDefaultStoragePartition(profile()); + base::RunLoop run_loop; + partition->GetNetworkContext()->AddHSTS( + https_test_server.host_port_pair().host(), + base::Time::Now() + base::TimeDelta::FromDays(100), true, + run_loop.QuitClosure()); + run_loop.Run(); + + PerformXhrInFrame( + browser()->tab_strip_model()->GetActiveWebContents()->GetMainFrame(), + https_test_server.host_port_pair().host(), https_test_server.port(), + "echo"); + EXPECT_GT( + GetCountFromBackgroundPage(extension, profile(), "window.headerCount"), + 0); +} + } // namespace extensions
diff --git a/chrome/browser/extensions/chrome_extension_host_delegate.cc b/chrome/browser/extensions/chrome_extension_host_delegate.cc index 8bb650f..c8f51bcc 100644 --- a/chrome/browser/extensions/chrome_extension_host_delegate.cc +++ b/chrome/browser/extensions/chrome_extension_host_delegate.cc
@@ -10,7 +10,6 @@ #include "base/lazy_instance.h" #include "chrome/browser/apps/platform_apps/audio_focus_web_contents_observer.h" #include "chrome/browser/browser_process.h" -#include "chrome/browser/data_use_measurement/data_use_web_contents_observer.h" #include "chrome/browser/extensions/chrome_extension_web_contents_observer.h" #include "chrome/browser/extensions/extension_service.h" #include "chrome/browser/extensions/extension_tab_util.h" @@ -49,8 +48,6 @@ void ChromeExtensionHostDelegate::OnExtensionHostCreated( content::WebContents* web_contents) { ChromeExtensionWebContentsObserver::CreateForWebContents(web_contents); - data_use_measurement::DataUseWebContentsObserver::CreateForWebContents( - web_contents); PrefsTabHelper::CreateForWebContents(web_contents); apps::AudioFocusWebContentsObserver::CreateForWebContents(web_contents);
diff --git a/chrome/browser/extensions/content_verifier_browsertest.cc b/chrome/browser/extensions/content_verifier_browsertest.cc index db32c0d..5635e35 100644 --- a/chrome/browser/extensions/content_verifier_browsertest.cc +++ b/chrome/browser/extensions/content_verifier_browsertest.cc
@@ -327,6 +327,26 @@ extension->id(), extension->GetResourceURL(kResource)); } +// Tests that navigating to an extension resource with '/' at end does not +// disable the extension. +// +// Regression test for: https://crbug.com/929578. +IN_PROC_BROWSER_TEST_F(ContentVerifierTest, + RemainsEnabledOnNavigateToPathEndingWithSlash) { + const Extension* extension = InstallExtensionFromWebstore( + test_data_dir_.AppendASCII("content_verifier/dot_slash_paths.crx"), 1); + ASSERT_TRUE(extension); + const ExtensionId kExtensionId = extension->id(); + + GURL page_url = extension->GetResourceURL("page.html/"); + ui_test_utils::NavigateToURLWithDispositionBlockUntilNavigationsComplete( + browser(), page_url, 1, WindowOpenDisposition::CURRENT_TAB, + ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION); + ExtensionPrefs* prefs = ExtensionPrefs::Get(profile()); + int reasons = prefs->GetDisableReasons(kExtensionId); + EXPECT_FALSE(reasons); +} + class ContentVerifierPolicyTest : public ContentVerifierTest { public: // We need to do this work here because the force-install policy values are
diff --git a/chrome/browser/extensions/process_manager_browsertest.cc b/chrome/browser/extensions/process_manager_browsertest.cc index a9297d86..7baad21 100644 --- a/chrome/browser/extensions/process_manager_browsertest.cc +++ b/chrome/browser/extensions/process_manager_browsertest.cc
@@ -915,10 +915,10 @@ } } -// Check that browser-side restrictions on extension blob/filesystem URLs allow +// Check that browser-side restrictions on extension blob URLs allow // navigations that will result in downloads. See https://crbug.com/714373. IN_PROC_BROWSER_TEST_F(ProcessManagerBrowserTest, - NestedURLDownloadsToExtensionAllowed) { + BlobURLDownloadsToExtensionAllowed) { // Disabling web security is necessary to test the browser enforcement; // without it, the loads in this test would be blocked by // SecurityOrigin::CanDisplay() as invalid local resource loads. @@ -949,46 +949,42 @@ content::RenderFrameHost* main_frame = tab->GetMainFrame(); content::RenderFrameHost* extension_frame = ChildFrameAt(main_frame, 0); - // Create valid blob and filesystem URLs in the extension's origin. + // Create a valid blob URL in the extension's origin. url::Origin extension_origin(extension_frame->GetLastCommittedOrigin()); GURL blob_url(CreateBlobURL(extension_frame, "foo")); EXPECT_EQ(extension_origin, url::Origin::Create(blob_url)); - GURL filesystem_url(CreateFileSystemURL(extension_frame, "foo")); - EXPECT_EQ(extension_origin, url::Origin::Create(filesystem_url)); - GURL nested_urls[] = {blob_url, filesystem_url}; - // Check that extension blob/filesystem URLs still can be downloaded via an - // HTML anchor tag with the download attribute (i.e., <a download>) (which - // starts out as a top-level navigation). + // Check that extension blob URLs still can be downloaded via an HTML anchor + // tag with the download attribute (i.e., <a download>) (which starts out as + // a top-level navigation). PermissionRequestManager* permission_request_manager = PermissionRequestManager::FromWebContents(tab); permission_request_manager->set_auto_response_for_test( PermissionRequestManager::ACCEPT_ALL); - for (const GURL& nested_url : nested_urls) { - content::DownloadTestObserverTerminal observer( - content::BrowserContext::GetDownloadManager(profile()), 1, - content::DownloadTestObserver::ON_DANGEROUS_DOWNLOAD_FAIL); - std::string script = base::StringPrintf( - R"(var anchor = document.createElement('a'); - anchor.href = '%s'; - anchor.download = ''; - anchor.click();)", - nested_url.spec().c_str()); - EXPECT_TRUE(ExecuteScript(tab, script)); - observer.WaitForFinished(); - EXPECT_EQ( - 1u, observer.NumDownloadsSeenInState(download::DownloadItem::COMPLETE)); - // This is a top-level navigation that should have resulted in a download. - // Ensure that the tab stayed at its original location. - EXPECT_NE(nested_url, tab->GetLastCommittedURL()); - EXPECT_FALSE(extension_origin.IsSameOriginWith( - main_frame->GetLastCommittedOrigin())); - EXPECT_NE("foo", GetTextContent(main_frame)); + content::DownloadTestObserverTerminal observer( + content::BrowserContext::GetDownloadManager(profile()), 1, + content::DownloadTestObserver::ON_DANGEROUS_DOWNLOAD_FAIL); + std::string script = base::StringPrintf( + R"(var anchor = document.createElement('a'); + anchor.href = '%s'; + anchor.download = ''; + anchor.click();)", + blob_url.spec().c_str()); + EXPECT_TRUE(ExecuteScript(tab, script)); + observer.WaitForFinished(); + EXPECT_EQ(1u, + observer.NumDownloadsSeenInState(download::DownloadItem::COMPLETE)); - EXPECT_EQ(1u, pm->GetRenderFrameHostsForExtension(extension->id()).size()); - EXPECT_EQ(1u, pm->GetAllFrames().size()); - } + // This is a top-level navigation that should have resulted in a download. + // Ensure that the tab stayed at its original location. + EXPECT_NE(blob_url, tab->GetLastCommittedURL()); + EXPECT_FALSE( + extension_origin.IsSameOriginWith(main_frame->GetLastCommittedOrigin())); + EXPECT_NE("foo", GetTextContent(main_frame)); + + EXPECT_EQ(1u, pm->GetRenderFrameHostsForExtension(extension->id()).size()); + EXPECT_EQ(1u, pm->GetAllFrames().size()); } // Test that navigations to blob: and filesystem: URLs with extension origins
diff --git a/chrome/browser/feedback/feedback_uploader_chrome.cc b/chrome/browser/feedback/feedback_uploader_chrome.cc index 37653a1d..f0f4f14 100644 --- a/chrome/browser/feedback/feedback_uploader_chrome.cc +++ b/chrome/browser/feedback/feedback_uploader_chrome.cc
@@ -46,6 +46,9 @@ } void FeedbackUploaderChrome::StartDispatchingReport() { + if (delegate_) + delegate_->OnStartDispatchingReport(); + access_token_.clear(); // TODO(crbug.com/849591): Instead of getting the IdentityManager from the
diff --git a/chrome/browser/feedback/feedback_uploader_chrome.h b/chrome/browser/feedback/feedback_uploader_chrome.h index e26eaf0..5a49d651 100644 --- a/chrome/browser/feedback/feedback_uploader_chrome.h +++ b/chrome/browser/feedback/feedback_uploader_chrome.h
@@ -28,6 +28,19 @@ scoped_refptr<base::SingleThreadTaskRunner> task_runner); ~FeedbackUploaderChrome() override; + class Delegate { + public: + // Notifies the delegate when we have started dispatching a feedback report. + virtual void OnStartDispatchingReport() = 0; + + protected: + virtual ~Delegate() = default; + }; + + void set_feedback_uploader_delegate(Delegate* delegate) { + delegate_ = delegate; + } + private: // feedback::FeedbackUploader: void StartDispatchingReport() override; @@ -41,6 +54,8 @@ std::string access_token_; + Delegate* delegate_ = nullptr; // Not owned. + DISALLOW_COPY_AND_ASSIGN(FeedbackUploaderChrome); };
diff --git a/chrome/browser/flag-metadata.json b/chrome/browser/flag-metadata.json index 070333c..bc30092e 100644 --- a/chrome/browser/flag-metadata.json +++ b/chrome/browser/flag-metadata.json
@@ -842,6 +842,11 @@ "expiry_milestone": 76 }, { + "name": "enable-autofill-credit-card-upload-feedback", + "owners": [ "siyua@chromium.org, payments-autofill-team@google.com" ], + "expiry_milestone": 79 + }, + { "name": "enable-autofill-do-not-migrate-unsupported-local-cards", "owners": [ "sujiezhu@google.com", "jsaul@google.com" ], "expiry_milestone": 80
diff --git a/chrome/browser/flag_descriptions.cc b/chrome/browser/flag_descriptions.cc index 6d8ce15..b965cb44 100644 --- a/chrome/browser/flag_descriptions.cc +++ b/chrome/browser/flag_descriptions.cc
@@ -439,6 +439,13 @@ "offering card upload to Google Payments, the offer-to-save dialog " "displays an expiration date selector."; +const char kEnableAutofillCreditCardUploadFeedbackName[] = + "Enable feedback for credit card upload flow"; +const char kEnableAutofillCreditCardUploadFeedbackDescription[] = + "When enabled, if credit card upload succeeds, the avatar button will " + "show a highlight, otherwise the icon will be updated and if it is " + "clicked, the save card failure bubble will be shown."; + const char kEnableAutofillDoNotMigrateUnsupportedLocalCardsName[] = "Prevents local card migration on local cards from unsupported networks"; const char kEnableAutofillDoNotMigrateUnsupportedLocalCardsDescription[] = @@ -1657,12 +1664,6 @@ "If a page does a client side redirect or adds to the history without a " "user gesture, then skip it on back/forward UI."; -const char kSupervisedUserCommittedInterstitialsName[] = - "Enable Supervised User Committed Interstitials"; -const char kSupervisedUserCommittedInterstitialsDescription[] = - "Use committed error pages instead of transient navigation entries for " - "supervised user interstitials"; - const char kSilentDebuggerExtensionApiName[] = "Silent Debugging"; const char kSilentDebuggerExtensionApiDescription[] = "Do not show the infobar when an extension attaches to a page via "
diff --git a/chrome/browser/flag_descriptions.h b/chrome/browser/flag_descriptions.h index 9b98c2b..05445679 100644 --- a/chrome/browser/flag_descriptions.h +++ b/chrome/browser/flag_descriptions.h
@@ -282,6 +282,9 @@ extern const char kEnableAutofillCreditCardUploadEditableExpirationDateDescription[]; +extern const char kEnableAutofillCreditCardUploadFeedbackName[]; +extern const char kEnableAutofillCreditCardUploadFeedbackDescription[]; + extern const char kEnableAutofillDoNotMigrateUnsupportedLocalCardsName[]; extern const char kEnableAutofillDoNotMigrateUnsupportedLocalCardsDescription[]; @@ -981,9 +984,6 @@ extern const char kHistoryManipulationIntervention[]; extern const char kHistoryManipulationInterventionDescription[]; -extern const char kSupervisedUserCommittedInterstitialsName[]; -extern const char kSupervisedUserCommittedInterstitialsDescription[]; - extern const char kEnableDrawOcclusionName[]; extern const char kEnableDrawOcclusionDescription[];
diff --git a/chrome/browser/io_thread.cc b/chrome/browser/io_thread.cc index 5c2dacb..8ffba2a 100644 --- a/chrome/browser/io_thread.cc +++ b/chrome/browser/io_thread.cc
@@ -27,7 +27,6 @@ #include "base/trace_event/trace_event.h" #include "build/build_config.h" #include "chrome/browser/browser_process.h" -#include "chrome/browser/data_use_measurement/chrome_data_use_ascriber.h" #include "chrome/browser/net/chrome_network_delegate.h" #include "chrome/browser/net/proxy_service_factory.h" #include "chrome/common/chrome_content_client.h" @@ -35,7 +34,6 @@ #include "chrome/common/chrome_switches.h" #include "chrome/common/pref_names.h" #include "components/data_reduction_proxy/core/browser/data_reduction_proxy_prefs.h" -#include "components/data_use_measurement/core/data_use_ascriber.h" #include "components/metrics/metrics_service.h" #include "components/net_log/chrome_net_log.h" #include "components/network_session_configurator/common/network_features.h" @@ -135,8 +133,6 @@ DCHECK(!globals_); globals_ = new Globals; - globals_->data_use_ascriber = - std::make_unique<data_use_measurement::ChromeDataUseAscriber>(); #if defined(OS_MACOSX) // Start observing Keychain events. This needs to be done on the UI thread,
diff --git a/chrome/browser/io_thread.h b/chrome/browser/io_thread.h index 03a0980..f23b3989 100644 --- a/chrome/browser/io_thread.h +++ b/chrome/browser/io_thread.h
@@ -36,10 +36,6 @@ class PrefService; class SystemNetworkContextManager; -namespace data_use_measurement { -class ChromeDataUseAscriber; -} - namespace net { class NetworkQualityEstimator; } // namespace net @@ -66,10 +62,6 @@ bool quic_disabled = false; - // Ascribes all data use in Chrome to a source, such as page loads. - std::unique_ptr<data_use_measurement::ChromeDataUseAscriber> - data_use_ascriber; - // NetworkQualityEstimator only for use in dummy in-process // URLRequestContext when network service is enabled. // TODO(mmenke): Remove this, once all consumers only access the
diff --git a/chrome/browser/lifetime/browser_close_manager_browsertest.cc b/chrome/browser/lifetime/browser_close_manager_browsertest.cc index 5532e35fb..abcfa1f 100644 --- a/chrome/browser/lifetime/browser_close_manager_browsertest.cc +++ b/chrome/browser/lifetime/browser_close_manager_browsertest.cc
@@ -1146,7 +1146,8 @@ Profile::CreateProfile(path, NULL, Profile::CREATE_MODE_SYNCHRONOUS); } Profile* other_profile_ptr = other_profile.get(); - profile_manager->RegisterTestingProfile(other_profile.release(), true, false); + profile_manager->RegisterTestingProfile(std::move(other_profile), true, + false); Browser* other_profile_browser = CreateBrowser(other_profile_ptr); ASSERT_NO_FATAL_FAILURE(CreateStalledDownload(browser()));
diff --git a/chrome/browser/no_best_effort_tasks_during_startup_browsertest.cc b/chrome/browser/no_best_effort_tasks_during_startup_browsertest.cc new file mode 100644 index 0000000..c3ee4f0 --- /dev/null +++ b/chrome/browser/no_best_effort_tasks_during_startup_browsertest.cc
@@ -0,0 +1,61 @@ +// 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 "base/barrier_closure.h" +#include "base/run_loop.h" +#include "base/task/post_task.h" +#include "base/test/bind_test_util.h" +#include "chrome/browser/after_startup_task_utils.h" +#include "chrome/test/base/in_process_browser_test.h" +#include "content/public/browser/browser_task_traits.h" +#include "testing/gtest/include/gtest/gtest.h" + +namespace { + +class NoBestEffortTasksDuringStartupTest : public InProcessBrowserTest { + public: + // InProcessBrowserTest: + void PreRunTestOnMainThread() override { + // This test must run before PreRunTestOnMainThread() sets startup as + // complete. + TestNoBestEffortTasksDuringStartup(); + + InProcessBrowserTest::PreRunTestOnMainThread(); + } + + void TestNoBestEffortTasksDuringStartup() { + EXPECT_FALSE(AfterStartupTaskUtils::IsBrowserStartupComplete()); + + base::RunLoop run_loop; + auto barrier = base::BarrierClosure(2, run_loop.QuitClosure()); + + // Thread pool task. + base::PostTaskWithTraits( + FROM_HERE, {base::TaskPriority::BEST_EFFORT}, + base::BindLambdaForTesting([&]() { + EXPECT_TRUE(AfterStartupTaskUtils::IsBrowserStartupComplete()); + barrier.Run(); + })); + + // UI thread task. + base::PostTaskWithTraits( + FROM_HERE, + {content::BrowserThread::UI, base::TaskPriority::BEST_EFFORT}, + base::BindLambdaForTesting([&]() { + EXPECT_TRUE(AfterStartupTaskUtils::IsBrowserStartupComplete()); + barrier.Run(); + })); + + run_loop.Run(); + } +}; + +} // namespace + +// Verify that BEST_EFFORT tasks don't run until startup is complete. +IN_PROC_BROWSER_TEST_F(NoBestEffortTasksDuringStartupTest, + NoBestEffortTasksDuringStartup) { + // The body of the test is in the TestNoBestEffortTasksDuringStartup() method + // called from PreRunTestOnMainThread(). +}
diff --git a/chrome/browser/notifications/notification_platform_bridge_win_interactive_uitest.cc b/chrome/browser/notifications/notification_platform_bridge_win_interactive_uitest.cc index f072e05..9d455c58 100644 --- a/chrome/browser/notifications/notification_platform_bridge_win_interactive_uitest.cc +++ b/chrome/browser/notifications/notification_platform_bridge_win_interactive_uitest.cc
@@ -63,7 +63,7 @@ std::unique_ptr<Profile> profile = Profile::CreateProfile(path, nullptr, Profile::CREATE_MODE_SYNCHRONOUS); Profile* profile_ptr = profile.get(); - profile_manager->RegisterTestingProfile(profile.release(), true, false); + profile_manager->RegisterTestingProfile(std::move(profile), true, false); EXPECT_EQ(starting_number_of_profiles + 1, profile_manager->GetNumberOfProfiles()); return profile_ptr;
diff --git a/chrome/browser/notifications/scheduler/internal/impression_history_tracker.cc b/chrome/browser/notifications/scheduler/internal/impression_history_tracker.cc index 7846da9c..679c26ab 100644 --- a/chrome/browser/notifications/scheduler/internal/impression_history_tracker.cc +++ b/chrome/browser/notifications/scheduler/internal/impression_history_tracker.cc
@@ -10,8 +10,10 @@ #include "base/bind.h" #include "base/bind_helpers.h" #include "base/numerics/ranges.h" +#include "chrome/browser/notifications/scheduler/internal/scheduler_utils.h" namespace notifications { +namespace { // Comparator used to sort notification entries based on creation time. bool CreateTimeCompare(const Impression& lhs, const Impression& rhs) { @@ -32,11 +34,15 @@ } } +} // namespace + ImpressionHistoryTrackerImpl::ImpressionHistoryTrackerImpl( const SchedulerConfig& config, + std::vector<SchedulerClientType> registered_clients, std::unique_ptr<CollectionStore<ClientState>> store) : store_(std::move(store)), config_(config), + registered_clients_(std::move(registered_clients)), initialized_(false), delegate_(nullptr), weak_ptr_factory_(this) {} @@ -95,8 +101,6 @@ initialized_ = true; // Load the data to memory, and sort the impression list. - // TODO(xingliu): Persist ClientState for new registered client and remove - // deprecated client. https://crbug.com/968606. for (auto it = entries.begin(); it != entries.end(); ++it) { auto& entry = (*it); auto type = entry->type; @@ -108,9 +112,39 @@ client_states_.emplace(type, std::move(*it)); } + SyncRegisteredClients(); std::move(callback).Run(true); } +void ImpressionHistoryTrackerImpl::SyncRegisteredClients() { + // Remove deprecated clients. + for (auto it = client_states_.begin(); it != client_states_.end();) { + auto client_type = it->first; + bool deprecated = + std::find(registered_clients_.begin(), registered_clients_.end(), + client_type) == registered_clients_.end(); + if (deprecated) { + store_->Delete(ToDatabaseKey(client_type), base::DoNothing()); + client_states_.erase(it++); + continue; + } else { + it++; + } + } + + // Add new data for new registered client. + for (const auto type : registered_clients_) { + if (client_states_.find(type) == client_states_.end()) { + auto new_client_data = CreateNewClientState(type, config_); + + DCHECK(new_client_data); + store_->Add(ToDatabaseKey(type), *new_client_data.get(), + base::DoNothing()); + client_states_.emplace(type, std::move(new_client_data)); + } + } +} + void ImpressionHistoryTrackerImpl::AnalyzeImpressionHistory( ClientState* client_state) { DCHECK(client_state);
diff --git a/chrome/browser/notifications/scheduler/internal/impression_history_tracker.h b/chrome/browser/notifications/scheduler/internal/impression_history_tracker.h index d3e41f3..2e534794 100644 --- a/chrome/browser/notifications/scheduler/internal/impression_history_tracker.h +++ b/chrome/browser/notifications/scheduler/internal/impression_history_tracker.h
@@ -9,6 +9,7 @@ #include <map> #include <memory> #include <string> +#include <vector> #include "base/callback.h" #include "base/macros.h" @@ -67,6 +68,7 @@ public: explicit ImpressionHistoryTrackerImpl( const SchedulerConfig& config, + std::vector<SchedulerClientType> registered_clients, std::unique_ptr<CollectionStore<ClientState>> store); ~ImpressionHistoryTrackerImpl() override; @@ -86,6 +88,10 @@ bool success, CollectionStore<ClientState>::Entries entries); + // Sync with registered clients. Adds new data for new client and deletes data + // for deprecated client. + void SyncRegisteredClients(); + // Helper method to prune impressions created before |start_time|. Assumes // |impressions| are sorted by creation time. static void PruneImpressionByCreateTime(std::deque<Impression*>* impressions, @@ -146,6 +152,8 @@ // System configuration. const SchedulerConfig& config_; + const std::vector<SchedulerClientType> registered_clients_; + // Whether the impression tracker is successfully initialized. bool initialized_;
diff --git a/chrome/browser/notifications/scheduler/internal/impression_history_tracker_unittest.cc b/chrome/browser/notifications/scheduler/internal/impression_history_tracker_unittest.cc index 26a89e3..f8c5882 100644 --- a/chrome/browser/notifications/scheduler/internal/impression_history_tracker_unittest.cc +++ b/chrome/browser/notifications/scheduler/internal/impression_history_tracker_unittest.cc
@@ -27,6 +27,9 @@ // Input data that will be pushed to the target class. std::vector<test::ImpressionTestData> input; + // List of registered clients. + std::vector<SchedulerClientType> registered_clients; + // Expected output data. std::vector<test::ImpressionTestData> expected; }; @@ -48,6 +51,7 @@ 2 /* current_max_daily_show */, {}, base::nullopt /* suppression_info */}}; + test_case.registered_clients = {SchedulerClientType::kTest1}; test_case.expected = test_case.input; return test_case; } @@ -91,21 +95,25 @@ void SetUp() override { config_.impression_expiration = base::TimeDelta::FromDays(28); config_.suppression_duration = base::TimeDelta::FromDays(56); + config_.initial_daily_shown_per_type = 2; } protected: - // Creates the tracker and push in data. - void InitTrackerWithData(const TestCase& test_case) { - StoreEntries entries; - test::AddImpressionTestData(test_case.input, &entries); - + // Creates the impression tracker. + void CreateTracker(const TestCase& test_case) { auto store = std::make_unique<MockImpressionStore>(); store_ = store.get(); delegate_ = std::make_unique<MockDelegate>(); - impression_trakcer_ = std::make_unique<ImpressionHistoryTrackerImpl>( - config_, std::move(store)); - // Initialize the store and call the callback. + impression_trakcer_ = std::make_unique<ImpressionHistoryTrackerImpl>( + config_, test_case.registered_clients, std::move(store)); + } + + // Initializes the tracker with data defined in the |test_case|. + void InitTrackerWithData(const TestCase& test_case) { + // Initialize the store and call the callback.A + StoreEntries entries; + test::AddImpressionTestData(test_case.input, &entries); EXPECT_CALL(*store_, InitAndLoad(_)) .WillOnce( Invoke([&entries](base::OnceCallback<void(bool, StoreEntries)> cb) { @@ -137,9 +145,9 @@ EXPECT_EQ(*expected.second, *output_it->second) << "Unmatch client states: \n" << "Expected: \n" - << expected.second->DebugPrint() << " \n" + << test::DebugString(expected.second.get()) << " \n" << "Acutual: \n" - << output_it->second->DebugPrint(); + << test::DebugString(output_it->second); } } @@ -158,9 +166,37 @@ DISALLOW_COPY_AND_ASSIGN(ImpressionHistoryTrackerTest); }; +// New client data should be added to impression tracker. +TEST_F(ImpressionHistoryTrackerTest, NewReigstedClient) { + TestCase test_case = CreateDefaultTestCase(); + test_case.registered_clients.emplace_back(SchedulerClientType::kTest2); + test_case.expected.emplace_back(test::ImpressionTestData( + SchedulerClientType::kTest2, config().initial_daily_shown_per_type, {}, + base::nullopt)); + + CreateTracker(test_case); + EXPECT_CALL(*store(), Add(_, _, _)); + EXPECT_CALL(*delegate(), OnImpressionUpdated()).Times(0); + InitTrackerWithData(test_case); + VerifyClientStates(test_case); +} + +// Data for deprecated client should be deleted. +TEST_F(ImpressionHistoryTrackerTest, DeprecateClient) { + TestCase test_case = CreateDefaultTestCase(); + test_case.registered_clients.clear(); + test_case.expected.clear(); + + CreateTracker(test_case); + EXPECT_CALL(*store(), Delete(_, _)); + EXPECT_CALL(*delegate(), OnImpressionUpdated()).Times(0); + InitTrackerWithData(test_case); + VerifyClientStates(test_case); +} + // Verifies expired impression will be deleted. TEST_F(ImpressionHistoryTrackerTest, DeleteExpiredImpression) { - TestCase test_case; + TestCase test_case = CreateDefaultTestCase(); auto expired_create_time = base::Time::Now() - base::TimeDelta::FromDays(1) - config().impression_expiration; auto not_expired_time = base::Time::Now() + base::TimeDelta::FromDays(1) - @@ -179,19 +215,14 @@ // The impressions in the input should be sorted by creation time when gets // loaded to memory. - test_case.input = {{SchedulerClientType::kTest1, - 2 /* current_max_daily_show */, - {expired, not_expired, expired}, - base::nullopt /* suppression_info */}}; + test_case.input.back().impressions = {expired, not_expired, expired}; // Expired impression created in |expired_create_time| should be deleted. // No change expected on the next impression, which is not expired and no user // feedback . - test_case.expected = {{SchedulerClientType::kTest1, - 2 /* current_max_daily_show */, - {not_expired}, - base::nullopt /* suppression_info */}}; + test_case.expected.back().impressions = {not_expired}; + CreateTracker(test_case); InitTrackerWithData(test_case); EXPECT_CALL(*store(), Update(_, _, _)); EXPECT_CALL(*delegate(), OnImpressionUpdated()); @@ -202,6 +233,7 @@ // If impression has been deleted, click should have no result. TEST_F(ImpressionHistoryTrackerTest, ClickNoImpression) { TestCase test_case = CreateDefaultTestCase(); + CreateTracker(test_case); InitTrackerWithData(test_case); EXPECT_CALL(*store(), Update(_, _, _)).Times(0); EXPECT_CALL(*delegate(), OnImpressionUpdated()).Times(0); @@ -252,6 +284,7 @@ test_case.expected.front().impressions.emplace_back(impression); test_case.expected.front().suppression_info = GetParam().suppression_info; + CreateTracker(test_case); InitTrackerWithData(test_case); EXPECT_CALL(*store(), Update(_, _, _)); EXPECT_CALL(*delegate(), OnImpressionUpdated());
diff --git a/chrome/browser/notifications/scheduler/internal/impression_types.cc b/chrome/browser/notifications/scheduler/internal/impression_types.cc index 9c4deb8..899a8d82 100644 --- a/chrome/browser/notifications/scheduler/internal/impression_types.cc +++ b/chrome/browser/notifications/scheduler/internal/impression_types.cc
@@ -4,11 +4,6 @@ #include "chrome/browser/notifications/scheduler/internal/impression_types.h" -#include <sstream> - -#include "base/format_macros.h" -#include "base/strings/stringprintf.h" - namespace notifications { bool Impression::operator==(const Impression& other) const { @@ -47,40 +42,4 @@ suppression_info == other.suppression_info; } -std::string ClientState::DebugPrint() const { - std::string log = base::StringPrintf( - "Client state: type: %d \n" - "current_max_daily_show: %d \n" - "impressions.size(): %zu \n", - static_cast<int>(type), current_max_daily_show, impressions.size()); - - for (const auto& impression : impressions) { - std::ostringstream stream; - stream << "Impression, create_time:" << impression.create_time << "\n" - << " create_time in microseconds:" - << impression.create_time.ToDeltaSinceWindowsEpoch().InMicroseconds() - << "\n" - << "feedback: " << static_cast<int>(impression.feedback) << "\n" - << "impression result: " << static_cast<int>(impression.impression) - << " \n" - << "integrated: " << impression.integrated << "\n" - << "task start time: " - << static_cast<int>(impression.task_start_time) << "\n" - << "guid: " << impression.guid << "\n" - << "type: " << static_cast<int>(impression.type); - log += stream.str(); - } - - if (suppression_info.has_value()) { - std::ostringstream stream; - stream << "Suppression info, last_trigger_time:" - << suppression_info->last_trigger_time << "\n" - << "duration:" << suppression_info->duration << "\n" - << "recover_goal:" << suppression_info->recover_goal; - log += stream.str(); - } - - return log; -} - } // namespace notifications
diff --git a/chrome/browser/notifications/scheduler/internal/impression_types.h b/chrome/browser/notifications/scheduler/internal/impression_types.h index 37a8173f6..3c91f55 100644 --- a/chrome/browser/notifications/scheduler/internal/impression_types.h +++ b/chrome/browser/notifications/scheduler/internal/impression_types.h
@@ -88,9 +88,6 @@ bool operator==(const ClientState& other) const; - // Dumps data for debugging. - std::string DebugPrint() const; - // The type of notification using the scheduler. SchedulerClientType type;
diff --git a/chrome/browser/notifications/scheduler/internal/proto_conversion_unittest.cc b/chrome/browser/notifications/scheduler/internal/proto_conversion_unittest.cc index 3bf7e31a..59b1eaf 100644 --- a/chrome/browser/notifications/scheduler/internal/proto_conversion_unittest.cc +++ b/chrome/browser/notifications/scheduler/internal/proto_conversion_unittest.cc
@@ -28,8 +28,9 @@ ClientStateToProto(client_state, &proto); ClientStateFromProto(&proto, &expected); EXPECT_EQ(*client_state, expected) - << " \n Output: \n " << client_state->DebugPrint() << " \n Expected: \n" - << expected.DebugPrint(); + << " \n Output: \n " << test::DebugString(client_state) + << " \n Expected: \n" + << test::DebugString(&expected); } void TestNotificationEntryConversion(NotificationEntry* entry) {
diff --git a/chrome/browser/notifications/scheduler/internal/scheduler_config.cc b/chrome/browser/notifications/scheduler/internal/scheduler_config.cc index b9a93d8..f087ffc1 100644 --- a/chrome/browser/notifications/scheduler/internal/scheduler_config.cc +++ b/chrome/browser/notifications/scheduler/internal/scheduler_config.cc
@@ -36,6 +36,7 @@ SchedulerConfig::SchedulerConfig() : max_daily_shown_all_type(3), max_daily_shown_per_type(10), + initial_daily_shown_per_type(2), impression_expiration(kDefaultImpressionExpiration), suppression_duration(kDefaultSuppressionDuration), dismiss_count(3),
diff --git a/chrome/browser/notifications/scheduler/internal/scheduler_config.h b/chrome/browser/notifications/scheduler/internal/scheduler_config.h index 617983e..3f4ff858 100644 --- a/chrome/browser/notifications/scheduler/internal/scheduler_config.h +++ b/chrome/browser/notifications/scheduler/internal/scheduler_config.h
@@ -26,6 +26,10 @@ // Maximum number of notifications shown to the user per day for each type. int max_daily_shown_per_type; + // The initial number of notifications shown to the user per day for each + // type. + int initial_daily_shown_per_type; + // The time for a notification impression history data to expire. The // impression history will be deleted then. base::TimeDelta impression_expiration;
diff --git a/chrome/browser/notifications/scheduler/internal/scheduler_utils.cc b/chrome/browser/notifications/scheduler/internal/scheduler_utils.cc index ad7f8dd5..ccd175d 100644 --- a/chrome/browser/notifications/scheduler/internal/scheduler_utils.cc +++ b/chrome/browser/notifications/scheduler/internal/scheduler_utils.cc
@@ -5,6 +5,7 @@ #include "chrome/browser/notifications/scheduler/internal/scheduler_utils.h" #include "chrome/browser/notifications/scheduler/internal/impression_types.h" +#include "chrome/browser/notifications/scheduler/internal/scheduler_config.h" namespace notifications { @@ -58,4 +59,13 @@ } } +std::unique_ptr<ClientState> CreateNewClientState( + SchedulerClientType type, + const SchedulerConfig& config) { + auto client_state = std::make_unique<ClientState>(); + client_state->type = type; + client_state->current_max_daily_show = config.initial_daily_shown_per_type; + return client_state; +} + } // namespace notifications
diff --git a/chrome/browser/notifications/scheduler/internal/scheduler_utils.h b/chrome/browser/notifications/scheduler/internal/scheduler_utils.h index 832a749..cdd12447 100644 --- a/chrome/browser/notifications/scheduler/internal/scheduler_utils.h +++ b/chrome/browser/notifications/scheduler/internal/scheduler_utils.h
@@ -6,6 +6,7 @@ #define CHROME_BROWSER_NOTIFICATIONS_SCHEDULER_INTERNAL_SCHEDULER_UTILS_H_ #include <map> +#include <memory> #include "base/time/time.h" #include "chrome/browser/notifications/scheduler/public/notification_scheduler_types.h" @@ -13,6 +14,7 @@ namespace notifications { struct ClientState; +struct SchedulerConfig; // Retrieves the time stamp of a certain hour at a certain day from today. // |hour| must be in the range of [0, 23]. @@ -32,6 +34,11 @@ int* shown_total, SchedulerClientType* last_shown_type); +// Creates client state data for new registered client. +std::unique_ptr<ClientState> CreateNewClientState( + SchedulerClientType type, + const SchedulerConfig& config); + } // namespace notifications #endif // CHROME_BROWSER_NOTIFICATIONS_SCHEDULER_INTERNAL_SCHEDULER_UTILS_H_
diff --git a/chrome/browser/notifications/scheduler/schedule_service_factory_helper.cc b/chrome/browser/notifications/scheduler/schedule_service_factory_helper.cc index 217c7cd..e60d55c 100644 --- a/chrome/browser/notifications/scheduler/schedule_service_factory_helper.cc +++ b/chrome/browser/notifications/scheduler/schedule_service_factory_helper.cc
@@ -5,6 +5,7 @@ #include "chrome/browser/notifications/scheduler/schedule_service_factory_helper.h" #include <utility> +#include <vector> #include "base/sequenced_task_runner.h" #include "base/task/post_task.h" @@ -49,17 +50,20 @@ icon_store_dir, task_runner); auto icon_store = std::make_unique<IconProtoDbStore>(std::move(icon_db)); - // Build impression store. + // Build impression tracker. base::FilePath impression_store_dir = storage_dir.Append(kImpressionDBName); auto impression_db = db_provider->GetDB<proto::ClientState, ClientState>( leveldb_proto::ProtoDbType::NOTIFICATION_SCHEDULER_IMPRESSION_STORE, impression_store_dir, task_runner); auto impression_store = std::make_unique<ImpressionStore>(std::move(impression_db)); + std::vector<SchedulerClientType> registered_clients; + client_registrar->GetRegisteredClients(®istered_clients); auto impression_tracker = std::make_unique<ImpressionHistoryTrackerImpl>( - *config.get(), std::move(impression_store)); + *config.get(), std::move(registered_clients), + std::move(impression_store)); - // Build notification store. + // Build scheduled notification manager. base::FilePath notification_store_dir = storage_dir.Append(kNotificationDBName); auto notification_db = db_provider->GetDB<proto::NotificationEntry,
diff --git a/chrome/browser/notifications/scheduler/test/test_utils.cc b/chrome/browser/notifications/scheduler/test/test_utils.cc index 760d7f1..de7cc02 100644 --- a/chrome/browser/notifications/scheduler/test/test_utils.cc +++ b/chrome/browser/notifications/scheduler/test/test_utils.cc
@@ -7,6 +7,8 @@ #include <sstream> #include <utility> +#include "base/format_macros.h" +#include "base/strings/stringprintf.h" #include "chrome/browser/notifications/scheduler/internal/notification_entry.h" #include "chrome/browser/notifications/scheduler/public/notification_data.h" @@ -61,7 +63,7 @@ } } -std::string DebugString(NotificationData* data) { +std::string DebugString(const NotificationData* data) { DCHECK(data); std::ostringstream stream; stream << " Notification Data: \n id:" << data->id @@ -70,7 +72,7 @@ return stream.str(); } -std::string DebugString(NotificationEntry* entry) { +std::string DebugString(const NotificationEntry* entry) { DCHECK(entry); std::ostringstream stream; stream << "NotificationEntry: \n type: " << static_cast<int>(entry->type) @@ -82,5 +84,43 @@ return stream.str(); } +std::string DebugString(const ClientState* client_state) { + DCHECK(client_state); + std::string log = base::StringPrintf( + "Client state: type: %d \n" + "current_max_daily_show: %d \n" + "impressions.size(): %zu \n", + static_cast<int>(client_state->type), + client_state->current_max_daily_show, client_state->impressions.size()); + + for (const auto& impression : client_state->impressions) { + std::ostringstream stream; + stream << "Impression, create_time:" << impression.create_time << "\n" + << " create_time in microseconds:" + << impression.create_time.ToDeltaSinceWindowsEpoch().InMicroseconds() + << "\n" + << "feedback: " << static_cast<int>(impression.feedback) << "\n" + << "impression result: " << static_cast<int>(impression.impression) + << " \n" + << "integrated: " << impression.integrated << "\n" + << "task start time: " + << static_cast<int>(impression.task_start_time) << "\n" + << "guid: " << impression.guid << "\n" + << "type: " << static_cast<int>(impression.type); + log += stream.str(); + } + + if (client_state->suppression_info.has_value()) { + std::ostringstream stream; + stream << "Suppression info, last_trigger_time:" + << client_state->suppression_info->last_trigger_time << "\n" + << "duration:" << client_state->suppression_info->duration << "\n" + << "recover_goal:" << client_state->suppression_info->recover_goal; + log += stream.str(); + } + + return log; +} + } // namespace test } // namespace notifications
diff --git a/chrome/browser/notifications/scheduler/test/test_utils.h b/chrome/browser/notifications/scheduler/test/test_utils.h index da79028..8492701 100644 --- a/chrome/browser/notifications/scheduler/test/test_utils.h +++ b/chrome/browser/notifications/scheduler/test/test_utils.h
@@ -51,10 +51,13 @@ std::vector<std::unique_ptr<ClientState>>* client_states); // Generates a debug string to print details of |data|. -std::string DebugString(NotificationData* data); +std::string DebugString(const NotificationData* data); // Generates a debug string to print details of |entry|. -std::string DebugString(NotificationEntry* entry); +std::string DebugString(const NotificationEntry* entry); + +// Generates a debug string to print details of |client_state|. +std::string DebugString(const ClientState* client_state); } // namespace test } // namespace notifications
diff --git a/chrome/browser/offline_pages/android/offline_test_util_jni.cc b/chrome/browser/offline_pages/android/offline_test_util_jni.cc index 1018f65..6baad1ea 100644 --- a/chrome/browser/offline_pages/android/offline_test_util_jni.cc +++ b/chrome/browser/offline_pages/android/offline_test_util_jni.cc
@@ -266,4 +266,12 @@ } } +void JNI_OfflineTestUtil_SetGCMTokenForTesting( + JNIEnv* env, + const JavaParamRef<jstring>& gcm_token) { + prefetch_prefs::SetCachedPrefetchGCMToken( + ::android::GetMainProfileKey()->GetPrefs(), + base::android::ConvertJavaStringToUTF8(env, gcm_token)); +} + } // namespace offline_pages
diff --git a/chrome/browser/offline_pages/android/prefetch_background_task_android.cc b/chrome/browser/offline_pages/android/prefetch_background_task_android.cc index 2a3b10e5..989729b 100644 --- a/chrome/browser/offline_pages/android/prefetch_background_task_android.cc +++ b/chrome/browser/offline_pages/android/prefetch_background_task_android.cc
@@ -5,7 +5,6 @@ #include <memory> -#include "base/android/jni_string.h" #include "base/logging.h" #include "base/time/time.h" #include "chrome/browser/android/profile_key_util.h" @@ -27,8 +26,7 @@ // JNI call to start request processing in scheduled mode. static jboolean JNI_PrefetchBackgroundTask_StartPrefetchTask( JNIEnv* env, - const JavaParamRef<jobject>& jcaller, - const JavaParamRef<jstring>& gcm_token) { + const JavaParamRef<jobject>& jcaller) { ProfileKey* profile_key = ::android::GetMainProfileKey(); DCHECK(profile_key); @@ -37,9 +35,6 @@ if (!prefetch_service) return false; - prefetch_service->SetCachedGCMToken( - base::android::ConvertJavaStringToUTF8(env, gcm_token)); - prefetch_service->GetPrefetchDispatcher()->BeginBackgroundTask( std::make_unique<PrefetchBackgroundTaskAndroid>(env, jcaller, prefetch_service));
diff --git a/chrome/browser/offline_pages/android/prefetch_background_task_scheduler_android.cc b/chrome/browser/offline_pages/android/prefetch_background_task_scheduler_android.cc index 627498f..dc1a7d0 100644 --- a/chrome/browser/offline_pages/android/prefetch_background_task_scheduler_android.cc +++ b/chrome/browser/offline_pages/android/prefetch_background_task_scheduler_android.cc
@@ -6,28 +6,23 @@ #include <memory> -#include "base/android/jni_string.h" #include "jni/PrefetchBackgroundTaskScheduler_jni.h" namespace offline_pages { // static -void PrefetchBackgroundTaskScheduler::Schedule(int additional_delay_seconds, - const std::string& gcm_token) { +void PrefetchBackgroundTaskScheduler::Schedule(int additional_delay_seconds) { JNIEnv* env = base::android::AttachCurrentThread(); prefetch::Java_PrefetchBackgroundTaskScheduler_scheduleTask( - env, additional_delay_seconds, - base::android::ConvertUTF8ToJavaString(env, gcm_token)); + env, additional_delay_seconds); } // static void PrefetchBackgroundTaskScheduler::ScheduleLimitless( - int additional_delay_seconds, - const std::string& gcm_token) { + int additional_delay_seconds) { JNIEnv* env = base::android::AttachCurrentThread(); prefetch::Java_PrefetchBackgroundTaskScheduler_scheduleTaskLimitless( - env, additional_delay_seconds, - base::android::ConvertUTF8ToJavaString(env, gcm_token)); + env, additional_delay_seconds); } // static
diff --git a/chrome/browser/offline_pages/offline_page_url_loader.cc b/chrome/browser/offline_pages/offline_page_url_loader.cc index c6d049c6..78041c67 100644 --- a/chrome/browser/offline_pages/offline_page_url_loader.cc +++ b/chrome/browser/offline_pages/offline_page_url_loader.cc
@@ -293,7 +293,6 @@ } response_head.mime_type = "multipart/related"; - response_head.charset = "utf-8"; response_head.content_length = file_size; client_->OnReceiveResponse(response_head);
diff --git a/chrome/browser/offline_pages/prefetch/prefetch_background_task_handler_impl.cc b/chrome/browser/offline_pages/prefetch/prefetch_background_task_handler_impl.cc index e870a044..495622e1 100644 --- a/chrome/browser/offline_pages/prefetch/prefetch_background_task_handler_impl.cc +++ b/chrome/browser/offline_pages/prefetch/prefetch_background_task_handler_impl.cc
@@ -40,14 +40,12 @@ PrefetchBackgroundTaskScheduler::Cancel(); } -void PrefetchBackgroundTaskHandlerImpl::EnsureTaskScheduled( - const std::string& gcm_token) { +void PrefetchBackgroundTaskHandlerImpl::EnsureTaskScheduled() { if (prefetch_prefs::IsLimitlessPrefetchingEnabled(prefs_)) { PrefetchBackgroundTaskScheduler::ScheduleLimitless( - GetAdditionalBackoffSeconds(), gcm_token); + GetAdditionalBackoffSeconds()); } else { - PrefetchBackgroundTaskScheduler::Schedule(GetAdditionalBackoffSeconds(), - gcm_token); + PrefetchBackgroundTaskScheduler::Schedule(GetAdditionalBackoffSeconds()); } }
diff --git a/chrome/browser/offline_pages/prefetch/prefetch_background_task_handler_impl.h b/chrome/browser/offline_pages/prefetch/prefetch_background_task_handler_impl.h index aeed5f3..cd74191a 100644 --- a/chrome/browser/offline_pages/prefetch/prefetch_background_task_handler_impl.h +++ b/chrome/browser/offline_pages/prefetch/prefetch_background_task_handler_impl.h
@@ -6,7 +6,6 @@ #define CHROME_BROWSER_OFFLINE_PAGES_PREFETCH_PREFETCH_BACKGROUND_TASK_HANDLER_IMPL_H_ #include <memory> -#include <string> #include "base/macros.h" #include "components/offline_pages/core/prefetch/prefetch_background_task_handler.h" @@ -45,7 +44,7 @@ // PrefetchBackgroundTaskHandler implementation. void CancelBackgroundTask() override; - void EnsureTaskScheduled(const std::string& gcm_token) override; + void EnsureTaskScheduled() override; // Backoff control. These functions directly modify/read prefs. void Backoff() override;
diff --git a/chrome/browser/offline_pages/prefetch/prefetch_background_task_scheduler.h b/chrome/browser/offline_pages/prefetch/prefetch_background_task_scheduler.h index 27beda1..19a70cf6 100644 --- a/chrome/browser/offline_pages/prefetch/prefetch_background_task_scheduler.h +++ b/chrome/browser/offline_pages/prefetch/prefetch_background_task_scheduler.h
@@ -5,8 +5,6 @@ #ifndef CHROME_BROWSER_OFFLINE_PAGES_PREFETCH_PREFETCH_BACKGROUND_TASK_SCHEDULER_H_ #define CHROME_BROWSER_OFFLINE_PAGES_PREFETCH_PREFETCH_BACKGROUND_TASK_SCHEDULER_H_ -#include <string> - namespace offline_pages { class PrefetchBackgroundTaskScheduler { @@ -14,17 +12,13 @@ // API for interacting with BackgroundTaskScheduler from native. // Schedules the default 'NWake' prefetching task. // |additional_delay_seconds| is relative to the default 15 minute delay. - // |gcm_token| is used so as to not require GCM handler when chrome wakes up - // for the background task. // Implemented in platform-specific object files. - static void Schedule(int additional_delay_seconds, - const std::string& gcm_token); + static void Schedule(int additional_delay_seconds); // Same as |Schedule| but adapted to when limitless prefetching is enabled so // that less restrictions are applied to the scheduling of the background // task. - static void ScheduleLimitless(int additional_delay_seconds, - const std::string& gcm_token); + static void ScheduleLimitless(int additional_delay_seconds); // Cancels the default 'NWake' prefetching task. // Implemented in platform-specific object files.
diff --git a/chrome/browser/offline_pages/prefetch/prefetch_service_factory.cc b/chrome/browser/offline_pages/prefetch/prefetch_service_factory.cc index 37984e80..f8f59365 100644 --- a/chrome/browser/offline_pages/prefetch/prefetch_service_factory.cc +++ b/chrome/browser/offline_pages/prefetch/prefetch_service_factory.cc
@@ -69,8 +69,8 @@ base::PostTaskWithTraits( FROM_HERE, {content::BrowserThread::UI, base::TaskPriority::BEST_EFFORT}, - base::BindOnce(&PrefetchServiceImpl::GetGCMToken, service->GetWeakPtr(), - base::DoNothing::Once<const std::string&>())); + base::BindOnce(&PrefetchServiceImpl::RefreshGCMToken, + service->GetWeakPtr())); } } @@ -177,7 +177,7 @@ std::move(prefetch_store), std::move(suggested_articles_observer), std::move(prefetch_downloader), std::move(prefetch_importer), std::move(prefetch_background_task_handler), std::move(thumbnail_fetcher), - image_fetcher); + image_fetcher, profile_key->GetPrefs()); auto callback = base::BindOnce(&OnProfileCreated, service.get()); FullBrowserTransitionManager::Get()->RegisterCallbackOnProfileCreation(
diff --git a/chrome/browser/page_load_metrics/observers/data_saver_site_breakdown_metrics_observer_browsertest.cc b/chrome/browser/page_load_metrics/observers/data_saver_site_breakdown_metrics_observer_browsertest.cc index 55bf1aee..ca9130a 100644 --- a/chrome/browser/page_load_metrics/observers/data_saver_site_breakdown_metrics_observer_browsertest.cc +++ b/chrome/browser/page_load_metrics/observers/data_saver_site_breakdown_metrics_observer_browsertest.cc
@@ -59,8 +59,7 @@ : public InProcessBrowserTest { protected: void SetUp() override { - scoped_feature_list_.InitWithFeatures( - {previews::features::kClientLoFi, features::kLazyImageLoading}, {}); + scoped_feature_list_.InitWithFeatures({features::kLazyImageLoading}, {}); InProcessBrowserTest::SetUp(); }
diff --git a/chrome/browser/page_load_metrics/observers/previews_ukm_observer_unittest.cc b/chrome/browser/page_load_metrics/observers/previews_ukm_observer_unittest.cc index 2abc583e8..12d9321 100644 --- a/chrome/browser/page_load_metrics/observers/previews_ukm_observer_unittest.cc +++ b/chrome/browser/page_load_metrics/observers/previews_ukm_observer_unittest.cc
@@ -731,305 +731,6 @@ base::nullopt /* hint_source */); } -TEST_F(PreviewsUKMObserverTest, ClientLoFiSeen) { - RunTest(content::PREVIEWS_UNSPECIFIED /* allowed_state */, PreviewsType::LOFI, - false /* lite_page_received */, - false /* lite_page_redirect_received */, false /* noscript_on */, - false /* resource_loading_hints_on */, false /* origin_opt_out */, - false /* save_data_enabled */, false /* is_offline_preview */, - CoinFlipHoldbackResult::kNotSet, {} /* eligibility_reasons */, - base::nullopt /* navigation_restart_penalty */, - base::nullopt /* hint_version_string */); - - std::unique_ptr<data_reduction_proxy::DataReductionProxyData> data = - std::make_unique<data_reduction_proxy::DataReductionProxyData>(); - data->set_client_lofi_requested(true); - - // Prepare 3 resources of varying size and configurations, 2 of which have - // client LoFi set. - page_load_metrics::ExtraRequestCompleteInfo resources[] = { - {GURL(kDefaultTestUrl), net::IPEndPoint(), -1, false /*was_cached*/, - 1024 * 40 /* raw_body_bytes */, - 1024 * 40 * 5 /* original_network_content_length */, std::move(data), - content::ResourceType::kImage, 0, nullptr /* load_timing_info */}, - // Uncached non-proxied request. - {GURL(kDefaultTestUrl), net::IPEndPoint(), -1, false /*was_cached*/, - 1024 * 40 /* raw_body_bytes */, - 1024 * 40 /* original_network_content_length */, - nullptr /* data_reduction_proxy_data */, content::ResourceType::kImage, - 0, nullptr /* load_timing_info */}, - }; - - for (const auto& request : resources) - SimulateLoadedResource(request); - - NavigateToUntrackedUrl(); - - ValidateUKM(false /* server_lofi_expected */, true /* client_lofi_expected */, - false /* lite_page_expected */, - false /* lite_page_redirect_expected */, - false /* noscript_expected */, - false /* resource_loading_hints_expected */, - 0 /* opt_out_value */, false /* origin_opt_out_expected */, - false /* save_data_enabled_expected */, - false /* offline_preview_expected */, false /* previews_likely */, - CoinFlipHoldbackResult::kNotSet, {} /* eligibility_reasons */, - base::nullopt /* navigation_restart_penalty */, - base::nullopt /* hint_generation_timestamp */, - base::nullopt /* hint_source */); -} - -TEST_F(PreviewsUKMObserverTest, ClientLoFiOptOutChip) { - RunTest(content::PREVIEWS_UNSPECIFIED /* allowed_state */, PreviewsType::LOFI, - false /* lite_page_received */, - false /* lite_page_redirect_received */, false /* noscript_on */, - false /* resource_loading_hints_on */, false /* origin_opt_out */, - false /* save_data_enabled */, false /* is_offline_preview */, - CoinFlipHoldbackResult::kNotSet, {} /* eligibility_reasons */, - base::nullopt /* navigation_restart_penalty */, - base::nullopt /* hint_version_string */); - - std::unique_ptr<data_reduction_proxy::DataReductionProxyData> data = - std::make_unique<data_reduction_proxy::DataReductionProxyData>(); - data->set_client_lofi_requested(true); - - // Prepare 3 resources of varying size and configurations, 2 of which have - // client LoFi set. - page_load_metrics::ExtraRequestCompleteInfo resources[] = { - {GURL(kDefaultTestUrl), net::IPEndPoint(), -1, false /*was_cached*/, - 1024 * 40 /* raw_body_bytes */, - 1024 * 40 * 5 /* original_network_content_length */, std::move(data), - content::ResourceType::kImage, 0, nullptr /* load_timing_info */}, - // Uncached non-proxied request. - {GURL(kDefaultTestUrl), net::IPEndPoint(), -1, false /*was_cached*/, - 1024 * 40 /* raw_body_bytes */, - 1024 * 40 /* original_network_content_length */, - nullptr /* data_reduction_proxy_data */, content::ResourceType::kImage, - 0, nullptr /* load_timing_info */}, - }; - - for (const auto& request : resources) - SimulateLoadedResource(request); - observer()->BroadcastEventToObservers(PreviewsUITabHelper::OptOutEventKey()); - NavigateToUntrackedUrl(); - - ValidateUKM(false /* server_lofi_expected */, true /* client_lofi_expected */, - false /* lite_page_expected */, - false /* lite_page_redirect_expected */, - false /* noscript_expected */, - false /* resource_loading_hints_expected */, - 2 /* opt_out_value */, false /* origin_opt_out_expected */, - false /* save_data_enabled_expected */, - false /* offline_preview_expected */, false /* previews_likely */, - CoinFlipHoldbackResult::kNotSet, {} /* eligibility_reasons */, - base::nullopt /* navigation_restart_penalty */, - base::nullopt /* hint_generation_timestamp */, - base::nullopt /* hint_source */); -} - -TEST_F(PreviewsUKMObserverTest, ServerLoFiSeen) { - RunTest(content::PREVIEWS_UNSPECIFIED /* allowed_state */, PreviewsType::LOFI, - false /* lite_page_received */, - false /* lite_page_redirect_received */, false /* noscript_on */, - false /* resource_loading_hints_on */, false /* origin_opt_out */, - false /* save_data_enabled */, false /* is_offline_preview */, - CoinFlipHoldbackResult::kNotSet, {} /* eligibility_reasons */, - base::nullopt /* navigation_restart_penalty */, - base::nullopt /* hint_version_string */); - - std::unique_ptr<data_reduction_proxy::DataReductionProxyData> data = - std::make_unique<data_reduction_proxy::DataReductionProxyData>(); - data->set_used_data_reduction_proxy(true); - data->set_lofi_received(true); - - // Prepare 3 resources of varying size and configurations, 2 of which have - // client LoFi set. - page_load_metrics::ExtraRequestCompleteInfo resources[] = { - {GURL(kDefaultTestUrl), net::IPEndPoint(), -1, false /*was_cached*/, - 1024 * 40 /* raw_body_bytes */, - 1024 * 40 * 5 /* original_network_content_length */, std::move(data), - content::ResourceType::kImage, 0, nullptr /* load_timing_info */}, - {GURL(kDefaultTestUrl), net::IPEndPoint(), -1, false /*was_cached*/, - 1024 * 40 /* raw_body_bytes */, - 1024 * 40 /* original_network_content_length */, - nullptr /* data_reduction_proxy_data */, content::ResourceType::kImage, - 0, nullptr /* load_timing_info */}, - }; - - for (const auto& request : resources) - SimulateLoadedResource(request); - - NavigateToUntrackedUrl(); - - ValidateUKM(true /* server_lofi_expected */, false /* client_lofi_expected */, - false /* lite_page_expected */, - false /* lite_page_redirect_expected */, - false /* noscript_expected */, - false /* resource_loading_hints_expected */, - 0 /* opt_out_value */, false /* origin_opt_out_expected */, - false /* save_data_enabled_expected */, - false /* offline_preview_expected */, false /* previews_likely */, - CoinFlipHoldbackResult::kNotSet, {} /* eligibility_reasons */, - base::nullopt /* navigation_restart_penalty */, - base::nullopt /* hint_generation_timestamp */, - base::nullopt /* hint_source */); -} - -TEST_F(PreviewsUKMObserverTest, ServerLoFiOptOutChip) { - RunTest(content::PREVIEWS_UNSPECIFIED /* allowed_state */, PreviewsType::LOFI, - false /* lite_page_received */, - false /* lite_page_redirect_received */, false /* noscript_on */, - false /* resource_loading_hints_on */, false /* origin_opt_out */, - false /* save_data_enabled */, false /* is_offline_preview */, - CoinFlipHoldbackResult::kNotSet, {} /* eligibility_reasons */, - base::nullopt /* navigation_restart_penalty */, - base::nullopt /* hint_version_string */); - - std::unique_ptr<data_reduction_proxy::DataReductionProxyData> data = - std::make_unique<data_reduction_proxy::DataReductionProxyData>(); - data->set_used_data_reduction_proxy(true); - data->set_lofi_received(true); - - // Prepare 3 resources of varying size and configurations, 2 of which have - // client LoFi set. - page_load_metrics::ExtraRequestCompleteInfo resources[] = { - {GURL(kDefaultTestUrl), net::IPEndPoint(), -1, false /*was_cached*/, - 1024 * 40 /* raw_body_bytes */, - 1024 * 40 * 5 /* original_network_content_length */, std::move(data), - content::ResourceType::kImage, 0, nullptr /* load_timing_info */}, - {GURL(kDefaultTestUrl), net::IPEndPoint(), -1, false /*was_cached*/, - 1024 * 40 /* raw_body_bytes */, - 1024 * 40 /* original_network_content_length */, - nullptr /* data_reduction_proxy_data */, content::ResourceType::kImage, - 0, nullptr /* load_timing_info */}, - }; - - for (const auto& request : resources) - SimulateLoadedResource(request); - - observer()->BroadcastEventToObservers(PreviewsUITabHelper::OptOutEventKey()); - NavigateToUntrackedUrl(); - - ValidateUKM(true /* server_lofi_expected */, false /* client_lofi_expected */, - false /* lite_page_expected */, - false /* lite_page_redirect_expected */, - false /* noscript_expected */, - false /* resource_loading_hints_expected */, - 2 /* opt_out_value */, false /* origin_opt_out_expected */, - false /* save_data_enabled_expected */, - false /* offline_preview_expected */, false /* previews_likely */, - CoinFlipHoldbackResult::kNotSet, {} /* eligibility_reasons */, - base::nullopt /* navigation_restart_penalty */, - base::nullopt /* hint_generation_timestamp */, - base::nullopt /* hint_source */); -} - -TEST_F(PreviewsUKMObserverTest, BothLoFiSeen) { - RunTest(content::PREVIEWS_UNSPECIFIED /* allowed_state */, PreviewsType::LOFI, - false /* lite_page_received */, - false /* lite_page_redirect_received */, false /* noscript_on */, - false /* resource_loading_hints_on */, false /* origin_opt_out */, - false /* save_data_enabled */, false /* is_offline_preview */, - CoinFlipHoldbackResult::kNotSet, {} /* eligibility_reasons */, - base::nullopt /* navigation_restart_penalty */, - base::nullopt /* hint_version_string */); - - std::unique_ptr<data_reduction_proxy::DataReductionProxyData> data1 = - std::make_unique<data_reduction_proxy::DataReductionProxyData>(); - data1->set_used_data_reduction_proxy(true); - data1->set_lofi_received(true); - - std::unique_ptr<data_reduction_proxy::DataReductionProxyData> data2 = - std::make_unique<data_reduction_proxy::DataReductionProxyData>(); - data2->set_used_data_reduction_proxy(true); - data2->set_client_lofi_requested(true); - - // Prepare 4 resources of varying size and configurations, 1 has Client LoFi, - // 1 has Server LoFi. - page_load_metrics::ExtraRequestCompleteInfo resources[] = { - // Uncached proxied request with .1 compression ratio. - {GURL(kDefaultTestUrl), net::IPEndPoint(), -1, false /*was_cached*/, - 1024 * 40 /* raw_body_bytes */, - 1024 * 40 * 10 /* original_network_content_length */, std::move(data1), - content::ResourceType::kImage, 0, nullptr /* load_timing_info */}, - // Uncached proxied request with .5 compression ratio. - {GURL(kDefaultTestUrl), net::IPEndPoint(), -1, false /*was_cached*/, - 1024 * 40 /* raw_body_bytes */, - 1024 * 40 * 5 /* original_network_content_length */, std::move(data2), - content::ResourceType::kImage, 0, nullptr /* load_timing_info */}, - }; - - for (const auto& request : resources) - SimulateLoadedResource(request); - - NavigateToUntrackedUrl(); - ValidateUKM(true /* server_lofi_expected */, true /* client_lofi_expected */, - false /* lite_page_expected */, - false /* lite_page_redirect_expected */, - false /* noscript_expected */, - false /* resource_loading_hints_expected */, - 0 /* opt_out_value */, false /* origin_opt_out_expected */, - false /* save_data_enabled_expected */, - false /* offline_preview_expected */, false /* previews_likely */, - CoinFlipHoldbackResult::kNotSet, {} /* eligibility_reasons */, - base::nullopt /* navigation_restart_penalty */, - base::nullopt /* hint_generation_timestamp */, - base::nullopt /* hint_source */); -} - -TEST_F(PreviewsUKMObserverTest, BothLoFiOptOutChip) { - RunTest(content::PREVIEWS_UNSPECIFIED /* allowed_state */, PreviewsType::LOFI, - false /* lite_page_received */, - false /* lite_page_redirect_received */, false /* noscript_on */, - false /* resource_loading_hints_on */, false /* origin_opt_out */, - false /* save_data_enabled */, false /* is_offline_preview */, - CoinFlipHoldbackResult::kNotSet, {} /* eligibility_reasons */, - base::nullopt /* navigation_restart_penalty */, - base::nullopt /* hint_version_string */); - - std::unique_ptr<data_reduction_proxy::DataReductionProxyData> data1 = - std::make_unique<data_reduction_proxy::DataReductionProxyData>(); - data1->set_used_data_reduction_proxy(true); - data1->set_lofi_received(true); - - std::unique_ptr<data_reduction_proxy::DataReductionProxyData> data2 = - std::make_unique<data_reduction_proxy::DataReductionProxyData>(); - data2->set_used_data_reduction_proxy(true); - data2->set_client_lofi_requested(true); - - // Prepare 4 resources of varying size and configurations, 1 has Client LoFi, - // 1 has Server LoFi. - page_load_metrics::ExtraRequestCompleteInfo resources[] = { - // Uncached proxied request with .1 compression ratio. - {GURL(kDefaultTestUrl), net::IPEndPoint(), -1, false /*was_cached*/, - 1024 * 40 /* raw_body_bytes */, - 1024 * 40 * 10 /* original_network_content_length */, std::move(data1), - content::ResourceType::kImage, 0, nullptr /* load_timing_info */}, - // Uncached proxied request with .5 compression ratio. - {GURL(kDefaultTestUrl), net::IPEndPoint(), -1, false /*was_cached*/, - 1024 * 40 /* raw_body_bytes */, - 1024 * 40 * 5 /* original_network_content_length */, std::move(data2), - content::ResourceType::kImage, 0, nullptr /* load_timing_info */}, - }; - - for (const auto& request : resources) - SimulateLoadedResource(request); - observer()->BroadcastEventToObservers(PreviewsUITabHelper::OptOutEventKey()); - NavigateToUntrackedUrl(); - ValidateUKM(true /* server_lofi_expected */, true /* client_lofi_expected */, - false /* lite_page_expected */, - false /* lite_page_redirect_expected */, - false /* noscript_expected */, - false /* resource_loading_hints_expected */, - 2 /* opt_out_value */, false /* origin_opt_out_expected */, - false /* save_data_enabled_expected */, - false /* offline_preview_expected */, false /* previews_likely */, - CoinFlipHoldbackResult::kNotSet, {} /* eligibility_reasons */, - base::nullopt /* navigation_restart_penalty */, - base::nullopt /* hint_generation_timestamp */, - base::nullopt /* hint_source */); -} - TEST_F(PreviewsUKMObserverTest, OriginOptOut) { RunTest(content::PREVIEWS_UNSPECIFIED /* allowed_state */, PreviewsType::NONE, false /* lite_page_received */, @@ -1469,6 +1170,8 @@ PreviewsType type = static_cast<PreviewsType>(i); if (type == PreviewsType::DEPRECATED_AMP_REDIRECTION) continue; + if (type == PreviewsType::DEPRECATED_LOFI) + continue; base::HistogramTester tester; RunTest(content::PREVIEWS_UNSPECIFIED /* allowed_state */, type,
diff --git a/chrome/browser/password_manager/password_manager_infobar_delegate_android.cc b/chrome/browser/password_manager/password_manager_infobar_delegate_android.cc index d0ee87b3..d5ccfaa 100644 --- a/chrome/browser/password_manager/password_manager_infobar_delegate_android.cc +++ b/chrome/browser/password_manager/password_manager_infobar_delegate_android.cc
@@ -16,7 +16,6 @@ PasswordManagerInfoBarDelegate::PasswordManagerInfoBarDelegate() : ConfirmInfoBarDelegate(), - message_link_range_(gfx::Range()), details_message_(base::string16()) {} base::string16 PasswordManagerInfoBarDelegate::GetDetailsMessageText() const { @@ -55,11 +54,6 @@ message_ = message; } -void PasswordManagerInfoBarDelegate::SetMessageLinkRange( - const gfx::Range& message_link_range) { - message_link_range_ = message_link_range; -} - void PasswordManagerInfoBarDelegate::SetDetailsMessage( const base::string16& details_message) { details_message_ = details_message;
diff --git a/chrome/browser/password_manager/password_manager_infobar_delegate_android.h b/chrome/browser/password_manager/password_manager_infobar_delegate_android.h index 4ac5116..981714f 100644 --- a/chrome/browser/password_manager/password_manager_infobar_delegate_android.h +++ b/chrome/browser/password_manager/password_manager_infobar_delegate_android.h
@@ -7,7 +7,6 @@ #include "base/macros.h" #include "components/infobars/core/confirm_infobar_delegate.h" -#include "ui/gfx/range/range.h" // Base class for some of the password manager infobar delegates, e.g. // SavePasswordInfoBarDelegate. @@ -15,8 +14,6 @@ public: ~PasswordManagerInfoBarDelegate() override; - const gfx::Range& message_link_range() const { return message_link_range_; } - // Getter for the message displayed in adition to the title. If no message // was set, this returns and empty string. base::string16 GetDetailsMessageText() const; @@ -33,7 +30,6 @@ PasswordManagerInfoBarDelegate(); void SetMessage(const base::string16& message); - void SetMessageLinkRange(const gfx::Range& message_link_range); void SetDetailsMessage(const base::string16& details_message); private: @@ -41,10 +37,6 @@ // users. base::string16 message_; - // If set, describes the location of the link to the help center article for - // Smart Lock. - gfx::Range message_link_range_; - // Used to display aditional information about where the passwords were saved. base::string16 details_message_;
diff --git a/chrome/browser/password_manager/touch_to_fill_controller.cc b/chrome/browser/password_manager/touch_to_fill_controller.cc index 84e77b4..1be8f39 100644 --- a/chrome/browser/password_manager/touch_to_fill_controller.cc +++ b/chrome/browser/password_manager/touch_to_fill_controller.cc
@@ -63,7 +63,8 @@ /*is_selectable=*/false); } - mf_controller_->ShowTouchToFillSheet(std::move(builder).Build()); + GetManualFillingController()->ShowTouchToFillSheet( + std::move(builder).Build()); } void TouchToFillController::OnFillingTriggered( @@ -79,9 +80,7 @@ } TouchToFillController::TouchToFillController(WebContents* web_contents) - : mf_controller_(ManualFillingController::GetOrCreate(web_contents)) { - DCHECK(mf_controller_); -} + : web_contents_(web_contents) {} TouchToFillController::TouchToFillController( base::WeakPtr<ManualFillingController> mf_controller) @@ -89,4 +88,11 @@ DCHECK(mf_controller_); } +ManualFillingController* TouchToFillController::GetManualFillingController() { + if (!mf_controller_) + mf_controller_ = ManualFillingController::GetOrCreate(web_contents_); + DCHECK(mf_controller_); + return mf_controller_.get(); +} + WEB_CONTENTS_USER_DATA_KEY_IMPL(TouchToFillController)
diff --git a/chrome/browser/password_manager/touch_to_fill_controller.h b/chrome/browser/password_manager/touch_to_fill_controller.h index 75670db..66c4c6f6 100644 --- a/chrome/browser/password_manager/touch_to_fill_controller.h +++ b/chrome/browser/password_manager/touch_to_fill_controller.h
@@ -61,6 +61,15 @@ explicit TouchToFillController( base::WeakPtr<ManualFillingController> mf_controller); + // Lazy-initializes and returns the ManualFillingController for the current + // |web_contents_|. The lazy initialization is required to break a circular + // dependency between the constructors of the TouchToFillController and + // ManualFillingController. + ManualFillingController* GetManualFillingController(); + + // The tab for which this class is scoped. + content::WebContents* web_contents_ = nullptr; + // The manual filling controller object to forward client requests to. base::WeakPtr<ManualFillingController> mf_controller_;
diff --git a/chrome/browser/password_manager/update_password_infobar_delegate_android.cc b/chrome/browser/password_manager/update_password_infobar_delegate_android.cc index 95ef3c3..0491e646 100644 --- a/chrome/browser/password_manager/update_password_infobar_delegate_android.cc +++ b/chrome/browser/password_manager/update_password_infobar_delegate_android.cc
@@ -17,6 +17,7 @@ #include "components/infobars/core/infobar.h" #include "components/password_manager/core/browser/password_bubble_experiment.h" #include "components/password_manager/core/browser/password_form_metrics_recorder.h" +#include "components/password_manager/core/browser/password_ui_utils.h" #include "components/strings/grit/components_strings.h" #include "components/sync/driver/sync_service.h" #include "content/public/browser/web_contents.h" @@ -51,11 +52,7 @@ } bool UpdatePasswordInfoBarDelegate::ShowMultipleAccounts() const { - const password_manager::PasswordFormManagerForUI* form_manager = - passwords_state_.form_manager(); - bool is_password_overriden = - form_manager && form_manager->IsPasswordOverridden(); - return GetCurrentForms().size() > 1 && !is_password_overriden; + return GetCurrentForms().size() > 1; } const std::vector<std::unique_ptr<autofill::PasswordForm>>& @@ -115,10 +112,11 @@ int form_index = update_password_infobar->GetIdOfSelectedUsername(); DCHECK_GE(form_index, 0); DCHECK_LT(static_cast<size_t>(form_index), GetCurrentForms().size()); - form_manager->Update(*GetCurrentForms()[form_index]); - } else { - form_manager->Update(form_manager->GetPendingCredentials()); + UpdatePasswordFormUsernameAndPassword( + GetCurrentForms()[form_index]->username_value, + form_manager->GetPendingCredentials().password_value, form_manager); } + form_manager->Save(); return true; }
diff --git a/chrome/browser/password_manager/update_password_infobar_delegate_android.h b/chrome/browser/password_manager/update_password_infobar_delegate_android.h index baa586ba..3faa579 100644 --- a/chrome/browser/password_manager/update_password_infobar_delegate_android.h +++ b/chrome/browser/password_manager/update_password_infobar_delegate_android.h
@@ -44,9 +44,8 @@ const std::vector<std::unique_ptr<autofill::PasswordForm>>& GetCurrentForms() const; - // Returns the username of the saved credentials in the case when there is - // only one credential pair stored. - base::string16 get_username_for_single_account() { + // Returns the username of the saved credentials to be updated by default. + const base::string16& get_default_username() const { return passwords_state_.form_manager() ->GetPendingCredentials() .username_value;
diff --git a/chrome/browser/policy/policy_conversions.cc b/chrome/browser/policy/policy_conversions.cc index 820830a..c852c12a 100644 --- a/chrome/browser/policy/policy_conversions.cc +++ b/chrome/browser/policy/policy_conversions.cc
@@ -53,6 +53,11 @@ namespace em = enterprise_management; namespace policy { + +// Fills |policy_dump| with device specific information if this device is +// enterprise managed. +void FillIdentityFields(Value* policy_dump); + namespace { // Maps known policy names to their schema. If a policy is not present, it is @@ -508,6 +513,9 @@ std::move(device_local_account_policies)); #endif // defined(OS_CHROMEOS) + if (with_device_data) + FillIdentityFields(&all_policies); + return all_policies; } @@ -571,9 +579,7 @@ Value all_policies = GetAllPolicyValuesAsDictionary( context, with_user_policies, false /* convert_values */, with_device_data, is_pretty_print); - if (with_device_data) { - FillIdentityFields(&all_policies); - } + return DictionaryToJSONString(all_policies, is_pretty_print); }
diff --git a/chrome/browser/prefs/browser_prefs.cc b/chrome/browser/prefs/browser_prefs.cc index 2d69e32..25d03118 100644 --- a/chrome/browser/prefs/browser_prefs.cc +++ b/chrome/browser/prefs/browser_prefs.cc
@@ -54,6 +54,7 @@ #include "chrome/browser/previews/previews_offline_helper.h" #include "chrome/browser/profiles/chrome_version_service.h" #include "chrome/browser/profiles/profile.h" +#include "chrome/browser/profiles/profile_attributes_entry.h" #include "chrome/browser/profiles/profile_impl.h" #include "chrome/browser/profiles/profile_info_cache.h" #include "chrome/browser/profiles/profiles_state.h" @@ -436,6 +437,11 @@ "ntp.content_suggestions.notifications.sent_count"; const char kNotificationIDWithinCategory[] = "ContentSuggestionsNotificationIDWithinCategory"; + +// Deprecated 5/2019. +const char kContentSuggestionsNotificationsEnabled[] = + "ntp.content_suggestions.notifications.enabled"; + #endif // defined(OS_ANDROID) #if !defined(OS_ANDROID) @@ -499,6 +505,7 @@ registry->RegisterIntegerPref(kContentSuggestionsNotificationsSentDay, 0); registry->RegisterIntegerPref(kContentSuggestionsNotificationsSentCount, 0); registry->RegisterStringPref(kNotificationIDWithinCategory, std::string()); + registry->RegisterBooleanPref(kContentSuggestionsNotificationsEnabled, true); #endif // defined(OS_ANDROID) #if !defined(OS_ANDROID) @@ -531,6 +538,7 @@ OriginTrialPrefs::RegisterPrefs(registry); password_manager::PasswordManager::RegisterLocalPrefs(registry); PrefProxyConfigTrackerImpl::RegisterPrefs(registry); + ProfileAttributesEntry::RegisterLocalStatePrefs(registry); ProfileInfoCache::RegisterPrefs(registry); profiles::RegisterPrefs(registry); rappor::RapporServiceImpl::RegisterPrefs(registry); @@ -1080,6 +1088,9 @@ profile_prefs->ClearPref(kContentSuggestionsNotificationsSentDay); profile_prefs->ClearPref(kContentSuggestionsNotificationsSentCount); profile_prefs->ClearPref(kNotificationIDWithinCategory); + + // Added 5/2019. + profile_prefs->ClearPref(kContentSuggestionsNotificationsEnabled); #endif // defined(OS_ANDROID) #if !defined(OS_ANDROID)
diff --git a/chrome/browser/previews/previews_content_util.cc b/chrome/browser/previews/previews_content_util.cc index 1decc641..ec184c7 100644 --- a/chrome/browser/previews/previews_content_util.cc +++ b/chrome/browser/previews/previews_content_util.cc
@@ -294,12 +294,6 @@ previews_state |= content::LITE_PAGE_REDIRECT_ON; } - if (previews::params::IsClientLoFiEnabled() && - previews_decider->ShouldAllowPreviewAtNavigationStart( - previews_data, url, is_reload, previews::PreviewsType::LOFI)) { - previews_state |= content::CLIENT_LOFI_ON; - } - return previews_state; } @@ -427,10 +421,6 @@ // commit to it. previews_state = previews_state & ~content::NOSCRIPT_ON; } - if (previews_state & content::CLIENT_LOFI_ON) { - LogCommittedPreview(previews_data, PreviewsType::LOFI); - return content::CLIENT_LOFI_ON; - } if (!previews_state) { return content::PREVIEWS_OFF; @@ -525,14 +515,10 @@ return previews::PreviewsType::LITE_PAGE_REDIRECT; if (previews_state & content::SERVER_LITE_PAGE_ON) return previews::PreviewsType::LITE_PAGE; - if (previews_state & content::SERVER_LOFI_ON) - return previews::PreviewsType::LOFI; if (previews_state & content::RESOURCE_LOADING_HINTS_ON) return previews::PreviewsType::RESOURCE_LOADING_HINTS; if (previews_state & content::NOSCRIPT_ON) return previews::PreviewsType::NOSCRIPT; - if (previews_state & content::CLIENT_LOFI_ON) - return previews::PreviewsType::LOFI; DCHECK_EQ(content::PREVIEWS_UNSPECIFIED, previews_state & ~content::CLIENT_LOFI_AUTO_RELOAD &
diff --git a/chrome/browser/previews/previews_content_util_unittest.cc b/chrome/browser/previews/previews_content_util_unittest.cc index b4b96de66..9577191 100644 --- a/chrome/browser/previews/previews_content_util_unittest.cc +++ b/chrome/browser/previews/previews_content_util_unittest.cc
@@ -92,8 +92,8 @@ switch (type) { case previews::PreviewsType::OFFLINE: return params::IsOfflinePreviewsEnabled(); - case previews::PreviewsType::LOFI: - return params::IsClientLoFiEnabled(); + case previews::PreviewsType::DEPRECATED_LOFI: + return false; case previews::PreviewsType::DEPRECATED_AMP_REDIRECTION: return false; case previews::PreviewsType::NOSCRIPT: @@ -135,7 +135,7 @@ DetermineAllowedClientPreviewsStatePreviewsDisabled) { base::test::ScopedFeatureList scoped_feature_list; scoped_feature_list.InitFromCommandLine( - "ClientLoFi,ResourceLoadingHints,NoScriptPreviews" /* enable_features */, + "ResourceLoadingHints,NoScriptPreviews" /* enable_features */, "Previews" /* disable_features */); PreviewsUserData user_data(1); bool is_reload = false; @@ -157,14 +157,14 @@ DetermineAllowedClientPreviewsStateDataSaverDisabled) { base::test::ScopedFeatureList scoped_feature_list; scoped_feature_list.InitFromCommandLine( - "Previews,ClientLoFi,ResourceLoadingHints,NoScriptPreviews", + "Previews,ResourceLoadingHints,NoScriptPreviews", {} /* disable_features */); PreviewsUserData user_data(1); bool is_reload = false; bool previews_triggering_logic_already_ran = false; bool is_data_saver_user = true; - EXPECT_EQ(content::OFFLINE_PAGE_ON | content::CLIENT_LOFI_ON | - content::RESOURCE_LOADING_HINTS_ON | content::NOSCRIPT_ON, + EXPECT_EQ(content::OFFLINE_PAGE_ON | content::RESOURCE_LOADING_HINTS_ON | + content::NOSCRIPT_ON, previews::CallDetermineAllowedClientPreviewsState( &user_data, GURL("http://www.google.com"), is_reload, previews_triggering_logic_already_ran, is_data_saver_user, @@ -181,7 +181,7 @@ DetermineAllowedClientPreviewsStateOfflineAndRedirects) { base::test::ScopedFeatureList scoped_feature_list; scoped_feature_list.InitFromCommandLine( - "Previews", "ClientLoFi,ResourceLoadingHints,NoScriptPreviews"); + "Previews", "ResourceLoadingHints,NoScriptPreviews"); PreviewsUserData user_data(1); bool is_reload = false; bool previews_triggering_logic_already_ran = false; @@ -218,25 +218,6 @@ enabled_previews_decider(), nullptr)); } -TEST_F(PreviewsContentUtilTest, DetermineAllowedClientPreviewsStateClientLoFi) { - base::test::ScopedFeatureList scoped_feature_list; - scoped_feature_list.InitFromCommandLine("Previews,ClientLoFi", std::string()); - PreviewsUserData user_data(1); - bool is_reload = false; - bool previews_triggering_logic_already_ran = false; - bool is_data_saver_user = true; - EXPECT_TRUE(content::CLIENT_LOFI_ON & - previews::CallDetermineAllowedClientPreviewsState( - &user_data, GURL("https://www.google.com"), is_reload, - previews_triggering_logic_already_ran, is_data_saver_user, - enabled_previews_decider(), nullptr)); - EXPECT_TRUE(content::CLIENT_LOFI_ON & - previews::CallDetermineAllowedClientPreviewsState( - &user_data, GURL("http://www.google.com"), is_reload, - previews_triggering_logic_already_ran, is_data_saver_user, - enabled_previews_decider(), nullptr)); -} - TEST_F(PreviewsContentUtilTest, DetermineAllowedClientPreviewsStateResourceLoadingHints) { base::test::ScopedFeatureList scoped_feature_list; @@ -261,37 +242,6 @@ } TEST_F(PreviewsContentUtilTest, - DetermineAllowedClientPreviewsStateNoScriptAndClientLoFi) { - // Enable both Client LoFi and NoScript. - base::test::ScopedFeatureList scoped_feature_list; - scoped_feature_list.InitFromCommandLine( - "Previews,ClientLoFi,NoScriptPreviews", std::string()); - - PreviewsUserData user_data(1); - bool is_reload = false; - bool previews_triggering_logic_already_ran = false; - bool is_data_saver_user = true; - // Verify both are enabled. - EXPECT_TRUE((content::NOSCRIPT_ON | content::CLIENT_LOFI_ON) & - previews::CallDetermineAllowedClientPreviewsState( - &user_data, GURL("https://www.google.com"), is_reload, - previews_triggering_logic_already_ran, is_data_saver_user, - enabled_previews_decider(), nullptr)); - EXPECT_TRUE((content::NOSCRIPT_ON | content::CLIENT_LOFI_ON) & - previews::CallDetermineAllowedClientPreviewsState( - &user_data, GURL("http://www.google.com"), is_reload, - previews_triggering_logic_already_ran, is_data_saver_user, - enabled_previews_decider(), nullptr)); - - // Verify non-HTTP[S] URL has no previews enabled. - EXPECT_EQ(content::PREVIEWS_UNSPECIFIED, - previews::CallDetermineAllowedClientPreviewsState( - &user_data, GURL("data://someblob"), is_reload, - previews_triggering_logic_already_ran, is_data_saver_user, - enabled_previews_decider(), nullptr)); -} - -TEST_F(PreviewsContentUtilTest, DetermineAllowedClientPreviewsStateLitePageRedirect) { base::test::ScopedFeatureList scoped_feature_list; scoped_feature_list.InitFromCommandLine("Previews,LitePageServerPreviews", @@ -372,19 +322,16 @@ TEST_F(PreviewsContentUtilTest, DetermineCommittedClientPreviewsState) { base::test::ScopedFeatureList scoped_feature_list; scoped_feature_list.InitFromCommandLine( - "Previews,ClientLoFi,NoScriptPreviews,ResourceLoadingHints", - std::string()); + "Previews,NoScriptPreviews,ResourceLoadingHints", std::string()); PreviewsUserData user_data(1); user_data.set_navigation_ect(net::EFFECTIVE_CONNECTION_TYPE_2G); base::HistogramTester histogram_tester; // Server bits take precedence over NoScript: - EXPECT_EQ(content::SERVER_LITE_PAGE_ON | content::SERVER_LOFI_ON | - content::CLIENT_LOFI_ON, + EXPECT_EQ(content::SERVER_LITE_PAGE_ON, previews::DetermineCommittedClientPreviewsState( &user_data, GURL("https://www.google.com"), - content::SERVER_LITE_PAGE_ON | content::SERVER_LOFI_ON | - content::CLIENT_LOFI_ON | content::NOSCRIPT_ON, + content::SERVER_LITE_PAGE_ON | content::NOSCRIPT_ON, enabled_previews_decider(), nullptr)); histogram_tester.ExpectUniqueSample( "Previews.Triggered.EffectiveConnectionType2.LitePage", @@ -393,12 +340,11 @@ "Previews.Triggered.EffectiveConnectionType2", 1); content::PreviewsState lite_page_redirect_enabled = - content::CLIENT_LOFI_ON | content::NOSCRIPT_ON | - content::RESOURCE_LOADING_HINTS_ON | content::LITE_PAGE_REDIRECT_ON; + content::NOSCRIPT_ON | content::RESOURCE_LOADING_HINTS_ON | + content::LITE_PAGE_REDIRECT_ON; - // LITE_PAGE_REDIRECT takes precedence over NoScript, Resource Loading Hints, - // and Client LoFi when the committed URL is for the lite page previews - // server. + // LITE_PAGE_REDIRECT takes precedence over NoScript, and Resource Loading + // Hints, when the committed URL is for the lite page previews server. EXPECT_EQ( content::LITE_PAGE_REDIRECT_ON, previews::DetermineCommittedClientPreviewsState( @@ -422,57 +368,20 @@ histogram_tester.ExpectTotalCount( "Previews.Triggered.EffectiveConnectionType2", 3); - // NoScript has precedence over Client LoFi - kept for committed HTTPS: - EXPECT_EQ(content::NOSCRIPT_ON, - previews::DetermineCommittedClientPreviewsState( - &user_data, GURL("https://www.google.com"), - content::CLIENT_LOFI_ON | content::NOSCRIPT_ON, - enabled_previews_decider(), nullptr)); - histogram_tester.ExpectUniqueSample( - "Previews.Triggered.EffectiveConnectionType2.NoScript", - static_cast<int>(net::EFFECTIVE_CONNECTION_TYPE_2G), 1); - histogram_tester.ExpectTotalCount( - "Previews.Triggered.EffectiveConnectionType2", 4); - // Try different navigation ECT value. user_data.set_navigation_ect(net::EFFECTIVE_CONNECTION_TYPE_SLOW_2G); - // RESOURCE_LOADING_HINTS has precedence over Client LoFi and NoScript. + // RESOURCE_LOADING_HINTS has precedence over NoScript. EXPECT_EQ(content::RESOURCE_LOADING_HINTS_ON, previews::DetermineCommittedClientPreviewsState( &user_data, GURL("https://www.google.com"), - content::CLIENT_LOFI_ON | content::NOSCRIPT_ON | - content::RESOURCE_LOADING_HINTS_ON, + content::NOSCRIPT_ON | content::RESOURCE_LOADING_HINTS_ON, enabled_previews_decider(), nullptr)); histogram_tester.ExpectBucketCount( "Previews.Triggered.EffectiveConnectionType2.ResourceLoadingHints", static_cast<int>(net::EFFECTIVE_CONNECTION_TYPE_SLOW_2G), 1); histogram_tester.ExpectTotalCount( - "Previews.Triggered.EffectiveConnectionType2", 5); - - // NoScript has precedence over Client LoFi - except for committed HTTP: - EXPECT_EQ(content::CLIENT_LOFI_ON, - previews::DetermineCommittedClientPreviewsState( - &user_data, GURL("http://www.google.com"), - content::CLIENT_LOFI_ON | content::NOSCRIPT_ON | - content::RESOURCE_LOADING_HINTS_ON, - enabled_previews_decider(), nullptr)); - histogram_tester.ExpectUniqueSample( - "Previews.Triggered.EffectiveConnectionType2.LoFi", - static_cast<int>(net::EFFECTIVE_CONNECTION_TYPE_SLOW_2G), 1); - histogram_tester.ExpectTotalCount( - "Previews.Triggered.EffectiveConnectionType2", 6); - - // Only Client LoFi: - EXPECT_EQ(content::CLIENT_LOFI_ON, - previews::DetermineCommittedClientPreviewsState( - &user_data, GURL("https://www.google.com"), - content::CLIENT_LOFI_ON, enabled_previews_decider(), nullptr)); - histogram_tester.ExpectUniqueSample( - "Previews.Triggered.EffectiveConnectionType2.LoFi", - static_cast<int>(net::EFFECTIVE_CONNECTION_TYPE_SLOW_2G), 2); - histogram_tester.ExpectTotalCount( - "Previews.Triggered.EffectiveConnectionType2", 7); + "Previews.Triggered.EffectiveConnectionType2", 4); // Only NoScript: EXPECT_EQ(content::NOSCRIPT_ON, @@ -487,18 +396,16 @@ scoped_feature_list.InitFromCommandLine("Previews,ClientLoFi", "NoScriptPreviews"); PreviewsUserData user_data(1); - // NoScript not allowed at commit time so Client LoFi chosen: - EXPECT_EQ(content::CLIENT_LOFI_ON, + // NoScript not allowed at commit time so no previews chosen: + EXPECT_EQ(content::PREVIEWS_OFF, previews::DetermineCommittedClientPreviewsState( &user_data, GURL("https://www.google.com"), - content::CLIENT_LOFI_ON | content::NOSCRIPT_ON, - enabled_previews_decider(), nullptr)); + content::NOSCRIPT_ON, enabled_previews_decider(), nullptr)); } TEST_F(PreviewsContentUtilTest, DetermineCommittedServerPreviewsStateLitePage) { content::PreviewsState enabled_previews = - content::SERVER_LITE_PAGE_ON | content::SERVER_LOFI_ON | - content::CLIENT_LOFI_ON | content::NOSCRIPT_ON; + content::SERVER_LITE_PAGE_ON | content::NOSCRIPT_ON; // Add DataReductionProxyData for LitePage to URLRequest. data_reduction_proxy::DataReductionProxyData data_reduction_proxy_data; @@ -512,31 +419,12 @@ enabled_previews)); } -TEST_F(PreviewsContentUtilTest, DetermineCommittedServerPreviewsStateLoFi) { - content::PreviewsState enabled_previews = - content::SERVER_LITE_PAGE_ON | content::SERVER_LOFI_ON | - content::CLIENT_LOFI_ON | content::NOSCRIPT_ON; - - // Add DataReductionProxyData for LitePage to URLRequest. - data_reduction_proxy::DataReductionProxyData data_reduction_proxy_data; - data_reduction_proxy_data.set_used_data_reduction_proxy(true); - data_reduction_proxy_data.set_lite_page_received(false); - data_reduction_proxy_data.set_lofi_policy_received(true); - - // Verify keeps LoFi bits and also doesn't touch client-only NoScript bit. - EXPECT_EQ( - content::SERVER_LOFI_ON | content::CLIENT_LOFI_ON | content::NOSCRIPT_ON, - DetermineCommittedServerPreviewsState(&data_reduction_proxy_data, - enabled_previews)); -} - TEST_F(PreviewsContentUtilTest, DetermineCommittedServerPreviewsStateNoProxy) { content::PreviewsState enabled_previews = - content::SERVER_LITE_PAGE_ON | content::SERVER_LOFI_ON | - content::CLIENT_LOFI_ON | content::NOSCRIPT_ON; + content::SERVER_LITE_PAGE_ON | content::NOSCRIPT_ON; - // Verify keeps LoFi bits and also doesn't touch client-only NoScript bit. - EXPECT_EQ(content::CLIENT_LOFI_ON | content::NOSCRIPT_ON, + // Verify doesn't touch client-only NoScript bit. + EXPECT_EQ(content::NOSCRIPT_ON, DetermineCommittedServerPreviewsState(nullptr, enabled_previews)); } @@ -544,15 +432,11 @@ // Simple cases: EXPECT_EQ(previews::PreviewsType::LITE_PAGE, previews::GetMainFramePreviewsType(content::SERVER_LITE_PAGE_ON)); - EXPECT_EQ(previews::PreviewsType::LOFI, - previews::GetMainFramePreviewsType(content::SERVER_LOFI_ON)); EXPECT_EQ(previews::PreviewsType::NOSCRIPT, previews::GetMainFramePreviewsType(content::NOSCRIPT_ON)); EXPECT_EQ( previews::PreviewsType::RESOURCE_LOADING_HINTS, previews::GetMainFramePreviewsType(content::RESOURCE_LOADING_HINTS_ON)); - EXPECT_EQ(previews::PreviewsType::LOFI, - previews::GetMainFramePreviewsType(content::CLIENT_LOFI_ON)); EXPECT_EQ(previews::PreviewsType::LITE_PAGE_REDIRECT, previews::GetMainFramePreviewsType(content::LITE_PAGE_REDIRECT_ON)); @@ -565,27 +449,19 @@ // Precedence cases when server preview is available: EXPECT_EQ(previews::PreviewsType::LITE_PAGE, previews::GetMainFramePreviewsType( - content::SERVER_LITE_PAGE_ON | content::SERVER_LOFI_ON | - content::NOSCRIPT_ON | content::CLIENT_LOFI_ON | + content::SERVER_LITE_PAGE_ON | content::NOSCRIPT_ON | content::RESOURCE_LOADING_HINTS_ON)); - EXPECT_EQ(previews::PreviewsType::LOFI, - previews::GetMainFramePreviewsType( - content::SERVER_LOFI_ON | content::NOSCRIPT_ON | - content::CLIENT_LOFI_ON | content::RESOURCE_LOADING_HINTS_ON)); // Precedence cases when server preview is not available: EXPECT_EQ(previews::PreviewsType::NOSCRIPT, - previews::GetMainFramePreviewsType(content::NOSCRIPT_ON | - content::CLIENT_LOFI_ON)); + previews::GetMainFramePreviewsType(content::NOSCRIPT_ON)); EXPECT_EQ(previews::PreviewsType::RESOURCE_LOADING_HINTS, previews::GetMainFramePreviewsType( - content::NOSCRIPT_ON | content::CLIENT_LOFI_ON | - content::RESOURCE_LOADING_HINTS_ON)); - EXPECT_EQ( - previews::PreviewsType::LITE_PAGE_REDIRECT, - previews::GetMainFramePreviewsType( - content::NOSCRIPT_ON | content::CLIENT_LOFI_ON | - content::RESOURCE_LOADING_HINTS_ON | content::LITE_PAGE_REDIRECT_ON)); + content::NOSCRIPT_ON | content::RESOURCE_LOADING_HINTS_ON)); + EXPECT_EQ(previews::PreviewsType::LITE_PAGE_REDIRECT, + previews::GetMainFramePreviewsType( + content::NOSCRIPT_ON | content::RESOURCE_LOADING_HINTS_ON | + content::LITE_PAGE_REDIRECT_ON)); } class PreviewsContentSimulatedNavigationTest @@ -652,16 +528,16 @@ .enable_feature = false, .set_random_coin_flip_for_navigation = true, .want_coin_flip_result = previews::CoinFlipHoldbackResult::kNotSet, - .initial_state = content::CLIENT_LOFI_ON, - .want_returned = content::CLIENT_LOFI_ON, + .initial_state = content::NOSCRIPT_ON, + .want_returned = content::NOSCRIPT_ON, }, { .msg = "Feature disabled, no affect, tails", .enable_feature = false, .set_random_coin_flip_for_navigation = false, .want_coin_flip_result = previews::CoinFlipHoldbackResult::kNotSet, - .initial_state = content::CLIENT_LOFI_ON, - .want_returned = content::CLIENT_LOFI_ON, + .initial_state = content::NOSCRIPT_ON, + .want_returned = content::NOSCRIPT_ON, }, { .msg = "After-commit decided previews are not affected before commit " @@ -669,8 +545,8 @@ .enable_feature = true, .set_random_coin_flip_for_navigation = true, .want_coin_flip_result = previews::CoinFlipHoldbackResult::kNotSet, - .initial_state = content::CLIENT_LOFI_ON, - .want_returned = content::CLIENT_LOFI_ON, + .initial_state = content::NOSCRIPT_ON, + .want_returned = content::NOSCRIPT_ON, }, { .msg = "After-commit decided previews are not affected before commit " @@ -678,8 +554,8 @@ .enable_feature = true, .set_random_coin_flip_for_navigation = false, .want_coin_flip_result = previews::CoinFlipHoldbackResult::kNotSet, - .initial_state = content::CLIENT_LOFI_ON, - .want_returned = content::CLIENT_LOFI_ON, + .initial_state = content::NOSCRIPT_ON, + .want_returned = content::NOSCRIPT_ON, }, { .msg = @@ -705,7 +581,7 @@ .enable_feature = true, .set_random_coin_flip_for_navigation = true, .want_coin_flip_result = previews::CoinFlipHoldbackResult::kHoldback, - .initial_state = content::OFFLINE_PAGE_ON | content::CLIENT_LOFI_ON, + .initial_state = content::OFFLINE_PAGE_ON | content::NOSCRIPT_ON, .want_returned = content::PREVIEWS_OFF, }, { @@ -714,8 +590,8 @@ .enable_feature = true, .set_random_coin_flip_for_navigation = false, .want_coin_flip_result = previews::CoinFlipHoldbackResult::kAllowed, - .initial_state = content::OFFLINE_PAGE_ON | content::CLIENT_LOFI_ON, - .want_returned = content::OFFLINE_PAGE_ON | content::CLIENT_LOFI_ON, + .initial_state = content::OFFLINE_PAGE_ON | content::NOSCRIPT_ON, + .want_returned = content::OFFLINE_PAGE_ON | content::NOSCRIPT_ON, }, }; @@ -765,23 +641,23 @@ .enable_feature = false, .set_random_coin_flip_for_navigation = true, .want_coin_flip_result = previews::CoinFlipHoldbackResult::kNotSet, - .initial_state = content::CLIENT_LOFI_ON, - .want_returned = content::CLIENT_LOFI_ON, + .initial_state = content::NOSCRIPT_ON, + .want_returned = content::NOSCRIPT_ON, }, { .msg = "Feature disabled, no affect, tails", .enable_feature = false, .set_random_coin_flip_for_navigation = false, .want_coin_flip_result = previews::CoinFlipHoldbackResult::kNotSet, - .initial_state = content::CLIENT_LOFI_ON, - .want_returned = content::CLIENT_LOFI_ON, + .initial_state = content::NOSCRIPT_ON, + .want_returned = content::NOSCRIPT_ON, }, { .msg = "Holdback enabled previews", .enable_feature = true, .set_random_coin_flip_for_navigation = true, .want_coin_flip_result = previews::CoinFlipHoldbackResult::kHoldback, - .initial_state = content::CLIENT_LOFI_ON, + .initial_state = content::NOSCRIPT_ON, .want_returned = content::PREVIEWS_OFF, }, { @@ -789,8 +665,8 @@ .enable_feature = true, .set_random_coin_flip_for_navigation = false, .want_coin_flip_result = previews::CoinFlipHoldbackResult::kAllowed, - .initial_state = content::CLIENT_LOFI_ON, - .want_returned = content::CLIENT_LOFI_ON, + .initial_state = content::NOSCRIPT_ON, + .want_returned = content::NOSCRIPT_ON, }, };
diff --git a/chrome/browser/previews/previews_service.cc b/chrome/browser/previews/previews_service.cc index 20eaecd..eaaf621d 100644 --- a/chrome/browser/previews/previews_service.cc +++ b/chrome/browser/previews/previews_service.cc
@@ -38,8 +38,8 @@ switch (type) { case previews::PreviewsType::OFFLINE: return previews::params::IsOfflinePreviewsEnabled(); - case previews::PreviewsType::LOFI: - return server_previews_enabled || previews::params::IsClientLoFiEnabled(); + case previews::PreviewsType::DEPRECATED_LOFI: + return false; case previews::PreviewsType::LITE_PAGE_REDIRECT: return previews::params::IsLitePageServerPreviewsEnabled(); case previews::PreviewsType::LITE_PAGE: @@ -69,8 +69,6 @@ switch (type) { case previews::PreviewsType::OFFLINE: return previews::params::OfflinePreviewsVersion(); - case previews::PreviewsType::LOFI: - return previews::params::ClientLoFiVersion(); case previews::PreviewsType::LITE_PAGE: return data_reduction_proxy::params::LitePageVersion(); case previews::PreviewsType::LITE_PAGE_REDIRECT: @@ -85,6 +83,7 @@ case previews::PreviewsType::UNSPECIFIED: case previews::PreviewsType::LAST: case previews::PreviewsType::DEPRECATED_AMP_REDIRECTION: + case previews::PreviewsType::DEPRECATED_LOFI: break; } NOTREACHED();
diff --git a/chrome/browser/previews/previews_service_unittest.cc b/chrome/browser/previews/previews_service_unittest.cc index 750e901..9803feb 100644 --- a/chrome/browser/previews/previews_service_unittest.cc +++ b/chrome/browser/previews/previews_service_unittest.cc
@@ -53,50 +53,6 @@ allowed_types_and_versions.end()); } -TEST_F(PreviewsServiceTest, TestClientLoFiFeatureEnabled) { - base::test::ScopedFeatureList scoped_feature_list; - scoped_feature_list.InitWithFeatures( - {previews::features::kPreviews, - previews::features::kClientLoFi} /* enabled features */, - {data_reduction_proxy::features:: - kDataReductionProxyDecidesTransform} /* disabled features */); - - blacklist::BlacklistData::AllowedTypesAndVersions allowed_types_and_versions = - PreviewsService::GetAllowedPreviews(); - EXPECT_NE(allowed_types_and_versions.find( - static_cast<int>(previews::PreviewsType::LOFI)), - allowed_types_and_versions.end()); -} - -TEST_F(PreviewsServiceTest, TestClientLoFiAndServerLoFiEnabled) { - base::test::ScopedFeatureList scoped_feature_list; - scoped_feature_list.InitWithFeatures( - {previews::features::kPreviews, previews::features::kClientLoFi, - data_reduction_proxy::features:: - kDataReductionProxyDecidesTransform} /* enabled features */, - {} /* disabled features */); - - blacklist::BlacklistData::AllowedTypesAndVersions allowed_types_and_versions = - PreviewsService::GetAllowedPreviews(); - EXPECT_NE(allowed_types_and_versions.find( - static_cast<int>(previews::PreviewsType::LOFI)), - allowed_types_and_versions.end()); -} - -TEST_F(PreviewsServiceTest, TestClientLoFiAndServerLoFiNotEnabled) { - base::test::ScopedFeatureList scoped_feature_list; - scoped_feature_list.InitWithFeatures( - {previews::features::kPreviews} /* enabled features */, - {previews::features::kClientLoFi, - data_reduction_proxy::features:: - kDataReductionProxyDecidesTransform} /* disabled features */); - blacklist::BlacklistData::AllowedTypesAndVersions allowed_types_and_versions = - PreviewsService::GetAllowedPreviews(); - EXPECT_EQ(allowed_types_and_versions.find( - static_cast<int>(previews::PreviewsType::LOFI)), - allowed_types_and_versions.end()); -} - TEST_F(PreviewsServiceTest, TestLitePageNotEnabled) { base::test::ScopedFeatureList scoped_feature_list; scoped_feature_list.InitWithFeatures( @@ -110,19 +66,6 @@ allowed_types_and_versions.end()); } -TEST_F(PreviewsServiceTest, TestServerLoFiProxyDecidesTransform) { - base::test::ScopedFeatureList scoped_feature_list; - scoped_feature_list.InitWithFeatures( - {previews::features::kPreviews, - data_reduction_proxy::features::kDataReductionProxyDecidesTransform}, - {}); - blacklist::BlacklistData::AllowedTypesAndVersions allowed_types_and_versions = - PreviewsService::GetAllowedPreviews(); - EXPECT_NE(allowed_types_and_versions.find( - static_cast<int>(previews::PreviewsType::LOFI)), - allowed_types_and_versions.end()); -} - TEST_F(PreviewsServiceTest, TestLitePageProxyDecidesTransform) { base::test::ScopedFeatureList scoped_feature_list; scoped_feature_list.InitWithFeatures(
diff --git a/chrome/browser/previews/previews_ui_tab_helper.cc b/chrome/browser/previews/previews_ui_tab_helper.cc index d62ec8e5..cbb4d75c 100644 --- a/chrome/browser/previews/previews_ui_tab_helper.cc +++ b/chrome/browser/previews/previews_ui_tab_helper.cc
@@ -210,13 +210,11 @@ web_contents()->GetController().Reload( content::ReloadType::ORIGINAL_REQUEST_URL, true); break; - case previews::PreviewsType::LOFI: - web_contents()->ReloadLoFiImages(); - break; case previews::PreviewsType::NONE: case previews::PreviewsType::UNSPECIFIED: case previews::PreviewsType::LAST: case previews::PreviewsType::DEPRECATED_AMP_REDIRECTION: + case previews::PreviewsType::DEPRECATED_LOFI: NOTREACHED(); break; }
diff --git a/chrome/browser/previews/previews_ui_tab_helper_unittest.cc b/chrome/browser/previews/previews_ui_tab_helper_unittest.cc index 17b808b..06b2a88 100644 --- a/chrome/browser/previews/previews_ui_tab_helper_unittest.cc +++ b/chrome/browser/previews/previews_ui_tab_helper_unittest.cc
@@ -188,32 +188,6 @@ EXPECT_FALSE(ui_tab_helper->displayed_preview_ui()); } -TEST_F(PreviewsUITabHelperUnitTest, - DidFinishNavigationDoesCreateLoFiPreviewsUI) { - PreviewsUITabHelper* ui_tab_helper = - PreviewsUITabHelper::FromWebContents(web_contents()); - EXPECT_FALSE(ui_tab_helper->displayed_preview_ui()); - - SetCommittedPreviewsType(previews::PreviewsType::LOFI); - SimulateWillProcessResponse(); - CallDidFinishNavigation(); - base::RunLoop().RunUntilIdle(); - -#if defined(OS_ANDROID) - EXPECT_TRUE(ui_tab_helper->should_display_android_omnibox_badge()); -#endif - EXPECT_TRUE(ui_tab_helper->displayed_preview_ui()); - - // Navigate to reset the displayed state. - content::WebContentsTester::For(web_contents()) - ->NavigateAndCommit(GURL(kTestUrl)); - -#if defined(OS_ANDROID) - EXPECT_FALSE(ui_tab_helper->should_display_android_omnibox_badge()); -#endif - EXPECT_FALSE(ui_tab_helper->displayed_preview_ui()); -} - TEST_F(PreviewsUITabHelperUnitTest, TestPreviewsIDSet) { PreviewsUITabHelper* ui_tab_helper = PreviewsUITabHelper::FromWebContents(web_contents());
diff --git a/chrome/browser/profiles/chrome_browser_main_extra_parts_profiles.cc b/chrome/browser/profiles/chrome_browser_main_extra_parts_profiles.cc index 682fea5..546fbac 100644 --- a/chrome/browser/profiles/chrome_browser_main_extra_parts_profiles.cc +++ b/chrome/browser/profiles/chrome_browser_main_extra_parts_profiles.cc
@@ -23,7 +23,6 @@ #include "chrome/browser/content_settings/cookie_settings_factory.h" #include "chrome/browser/content_settings/host_content_settings_map_factory.h" #include "chrome/browser/custom_handlers/protocol_handler_registry_factory.h" -#include "chrome/browser/data_use_measurement/chrome_data_use_ascriber_service_factory.h" #include "chrome/browser/dom_distiller/dom_distiller_service_factory.h" #include "chrome/browser/domain_reliability/service_factory.h" #include "chrome/browser/download/download_core_service_factory.h" @@ -252,7 +251,6 @@ ContentSuggestionsServiceFactory::GetInstance(); CookieSettingsFactory::GetInstance(); NotifierStateTrackerFactory::GetInstance(); - data_use_measurement::ChromeDataUseAscriberServiceFactory::GetInstance(); dom_distiller::DomDistillerServiceFactory::GetInstance(); DownloadCoreServiceFactory::GetInstance(); DownloadServiceFactory::GetInstance();
diff --git a/chrome/browser/profiles/profile_activity_metrics_recorder.cc b/chrome/browser/profiles/profile_activity_metrics_recorder.cc new file mode 100644 index 0000000..53d27e8 --- /dev/null +++ b/chrome/browser/profiles/profile_activity_metrics_recorder.cc
@@ -0,0 +1,61 @@ +// 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 "chrome/browser/profiles/profile_activity_metrics_recorder.h" + +#include "base/logging.h" +#include "base/metrics/histogram_macros.h" +#include "base/no_destructor.h" +#include "chrome/browser/browser_process.h" +#include "chrome/browser/profiles/profile.h" +#include "chrome/browser/profiles/profile_attributes_entry.h" +#include "chrome/browser/profiles/profile_attributes_storage.h" +#include "chrome/browser/profiles/profile_manager.h" +#include "chrome/browser/ui/browser.h" +#include "chrome/browser/ui/browser_list.h" + +namespace { + +// The maximum number of profiles that are recorded. This means that all +// profiles with bucket index greater than |kMaxProfileBucket| won't be included +// in the metrics. +constexpr int kMaxProfileBucket = 100; + +int GetMetricsBucketIndex(Profile* profile) { + if (profile->IsGuestSession()) + return 0; + + ProfileAttributesEntry* entry; + if (!g_browser_process->profile_manager() + ->GetProfileAttributesStorage() + .GetProfileAttributesWithPath(profile->GetPath(), &entry)) { + // This can happen if the profile is deleted. + VLOG(1) << "Failed to read profile bucket index because attributes entry " + "doesn't exist."; + return -1; + } + return entry->GetMetricsBucketIndex(); +} + +} // namespace + +// static +void ProfileActivityMetricsRecorder::Initialize() { + static base::NoDestructor<ProfileActivityMetricsRecorder> + s_profile_activity_metrics_recorder; +} + +ProfileActivityMetricsRecorder::ProfileActivityMetricsRecorder() { + BrowserList::AddObserver(this); +} + +void ProfileActivityMetricsRecorder::OnBrowserSetLastActive(Browser* browser) { + int profile_bucket = + GetMetricsBucketIndex(browser->profile()->GetOriginalProfile()); + + if (0 <= profile_bucket && profile_bucket <= kMaxProfileBucket) { + UMA_HISTOGRAM_EXACT_LINEAR("Profile.BrowserActive.PerProfile", + profile_bucket, kMaxProfileBucket); + } +}
diff --git a/chrome/browser/profiles/profile_activity_metrics_recorder.h b/chrome/browser/profiles/profile_activity_metrics_recorder.h new file mode 100644 index 0000000..9de532e --- /dev/null +++ b/chrome/browser/profiles/profile_activity_metrics_recorder.h
@@ -0,0 +1,36 @@ +// 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 CHROME_BROWSER_PROFILES_PROFILE_ACTIVITY_METRICS_RECORDER_H_ +#define CHROME_BROWSER_PROFILES_PROFILE_ACTIVITY_METRICS_RECORDER_H_ + +#include <stddef.h> + +#include "base/macros.h" +#include "chrome/browser/ui/browser_list_observer.h" + +class Browser; + +namespace base { +template <typename T> +class NoDestructor; +} + +class ProfileActivityMetricsRecorder : public BrowserListObserver { + public: + // Initializes a |ProfileActivityMetricsRecorder| object and starts + // tracking/recording. + static void Initialize(); + + // BrowserListObserver overrides: + void OnBrowserSetLastActive(Browser* browser) override; + + private: + friend class base::NoDestructor<ProfileActivityMetricsRecorder>; + ProfileActivityMetricsRecorder(); + + DISALLOW_COPY_AND_ASSIGN(ProfileActivityMetricsRecorder); +}; + +#endif // CHROME_BROWSER_PROFILES_PROFILE_ACTIVITY_METRICS_RECORDER_H_
diff --git a/chrome/browser/profiles/profile_activity_metrics_recorder_unittest.cc b/chrome/browser/profiles/profile_activity_metrics_recorder_unittest.cc new file mode 100644 index 0000000..ecbcd7d --- /dev/null +++ b/chrome/browser/profiles/profile_activity_metrics_recorder_unittest.cc
@@ -0,0 +1,124 @@ +// 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 <string> +#include <vector> + +#include "base/test/metrics/histogram_tester.h" +#include "chrome/browser/profiles/profile_activity_metrics_recorder.h" +#include "chrome/browser/ui/browser.h" +#include "chrome/browser/ui/browser_list.h" +#include "chrome/test/base/scoped_testing_local_state.h" +#include "chrome/test/base/test_browser_window.h" +#include "chrome/test/base/testing_browser_process.h" +#include "chrome/test/base/testing_profile.h" +#include "chrome/test/base/testing_profile_manager.h" +#include "content/public/test/test_browser_thread_bundle.h" +#include "testing/gtest/include/gtest/gtest.h" + +class ProfileActivityMetricsRecorderTest : public testing::Test { + public: + ProfileActivityMetricsRecorderTest() + : profile_manager_(TestingBrowserProcess::GetGlobal()) {} + + void SetUp() override { + Test::SetUp(); + ASSERT_TRUE(profile_manager_.SetUp()); + + ProfileActivityMetricsRecorder::Initialize(); + } + + void ActivateBrowser(Profile* profile) { + Browser::CreateParams browser_params(profile, false); + TestBrowserWindow browser_window; + browser_params.window = &browser_window; + std::unique_ptr<Browser> browser(Browser::Create(browser_params)); + + BrowserList::SetLastActive(browser.get()); + } + + void ActivateIncognitoBrowser(Profile* profile) { + ActivateBrowser(profile->GetOffTheRecordProfile()); + } + + TestingProfileManager* profile_manager() { return &profile_manager_; } + base::HistogramTester* histograms() { return &histogram_tester_; } + + private: + content::TestBrowserThreadBundle thread_bundle_; + + TestingProfileManager profile_manager_; + base::HistogramTester histogram_tester_; + + DISALLOW_COPY_AND_ASSIGN(ProfileActivityMetricsRecorderTest); +}; + +TEST_F(ProfileActivityMetricsRecorderTest, GuestProfile) { + Profile* regular_profile = profile_manager()->CreateTestingProfile("p1"); + Profile* guest_profile = profile_manager()->CreateGuestProfile(); + histograms()->ExpectTotalCount("Profile.BrowserActive.PerProfile", 0); + + // Check whether the regular profile is counted in bucket 2. (Bucket 1 is + // reserved for the guest profile.) + ActivateBrowser(regular_profile); + histograms()->ExpectBucketCount("Profile.BrowserActive.PerProfile", + /*bucket=*/1, /*count=*/1); + + // Activate an incognito browser instance of the guest profile. + // Note: Creating a non-incognito guest browser instance is not possible. + ActivateIncognitoBrowser(guest_profile); + histograms()->ExpectBucketCount("Profile.BrowserActive.PerProfile", + /*bucket=*/0, /*count=*/1); + + histograms()->ExpectTotalCount("Profile.BrowserActive.PerProfile", 2); +} + +TEST_F(ProfileActivityMetricsRecorderTest, IncognitoProfile) { + Profile* regular_profile = profile_manager()->CreateTestingProfile("p1"); + histograms()->ExpectTotalCount("Profile.BrowserActive.PerProfile", 0); + + ActivateBrowser(regular_profile); + histograms()->ExpectBucketCount("Profile.BrowserActive.PerProfile", + /*bucket=*/1, /*count=*/1); + + ActivateIncognitoBrowser(regular_profile); + histograms()->ExpectBucketCount("Profile.BrowserActive.PerProfile", + /*bucket=*/1, /*count=*/2); + + histograms()->ExpectTotalCount("Profile.BrowserActive.PerProfile", 2); +} + +TEST_F(ProfileActivityMetricsRecorderTest, MultipleProfiles) { + Profile* profile1 = profile_manager()->CreateTestingProfile("p1"); + Profile* profile2 = profile_manager()->CreateTestingProfile("p2"); + histograms()->ExpectTotalCount("Profile.BrowserActive.PerProfile", 0); + + // The browser of profile 1 is activated for the first time. It is assigned + // bucket 1. + ActivateBrowser(profile1); + histograms()->ExpectBucketCount("Profile.BrowserActive.PerProfile", + /*bucket=*/1, /*count=*/1); + + // Profile creation doesn't influence the histogram. + Profile* profile3 = profile_manager()->CreateTestingProfile("p3"); + histograms()->ExpectTotalCount("Profile.BrowserActive.PerProfile", 1); + + ActivateBrowser(profile1); + histograms()->ExpectBucketCount("Profile.BrowserActive.PerProfile", + /*bucket=*/1, /*count=*/2); + + // The browser of profile 3 is activated for the first time. It is assigned + // bucket 2. + ActivateBrowser(profile3); + histograms()->ExpectBucketCount("Profile.BrowserActive.PerProfile", + /*bucket=*/2, /*count=*/1); + + // The browser of profile 2 is activated for the first time. It is assigned + // bucket 3. + ActivateBrowser(profile2); + histograms()->ExpectBucketCount("Profile.BrowserActive.PerProfile", + /*bucket=*/3, /*count=*/1); + + histograms()->ExpectTotalCount("Profile.BrowserActive.PerProfile", 4); +}
diff --git a/chrome/browser/profiles/profile_attributes_entry.cc b/chrome/browser/profiles/profile_attributes_entry.cc index 4b84cbc..7302e632 100644 --- a/chrome/browser/profiles/profile_attributes_entry.cc +++ b/chrome/browser/profiles/profile_attributes_entry.cc
@@ -6,11 +6,13 @@ #include "base/strings/utf_string_conversions.h" #include "build/build_config.h" +#include "chrome/browser/browser_process.h" #include "chrome/browser/profiles/profile_attributes_entry.h" #include "chrome/browser/profiles/profile_avatar_icon_util.h" #include "chrome/browser/profiles/profile_info_cache.h" #include "chrome/browser/signin/signin_util.h" #include "chrome/common/pref_names.h" +#include "components/prefs/pref_registry_simple.h" #include "components/prefs/pref_service.h" #include "components/prefs/scoped_user_pref_update.h" #include "ui/base/resource/resource_bundle.h" @@ -22,6 +24,22 @@ const char kAuthCredentialsKey[] = "local_auth_credentials"; const char kPasswordTokenKey[] = "gaia_password_token"; const char kIsAuthErrorKey[] = "is_auth_error"; +const char kMetricsBucketIndex[] = "metrics_bucket_index"; + +// Local state pref to keep track of the next available profile bucket. +const char kNextMetricsBucketIndex[] = "profile.metrics.next_bucket_index"; + +// Returns the next available metrics bucket index and increases the index +// counter. I.e. two consecutive calls will return two consecutive numbers. +int NextAvailableMetricsBucketIndex() { + PrefService* local_prefs = g_browser_process->local_state(); + int next_index = local_prefs->GetInteger(kNextMetricsBucketIndex); + DCHECK_GT(next_index, 0); + + local_prefs->SetInteger(kNextMetricsBucketIndex, next_index + 1); + + return next_index; +} } // namespace @@ -30,6 +48,14 @@ const char ProfileAttributesEntry::kProfileIsEphemeral[] = "is_ephemeral"; const char ProfileAttributesEntry::kUserNameKey[] = "user_name"; +// static +void ProfileAttributesEntry::RegisterLocalStatePrefs( + PrefRegistrySimple* registry) { + // Bucket 0 is reserved for the guest profile, so start new bucket indices + // at 1. + registry->RegisterIntegerPref(kNextMetricsBucketIndex, 1); +} + ProfileAttributesEntry::ProfileAttributesEntry() : profile_info_cache_(nullptr), prefs_(nullptr), @@ -212,6 +238,15 @@ return icon_index; } +size_t ProfileAttributesEntry::GetMetricsBucketIndex() { + int bucket_index = GetInteger(kMetricsBucketIndex); + if (bucket_index == -1) { + bucket_index = NextAvailableMetricsBucketIndex(); + SetInteger(kMetricsBucketIndex, bucket_index); + } + return bucket_index; +} + void ProfileAttributesEntry::SetName(const base::string16& name) { profile_info_cache_->SetNameOfProfileAtIndex(profile_index(), name); } @@ -401,6 +436,13 @@ return value && value->is_bool() && value->GetBool(); } +int ProfileAttributesEntry::GetInteger(const char* key) const { + const base::Value* value = GetValue(key); + if (!value || !value->is_int()) + return -1; + return value->GetInt(); +} + // Type checking. Only IsDouble is implemented because others do not have // callsites. bool ProfileAttributesEntry::IsDouble(const char* key) const { @@ -470,3 +512,18 @@ SetEntryData(std::move(new_data)); return true; } + +bool ProfileAttributesEntry::SetInteger(const char* key, int value) { + const base::Value* old_data = GetEntryData(); + if (old_data) { + const base::Value* old_value = old_data->FindKey(key); + if (old_value && old_value->is_int() && old_value->GetInt() == value) + return false; + } + + base::Value new_data = old_data ? GetEntryData()->Clone() + : base::Value(base::Value::Type::DICTIONARY); + new_data.SetKey(key, base::Value(value)); + SetEntryData(std::move(new_data)); + return true; +}
diff --git a/chrome/browser/profiles/profile_attributes_entry.h b/chrome/browser/profiles/profile_attributes_entry.h index 20ab69c..cf363985 100644 --- a/chrome/browser/profiles/profile_attributes_entry.h +++ b/chrome/browser/profiles/profile_attributes_entry.h
@@ -21,11 +21,14 @@ class Image; } +class PrefRegistrySimple; class PrefService; class ProfileInfoCache; class ProfileAttributesEntry { public: + static void RegisterLocalStatePrefs(PrefRegistrySimple* registry); + ProfileAttributesEntry(); virtual ~ProfileAttributesEntry() {} @@ -93,6 +96,10 @@ bool IsAuthError() const; // Returns the index of the default icon used by the profile. size_t GetAvatarIconIndex() const; + // Returns the metrics bucket this profile should be recorded in. + // Note: The bucket index is assigned once and remains the same all time. 0 is + // reserved for the guest profile. + size_t GetMetricsBucketIndex(); void SetName(const base::string16& name); void SetShortcutName(const base::string16& name); @@ -148,13 +155,14 @@ const base::Value* GetValue(const char* key) const; // Internal getters that return basic data types. If the key is not present, - // or if the data is in a wrong data type, return empty string, 0.0, or false - // depending on the target data type. We do not assume that the data type is - // correct because the local state file can be modified by a third party. + // or if the data is in a wrong data type, return empty string, 0.0, false or + // -1 depending on the target data type. We do not assume that the data type + // is correct because the local state file can be modified by a third party. std::string GetString(const char* key) const; base::string16 GetString16(const char* key) const; double GetDouble(const char* key) const; bool GetBool(const char* key) const; + int GetInteger(const char* key) const; // Type checking. Only IsDouble is implemented because others do not have // callsites. @@ -166,6 +174,7 @@ bool SetString16(const char* key, base::string16 value); bool SetDouble(const char* key, double value); bool SetBool(const char* key, bool value); + bool SetInteger(const char* key, int value); // These members are an implementation detail meant to smooth the migration // of the ProfileInfoCache to the ProfileAttributesStorage interface. They can
diff --git a/chrome/browser/profiles/profile_impl_io_data.cc b/chrome/browser/profiles/profile_impl_io_data.cc index c51cf04c0..4e66556 100644 --- a/chrome/browser/profiles/profile_impl_io_data.cc +++ b/chrome/browser/profiles/profile_impl_io_data.cc
@@ -30,7 +30,6 @@ #include "chrome/browser/data_reduction_proxy/data_reduction_proxy_chrome_io_data.h" #include "chrome/browser/data_reduction_proxy/data_reduction_proxy_chrome_settings.h" #include "chrome/browser/data_reduction_proxy/data_reduction_proxy_chrome_settings_factory.h" -#include "chrome/browser/data_use_measurement/chrome_data_use_ascriber.h" #include "chrome/browser/io_thread.h" #include "chrome/browser/net/chrome_network_delegate.h" #include "chrome/browser/net/profile_network_context_service.h"
diff --git a/chrome/browser/profiles/profile_io_data.cc b/chrome/browser/profiles/profile_io_data.cc index 0f31efb..5be1364 100644 --- a/chrome/browser/profiles/profile_io_data.cc +++ b/chrome/browser/profiles/profile_io_data.cc
@@ -391,8 +391,8 @@ scoped_refptr<base::SingleThreadTaskRunner> io_task_runner = base::CreateSingleThreadTaskRunnerWithTraits({BrowserThread::IO}); - // These members are used only for sign in, which is not enabled - // in incognito mode. So no need to initialize them. + // These members are used only for sign in, which is not enabled in incognito + // and guest modes. So no need to initialize them. if (!IsOffTheRecord()) { google_services_user_account_id_.Init(prefs::kGoogleServicesUserAccountId, pref_service);
diff --git a/chrome/browser/profiles/profile_manager.cc b/chrome/browser/profiles/profile_manager.cc index 4cce9ca9..aeabf03 100644 --- a/chrome/browser/profiles/profile_manager.cc +++ b/chrome/browser/profiles/profile_manager.cc
@@ -1093,17 +1093,18 @@ #endif // !defined(OS_ANDROID) } -void ProfileManager::RegisterTestingProfile(Profile* profile, +void ProfileManager::RegisterTestingProfile(std::unique_ptr<Profile> profile, bool add_to_storage, bool start_deferred_task_runners) { - RegisterProfile(profile, true); + Profile* profile_ptr = profile.get(); + RegisterProfile(std::move(profile), true); if (add_to_storage) { - InitProfileUserPrefs(profile); - AddProfileToStorage(profile); + InitProfileUserPrefs(profile_ptr); + AddProfileToStorage(profile_ptr); } if (start_deferred_task_runners) { - StartupTaskRunnerServiceFactory::GetForProfile(profile)-> - StartDeferredTaskRunners(); + StartupTaskRunnerServiceFactory::GetForProfile(profile_ptr) + ->StartDeferredTaskRunners(); } } @@ -1412,11 +1413,11 @@ .release(); } -Profile* ProfileManager::CreateProfileAsyncHelper(const base::FilePath& path, - Delegate* delegate) { +std::unique_ptr<Profile> ProfileManager::CreateProfileAsyncHelper( + const base::FilePath& path, + Delegate* delegate) { return Profile::CreateProfile(path, delegate, - Profile::CREATE_MODE_ASYNCHRONOUS) - .release(); + Profile::CREATE_MODE_ASYNCHRONOUS); } Profile* ProfileManager::GetActiveUserOrOffTheRecordProfileFromPath( @@ -1471,7 +1472,7 @@ return false; } - RegisterProfile(profile.release(), true); + RegisterProfile(std::move(profile), true); InitProfileUserPrefs(profile_ptr); DoFinalInit(profile_ptr, ShouldGoOffTheRecord(profile_ptr)); return true; @@ -1647,12 +1648,13 @@ #endif // !defined(OS_ANDROID) ProfileManager::ProfileInfo* ProfileManager::RegisterProfile( - Profile* profile, + std::unique_ptr<Profile> profile, bool created) { TRACE_EVENT0("browser", "ProfileManager::RegisterProfile"); - auto info = std::make_unique<ProfileInfo>(profile, created); + base::FilePath path = profile->GetPath(); + auto info = std::make_unique<ProfileInfo>(std::move(profile), created); ProfileInfo* info_raw = info.get(); - profiles_info_.insert(std::make_pair(profile->GetPath(), std::move(info))); + profiles_info_.insert(std::make_pair(path, std::move(info))); return info_raw; } @@ -1770,12 +1772,9 @@ callbacks[i].Run(profile, status); } -ProfileManager::ProfileInfo::ProfileInfo( - Profile* profile, - bool created) - : profile(profile), - created(created) { -} +ProfileManager::ProfileInfo::ProfileInfo(std::unique_ptr<Profile> profile, + bool created) + : profile(std::move(profile)), created(created) {} ProfileManager::ProfileInfo::~ProfileInfo() { ProfileDestroyer::DestroyProfileWhenAppropriate(profile.release());
diff --git a/chrome/browser/profiles/profile_manager.h b/chrome/browser/profiles/profile_manager.h index 257e27ca..4b4fa3f 100644 --- a/chrome/browser/profiles/profile_manager.h +++ b/chrome/browser/profiles/profile_manager.h
@@ -10,7 +10,9 @@ #include <stddef.h> #include <list> +#include <map> #include <memory> +#include <string> #include <vector> #include "base/files/file_path.h" @@ -227,7 +229,7 @@ // for testing. If |addToStorage|, adds to ProfileAttributesStorage as well. // If |start_deferred_task_runners|, starts the deferred task runners. // Use ONLY in tests. - void RegisterTestingProfile(Profile* profile, + void RegisterTestingProfile(std::unique_ptr<Profile> profile, bool addToStorage, bool start_deferred_task_runners); @@ -260,8 +262,9 @@ // Creates a new profile asynchronously by calling into the profile's // asynchronous profile creation method. Virtual so that unittests can return // a TestingProfile instead of the Profile's result. - virtual Profile* CreateProfileAsyncHelper(const base::FilePath& path, - Delegate* delegate); + virtual std::unique_ptr<Profile> CreateProfileAsyncHelper( + const base::FilePath& path, + Delegate* delegate); private: friend class TestingProfileManager; @@ -271,7 +274,7 @@ // This struct contains information about profiles which are being loaded or // were loaded. struct ProfileInfo { - ProfileInfo(Profile* profile, bool created); + ProfileInfo(std::unique_ptr<Profile> profile, bool created); ~ProfileInfo(); @@ -324,7 +327,7 @@ // Registers profile with given info. Returns pointer to created ProfileInfo // entry. - ProfileInfo* RegisterProfile(Profile* profile, bool created); + ProfileInfo* RegisterProfile(std::unique_ptr<Profile> profile, bool created); // Returns ProfileInfo associated with given |path|, registered earlier with // RegisterProfile. @@ -348,7 +351,7 @@ // (desktop) Guest User profile and (desktop) System Profile. void SetNonPersonalProfilePrefs(Profile* profile); - // For ChromeOS, determines if profile should be otr. + // Determines if profile should be OTR. bool ShouldGoOffTheRecord(Profile* profile); void RunCallbacks(const std::vector<CreateCallback>& callbacks,
diff --git a/chrome/browser/profiles/profile_manager_unittest.cc b/chrome/browser/profiles/profile_manager_unittest.cc index 36ff895..8d8578f9 100644 --- a/chrome/browser/profiles/profile_manager_unittest.cc +++ b/chrome/browser/profiles/profile_manager_unittest.cc
@@ -5,6 +5,7 @@ #include <stddef.h> #include <string> +#include <utility> #include "base/bind.h" #include "base/bind_helpers.h" @@ -98,15 +99,16 @@ return new TestingProfile(file_path, nullptr); } - Profile* CreateProfileAsyncHelper(const base::FilePath& path, - Delegate* delegate) override { + std::unique_ptr<Profile> CreateProfileAsyncHelper( + const base::FilePath& path, + Delegate* delegate) override { // ThreadTaskRunnerHandle::Get() is TestingProfile's "async" IOTaskRunner // (ref. TestingProfile::GetIOTaskRunner()). base::ThreadTaskRunnerHandle::Get()->PostTask( FROM_HERE, base::BindOnce(base::IgnoreResult(&base::CreateDirectory), path)); - return new TestingProfile(path, this); + return std::make_unique<TestingProfile>(path, this); } }; @@ -522,22 +524,24 @@ #if BUILDFLAG(ENABLE_SUPERVISED_USERS) const base::FilePath supervised_path = temp_dir_.GetPath().AppendASCII("Supervised"); - TestingProfile* supervised_profile = - new TestingProfile(supervised_path, nullptr); + auto supervised_profile = + std::make_unique<TestingProfile>(supervised_path, nullptr); supervised_profile->GetPrefs()->SetString( prefs::kSupervisedUserId, supervised_users::kChildAccountSUID); // RegisterTestingProfile adds the profile to the cache and takes ownership. - profile_manager->RegisterTestingProfile(supervised_profile, true, false); + profile_manager->RegisterTestingProfile(std::move(supervised_profile), true, + false); ASSERT_EQ(1u, storage.GetNumberOfProfiles()); EXPECT_TRUE(storage.GetAllProfilesAttributesSortedByName()[0]->IsOmitted()); #endif const base::FilePath nonsupervised_path = temp_dir_.GetPath().AppendASCII("Non-Supervised"); - TestingProfile* nonsupervised_profile = - new TestingProfile(nonsupervised_path, nullptr); - profile_manager->RegisterTestingProfile(nonsupervised_profile, true, false); + auto nonsupervised_profile = + std::make_unique<TestingProfile>(nonsupervised_path, nullptr); + profile_manager->RegisterTestingProfile(std::move(nonsupervised_profile), + true, false); #if BUILDFLAG(ENABLE_SUPERVISED_USERS) EXPECT_EQ(2u, storage.GetNumberOfProfiles()); @@ -1363,10 +1367,10 @@ TestingProfile::Builder builder; builder.SetGuestSession(); builder.SetPath(ProfileManager::GetGuestProfilePath()); - TestingProfile* guest_profile = builder.Build().release(); + std::unique_ptr<TestingProfile> guest_profile = builder.Build(); guest_profile->set_profile_name(guest_profile_name); - // Registering the profile passes ownership to the ProfileManager. - profile_manager->RegisterTestingProfile(guest_profile, false, false); + profile_manager->RegisterTestingProfile(std::move(guest_profile), false, + false); // The Guest profile does not get added to the ProfileAttributesStorage. EXPECT_EQ(2u, profile_manager->GetLoadedProfiles().size());
diff --git a/chrome/browser/profiles/profiles_state.h b/chrome/browser/profiles/profiles_state.h index 7a7500a..6d3e919 100644 --- a/chrome/browser/profiles/profiles_state.h +++ b/chrome/browser/profiles/profiles_state.h
@@ -66,9 +66,10 @@ #endif // !defined(OS_CHROMEOS) -// Returns whether the |browser|'s profile is a non-incognito or guest profile. -// The distinction is needed because guest profiles are implemented as -// incognito profiles. +// Returns whether the |browser|'s profile is not incognito (a regular profile +// or a guest session). +// The distinction is needed because guest profiles and incognito profiles are +// implemented as off-the-record profiles. bool IsRegularOrGuestSession(Browser* browser); // Returns true if sign in is required to browse as this profile. Call with
diff --git a/chrome/browser/resource_coordinator/tab_manager.cc b/chrome/browser/resource_coordinator/tab_manager.cc index a4c05081..d21b56d9 100644 --- a/chrome/browser/resource_coordinator/tab_manager.cc +++ b/chrome/browser/resource_coordinator/tab_manager.cc
@@ -53,7 +53,6 @@ #include "chrome/common/chrome_constants.h" #include "chrome/common/chrome_features.h" #include "chrome/common/url_constants.h" -#include "components/metrics/system_memory_stats_recorder.h" #include "components/variations/variations_associated_data.h" #include "content/public/browser/browser_task_traits.h" #include "content/public/browser/browser_thread.h"
diff --git a/chrome/browser/resource_coordinator/tab_manager_stats_collector.cc b/chrome/browser/resource_coordinator/tab_manager_stats_collector.cc index c1d376f..f85c6449 100644 --- a/chrome/browser/resource_coordinator/tab_manager_stats_collector.cc +++ b/chrome/browser/resource_coordinator/tab_manager_stats_collector.cc
@@ -27,7 +27,6 @@ #include "chrome/browser/resource_coordinator/tab_manager_web_contents_data.h" #include "chrome/browser/resource_coordinator/time.h" #include "chrome/browser/sessions/session_restore.h" -#include "components/metrics/system_memory_stats_recorder.h" #include "content/public/browser/browser_thread.h" #include "content/public/browser/navigation_entry.h" #include "content/public/browser/swap_metrics_driver.h" @@ -161,13 +160,6 @@ base::TimeDelta::FromDays(1), 50); } -// TODO(fdoray): Remove this #if when RecordMemoryStats is implemented for all -// platforms. -#if defined(OS_WIN) || defined(OS_CHROMEOS) - // Record system memory usage at the time of the discard. - metrics::RecordMemoryStats(metrics::RECORD_MEMORY_STATS_TAB_DISCARDED); -#endif - last_urgent_discard_time_ = discard_time; }
diff --git a/chrome/browser/resources/browser_switch/internals/browser_switch_internals.html b/chrome/browser/resources/browser_switch/internals/browser_switch_internals.html index e512b0e..05f5edf 100644 --- a/chrome/browser/resources/browser_switch/internals/browser_switch_internals.html +++ b/chrome/browser/resources/browser_switch/internals/browser_switch_internals.html
@@ -40,16 +40,16 @@ #url-checker-input { width: 400px; } + + #xml-not-fetched-yet, + #xml-last-fetch { + display: none; + } </style> </head> <body> <h1>Legacy Browser Support Internals</h1> - <p> - If an XML sitelist is configured, wait 1 minute after browser - startup for it to download, and then refresh this page. - </p> - <!-- TODO(crbug/959379): Hide all this and show a message if BrowserSwitcherEnabled is false. --> @@ -73,6 +73,30 @@ <h2>Greylist</h2> <table id="greylist"></table> + <h2>XML sitelists</h2> + + <table id="xml-sitelists"></table> + + <div id="xml-description-wrapper"> + <p id="xml-not-fetched-yet"> + XML sitelists have not been fetched yet. + </p> + + <p id="xml-last-fetch"> + XML sitelists were last downloaded at + <span id="last-fetch-placeholder"></span>. + </p> + + <p id="xml-next-fetch"> + Next download is at + <span id="next-fetch-placeholder"></span>. + </p> + + <p> + <button id="refresh-xml-button">Download now</button> + </p> + </div> + <template id="header-row-template"> <tr> <th>Rule</th> @@ -91,6 +115,20 @@ </tr> </template> + <template id="xml-header-row-template"> + <tr> + <th>Source policy</th> + <th>URL</th> + </tr> + </template> + + <template id="xml-row-template"> + <tr> + <td></td> + <td></td> + </tr> + </template> + <script src="/internals/browser_switch_internals.js"></script> </body> </html>
diff --git a/chrome/browser/resources/browser_switch/internals/browser_switch_internals.js b/chrome/browser/resources/browser_switch/internals/browser_switch_internals.js index 9e093cf..2b57bf2 100644 --- a/chrome/browser/resources/browser_switch/internals/browser_switch_internals.js +++ b/chrome/browser/resources/browser_switch/internals/browser_switch_internals.js
@@ -22,12 +22,45 @@ let RuleSetList; /** + * Returned by getRulesetSources(). + * @typedef {{ + * browser_switcher: Object<string, string>!, + * }} + */ +let RulesetSources; + +/** + * Returned by getTimestamps(). + * @typedef {{ + * last_fetch: number, + * next_fetch: number, + * }} + */ +let TimestampPair; + +/** + * Converts 'this_word' to 'ThisWord' + * @param {string} symbol + * @return {string} + */ +function snakeCaseToUpperCamelCase(symbol) { + if (!symbol) { + return symbol; + } + return symbol.replace(/(?:^|_)([a-z])/g, (_, letter) => { + return letter.toUpperCase(); + }); +} + +/** * Clears the table, and inserts a header row. * @param {HTMLTableElement} table + * @param {HTMLTemplateElement} headerTemplate + * Template to use to re-create the header row. */ -function clearTable(table) { +function clearTable(table, headerTemplate) { table.innerHTML = ''; - const headerRow = document.importNode($('header-row-template').content, true); + const headerRow = document.importNode(headerTemplate.content, true); table.appendChild(headerRow); } @@ -67,8 +100,10 @@ * @param {RuleSetList} rulesets */ function updateTables(rulesets) { - clearTable(/** @type {HTMLTableElement} */ ($('sitelist'))); - clearTable(/** @type {HTMLTableElement} */ ($('greylist'))); + const headerTemplate = + /** @type {HTMLTemplateElement} */ ($('header-row-template')); + clearTable(/** @type {HTMLTableElement} */ ($('sitelist')), headerTemplate); + clearTable(/** @type {HTMLTableElement} */ ($('greylist')), headerTemplate); for (const [rulesetName, ruleset] of Object.entries(rulesets)) { for (const [listName, rules] of Object.entries(ruleset)) { @@ -80,8 +115,6 @@ } } -cr.sendWithPromise('getAllRulesets').then(updateTables); - function checkUrl() { const url = $('url-checker-input').value; if (!url) { @@ -101,4 +134,91 @@ } $('url-checker-input').addEventListener('input', checkUrl); -checkUrl(); + +/** + * Formats |date| as "HH:MM:SS". + * @param {Date} date + * @return {string} + */ +function formatTime(date) { + const hh = date.getHours().toString().padStart(2, '0'); + const mm = date.getMinutes().toString().padStart(2, '0'); + const ss = date.getSeconds().toString().padStart(2, '0'); + return `${hh}:${mm}:${ss}`; +} + +/** + * Update the paragraphs under the "XML sitelists" section. + * @param {TimestampPair?} timestamps + */ +function updateTimestamps(timestamps) { + if (!timestamps) { + return; + } + + const lastFetch = new Date(timestamps.last_fetch); + const nextFetch = new Date(timestamps.next_fetch); + + if (lastFetch.valueOf() == 0) { + // Not fetched yet. + $('xml-not-fetched-yet').style.display = 'block'; + $('xml-last-fetch').style.display = 'none'; + } else { + // Already fetched. + $('xml-not-fetched-yet').style.display = 'none'; + $('xml-last-fetch').style.display = 'block'; + } + + $('xml-next-fetch').style.display = nextFetch.valueOf() ? 'block' : 'none'; + + $('last-fetch-placeholder').innerText = formatTime(lastFetch); + $('next-fetch-placeholder').innerText = formatTime(nextFetch); +} + +/** + * Update the table under the "XML sitelists" section. + * @param {RulesetSources} sources + */ +function updateXmlTable({browser_switcher: sources}) { + const headerTemplate = + /** @type {HTMLTemplateElement} */ ($('xml-header-row-template')); + clearTable( + /** @type {HTMLTableElement} */ ($('xml-sitelists')), headerTemplate); + + for (const [prefName, url] of Object.entries(sources)) { + // Hacky: guess the policy name from the pref name by converting 'foo_bar' + // to 'BrowserSwitcherFooBar'. This relies on prefs having the same name as + // the associated policy. + const policyName = 'BrowserSwitcher' + snakeCaseToUpperCamelCase(prefName); + const row = document.importNode($('xml-row-template').content, true); + const cells = row.querySelectorAll('td'); + cells[0].innerText = policyName; + cells[1].innerText = url || '(not configured)'; + cells[1].className = 'url'; + $('xml-sitelists').appendChild(row); + } + + // Hide/show the description paragraphs depending on whether any XML sitelist + // is configured. + const enabled = Object.values(sources).some(x => !!x); + $('xml-description-wrapper').style.display = enabled ? 'block' : 'none'; +} + +/** + * Called by C++ when we need to update everything on the page. + */ +function updateEverything() { + cr.sendWithPromise('getAllRulesets').then(updateTables); + cr.sendWithPromise('getTimestamps').then(updateTimestamps); + cr.sendWithPromise('getRulesetSources').then(updateXmlTable); + checkUrl(); +} + +// TODO(crbug/959379): Keep the page up-to-date at all times: updateEverything() +// when LBS prefs are updated, and after sitelists get refreshed. + +updateEverything(); + +$('refresh-xml-button').addEventListener('click', () => { + chrome.send('refreshXml'); +});
diff --git a/chrome/browser/resources/chromeos/camera/src/js/metrics.js b/chrome/browser/resources/chromeos/camera/src/js/metrics.js index 61919b61..4f956f2 100644 --- a/chrome/browser/resources/chromeos/camera/src/js/metrics.js +++ b/chrome/browser/resources/chromeos/camera/src/js/metrics.js
@@ -93,7 +93,7 @@ /** * Returns event builder for the metrics type: capture. - * @param {string} facingMode Camera facing-mode of the capture. + * @param {?string} facingMode Camera facing-mode of the capture. * @param {number=} length Length of 1 minute buckets for captured video. * @param {number} width The width of the capture resolution. * @param {number} height The height of the capture resolution. @@ -115,7 +115,7 @@ return cca.metrics.base_.category('capture') .action(/^(\w*)/.exec(condState( ['video-mode', 'photo-mode', 'square-mode', 'portrait-mode']))[0]) - .label(facingMode) + .label(facingMode || '(not set)') .dimen(3, condState(['sound'])) .dimen(4, condState(['mirror'])) .dimen(5, condState(['_3x3', '_4x4', 'golden'], 'grid'))
diff --git a/chrome/browser/resources/chromeos/camera/src/js/views/camera.js b/chrome/browser/resources/chromeos/camera/src/js/views/camera.js index 51e53325..663b952 100644 --- a/chrome/browser/resources/chromeos/camera/src/js/views/camera.js +++ b/chrome/browser/resources/chromeos/camera/src/js/views/camera.js
@@ -99,10 +99,10 @@ }); /** - * @type {string} + * @type {?string} * @private */ - this.facingMode_ = ''; + this.facingMode_ = null; /** * @type {boolean} @@ -264,13 +264,17 @@ /** * Try start stream reconfiguration with specified device id. * @async - * @param {string} deviceId + * @param {?string} deviceId * @return {boolean} If found suitable stream and reconfigure successfully. */ cca.views.Camera.prototype.startWithDevice_ = async function(deviceId) { let supportedModes = null; for (const mode of this.modes_.getModeCandidates()) { try { + if (!deviceId) { + // Null for requesting default camera on HALv1. + throw new Error; + } const previewRs = (await this.options_.getDeviceResolutions(deviceId))[1]; var resolCandidates = this.modes_.getResolutionCandidates(mode, deviceId, previewRs); @@ -291,7 +295,8 @@ } } await this.preview_.start(stream); - this.facingMode_ = this.options_.updateValues(constraints, stream); + this.facingMode_ = + await this.options_.updateValues(constraints, stream); await this.modes_.updateModeSelectionUI(supportedModes); await this.modes_.updateMode( mode, stream, deviceId, captureResolution);
diff --git a/chrome/browser/resources/chromeos/camera/src/js/views/camera/modes.js b/chrome/browser/resources/chromeos/camera/src/js/views/camera/modes.js index 03fe9e9b..291fd7d4 100644 --- a/chrome/browser/resources/chromeos/camera/src/js/views/camera/modes.js +++ b/chrome/browser/resources/chromeos/camera/src/js/views/camera/modes.js
@@ -79,7 +79,7 @@ new cca.views.camera.Video(this.stream_, this.doSavePicture_), isSupported: async () => true, resolutionConfig: videoResolPreferrer, - v1Config: cca.views.camera.Modes.videoConstraits, + v1Config: cca.views.camera.Modes.getV1Constraints.bind(this, true), nextMode: 'photo-mode', }, 'photo-mode': { @@ -87,7 +87,7 @@ this.stream_, this.doSavePicture_, this.captureResolution_), isSupported: async () => true, resolutionConfig: photoResolPreferrer, - v1Config: cca.views.camera.Modes.photoConstraits, + v1Config: cca.views.camera.Modes.getV1Constraints.bind(this, false), nextMode: 'square-mode', }, 'square-mode': { @@ -95,7 +95,7 @@ this.stream_, this.doSavePicture_, this.captureResolution_), isSupported: async () => true, resolutionConfig: photoResolPreferrer, - v1Config: cca.views.camera.Modes.photoConstraits, + v1Config: cca.views.camera.Modes.getV1Constraints.bind(this, false), nextMode: 'portrait-mode', }, 'portrait-mode': { @@ -117,7 +117,7 @@ } }, resolutionConfig: photoResolPreferrer, - v1Config: cca.views.camera.Modes.photoConstraits, + v1Config: cca.views.camera.Modes.getV1Constraints.bind(this, false), nextMode: 'video-mode', }, }; @@ -162,14 +162,15 @@ }; /** - * Returns a set of available video constraints for HALv1 device. + * Returns a set of available constraints for HALv1 device. + * @param {boolean} videoMode Is getting constraints for video mode. * @param {?string} deviceId Id of video device. * @return {Array<Object>} Result of constraints-candidates. */ -cca.views.camera.Modes.videoConstraits = function(deviceId) { +cca.views.camera.Modes.getV1Constraints = function(videoMode, deviceId) { return [ { - aspectRatio: {ideal: 1.7777777778}, + aspectRatio: {ideal: videoMode ? 1.7777777778 : 1.3333333333}, width: {min: 1280}, frameRate: {min: 24}, }, @@ -178,30 +179,14 @@ frameRate: {min: 24}, }, ].map((constraint) => { - constraint.deviceId = {exact: deviceId}; - return {audio: true, video: constraint}; - }); -}; - -/** - * Returns a set of available photo constraints for HALv1 device. - * @param {?string} deviceId Id of video device. - * @return {Array<Object>} Result of constraints-candidates. - */ -cca.views.camera.Modes.photoConstraits = function(deviceId) { - return [ - { - aspectRatio: {ideal: 1.3333333333}, - width: {min: 1280}, - frameRate: {min: 24}, - }, - { - width: {min: 640}, - frameRate: {min: 24}, - }, - ].map((constraint) => { - constraint.deviceId = {exact: deviceId}; - return {audio: false, video: constraint}; + if (deviceId) { + constraint.deviceId = {exact: deviceId}; + } else { + // HALv1 devices are unable to know facing before stream configuration, + // deviceId is set to null for requesting user facing camera as default. + constraint.facingMode = {exact: 'user'}; + } + return {audio: videoMode, video: constraint}; }); }; @@ -255,7 +240,7 @@ * Gets capture resolution and its corresponding preview constraints for the * given mode on camera HALv1 device. * @param {string} mode - * @param {string} deviceId + * @param {?string} deviceId * @return {Array<[?[number, number], Array<Object>]>} Result capture resolution * width, height and constraints-candidates for its preview. */ @@ -299,7 +284,7 @@ * @async * @param {string} mode Classname of mode to be updated. * @param {MediaStream} stream Stream of the new switching mode. - * @param {string} deviceId Device id of currently working video device. + * @param {?string} deviceId Device id of currently working video device. * @param {?[number, number]} captureResolution Capturing resolution width and * height. */ @@ -312,7 +297,7 @@ this.stream_ = stream; this.captureResolution_ = captureResolution; this.current = this.allModes_[mode].captureFactory(); - if (this.captureResolution_) { + if (deviceId && this.captureResolution_) { this.allModes_[mode].resolutionConfig.updateCurrentResolution( deviceId, ...this.captureResolution_); }
diff --git a/chrome/browser/resources/chromeos/camera/src/js/views/camera/options.js b/chrome/browser/resources/chromeos/camera/src/js/views/camera/options.js index 74f20d49..63a1129 100644 --- a/chrome/browser/resources/chromeos/camera/src/js/views/camera/options.js +++ b/chrome/browser/resources/chromeos/camera/src/js/views/camera/options.js
@@ -80,13 +80,24 @@ this.videoDevices_ = null; /** - * List of available video devices and width, height of its supported video - * resolutions and photo resolutions. + * MediaDeviceInfo and additional information queried from private mojo api of + * all available video device. The additional fields in the array entry + * represent camera facing, supported photo resolutions, supported video + * resolutions. On HALv1 device, the promise will throw exception for its + * incapability of building mojo api connection. * @type {Promise<!Array<[MediaDeviceInfo, cros.mojom.CameraFacing, ResolList, * ResolList]>>} * @private */ - this.deviceResolutions_ = null; + this.devicePrivateInfo_ = null; + + /** + * Whether the current device is HALv1 and lacks facing configuration. + * get facing information. + * @type {?boolean} + * private + */ + this.isV1NoFacingConfig_ = null; /** * Mirroring set per device. @@ -170,13 +181,23 @@ * Updates the options' values for the current constraints and stream. * @param {Object} constraints Current stream constraints in use. * @param {MediaStream} stream Current Stream in use. - * @return {string} Facing-mode in use. + * @return {?string} Facing-mode in use. */ -cca.views.camera.Options.prototype.updateValues = function( - constraints, stream) { +cca.views.camera.Options.prototype.updateValues = + async function(constraints, stream) { var track = stream.getVideoTracks()[0]; var trackSettings = track.getSettings && track.getSettings(); - var facingMode = trackSettings && trackSettings.facingMode; + let facingMode = trackSettings && trackSettings.facingMode; + if (this.isV1NoFacingConfig_ === null) { + // Because the facing mode of external camera will be set to undefined on + // all devices, to distinguish HALv1 device without facing configuration, + // assume the first opened camera is built-in camera. Device without facing + // configuration won't set facing of built-in cameras. Also if HALv1 device + // with facing configuration opened external camera first after CCA launched + // the logic here may misjudge it as this category. + this.isV1NoFacingConfig_ = facingMode === undefined; + } + facingMode = this.isV1NoFacingConfig_ ? null : facingMode || 'external'; this.updateVideoDeviceId_(constraints, trackSettings); this.updateMirroring_(facingMode); this.audioTrack_ = stream.getAudioTracks()[0]; @@ -265,7 +286,7 @@ this.refreshingVideoDeviceIds_ = false; }); - this.deviceResolutions_ = + this.devicePrivateInfo_ = this.videoDevices_ .then((devices) => { return Promise.all(devices.map((d) => Promise.all([ @@ -285,14 +306,14 @@ (async () => { try { - var deviceResolutions = await this.deviceResolutions_; + var devicePrivateInfo = await this.devicePrivateInfo_; } catch (e) { return; } let frontSetting = null; let backSetting = null; let externalSettings = []; - deviceResolutions.forEach(([{deviceId}, facing, photoRs, videoRs]) => { + devicePrivateInfo.forEach(([{deviceId}, facing, photoRs, videoRs]) => { const setting = [deviceId, photoRs, videoRs]; switch (facing) { case cros.mojom.CameraFacing.CAMERA_FACING_FRONT: @@ -321,28 +342,45 @@ /** * Gets the video device ids sorted by preference. - * @return {!Promise<!Array<string>>} + * @async + * @return {Array<?string>} May contain null for user facing camera on HALv1 + * devices. + * @throws {Error} Throws exception for no available video devices. */ -cca.views.camera.Options.prototype.videoDeviceIds = function() { - return this.videoDevices_.then((devices) => { - if (devices.length == 0) { - throw new Error('Device list empty.'); +cca.views.camera.Options.prototype.videoDeviceIds = async function() { + const devices = await this.videoDevices_; + if (devices.length == 0) { + throw new Error('Device list empty.'); + } + try { + var facings = (await this.devicePrivateInfo_) + .reduce( + (facings, [d, facing]) => + Object.assign(facings, {[d.deviceId]: facing}), + {}); + this.isV1NoFacingConfig_ = false; + } catch (e) { + facings = null; + } + // Put the selected video device id first. + var sorted = devices.map((device) => device.deviceId).sort((a, b) => { + if (a == b) { + return 0; } - // Put the selected video device id first. - return devices - .sort((a, b) => { - if (a.deviceId == b.deviceId) { - return 0; - } - if (this.videoDeviceId_ ? - (a.deviceId == this.videoDeviceId_) : - (a.label == cca.views.camera.Options.FRONT_CAMERA_LABEL)) { - return -1; - } - return 1; - }) - .map(({deviceId}) => deviceId); + if (this.videoDeviceId_ ? + a === this.videoDeviceId_ : + (facings && + facings[a] === cros.mojom.CameraFacing.CAMERA_FACING_FRONT)) { + return -1; + } + return 1; }); + // Prepended 'null' deviceId means the system default camera on HALv1 + // device. Add it only when the app is launched (no video-device-id set). + if (!facings && this.videoDeviceId_ === null) { + sorted.unshift(null); + } + return sorted; }; /** @@ -355,8 +393,9 @@ */ cca.views.camera.Options.prototype.getDeviceResolutions = async function(deviceId) { - const deviceResolutions = await this.deviceResolutions_; + // HALv1 device will thrown from here. + const devicePrivateInfo = await this.devicePrivateInfo_; const [, , photoRs, videoRs] = - deviceResolutions.find(([d]) => d.deviceId == deviceId); + devicePrivateInfo.find(([d]) => d.deviceId === deviceId); return [photoRs, videoRs]; };
diff --git a/chrome/browser/resources/chromeos/camera/src/strings/camera_strings_am.xtb b/chrome/browser/resources/chromeos/camera/src/strings/camera_strings_am.xtb index 7545fbda..6341daba 100644 --- a/chrome/browser/resources/chromeos/camera/src/strings/camera_strings_am.xtb +++ b/chrome/browser/resources/chromeos/camera/src/strings/camera_strings_am.xtb
@@ -8,6 +8,7 @@ <translation id="1627744224761163218">4 x 4</translation> <translation id="1664224225747386870">ምንም አልተቀረጸም</translation> <translation id="1862930711583847113"><ph name="FILE" />ን ወደ ውጭ መላክ አልተቻለም</translation> +<translation id="1899697626337024495">የፎቶ ምስል ጥራት</translation> <translation id="2008689030244369546">ሙሉ ለሙሉ አዲስ መልክ</translation> <translation id="2036868001356139588">የሰዓት ቆጣሪ ቆይታ ጊዜ</translation> <translation id="2050339315714019657">በቁመት</translation> @@ -17,18 +18,22 @@ <translation id="2501853267655415902">ቀረጻ ቆሟል</translation> <translation id="2501953888035679275">በካሜራዎ ፎቶዎችን ያንሱ እና ቪዲዮዎችን ይቅረጹ።</translation> <translation id="2549985041256363841">መቅረጽ ጀምር</translation> +<translation id="2599796128805996109">የኋላ ካሜራ</translation> <translation id="2968794441791257519">በካሜራው የተነሱ ፎቶዎች ወይም የተቀረጹ ቪዲዮዎች ወደ የውርዶች አቃፊው ይወሰዳሉ። በፋይሎች ውስጥ ሊደርሱባቸው ይችላሉ። የማከማቻ ፈቃዶች ያላቸው መተግበሪያዎች የእርስዎ ፎቶዎች እና ቪዲዮዎች መዳረሻ ይኖራቸዋል።</translation> <translation id="3081586908890909590">ቪዲዮ ለመቅረጽ ቀይር</translation> <translation id="3183731565330012717">የፍርግርግ ዓይነት</translation> <translation id="3227137524299004712">ማይክሮፎን</translation> +<translation id="3259149966178251584">የካሜራ ምስል ጥራት</translation> <translation id="3517926952904427380">የቁም ፎቶን ማንሳት አልተቻለም</translation> <translation id="3569311554794739032">እርግጠኛ ነዎት <ph name="FILE" />ን ማስወገድ ይፈልጋሉ?</translation> <translation id="3810838688059735925">ቪዲዮ</translation> <translation id="4279490309300973883">በማንጸባረቅ ላይ</translation> <translation id="4329152592498422850">የካሬ ፎቶን ለማንሳት ይቀይሩ</translation> <translation id="4445542136948522167">ፎቶን ማንሳት አቁም</translation> +<translation id="4497569853498380347">(<ph name="ASPECT_RATIO_WIDTH" />:<ph name="ASPECT_RATIO_HEIGHT" />) <ph name="MEGAPIXEL" /> ሜጋ ፒክሴል</translation> +<translation id="4570032796877367747">የፊት ካሜራ</translation> <translation id="4628948037717959914">ፎቶ</translation> <translation id="4649291346448517080">ፋይሉን ማስቀመጥ አልተሳካም</translation> <translation id="4890010094662541459">3 x 3</translation> @@ -42,11 +47,14 @@ <translation id="6165508094623778733">የበለጠ ለመረዳት</translation> <translation id="6233780560267770709">3 በ 3</translation> <translation id="6243827288366940320">ወርቃማ ውድር</translation> +<translation id="6248749904681914629">ውጫዊ ካሜራ</translation> +<translation id="6420689864531458495">(<ph name="ASPECT_RATIO_WIDTH" />:<ph name="ASPECT_RATIO_HEIGHT" /> - <ph name="WIDTH" />x<ph name="HEIGHT" />) <ph name="MEGAPIXEL" /> ሜጋ ፒክሴል</translation> <translation id="6681668084120808868">ፎቶ አንሳ</translation> <translation id="6778482348691154169">ፎቶ ለማንሳት አልተቻለም</translation> <translation id="6965382102122355670">እሺ</translation> <translation id="698156982839284926">3 ሰከንዶች</translation> <translation id="712848772518857951">እውን <ph name="COUNT" /> ንጥሎችን ማስወገድ ይፈልጋሉ?</translation> +<translation id="7243947652761655814">የቪዲዮ ምስል ጥራት</translation> <translation id="7337660886763914220">የፋይል ሥርዓት ስህተቶች።</translation> <translation id="7557677699350329807">ወደ ቀጣዩ ካሜራ ቀይር</translation> <translation id="7608223098072244877">4 በ 4</translation> @@ -56,6 +64,7 @@ <translation id="8145038249676204903">ፎቶ ለማንሳት ይቀይሩ</translation> <translation id="8261506727792406068">ሰርዝ</translation> <translation id="8428213095426709021">ቅንብሮች</translation> +<translation id="8687491812650032292">ኤችዲ <ph name="HEIGHT" />ፒ (<ph name="WIDTH" />:<ph name="HEIGHT" />)</translation> <translation id="8815966864175525708">የቁም ፎቶ ለማንሳት ይቀይሩ</translation> <translation id="8870695351537079478">መቅረጽ መጀመር አልተቻለም</translation> <translation id="9045155556724273246">10 ሰከንዶች</translation>
diff --git a/chrome/browser/resources/chromeos/camera/src/strings/camera_strings_bg.xtb b/chrome/browser/resources/chromeos/camera/src/strings/camera_strings_bg.xtb index 880dec7f..b179de4 100644 --- a/chrome/browser/resources/chromeos/camera/src/strings/camera_strings_bg.xtb +++ b/chrome/browser/resources/chromeos/camera/src/strings/camera_strings_bg.xtb
@@ -8,6 +8,7 @@ <translation id="1627744224761163218">4 x 4</translation> <translation id="1664224225747386870">Нищо не е записано</translation> <translation id="1862930711583847113">Файлът „<ph name="FILE" />“ не може да се експортира</translation> +<translation id="1899697626337024495">Разделителна способност за снимките</translation> <translation id="2008689030244369546">Съвсем нов облик</translation> <translation id="2036868001356139588">Продължителност на таймера</translation> <translation id="2050339315714019657">Вертикално</translation> @@ -17,18 +18,22 @@ <translation id="2501853267655415902">Записването спря</translation> <translation id="2501953888035679275">Правете снимки и записвайте видеоклипове с камерата си.</translation> <translation id="2549985041256363841">Старт на записа</translation> +<translation id="2599796128805996109">Задна камера</translation> <translation id="2968794441791257519">Направените с камерата снимки и видеоклипове ще бъдат преместени в папката „Изтегляния“. Можете да осъществите достъп до тях от „Файлове“. Приложенията с разрешения за хранилището ще имат достъп до снимките и видеоклиповете ви.</translation> <translation id="3081586908890909590">Превключване към режима за запис на видеоклипове</translation> <translation id="3183731565330012717">Тип решетка</translation> <translation id="3227137524299004712">Микрофон</translation> +<translation id="3259149966178251584">Разделителна способност на камерата</translation> <translation id="3517926952904427380">Не може да се направи вертикална снимка</translation> <translation id="3569311554794739032">Наистина ли искате да премахнете „<ph name="FILE" />“?</translation> <translation id="3810838688059735925">Видео</translation> <translation id="4279490309300973883">Дублиране</translation> <translation id="4329152592498422850">Превключвател за правене на квадратна снимка</translation> <translation id="4445542136948522167">Спиране на правенето на снимка</translation> +<translation id="4497569853498380347">(<ph name="ASPECT_RATIO_WIDTH" />:<ph name="ASPECT_RATIO_HEIGHT" />) <ph name="MEGAPIXEL" /> мегапиксела</translation> +<translation id="4570032796877367747">Предна камера</translation> <translation id="4628948037717959914">Снимка</translation> <translation id="4649291346448517080">Файлът не може да бъде запазен</translation> <translation id="4890010094662541459">3 x 3</translation> @@ -42,11 +47,14 @@ <translation id="6165508094623778733">Научете повече</translation> <translation id="6233780560267770709">3 на 3</translation> <translation id="6243827288366940320">Златно сечение</translation> +<translation id="6248749904681914629">Външна камера</translation> +<translation id="6420689864531458495">(<ph name="ASPECT_RATIO_WIDTH" />:<ph name="ASPECT_RATIO_HEIGHT" /> – <ph name="WIDTH" /> x <ph name="HEIGHT" />) <ph name="MEGAPIXEL" /> мегапиксела</translation> <translation id="6681668084120808868">Снимане</translation> <translation id="6778482348691154169">Не може да се направи снимка</translation> <translation id="6965382102122355670">OK</translation> <translation id="698156982839284926">3 секунди</translation> <translation id="712848772518857951">Наистина ли искате да премахнете <ph name="COUNT" /> елемента?</translation> +<translation id="7243947652761655814">Разделителна способност за видеоклиповете</translation> <translation id="7337660886763914220">Грешки във файловата система.</translation> <translation id="7557677699350329807">Превключване към следващата камера</translation> <translation id="7608223098072244877">4 на 4</translation> @@ -56,6 +64,7 @@ <translation id="8145038249676204903">Превключване към режима за правене на снимки</translation> <translation id="8261506727792406068">Изтриване</translation> <translation id="8428213095426709021">Настройки</translation> +<translation id="8687491812650032292">HD при <ph name="HEIGHT" />p (<ph name="WIDTH" />:<ph name="HEIGHT" />)</translation> <translation id="8815966864175525708">Превключвател за правене на вертикална снимка</translation> <translation id="8870695351537079478">Записването не може да се стартира</translation> <translation id="9045155556724273246">10 секунди</translation>
diff --git a/chrome/browser/resources/chromeos/camera/src/strings/camera_strings_bn.xtb b/chrome/browser/resources/chromeos/camera/src/strings/camera_strings_bn.xtb index 4c48fdf..967aa601 100644 --- a/chrome/browser/resources/chromeos/camera/src/strings/camera_strings_bn.xtb +++ b/chrome/browser/resources/chromeos/camera/src/strings/camera_strings_bn.xtb
@@ -8,6 +8,7 @@ <translation id="1627744224761163218">৪ x ৪</translation> <translation id="1664224225747386870">কিছুই রেকর্ড করা হয়নি</translation> <translation id="1862930711583847113"><ph name="FILE" /> এক্সপোর্ট করা যাচ্ছে না</translation> +<translation id="1899697626337024495">ফটো রেজোলিউশন</translation> <translation id="2008689030244369546">একেবারে নতুন দেখতে</translation> <translation id="2036868001356139588">টাইমারের সময়কাল</translation> <translation id="2050339315714019657">প্রতিকৃতি</translation> @@ -17,18 +18,22 @@ <translation id="2501853267655415902">রেকর্ডিং বন্ধ করা হয়েছে</translation> <translation id="2501953888035679275">আপনার ক্যামেরা ব্যবহার করে ছবি তুলুন এবং ভিডিও রেকর্ড করুন।</translation> <translation id="2549985041256363841">রেকর্ডিং শুরু করুন</translation> +<translation id="2599796128805996109">পিছনের ক্যামেরা</translation> <translation id="2968794441791257519">ক্যামেরায় তোলা ফটো ও ভিডিও ডাউনলোড ফোল্ডারে সরিয়ে দেওয়া হবে। আপনি সেগুলি ফাইল থেকে অ্যাক্সেস করতে পারবেন। আপনার ফটো ও ভিডিওতে স্টোরেজ ব্যবহারের অনুমতি আছে এমন অ্যাপের অ্যাক্সেস থাকবে।</translation> <translation id="3081586908890909590">ভিডিও রেকর্ড মোডে পাল্টান</translation> <translation id="3183731565330012717">গ্রিডের ধরন</translation> <translation id="3227137524299004712">মাইক্রোফোন</translation> +<translation id="3259149966178251584">ক্যামেরার রেজোলিউশন</translation> <translation id="3517926952904427380">পোর্ট্রেট ফটো তোলা যাচ্ছে না</translation> <translation id="3569311554794739032">আপনি কি সত্যিই <ph name="FILE" /> সরাতে চান?</translation> <translation id="3810838688059735925">ভিডিও</translation> <translation id="4279490309300973883">অনুকরণ করা হচ্ছে</translation> <translation id="4329152592498422850">চৌকো ফটো তুলতে মোড পাল্টান</translation> <translation id="4445542136948522167">ফটো তোলা বন্ধ করুন</translation> +<translation id="4497569853498380347">(<ph name="ASPECT_RATIO_WIDTH" />:<ph name="ASPECT_RATIO_HEIGHT" />) <ph name="MEGAPIXEL" /> মেগা পিক্সেল</translation> +<translation id="4570032796877367747">সামনের ক্যামেরা</translation> <translation id="4628948037717959914">ফটো</translation> <translation id="4649291346448517080">ফাইল সেভ করা যাচ্ছে না</translation> <translation id="4890010094662541459">৩ x ৩</translation> @@ -42,11 +47,14 @@ <translation id="6165508094623778733">আরও জানুন</translation> <translation id="6233780560267770709">৩ x ৩</translation> <translation id="6243827288366940320">গোল্ডেন অনুপাত</translation> +<translation id="6248749904681914629">এক্সটার্নাল ক্যামেরা</translation> +<translation id="6420689864531458495">(<ph name="ASPECT_RATIO_WIDTH" />:<ph name="ASPECT_RATIO_HEIGHT" /> - <ph name="WIDTH" />x<ph name="HEIGHT" />) <ph name="MEGAPIXEL" /> মেগা পিক্সেল</translation> <translation id="6681668084120808868">ফটো তুলুন</translation> <translation id="6778482348691154169">ফটো তোলা যাচ্ছে না</translation> <translation id="6965382102122355670">ঠিক আছে</translation> <translation id="698156982839284926">৩ সেকেন্ড</translation> <translation id="712848772518857951">আপনি কি সত্যিই <ph name="COUNT" />টি আইটেম সরিয়ে ফেলতে চান?</translation> +<translation id="7243947652761655814">ভিডিও রেজোলিউশন</translation> <translation id="7337660886763914220">ফাইল সিস্টেমে সমস্যা হয়েছে।</translation> <translation id="7557677699350329807">পরের ক্যামেরা বেছে নিন</translation> <translation id="7608223098072244877">৪ x ৪</translation> @@ -56,6 +64,7 @@ <translation id="8145038249676204903">ফটো মোডে পাল্টান</translation> <translation id="8261506727792406068">মুছুন</translation> <translation id="8428213095426709021">সেটিংস</translation> +<translation id="8687491812650032292">HD <ph name="HEIGHT" />p (<ph name="WIDTH" />:<ph name="HEIGHT" />)</translation> <translation id="8815966864175525708">পোর্ট্রেট ফটো তুলতে মোড পাল্টান</translation> <translation id="8870695351537079478">রেকর্ডিং শুরু করা যাচ্ছে না</translation> <translation id="9045155556724273246">১০ সেকেন্ড</translation>
diff --git a/chrome/browser/resources/chromeos/camera/src/strings/camera_strings_ca.xtb b/chrome/browser/resources/chromeos/camera/src/strings/camera_strings_ca.xtb index d7d3414..ae7d26e 100644 --- a/chrome/browser/resources/chromeos/camera/src/strings/camera_strings_ca.xtb +++ b/chrome/browser/resources/chromeos/camera/src/strings/camera_strings_ca.xtb
@@ -8,6 +8,7 @@ <translation id="1627744224761163218">4 x 4</translation> <translation id="1664224225747386870">No s'ha gravat res</translation> <translation id="1862930711583847113">No es pot exportar <ph name="FILE" /></translation> +<translation id="1899697626337024495">Resolució de la foto</translation> <translation id="2008689030244369546">Un aspecte totalment nou</translation> <translation id="2036868001356139588">Durada del temporitzador</translation> <translation id="2050339315714019657">Vertical</translation> @@ -17,18 +18,22 @@ <translation id="2501853267655415902">S'ha aturat la gravació</translation> <translation id="2501953888035679275">Fes fotos i grava vídeos amb la càmera.</translation> <translation id="2549985041256363841">Comença a gravar</translation> +<translation id="2599796128805996109">Càmera posterior</translation> <translation id="2968794441791257519">Les fotos i els vídeos que es facin amb la càmera es mouran a la carpeta Baixades. Pots accedir-hi des de Fitxers. Les aplicacions amb permisos d'emmagatzematge tindran accés a les fotos i als vídeos.</translation> <translation id="3081586908890909590">Canvia al mode per gravar vídeo</translation> <translation id="3183731565330012717">Tipus de quadrícula</translation> <translation id="3227137524299004712">Micròfon</translation> +<translation id="3259149966178251584">Resolució de la càmera</translation> <translation id="3517926952904427380">No es pot fer una foto vertical</translation> <translation id="3569311554794739032">Confirmes que vols suprimir <ph name="FILE" />?</translation> <translation id="3810838688059735925">Vídeo</translation> <translation id="4279490309300973883">S'està creant una rèplica</translation> <translation id="4329152592498422850">Botó per fer una foto quadrada</translation> <translation id="4445542136948522167">No facis la foto</translation> +<translation id="4497569853498380347">(<ph name="ASPECT_RATIO_WIDTH" />:<ph name="ASPECT_RATIO_HEIGHT" />) <ph name="MEGAPIXEL" /> megapíxels</translation> +<translation id="4570032796877367747">Càmera frontal</translation> <translation id="4628948037717959914">Foto</translation> <translation id="4649291346448517080">No es pot desar el fitxer</translation> <translation id="4890010094662541459">3 x 3</translation> @@ -42,11 +47,14 @@ <translation id="6165508094623778733">Més informació</translation> <translation id="6233780560267770709">3 per 3</translation> <translation id="6243827288366940320">Proporció àuria</translation> +<translation id="6248749904681914629">Càmera externa</translation> +<translation id="6420689864531458495">(<ph name="ASPECT_RATIO_WIDTH" />:<ph name="ASPECT_RATIO_HEIGHT" /> - <ph name="WIDTH" />x<ph name="HEIGHT" />) <ph name="MEGAPIXEL" /> megapíxels</translation> <translation id="6681668084120808868">Fes una foto</translation> <translation id="6778482348691154169">No es pot fer la foto</translation> <translation id="6965382102122355670">D'acord</translation> <translation id="698156982839284926">3 segons</translation> <translation id="712848772518857951">Confirmes que vols suprimir <ph name="COUNT" /> elements?</translation> +<translation id="7243947652761655814">Resolució del vídeo</translation> <translation id="7337660886763914220">Hi ha errors al sistema de fitxers.</translation> <translation id="7557677699350329807">Canvia a la càmera següent</translation> <translation id="7608223098072244877">4 per 4</translation> @@ -56,6 +64,7 @@ <translation id="8145038249676204903">Canvia al mode per fer fotos</translation> <translation id="8261506727792406068">Suprimeix</translation> <translation id="8428213095426709021">Configuració</translation> +<translation id="8687491812650032292">HD de <ph name="HEIGHT" />p (<ph name="WIDTH" />:<ph name="HEIGHT" />)</translation> <translation id="8815966864175525708">Botó per fer una foto vertical</translation> <translation id="8870695351537079478">No es pot iniciar la gravació</translation> <translation id="9045155556724273246">10 segons</translation>
diff --git a/chrome/browser/resources/chromeos/camera/src/strings/camera_strings_cs.xtb b/chrome/browser/resources/chromeos/camera/src/strings/camera_strings_cs.xtb index 96d13159..4eb5565 100644 --- a/chrome/browser/resources/chromeos/camera/src/strings/camera_strings_cs.xtb +++ b/chrome/browser/resources/chromeos/camera/src/strings/camera_strings_cs.xtb
@@ -8,6 +8,7 @@ <translation id="1627744224761163218">4 × 4</translation> <translation id="1664224225747386870">Nic nebylo zaznamenáno</translation> <translation id="1862930711583847113">Soubor <ph name="FILE" /> nelze exportovat</translation> +<translation id="1899697626337024495">Rozlišení fotografií</translation> <translation id="2008689030244369546">Úplně nový vzhled</translation> <translation id="2036868001356139588">Trvání časovače</translation> <translation id="2050339315714019657">Na výšku</translation> @@ -17,18 +18,22 @@ <translation id="2501853267655415902">Nahrávání bylo zastaveno</translation> <translation id="2501953888035679275">Foťte a nahrávejte videa pomocí fotoaparátu.</translation> <translation id="2549985041256363841">Zahájit nahrávání</translation> +<translation id="2599796128805996109">Zadní fotoaparát</translation> <translation id="2968794441791257519">Fotky a videa pořízená fotoaparátem se přesunou do složky stažených souborů. Najdete je v aplikaci Soubory. K vašim fotkám a videím budou mít přístup aplikace s oprávněním k úložišti.</translation> <translation id="3081586908890909590">Přepnout na záznam videa</translation> <translation id="3183731565330012717">Typ mřížky</translation> <translation id="3227137524299004712">Mikrofon</translation> +<translation id="3259149966178251584">Rozlišení fotoaparátu</translation> <translation id="3517926952904427380">Portrétovou fotku nelze pořídit</translation> <translation id="3569311554794739032">Opravdu soubor <ph name="FILE" /> chcete odstranit?</translation> <translation id="3810838688059735925">Video</translation> <translation id="4279490309300973883">Zrcadlení</translation> <translation id="4329152592498422850">Přepnout na pořízení čtvercové fotky</translation> <translation id="4445542136948522167">Zastavit focení</translation> +<translation id="4497569853498380347">(<ph name="ASPECT_RATIO_WIDTH" /> : <ph name="ASPECT_RATIO_HEIGHT" />) <ph name="MEGAPIXEL" /> Mpx</translation> +<translation id="4570032796877367747">Přední fotoaparát</translation> <translation id="4628948037717959914">Fotka</translation> <translation id="4649291346448517080">Soubor se nepodařilo uložit</translation> <translation id="4890010094662541459">3 × 3</translation> @@ -42,11 +47,14 @@ <translation id="6165508094623778733">Další informace</translation> <translation id="6233780560267770709">3 krát 3</translation> <translation id="6243827288366940320">Zlatý řez</translation> +<translation id="6248749904681914629">Externí fotoaparát</translation> +<translation id="6420689864531458495">(<ph name="ASPECT_RATIO_WIDTH" /> : <ph name="ASPECT_RATIO_HEIGHT" /> – <ph name="WIDTH" /> × <ph name="HEIGHT" />) <ph name="MEGAPIXEL" /> Mpx</translation> <translation id="6681668084120808868">Vyfotit</translation> <translation id="6778482348691154169">Fotku se nepodařilo pořídit</translation> <translation id="6965382102122355670">OK</translation> <translation id="698156982839284926">3 sekundy</translation> <translation id="712848772518857951">Opravdu chcete tyto položky (<ph name="COUNT" />) odstranit?</translation> +<translation id="7243947652761655814">Rozlišení videa</translation> <translation id="7337660886763914220">Chyby systému souborů.</translation> <translation id="7557677699350329807">Přepnout na další fotoaparát</translation> <translation id="7608223098072244877">4 krát 4</translation> @@ -56,6 +64,7 @@ <translation id="8145038249676204903">Přepnout na focení</translation> <translation id="8261506727792406068">Smazat</translation> <translation id="8428213095426709021">Nastavení</translation> +<translation id="8687491812650032292">HD <ph name="HEIGHT" />p (<ph name="WIDTH" /> × <ph name="HEIGHT" />)</translation> <translation id="8815966864175525708">Přepnout na pořízení portrétové fotky</translation> <translation id="8870695351537079478">Nahrávání se nepodařilo zahájit</translation> <translation id="9045155556724273246">10 sekund</translation>
diff --git a/chrome/browser/resources/chromeos/camera/src/strings/camera_strings_el.xtb b/chrome/browser/resources/chromeos/camera/src/strings/camera_strings_el.xtb index 0ac2191..cd8af70 100644 --- a/chrome/browser/resources/chromeos/camera/src/strings/camera_strings_el.xtb +++ b/chrome/browser/resources/chromeos/camera/src/strings/camera_strings_el.xtb
@@ -8,6 +8,7 @@ <translation id="1627744224761163218">4 x 4</translation> <translation id="1664224225747386870">Καμία εγγραφή</translation> <translation id="1862930711583847113">Δεν είναι δυνατή η εξαγωγή του αρχείου <ph name="FILE" /></translation> +<translation id="1899697626337024495">Ανάλυση φωτογραφίας</translation> <translation id="2008689030244369546">Μια ολοκαίνουργια εμφάνιση</translation> <translation id="2036868001356139588">Διάρκεια χρονομέτρου</translation> <translation id="2050339315714019657">Κάθετα</translation> @@ -17,18 +18,22 @@ <translation id="2501853267655415902">Η εγγραφή διακόπηκε</translation> <translation id="2501953888035679275">Τραβήξτε φωτογραφίες και βίντεο με την κάμερά σας.</translation> <translation id="2549985041256363841">Έναρξη εγγραφής</translation> +<translation id="2599796128805996109">Πίσω κάμερα</translation> <translation id="2968794441791257519">Οι φωτογραφίες και τα βίντεο που λήφθηκαν με την κάμερα θα μετακινηθούν στον φάκελο "Λήψεις". Μπορείτε να αποκτήσετε πρόσβαση σε αυτά στα Αρχεία. Οι εφαρμογές με άδειες αποθηκευτικού χώρου θα έχουν πρόσβαση στις φωτογραφίες και τα βίντεό σας.</translation> <translation id="3081586908890909590">Μετάβαση στη λειτουργία εγγραφής βίντεο</translation> <translation id="3183731565330012717">Τύπος πλέγματος</translation> <translation id="3227137524299004712">Μικρόφωνο</translation> +<translation id="3259149966178251584">Ανάλυση κάμερας</translation> <translation id="3517926952904427380">Δεν είναι δυνατή η λήψη φωτογραφίας πορτραίτου.</translation> <translation id="3569311554794739032">Είστε βέβαιοι ότι θέλετε να καταργήσετε το αρχείο <ph name="FILE" />;</translation> <translation id="3810838688059735925">Βίντεο</translation> <translation id="4279490309300973883">Κατοπτρισμός</translation> <translation id="4329152592498422850">Μετάβαση στη λειτουργία λήψης τετράγωνης φωτογραφίας</translation> <translation id="4445542136948522167">Διακοπή λήψης φωτογραφίας</translation> +<translation id="4497569853498380347">(<ph name="ASPECT_RATIO_WIDTH" />:<ph name="ASPECT_RATIO_HEIGHT" />) <ph name="MEGAPIXEL" /> megapixel</translation> +<translation id="4570032796877367747">Μπροστινή κάμερα</translation> <translation id="4628948037717959914">Φωτογραφία</translation> <translation id="4649291346448517080">Δεν είναι δυνατή η αποθήκευση του αρχείου</translation> <translation id="4890010094662541459">3 x 3</translation> @@ -42,11 +47,14 @@ <translation id="6165508094623778733">Μάθετε περισσότερα</translation> <translation id="6233780560267770709">3 επί 3</translation> <translation id="6243827288366940320">Ιδανικός λόγος διαστάσεων</translation> +<translation id="6248749904681914629">Εξωτερική κάμερα</translation> +<translation id="6420689864531458495">(<ph name="ASPECT_RATIO_WIDTH" />:<ph name="ASPECT_RATIO_HEIGHT" /> - <ph name="WIDTH" />x<ph name="HEIGHT" />) <ph name="MEGAPIXEL" /> megapixel</translation> <translation id="6681668084120808868">Λήψη φωτογραφίας</translation> <translation id="6778482348691154169">Δεν είναι δυνατή η λήψη φωτογραφίας</translation> <translation id="6965382102122355670">OK</translation> <translation id="698156982839284926">3 δευτερόλεπτα</translation> <translation id="712848772518857951">Είστε βέβαιοι ότι θέλετε να καταργήσετε <ph name="COUNT" /> στοιχεία;</translation> +<translation id="7243947652761655814">Ανάλυση βίντεο</translation> <translation id="7337660886763914220">Σφάλματα συστήματος αρχείων.</translation> <translation id="7557677699350329807">Μετάβαση στην επόμενη κάμερα</translation> <translation id="7608223098072244877">4 επί 4</translation> @@ -56,6 +64,7 @@ <translation id="8145038249676204903">Μετάβαση στη λειτουργία λήψης φωτογραφίας</translation> <translation id="8261506727792406068">Διαγραφή</translation> <translation id="8428213095426709021">Ρυθμίσεις</translation> +<translation id="8687491812650032292">HD <ph name="HEIGHT" />p (<ph name="WIDTH" />:<ph name="HEIGHT" />)</translation> <translation id="8815966864175525708">Μετάβαση στη λειτουργία λήψης φωτογραφίας πορτραίτου</translation> <translation id="8870695351537079478">Δεν είναι δυνατή η έναρξη της εγγραφής</translation> <translation id="9045155556724273246">10 δευτερόλεπτα</translation>
diff --git a/chrome/browser/resources/chromeos/camera/src/strings/camera_strings_en-GB.xtb b/chrome/browser/resources/chromeos/camera/src/strings/camera_strings_en-GB.xtb index 38d51f9..142c46b 100644 --- a/chrome/browser/resources/chromeos/camera/src/strings/camera_strings_en-GB.xtb +++ b/chrome/browser/resources/chromeos/camera/src/strings/camera_strings_en-GB.xtb
@@ -8,6 +8,7 @@ <translation id="1627744224761163218">4 x 4</translation> <translation id="1664224225747386870">Nothing recorded</translation> <translation id="1862930711583847113">Unable to export <ph name="FILE" /></translation> +<translation id="1899697626337024495">Photo resolution</translation> <translation id="2008689030244369546">A whole new look</translation> <translation id="2036868001356139588">Timer duration</translation> <translation id="2050339315714019657">Portrait</translation> @@ -17,18 +18,22 @@ <translation id="2501853267655415902">Recording stopped</translation> <translation id="2501953888035679275">Take photos and record videos with your camera.</translation> <translation id="2549985041256363841">Start recording</translation> +<translation id="2599796128805996109">Back camera</translation> <translation id="2968794441791257519">Photos and videos taken with the camera will be moved to the Downloads folder. You can access them in Files. Apps with storage permissions will have access to your photos and videos.</translation> <translation id="3081586908890909590">Switch to record video</translation> <translation id="3183731565330012717">Grid type</translation> <translation id="3227137524299004712">Microphone</translation> +<translation id="3259149966178251584">Camera resolution</translation> <translation id="3517926952904427380">Unable to take portrait photo</translation> <translation id="3569311554794739032">Do you really want to remove <ph name="FILE" />?</translation> <translation id="3810838688059735925">Video</translation> <translation id="4279490309300973883">Mirroring</translation> <translation id="4329152592498422850">Switch to take square photo</translation> <translation id="4445542136948522167">Stop taking photo</translation> +<translation id="4497569853498380347">(<ph name="ASPECT_RATIO_WIDTH" />:<ph name="ASPECT_RATIO_HEIGHT" />) <ph name="MEGAPIXEL" /> mega pixel</translation> +<translation id="4570032796877367747">Front camera</translation> <translation id="4628948037717959914">Photo</translation> <translation id="4649291346448517080">Unable to save the file</translation> <translation id="4890010094662541459">3 x 3</translation> @@ -42,11 +47,14 @@ <translation id="6165508094623778733">Learn more</translation> <translation id="6233780560267770709">3 by 3</translation> <translation id="6243827288366940320">Golden ratio</translation> +<translation id="6248749904681914629">External camera</translation> +<translation id="6420689864531458495">(<ph name="ASPECT_RATIO_WIDTH" />:<ph name="ASPECT_RATIO_HEIGHT" /> - <ph name="WIDTH" />x<ph name="HEIGHT" />) <ph name="MEGAPIXEL" /> mega pixel</translation> <translation id="6681668084120808868">Take photo</translation> <translation id="6778482348691154169">Unable to take photo</translation> <translation id="6965382102122355670">OK</translation> <translation id="698156982839284926">3 seconds</translation> <translation id="712848772518857951">Do you really want to remove <ph name="COUNT" /> items?</translation> +<translation id="7243947652761655814">Video resolution</translation> <translation id="7337660886763914220">File system errors.</translation> <translation id="7557677699350329807">Switch to next camera</translation> <translation id="7608223098072244877">4 by 4</translation> @@ -56,6 +64,7 @@ <translation id="8145038249676204903">Switch to take photo</translation> <translation id="8261506727792406068">Delete</translation> <translation id="8428213095426709021">Settings</translation> +<translation id="8687491812650032292">HD <ph name="HEIGHT" />p (<ph name="WIDTH" />:<ph name="HEIGHT" />)</translation> <translation id="8815966864175525708">Switch to take portrait photo</translation> <translation id="8870695351537079478">Unable to start recording</translation> <translation id="9045155556724273246">10 seconds</translation>
diff --git a/chrome/browser/resources/chromeos/camera/src/strings/camera_strings_et.xtb b/chrome/browser/resources/chromeos/camera/src/strings/camera_strings_et.xtb index c09260b..a19988d 100644 --- a/chrome/browser/resources/chromeos/camera/src/strings/camera_strings_et.xtb +++ b/chrome/browser/resources/chromeos/camera/src/strings/camera_strings_et.xtb
@@ -8,6 +8,7 @@ <translation id="1627744224761163218">4 x 4</translation> <translation id="1664224225747386870">Midagi pole salvestatud</translation> <translation id="1862930711583847113">Faili <ph name="FILE" /> ei saa eksportida</translation> +<translation id="1899697626337024495">Foto eraldusvõime</translation> <translation id="2008689030244369546">Täiesti uus välimus</translation> <translation id="2036868001356139588">Taimeri kestus</translation> <translation id="2050339315714019657">Vertikaalpaigutus</translation> @@ -17,18 +18,22 @@ <translation id="2501853267655415902">Salvestamine on peatatud</translation> <translation id="2501953888035679275">Jäädvustage oma kaameraga fotosid ja salvestage videoid.</translation> <translation id="2549985041256363841">Alusta salvestamist</translation> +<translation id="2599796128805996109">Tagakaamera</translation> <translation id="2968794441791257519">Kaameraga tehtud fotod ja videod teisaldatakse kausta Allalaadimised. Pääsete neile juurde jaotises Failid. Salvestusruumi kasutuse lubadega rakendustel on juurdepääs teie fotodele ja videotele.</translation> <translation id="3081586908890909590">Vaheta video salvestamise režiimile</translation> <translation id="3183731565330012717">Ruudustiku tüüp</translation> <translation id="3227137524299004712">Mikrofon</translation> +<translation id="3259149966178251584">Kaamera eraldusvõime</translation> <translation id="3517926952904427380">Vertikaalpaigutuses fotot ei saa jäädvustada</translation> <translation id="3569311554794739032">Kas soovite faili <ph name="FILE" /> kindlasti eemaldada?</translation> <translation id="3810838688059735925">Video</translation> <translation id="4279490309300973883">Peegeldamine</translation> <translation id="4329152592498422850">Vaheta ruudukujulise foto jäädvustamiseks</translation> <translation id="4445542136948522167">Peata foto jäädvustamine</translation> +<translation id="4497569853498380347">(<ph name="ASPECT_RATIO_WIDTH" /> : <ph name="ASPECT_RATIO_HEIGHT" />) <ph name="MEGAPIXEL" /> megapikslit</translation> +<translation id="4570032796877367747">Esikaamera</translation> <translation id="4628948037717959914">Foto</translation> <translation id="4649291346448517080">Faili salvestamine ebaõnnestus</translation> <translation id="4890010094662541459">3 x 3</translation> @@ -42,11 +47,14 @@ <translation id="6165508094623778733">Lisateave</translation> <translation id="6233780560267770709">3 korda 3</translation> <translation id="6243827288366940320">Kuldlõige</translation> +<translation id="6248749904681914629">Väline kaamera</translation> +<translation id="6420689864531458495">(<ph name="ASPECT_RATIO_WIDTH" />:<ph name="ASPECT_RATIO_HEIGHT" /> – <ph name="WIDTH" /> × <ph name="HEIGHT" />) <ph name="MEGAPIXEL" /> megapikslit</translation> <translation id="6681668084120808868">Tee foto</translation> <translation id="6778482348691154169">Foto jäädvustamine ebaõnnestus</translation> <translation id="6965382102122355670">OK</translation> <translation id="698156982839284926">3 sekundit</translation> <translation id="712848772518857951">Kas soovite kindlasti eemaldada need <ph name="COUNT" /> üksust?</translation> +<translation id="7243947652761655814">Video eraldusvõime</translation> <translation id="7337660886763914220">Failisüsteemi vead.</translation> <translation id="7557677699350329807">Vaheta järgmisele kaamerale</translation> <translation id="7608223098072244877">4 korda 4</translation> @@ -56,6 +64,7 @@ <translation id="8145038249676204903">Vaheta foto jäädvustamise režiimile</translation> <translation id="8261506727792406068">Kustuta</translation> <translation id="8428213095426709021">Seaded</translation> +<translation id="8687491812650032292">HD <ph name="HEIGHT" />p (<ph name="WIDTH" /> : <ph name="HEIGHT" />)</translation> <translation id="8815966864175525708">Vaheta vertikaalpaigutuses foto jäädvustamiseks</translation> <translation id="8870695351537079478">Salvestamise alustamine ebaõnnestus</translation> <translation id="9045155556724273246">10 sekundit</translation>
diff --git a/chrome/browser/resources/chromeos/camera/src/strings/camera_strings_fi.xtb b/chrome/browser/resources/chromeos/camera/src/strings/camera_strings_fi.xtb index 90dc106..754452b 100644 --- a/chrome/browser/resources/chromeos/camera/src/strings/camera_strings_fi.xtb +++ b/chrome/browser/resources/chromeos/camera/src/strings/camera_strings_fi.xtb
@@ -8,6 +8,7 @@ <translation id="1627744224761163218">4x4</translation> <translation id="1664224225747386870">Mitään ei kuvattu</translation> <translation id="1862930711583847113">Vienti epäonnistui: <ph name="FILE" /></translation> +<translation id="1899697626337024495">Kuvaresoluutio</translation> <translation id="2008689030244369546">Uudenlainen ilme</translation> <translation id="2036868001356139588">Ajastimen kesto</translation> <translation id="2050339315714019657">Pystysuunta</translation> @@ -17,18 +18,22 @@ <translation id="2501853267655415902">Tallennus lopetettu</translation> <translation id="2501953888035679275">Ota kuvia ja kuvaa videoita kameralla.</translation> <translation id="2549985041256363841">Aloita tallennus</translation> +<translation id="2599796128805996109">Takakamera</translation> <translation id="2968794441791257519">Kameralla otetut kuvat ja videot siirretään Lataukset-kansioon. Voit käyttää niitä avaamalla Tiedostot. Jos sovelluksella on tallennustilan käyttöoikeus, se voi käyttää kuvia ja videoita.</translation> <translation id="3081586908890909590">Vaihda videon kuvaamiseen</translation> <translation id="3183731565330012717">Ruudukkotyyppi</translation> <translation id="3227137524299004712">Mikrofoni</translation> +<translation id="3259149966178251584">Kameran resoluutio</translation> <translation id="3517926952904427380">Muotokuvan ottaminen epäonnistui</translation> <translation id="3569311554794739032">Haluatko varmasti, että <ph name="FILE" /> poistetaan?</translation> <translation id="3810838688059735925">Video</translation> <translation id="4279490309300973883">Peilaus päällä</translation> <translation id="4329152592498422850">Vaihda neliökuviin</translation> <translation id="4445542136948522167">Lopeta kuvan ottaminen</translation> +<translation id="4497569853498380347">(<ph name="ASPECT_RATIO_WIDTH" />:<ph name="ASPECT_RATIO_HEIGHT" />) <ph name="MEGAPIXEL" /> megapikseliä</translation> +<translation id="4570032796877367747">Etukamera</translation> <translation id="4628948037717959914">Valokuva</translation> <translation id="4649291346448517080">Tiedoston tallennus epäonnistui.</translation> <translation id="4890010094662541459">3x3</translation> @@ -42,11 +47,14 @@ <translation id="6165508094623778733">Lisätietoja</translation> <translation id="6233780560267770709">3x3</translation> <translation id="6243827288366940320">Kultainen leikkaus</translation> +<translation id="6248749904681914629">Ulkoinen kamera</translation> +<translation id="6420689864531458495">(<ph name="ASPECT_RATIO_WIDTH" />:<ph name="ASPECT_RATIO_HEIGHT" /> – <ph name="WIDTH" />x<ph name="HEIGHT" />) <ph name="MEGAPIXEL" /> megapikseliä</translation> <translation id="6681668084120808868">Ota valokuva</translation> <translation id="6778482348691154169">Kuvan ottaminen epäonnistui</translation> <translation id="6965382102122355670">OK</translation> <translation id="698156982839284926">3 sekuntia</translation> <translation id="712848772518857951">Haluatko varmasti poistaa <ph name="COUNT" /> kohdetta?</translation> +<translation id="7243947652761655814">Videon resoluutio</translation> <translation id="7337660886763914220">Tiedostojärjestelmän virheitä</translation> <translation id="7557677699350329807">Vaihda seuraavaan kameraan</translation> <translation id="7608223098072244877">4x4</translation> @@ -56,6 +64,7 @@ <translation id="8145038249676204903">Vaihda kuvan ottamiseen</translation> <translation id="8261506727792406068">Poista</translation> <translation id="8428213095426709021">Asetukset</translation> +<translation id="8687491812650032292">HD <ph name="HEIGHT" />p (<ph name="WIDTH" />:<ph name="HEIGHT" />)</translation> <translation id="8815966864175525708">Vaihda muotokuvatilaan</translation> <translation id="8870695351537079478">Tallennuksen aloittaminen epäonnistui</translation> <translation id="9045155556724273246">10 sekuntia</translation>
diff --git a/chrome/browser/resources/chromeos/camera/src/strings/camera_strings_fr.xtb b/chrome/browser/resources/chromeos/camera/src/strings/camera_strings_fr.xtb index e60f345..a998576 100644 --- a/chrome/browser/resources/chromeos/camera/src/strings/camera_strings_fr.xtb +++ b/chrome/browser/resources/chromeos/camera/src/strings/camera_strings_fr.xtb
@@ -8,6 +8,7 @@ <translation id="1627744224761163218">4 x 4</translation> <translation id="1664224225747386870">Aucune donnée enregistrée</translation> <translation id="1862930711583847113">Impossible d'exporter <ph name="FILE" /></translation> +<translation id="1899697626337024495">Résolution photo</translation> <translation id="2008689030244369546">Une apparence entièrement repensée</translation> <translation id="2036868001356139588">Durée du minuteur</translation> <translation id="2050339315714019657">Portrait</translation> @@ -17,18 +18,22 @@ <translation id="2501853267655415902">Enregistrement interrompu</translation> <translation id="2501953888035679275">Prenez des photos et enregistrez des vidéos avec votre appareil photo.</translation> <translation id="2549985041256363841">Démarrer l'enregistrement</translation> +<translation id="2599796128805996109">Appareil photo arrière</translation> <translation id="2968794441791257519">Les photos et les vidéos prises avec l'appareil photo seront déplacées vers le dossier "Téléchargements". Vous pouvez y accéder via l'application Fichiers. Les applications disposant d'autorisations d'accès à l'espace de stockage pourront accéder à vos photos et vidéos.</translation> <translation id="3081586908890909590">Passer à l'enregistrement de vidéo</translation> <translation id="3183731565330012717">Type de grille</translation> <translation id="3227137524299004712">Micro</translation> +<translation id="3259149966178251584">Résolution de l'appareil photo</translation> <translation id="3517926952904427380">Impossible de prendre une photo en mode portrait</translation> <translation id="3569311554794739032">Voulez-vous vraiment supprimer <ph name="FILE" /> ?</translation> <translation id="3810838688059735925">Vidéo</translation> <translation id="4279490309300973883">Mise en miroir</translation> <translation id="4329152592498422850">Bouton permettant de prendre une photo carrée</translation> <translation id="4445542136948522167">Arrêter de prendre la photo</translation> +<translation id="4497569853498380347">(<ph name="ASPECT_RATIO_WIDTH" />:<ph name="ASPECT_RATIO_HEIGHT" />) <ph name="MEGAPIXEL" /> mégapixels</translation> +<translation id="4570032796877367747">Appareil photo avant</translation> <translation id="4628948037717959914">Photo</translation> <translation id="4649291346448517080">Impossible d'enregistrer le fichier</translation> <translation id="4890010094662541459">3 x 3</translation> @@ -42,11 +47,14 @@ <translation id="6165508094623778733">En savoir plus</translation> <translation id="6233780560267770709">3 par 3</translation> <translation id="6243827288366940320">Ratio optimal</translation> +<translation id="6248749904681914629">Appareil photo externe</translation> +<translation id="6420689864531458495">(<ph name="ASPECT_RATIO_WIDTH" />:<ph name="ASPECT_RATIO_HEIGHT" /> - <ph name="WIDTH" /> × <ph name="HEIGHT" />) <ph name="MEGAPIXEL" /> mégapixels</translation> <translation id="6681668084120808868">Prendre une photo</translation> <translation id="6778482348691154169">Impossible de prendre la photo</translation> <translation id="6965382102122355670">OK</translation> <translation id="698156982839284926">3 secondes</translation> <translation id="712848772518857951">Voulez-vous vraiment supprimer <ph name="COUNT" /> éléments ?</translation> +<translation id="7243947652761655814">Résolution vidéo</translation> <translation id="7337660886763914220">Erreurs du système de fichiers.</translation> <translation id="7557677699350329807">Passer à la caméra suivante</translation> <translation id="7608223098072244877">4 par 4</translation> @@ -56,6 +64,7 @@ <translation id="8145038249676204903">Passer à la prise de photo</translation> <translation id="8261506727792406068">Supprimer</translation> <translation id="8428213095426709021">Paramètres</translation> +<translation id="8687491812650032292">HD <ph name="HEIGHT" />p (<ph name="WIDTH" />:<ph name="HEIGHT" />)</translation> <translation id="8815966864175525708">Bouton permettant de prendre une photo en mode portrait</translation> <translation id="8870695351537079478">Impossible de démarrer l'enregistrement</translation> <translation id="9045155556724273246">10 secondes</translation>
diff --git a/chrome/browser/resources/chromeos/camera/src/strings/camera_strings_hr.xtb b/chrome/browser/resources/chromeos/camera/src/strings/camera_strings_hr.xtb index 013a907..79bd294 100644 --- a/chrome/browser/resources/chromeos/camera/src/strings/camera_strings_hr.xtb +++ b/chrome/browser/resources/chromeos/camera/src/strings/camera_strings_hr.xtb
@@ -8,6 +8,7 @@ <translation id="1627744224761163218">4 x 4</translation> <translation id="1664224225747386870">Nije snimljeno ništa</translation> <translation id="1862930711583847113">Izvoz datoteke <ph name="FILE" /> nije moguć</translation> +<translation id="1899697626337024495">Razlučivost fotografije</translation> <translation id="2008689030244369546">Potpuno novi izgled</translation> <translation id="2036868001356139588">Trajanje odbrojavanja</translation> <translation id="2050339315714019657">Portret</translation> @@ -17,18 +18,22 @@ <translation id="2501853267655415902">Snimanje je zaustavljeno</translation> <translation id="2501953888035679275">Snimajte fotografije i videozapise svojim fotoaparatom.</translation> <translation id="2549985041256363841">Početak snimanja</translation> +<translation id="2599796128805996109">Stražnji fotoaparat</translation> <translation id="2968794441791257519">Fotografije i videozapisi snimljeni fotoaparatom premjestit će se u mapu Preuzimanja. Možete im pristupiti u Datotekama. Aplikacije s dopuštenjima za pohranu imat će pristup vašim fotografijama i videozapisima.</translation> <translation id="3081586908890909590">Prijeđi na snimanje videozapisa</translation> <translation id="3183731565330012717">Vrsta rešetke</translation> <translation id="3227137524299004712">Mikrofon</translation> +<translation id="3259149966178251584">Razlučivost fotoaparata</translation> <translation id="3517926952904427380">Snimanje portretne fotografije nije uspjelo</translation> <translation id="3569311554794739032">Želite li doista ukloniti datoteku <ph name="FILE" />?</translation> <translation id="3810838688059735925">Video</translation> <translation id="4279490309300973883">Zrcaljenje</translation> <translation id="4329152592498422850">Prijeđi na snimanje kvadratne fotografije</translation> <translation id="4445542136948522167">Zaustavi snimanje fotografije</translation> +<translation id="4497569853498380347">(<ph name="ASPECT_RATIO_WIDTH" />:<ph name="ASPECT_RATIO_HEIGHT" />) <ph name="MEGAPIXEL" /> megapiksel</translation> +<translation id="4570032796877367747">Prednji fotoaparat</translation> <translation id="4628948037717959914">Fotografija</translation> <translation id="4649291346448517080">Spremanje datoteke nije uspjelo</translation> <translation id="4890010094662541459">3 x 3</translation> @@ -42,11 +47,14 @@ <translation id="6165508094623778733">Saznajte više</translation> <translation id="6233780560267770709">Tri puta tri</translation> <translation id="6243827288366940320">Zlatni rez</translation> +<translation id="6248749904681914629">Vanjski fotoaparat</translation> +<translation id="6420689864531458495">(<ph name="ASPECT_RATIO_WIDTH" />:<ph name="ASPECT_RATIO_HEIGHT" /> - <ph name="WIDTH" />x<ph name="HEIGHT" />) <ph name="MEGAPIXEL" /> megapiksel</translation> <translation id="6681668084120808868">Snimite fotografiju</translation> <translation id="6778482348691154169">Snimanje fotografije nije uspjelo</translation> <translation id="6965382102122355670">U redu</translation> <translation id="698156982839284926">Tri sekunde</translation> <translation id="712848772518857951">Želite li doista ukloniti stavke (njih <ph name="COUNT" />)?</translation> +<translation id="7243947652761655814">Razlučivost videozapisa</translation> <translation id="7337660886763914220">Pogreške datotečnog sustava.</translation> <translation id="7557677699350329807">Prijeđi na sljedeći fotoaparat</translation> <translation id="7608223098072244877">4 puta 4</translation> @@ -56,6 +64,7 @@ <translation id="8145038249676204903">Prijeđi na snimanje fotografije</translation> <translation id="8261506727792406068">Izbriši</translation> <translation id="8428213095426709021">Postavke</translation> +<translation id="8687491812650032292">HD <ph name="HEIGHT" />p (<ph name="WIDTH" />:<ph name="HEIGHT" />)</translation> <translation id="8815966864175525708">Prijeđi na snimanje portretne fotografije</translation> <translation id="8870695351537079478">Pokretanje snimanja nije uspjelo</translation> <translation id="9045155556724273246">Deset sekundi</translation>
diff --git a/chrome/browser/resources/chromeos/camera/src/strings/camera_strings_hu.xtb b/chrome/browser/resources/chromeos/camera/src/strings/camera_strings_hu.xtb index 47677e8a..d0ed095 100644 --- a/chrome/browser/resources/chromeos/camera/src/strings/camera_strings_hu.xtb +++ b/chrome/browser/resources/chromeos/camera/src/strings/camera_strings_hu.xtb
@@ -8,6 +8,7 @@ <translation id="1627744224761163218">4 × 4</translation> <translation id="1664224225747386870">A kamera semmit sem rögzített</translation> <translation id="1862930711583847113">Nem lehet exportálni: <ph name="FILE" /></translation> +<translation id="1899697626337024495">Fotó felbontása</translation> <translation id="2008689030244369546">Teljesen új külső</translation> <translation id="2036868001356139588">Időzítés hossza</translation> <translation id="2050339315714019657">Álló</translation> @@ -17,18 +18,22 @@ <translation id="2501853267655415902">A felvétel leállt</translation> <translation id="2501953888035679275">Fotókat és videókat készíthet a kamerával.</translation> <translation id="2549985041256363841">Felvétel megkezdése</translation> +<translation id="2599796128805996109">Hátsó kamera</translation> <translation id="2968794441791257519">A kamerával készített fotók és videók a Letöltések mappába kerülnek. A Fájlok alkalmazásban férhet hozzájuk. A tárhelyengedéllyel rendelkező alkalmazások hozzáférhetnek a fotókhoz és a videókhoz.</translation> <translation id="3081586908890909590">Váltás videófelvételre</translation> <translation id="3183731565330012717">Rács típusa</translation> <translation id="3227137524299004712">Mikrofon</translation> +<translation id="3259149966178251584">Kamera felbontása</translation> <translation id="3517926952904427380">Nem sikerült álló fényképet készíteni</translation> <translation id="3569311554794739032">Biztosan eltávolítja a következő fájlt: <ph name="FILE" />?</translation> <translation id="3810838688059735925">Videó</translation> <translation id="4279490309300973883">Tükrözés</translation> <translation id="4329152592498422850">Váltás négyzet alakú fotó készítésére</translation> <translation id="4445542136948522167">Fotókészítés leállítása</translation> +<translation id="4497569853498380347">(<ph name="ASPECT_RATIO_WIDTH" />:<ph name="ASPECT_RATIO_HEIGHT" />) <ph name="MEGAPIXEL" /> megapixel</translation> +<translation id="4570032796877367747">Elülső kamera</translation> <translation id="4628948037717959914">Fénykép</translation> <translation id="4649291346448517080">Nem sikerült menteni a fájlt</translation> <translation id="4890010094662541459">3 × 3</translation> @@ -42,11 +47,14 @@ <translation id="6165508094623778733">További információ</translation> <translation id="6233780560267770709">Háromszor hármas</translation> <translation id="6243827288366940320">Aranymetszés</translation> +<translation id="6248749904681914629">Külső kamera</translation> +<translation id="6420689864531458495">(<ph name="ASPECT_RATIO_WIDTH" />:<ph name="ASPECT_RATIO_HEIGHT" /> – <ph name="WIDTH" /> × <ph name="HEIGHT" />) <ph name="MEGAPIXEL" /> megapixel</translation> <translation id="6681668084120808868">Fényképkészítés</translation> <translation id="6778482348691154169">Nem sikerült elkészíteni a fotót</translation> <translation id="6965382102122355670">OK</translation> <translation id="698156982839284926">3 másodperc</translation> <translation id="712848772518857951">Biztosan eltávolít <ph name="COUNT" /> elemet?</translation> +<translation id="7243947652761655814">Videó felbontása</translation> <translation id="7337660886763914220">Fájlrendszerbeli hibák.</translation> <translation id="7557677699350329807">Váltás a következő kamerára</translation> <translation id="7608223098072244877">Négyszer négyes</translation> @@ -56,6 +64,7 @@ <translation id="8145038249676204903">Váltás fotókészítésre</translation> <translation id="8261506727792406068">Törlés</translation> <translation id="8428213095426709021">Beállítások</translation> +<translation id="8687491812650032292">HD <ph name="HEIGHT" />p (<ph name="WIDTH" /> × <ph name="HEIGHT" />)</translation> <translation id="8815966864175525708">Váltás álló fotó készítésére</translation> <translation id="8870695351537079478">Nem sikerült elindítani a felvételt.</translation> <translation id="9045155556724273246">10 másodperc</translation>
diff --git a/chrome/browser/resources/chromeos/camera/src/strings/camera_strings_it.xtb b/chrome/browser/resources/chromeos/camera/src/strings/camera_strings_it.xtb index d097c45..79b16fc 100644 --- a/chrome/browser/resources/chromeos/camera/src/strings/camera_strings_it.xtb +++ b/chrome/browser/resources/chromeos/camera/src/strings/camera_strings_it.xtb
@@ -8,6 +8,7 @@ <translation id="1627744224761163218">4 x 4</translation> <translation id="1664224225747386870">Nessun dato registrato</translation> <translation id="1862930711583847113">Impossibile esportare <ph name="FILE" /></translation> +<translation id="1899697626337024495">Risoluzione foto</translation> <translation id="2008689030244369546">Un look totalmente nuovo</translation> <translation id="2036868001356139588">Durata del timer</translation> <translation id="2050339315714019657">Verticale</translation> @@ -17,18 +18,22 @@ <translation id="2501853267655415902">Registrazione interrotta</translation> <translation id="2501953888035679275">Realizza foto e video con la tua fotocamera.</translation> <translation id="2549985041256363841">Avvia registrazione</translation> +<translation id="2599796128805996109">Fotocamera posteriore</translation> <translation id="2968794441791257519">Le foto e i video acquisiti con la fotocamera verranno spostati nella cartella Download e potrai accedervi dall'app File. Le app con autorizzazioni di accesso allo spazio di archiviazione potranno accedere alle foto e ai video.</translation> <translation id="3081586908890909590">Passa alla modalità video</translation> <translation id="3183731565330012717">Tipo di griglia</translation> <translation id="3227137524299004712">Microfono</translation> +<translation id="3259149966178251584">Risoluzione della fotocamera</translation> <translation id="3517926952904427380">Impossibile scattare foto verticale</translation> <translation id="3569311554794739032">Vuoi rimuovere <ph name="FILE" />?</translation> <translation id="3810838688059735925">Video</translation> <translation id="4279490309300973883">Mirroring</translation> <translation id="4329152592498422850">Passa alla modalità foto quadrata</translation> <translation id="4445542136948522167">Interrompi acquisizione foto</translation> +<translation id="4497569853498380347">(<ph name="ASPECT_RATIO_WIDTH" />:<ph name="ASPECT_RATIO_HEIGHT" />) <ph name="MEGAPIXEL" /> megapixel</translation> +<translation id="4570032796877367747">Fotocamera anteriore</translation> <translation id="4628948037717959914">Foto</translation> <translation id="4649291346448517080">Impossibile salvare il file</translation> <translation id="4890010094662541459">3 x 3</translation> @@ -42,11 +47,14 @@ <translation id="6165508094623778733">Ulteriori informazioni</translation> <translation id="6233780560267770709">3 x 3</translation> <translation id="6243827288366940320">Sezione aurea</translation> +<translation id="6248749904681914629">Videocamera esterna</translation> +<translation id="6420689864531458495">(<ph name="ASPECT_RATIO_WIDTH" />:<ph name="ASPECT_RATIO_HEIGHT" /> - <ph name="WIDTH" />x<ph name="HEIGHT" />) <ph name="MEGAPIXEL" /> megapixel</translation> <translation id="6681668084120808868">Scatta foto</translation> <translation id="6778482348691154169">Impossibile scattare una foto</translation> <translation id="6965382102122355670">OK</translation> <translation id="698156982839284926">3 secondi</translation> <translation id="712848772518857951">Vuoi rimuovere <ph name="COUNT" /> elementi?</translation> +<translation id="7243947652761655814">Risoluzione video</translation> <translation id="7337660886763914220">Errori del file system.</translation> <translation id="7557677699350329807">Passa alla fotocamera successiva</translation> <translation id="7608223098072244877">4 x 4</translation> @@ -56,6 +64,7 @@ <translation id="8145038249676204903">Passa alla modalità foto</translation> <translation id="8261506727792406068">Elimina</translation> <translation id="8428213095426709021">Impostazioni</translation> +<translation id="8687491812650032292">HD <ph name="HEIGHT" />p (<ph name="WIDTH" />:<ph name="HEIGHT" />)</translation> <translation id="8815966864175525708">Passa alla modalità foto verticale</translation> <translation id="8870695351537079478">Impossibile avviare la registrazione</translation> <translation id="9045155556724273246">10 secondi</translation>
diff --git a/chrome/browser/resources/chromeos/camera/src/strings/camera_strings_lt.xtb b/chrome/browser/resources/chromeos/camera/src/strings/camera_strings_lt.xtb index 3786941e..cf86894f 100644 --- a/chrome/browser/resources/chromeos/camera/src/strings/camera_strings_lt.xtb +++ b/chrome/browser/resources/chromeos/camera/src/strings/camera_strings_lt.xtb
@@ -8,6 +8,7 @@ <translation id="1627744224761163218">4 x 4</translation> <translation id="1664224225747386870">Nieko neįrašyta</translation> <translation id="1862930711583847113">Nepavyko eksportuoti „<ph name="FILE" />“</translation> +<translation id="1899697626337024495">Nuotraukos skyra</translation> <translation id="2008689030244369546">Visiškai nauja išvaizda</translation> <translation id="2036868001356139588">Laikmačio trukmė</translation> <translation id="2050339315714019657">Stačias</translation> @@ -17,18 +18,22 @@ <translation id="2501853267655415902">Įrašas sustabdytas</translation> <translation id="2501953888035679275">Fotografuokite ir filmuokite naudodami fotoaparatą.</translation> <translation id="2549985041256363841">Pradėti įrašymą</translation> +<translation id="2599796128805996109">Užpakalinis fotoaparatas</translation> <translation id="2968794441791257519">Nuotraukos ir vaizdo įrašai, sukurti naudojant fotoaparatą, bus perkelti į aplanką „Atsisiuntimai“. Juos galite pasiekti Failų programoje. Programos su saugyklos leidimais galės pasiekti jūsų nuotraukas ir vaizdo įrašus.</translation> <translation id="3081586908890909590">Perjungti į filmavimo režimą</translation> <translation id="3183731565330012717">Tinklelio tipas</translation> <translation id="3227137524299004712">Mikrofonas</translation> +<translation id="3259149966178251584">Fotoaparato skyra</translation> <translation id="3517926952904427380">Nepavyko nufotografuoti portretinės nuotraukos</translation> <translation id="3569311554794739032">Ar tikrai norite pašalinti „<ph name="FILE" />“?</translation> <translation id="3810838688059735925">Vaizdo</translation> <translation id="4279490309300973883">Dubliuojama</translation> <translation id="4329152592498422850">Perjungti į kvadratinės nuotraukos režimą</translation> <translation id="4445542136948522167">Sustabdyti fotografavimą</translation> +<translation id="4497569853498380347">(<ph name="ASPECT_RATIO_WIDTH" />:<ph name="ASPECT_RATIO_HEIGHT" />) <ph name="MEGAPIXEL" /> megapiks.</translation> +<translation id="4570032796877367747">Priekinis fotoaparatas</translation> <translation id="4628948037717959914">Nuotrauka</translation> <translation id="4649291346448517080">Nepavyko išsaugoti failo</translation> <translation id="4890010094662541459">3 x 3</translation> @@ -42,11 +47,14 @@ <translation id="6165508094623778733">Sužinokite daugiau</translation> <translation id="6233780560267770709">3 iš 3</translation> <translation id="6243827288366940320">Geriausias įvertinimas</translation> +<translation id="6248749904681914629">Išorinis fotoaparatas</translation> +<translation id="6420689864531458495">(<ph name="ASPECT_RATIO_WIDTH" />:<ph name="ASPECT_RATIO_HEIGHT" /> – <ph name="WIDTH" />x<ph name="HEIGHT" />) <ph name="MEGAPIXEL" /> megapiks.</translation> <translation id="6681668084120808868">Fotografuoti</translation> <translation id="6778482348691154169">Nepavyko nufotografuoti</translation> <translation id="6965382102122355670">Gerai</translation> <translation id="698156982839284926">3 sekundės</translation> <translation id="712848772518857951">Ar tikrai norite pašalinti <ph name="COUNT" /> element.?</translation> +<translation id="7243947652761655814">Vaizdo įrašo skyra</translation> <translation id="7337660886763914220">Failų sistemos klaidos.</translation> <translation id="7557677699350329807">Perjungti į kitą fotoaparatą</translation> <translation id="7608223098072244877">4 iš 4</translation> @@ -56,6 +64,7 @@ <translation id="8145038249676204903">Perjungti į fotografavimo režimą</translation> <translation id="8261506727792406068">Ištrinti</translation> <translation id="8428213095426709021">Nustatymai</translation> +<translation id="8687491812650032292">HD <ph name="HEIGHT" /> p (<ph name="WIDTH" />:<ph name="HEIGHT" />)</translation> <translation id="8815966864175525708">Perjungti į portretinės nuotraukos režimą</translation> <translation id="8870695351537079478">Nepavyko pradėti įrašymo</translation> <translation id="9045155556724273246">10 sek.</translation>
diff --git a/chrome/browser/resources/chromeos/camera/src/strings/camera_strings_lv.xtb b/chrome/browser/resources/chromeos/camera/src/strings/camera_strings_lv.xtb index 84321d4..5491770c 100644 --- a/chrome/browser/resources/chromeos/camera/src/strings/camera_strings_lv.xtb +++ b/chrome/browser/resources/chromeos/camera/src/strings/camera_strings_lv.xtb
@@ -8,6 +8,7 @@ <translation id="1627744224761163218">4 x 4</translation> <translation id="1664224225747386870">Nekas nav ierakstīts</translation> <translation id="1862930711583847113">Nevar eksportēt failu <ph name="FILE" /></translation> +<translation id="1899697626337024495">Fotoattēlu izšķirtspēja</translation> <translation id="2008689030244369546">Jauns izskats</translation> <translation id="2036868001356139588">Taimera ilgums</translation> <translation id="2050339315714019657">Portrets</translation> @@ -17,18 +18,22 @@ <translation id="2501853267655415902">Ierakstīšana apturēta</translation> <translation id="2501953888035679275">Uzņemiet fotoattēlus un ierakstiet videoklipus, izmantojot savu kameru.</translation> <translation id="2549985041256363841">Sākt ierakstīšanu</translation> +<translation id="2599796128805996109">Aizmugurējā kamera</translation> <translation id="2968794441791257519">Ar kameru uzņemtie fotoattēli un videoklipi tiks ievietoti mapē Lejupielādes. Varat tiem piekļūt lietotnē Faili. Lietotnes, kurām ir atļauja piekļūt krātuvei, varēs piekļūt jūsu fotoattēliem un videoklipiem.</translation> <translation id="3081586908890909590">Ieslēdziet, lai ierakstītu videoklipu</translation> <translation id="3183731565330012717">Režģa veids</translation> <translation id="3227137524299004712">Mikrofons</translation> +<translation id="3259149966178251584">Kameras izšķirtspēja</translation> <translation id="3517926952904427380">Nevar uzņemt portretu</translation> <translation id="3569311554794739032">Vai tiešām vēlaties noņemt failu <ph name="FILE" />?</translation> <translation id="3810838688059735925">Video</translation> <translation id="4279490309300973883">Spoguļošana</translation> <translation id="4329152592498422850">Pārslēgt uz kvadrātveida fotoattēlu uzņemšanu</translation> <translation id="4445542136948522167">Pārtraukt fotoattēla uzņemšanu</translation> +<translation id="4497569853498380347">(<ph name="ASPECT_RATIO_WIDTH" />:<ph name="ASPECT_RATIO_HEIGHT" />) <ph name="MEGAPIXEL" /> megapikseļi</translation> +<translation id="4570032796877367747">Priekšējā kamera</translation> <translation id="4628948037717959914">Fotoattēls</translation> <translation id="4649291346448517080">Nevar saglabāt failu</translation> <translation id="4890010094662541459">3 x 3</translation> @@ -42,11 +47,14 @@ <translation id="6165508094623778733">Uzziniet vairāk</translation> <translation id="6233780560267770709">3 pa 3</translation> <translation id="6243827288366940320">Zelta griezums</translation> +<translation id="6248749904681914629">Ārējā kamera</translation> +<translation id="6420689864531458495">(<ph name="ASPECT_RATIO_WIDTH" />:<ph name="ASPECT_RATIO_HEIGHT" /> — <ph name="WIDTH" />x<ph name="HEIGHT" />) <ph name="MEGAPIXEL" /> megapikseļi</translation> <translation id="6681668084120808868">Uzņemt fotoattēlu</translation> <translation id="6778482348691154169">Nevar uzņemt fotoattēlu</translation> <translation id="6965382102122355670">Labi</translation> <translation id="698156982839284926">3 sekundes</translation> <translation id="712848772518857951">Vai tiešām vēlaties noņemt <ph name="COUNT" /> vienumus?</translation> +<translation id="7243947652761655814">Videoklipu izšķirtspēja</translation> <translation id="7337660886763914220">Failu sistēmas kļūdas.</translation> <translation id="7557677699350329807">Pārslēgties uz nākamo kameru</translation> <translation id="7608223098072244877">4 pa 4</translation> @@ -56,6 +64,7 @@ <translation id="8145038249676204903">Pārslēgt, lai uzņemtu fotoattēlu</translation> <translation id="8261506727792406068">Dzēst</translation> <translation id="8428213095426709021">Iestatījumi</translation> +<translation id="8687491812650032292">HD <ph name="HEIGHT" />p (<ph name="WIDTH" />:<ph name="HEIGHT" />)</translation> <translation id="8815966864175525708">Pārslēgt uz portretu uzņemšanu</translation> <translation id="8870695351537079478">Nevar sākt ierakstīšanu</translation> <translation id="9045155556724273246">10 sekundes</translation>
diff --git a/chrome/browser/resources/chromeos/camera/src/strings/camera_strings_no.xtb b/chrome/browser/resources/chromeos/camera/src/strings/camera_strings_no.xtb index 0382493..1902aa98 100644 --- a/chrome/browser/resources/chromeos/camera/src/strings/camera_strings_no.xtb +++ b/chrome/browser/resources/chromeos/camera/src/strings/camera_strings_no.xtb
@@ -8,6 +8,7 @@ <translation id="1627744224761163218">4 x 4</translation> <translation id="1664224225747386870">Ingenting er tatt opp</translation> <translation id="1862930711583847113">Kan ikke eksportere <ph name="FILE" /></translation> +<translation id="1899697626337024495">Bildeoppløsning</translation> <translation id="2008689030244369546">Et helt nytt utseende</translation> <translation id="2036868001356139588">Nedtellervarighet</translation> <translation id="2050339315714019657">Stående</translation> @@ -17,18 +18,22 @@ <translation id="2501853267655415902">Opptaket er stoppet</translation> <translation id="2501953888035679275">Ta bilder og ta opp video med kameraet.</translation> <translation id="2549985041256363841">Start opptak</translation> +<translation id="2599796128805996109">Bakre kamera</translation> <translation id="2968794441791257519">Bilder og videoer som er tatt med kameraet, flyttes til mappen Nedlastinger. Du har tilgang til dem i Filer. Apper med lagringstillatelser har tilgang til bildene og videoene dine.</translation> <translation id="3081586908890909590">Bytt til video</translation> <translation id="3183731565330012717">Rutenettype</translation> <translation id="3227137524299004712">Mikrofon</translation> +<translation id="3259149966178251584">Kameraoppløsning</translation> <translation id="3517926952904427380">Kunne ikke ta bilde i stående format</translation> <translation id="3569311554794739032">Er du sikker på at du vil fjerne <ph name="FILE" />?</translation> <translation id="3810838688059735925">Video</translation> <translation id="4279490309300973883">Speiling</translation> <translation id="4329152592498422850">Bytt til kvadratisk bilde</translation> <translation id="4445542136948522167">Slutt å ta bilde</translation> +<translation id="4497569853498380347">(<ph name="ASPECT_RATIO_WIDTH" />:<ph name="ASPECT_RATIO_HEIGHT" />) <ph name="MEGAPIXEL" /> megapiksel</translation> +<translation id="4570032796877367747">Fremre kamera</translation> <translation id="4628948037717959914">Bilde</translation> <translation id="4649291346448517080">Kan ikke lagre filen</translation> <translation id="4890010094662541459">3 x 3</translation> @@ -42,11 +47,14 @@ <translation id="6165508094623778733">Finn ut mer</translation> <translation id="6233780560267770709">3 ganger 3</translation> <translation id="6243827288366940320">Det gylne snitt</translation> +<translation id="6248749904681914629">Eksternt kamera</translation> +<translation id="6420689864531458495">(<ph name="ASPECT_RATIO_WIDTH" />:<ph name="ASPECT_RATIO_HEIGHT" /> – <ph name="WIDTH" />x<ph name="HEIGHT" />) <ph name="MEGAPIXEL" /> megapiksel</translation> <translation id="6681668084120808868">Ta et bilde</translation> <translation id="6778482348691154169">Kan ikke ta bilde</translation> <translation id="6965382102122355670">OK</translation> <translation id="698156982839284926">3 sekunder</translation> <translation id="712848772518857951">Er du sikker på at du vil fjerne de <ph name="COUNT" /> elementene?</translation> +<translation id="7243947652761655814">Videooppløsning</translation> <translation id="7337660886763914220">Filsystemfeil.</translation> <translation id="7557677699350329807">Bytt til neste kamera</translation> <translation id="7608223098072244877">4 ganger 4</translation> @@ -56,6 +64,7 @@ <translation id="8145038249676204903">Bytt til foto</translation> <translation id="8261506727792406068">Slett</translation> <translation id="8428213095426709021">Innstillinger</translation> +<translation id="8687491812650032292">HD <ph name="HEIGHT" />p (<ph name="WIDTH" />:<ph name="HEIGHT" />)</translation> <translation id="8815966864175525708">Bytt til bilde i stående format</translation> <translation id="8870695351537079478">Kan ikke starte opptak</translation> <translation id="9045155556724273246">10 sekunder</translation>
diff --git a/chrome/browser/resources/chromeos/camera/src/strings/camera_strings_pl.xtb b/chrome/browser/resources/chromeos/camera/src/strings/camera_strings_pl.xtb index 41ad970..3a58b690 100644 --- a/chrome/browser/resources/chromeos/camera/src/strings/camera_strings_pl.xtb +++ b/chrome/browser/resources/chromeos/camera/src/strings/camera_strings_pl.xtb
@@ -8,6 +8,7 @@ <translation id="1627744224761163218">4 x 4</translation> <translation id="1664224225747386870">Nic nie zostało nagrane</translation> <translation id="1862930711583847113">Nie udało się wyeksportować pliku <ph name="FILE" /></translation> +<translation id="1899697626337024495">Rozdzielczość zdjęcia</translation> <translation id="2008689030244369546">Zupełnie nowy wygląd</translation> <translation id="2036868001356139588">Czas samowyzwalacza</translation> <translation id="2050339315714019657">Pionowo</translation> @@ -17,18 +18,22 @@ <translation id="2501853267655415902">Nagrywanie zatrzymane</translation> <translation id="2501953888035679275">Aparatem możesz robić zdjęcia i nagrywać filmy.</translation> <translation id="2549985041256363841">Zacznij nagrywanie</translation> +<translation id="2599796128805996109">Tylny aparat</translation> <translation id="2968794441791257519">Zdjęcia i filmy pochodzące z aparatu zostaną przeniesione do folderu Pobrane pliki. Dostęp do nich możesz uzyskać w aplikacji Pliki. Do Twoich zdjęć i filmów będą mieć dostęp aplikacje z uprawnieniami dostępu do pamięci.</translation> <translation id="3081586908890909590">Przełącz, by nagrać film</translation> <translation id="3183731565330012717">Typ siatki</translation> <translation id="3227137524299004712">Mikrofon</translation> +<translation id="3259149966178251584">Rozdzielczość aparatu</translation> <translation id="3517926952904427380">Nie można zrobić zdjęcia w orientacji pionowej</translation> <translation id="3569311554794739032">Czy na pewno chcesz usunąć plik <ph name="FILE" />?</translation> <translation id="3810838688059735925">Wideo</translation> <translation id="4279490309300973883">Odbicie lustrzane</translation> <translation id="4329152592498422850">Przełącz, by zrobić kwadratowe zdjęcie</translation> <translation id="4445542136948522167">Nie rób zdjęcia</translation> +<translation id="4497569853498380347">(<ph name="ASPECT_RATIO_WIDTH" />:<ph name="ASPECT_RATIO_HEIGHT" />) <ph name="MEGAPIXEL" /> Mpix</translation> +<translation id="4570032796877367747">Przedni aparat</translation> <translation id="4628948037717959914">Zdjęcie</translation> <translation id="4649291346448517080">Nie udało się zapisać pliku</translation> <translation id="4890010094662541459">3 x 3</translation> @@ -42,11 +47,14 @@ <translation id="6165508094623778733">Więcej informacji</translation> <translation id="6233780560267770709">3 na 3</translation> <translation id="6243827288366940320">Złoty podział</translation> +<translation id="6248749904681914629">Aparat zewnętrzny</translation> +<translation id="6420689864531458495">(<ph name="ASPECT_RATIO_WIDTH" />:<ph name="ASPECT_RATIO_HEIGHT" /> – <ph name="WIDTH" />x<ph name="HEIGHT" />) <ph name="MEGAPIXEL" /> Mpix</translation> <translation id="6681668084120808868">Zrób zdjęcie</translation> <translation id="6778482348691154169">Nie udało się zrobić zdjęcia</translation> <translation id="6965382102122355670">OK</translation> <translation id="698156982839284926">3 sekundy</translation> <translation id="712848772518857951">Czy na pewno chcesz usunąć te elementy (<ph name="COUNT" />)?</translation> +<translation id="7243947652761655814">Rozdzielczość wideo</translation> <translation id="7337660886763914220">Błędy systemu plików.</translation> <translation id="7557677699350329807">Przełącz na następny aparat</translation> <translation id="7608223098072244877">4 na 4</translation> @@ -56,6 +64,7 @@ <translation id="8145038249676204903">Przełącz, by zrobić zdjęcie</translation> <translation id="8261506727792406068">Usuń</translation> <translation id="8428213095426709021">Ustawienia</translation> +<translation id="8687491812650032292">HD <ph name="HEIGHT" />p (<ph name="WIDTH" />:<ph name="HEIGHT" />)</translation> <translation id="8815966864175525708">Przełącz, by zrobić zdjęcie w orientacji pionowej</translation> <translation id="8870695351537079478">Nie udało się rozpocząć nagrywania</translation> <translation id="9045155556724273246">10 sekund</translation>
diff --git a/chrome/browser/resources/chromeos/camera/src/strings/camera_strings_pt-PT.xtb b/chrome/browser/resources/chromeos/camera/src/strings/camera_strings_pt-PT.xtb index 21ecd77..2f594ebc 100644 --- a/chrome/browser/resources/chromeos/camera/src/strings/camera_strings_pt-PT.xtb +++ b/chrome/browser/resources/chromeos/camera/src/strings/camera_strings_pt-PT.xtb
@@ -8,6 +8,7 @@ <translation id="1627744224761163218">4 x 4</translation> <translation id="1664224225747386870">Nada foi gravado.</translation> <translation id="1862930711583847113">Não foi possível exportar o ficheiro <ph name="FILE" />.</translation> +<translation id="1899697626337024495">Resolução da foto</translation> <translation id="2008689030244369546">Um aspeto totalmente novo</translation> <translation id="2036868001356139588">Duração do temporizador</translation> <translation id="2050339315714019657">Vertical</translation> @@ -17,18 +18,22 @@ <translation id="2501853267655415902">Gravação parada</translation> <translation id="2501953888035679275">Tire fotos e grave vídeos com a sua câmara.</translation> <translation id="2549985041256363841">Iniciar gravação</translation> +<translation id="2599796128805996109">Câmara posterior</translation> <translation id="2968794441791257519">As fotos e os vídeos realizados com a câmara serão movidos para a pasta Transferências. Pode aceder aos mesmos em Ficheiros. As aplicações com autorizações de armazenamento terão acesso aos seus vídeos e fotos.</translation> <translation id="3081586908890909590">Mudar para gravar vídeo</translation> <translation id="3183731565330012717">Tipo de grelha</translation> <translation id="3227137524299004712">Microfone</translation> +<translation id="3259149966178251584">Resolução da câmara</translation> <translation id="3517926952904427380">Não é possível tirar foto de retrato</translation> <translation id="3569311554794739032">Tem a certeza de que pretende remover <ph name="FILE" />?</translation> <translation id="3810838688059735925">Vídeo</translation> <translation id="4279490309300973883">Espelhamento</translation> <translation id="4329152592498422850">Mudar para tirar foto quadrada</translation> <translation id="4445542136948522167">Parar de tirar foto</translation> +<translation id="4497569853498380347">(<ph name="ASPECT_RATIO_WIDTH" />:<ph name="ASPECT_RATIO_HEIGHT" />) <ph name="MEGAPIXEL" /> megapíxel(eis)</translation> +<translation id="4570032796877367747">Câmara frontal</translation> <translation id="4628948037717959914">Fotografia</translation> <translation id="4649291346448517080">Não foi possível guardar o ficheiro.</translation> <translation id="4890010094662541459">3 x 3</translation> @@ -42,11 +47,14 @@ <translation id="6165508094623778733">Saiba mais</translation> <translation id="6233780560267770709">3 por 3</translation> <translation id="6243827288366940320">Divina proporção</translation> +<translation id="6248749904681914629">Câmara externa</translation> +<translation id="6420689864531458495">(<ph name="ASPECT_RATIO_WIDTH" />:<ph name="ASPECT_RATIO_HEIGHT" /> – <ph name="WIDTH" />x<ph name="HEIGHT" />) <ph name="MEGAPIXEL" /> megapíxel(eis)</translation> <translation id="6681668084120808868">Tirar foto</translation> <translation id="6778482348691154169">Não é possível tirar a foto.</translation> <translation id="6965382102122355670">OK</translation> <translation id="698156982839284926">3 segundos</translation> <translation id="712848772518857951">Pretende realmente remover <ph name="COUNT" /> itens?</translation> +<translation id="7243947652761655814">Resolução do vídeo</translation> <translation id="7337660886763914220">Erros do sistema de ficheiros.</translation> <translation id="7557677699350329807">Mudar para a câmara seguinte</translation> <translation id="7608223098072244877">4 por 4</translation> @@ -56,6 +64,7 @@ <translation id="8145038249676204903">Mudar para tirar foto</translation> <translation id="8261506727792406068">Eliminar</translation> <translation id="8428213095426709021">Definições</translation> +<translation id="8687491812650032292">HD <ph name="HEIGHT" />p (<ph name="WIDTH" />:<ph name="HEIGHT" />)</translation> <translation id="8815966864175525708">Mudar para tirar foto de retrato</translation> <translation id="8870695351537079478">Não é possível iniciar a gravação.</translation> <translation id="9045155556724273246">10 segundos</translation>
diff --git a/chrome/browser/resources/chromeos/camera/src/strings/camera_strings_ro.xtb b/chrome/browser/resources/chromeos/camera/src/strings/camera_strings_ro.xtb index d0dcbc76..2c1583e 100644 --- a/chrome/browser/resources/chromeos/camera/src/strings/camera_strings_ro.xtb +++ b/chrome/browser/resources/chromeos/camera/src/strings/camera_strings_ro.xtb
@@ -8,6 +8,7 @@ <translation id="1627744224761163218">4 x 4</translation> <translation id="1664224225747386870">Nu s-a înregistrat nimic</translation> <translation id="1862930711583847113">Fișierul <ph name="FILE" /> nu poate fi exportat</translation> +<translation id="1899697626337024495">Rezoluție foto</translation> <translation id="2008689030244369546">Un aspect nou-nouț</translation> <translation id="2036868001356139588">Durata temporizatorului</translation> <translation id="2050339315714019657">Portret</translation> @@ -17,18 +18,22 @@ <translation id="2501853267655415902">Înregistrarea s-a oprit</translation> <translation id="2501953888035679275">Fotografiază și înregistrează videoclipuri cu camera foto.</translation> <translation id="2549985041256363841">Pornește înregistrarea</translation> +<translation id="2599796128805996109">Camera foto posterioară</translation> <translation id="2968794441791257519">Fotografiile și videoclipurile făcute cu camera foto vor fi mutate în dosarul Descărcări. Le poți accesa în Fișiere. Aplicațiile cu permisiuni de stocare vor avea acces la fotografiile și videoclipurile tale.</translation> <translation id="3081586908890909590">Comută pentru a înregistra un videoclip</translation> <translation id="3183731565330012717">Tipul grilei</translation> <translation id="3227137524299004712">Microfon</translation> +<translation id="3259149966178251584">Rezoluția camerei</translation> <translation id="3517926952904427380">Nu se poate face fotografia portret</translation> <translation id="3569311554794739032">Sigur vrei să elimini <ph name="FILE" />?</translation> <translation id="3810838688059735925">Video</translation> <translation id="4279490309300973883">Oglindire</translation> <translation id="4329152592498422850">Comută pentru a face o fotografie pătrată</translation> <translation id="4445542136948522167">Nu mai fotografia</translation> +<translation id="4497569853498380347">(<ph name="ASPECT_RATIO_WIDTH" />:<ph name="ASPECT_RATIO_HEIGHT" />) <ph name="MEGAPIXEL" /> megapixel</translation> +<translation id="4570032796877367747">Camera foto frontală</translation> <translation id="4628948037717959914">Fotografie</translation> <translation id="4649291346448517080">Fișierul nu poate fi salvat</translation> <translation id="4890010094662541459">3 x 3</translation> @@ -42,11 +47,14 @@ <translation id="6165508094623778733">Află mai multe</translation> <translation id="6233780560267770709">3 pe 3</translation> <translation id="6243827288366940320">Raportul de aur</translation> +<translation id="6248749904681914629">Cameră externă</translation> +<translation id="6420689864531458495">(<ph name="ASPECT_RATIO_WIDTH" />:<ph name="ASPECT_RATIO_HEIGHT" /> - <ph name="WIDTH" />x<ph name="HEIGHT" />) <ph name="MEGAPIXEL" /> megapixeli</translation> <translation id="6681668084120808868">Fotografiază</translation> <translation id="6778482348691154169">Nu se poate fotografia</translation> <translation id="6965382102122355670">OK</translation> <translation id="698156982839284926">3 secunde</translation> <translation id="712848772518857951">Sigur dorești să elimini <ph name="COUNT" /> elemente?</translation> +<translation id="7243947652761655814">Rezoluție video</translation> <translation id="7337660886763914220">Erori în sistemul de fișiere.</translation> <translation id="7557677699350329807">Comută la următoarea cameră foto</translation> <translation id="7608223098072244877">4 pe 4</translation> @@ -56,6 +64,7 @@ <translation id="8145038249676204903">Comută pentru a fotografia</translation> <translation id="8261506727792406068">Șterge</translation> <translation id="8428213095426709021">Setări</translation> +<translation id="8687491812650032292">HD <ph name="HEIGHT" />p (<ph name="WIDTH" />:<ph name="HEIGHT" />)</translation> <translation id="8815966864175525708">Comută pentru a face o fotografie portret</translation> <translation id="8870695351537079478">Nu se poate porni înregistrarea</translation> <translation id="9045155556724273246">10 secunde</translation>
diff --git a/chrome/browser/resources/chromeos/camera/src/strings/camera_strings_sk.xtb b/chrome/browser/resources/chromeos/camera/src/strings/camera_strings_sk.xtb index 670b749..1b48e7f6 100644 --- a/chrome/browser/resources/chromeos/camera/src/strings/camera_strings_sk.xtb +++ b/chrome/browser/resources/chromeos/camera/src/strings/camera_strings_sk.xtb
@@ -8,6 +8,7 @@ <translation id="1627744224761163218">4 × 4</translation> <translation id="1664224225747386870">Nič sa nezaznamenalo</translation> <translation id="1862930711583847113"><ph name="FILE" /> sa nepodarilo exportovať</translation> +<translation id="1899697626337024495">Rozlíšenie fotky</translation> <translation id="2008689030244369546">Úplne nový vzhľad</translation> <translation id="2036868001356139588">Trvanie časovača</translation> <translation id="2050339315714019657">Na výšku</translation> @@ -17,18 +18,22 @@ <translation id="2501853267655415902">Zaznamenávanie bolo zastavené</translation> <translation id="2501953888035679275">Foťte a zaznamenávajte videá fotoaparátom.</translation> <translation id="2549985041256363841">Spustiť zaznamenávanie</translation> +<translation id="2599796128805996109">Zadný fotoaparát</translation> <translation id="2968794441791257519">Fotky a videá nasnímané fotoaparátom budú presunuté do priečinka Stiahnuté súbory. Dostanete sa k nim v Súboroch. Fotky aj videá budú môcť používať aplikácie s povoleniami pre úložisko.</translation> <translation id="3081586908890909590">Prepnúť na zaznamenávanie videa</translation> <translation id="3183731565330012717">Typ mriežky</translation> <translation id="3227137524299004712">Mikrofón</translation> +<translation id="3259149966178251584">Rozlíšenie fotoaparátu</translation> <translation id="3517926952904427380">Nepodarilo sa nasnímať portrétovú fotku</translation> <translation id="3569311554794739032">Naozaj chcete odstrániť <ph name="FILE" />?</translation> <translation id="3810838688059735925">Video</translation> <translation id="4279490309300973883">Zrkadlenie</translation> <translation id="4329152592498422850">Prepnúť na snímanie štvorcových fotiek</translation> <translation id="4445542136948522167">Zastaviť fotenie</translation> +<translation id="4497569853498380347">(<ph name="ASPECT_RATIO_WIDTH" /> : <ph name="ASPECT_RATIO_HEIGHT" />) <ph name="MEGAPIXEL" /> Mpx</translation> +<translation id="4570032796877367747">Predný fotoaparát</translation> <translation id="4628948037717959914">Fotografia</translation> <translation id="4649291346448517080">Súbor sa nepodarilo uložiť</translation> <translation id="4890010094662541459">3 × 3</translation> @@ -42,11 +47,14 @@ <translation id="6165508094623778733">Ďalšie informácie</translation> <translation id="6233780560267770709">3 na 3</translation> <translation id="6243827288366940320">Zlatý rez</translation> +<translation id="6248749904681914629">Externý fotoaparát</translation> +<translation id="6420689864531458495">(<ph name="ASPECT_RATIO_WIDTH" />:<ph name="ASPECT_RATIO_HEIGHT" /> – <ph name="WIDTH" />x<ph name="HEIGHT" />) <ph name="MEGAPIXEL" /> Mpx</translation> <translation id="6681668084120808868">Zaznamenať fotografiu</translation> <translation id="6778482348691154169">Fotka sa nedá nasnímať</translation> <translation id="6965382102122355670">OK</translation> <translation id="698156982839284926">3 sekundy</translation> <translation id="712848772518857951">Naozaj chcete odstrániť položky (počet: <ph name="COUNT" />)?</translation> +<translation id="7243947652761655814">Rozlíšenie videa</translation> <translation id="7337660886763914220">Chyby systému súborov.</translation> <translation id="7557677699350329807">Prepnúť na ďalší fotoaparát</translation> <translation id="7608223098072244877">4 na 4</translation> @@ -56,6 +64,7 @@ <translation id="8145038249676204903">Prepnúť na fotenie</translation> <translation id="8261506727792406068">Odstrániť</translation> <translation id="8428213095426709021">Nastavenia</translation> +<translation id="8687491812650032292">HD <ph name="HEIGHT" /> p (<ph name="WIDTH" /> : <ph name="HEIGHT" />)</translation> <translation id="8815966864175525708">Prepnúť na nasnímanie portrétovej fotky</translation> <translation id="8870695351537079478">Zaznamenávanie sa nedá spustiť</translation> <translation id="9045155556724273246">10 sekúnd</translation>
diff --git a/chrome/browser/resources/chromeos/camera/src/strings/camera_strings_sl.xtb b/chrome/browser/resources/chromeos/camera/src/strings/camera_strings_sl.xtb index 60ec54f..36ae5fe 100644 --- a/chrome/browser/resources/chromeos/camera/src/strings/camera_strings_sl.xtb +++ b/chrome/browser/resources/chromeos/camera/src/strings/camera_strings_sl.xtb
@@ -8,6 +8,7 @@ <translation id="1627744224761163218">4 x 4</translation> <translation id="1664224225747386870">Nič ni posneto</translation> <translation id="1862930711583847113">Datoteke <ph name="FILE" /> ni mogoče izvoziti</translation> +<translation id="1899697626337024495">Ločljivost fotografije</translation> <translation id="2008689030244369546">Popolnoma nov videz</translation> <translation id="2036868001356139588">Trajanje časovnika</translation> <translation id="2050339315714019657">Pokončno</translation> @@ -17,18 +18,22 @@ <translation id="2501853267655415902">Snemanje je ustavljeno</translation> <translation id="2501953888035679275">Fotografirajte in snemajte videoposnetke s fotoaparatom.</translation> <translation id="2549985041256363841">Začetek snemanja</translation> +<translation id="2599796128805996109">Hrbtni fotoaparat</translation> <translation id="2968794441791257519">Fotografije in videoposnetki, ki ste jih posneli s fotoaparatom, bodo premaknjeni v mapo Prenosi. Do njih lahko dostopate v aplikaciji Datoteke. Aplikacije z dovoljenji za shrambo bodo imele dostop do fotografij in videoposnetkov.</translation> <translation id="3081586908890909590">Preklop na snemanje videa</translation> <translation id="3183731565330012717">Vrsta mreže</translation> <translation id="3227137524299004712">Mikrofon</translation> +<translation id="3259149966178251584">Ločljivost fotoaparata</translation> <translation id="3517926952904427380">Portretne fotografije ni bilo mogoče posneti</translation> <translation id="3569311554794739032">Ali res želite odstraniti datoteko <ph name="FILE" />?</translation> <translation id="3810838688059735925">Video</translation> <translation id="4279490309300973883">Zrcaljenje</translation> <translation id="4329152592498422850">Preklop na snemanje kvadratnih fotografij</translation> <translation id="4445542136948522167">Ustavitev fotografiranja</translation> +<translation id="4497569853498380347">(<ph name="ASPECT_RATIO_WIDTH" /> : <ph name="ASPECT_RATIO_HEIGHT" />) <ph name="MEGAPIXEL" /> mio. slikovnih pik</translation> +<translation id="4570032796877367747">Sprednji fotoaparat</translation> <translation id="4628948037717959914">Fotografija</translation> <translation id="4649291346448517080">Datoteke ni mogoče shraniti</translation> <translation id="4890010094662541459">3 x 3</translation> @@ -42,11 +47,14 @@ <translation id="6165508094623778733">Več o tem</translation> <translation id="6233780560267770709">3 x 3</translation> <translation id="6243827288366940320">Zlato razmerje</translation> +<translation id="6248749904681914629">Zunanji fotoaparat</translation> +<translation id="6420689864531458495">(<ph name="ASPECT_RATIO_WIDTH" /> : <ph name="ASPECT_RATIO_HEIGHT" /> – <ph name="WIDTH" /> x <ph name="HEIGHT" />) <ph name="MEGAPIXEL" /> mio. slikovnih pik</translation> <translation id="6681668084120808868">Posnemi fotografijo</translation> <translation id="6778482348691154169">Fotografije ni mogoče posneti</translation> <translation id="6965382102122355670">V redu</translation> <translation id="698156982839284926">3 sekunde</translation> <translation id="712848772518857951">Ali res želite odstraniti toliko elementov: <ph name="COUNT" />?</translation> +<translation id="7243947652761655814">Ločljivost videoposnetka</translation> <translation id="7337660886763914220">Napake datotečnega sistema.</translation> <translation id="7557677699350329807">Preklop na naslednji fotoaparat</translation> <translation id="7608223098072244877">4 x 4</translation> @@ -56,6 +64,7 @@ <translation id="8145038249676204903">Preklop na fotografiranje</translation> <translation id="8261506727792406068">Izbriši</translation> <translation id="8428213095426709021">Nastavitve</translation> +<translation id="8687491812650032292">HD <ph name="HEIGHT" />p (<ph name="WIDTH" /> : <ph name="HEIGHT" />)</translation> <translation id="8815966864175525708">Preklop na snemanje portretnih fotografij</translation> <translation id="8870695351537079478">Snemanja ni mogoče začeti</translation> <translation id="9045155556724273246">10 sekund</translation>
diff --git a/chrome/browser/resources/chromeos/camera/src/strings/camera_strings_sr.xtb b/chrome/browser/resources/chromeos/camera/src/strings/camera_strings_sr.xtb index 2b6cec0..92c1ccc 100644 --- a/chrome/browser/resources/chromeos/camera/src/strings/camera_strings_sr.xtb +++ b/chrome/browser/resources/chromeos/camera/src/strings/camera_strings_sr.xtb
@@ -8,6 +8,7 @@ <translation id="1627744224761163218">4×4</translation> <translation id="1664224225747386870">Ништа није снимљено</translation> <translation id="1862930711583847113">Извоз датотеке <ph name="FILE" /> није успео</translation> +<translation id="1899697626337024495">Резолуција слике</translation> <translation id="2008689030244369546">Потпуно нови изглед</translation> <translation id="2036868001356139588">Трајање тајмера</translation> <translation id="2050339315714019657">Вертикално</translation> @@ -17,18 +18,22 @@ <translation id="2501853267655415902">Снимање је заустављено</translation> <translation id="2501953888035679275">Снимајте слике и видео снимке помоћу камере.</translation> <translation id="2549985041256363841">Започни снимање</translation> +<translation id="2599796128805996109">Задња камера</translation> <translation id="2968794441791257519">Слике и видео снимци који су снимљени помоћу камере ће се преместити у директоријум Преузимања. Можете да им приступите у Датотекама. Апликације са дозволама за приступ меморијском простору ће имати приступ сликама и видео снимцима.</translation> <translation id="3081586908890909590">Пређи на режим за снимање видеа</translation> <translation id="3183731565330012717">Тип мреже</translation> <translation id="3227137524299004712">Микрофон</translation> +<translation id="3259149966178251584">Резолуција камере</translation> <translation id="3517926952904427380">Снимање усправне слике није успело</translation> <translation id="3569311554794739032">Желите ли стварно да уклоните датотеку <ph name="FILE" />?</translation> <translation id="3810838688059735925">Видео</translation> <translation id="4279490309300973883">Пресликавање</translation> <translation id="4329152592498422850">Пређи на режим за снимање слика у облику квадрата</translation> <translation id="4445542136948522167">Заустави снимање слике</translation> +<translation id="4497569853498380347">Мегапиксели: <ph name="MEGAPIXEL" /> (<ph name="ASPECT_RATIO_WIDTH" />:<ph name="ASPECT_RATIO_HEIGHT" />)</translation> +<translation id="4570032796877367747">Предња камера</translation> <translation id="4628948037717959914">Слика</translation> <translation id="4649291346448517080">Чување датотеке није успело</translation> <translation id="4890010094662541459">3×3</translation> @@ -42,11 +47,14 @@ <translation id="6165508094623778733">Сазнајте више</translation> <translation id="6233780560267770709">3 са 3</translation> <translation id="6243827288366940320">Златни пресек</translation> +<translation id="6248749904681914629">Спољна камера</translation> +<translation id="6420689864531458495">Мегапиксели: <ph name="MEGAPIXEL" /> (<ph name="ASPECT_RATIO_WIDTH" />:<ph name="ASPECT_RATIO_HEIGHT" /> – <ph name="WIDTH" />x<ph name="HEIGHT" />)</translation> <translation id="6681668084120808868">Снимите фотографију</translation> <translation id="6778482348691154169">Снимање слике није успело</translation> <translation id="6965382102122355670">Потврди</translation> <translation id="698156982839284926">3 секунде</translation> <translation id="712848772518857951">Желите ли стварно да уклоните ове ставке (<ph name="COUNT" />)?</translation> +<translation id="7243947652761655814">Резолуција видео снимка</translation> <translation id="7337660886763914220">Грешке система датотека.</translation> <translation id="7557677699350329807">Пређи на следећу камеру</translation> <translation id="7608223098072244877">4 са 4</translation> @@ -56,6 +64,7 @@ <translation id="8145038249676204903">Пређи на режим за снимање слика</translation> <translation id="8261506727792406068">Избриши</translation> <translation id="8428213095426709021">Подешавања</translation> +<translation id="8687491812650032292">HD <ph name="HEIGHT" /> пиксела (<ph name="WIDTH" />:<ph name="HEIGHT" />)</translation> <translation id="8815966864175525708">Пређи на режим за снимање усправних слика</translation> <translation id="8870695351537079478">Снимање није могло да почне</translation> <translation id="9045155556724273246">10 секунди</translation>
diff --git a/chrome/browser/resources/chromeos/camera/src/strings/camera_strings_sw.xtb b/chrome/browser/resources/chromeos/camera/src/strings/camera_strings_sw.xtb index 8090bcb9..84438a84 100644 --- a/chrome/browser/resources/chromeos/camera/src/strings/camera_strings_sw.xtb +++ b/chrome/browser/resources/chromeos/camera/src/strings/camera_strings_sw.xtb
@@ -8,6 +8,7 @@ <translation id="1627744224761163218">4 x 4</translation> <translation id="1664224225747386870">Haijarekodi chochote</translation> <translation id="1862930711583847113">Imeshindwa kutuma <ph name="FILE" /></translation> +<translation id="1899697626337024495">Ubora wa picha</translation> <translation id="2008689030244369546">Mwonekano mpya kamili</translation> <translation id="2036868001356139588">Urefu wa kipima muda</translation> <translation id="2050339315714019657">Wima</translation> @@ -17,18 +18,22 @@ <translation id="2501853267655415902">Imeacha kurekodi</translation> <translation id="2501953888035679275">Piga picha na urekodi video ukitumia kamera yako.</translation> <translation id="2549985041256363841">Anza kurekodi</translation> +<translation id="2599796128805996109">Kamera ya nyuma</translation> <translation id="2968794441791257519">Itahamishia picha na video ulizopigwa kwa kamera kwenye folda ya Vipakuliwa. Unaweza kuzifikia kwenye Faili. Programu zilizo na ruhusa za hifadhi zitaweza kufikia picha na video zako.</translation> <translation id="3081586908890909590">Rekodi video</translation> <translation id="3183731565330012717">Aina ya gridi</translation> <translation id="3227137524299004712">Maikrofoni</translation> +<translation id="3259149966178251584">Ubora wa kamera</translation> <translation id="3517926952904427380">Imeshindwa kupiga picha ya wima</translation> <translation id="3569311554794739032">Una uhakika ungependa kuondoa <ph name="FILE" />?</translation> <translation id="3810838688059735925">Video</translation> <translation id="4279490309300973883">Kuakisi</translation> <translation id="4329152592498422850">Badili ili upige picha ya mraba</translation> <translation id="4445542136948522167">Acha kupiga picha</translation> +<translation id="4497569853498380347">(<ph name="ASPECT_RATIO_WIDTH" />:<ph name="ASPECT_RATIO_HEIGHT" />) megapikseli <ph name="MEGAPIXEL" /></translation> +<translation id="4570032796877367747">Kamera ya mbele</translation> <translation id="4628948037717959914">Picha</translation> <translation id="4649291346448517080">Imeshindwa kuhifadhi faili</translation> <translation id="4890010094662541459">3 x 3</translation> @@ -42,11 +47,14 @@ <translation id="6165508094623778733">Pata maelezo zaidi</translation> <translation id="6233780560267770709">3 kwa 3</translation> <translation id="6243827288366940320">Uwiano bora zaidi</translation> +<translation id="6248749904681914629">Kamera ya nje</translation> +<translation id="6420689864531458495">(<ph name="ASPECT_RATIO_WIDTH" />:<ph name="ASPECT_RATIO_HEIGHT" /> - <ph name="WIDTH" />x<ph name="HEIGHT" />) megapikseli <ph name="MEGAPIXEL" /></translation> <translation id="6681668084120808868">Piga picha</translation> <translation id="6778482348691154169">Imeshindwa kupiga picha</translation> <translation id="6965382102122355670">Sawa</translation> <translation id="698156982839284926">Sekunde 3</translation> <translation id="712848772518857951">Una uhakika ungependa kuondoa vipengee <ph name="COUNT" />?</translation> +<translation id="7243947652761655814">Ubora wa video</translation> <translation id="7337660886763914220">Hitilafu za mfumo wa faili.</translation> <translation id="7557677699350329807">Tumia kamera inayofuata</translation> <translation id="7608223098072244877">4 kwa 4</translation> @@ -56,6 +64,7 @@ <translation id="8145038249676204903">Piga picha</translation> <translation id="8261506727792406068">Futa</translation> <translation id="8428213095426709021">Mipangilio</translation> +<translation id="8687491812650032292">HD <ph name="HEIGHT" />p (<ph name="WIDTH" />:<ph name="HEIGHT" />)</translation> <translation id="8815966864175525708">Badili ili upige picha ya wima</translation> <translation id="8870695351537079478">Imeshindwa kuanza kurekodi</translation> <translation id="9045155556724273246">Sekunde 10</translation>
diff --git a/chrome/browser/resources/chromeos/camera/src/strings/camera_strings_th.xtb b/chrome/browser/resources/chromeos/camera/src/strings/camera_strings_th.xtb index c2f326f..8cf22e9f 100644 --- a/chrome/browser/resources/chromeos/camera/src/strings/camera_strings_th.xtb +++ b/chrome/browser/resources/chromeos/camera/src/strings/camera_strings_th.xtb
@@ -8,6 +8,7 @@ <translation id="1627744224761163218">4 x 4</translation> <translation id="1664224225747386870">ไม่ได้บันทึกข้อมูลใด</translation> <translation id="1862930711583847113">ส่งออก <ph name="FILE" /> ไม่ได้</translation> +<translation id="1899697626337024495">ความละเอียดรูปภาพ</translation> <translation id="2008689030244369546">รูปลักษณ์ใหม่ทั้งหมด</translation> <translation id="2036868001356139588">ระยะเวลาของตัวจับเวลา</translation> <translation id="2050339315714019657">แนวตั้ง</translation> @@ -17,18 +18,22 @@ <translation id="2501853267655415902">หยุดบันทึกแล้ว</translation> <translation id="2501953888035679275">ถ่ายภาพและบันทึกวิดีโอด้วยกล้อง</translation> <translation id="2549985041256363841">เริ่มบันทึก</translation> +<translation id="2599796128805996109">กล้องหลัง</translation> <translation id="2968794441791257519">รูปภาพและวิดีโอที่ถ่ายจากกล้องจะย้ายไปยังโฟลเดอร์ "ดาวน์โหลด" คุณจะเข้าถึงรายการเหล่านี้ได้ในแอป Files แอปที่มีสิทธิ์ในพื้นที่เก็บข้อมูลจะเข้าถึงรูปภาพและวิดีโอของคุณได้</translation> <translation id="3081586908890909590">เปลี่ยนเป็นโหมดบันทึกวิดีโอ</translation> <translation id="3183731565330012717">ประเภทตารางกริด</translation> <translation id="3227137524299004712">ไมโครโฟน</translation> +<translation id="3259149966178251584">ความละเอียดกล้อง</translation> <translation id="3517926952904427380">ถ่ายภาพบุคคลไม่ได้</translation> <translation id="3569311554794739032">คุณต้องการนำ <ph name="FILE" /> ออกจริงๆ ใช่ไหม</translation> <translation id="3810838688059735925">วิดีโอ</translation> <translation id="4279490309300973883">กำลังแสดงผล</translation> <translation id="4329152592498422850">เปลี่ยนเป็นถ่ายภาพแบบสี่เหลี่ยมจัตุรัส</translation> <translation id="4445542136948522167">หยุดถ่ายภาพ</translation> +<translation id="4497569853498380347">(<ph name="ASPECT_RATIO_WIDTH" />:<ph name="ASPECT_RATIO_HEIGHT" />) <ph name="MEGAPIXEL" /> เมกะพิกเซล</translation> +<translation id="4570032796877367747">กล้องหน้า</translation> <translation id="4628948037717959914">รูปภาพ</translation> <translation id="4649291346448517080">บันทึกไฟล์ไม่ได้</translation> <translation id="4890010094662541459">3 x 3</translation> @@ -42,11 +47,14 @@ <translation id="6165508094623778733">ดูข้อมูลเพิ่มเติม</translation> <translation id="6233780560267770709">3 x 3</translation> <translation id="6243827288366940320">อัตราส่วนทองคำ</translation> +<translation id="6248749904681914629">กล้องภายนอก</translation> +<translation id="6420689864531458495">(<ph name="ASPECT_RATIO_WIDTH" />:<ph name="ASPECT_RATIO_HEIGHT" /> - <ph name="WIDTH" />x<ph name="HEIGHT" />) <ph name="MEGAPIXEL" /> เมกะพิกเซล</translation> <translation id="6681668084120808868">ถ่ายภาพ</translation> <translation id="6778482348691154169">ถ่ายภาพไม่ได้</translation> <translation id="6965382102122355670">ตกลง</translation> <translation id="698156982839284926">3 วินาที</translation> <translation id="712848772518857951">คุณต้องการนำ <ph name="COUNT" /> รายการออกจริงๆ ใช่ไหม</translation> +<translation id="7243947652761655814">ความละเอียดวิดีโอ</translation> <translation id="7337660886763914220">ข้อผิดพลาดเกี่ยวกับระบบไฟล์</translation> <translation id="7557677699350329807">เปลี่ยนไปใช้กล้องถัดไป</translation> <translation id="7608223098072244877">4 x 4</translation> @@ -56,6 +64,7 @@ <translation id="8145038249676204903">เปลี่ยนเป็นโหมดถ่ายภาพ</translation> <translation id="8261506727792406068">ลบ</translation> <translation id="8428213095426709021">การตั้งค่า</translation> +<translation id="8687491812650032292">HD <ph name="HEIGHT" />p (<ph name="WIDTH" />:<ph name="HEIGHT" />)</translation> <translation id="8815966864175525708">เปลี่ยนเป็นถ่ายภาพบุคคล</translation> <translation id="8870695351537079478">เริ่มบันทึกวิดีโอไม่ได้</translation> <translation id="9045155556724273246">10 วินาที</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_te.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_te.xtb index edf70b2..d31ee50 100644 --- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_te.xtb +++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_te.xtb
@@ -769,7 +769,7 @@ <translation id="6387719785439924554">ప్రక్కన</translation> <translation id="6411426777058107714">మునుపటి రేడియో బటన్ లేదు.</translation> <translation id="6414968628640960377">మునుపటి విభిన్న మూలకం.</translation> -<translation id="6417265370957905582">Google సహాయకం</translation> +<translation id="6417265370957905582">Google అసిస్టెంట్</translation> <translation id="641759969622533235">{COUNT,plural, =1{కోలన్ గుర్తు}other{# కోలన్ గుర్తులు}}</translation> <translation id="6438968337250688271"><ph name="NAME" />, మెను</translation> <translation id="6444046323172968959">హెచ్చరిక డైలాగ్</translation>
diff --git a/chrome/browser/resources/chromeos/login/enterprise_enrollment.js b/chrome/browser/resources/chromeos/login/enterprise_enrollment.js index cca50da..725d64855 100644 --- a/chrome/browser/resources/chromeos/login/enterprise_enrollment.js +++ b/chrome/browser/resources/chromeos/login/enterprise_enrollment.js
@@ -271,7 +271,7 @@ }]); } - this.$['oauth-enroll-auth-view'].partition = data.webviewPartitionName; + this.authenticator_.setWebviewPartition(data.webviewPartitionName); Oobe.getInstance().setSigninUIState(SIGNIN_UI_STATE.ENROLLMENT); this.classList.remove('saml');
diff --git a/chrome/browser/resources/chromeos/login/screen_gaia_signin.js b/chrome/browser/resources/chromeos/login/screen_gaia_signin.js index e6f87cc..48acd2f 100644 --- a/chrome/browser/resources/chromeos/login/screen_gaia_signin.js +++ b/chrome/browser/resources/chromeos/login/screen_gaia_signin.js
@@ -631,7 +631,7 @@ getSigninFrame_: function() { // Note: Can't use |this.$|, since it returns cached references to elements // originally present in DOM, while the signin-frame is dynamically - // recreated (see setSigninFramePartition_()). + // recreated (see Authenticator.setWebviewPartition()). const signinFrame = this.shadowRoot.getElementById('signin-frame'); assert(signinFrame); return signinFrame; @@ -672,52 +672,6 @@ }, /** - * Copies attributes between nodes. - * @param {!Element} fromNode source to copy attributes from - * @param {!Element} toNode target to copy attributes to - * @param {!Set<string>} skipAttributes specifies attributes to be skipped - * @private - */ - copyAttributes_: function(fromNode, toNode, skipAttributes) { - for (let i = 0; i < fromNode.attributes.length; ++i) { - const attribute = fromNode.attributes[i]; - if (!skipAttributes.has(attribute.nodeName)) - toNode.setAttribute(attribute.nodeName, attribute.nodeValue); - } - }, - - /** - * Changes the 'partition' attribute of the sign-in frame. If the sign-in - * frame has already navigated, this function re-creates it. - * @param {string} newWebviewPartitionName the new partition - * @private - */ - setSigninFramePartition_: function(newWebviewPartitionName) { - const signinFrame = this.getSigninFrame_(); - - if (!signinFrame.src) { - // We have not navigated anywhere yet. Note that a webview's src - // attribute does not allow a change back to "". - signinFrame.partition = newWebviewPartitionName; - } else if (signinFrame.partition != newWebviewPartitionName) { - // The webview has already navigated. We have to re-create it. - const signinFrameParent = signinFrame.parentElement; - - // Copy all attributes except for partition and src from the previous - // webview. Use the specified |newWebviewPartitionName|. - const newSigninFrame = document.createElement('webview'); - this.copyAttributes_( - signinFrame, newSigninFrame, new Set(['src', 'partition'])); - newSigninFrame.partition = newWebviewPartitionName; - - signinFrameParent.replaceChild(newSigninFrame, signinFrame); - - // Make sure the authenticator uses the new webview from now on. - this.authenticator_.rebindWebview(newSigninFrame); - } - }, - - /** * Loads the authentication extension into the iframe. * @param {!Object} data Extension parameters bag. */ @@ -729,7 +683,7 @@ this.authenticator_.resetWebview(); } - this.setSigninFramePartition_(data.webviewPartitionName); + this.authenticator_.setWebviewPartition(data.webviewPartitionName); // This triggers updateSigninFrameContainers_() this.screenMode_ = data.screenMode;
diff --git a/chrome/browser/resources/gaia_auth_host/authenticator.js b/chrome/browser/resources/gaia_auth_host/authenticator.js index 06f0dec..b8acc748 100644 --- a/chrome/browser/resources/gaia_auth_host/authenticator.js +++ b/chrome/browser/resources/gaia_auth_host/authenticator.js
@@ -288,8 +288,9 @@ /** * Re-binds to another webview. * @param {Object} webview the new webview to be used by this Authenticator. + * @private */ - rebindWebview(webview) { + rebindWebview_(webview) { if (!this.isDomLoaded_) { // We haven't bound to the previously set webview yet, so simply update // |webview_| to use the new element during the delayed initialization. @@ -303,6 +304,51 @@ } /** + * Copies attributes between nodes. + * @param {!Element} fromNode source to copy attributes from + * @param {!Element} toNode target to copy attributes to + * @param {!Set<string>} skipAttributes specifies attributes to be skipped + * @private + */ + copyAttributes_(fromNode, toNode, skipAttributes) { + for (let i = 0; i < fromNode.attributes.length; ++i) { + const attribute = fromNode.attributes[i]; + if (!skipAttributes.has(attribute.nodeName)) { + toNode.setAttribute(attribute.nodeName, attribute.nodeValue); + } + } + } + + /** + * Changes the 'partition' attribute of |webview_|. If |webview_| has + * already navigated, this function re-creates it since the storage + * partition of an active renderer process cannot change. + * @param {string} newWebviewPartitionName the new partition + * @private + */ + setWebviewPartition(newWebviewPartitionName) { + if (!this.webview_.src) { + // We have not navigated anywhere yet. Note that a webview's src + // attribute does not allow a change back to "". + this.webview_.partition = newWebviewPartitionName; + } else if (this.webview_.partition != newWebviewPartitionName) { + // The webview has already navigated. We have to re-create it. + const webivewParent = this.webview_.parentElement; + + // Copy all attributes except for partition and src from the previous + // webview. Use the specified |newWebviewPartitionName|. + const newWebview = document.createElement('webview'); + this.copyAttributes_( + this.webview_, newWebview, new Set(['src', 'partition'])); + newWebview.partition = newWebviewPartitionName; + + webivewParent.replaceChild(newWebview, this.webview_); + + this.rebindWebview_(newWebview); + } + } + + /** * Loads the authenticator component with the given parameters. * @param {AuthMode} authMode Authorization mode. * @param {Object} data Parameters for the authorization flow.
diff --git a/chrome/browser/resources/pdf/elements/viewer-error-screen/viewer-error-screen.html b/chrome/browser/resources/pdf/elements/viewer-error-screen/viewer-error-screen.html index 97ddcc1..25737d4 100644 --- a/chrome/browser/resources/pdf/elements/viewer-error-screen/viewer-error-screen.html +++ b/chrome/browser/resources/pdf/elements/viewer-error-screen/viewer-error-screen.html
@@ -1,20 +1,19 @@ <link rel="import" href="chrome://resources/html/polymer.html"> +<link rel="import" href="chrome://resources/cr_elements/cr_button/cr_button.html"> <link rel="import" href="chrome://resources/cr_elements/cr_dialog/cr_dialog.html"> <link rel="import" href="chrome://resources/cr_elements/hidden_style_css.html"> -<link rel="import" href="chrome://resources/cr_elements/paper_button_style_css.html"> -<link rel="import" href="chrome://resources/polymer/v1_0/paper-button/paper-button.html"> <dom-module id="viewer-error-screen"> <template> - <style include="paper-button-style cr-hidden-style"></style> + <style include="cr-hidden-style"></style> <cr-dialog id="dialog" no-cancel> <div slot="title">[[strings.errorDialogTitle]]</div> <div slot="body">[[strings.pageLoadFailed]]</div> <div slot="button-container" hidden$="[[!reloadFn]]"> - <paper-button class="action-button" on-click="reload"> + <cr-button class="action-button" on-click="reload"> [[strings.pageReload]] - </paper-button> + </cr-button> </div> </cr-dialog> </template>
diff --git a/chrome/browser/resources/pdf/elements/viewer-form-warning/viewer-form-warning.html b/chrome/browser/resources/pdf/elements/viewer-form-warning/viewer-form-warning.html index e86b791..1e9e1ee 100644 --- a/chrome/browser/resources/pdf/elements/viewer-form-warning/viewer-form-warning.html +++ b/chrome/browser/resources/pdf/elements/viewer-form-warning/viewer-form-warning.html
@@ -1,23 +1,22 @@ <link rel="import" href="chrome://resources/html/polymer.html"> +<link rel="import" href="chrome://resources/cr_elements/cr_button/cr_button.html"> <link rel="import" href="chrome://resources/cr_elements/cr_dialog/cr_dialog.html"> <link rel="import" href="chrome://resources/cr_elements/hidden_style_css.html"> -<link rel="import" href="chrome://resources/cr_elements/paper_button_style_css.html"> -<link rel="import" href="chrome://resources/polymer/v1_0/paper-button/paper-button.html"> <dom-module id="viewer-form-warning"> <template> - <style include="paper-button-style cr-hidden-style"></style> + <style include="cr-hidden-style"></style> <cr-dialog id="dialog" no-cancel> <div slot="title">[[strings.annotationFormWarningTitle]]</div> <div slot="body">[[strings.annotationFormWarningDetail]]</div> <div slot="button-container"> - <paper-button class="cancel-button" on-click="onCancel"> + <cr-button class="cancel-button" on-click="onCancel"> [[strings.annotationFormWarningKeepEditing]] - </paper-button> - <paper-button class="action-button" on-click="onAction"> + </cr-button> + <cr-button class="action-button" on-click="onAction"> [[strings.annotationFormWarningDiscard]] - </paper-button> + </cr-button> </div> </cr-dialog> </template>
diff --git a/chrome/browser/resources/pdf/elements/viewer-password-screen/viewer-password-screen.html b/chrome/browser/resources/pdf/elements/viewer-password-screen/viewer-password-screen.html index 5120c53..aebc16bf 100644 --- a/chrome/browser/resources/pdf/elements/viewer-password-screen/viewer-password-screen.html +++ b/chrome/browser/resources/pdf/elements/viewer-password-screen/viewer-password-screen.html
@@ -1,15 +1,14 @@ <link rel="import" href="chrome://resources/html/polymer.html"> +<link rel="import" href="chrome://resources/cr_elements/cr_button/cr_button.html"> <link rel="import" href="chrome://resources/cr_elements/cr_dialog/cr_dialog.html"> <link rel="import" href="chrome://resources/cr_elements/cr_input/cr_input.html"> -<link rel="import" href="chrome://resources/cr_elements/paper_button_style_css.html"> <link rel="import" href="chrome://resources/cr_elements/shared_style_css.html"> <link rel="import" href="chrome://resources/cr_elements/shared_vars_css.html"> -<link rel="import" href="chrome://resources/polymer/v1_0/paper-button/paper-button.html"> <dom-module id="viewer-password-screen"> <template> - <style include="cr-shared-style paper-button-style"> + <style include="cr-shared-style"> #password { margin-top: var(--cr-form-field-bottom-spacing); } @@ -26,9 +25,9 @@ </cr-input> </div> <div slot="button-container"> - <paper-button id="submit" class="action-button" on-click="submit"> + <cr-button id="submit" class="action-button" on-click="submit"> [[strings.passwordSubmit]] - </paper-button> + </cr-button> </div> </cr-dialog> </template>
diff --git a/chrome/browser/resources/pdf/elements/viewer-toolbar-dropdown/viewer-toolbar-dropdown.html b/chrome/browser/resources/pdf/elements/viewer-toolbar-dropdown/viewer-toolbar-dropdown.html index 50dadbe0..2f593e85 100644 --- a/chrome/browser/resources/pdf/elements/viewer-toolbar-dropdown/viewer-toolbar-dropdown.html +++ b/chrome/browser/resources/pdf/elements/viewer-toolbar-dropdown/viewer-toolbar-dropdown.html
@@ -1,6 +1,6 @@ <link rel="import" href="chrome://resources/html/polymer.html"> -<link rel="import" href="chrome://resources/polymer/v1_0/paper-button/paper-button.html"> +<link rel="import" href="chrome://resources/cr_elements/cr_icon_button/cr_icon_button.html"> <link rel="import" href="chrome://resources/cr_elements/icons.html"> <link rel="import" href="chrome://resources/cr_elements/shared_vars_css.html"> @@ -49,23 +49,11 @@ } #button { - border-radius: 4px; - cursor: pointer; - display: inline-block; - height: 32px; + --cr-icon-button-color: currentColor; + --cr-icon-button-height: 32px; + --cr-icon-button-icon-start-offset: 4px; + --cr-icon-button-width: 48px; margin: 0; - min-width: 48px; - opacity: 0.38; - padding-bottom: 6px; - padding-inline-end: 2px; - padding-inline-start: 6px; - padding-top: 6px; - width: 48px; - } - - #button:focus { - background-color: rgba(255, 255, 255, 0.24); - opacity: 1; } #button:hover { @@ -89,11 +77,9 @@ padding: 14px 28px; } </style> - <paper-button on-click="toggleDropdown" id="button" - aria-label$="{{header}}" title$="{{header}}"> - <iron-icon icon="[[dropdownIcon]]"></iron-icon> - <iron-icon icon="cr:arrow-drop-down"></iron-icon> - </paper-button> + <cr-icon-button on-click="toggleDropdown" id="button" + iron-icon="[[dropdownIcon]],cr:arrow-drop-down" title$="[[header]]"> + </cr-icon-button> <div id="container"> <div id="dropdown" style="display: none">
diff --git a/chrome/browser/resources/print_preview/ui/print_preview_search_box.html b/chrome/browser/resources/print_preview/ui/print_preview_search_box.html index f9d6244..2949087 100644 --- a/chrome/browser/resources/print_preview/ui/print_preview_search_box.html +++ b/chrome/browser/resources/print_preview/ui/print_preview_search_box.html
@@ -45,6 +45,10 @@ right: auto; } + :host([has-search-text]) cr-input { + --cr-input-padding-end: 24px; + } + .search-box-input { width: 100%; }
diff --git a/chrome/browser/resources/settings/about_page/about_page.js b/chrome/browser/resources/settings/about_page/about_page.js index 7f9047f..437e286 100644 --- a/chrome/browser/resources/settings/about_page/about_page.js +++ b/chrome/browser/resources/settings/about_page/about_page.js
@@ -143,7 +143,10 @@ }, /** @private */ - showTPMFirmwareUpdateLineItem_: Boolean, + showTPMFirmwareUpdateLineItem_: { + type: Boolean, + value: false, + }, /** @private */ showTPMFirmwareUpdateDialog_: Boolean,
diff --git a/chrome/browser/resources/settings/basic_page/basic_page.html b/chrome/browser/resources/settings/basic_page/basic_page.html index 2f3d131..ee51945 100644 --- a/chrome/browser/resources/settings/basic_page/basic_page.html +++ b/chrome/browser/resources/settings/basic_page/basic_page.html
@@ -302,7 +302,8 @@ restamp> <settings-section page-title="$i18n{languagesPageTitle}" section="languages"> - <settings-languages-page prefs="{{prefs}}"> + <settings-languages-page prefs="{{prefs}}" + page-visibility="[[pageVisibility.languages]]"> </settings-languages-page> </settings-section> </template>
diff --git a/chrome/browser/resources/settings/chromeos/lazy_load.html b/chrome/browser/resources/settings/chromeos/lazy_load.html index 5ef4a0c..4035d44 100644 --- a/chrome/browser/resources/settings/chromeos/lazy_load.html +++ b/chrome/browser/resources/settings/chromeos/lazy_load.html
@@ -1,11 +1,11 @@ <html> <head></head> <body> - <link rel="import" href="os_a11y_page/os_a11y_page.html"> <link rel="import" href="../date_time_page/date_time_page.html"> - <link rel="import" href="../languages_page/languages_page.html"> <link rel="import" href="../printing_page/printing_page.html"> + <link rel="import" href="os_a11y_page/os_a11y_page.html"> <link rel="import" href="os_downloads_page/os_downloads_page.html"> + <link rel="import" href="os_languages_page/os_languages_page.html"> <link rel="import" href="os_privacy_page/os_privacy_page.html"> <link rel="import" href="os_reset_page/os_reset_page.html"> </body>
diff --git a/chrome/browser/resources/settings/chromeos/os_languages_page/BUILD.gn b/chrome/browser/resources/settings/chromeos/os_languages_page/BUILD.gn new file mode 100644 index 0000000..91a4040 --- /dev/null +++ b/chrome/browser/resources/settings/chromeos/os_languages_page/BUILD.gn
@@ -0,0 +1,63 @@ +# Copyright 2018 The Chromium Authors. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +import("//third_party/closure_compiler/compile_js.gni") + +js_type_check("closure_compile") { + deps = [ + ":os_add_languages_dialog", + ":os_languages", + ":os_languages_page", + "../../languages_page:languages_browser_proxy", + "../../languages_page:languages_types", + "../../languages_page:manage_input_methods_page", + ] +} + +js_library("os_languages") { + deps = [ + "../../languages_page:languages_browser_proxy", + "../../languages_page:languages_types", + "../../prefs", + "../../prefs:prefs_types", + "//ui/webui/resources/js:assert", + "//ui/webui/resources/js:cr", + "//ui/webui/resources/js:i18n_behavior", + "//ui/webui/resources/js:promise_resolver", + ] + externs_list = [ + "$externs_path/input_method_private.js", + "$externs_path/language_settings_private.js", + ] + extra_sources = [ + "$interfaces_path/input_method_private_interface.js", + "$interfaces_path/language_settings_private_interface.js", + ] +} + +js_library("os_languages_page") { + deps = [ + ":os_languages", + "../..:lifetime_browser_proxy", + "../..:route", + "../../langauges_page:languages_types", + "../../settings_page:settings_animated_pages", + "//ui/webui/resources/cr_elements/cr_action_menu:cr_action_menu", + "//ui/webui/resources/cr_elements/cr_expand_button:cr_expand_button", + "//ui/webui/resources/cr_elements/cr_lazy_render:cr_lazy_render", + "//ui/webui/resources/js:assert", + "//ui/webui/resources/js:cr", + "//ui/webui/resources/js:load_time_data", + "//ui/webui/resources/js/cr/ui:focus_without_ink", + ] +} + +js_library("os_add_languages_dialog") { + deps = [ + ":os_languages", + "//ui/webui/resources/cr_elements:cr_scrollable_behavior", + "//ui/webui/resources/cr_elements/cr_search_field:cr_search_field", + "//ui/webui/resources/js:find_shortcut_behavior", + ] +}
diff --git a/chrome/browser/resources/settings/chromeos/os_languages_page/os_add_languages_dialog.html b/chrome/browser/resources/settings/chromeos/os_languages_page/os_add_languages_dialog.html new file mode 100644 index 0000000..8a2215a3 --- /dev/null +++ b/chrome/browser/resources/settings/chromeos/os_languages_page/os_add_languages_dialog.html
@@ -0,0 +1,78 @@ +<link rel="import" href="chrome://resources/html/polymer.html"> + +<link rel="import" href="chrome://resources/cr_elements/cr_checkbox/cr_checkbox.html"> +<link rel="import" href="chrome://resources/cr_elements/cr_scrollable_behavior.html"> +<link rel="import" href="chrome://resources/cr_elements/cr_search_field/cr_search_field.html"> +<link rel="import" href="chrome://resources/cr_elements/cr_dialog/cr_dialog.html"> +<link rel="import" href="chrome://resources/cr_elements/shared_vars_css.html"> +<link rel="import" href="chrome://resources/html/find_shortcut_behavior.html"> +<link rel="import" href="chrome://resources/polymer/v1_0/iron-list/iron-list.html"> +<link rel="import" href="chrome://resources/polymer/v1_0/paper-button/paper-button.html"> +<link rel="import" href="os_languages.html"> +<link rel="import" href="../../settings_shared_css.html"> + +<dom-module id="os-settings-add-languages-dialog"> + <template> + <style include="settings-shared"> + cr-dialog { + --cr-dialog-body: { + padding-inline-end: 0; + display: flex; + flex-direction: column; + height: 350px; + overflow: auto; + }; + } + + cr-search-field { + padding-inline-end: 24px; + } + + iron-list { + flex: 1; + } + + .ripple-padding { + /* Create a little extra space for checkbox ink ripple to flow into. */ + padding-inline-start: 20px; + } + + cr-checkbox { + --cr-checkbox-label-container: { + white-space: nowrap; + }; + } + </style> + <cr-dialog id="dialog" close-text="$i18n{close}"> + <div slot="title">$i18n{addLanguagesDialogTitle}</div> + <div slot="body" scrollable> + <cr-search-field label="$i18n{searchLanguages}" id="search" + on-search-changed="onSearchChanged_" + on-keydown="onKeydown_" autofocus> + </cr-search-field> + <iron-list class="ripple-padding" scroll-target="[[$$('[slot=body]')]]" + items="[[getLanguages_( + languages.supported, languages.enabled.*, filterValue_)]]"> + <template> + <cr-checkbox class="list-item no-outline" + checked="[[willAdd_(item.code)]]" tab-index="[[tabIndex]]" + title$="[[item.nativeDisplayName]]" + on-change="onLanguageCheckboxChange_"> + [[getDisplayText_(item)]] + </cr-checkbox> + </template> + </iron-list> + </div> + <div slot="button-container"> + <paper-button class="cancel-button" on-click="onCancelButtonTap_"> + $i18n{cancel} + </paper-button> + <paper-button class="action-button" on-click="onActionButtonTap_" + disabled="[[disableActionButton_]]"> + $i18n{add} + </paper-button> + </div> + </cr-dialog> + </template> + <script src="os_add_languages_dialog.js"></script> +</dom-module>
diff --git a/chrome/browser/resources/settings/chromeos/os_languages_page/os_add_languages_dialog.js b/chrome/browser/resources/settings/chromeos/os_languages_page/os_add_languages_dialog.js new file mode 100644 index 0000000..3eaa9945 --- /dev/null +++ b/chrome/browser/resources/settings/chromeos/os_languages_page/os_add_languages_dialog.js
@@ -0,0 +1,171 @@ +// 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. + +/** + * @fileoverview 'os-settings-add-languages-dialog' is a dialog for enabling + * languages. + */ +Polymer({ + is: 'os-settings-add-languages-dialog', + + behaviors: [ + CrScrollableBehavior, + FindShortcutBehavior, + ], + + properties: { + /** @type {!LanguagesModel|undefined} */ + languages: { + type: Object, + notify: true, + }, + + /** @type {!LanguageHelper} */ + languageHelper: Object, + + /** @private {!Set<string>} */ + languagesToAdd_: { + type: Object, + value: function() { + return new Set(); + }, + }, + + /** @private */ + disableActionButton_: { + type: Boolean, + value: true, + }, + + /** @private */ + filterValue_: { + type: String, + value: '', + }, + }, + + /** @override */ + attached: function() { + this.$.dialog.showModal(); + }, + + // Override FindShortcutBehavior methods. + handleFindShortcut: function(modalContextOpen) { + // Assumes this is the only open modal. + const searchInput = this.$.search.getSearchInput(); + searchInput.scrollIntoViewIfNeeded(); + if (!this.searchInputHasFocus()) { + searchInput.focus(); + } + return true; + }, + + // Override FindShortcutBehavior methods. + searchInputHasFocus: function() { + return this.$.search.getSearchInput() == + this.$.search.shadowRoot.activeElement; + }, + + /** + * @param {!CustomEvent<string>} e + * @private + */ + onSearchChanged_: function(e) { + this.filterValue_ = e.detail; + }, + + /** + * @return {!Array<!chrome.languageSettingsPrivate.Language>} A list of + * languages to be displayed. + * @private + */ + getLanguages_: function() { + const filterValue = + this.filterValue_ ? this.filterValue_.toLowerCase() : null; + return this.languages.supported.filter(language => { + if (!this.languageHelper.canEnableLanguage(language)) { + return false; + } + + if (filterValue === null) { + return true; + } + + return language.displayName.toLowerCase().includes(filterValue) || + language.nativeDisplayName.toLowerCase().includes(filterValue); + }); + }, + + /** + * @param {!chrome.languageSettingsPrivate.Language} language + * @return {string} The text to be displayed. + * @private + */ + getDisplayText_: function(language) { + let displayText = language.displayName; + // If the native name is different, add it. + if (language.displayName != language.nativeDisplayName) { + displayText += ' - ' + language.nativeDisplayName; + } + return displayText; + }, + + /** + * True if the user has chosen to add this language (checked its checkbox). + * @param {string} languageCode + * @return {boolean} + * @private + */ + willAdd_: function(languageCode) { + return this.languagesToAdd_.has(languageCode); + }, + + /** + * Handler for checking or unchecking a language item. + * @param {!{model: !{item: !chrome.languageSettingsPrivate.Language}, + * target: !Element}} e + * @private + */ + onLanguageCheckboxChange_: function(e) { + // Add or remove the item to the Set. No need to worry about data binding: + // willAdd_ is called to initialize the checkbox state (in case the + // iron-list re-uses a previous checkbox), and the checkbox can only be + // changed after that by user action. + const language = e.model.item; + if (e.target.checked) { + this.languagesToAdd_.add(language.code); + } else { + this.languagesToAdd_.delete(language.code); + } + + this.disableActionButton_ = !this.languagesToAdd_.size; + }, + + /** @private */ + onCancelButtonTap_: function() { + this.$.dialog.close(); + }, + + /** + * Enables the checked languages. + * @private + */ + onActionButtonTap_: function() { + this.$.dialog.close(); + this.languagesToAdd_.forEach(languageCode => { + this.languageHelper.enableLanguage(languageCode); + }); + }, + + /** + * @param {!KeyboardEvent} e + * @private + */ + onKeydown_: function(e) { + // Close dialog if 'esc' is pressed and the search box is already empty. + if (e.key == 'Escape' && !this.$.search.getValue().trim()) { + this.$.dialog.close(); + } + }, +});
diff --git a/chrome/browser/resources/settings/chromeos/os_languages_page/os_languages.html b/chrome/browser/resources/settings/chromeos/os_languages_page/os_languages.html new file mode 100644 index 0000000..5bcb83f1 --- /dev/null +++ b/chrome/browser/resources/settings/chromeos/os_languages_page/os_languages.html
@@ -0,0 +1,9 @@ +<link rel="import" href="chrome://resources/html/polymer.html"> + +<link rel="import" href="chrome://resources/html/assert.html"> +<link rel="import" href="chrome://resources/html/cr.html"> +<link rel="import" href="chrome://resources/html/promise_resolver.html"> +<link rel="import" href="../../prefs/prefs.html"> +<link rel="import" href="../../prefs/prefs_behavior.html"> +<link rel="import" href="../../languages_page/languages_browser_proxy.html"> +<script src="os_languages.js"></script>
diff --git a/chrome/browser/resources/settings/chromeos/os_languages_page/os_languages.js b/chrome/browser/resources/settings/chromeos/os_languages_page/os_languages.js new file mode 100644 index 0000000..c9a18e6 --- /dev/null +++ b/chrome/browser/resources/settings/chromeos/os_languages_page/os_languages.js
@@ -0,0 +1,853 @@ +// 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. + +/** + * @fileoverview 'os-settings-languages' handles Chrome's language and input + * method settings. The 'languages' property, which reflects the current + * language settings, must not be changed directly. Instead, changes to + * language settings should be made using the LanguageHelper APIs provided by + * this class via languageHelper. + */ + +(function() { +'use strict'; + +cr.exportPath('settings'); + +const MoveType = chrome.languageSettingsPrivate.MoveType; + +// Translate server treats some language codes the same. +// See also: components/translate/core/common/translate_util.cc. +const kLanguageCodeToTranslateCode = { + 'nb': 'no', + 'fil': 'tl', + 'zh-HK': 'zh-TW', + 'zh-MO': 'zh-TW', + 'zh-SG': 'zh-CN', +}; + +// Some ISO 639 language codes have been renamed, e.g. "he" to "iw", but +// Translate still uses the old versions. TODO(michaelpg): Chrome does too. +// Follow up with Translate owners to understand the right thing to do. +const kTranslateLanguageSynonyms = { + 'he': 'iw', + 'jv': 'jw', +}; + +// The fake language name used for ARC IMEs. The value must be in sync with the +// one in ui/base/ime/chromeos/extension_ime_util.h. +const kArcImeLanguage = '_arc_ime_language_'; + +const preferredLanguagesPrefName = 'settings.language.preferred_languages'; + +/** + * Singleton element that generates the languages model on start-up and + * updates it whenever Chrome's pref store and other settings change. + * @implements {LanguageHelper} + */ +Polymer({ + is: 'os-settings-languages', + + behaviors: [PrefsBehavior], + + properties: { + /** + * @type {!LanguagesModel|undefined} + */ + languages: { + type: Object, + notify: true, + readOnly: true, + }, + + /** + * This element, as a LanguageHelper instance for API usage. + * @type {!LanguageHelper} + */ + languageHelper: { + type: Object, + notify: true, + readOnly: true, + value: function() { + return /** @type {!LanguageHelper} */ (this); + }, + }, + + /** + * PromiseResolver to be resolved when the singleton has been initialized. + * @private {!PromiseResolver} + */ + resolver_: { + type: Object, + value: function() { + return new PromiseResolver(); + }, + }, + + /** + * Hash map of supported languages by language codes for fast lookup. + * @private {!Map<string, !chrome.languageSettingsPrivate.Language>} + */ + supportedLanguageMap_: { + type: Object, + value: function() { + return new Map(); + }, + }, + + /** + * Hash set of enabled language codes for membership testing. + * @private {!Set<string>} + */ + enabledLanguageSet_: { + type: Object, + value: function() { + return new Set(); + }, + }, + + /** + * Hash map of supported input methods by ID for fast lookup. + * @private {!Map<string, chrome.languageSettingsPrivate.InputMethod>} + */ + supportedInputMethodMap_: { + type: Object, + value: function() { + return new Map(); + }, + }, + + /** + * Hash map of input methods supported for each language. + * @type {!Map<string, + * !Array<!chrome.languageSettingsPrivate.InputMethod>>} + * @private + */ + languageInputMethods_: { + type: Object, + value: function() { + return new Map(); + }, + }, + + /** @private Prospective UI language when the page was loaded. */ + originalProspectiveUILanguage_: String, + }, + + observers: [ + // All observers wait for the model to be populated by including the + // |languages| property. + 'prospectiveUILanguageChanged_(prefs.intl.app_locale.value, languages)', + 'preferredLanguagesPrefChanged_(' + + 'prefs.' + preferredLanguagesPrefName + '.value, languages)', + 'translateLanguagesPrefChanged_(' + + 'prefs.translate_blocked_languages.value.*, languages)', + 'updateRemovableLanguages_(' + + 'prefs.intl.app_locale.value, languages.enabled)', + 'updateRemovableLanguages_(' + + 'prefs.translate_blocked_languages.value.*)', + 'updateRemovableLanguages_(' + + 'prefs.settings.language.preload_engines.value, ' + + 'prefs.settings.language.enabled_extension_imes.value, ' + + 'languages)', + ], + + /** @private {?Function} */ + boundOnInputMethodChanged_: null, + + /** @private {?settings.LanguagesBrowserProxy} */ + browserProxy_: null, + + /** @private {?LanguageSettingsPrivate} */ + languageSettingsPrivate_: null, + + /** @private {?InputMethodPrivate} */ + inputMethodPrivate_: null, + + /** @private {?Function} */ + boundOnInputMethodAdded_: null, + + /** @private {?Function} */ + boundOnInputMethodRemoved_: null, + + /** @override */ + attached: function() { + this.browserProxy_ = settings.LanguagesBrowserProxyImpl.getInstance(); + this.languageSettingsPrivate_ = + this.browserProxy_.getLanguageSettingsPrivate(); + this.inputMethodPrivate_ = this.browserProxy_.getInputMethodPrivate(); + + const promises = []; + + // Wait until prefs are initialized before creating the model, so we can + // include information about enabled languages. + promises[0] = CrSettingsPrefs.initialized; + + // Get the language list. + promises[1] = new Promise(resolve => { + this.languageSettingsPrivate_.getLanguageList(resolve); + }); + + // Get the translate target language. + promises[2] = new Promise(resolve => { + this.languageSettingsPrivate_.getTranslateTargetLanguage(resolve); + }); + + promises[3] = new Promise(resolve => { + this.languageSettingsPrivate_.getInputMethodLists(function(lists) { + resolve( + lists.componentExtensionImes.concat(lists.thirdPartyExtensionImes)); + }); + }); + + promises[4] = new Promise(resolve => { + this.inputMethodPrivate_.getCurrentInputMethod(resolve); + }); + + // Fetch the starting UI language, which affects which actions should be + // enabled. + promises.push(this.browserProxy_.getProspectiveUILanguage().then( + prospectiveUILanguage => { + this.originalProspectiveUILanguage_ = + prospectiveUILanguage || window.navigator.language; + })); + + Promise.all(promises).then(results => { + if (!this.isConnected) { + // Return early if this element was detached from the DOM before + // this async callback executes (can happen during testing). + return; + } + + this.createModel_(results[1], results[2], results[3], results[4]); + this.resolver_.resolve(); + }); + + this.boundOnInputMethodChanged_ = this.onInputMethodChanged_.bind(this); + this.inputMethodPrivate_.onChanged.addListener( + assert(this.boundOnInputMethodChanged_)); + this.boundOnInputMethodAdded_ = this.onInputMethodAdded_.bind(this); + this.languageSettingsPrivate_.onInputMethodAdded.addListener( + this.boundOnInputMethodAdded_); + this.boundOnInputMethodRemoved_ = this.onInputMethodRemoved_.bind(this); + this.languageSettingsPrivate_.onInputMethodRemoved.addListener( + this.boundOnInputMethodRemoved_); + }, + + /** @override */ + detached: function() { + this.inputMethodPrivate_.onChanged.removeListener( + assert(this.boundOnInputMethodChanged_)); + this.boundOnInputMethodChanged_ = null; + this.languageSettingsPrivate_.onInputMethodAdded.removeListener( + assert(this.boundOnInputMethodAdded_)); + this.boundOnInputMethodAdded_ = null; + this.languageSettingsPrivate_.onInputMethodRemoved.removeListener( + assert(this.boundOnInputMethodRemoved_)); + this.boundOnInputMethodRemoved_ = null; + }, + + /** + * Updates the prospective UI language based on the new pref value. + * @param {string} prospectiveUILanguage + * @private + */ + prospectiveUILanguageChanged_: function(prospectiveUILanguage) { + this.set( + 'languages.prospectiveUILanguage', + prospectiveUILanguage || this.originalProspectiveUILanguage_); + }, + + /** + * Updates the list of enabled languages from the preferred languages pref. + * @private + */ + preferredLanguagesPrefChanged_: function() { + if (this.prefs == undefined || this.languages == undefined) { + return; + } + + const enabledLanguageStates = this.getEnabledLanguageStates_( + this.languages.translateTarget, this.languages.prospectiveUILanguage); + + // Recreate the enabled language set before updating languages.enabled. + this.enabledLanguageSet_.clear(); + for (let i = 0; i < enabledLanguageStates.length; i++) { + this.enabledLanguageSet_.add(enabledLanguageStates[i].language.code); + } + + this.set('languages.enabled', enabledLanguageStates); + + // Update translate target language. + new Promise(resolve => { + this.languageSettingsPrivate_.getTranslateTargetLanguage(resolve); + }).then(result => { + this.set('languages.translateTarget', result); + }); + }, + + /** @private */ + translateLanguagesPrefChanged_: function() { + if (this.prefs == undefined || this.languages == undefined) { + return; + } + + const translateBlockedPref = this.getPref('translate_blocked_languages'); + const translateBlockedSet = this.makeSetFromArray_( + /** @type {!Array<string>} */ (translateBlockedPref.value)); + + for (let i = 0; i < this.languages.enabled.length; i++) { + const language = this.languages.enabled[i].language; + const translateEnabled = this.isTranslateEnabled_( + language.code, !!language.supportsTranslate, translateBlockedSet, + this.languages.translateTarget, this.languages.prospectiveUILanguage); + this.set( + 'languages.enabled.' + i + '.translateEnabled', translateEnabled); + } + }, + + /** + * Constructs the languages model. + * @param {!Array<!chrome.languageSettingsPrivate.Language>} + * supportedLanguages + * @param {string} translateTarget Language code of the default translate + * target language. + * @param {!Array<!chrome.languageSettingsPrivate.InputMethod>} + * supportedInputMethods Input methods. + * @param {string} currentInputMethodId ID of the currently used + * input method. + * @private + */ + createModel_: function( + supportedLanguages, translateTarget, supportedInputMethods, + currentInputMethodId) { + // Populate the hash map of supported languages. + for (let i = 0; i < supportedLanguages.length; i++) { + const language = supportedLanguages[i]; + language.supportsUI = !!language.supportsUI; + language.supportsTranslate = !!language.supportsTranslate; + language.isProhibitedLanguage = !!language.isProhibitedLanguage; + this.supportedLanguageMap_.set(language.code, language); + } + + if (supportedInputMethods) { + this.createInputMethodModel_(supportedInputMethods); + } + + const prospectiveUILanguage = + /** @type {string} */ (this.getPref('intl.app_locale').value) || + this.originalProspectiveUILanguage_; + + // Create a list of enabled languages from the supported languages. + const enabledLanguageStates = + this.getEnabledLanguageStates_(translateTarget, prospectiveUILanguage); + // Populate the hash set of enabled languages. + for (let l = 0; l < enabledLanguageStates.length; l++) { + this.enabledLanguageSet_.add(enabledLanguageStates[l].language.code); + } + + const model = /** @type {!LanguagesModel} */ ({ + supported: supportedLanguages, + enabled: enabledLanguageStates, + translateTarget: translateTarget, + }); + + model.prospectiveUILanguage = prospectiveUILanguage; + model.inputMethods = /** @type {!InputMethodsModel} */ ({ + supported: supportedInputMethods, + enabled: this.getEnabledInputMethods_(), + currentId: currentInputMethodId, + }); + + // Initialize the Polymer languages model. + this._setLanguages(model); + }, + + /** + * Constructs the input method part of the languages model. + * @param {!Array<!chrome.languageSettingsPrivate.InputMethod>} + * supportedInputMethods Input methods. + * @private + */ + createInputMethodModel_: function(supportedInputMethods) { + // Populate the hash map of supported input methods. + this.supportedInputMethodMap_.clear(); + this.languageInputMethods_.clear(); + for (let j = 0; j < supportedInputMethods.length; j++) { + const inputMethod = supportedInputMethods[j]; + inputMethod.enabled = !!inputMethod.enabled; + inputMethod.isProhibitedByPolicy = !!inputMethod.isProhibitedByPolicy; + // Add the input method to the map of IDs. + this.supportedInputMethodMap_.set(inputMethod.id, inputMethod); + // Add the input method to the list of input methods for each language + // it supports. + for (let k = 0; k < inputMethod.languageCodes.length; k++) { + const languageCode = inputMethod.languageCodes[k]; + if (!this.supportedLanguageMap_.has(languageCode)) { + continue; + } + if (!this.languageInputMethods_.has(languageCode)) { + this.languageInputMethods_.set(languageCode, [inputMethod]); + } else { + this.languageInputMethods_.get(languageCode).push(inputMethod); + } + } + } + }, + + /** + * Returns a list of LanguageStates for each enabled language in the supported + * languages list. + * @param {string} translateTarget Language code of the default translate + * target language. + * @param {(string|undefined)} prospectiveUILanguage Prospective UI display + * language. + * @return {!Array<!LanguageState>} + * @private + */ + getEnabledLanguageStates_: function(translateTarget, prospectiveUILanguage) { + assert(CrSettingsPrefs.isInitialized); + + const pref = this.getPref(preferredLanguagesPrefName); + const enabledLanguageCodes = pref.value.split(','); + + const translateBlockedPref = this.getPref('translate_blocked_languages'); + const translateBlockedSet = this.makeSetFromArray_( + /** @type {!Array<string>} */ (translateBlockedPref.value)); + + const enabledLanguageStates = []; + for (let i = 0; i < enabledLanguageCodes.length; i++) { + const code = enabledLanguageCodes[i]; + const language = this.supportedLanguageMap_.get(code); + // Skip unsupported languages. + if (!language) { + continue; + } + const languageState = /** @type {LanguageState} */ ({}); + languageState.language = language; + languageState.translateEnabled = this.isTranslateEnabled_( + code, !!language.supportsTranslate, translateBlockedSet, + translateTarget, prospectiveUILanguage); + enabledLanguageStates.push(languageState); + } + return enabledLanguageStates; + }, + + /** + * True iff we translate pages that are in the given language. + * @param {string} code Language code. + * @param {boolean} supportsTranslate If translation supports the given + * language. + * @param {!Set<string>} translateBlockedSet Set of languages for which + * translation is blocked. + * @param {string} translateTarget Language code of the default translate + * target language. + * @param {(string|undefined)} prospectiveUILanguage Prospective UI display + * language. + * @return {boolean} + * @private + */ + isTranslateEnabled_: function( + code, supportsTranslate, translateBlockedSet, translateTarget, + prospectiveUILanguage) { + const translateCode = this.convertLanguageCodeForTranslate(code); + return supportsTranslate && !translateBlockedSet.has(translateCode) && + translateCode != translateTarget && + (!prospectiveUILanguage || code != prospectiveUILanguage); + }, + + /** + * Returns a list of enabled input methods. + * @return {!Array<!chrome.languageSettingsPrivate.InputMethod>} + * @private + */ + getEnabledInputMethods_: function() { + assert(CrSettingsPrefs.isInitialized); + + let enabledInputMethodIds = + this.getPref('settings.language.preload_engines').value.split(','); + enabledInputMethodIds = enabledInputMethodIds.concat( + this.getPref('settings.language.enabled_extension_imes') + .value.split(',')); + + // Return only supported input methods. + return enabledInputMethodIds + .map(id => this.supportedInputMethodMap_.get(id)) + .filter(function(inputMethod) { + return !!inputMethod; + }); + }, + + /** @private */ + updateSupportedInputMethods_: function() { + const promise = new Promise(resolve => { + this.languageSettingsPrivate_.getInputMethodLists(function(lists) { + resolve( + lists.componentExtensionImes.concat(lists.thirdPartyExtensionImes)); + }); + }); + promise.then(result => { + const supportedInputMethods = result; + this.createInputMethodModel_(supportedInputMethods); + this.set('languages.inputMethods.supported', supportedInputMethods); + this.updateEnabledInputMethods_(); + }); + }, + + /** @private */ + updateEnabledInputMethods_: function() { + const enabledInputMethods = this.getEnabledInputMethods_(); + const enabledInputMethodSet = this.makeSetFromArray_(enabledInputMethods); + + for (let i = 0; i < this.languages.inputMethods.supported.length; i++) { + this.set( + 'languages.inputMethods.supported.' + i + '.enabled', + enabledInputMethodSet.has(this.languages.inputMethods.supported[i])); + } + this.set('languages.inputMethods.enabled', enabledInputMethods); + }, + + /** + * Updates the |removable| property of the enabled language states based + * on what other languages and input methods are enabled. + * @private + */ + updateRemovableLanguages_: function() { + if (this.prefs == undefined || this.languages == undefined) { + return; + } + + // TODO(michaelpg): Enabled input methods can affect which languages are + // removable, so run updateEnabledInputMethods_ first (if it has been + // scheduled). + this.updateEnabledInputMethods_(); + + for (let i = 0; i < this.languages.enabled.length; i++) { + const languageState = this.languages.enabled[i]; + this.set( + 'languages.enabled.' + i + '.removable', + this.canDisableLanguage(languageState)); + } + }, + + /** + * Creates a Set from the elements of the array. + * @param {!Array<T>} list + * @return {!Set<T>} + * @template T + * @private + */ + makeSetFromArray_: function(list) { + return new Set(list); + }, + + // LanguageHelper implementation. + // TODO(michaelpg): replace duplicate docs with @override once b/24294625 + // is fixed. + + /** @return {!Promise} */ + whenReady: function() { + return this.resolver_.promise; + }, + + /** + * Sets the prospective UI language to the chosen language. This won't affect + * the actual UI language until a restart. + * @param {string} languageCode + */ + setProspectiveUILanguage: function(languageCode) { + this.browserProxy_.setProspectiveUILanguage(languageCode); + }, + + /** + * True if the prospective UI language was changed from its starting value. + * @return {boolean} + */ + requiresRestart: function() { + return this.originalProspectiveUILanguage_ != + this.languages.prospectiveUILanguage; + }, + + /** + * @return {string} The language code for ARC IMEs. + */ + getArcImeLanguageCode: function() { + return kArcImeLanguage; + }, + + /** + * @param {string} languageCode + * @return {boolean} True if the language is for ARC IMEs. + */ + isLanguageCodeForArcIme: function(languageCode) { + return languageCode == kArcImeLanguage; + }, + + /** + * @param {string} languageCode + * @return {boolean} True if the language is enabled. + */ + isLanguageEnabled: function(languageCode) { + return this.enabledLanguageSet_.has(languageCode); + }, + + /** + * Enables the language, making it available for input. + * @param {string} languageCode + */ + enableLanguage: function(languageCode) { + if (!CrSettingsPrefs.isInitialized) { + return; + } + + this.languageSettingsPrivate_.enableLanguage(languageCode); + }, + + /** + * Disables the language. + * @param {string} languageCode + */ + disableLanguage: function(languageCode) { + if (!CrSettingsPrefs.isInitialized) { + return; + } + + // Remove input methods that don't support any other enabled language. + const inputMethods = this.languageInputMethods_.get(languageCode) || []; + for (let i = 0; i < inputMethods.length; i++) { + const inputMethod = inputMethods[i]; + const supportsOtherEnabledLanguages = inputMethod.languageCodes.some( + otherLanguageCode => otherLanguageCode != languageCode && + this.isLanguageEnabled(otherLanguageCode)); + if (!supportsOtherEnabledLanguages) { + this.removeInputMethod(inputMethod.id); + } + } + + // Remove the language from preferred languages. + this.languageSettingsPrivate_.disableLanguage(languageCode); + }, + + /** + * @param {!LanguageState} languageState + * @return {boolean} + */ + isOnlyTranslateBlockedLanguage: function(languageState) { + return !languageState.translateEnabled && + this.languages.enabled.filter(lang => !lang.translateEnabled).length == + 1; + }, + + /** + * @param {!LanguageState} languageState + * @return {boolean} + */ + canDisableLanguage: function(languageState) { + // Cannot disable the prospective UI language. + if (languageState.language.code == this.languages.prospectiveUILanguage) { + return false; + } + + // Cannot disable the only enabled language. + if (this.languages.enabled.length == 1) { + return false; + } + + // Cannot disable the last translate blocked language. + if (this.isOnlyTranslateBlockedLanguage(languageState)) { + return false; + } + + // If this is the only enabled language that is supported by all enabled + // component IMEs, it cannot be disabled because we need those IMEs. + const otherInputMethodsEnabled = + this.languages.enabled.some(function(otherLanguageState) { + const otherLanguageCode = otherLanguageState.language.code; + if (otherLanguageCode == languageState.language.code) { + return false; + } + const inputMethods = + this.languageInputMethods_.get(otherLanguageCode); + return inputMethods && inputMethods.some(function(inputMethod) { + return this.isComponentIme(inputMethod) && + this.supportedInputMethodMap_.get(inputMethod.id).enabled; + }, this); + }, this); + return otherInputMethodsEnabled; + }, + + /** + * @param {!chrome.languageSettingsPrivate.Language} language + * @return {boolean} true if the given language can be enabled + */ + canEnableLanguage(language) { + return !( + this.isLanguageEnabled(language.code) || + language.isProhibitedLanguage || + this.isLanguageCodeForArcIme(language.code) /* internal use only */); + }, + + /** + * Moves the language in the list of enabled languages either up (toward the + * front of the list) or down (toward the back). + * @param {string} languageCode + * @param {boolean} upDirection True if we need to move up, false if we + * need to move down + */ + moveLanguage: function(languageCode, upDirection) { + if (!CrSettingsPrefs.isInitialized) { + return; + } + + if (upDirection) { + this.languageSettingsPrivate_.moveLanguage(languageCode, MoveType.UP); + } else { + this.languageSettingsPrivate_.moveLanguage(languageCode, MoveType.DOWN); + } + }, + + /** + * Moves the language directly to the front of the list of enabled languages. + * @param {string} languageCode + */ + moveLanguageToFront: function(languageCode) { + if (!CrSettingsPrefs.isInitialized) { + return; + } + + this.languageSettingsPrivate_.moveLanguage(languageCode, MoveType.TOP); + }, + + /** + * Enables translate for the given language by removing the translate + * language from the blocked languages preference. + * @param {string} languageCode + */ + enableTranslateLanguage: function(languageCode) { + this.languageSettingsPrivate_.setEnableTranslationForLanguage( + languageCode, true); + }, + + /** + * Disables translate for the given language by adding the translate + * language to the blocked languages preference. + * @param {string} languageCode + */ + disableTranslateLanguage: function(languageCode) { + this.languageSettingsPrivate_.setEnableTranslationForLanguage( + languageCode, false); + }, + + /** + * Converts the language code for translate. There are some differences + * between the language set the Translate server uses and that for + * Accept-Language. + * @param {string} languageCode + * @return {string} The converted language code. + */ + convertLanguageCodeForTranslate: function(languageCode) { + if (languageCode in kLanguageCodeToTranslateCode) { + return kLanguageCodeToTranslateCode[languageCode]; + } + + const main = languageCode.split('-')[0]; + if (main == 'zh') { + // In Translate, general Chinese is not used, and the sub code is + // necessary as a language code for the Translate server. + return languageCode; + } + if (main in kTranslateLanguageSynonyms) { + return kTranslateLanguageSynonyms[main]; + } + + return main; + }, + + /** + * Given a language code, returns just the base language. E.g., converts + * 'en-GB' to 'en'. + * @param {string} languageCode + * @return {string} + */ + getLanguageCodeWithoutRegion: function(languageCode) { + // The Norwegian languages fall under the 'no' macrolanguage. + if (languageCode == 'nb' || languageCode == 'nn') { + return 'no'; + } + + // Match the characters before the hyphen. + const result = languageCode.match(/^([^-]+)-?/); + assert(result.length == 2); + return result[1]; + }, + + /** + * @param {string} languageCode + * @return {!chrome.languageSettingsPrivate.Language|undefined} + */ + getLanguage: function(languageCode) { + // If a languageCode is not found, try language without location. + return this.supportedLanguageMap_.get(languageCode) || + this.supportedLanguageMap_.get( + this.getLanguageCodeWithoutRegion(languageCode)); + }, + + /** @param {string} id */ + addInputMethod: function(id) { + if (!this.supportedInputMethodMap_.has(id)) { + return; + } + this.languageSettingsPrivate_.addInputMethod(id); + }, + + /** @param {string} id */ + removeInputMethod: function(id) { + if (!this.supportedInputMethodMap_.has(id)) { + return; + } + this.languageSettingsPrivate_.removeInputMethod(id); + }, + + /** @param {string} id */ + setCurrentInputMethod: function(id) { + this.inputMethodPrivate_.setCurrentInputMethod(id); + }, + + /** + * @param {string} languageCode + * @return {!Array<!chrome.languageSettingsPrivate.InputMethod>} + */ + getInputMethodsForLanguage: function(languageCode) { + return this.languageInputMethods_.get(languageCode) || []; + }, + + /** + * @param {!chrome.languageSettingsPrivate.InputMethod} inputMethod + * @return {boolean} + */ + isComponentIme: function(inputMethod) { + return inputMethod.id.startsWith('_comp_'); + }, + + /** @param {string} id Input method ID. */ + openInputMethodOptions: function(id) { + this.inputMethodPrivate_.openOptionsPage(id); + }, + + /** @param {string} id New current input method ID. */ + onInputMethodChanged_: function(id) { + this.set('languages.inputMethods.currentId', id); + }, + + /** @param {string} id Added input method ID. */ + onInputMethodAdded_: function(id) { + this.updateSupportedInputMethods_(); + }, + + /** @param {string} id Removed input method ID. */ + onInputMethodRemoved_: function(id) { + this.updateSupportedInputMethods_(); + }, +}); +})();
diff --git a/chrome/browser/resources/settings/chromeos/os_languages_page/os_languages_page.html b/chrome/browser/resources/settings/chromeos/os_languages_page/os_languages_page.html new file mode 100644 index 0000000..cf9e6d3 --- /dev/null +++ b/chrome/browser/resources/settings/chromeos/os_languages_page/os_languages_page.html
@@ -0,0 +1,301 @@ +<link rel="import" href="chrome://resources/html/polymer.html"> + +<link rel="import" href="chrome://resources/cr_elements/cr_checkbox/cr_checkbox.html"> +<link rel="import" href="chrome://resources/cr_elements/cr_icon_button/cr_icon_button.html"> +<link rel="import" href="chrome://resources/cr_elements/cr_link_row/cr_link_row.html"> +<link rel="import" href="chrome://resources/cr_elements/shared_vars_css.html"> +<link rel="import" href="chrome://resources/html/action_link.html"> +<link rel="import" href="chrome://resources/html/action_link_css.html"> +<link rel="import" href="chrome://resources/html/assert.html"> +<link rel="import" href="chrome://resources/html/cr.html"> +<link rel="import" href="chrome://resources/html/cr/ui/focus_without_ink.html"> +<link rel="import" href="chrome://resources/html/i18n_behavior.html"> +<link rel="import" href="chrome://resources/polymer/v1_0/iron-collapse/iron-collapse.html"> +<link rel="import" href="chrome://resources/polymer/v1_0/iron-icon/iron-icon.html"> +<link rel="import" href="chrome://resources/cr_elements/cr_action_menu/cr_action_menu.html"> +<link rel="import" href="chrome://resources/cr_elements/cr_expand_button/cr_expand_button.html"> +<link rel="import" href="chrome://resources/cr_elements/cr_lazy_render/cr_lazy_render.html"> +<link rel="import" href="chrome://resources/cr_elements/cr_toggle/cr_toggle.html"> +<link rel="import" href="chrome://resources/cr_elements/policy/cr_policy_pref_indicator.html"> +<link rel="import" href="chrome://resources/cr_elements/icons.html"> +<link rel="import" href="os_add_languages_dialog.html"> +<link rel="import" href="os_languages.html"> +<link rel="import" href="../../controls/controlled_radio_button.html"> +<link rel="import" href="../../controls/settings_radio_group.html"> +<link rel="import" href="../../controls/settings_toggle_button.html"> +<link rel="import" href="../../icons.html"> +<link rel="import" href="../../languages_page/manage_input_methods_page.html"> +<link rel="import" href="../../lifetime_browser_proxy.html"> +<link rel="import" href="../../prefs/prefs_behavior.html"> +<link rel="import" href="../../route.html"> +<link rel="import" href="../../settings_page/settings_animated_pages.html"> +<link rel="import" href="../../settings_page/settings_subpage.html"> +<link rel="import" href="../../settings_shared_css.html"> +<link rel="import" href="../../settings_vars_css.html"> + +<dom-module id="os-settings-languages-page"> + <template> + <style include="settings-shared action-link"> + #languagesCollapse .list-item.selected { + min-height: var(--settings-row-two-line-min-height); + } + + .explain-selected { + color: var(--google-green-refresh-700); + font-weight: initial; + margin-top: 4px; + } + + :host-context([dark]) .explain-selected { + color: var(--google-green-refresh-300); + } + + cr-action-menu.complex .dropdown-item { + min-height: 36px; + } + + cr-action-menu:not(.complex) hr { + display: none; + } + + cr-action-menu.complex hr { + /* Override user-agent border and margin. */ + border: none; + /* TODO(michaelpg): Update to whatever variable is used for the darker, + * full-width separators: crbug.com/649547. */ + border-top: var(--cr-separator-line); + margin: 6px 0 0 0; + } + + cr-checkbox.dropdown-item { + --cr-action-menu-disabled-item-opacity: 0.38; + margin-inline-start: 0; + } + + .icon-external { + /* The negative margin messes up the outline border. These are in an + indented list so this looks fine until moved: crbug.com/708286. */ + margin-inline-end: 0; + } + + #uiLanguageItem:focus, + #offerTranslations:focus { + background-color: transparent; + } + + #uiLanguageItem span { + line-height: 20px; + } + + #uiLanguageItem cr-policy-indicator { + float: right; + margin-inline-start: 20px; + } + + .name-with-error-list { + padding: 14px 0; + } + + .name-with-error-list div { + /* TODO(dbeam): does this need to differ from --settings-error-color? */ + color: var(--google-red-500); + margin-top: 8px; + } + + :host-context([dark]) .name-with-error-list div { + color: var(--settings-error-color); + } + + iron-icon[icon='cr:error'] { + @apply --cr-icon-height-width; + --iron-icon-fill-color: var(--settings-error-color); + margin-inline-end: 8px; + } + + .name-with-error-list[disabled] { + pointer-events: none; + } + + iron-icon.policy { + margin-inline-start: 10px; + } + + cr-policy-pref-indicator { + margin-inline-end: var(--settings-controlled-by-spacing); + } + + div.list-item.non-target .target-info { + display: none; + } + + /* Any .target.target-info following another .target element needs to + be hidden. We only want to show the _first_ .target-info of the list. + This is a way to do a :first-of-class selector. */ + div.list-item.target ~ div.list-item.target .target-info { + display: none; + } + + .restart-button { + margin-inline-start: var(--settings-controlled-by-spacing); + } + + </style> + <os-settings-languages languages="{{languages}}" prefs="{{prefs}}" + language-helper="{{languageHelper}}"> + </os-settings-languages> + <settings-animated-pages id="pages" section="languages" + focus-config="[[focusConfig_]]"> + <div route-path="default"> + <cr-expand-button + alt="$i18n{languagesExpandA11yLabel}" + class="settings-box first two-line" + expanded="{{languagesOpened_}}"> + <div>$i18n{languagesListTitle}</div> + <div class="secondary"> + [[getProspectiveUILanguageName_(languages.prospectiveUILanguage)]] + </div> + </cr-expand-button> + <iron-collapse id="languagesCollapse" opened="[[languagesOpened_]]"> + <span class="settings-box first" + hidden="[[isHelpTextHidden_(languages.enabled.*)]]"> + <span>$i18n{orderLanguagesInstructions}</span> + <a href="$i18n{languagesLearnMoreURL}" target="_blank"> + $i18n{learnMore} + </a> + </span> + <div class="list-frame vertical-list"> + <template is="dom-repeat" items="[[languages.enabled]]"> + <div class$="list-item [[getLanguageItemClass_( + item.language.code, language.prospectiveUILanguage)]]"> + <div class="start"> + <div title="[[item.language.nativeDisplayName]]"> + [[item.language.displayName]] + </div> + </div> + <template is="dom-if" if="[[isRestartRequired_( + item.language.code, languages.prospectiveUILanguage)]]"> + <paper-button class="restart-button" on-click="onRestartTap_"> + $i18n{restart} + </paper-button> + </template> + <cr-icon-button class="icon-more-vert" + title="$i18n{moreActions}" id="more-[[item.language.code]]" + on-click="onDotsTap_"></cr-icon-button> + </div> + </template> + <div class="list-item"> + <a is="action-link" class="list-button" id="addLanguages" + disabled="[[!canEnableSomeSupportedLanguage_(languages)]]" + on-click="onAddLanguagesTap_"> + $i18n{addLanguages} + </a> + </div> + </div> + </iron-collapse> + <cr-expand-button + alt="$i18n{inputMethodsExpandA11yLabel}" + class="settings-box two-line" + expanded="{{inputMethodsOpened_}}" + id="manageInputMethodsSubpageTrigger"> + <div>$i18n{inputMethodsListTitle}</div> + <div class="secondary"> + [[getInputMethodName_(languages.inputMethods.currentId)]] + </div> + </cr-expand-button> + <iron-collapse id="inputMethodsCollapse" + opened="[[inputMethodsOpened_]]"> + <div class="list-frame vertical-list"> + <template is="dom-repeat" + items="[[languages.inputMethods.enabled]]"> + <div class$="list-item [[getInputMethodItemClass_( + item.id, languages.inputMethods.currentId)]]" + on-click="onInputMethodTap_" on-keypress="onInputMethodTap_" + actionable tabindex="0"> + <div class="start"> + <div>[[item.displayName]]</div> + <div class="explain-selected" + hidden="[[!isCurrentInputMethod_( + item.id, languages.inputMethods.currentId)]]"> + $i18n{inputMethodEnabled} + </div> + </div> + <cr-icon-button class="icon-external" + hidden="[[!item.hasOptionsPage]]" + on-click="onInputMethodOptionsTap_"></cr-icon-button> + </div> + </template> + <cr-link-row class="hr list-item" id="manageInputMethods" + on-click="onManageInputMethodsTap_" + label="$i18n{manageInputMethods}"></cr-link-row> + </div> + <settings-toggle-button + pref="{{prefs.settings.language.ime_menu_activated}}" + label="$i18n{showImeMenu}" + hidden$="[[prefs.ash.kiosk_next_shell.enabled.value]]"> + </settings-toggle-button> + </iron-collapse> + <cr-lazy-render id="menu"> + <template> + <cr-action-menu + class="complex"> + <cr-checkbox id="uiLanguageItem" + class="dropdown-item" + checked="[[isProspectiveUILanguage_( + detailLanguage_.language.code, + languages.prospectiveUILanguage)]]" + on-change="onUILanguageChange_" + disabled="[[disableUILanguageCheckbox_( + detailLanguage_, languages.prospectiveUILanguage)]]"> + <span>$i18n{displayInThisLanguage}</span> + <iron-icon class="policy" icon="cr20:domain" hidden$="[[ + !detailLanguage_.language.isProhibitedLanguage]]"> + </iron-icon> + </cr-checkbox> + <hr hidden="[[!shouldShowDialogSeparator_(languages.enabled.*)]]"> + <button class="dropdown-item" role="menuitem" + on-click="onMoveToTopTap_" + hidden="[[isNthLanguage_( + 0, detailLanguage_, languages.enabled.*)]]"> + $i18n{moveToTop} + </button> + <button class="dropdown-item" role="menuitem" + on-click="onMoveUpTap_" + hidden="[[!showMoveUp_(detailLanguage_, + languages.enabled.*)]]"> + $i18n{moveUp} + </button> + <button class="dropdown-item" role="menuitem" + on-click="onMoveDownTap_" + hidden="[[!showMoveDown_( + detailLanguage_, languages.enabled.*)]]"> + $i18n{moveDown} + </button> + <button class="dropdown-item" role="menuitem" + on-click="onRemoveLanguageTap_" + hidden="[[!detailLanguage_.removable]]"> + $i18n{removeLanguage} + </button> + </cr-action-menu> + </template> + </cr-lazy-render> + </div> + <template is="dom-if" route-path="/inputMethods"> + <settings-subpage + associated-control="[[$$('#manageInputMethodsSubpageTrigger')]]" + page-title="$i18n{manageInputMethodsPageTitle}"> + <settings-manage-input-methods-page languages="{{languages}}" + language-helper="[[languageHelper]]" + prefs="{{prefs}}"> + </settings-manage-input-methods-page> + </settings-subpage> + </template> + </settings-animated-pages> + <template is="dom-if" if="[[showAddLanguagesDialog_]]" restamp> + <os-settings-add-languages-dialog languages="{{languages}}" + language-helper="[[languageHelper]]" + on-close="onAddLanguagesDialogClose_"> + </os-settings-add-languages-dialog> + </template> + </template> + <script src="os_languages_page.js"></script> +</dom-module>
diff --git a/chrome/browser/resources/settings/chromeos/os_languages_page/os_languages_page.js b/chrome/browser/resources/settings/chromeos/os_languages_page/os_languages_page.js new file mode 100644 index 0000000..fe8484f --- /dev/null +++ b/chrome/browser/resources/settings/chromeos/os_languages_page/os_languages_page.js
@@ -0,0 +1,489 @@ +// 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. + +/** + * @fileoverview 'os-settings-languages-page' is the settings page + * for language and input method settings. + */ +cr.exportPath('settings'); + +/** + * @type {number} Millisecond delay that can be used when closing an action + * menu to keep it briefly on-screen. + */ +settings.kMenuCloseDelay = 100; + +/** + * Name of the language setting is shown uma histogram. + * @type {string} + */ +const LANGUAGE_SETTING_IS_SHOWN_UMA_NAME = 'Translate.LanguageSettingsIsShown'; + +(function() { +'use strict'; + +Polymer({ + is: 'os-settings-languages-page', + + behaviors: [ + I18nBehavior, + PrefsBehavior, + ], + + properties: { + /** + * Preferences state. + */ + prefs: { + type: Object, + notify: true, + }, + + /** + * Read-only reference to the languages model provided by the + * 'os-settings-languages' instance. + * @type {!LanguagesModel|undefined} + */ + languages: { + type: Object, + notify: true, + }, + + /** @type {!LanguageHelper} */ + languageHelper: Object, + + /** + * The language to display the details for. + * @type {!LanguageState|undefined} + * @private + */ + detailLanguage_: Object, + + /** + * Whether the language settings list is opened. + * @private + */ + languagesOpened_: { + type: Boolean, + observer: 'onLanguagesOpenedChanged_', + }, + + /** @private */ + showAddLanguagesDialog_: Boolean, + + /** @private {!Map<string, string>} */ + focusConfig_: { + type: Object, + value: function() { + const map = new Map(); + if (settings.routes.INPUT_METHODS) { + map.set(settings.routes.INPUT_METHODS.path, '#manageInputMethods'); + } + return map; + }, + }, + }, + + /** + * Stamps and opens the Add Languages dialog, registering a listener to + * disable the dialog's dom-if again on close. + * @param {!Event} e + * @private + */ + onAddLanguagesTap_: function(e) { + e.preventDefault(); + this.showAddLanguagesDialog_ = true; + }, + + /** @private */ + onAddLanguagesDialogClose_: function() { + this.showAddLanguagesDialog_ = false; + cr.ui.focusWithoutInk(assert(this.$.addLanguages)); + }, + + /** + * Checks if there are supported languages that are not enabled but can be + * enabled. + * @param {LanguagesModel|undefined} languages + * @return {boolean} True if there is at least one available language. + * @private + */ + canEnableSomeSupportedLanguage_: function(languages) { + return languages == undefined || languages.supported.some(language => { + return this.languageHelper.canEnableLanguage(language); + }); + }, + + /** + * Used to determine whether to show the separator between checkbox settings + * and move buttons in the dialog menu. + * @return {boolean} True if there is currently more than one selected + * language. + * @private + */ + shouldShowDialogSeparator_: function() { + return this.languages != undefined && this.languages.enabled.length > 1; + }, + + /** + * Used to determine which "Move" buttons to show for ordering enabled + * languages. + * @param {number} n + * @return {boolean} True if |language| is at the |n|th index in the list of + * enabled languages. + * @private + */ + isNthLanguage_: function(n) { + if (this.languages == undefined || this.detailLanguage_ == undefined) { + return false; + } + + if (n >= this.languages.enabled.length) { + return false; + } + + const compareLanguage = assert(this.languages.enabled[n]); + return this.detailLanguage_.language == compareLanguage.language; + }, + + /** + * @return {boolean} True if the "Move to top" option for |language| should be + * visible. + * @private + */ + showMoveUp_: function() { + // "Move up" is a no-op for the top language, and redundant with + // "Move to top" for the 2nd language. + return !this.isNthLanguage_(0) && !this.isNthLanguage_(1); + }, + + /** + * @return {boolean} True if the "Move down" option for |language| should be + * visible. + * @private + */ + showMoveDown_: function() { + return this.languages != undefined && + !this.isNthLanguage_(this.languages.enabled.length - 1); + }, + + /** + * @param {!Object} change Polymer change object for languages.enabled.*. + * @return {boolean} True if there are less than 2 languages. + */ + isHelpTextHidden_: function(change) { + return this.languages != undefined && this.languages.enabled.length <= 1; + }, + + /** + * Opens the Manage Input Methods page. + * @private + */ + onManageInputMethodsTap_: function() { + settings.navigateTo(settings.routes.INPUT_METHODS); + }, + + /** + * Handler for tap and <Enter> events on an input method on the main page, + * which sets it as the current input method. + * @param {!{model: !{item: !chrome.languageSettingsPrivate.InputMethod}, + * target: !{tagName: string}, + * type: string, + * key: (string|undefined)}} e + */ + onInputMethodTap_: function(e) { + // Taps on the button are handled in onInputMethodOptionsTap_. + // TODO(dschuyler): The row has two operations that are not clearly + // delineated. crbug.com/740691 + if (e.target.tagName == 'CR-ICON-BUTTON') { + return; + } + + // Ignore key presses other than <Enter>. + if (e.type == 'keypress' && e.key != 'Enter') { + return; + } + + // Set the input method. + this.languageHelper.setCurrentInputMethod(e.model.item.id); + }, + + /** + * Opens the input method extension's options page in a new tab (or focuses + * an existing instance of the IME's options). + * @param {!{model: !{item: chrome.languageSettingsPrivate.InputMethod}}} e + * @private + */ + onInputMethodOptionsTap_: function(e) { + this.languageHelper.openInputMethodOptions(e.model.item.id); + }, + + /** + * @return {boolean} True for a secondary user in a multi-profile session. + * @private + */ + isSecondaryUser_: function() { + return loadTimeData.getBoolean('isSecondaryUser'); + }, + + /** + * @param {string} languageCode The language code identifying a language. + * @param {string} prospectiveUILanguage The prospective UI language. + * @return {boolean} True if the prospective UI language is set to + * |languageCode| but requires a restart to take effect. + * @private + */ + isRestartRequired_: function(languageCode, prospectiveUILanguage) { + return prospectiveUILanguage == languageCode && + this.languageHelper.requiresRestart(); + }, + + /** + * @param {!LanguageState} languageState + * @param {string} prospectiveUILanguage The chosen UI language. + * @return {boolean} True if the given language cannot be set as the + * prospective UI language by the user. + * @private + */ + disableUILanguageCheckbox_: function(languageState, prospectiveUILanguage) { + if (this.detailLanguage_ === undefined) { + return true; + } + + // UI language setting belongs to the primary user. + if (this.isSecondaryUser_()) { + return true; + } + + // If the language cannot be a UI language, we can't set it as the + // prospective UI language. + if (!languageState.language.supportsUI) { + return true; + } + + // Unchecking the currently chosen language doesn't make much sense. + if (languageState.language.code == prospectiveUILanguage) { + return true; + } + + // Check if the language is prohibited by the current "AllowedLanguages" + // policy. + if (languageState.language.isProhibitedLanguage) { + return true; + } + + // Otherwise, the prospective language can be changed to this language. + return false; + }, + + /** + * Handler for changes to the UI language checkbox. + * @param {!{target: !Element}} e + * @private + */ + onUILanguageChange_: function(e) { + // We don't support unchecking this checkbox. TODO(michaelpg): Ask for a + // simpler widget. + assert(e.target.checked); + this.languageHelper.setProspectiveUILanguage( + this.detailLanguage_.language.code); + + this.closeMenuSoon_(); + }, + + /** + * Moves the language to the top of the list. + * @private + */ + onMoveToTopTap_: function() { + /** @type {!CrActionMenuElement} */ (this.$.menu.get()).close(); + this.languageHelper.moveLanguageToFront(this.detailLanguage_.language.code); + }, + + /** + * Moves the language up in the list. + * @private + */ + onMoveUpTap_: function() { + /** @type {!CrActionMenuElement} */ (this.$.menu.get()).close(); + this.languageHelper.moveLanguage( + this.detailLanguage_.language.code, true /* upDirection */); + }, + + /** + * Moves the language down in the list. + * @private + */ + onMoveDownTap_: function() { + /** @type {!CrActionMenuElement} */ (this.$.menu.get()).close(); + this.languageHelper.moveLanguage( + this.detailLanguage_.language.code, false /* upDirection */); + }, + + /** + * Disables the language. + * @private + */ + onRemoveLanguageTap_: function() { + /** @type {!CrActionMenuElement} */ (this.$.menu.get()).close(); + this.languageHelper.disableLanguage(this.detailLanguage_.language.code); + }, + + /** + * Checks whether the prospective UI language (the pref that indicates what + * language to use in Chrome) matches the current language. + * @param {string} languageCode The language code identifying a language. + * @param {string} prospectiveUILanguage The prospective UI language. + * @return {boolean} True if the given language matches the prospective UI + * pref (which may be different from the actual UI language). + * @private + */ + isProspectiveUILanguage_: function(languageCode, prospectiveUILanguage) { + return languageCode == prospectiveUILanguage; + }, + + /** + * @param {string} prospectiveUILanguage + * @return {string} + * @private + */ + getProspectiveUILanguageName_: function(prospectiveUILanguage) { + return this.languageHelper.getLanguage(prospectiveUILanguage).displayName; + }, + + /** + * Returns either the "selected" class, if the language matches the + * prospective UI language, or an empty string. + * @param {string} languageCode The language code identifying a language. + * @param {string} prospectiveUILanguage The prospective UI language. + * @return {string} The class name for the language item. + * @private + */ + getLanguageItemClass_: function(languageCode, prospectiveUILanguage) { + if (languageCode == prospectiveUILanguage) { + return 'selected'; + } + return ''; + }, + + /** + * @param {string} id The input method ID. + * @param {string} currentId The ID of the currently enabled input method. + * @return {boolean} True if the IDs match. + * @private + */ + isCurrentInputMethod_: function(id, currentId) { + return id == currentId; + }, + + /** + * @param {string} id The input method ID. + * @param {string} currentId The ID of the currently enabled input method. + * @return {string} The class for the input method item. + * @private + */ + getInputMethodItemClass_: function(id, currentId) { + return this.isCurrentInputMethod_(id, currentId) ? 'selected' : ''; + }, + + getInputMethodName_: function(id) { + const inputMethod = + this.languages.inputMethods.enabled.find(function(inputMethod) { + return inputMethod.id == id; + }); + return inputMethod ? inputMethod.displayName : ''; + }, + + /** + * @param {!Event} e + * @private + */ + onDotsTap_: function(e) { + // Set a copy of the LanguageState object since it is not data-bound to the + // languages model directly. + this.detailLanguage_ = /** @type {!LanguageState} */ (Object.assign( + {}, + /** @type {!{model: !{item: !LanguageState}}} */ (e).model.item)); + + // Ensure the template has been stamped. + let menu = /** @type {?CrActionMenuElement} */ (this.$.menu.getIfExists()); + if (!menu) { + menu = /** @type {!CrActionMenuElement} */ (this.$.menu.get()); + + // In a CrOS multi-user session, the primary user controls the UI + // language. + // TODO(michaelpg): The language selection should not be hidden, but + // should show a policy indicator. crbug.com/648498 + if (this.isSecondaryUser_()) { + menu.querySelector('#uiLanguageItem').hidden = true; + } + + // The UI language choice doesn't persist for guests. + if (loadTimeData.getBoolean('isGuest')) { + menu.querySelector('#uiLanguageItem').hidden = true; + } + } + + menu.showAt(/** @type {!Element} */ (e.target)); + }, + + /** + * @param {boolean} newVal The new value of languagesOpened_. + * @param {boolean} oldVal The old value of languagesOpened_. + * @private + */ + onLanguagesOpenedChanged_: function(newVal, oldVal) { + if (!oldVal && newVal) { + chrome.send( + 'metricsHandler:recordBooleanHistogram', + [LANGUAGE_SETTING_IS_SHOWN_UMA_NAME, true]); + } + }, + + /** + * Closes the shared action menu after a short delay, so when a checkbox is + * clicked it can be seen to change state before disappearing. + * @private + */ + closeMenuSoon_: function() { + const menu = /** @type {!CrActionMenuElement} */ (this.$.menu.get()); + setTimeout(function() { + if (menu.open) { + menu.close(); + } + }, settings.kMenuCloseDelay); + }, + + /** + * Handler for the restart button. + * @private + */ + onRestartTap_: function() { + settings.LifetimeBrowserProxyImpl.getInstance().signOutAndRestart(); + }, + + /** + * Toggles the expand button within the element being listened to. + * @param {!Event} e + * @private + */ + toggleExpandButton_: function(e) { + // The expand button handles toggling itself. + const expandButtonTag = 'CR-EXPAND-BUTTON'; + if (e.target.tagName == expandButtonTag) { + return; + } + + if (!e.currentTarget.hasAttribute('actionable')) { + return; + } + + /** @type {!CrExpandButtonElement} */ + const expandButton = e.currentTarget.querySelector(expandButtonTag); + assert(expandButton); + expandButton.expanded = !expandButton.expanded; + cr.ui.focusWithoutInk(expandButton); + }, +}); +})();
diff --git a/chrome/browser/resources/settings/chromeos/os_search_page/os_search_page.html b/chrome/browser/resources/settings/chromeos/os_search_page/os_search_page.html index e3531b4f..e812a50 100644 --- a/chrome/browser/resources/settings/chromeos/os_search_page/os_search_page.html +++ b/chrome/browser/resources/settings/chromeos/os_search_page/os_search_page.html
@@ -6,7 +6,6 @@ <link rel="import" href="chrome://resources/html/i18n_behavior.html"> <link rel="import" href="../../google_assistant_page/google_assistant_page.html"> <link rel="import" href="../../google_assistant_page/google_assistant_browser_proxy.html"> -<link rel="import" href="../../icons.html"> <link rel="import" href="../../i18n_setup.html"> <link rel="import" href="../../route.html"> <link rel="import" href="../../settings_page/settings_animated_pages.html"> @@ -14,52 +13,37 @@ <link rel="import" href="../../settings_shared_css.html"> <link rel="import" href="../../settings_vars_css.html"> +<!-- TODO(jamescook): Rename to "os-assistant-page". --> <dom-module id="os-settings-search-page"> <template> - <style include="settings-shared md-select"> - iron-icon { - padding-inline-end: 16px; - } + <style include="settings-shared"> </style> + <!-- TODO(jamescook): Rename section to "assistant". --> <settings-animated-pages id="pages" section="search" focus-config="[[focusConfig_]]"> <div route-path="default"> - <!-- Google Assistant --> - <template is="dom-if" if="[[isAssistantAllowed_]]"> - <div id="assistantSubpageTrigger" class="settings-box first two-line" - on-click="onGoogleAssistantTap_" actionable> - <div class="start"> - $i18n{searchGoogleAssistant} - <div class="secondary"> - [[getAssistantEnabledDisabledLabel_( - prefs.settings.voice_interaction.enabled.value)]] - </div> - </div> - <cr-icon-button class="subpage-arrow" - aria-label="$i18n{searchGoogleAssistant}"></cr-icon-button> - </div> - </template> - - <!-- Label explaining that the app launcher search box uses the - browser's search engine. --> - <div class="settings-box"> + <div id="assistantSubpageTrigger" class="settings-box first two-line" + on-click="onGoogleAssistantTap_" actionable> <div class="start"> - <iron-icon icon="cr:info-outline"></iron-icon> - $i18nRaw{osSearchEngineLabel} + $i18n{searchGoogleAssistant} + <div class="secondary"> + [[getAssistantEnabledDisabledLabel_( + prefs.settings.voice_interaction.enabled.value)]] + </div> </div> + <cr-icon-button class="subpage-arrow" + aria-label="$i18n{searchGoogleAssistant}"></cr-icon-button> </div> </div> - <template is="dom-if" if="[[isAssistantAllowed_]]"> - <template is="dom-if" route-path="/googleAssistant"> - <settings-subpage - associated-control="[[$$('#assistantSubpageTrigger')]]" - page-title="$i18n{googleAssistantPageTitle}"> - <settings-google-assistant-page prefs="{{prefs}}"> - </settings-google-assistant-page> - </settings-subpage> - </template> + <template is="dom-if" route-path="/googleAssistant"> + <settings-subpage + associated-control="[[$$('#assistantSubpageTrigger')]]" + page-title="$i18n{googleAssistantPageTitle}"> + <settings-google-assistant-page prefs="{{prefs}}"> + </settings-google-assistant-page> + </settings-subpage> </template> </settings-animated-pages> </template>
diff --git a/chrome/browser/resources/settings/chromeos/os_search_page/os_search_page.js b/chrome/browser/resources/settings/chromeos/os_search_page/os_search_page.js index d9194a4..ca19561 100644 --- a/chrome/browser/resources/settings/chromeos/os_search_page/os_search_page.js +++ b/chrome/browser/resources/settings/chromeos/os_search_page/os_search_page.js
@@ -4,7 +4,7 @@ /** * @fileoverview - * 'os-settings-search-page' contains search and assistant settings. + * 'os-settings-search-page' contains assistant settings. */ Polymer({ is: 'os-settings-search-page', @@ -16,18 +16,11 @@ /** @type {?Map<string, string>} */ focusConfig_: Object, - - /** @private Can be disallowed due to flag, policy, locale, etc. */ - isAssistantAllowed_: { - type: Boolean, - value: function() { - return loadTimeData.getBoolean('isAssistantAllowed'); - }, - }, }, /** @override */ ready: function() { + assert(loadTimeData.getBoolean('isAssistantAllowed')); this.focusConfig_ = new Map(); if (settings.routes.GOOGLE_ASSISTANT) { this.focusConfig_.set( @@ -38,7 +31,6 @@ /** @private */ onGoogleAssistantTap_: function() { - assert(this.isAssistantAllowed_); settings.navigateTo(settings.routes.GOOGLE_ASSISTANT); },
diff --git a/chrome/browser/resources/settings/chromeos/os_settings_main/os_settings_main.html b/chrome/browser/resources/settings/chromeos/os_settings_main/os_settings_main.html index 6ccb073..f6b796ed 100644 --- a/chrome/browser/resources/settings/chromeos/os_settings_main/os_settings_main.html +++ b/chrome/browser/resources/settings/chromeos/os_settings_main/os_settings_main.html
@@ -64,6 +64,7 @@ page-visibility="[[pageVisibility]]" show-apps="[[showApps]]" show-android-apps="[[showAndroidApps]]" + show-assistant="[[showAssistant]]" show-kiosk-next-shell="[[showKioskNextShell]]" show-crostini="[[showCrostini]]" show-plugin-vm="[[showPluginVm]]"
diff --git a/chrome/browser/resources/settings/chromeos/os_settings_main/os_settings_main.js b/chrome/browser/resources/settings/chromeos/os_settings_main/os_settings_main.js index 71b8b842..fdb192a 100644 --- a/chrome/browser/resources/settings/chromeos/os_settings_main/os_settings_main.js +++ b/chrome/browser/resources/settings/chromeos/os_settings_main/os_settings_main.js
@@ -83,6 +83,8 @@ showAndroidApps: Boolean, + showAssistant: Boolean, + havePlayStoreApp: Boolean, },
diff --git a/chrome/browser/resources/settings/chromeos/os_settings_menu/os_settings_menu.html b/chrome/browser/resources/settings/chromeos/os_settings_menu/os_settings_menu.html index 1a341a9..153927b 100644 --- a/chrome/browser/resources/settings/chromeos/os_settings_menu/os_settings_menu.html +++ b/chrome/browser/resources/settings/chromeos/os_settings_menu/os_settings_menu.html
@@ -128,9 +128,10 @@ <iron-icon icon="settings:laptop-chromebook"></iron-icon> $i18n{devicePageTitle} </a> - <a href="/search"> + <!-- TODO(jamescook): Rename path to "/assistant". --> + <a href="/search" hidden="[[!showAssistant]]"> <iron-icon icon="cr:search"></iron-icon> - $i18n{osSearchPageTitle} + $i18n{osAssistantPageTitle} </a> <a href="/apps" hidden="[[!showApps]]"> <iron-icon icon="settings:apps"></iron-icon> @@ -168,7 +169,7 @@ </a> <a href="/languages"> <iron-icon icon="settings:language"></iron-icon> - $i18n{languagesPageTitle} + $i18n{osLanguagesPageTitle} </a> <a href="/downloads"> <iron-icon icon="cr:file-download"></iron-icon>
diff --git a/chrome/browser/resources/settings/chromeos/os_settings_page/os_settings_page.html b/chrome/browser/resources/settings/chromeos/os_settings_page/os_settings_page.html index 5a7ac911..85c05fa 100644 --- a/chrome/browser/resources/settings/chromeos/os_settings_page/os_settings_page.html +++ b/chrome/browser/resources/settings/chromeos/os_settings_page/os_settings_page.html
@@ -161,8 +161,8 @@ </settings-device-page> </settings-section> </template> - <template is="dom-if" if="[[showPage_(pageVisibility.search)]]" restamp> - <settings-section page-title="$i18n{osSearchPageTitle}" + <template is="dom-if" if="[[showAssistant]]" restamp> + <settings-section page-title="$i18n{osAssistantPageTitle}" section="search"> <os-settings-search-page prefs="{{prefs}}"> </os-settings-search-page> @@ -250,10 +250,10 @@ </template> <template is="dom-if" if="[[showPage_(pageVisibility.languages)]]" restamp> - <settings-section page-title="$i18n{languagesPageTitle}" + <settings-section page-title="$i18n{osLanguagesPageTitle}" section="languages"> - <settings-languages-page prefs="{{prefs}}"> - </settings-languages-page> + <os-settings-languages-page prefs="{{prefs}}"> + </os-settings-languages-page> </settings-section> </template> <template is="dom-if" if="[[showPage_(pageVisibility.downloads)]]"
diff --git a/chrome/browser/resources/settings/chromeos/os_settings_page/os_settings_page.js b/chrome/browser/resources/settings/chromeos/os_settings_page/os_settings_page.js index 7b2718c5..d552508 100644 --- a/chrome/browser/resources/settings/chromeos/os_settings_page/os_settings_page.js +++ b/chrome/browser/resources/settings/chromeos/os_settings_page/os_settings_page.js
@@ -26,6 +26,8 @@ showAndroidApps: Boolean, + showAssistant: Boolean, + showCrostini: Boolean, allowCrostini_: Boolean,
diff --git a/chrome/browser/resources/settings/chromeos/os_settings_ui/os_settings_ui.html b/chrome/browser/resources/settings/chromeos/os_settings_ui/os_settings_ui.html index 8bf3e71..243efcf0 100644 --- a/chrome/browser/resources/settings/chromeos/os_settings_ui/os_settings_ui.html +++ b/chrome/browser/resources/settings/chromeos/os_settings_ui/os_settings_ui.html
@@ -122,6 +122,7 @@ <os-settings-menu page-visibility="[[pageVisibility_]]" show-apps="[[showApps_]]" show-android-apps="[[showAndroidApps_]]" + show-assistant="[[showAssistant_]]" show-crostini="[[showCrostini_]]" show-parental-controls="[[showParentalControls_]]" show-plugin-vm="[[showPluginVm_]]" @@ -138,6 +139,7 @@ <os-settings-menu page-visibility="[[pageVisibility_]]" show-apps="[[showApps_]]" show-android-apps="[[showAndroidApps_]]" + show-assistant="[[showAssistant_]]" show-crostini="[[showCrostini_]]" show-plugin-vm="[[showPluginVm_]]" show-multidevice="[[showMultidevice_]]" @@ -151,6 +153,7 @@ page-visibility="[[pageVisibility_]]" show-apps="[[showApps_]]" show-android-apps="[[showAndroidApps_]]" + show-assistant="[[showAssistant_]]" show-kiosk-next-shell="[[showKioskNextShell_]]" show-crostini="[[showCrostini_]]" show-parental-controls="[[showParentalControls_]]"
diff --git a/chrome/browser/resources/settings/chromeos/os_settings_ui/os_settings_ui.js b/chrome/browser/resources/settings/chromeos/os_settings_ui/os_settings_ui.js index b65606ab..37093a2 100644 --- a/chrome/browser/resources/settings/chromeos/os_settings_ui/os_settings_ui.js +++ b/chrome/browser/resources/settings/chromeos/os_settings_ui/os_settings_ui.js
@@ -75,6 +75,9 @@ showAndroidApps_: Boolean, /** @private */ + showAssistant_: Boolean, + + /** @private */ showKioskNextShell_: Boolean, /** @private */ @@ -167,6 +170,8 @@ this.showApps_ = loadTimeData.getBoolean('showApps'); this.showAndroidApps_ = loadTimeData.getBoolean('androidAppsVisible'); + // Assistant can be disallowed due to flag, policy, locale, etc. + this.showAssistant_ = loadTimeData.getBoolean('isAssistantAllowed'); this.showKioskNextShell_ = loadTimeData.valueExists('showKioskNextShell') && loadTimeData.getBoolean('showKioskNextShell'); this.showParentalControls_ =
diff --git a/chrome/browser/resources/settings/languages_page/BUILD.gn b/chrome/browser/resources/settings/languages_page/BUILD.gn index 99a4c37..b0041ec 100644 --- a/chrome/browser/resources/settings/languages_page/BUILD.gn +++ b/chrome/browser/resources/settings/languages_page/BUILD.gn
@@ -78,7 +78,6 @@ js_library("manage_input_methods_page") { deps = [ - ":languages", ":languages_types", "../prefs", ]
diff --git a/chrome/browser/resources/settings/languages_page/languages_page.html b/chrome/browser/resources/settings/languages_page/languages_page.html index e6453138..ece77f7 100644 --- a/chrome/browser/resources/settings/languages_page/languages_page.html +++ b/chrome/browser/resources/settings/languages_page/languages_page.html
@@ -214,18 +214,23 @@ $i18n{translateTargetLabel} </div> <if expr="chromeos or is_win"> - <div class="explain-selected" - hidden="[[!isProspectiveUILanguage_( - item.language.code, - languages.prospectiveUILanguage)]]"> - $i18n{isDisplayedInThisLanguage} - </div> + <template is="dom-if" + if="[[pageVisibility.uiDisplayedInThisLanguage]]"> + <div class="explain-selected" + hidden="[[!isProspectiveUILanguage_( + item.language.code, + languages.prospectiveUILanguage)]]"> + $i18n{isDisplayedInThisLanguage} + </div> + </template> </if> </div> <if expr="chromeos or is_win"> <template is="dom-if" if="[[isRestartRequired_( item.language.code, languages.prospectiveUILanguage)]]"> - <cr-button class="restart-button" on-click="onRestartTap_"> + <cr-button class="restart-button" + hidden="[[!pageVisibility.uiDisplayedInThisLanguage]]" + on-click="onRestartTap_"> $i18n{restart} </cr-button> </template> @@ -250,6 +255,7 @@ </iron-collapse> <if expr="chromeos"> <cr-expand-button + hidden="[[!pageVisibility.inputMethodsList]]" alt="$i18n{inputMethodsExpandA11yLabel}" class="settings-box two-line" expanded="{{inputMethodsOpened_}}" @@ -260,6 +266,7 @@ </div> </cr-expand-button> <iron-collapse id="inputMethodsCollapse" + hidden="[[!pageVisibility.inputMethodsList]]" opened="[[inputMethodsOpened_]]"> <div class="list-frame vertical-list"> <template is="dom-repeat" @@ -384,7 +391,8 @@ </div> </div> <cr-link-row on-click="onEditDictionaryTap_" - id="spellCheckSubpageTrigger" label="$i18n{manageSpellCheck}"> + id="spellCheckSubpageTrigger" + label="$i18n{manageSpellCheck}"> </cr-link-row> </if> <!-- not is_macosx --> </iron-collapse> @@ -395,6 +403,7 @@ class$="[[getMenuClass_(prefs.translate.enabled.value)]]"> <if expr="chromeos or is_win"> <cr-checkbox id="uiLanguageItem" + hidden="[[!pageVisibility.uiDisplayedInThisLanguage]]" class="dropdown-item" checked="[[isProspectiveUILanguage_( detailLanguage_.language.code, @@ -402,7 +411,7 @@ on-change="onUILanguageChange_" disabled="[[disableUILanguageCheckbox_( detailLanguage_, languages.prospectiveUILanguage)]]"> - <span>$i18n{displayInThisLanguage}</span> + <span>$i18n{isDisplayedInThisLanguage}</span> <iron-icon class="policy" icon="cr20:domain" hidden$="[[ !detailLanguage_.language.isProhibitedLanguage]]"> </iron-icon> @@ -448,6 +457,7 @@ <if expr="chromeos"> <template is="dom-if" route-path="/inputMethods"> <settings-subpage + hidden="[[!pageVisibility.manageInputMethods]]" associated-control="[[$$('#manageInputMethodsSubpageTrigger')]]" page-title="$i18n{manageInputMethodsPageTitle}"> <settings-manage-input-methods-page languages="{{languages}}"
diff --git a/chrome/browser/resources/settings/languages_page/languages_page.js b/chrome/browser/resources/settings/languages_page/languages_page.js index 19fd2d9..b1dc3d7 100644 --- a/chrome/browser/resources/settings/languages_page/languages_page.js +++ b/chrome/browser/resources/settings/languages_page/languages_page.js
@@ -111,6 +111,12 @@ return map; }, }, + + /** + * Dictionary defining page visibility. + * @type {!LanguagesPageVisibility} + */ + pageVisibility: Object, }, // <if expr="not is_macosx">
diff --git a/chrome/browser/resources/settings/languages_page/manage_input_methods_page.html b/chrome/browser/resources/settings/languages_page/manage_input_methods_page.html index 151858ba..96a23de 100644 --- a/chrome/browser/resources/settings/languages_page/manage_input_methods_page.html +++ b/chrome/browser/resources/settings/languages_page/manage_input_methods_page.html
@@ -4,7 +4,6 @@ <link rel="import" href="chrome://resources/html/assert.html"> <link rel="import" href="chrome://resources/html/cr.html"> <link rel="import" href="../settings_shared_css.html"> -<link rel="import" href="languages.html"> <dom-module id="settings-manage-input-methods-page"> <template>
diff --git a/chrome/browser/resources/settings/languages_page/manage_input_methods_page.js b/chrome/browser/resources/settings/languages_page/manage_input_methods_page.js index 2cd14eff..015878b 100644 --- a/chrome/browser/resources/settings/languages_page/manage_input_methods_page.js +++ b/chrome/browser/resources/settings/languages_page/manage_input_methods_page.js
@@ -9,6 +9,8 @@ * * @group Chrome Settings Elements * @element settings-manage-input-methods-page + * + * TODO(hsuregan): Move to OS settings. */ Polymer({ is: 'settings-manage-input-methods-page',
diff --git a/chrome/browser/resources/settings/os_settings_resources.grd b/chrome/browser/resources/settings/os_settings_resources.grd index 2a797dad..4f553c9 100644 --- a/chrome/browser/resources/settings/os_settings_resources.grd +++ b/chrome/browser/resources/settings/os_settings_resources.grd
@@ -454,10 +454,10 @@ file="chromeos/os_reset_page/reset_os_proxy.html" type="chrome_html" /> <structure name="IDR_OS_SETTINGS_LANGUAGES_HTML" - file="languages_page/languages.html" + file="chromeos/os_languages_page/os_languages.html" type="chrome_html" /> <structure name="IDR_OS_SETTINGS_LANGUAGES_JS" - file="languages_page/languages.js" + file="chromeos/os_languages_page/os_languages.js" type="chrome_html" preprocess="true" allowexternalscript="true" /> @@ -469,18 +469,18 @@ preprocess="true" type="chrome_html" /> <structure name="IDR_OS_SETTINGS_LANGUAGES_ADD_LANGUAGES_DIALOG_HTML" - file="languages_page/add_languages_dialog.html" + file="chromeos/os_languages_page/os_add_languages_dialog.html" type="chrome_html" /> <structure name="IDR_OS_SETTINGS_LANGUAGES_ADD_LANGUAGES_DIALOG_JS" - file="languages_page/add_languages_dialog.js" + file="chromeos/os_languages_page/os_add_languages_dialog.js" type="chrome_html" /> <structure name="IDR_OS_SETTINGS_LANGUAGES_PAGE_HTML" - file="languages_page/languages_page.html" + file="chromeos/os_languages_page/os_languages_page.html" type="chrome_html" preprocess="true" allowexternalscript="true" /> <structure name="IDR_OS_SETTINGS_LANGUAGES_PAGE_JS" - file="languages_page/languages_page.js" + file="chromeos/os_languages_page/os_languages_page.js" type="chrome_html" preprocess="true" allowexternalscript="true" /> @@ -490,12 +490,6 @@ <structure name="IDR_OS_SETTINGS_LANGUAGES_MANAGE_INPUT_METHODS_PAGE_JS" file="languages_page/manage_input_methods_page.js" type="chrome_html" /> - <structure name="IDR_OS_SETTINGS_LANGUAGES_EDIT_DICTIONARY_PAGE_HTML" - file="languages_page/edit_dictionary_page.html" - type="chrome_html" /> - <structure name="IDR_OS_SETTINGS_LANGUAGES_EDIT_DICTIONARY_PAGE_JS" - file="languages_page/edit_dictionary_page.js" - type="chrome_html" /> <structure name="IDR_OS_SETTINGS_MEDIA_PICKER_HTML" file="site_settings/media_picker.html" type="chrome_html" />
diff --git a/chrome/browser/resources/settings/page_visibility.js b/chrome/browser/resources/settings/page_visibility.js index bcf816b..330a9db 100644 --- a/chrome/browser/resources/settings/page_visibility.js +++ b/chrome/browser/resources/settings/page_visibility.js
@@ -18,6 +18,7 @@ * device: (boolean|undefined), * downloads: (boolean|undefined|DownloadsPageVisibility), * internet: (boolean|undefined), + * languages: (boolean|undefined|LanguagesPageVisibility), * multidevice: (boolean|undefined), * onStartup: (boolean|undefined), * people: (boolean|undefined|PeoplePageVisibility), @@ -81,6 +82,15 @@ */ let ResetPageVisibility; +/** + * @typedef {{ + * uiDisplayedInThisLanguage: boolean, + * manageInputMethods: boolean, + * inputMethodsList: boolean, + * }} + */ +let LanguagesPageVisibility; + cr.define('settings', function() { /** * Dictionary defining page visibility. @@ -104,6 +114,7 @@ advancedSettings: false, extensions: false, printing: false, + languages: false, }; // </if> // <if expr="chromeos"> @@ -142,6 +153,11 @@ }, extensions: false, printing: showOSSettings, + languages: { + uiDisplayedInThisLanguage: showOSSettings, + manageInputMethods: showOSSettings, + inputMethodsList: showOSSettings, + }, }; // </if> } else { @@ -188,6 +204,11 @@ }, extensions: true, printing: showOSSettings, + languages: { + uiDisplayedInThisLanguage: showOSSettings, + manageInputMethods: showOSSettings, + inputMethodsList: showOSSettings, + }, }; // </if> }
diff --git a/chrome/browser/resources/settings/privacy_page/security_keys_set_pin_dialog.html b/chrome/browser/resources/settings/privacy_page/security_keys_set_pin_dialog.html index 3abd68a..9e4f34d 100644 --- a/chrome/browser/resources/settings/privacy_page/security_keys_set_pin_dialog.html +++ b/chrome/browser/resources/settings/privacy_page/security_keys_set_pin_dialog.html
@@ -33,7 +33,8 @@ on-close="closeDialog_"> <div slot="title">[[title_]]</div> <div slot="body"> - <iron-pages attr-for-selected="id" selected="[[shown_]]"> + <iron-pages attr-for-selected="id" selected="[[shown_]]" + on-iron-select="onIronSelect_"> <div id="initial"> <p>$i18n{securityKeysPINTouch}</p> <paper-spinner-lite active></paper-spinner-lite>
diff --git a/chrome/browser/resources/settings/privacy_page/security_keys_set_pin_dialog.js b/chrome/browser/resources/settings/privacy_page/security_keys_set_pin_dialog.js index 1ed18ce..d61b566 100644 --- a/chrome/browser/resources/settings/privacy_page/security_keys_set_pin_dialog.js +++ b/chrome/browser/resources/settings/privacy_page/security_keys_set_pin_dialog.js
@@ -202,9 +202,24 @@ return; } this.complete_ = true; + // Setting |complete_| to true hides the |pinSubmitNew| button while it + // has focus, which in turn causes the browser to move focus to the <body> + // element, which in turn prevents subsequent "Enter" keystrokes to be + // handled by cr-dialog itself. Re-focusing manually fixes this. + this.$.dialog.focus(); this.browserProxy_.close(); }, + /** + * @param {!Event} e + * @private + */ + onIronSelect_: function(e) { + // Prevent this event from bubbling since it is unnecessarily triggering the + // listener within settings-animated-pages. + e.stopPropagation(); + }, + /** @private */ updatePINButtonValid_: function() { this.setPINButtonValid_ =
diff --git a/chrome/browser/resources/signin/sync_confirmation/sync_confirmation.html b/chrome/browser/resources/signin/sync_confirmation/sync_confirmation.html index 2775865..57db3894 100644 --- a/chrome/browser/resources/signin/sync_confirmation/sync_confirmation.html +++ b/chrome/browser/resources/signin/sync_confirmation/sync_confirmation.html
@@ -17,80 +17,9 @@ <link rel="stylesheet" href="chrome://resources/css/text_defaults_md.css"> <custom-style> <style include="signin-dialog-shared paper-button-style"> - .picture img { - border-radius: 50%; - max-height: 100%; - max-width: 100%; - } - .details { padding: 0 24px; } - - #picture-container { - align-items: center; - display: flex; - justify-content: center; - padding-bottom: 32px; - padding-top: 24px; - } - - .picture { - height: 96px; - margin-inline-start: 84px; - position: relative; - width: 96px; - } - - #profile-picture, - .checkmark-circle { - position: absolute; - } - - .message-container { - display: flex; - margin-bottom: 16px; - } - - .message-container:last-child { - margin-bottom: 32px; - } - - .message-container .logo { - background-size: cover; - flex-shrink: 0; - height: 20px; - margin-inline-end: 20px; - position: relative; - top: -2px; - width: 20px; - } - - #chrome-logo { - background-image: url(../../../../../ui/webui/resources/images/200-logo_chrome.png); - } - - #googleg-logo { - background-image: url(../../../../../ui/webui/resources/images/200-logo_googleg.png); - } - - .message-container .title { - font-weight: 500; - margin-bottom: 4px; - } - - .message-container .body { - color: var(--cr-secondary-text-color); - } - - .message-container .text { - line-height: 20px; - } - - .message-container #activityControlsCheckbox { - margin-inline-start: 40px; - } - #undoButton { <if expr="is_macosx or is_linux"> margin-inline-end: 8px; @@ -107,221 +36,6 @@ padding: 0 24px; } - #illustration { - height: 96px; - margin: 0 auto; - position: relative; - width: 264px; - } - - #checkmark-circle { - background: var(--google-blue-refresh-500); - border: 2px solid #fff; - border-radius: 50%; - bottom: 0; - height: 24px; - position: absolute; - right: 0; - transform: scale(0); - width: 24px; - } - - [dark] #checkmark-circle { - background: var(--google-blue-refresh-300); - border-color: var(--google-grey-900); - } - - .loaded #checkmark-circle { - animation: scale-circle 300ms cubic-bezier(0, 0, 0.2, 1) forwards; - } - - @keyframes scale-circle { - from { transform: scale(0); } - to { transform: scale(1); } - } - - #checkmark-check { - left: 5px; - position: absolute; - top: 7px; - } - - .loaded #checkmark-path { - animation: draw-path 300ms cubic-bezier(0, 0, 0.2, 1) 100ms forwards; - } - - @keyframes draw-path { - from { stroke-dashoffset: 16; } - to { stroke-dashoffset: 0; } - } - - #icons { - height: 96px; - position: absolute; - width: 264px; - } - - #icons > div { - -webkit-mask-repeat: no-repeat; - -webkit-mask-size: cover; - animation-delay: 200ms; - animation-duration: 1.4s; - animation-fill-mode: forwards; - animation-timing-function: cubic-bezier(0.25, 0.45, 0.4, 0.7); - background-color: black; - opacity: 0; - position: absolute; - } - - [dark] #icons > div { - background-color: white; - } - - #icon-bookmarks { - -webkit-mask-image: url(../../../../../ui/webui/resources/images/icon_bookmarks.svg); - height: 36px; - left: 58px; - top: 0; - width: 36px; - } - - #icon-extensions { - -webkit-mask-image: url(../../../../../ui/webui/resources/images/icon_extensions.svg); - height: 24px; - left: 30px; - top: 30px; - width: 24px; - } - - #icon-passwords { - -webkit-mask-image: url(../../../../../ui/webui/resources/images/icon_passwords.svg); - height: 30px; - left: 38px; - top: 66px; - width: 40px; - } - - #icon-history { - -webkit-mask-image: url(../../../../../ui/webui/resources/images/icon_history.svg); - height: 36px; - left: 190px; - top: 6px; - width: 36px; - } - - #icon-tabs { - -webkit-mask-image: url(../../../../../ui/webui/resources/images/icon_tabs.svg); - height: 24px; - left: 222px; - top: 44px; - width: 24px; - } - - #icon-themes { - -webkit-mask-image: url(../../../../../ui/webui/resources/images/icon_themes.svg); - height: 30px; - left: 184px; - top: 62px; - width: 32px; - } - - #icon-circle-open { - border: 2px solid #000; - border-radius: 50%; - height: 8px; - left: 6px; - top: 56px; - width: 8px; - } - - [dark] #icon-circle-open { - border-color: white; - } - - .icon-circle { - border-radius: 50%; - height: 4px; - width: 4px; - } - - #icon-circle-1 { - left: 64px; - top: 50px; - } - - #icon-circle-2 { - left: 178px; - top: 18px; - } - - #icon-circle-3 { - left: 194px; - top: 50px; - } - - #icon-circle-4 { - left: 258px; - top: 36px; - } - - .loaded .fade-top-left { - animation-name: fade-in, icon-top-left; - } - - .loaded .fade-top-right { - animation-name: fade-in, icon-top-right; - } - - .loaded .fade-middle-left { - animation-name: fade-in, icon-middle-left; - } - - .loaded .fade-middle-right { - animation-name: fade-in, icon-middle-right; - } - - .loaded .fade-bottom-left { - animation-name: fade-in, icon-bottom-left; - } - - .loaded .fade-bottom-right { - animation-name: fade-in, icon-bottom-right; - } - - @keyframes fade-in { - from { opacity: 0; } - to { opacity: .1; } - } - - @keyframes icon-top-left { - from { transform: translate(0, 0); } - to { transform: translate(-4px, -4px); } - } - - @keyframes icon-top-right { - from { transform: translate(0, 0); } - to { transform: translate(4px, -4px); } - } - - @keyframes icon-middle-left { - from { transform: translate(0, 0); } - to { transform: translate(-4px, 0); } - } - - @keyframes icon-middle-right { - from { transform: translate(0, 0); } - to { transform: translate(4px, 0); } - } - - @keyframes icon-bottom-left { - from { transform: translate(0, 0); } - to { transform: translate(-4px, 4px); } - } - - @keyframes icon-bottom-right { - from { transform: translate(0, 0); } - to { transform: translate(4px, 4px); } - } </style> </custom-style> </head> @@ -336,70 +50,6 @@ <div class="top-title-bar" consent-description> $i18n{syncConfirmationTitle} </div> - <div class="details" id="syncConfirmationDetails"> - <div id="picture-container"> - <div id="illustration"> - <div id="icons"> - <div id="icon-bookmarks" class="fade-top-left"></div> - <div id="icon-extensions" class="fade-top-left"></div> - <div id="icon-passwords" class="fade-bottom-left"></div> - <div id="icon-history" class="fade-top-right"></div> - <div id="icon-tabs" class="fade-middle-right"></div> - <div id="icon-themes" class="fade-bottom-right"></div> - <div id="icon-circle-open" class="fade-middle-left"></div> - <div id="icon-circle-1" class="icon-circle fade-middle-left"></div> - <div id="icon-circle-2" class="icon-circle fade-top-right"></div> - <div id="icon-circle-3" class="icon-circle fade-middle-right"></div> - <div id="icon-circle-4" class="icon-circle fade-top-right"></div> - </div> - <div class="picture"> - <img id="profile-picture"> - <div id="checkmark-circle"> - <svg id="checkmark-check" width="13" height="10" viewBox="0 0 13 10"> - <path id="checkmark-path" d="M1 5l3.5 3.5L12 1" stroke="#FFF" - stroke-width="2" stroke-dasharray="16" - stroke-dashoffset="16" fill="none"></path> - </svg> - </div> - </div> - </div> - </div> - <div class="message-container"> - <!-- - "Chrome sync" is the Google Cloud Based services used for sync. Thus - this section uses the Chrome logo even for Chromium builds. - --> - <div id="chrome-logo" class="logo"></div> - <div> - <div class="title" consent-description> - $i18n{syncConfirmationChromeSyncTitle} - </div> - <div class="body text" consent-description> - $i18n{syncConfirmationChromeSyncBody} - </div> - </div> - </div> - <div class="message-container"> - <!-- - This section uses the Google logo even for Chromium builds as the - user can personalize their Google services from this screen. - --> - <div id="googleg-logo" class="logo"></div> - <div> - <div class="title" consent-description> - $i18n{syncConfirmationPersonalizeServicesTitle} - </div> - <div class="body text" consent-description> - $i18n{syncConfirmationPersonalizeServicesBody} - </div> - </div> - </div> - <div class="message-container"> - <div class="body" consent-description consent-confirmation> - $i18nRaw{syncConfirmationSyncSettingsLinkBody} - </div> - </div> - </div> <div class="details" id="syncDisabledDetails"> <div class="body text" consent-description> $i18n{syncDisabledConfirmationDetails}
diff --git a/chrome/browser/resources/signin/sync_confirmation/sync_confirmation.js b/chrome/browser/resources/signin/sync_confirmation/sync_confirmation.js index 1611ba92..12307c57 100644 --- a/chrome/browser/resources/signin/sync_confirmation/sync_confirmation.js +++ b/chrome/browser/resources/signin/sync_confirmation/sync_confirmation.js
@@ -42,24 +42,10 @@ chrome.send('undo'); } - function onGoToSettings(e) { - chrome.send( - 'goToSettings', - [getConsentDescription(), getConsentConfirmation(e.path)]); - } - function initialize() { document.addEventListener('keydown', onKeyDown); $('confirmButton').addEventListener('click', onConfirm); $('undoButton').addEventListener('click', onUndo); - if (loadTimeData.getBoolean('isSyncAllowed')) { - $('settingsLink').addEventListener('click', onGoToSettings); - $('profile-picture').addEventListener('load', onPictureLoaded); - $('syncDisabledDetails').hidden = true; - } else { - $('syncConfirmationDetails').hidden = true; - } - // Prefer using |document.body.offsetHeight| instead of // |document.body.scrollHeight| as it returns the correct height of the // even when the page zoom in Chrome is different than 100%. @@ -70,18 +56,6 @@ document.activeElement.blur(); } - function setUserImageURL(url) { - if (loadTimeData.getBoolean('isSyncAllowed')) { - $('profile-picture').src = url; - } - } - - function onPictureLoaded(e) { - if (loadTimeData.getBoolean('isSyncAllowed')) { - $('picture-container').classList.add('loaded'); - } - } - function onKeyDown(e) { // If the currently focused element isn't something that performs an action // on "enter" being pressed and the user hits "enter", perform the default @@ -93,15 +67,11 @@ } } - // TODO(tangltom): clearFocus and setUserImageURL are called directly by the - // C++ handler. C++ handlers should not be calling JS functions by name - // anymore. They should be firing events with FireWebuiListener and have the - // page itself decide whether to listen or not listen to the event. - return { - clearFocus: clearFocus, - initialize: initialize, - setUserImageURL: setUserImageURL - }; + // TODO(tangltom): clearFocus is called directly by the C++ handler. + // C++ handlers should not be calling JS functions by name anymore. They + // should be firing events with FireWebuiListener and have the page itself + // decide whether to listen or not listen to the event. + return {clearFocus: clearFocus, initialize: initialize}; }); document.addEventListener('DOMContentLoaded', sync.confirmation.initialize);
diff --git a/chrome/browser/search/instant_service.cc b/chrome/browser/search/instant_service.cc index 059578d..91f409d 100644 --- a/chrome/browser/search/instant_service.cc +++ b/chrome/browser/search/instant_service.cc
@@ -196,6 +196,7 @@ InstantService::InstantService(Profile* profile) : profile_(profile), + most_visited_info_(std::make_unique<InstantMostVisitedInfo>()), pref_service_(profile_->GetPrefs()), weak_ptr_factory_(this) { // The initialization below depends on a typical set of browser threads. Skip @@ -234,6 +235,8 @@ most_visited_sites_->EnableCustomLinks(IsCustomLinksEnabled()); } + most_visited_info_->use_most_visited = !IsCustomLinksEnabled(); + if (profile_) { DeleteThumbnailDataIfExists(profile_->GetPath(), base::nullopt); @@ -335,9 +338,11 @@ return false; } bool use_most_visited = - pref_service_->GetBoolean(prefs::kNtpUseMostVisitedTiles); - pref_service_->SetBoolean(prefs::kNtpUseMostVisitedTiles, !use_most_visited); - most_visited_sites_->EnableCustomLinks(IsCustomLinksEnabled()); + !pref_service_->GetBoolean(prefs::kNtpUseMostVisitedTiles); + pref_service_->SetBoolean(prefs::kNtpUseMostVisitedTiles, use_most_visited); + most_visited_info_->use_most_visited = use_most_visited; + + most_visited_sites_->EnableCustomLinks(use_most_visited); return true; } @@ -547,7 +552,7 @@ const std::map<ntp_tiles::SectionType, ntp_tiles::NTPTilesVector>& sections) { DCHECK(most_visited_sites_); - most_visited_items_.clear(); + most_visited_info_->items.clear(); // Use only personalized tiles for instant service. const ntp_tiles::NTPTilesVector& tiles = sections.at(ntp_tiles::SectionType::PERSONALIZED); @@ -559,8 +564,10 @@ item.source = tile.source; item.title_source = tile.title_source; item.data_generation_time = tile.data_generation_time; - most_visited_items_.push_back(item); + most_visited_info_->items.push_back(item); } + most_visited_info_->items_are_custom_links = + (most_visited_sites_ && most_visited_sites_->IsCustomLinksInitialized()); NotifyAboutMostVisitedItems(); } @@ -568,10 +575,8 @@ void InstantService::OnIconMadeAvailable(const GURL& site_url) {} void InstantService::NotifyAboutMostVisitedItems() { - bool is_custom_links = - (most_visited_sites_ && most_visited_sites_->IsCustomLinksInitialized()); for (InstantServiceObserver& observer : observers_) - observer.MostVisitedItemsChanged(most_visited_items_, is_custom_links); + observer.MostVisitedItemsChanged(*most_visited_info_); } void InstantService::NotifyAboutThemeInfo() {
diff --git a/chrome/browser/search/instant_service.h b/chrome/browser/search/instant_service.h index c40e247e..1b337b1 100644 --- a/chrome/browser/search/instant_service.h +++ b/chrome/browser/search/instant_service.h
@@ -37,7 +37,7 @@ class InstantServiceObserver; class NtpBackgroundService; class Profile; -struct InstantMostVisitedItem; +struct InstantMostVisitedInfo; struct ThemeBackgroundInfo; namespace content { @@ -177,6 +177,8 @@ FRIEND_TEST_ALL_PREFIXES(InstantExtendedTest, ProcessIsolation); FRIEND_TEST_ALL_PREFIXES(InstantServiceTest, DeleteThumbnailDataIfExists); FRIEND_TEST_ALL_PREFIXES(InstantServiceTest, GetNTPTileSuggestion); + FRIEND_TEST_ALL_PREFIXES(InstantServiceTest, + DoesToggleMostVisitedOrCustomLinks); FRIEND_TEST_ALL_PREFIXES(InstantServiceTest, IsCustomLinksEnabled); FRIEND_TEST_ALL_PREFIXES(InstantServiceTest, TestNoThemeInfo); @@ -254,8 +256,9 @@ // The process ids associated with Instant processes. std::set<int> process_ids_; - // InstantMostVisitedItems for NTP tiles, received from |most_visited_sites_|. - std::vector<InstantMostVisitedItem> most_visited_items_; + // Contains InstantMostVisitedItems received from |most_visited_sites_| and + // information required to display NTP tiles. + std::unique_ptr<InstantMostVisitedInfo> most_visited_info_; // Theme-related data for NTP overlay to adopt themes. std::unique_ptr<ThemeBackgroundInfo> theme_info_;
diff --git a/chrome/browser/search/instant_service_observer.cc b/chrome/browser/search/instant_service_observer.cc index bc7eb2c9..aaf8db4a 100644 --- a/chrome/browser/search/instant_service_observer.cc +++ b/chrome/browser/search/instant_service_observer.cc
@@ -8,5 +8,4 @@ } void InstantServiceObserver::MostVisitedItemsChanged( - const std::vector<InstantMostVisitedItem>&, - bool is_custom_links) {} + const InstantMostVisitedInfo&) {}
diff --git a/chrome/browser/search/instant_service_observer.h b/chrome/browser/search/instant_service_observer.h index 16bda61..0660a17 100644 --- a/chrome/browser/search/instant_service_observer.h +++ b/chrome/browser/search/instant_service_observer.h
@@ -13,7 +13,7 @@ #error "Instant is only used on desktop"; #endif -struct InstantMostVisitedItem; +struct InstantMostVisitedInfo; struct ThemeBackgroundInfo; // InstantServiceObserver defines the observer interface for InstantService. @@ -22,11 +22,8 @@ // Indicates that the user's custom theme has changed in some way. virtual void ThemeInfoChanged(const ThemeBackgroundInfo&); - // Indicates that the most visited items has changed. |is_custom_links| is - // true if the items are custom links. - virtual void MostVisitedItemsChanged( - const std::vector<InstantMostVisitedItem>&, - bool is_custom_links); + // Indicates that the most visited items have changed in some way. + virtual void MostVisitedItemsChanged(const InstantMostVisitedInfo&); protected: virtual ~InstantServiceObserver() {}
diff --git a/chrome/browser/search/instant_service_unittest.cc b/chrome/browser/search/instant_service_unittest.cc index 5831544..3113cc3 100644 --- a/chrome/browser/search/instant_service_unittest.cc +++ b/chrome/browser/search/instant_service_unittest.cc
@@ -32,8 +32,7 @@ class MockInstantServiceObserver : public InstantServiceObserver { public: MOCK_METHOD1(ThemeInfoChanged, void(const ThemeBackgroundInfo&)); - MOCK_METHOD2(MostVisitedItemsChanged, - void(const std::vector<InstantMostVisitedItem>&, bool)); + MOCK_METHOD1(MostVisitedItemsChanged, void(const InstantMostVisitedInfo&)); }; base::DictionaryValue GetBackgroundInfoAsDict(const GURL& background_url) { @@ -82,7 +81,7 @@ instant_service_->OnURLsAvailable(suggestions_map); - auto items = instant_service_->most_visited_items_; + auto items = instant_service_->most_visited_info_->items; ASSERT_EQ(1, (int)items.size()); EXPECT_EQ(ntp_tiles::TileSource::TOP_SITES, items[0].source); EXPECT_EQ(ntp_tiles::TileTitleSource::TITLE_TAG, items[0].title_source); @@ -123,19 +122,23 @@ profile()->GetTestingPrefService(); SetUserSelectedDefaultSearchProvider("{google:baseURL}"); ASSERT_FALSE(pref_service->GetBoolean(prefs::kNtpUseMostVisitedTiles)); + ASSERT_FALSE(instant_service_->most_visited_info_->use_most_visited); // Enable most visited tiles. EXPECT_TRUE(instant_service_->ToggleMostVisitedOrCustomLinks()); EXPECT_TRUE(pref_service->GetBoolean(prefs::kNtpUseMostVisitedTiles)); + EXPECT_TRUE(instant_service_->most_visited_info_->use_most_visited); // Disable most visited tiles. EXPECT_TRUE(instant_service_->ToggleMostVisitedOrCustomLinks()); EXPECT_FALSE(pref_service->GetBoolean(prefs::kNtpUseMostVisitedTiles)); + EXPECT_FALSE(instant_service_->most_visited_info_->use_most_visited); // Should do nothing if this is a non-Google NTP. SetUserSelectedDefaultSearchProvider("https://www.search.com"); EXPECT_FALSE(instant_service_->ToggleMostVisitedOrCustomLinks()); EXPECT_FALSE(pref_service->GetBoolean(prefs::kNtpUseMostVisitedTiles)); + EXPECT_FALSE(instant_service_->most_visited_info_->use_most_visited); } TEST_F(InstantServiceTest,
diff --git a/chrome/browser/security_events/security_event_sync_bridge_impl.cc b/chrome/browser/security_events/security_event_sync_bridge_impl.cc index d07552fb..858ee00 100644 --- a/chrome/browser/security_events/security_event_sync_bridge_impl.cc +++ b/chrome/browser/security_events/security_event_sync_bridge_impl.cc
@@ -35,8 +35,7 @@ std::unique_ptr<syncer::EntityData> ToEntityData( sync_pb::SecurityEventSpecifics specifics) { auto entity_data = std::make_unique<syncer::EntityData>(); - entity_data->non_unique_name = - base::NumberToString(specifics.event_time_usec()); + entity_data->name = base::NumberToString(specifics.event_time_usec()); entity_data->specifics.set_allocated_security_event(&specifics); return entity_data; }
diff --git a/chrome/browser/supervised_user/supervised_user_browsertest.cc b/chrome/browser/supervised_user/supervised_user_browsertest.cc index c181dd8..0c1f50d 100644 --- a/chrome/browser/supervised_user/supervised_user_browsertest.cc +++ b/chrome/browser/supervised_user/supervised_user_browsertest.cc
@@ -7,11 +7,9 @@ #include "base/bind.h" #include "base/bind_helpers.h" #include "base/command_line.h" -#include "base/feature_list.h" #include "base/run_loop.h" #include "base/strings/utf_string_conversions.h" #include "base/test/bind_test_util.h" -#include "base/test/scoped_feature_list.h" #include "base/values.h" #include "chrome/browser/chrome_notification_types.h" #include "chrome/browser/history/history_service_factory.h" @@ -27,7 +25,6 @@ #include "chrome/browser/ui/browser.h" #include "chrome/browser/ui/tabs/tab_strip_model.h" #include "chrome/browser/ui/tabs/tab_strip_model_observer.h" -#include "chrome/common/chrome_features.h" #include "chrome/common/chrome_switches.h" #include "chrome/test/base/in_process_browser_test.h" #include "chrome/test/base/ui_test_utils.h" @@ -60,11 +57,6 @@ namespace { -bool AreCommittedInterstitialsEnabled() { - return base::FeatureList::IsEnabled( - features::kSupervisedUserCommittedInterstitials); -} - class InterstitialPageObserver : public content::WebContentsObserver { public: InterstitialPageObserver(WebContents* web_contents, @@ -72,17 +64,11 @@ : content::WebContentsObserver(web_contents), callback_(callback) {} ~InterstitialPageObserver() override {} - void DidAttachInterstitialPage() override { - DCHECK(!AreCommittedInterstitialsEnabled()); - callback_.Run(); - } - void DidFinishNavigation( content::NavigationHandle* navigation_handle) override { // With committed interstitials, DidAttachInterstitialPage is not called, so // call the callback from here if there was an error. - if (AreCommittedInterstitialsEnabled() && - navigation_handle->IsErrorPage()) { + if (navigation_handle->IsErrorPage()) { callback_.Run(); } } @@ -91,13 +77,8 @@ base::Closure callback_; }; -// TODO(carlosil): These tests can be turned into regular (non-parameterized) -// tests once committed interstitials are the only code path, special cases for -// committed/non-committed interstitials should also be cleaned up. - // Tests filtering for supervised users. -class SupervisedUserTest : public InProcessBrowserTest, - public testing::WithParamInterface<bool> { +class SupervisedUserTest : public InProcessBrowserTest { public: // Indicates whether the interstitial should proceed or not. enum InterstitialAction { @@ -111,56 +92,29 @@ bool ShownPageIsInterstitial(Browser* browser) { WebContents* tab = browser->tab_strip_model()->GetActiveWebContents(); EXPECT_FALSE(tab->IsCrashed()); - if (AreCommittedInterstitialsEnabled()) { - base::string16 title; - ui_test_utils::GetCurrentTabTitle(browser, &title); - return tab->GetController().GetLastCommittedEntry()->GetPageType() == - content::PAGE_TYPE_ERROR && - title == base::ASCIIToUTF16("Site blocked"); - } - return tab->ShowingInterstitialPage(); + base::string16 title; + ui_test_utils::GetCurrentTabTitle(browser, &title); + return tab->GetController().GetLastCommittedEntry()->GetPageType() == + content::PAGE_TYPE_ERROR && + title == base::ASCIIToUTF16("Site blocked"); } void SendAccessRequest(WebContents* tab) { - if (AreCommittedInterstitialsEnabled()) { - tab->GetMainFrame()->ExecuteJavaScriptForTests( - base::ASCIIToUTF16( - "supervisedUserErrorPageController.requestPermission()"), - base::NullCallback()); - return; - } - - InterstitialPage* interstitial_page = tab->GetInterstitialPage(); - ASSERT_TRUE(interstitial_page); - - // Get the SupervisedUserInterstitial delegate. - content::InterstitialPageDelegate* delegate = - interstitial_page->GetDelegateForTesting(); - - // Simulate the click on the "request" button. - delegate->CommandReceived("\"request\""); + tab->GetMainFrame()->ExecuteJavaScriptForTests( + base::ASCIIToUTF16( + "supervisedUserErrorPageController.requestPermission()"), + base::NullCallback()); + return; } void GoBack(WebContents* tab) { - if (AreCommittedInterstitialsEnabled()) { - tab->GetMainFrame()->ExecuteJavaScriptForTests( - base::ASCIIToUTF16("supervisedUserErrorPageController.goBack()"), - base::NullCallback()); - return; - } - InterstitialPage* interstitial_page = tab->GetInterstitialPage(); - ASSERT_TRUE(interstitial_page); - - // Get the SupervisedUserInterstitial delegate. - content::InterstitialPageDelegate* delegate = - interstitial_page->GetDelegateForTesting(); - - // Simulate the click on the "back" button - delegate->CommandReceived("\"back\""); + tab->GetMainFrame()->ExecuteJavaScriptForTests( + base::ASCIIToUTF16("supervisedUserErrorPageController.goBack()"), + base::NullCallback()); + return; } void GoBackAndWaitForNavigation(WebContents* tab) { - DCHECK(AreCommittedInterstitialsEnabled()); content::TestNavigationObserver observer(tab); GoBack(tab); observer.Wait(); @@ -168,14 +122,6 @@ protected: void SetUpOnMainThread() override { - if (GetParam()) { - feature_list.InitAndEnableFeature( - features::kSupervisedUserCommittedInterstitials); - } else { - feature_list.InitAndDisableFeature( - features::kSupervisedUserCommittedInterstitials); - } - // Set up the SupervisedUserNavigationObserver manually since the profile // was not supervised when the browser was created. content::WebContents* web_contents = @@ -224,9 +170,6 @@ } SupervisedUserService* supervised_user_service_; - - private: - base::test::ScopedFeatureList feature_list; }; // Tests the filter mode in which all sites are blocked by default. @@ -293,14 +236,8 @@ DISALLOW_COPY_AND_ASSIGN(TabClosingObserver); }; -INSTANTIATE_TEST_SUITE_P(, SupervisedUserTest, ::testing::Values(false, true)); - -INSTANTIATE_TEST_SUITE_P(, - SupervisedUserBlockModeTest, - ::testing::Values(false, true)); - // Navigates to a blocked URL. -IN_PROC_BROWSER_TEST_P(SupervisedUserBlockModeTest, +IN_PROC_BROWSER_TEST_F(SupervisedUserBlockModeTest, SendAccessRequestOnBlockedURL) { GURL test_url("http://www.example.com/simple.html"); ui_test_utils::NavigateToURL(browser(), test_url); @@ -313,10 +250,7 @@ // TODO(sergiu): Properly check that the access request was sent here. - if (AreCommittedInterstitialsEnabled()) - GoBackAndWaitForNavigation(tab); - else - GoBack(tab); + GoBackAndWaitForNavigation(tab); // Make sure that the tab is still there. EXPECT_EQ(tab, browser()->tab_strip_model()->GetActiveWebContents()); @@ -326,7 +260,7 @@ // Navigates to a blocked URL in a new tab. We expect the tab to be closed // automatically on pressing the "back" button on the interstitial. -IN_PROC_BROWSER_TEST_P(SupervisedUserBlockModeTest, OpenBlockedURLInNewTab) { +IN_PROC_BROWSER_TEST_F(SupervisedUserBlockModeTest, OpenBlockedURLInNewTab) { TabStripModel* tab_strip = browser()->tab_strip_model(); WebContents* prev_tab = tab_strip->GetActiveWebContents(); @@ -353,7 +287,7 @@ // interstitial page behave differently from the preceding test, where the // navigation is blocked before it commits). The expected behavior is the same // though: the tab should be closed when going back. -IN_PROC_BROWSER_TEST_P(SupervisedUserTest, BlockNewTabAfterLoading) { +IN_PROC_BROWSER_TEST_F(SupervisedUserTest, BlockNewTabAfterLoading) { TabStripModel* tab_strip = browser()->tab_strip_model(); WebContents* prev_tab = tab_strip->GetActiveWebContents(); @@ -369,11 +303,6 @@ { // Block the current URL. - // TODO(carlosil): Remove this run_loop once Committed interstitials are the - // only code path. - base::RunLoop run_loop; - InterstitialPageObserver interstitial_observer(tab, run_loop.QuitClosure()); - SupervisedUserSettingsService* supervised_user_settings_service = SupervisedUserSettingsServiceFactory::GetForKey( browser()->profile()->GetProfileKey()); @@ -386,12 +315,8 @@ ASSERT_EQ(SupervisedUserURLFilter::BLOCK, filter->GetFilteringBehaviorForURL(test_url)); - if (AreCommittedInterstitialsEnabled()) { - content::TestNavigationObserver observer(tab); - observer.Wait(); - } else { - content::RunThisRunLoop(&run_loop); - } + content::TestNavigationObserver observer(tab); + observer.Wait(); // Check that we got the interstitial. ASSERT_TRUE(ShownPageIsInterstitial(browser())); @@ -409,7 +334,7 @@ // Tests that we don't end up canceling an interstitial (thereby closing the // whole tab) by attempting to show a second one above it. -IN_PROC_BROWSER_TEST_P(SupervisedUserTest, DontShowInterstitialTwice) { +IN_PROC_BROWSER_TEST_F(SupervisedUserTest, DontShowInterstitialTwice) { TabStripModel* tab_strip = browser()->tab_strip_model(); // Open URL in a new tab. @@ -426,8 +351,6 @@ SupervisedUserSettingsService* supervised_user_settings_service = SupervisedUserSettingsServiceFactory::GetForKey( browser()->profile()->GetProfileKey()); - base::RunLoop run_loop; - InterstitialPageObserver interstitial_observer(tab, run_loop.QuitClosure()); supervised_user_settings_service->SetLocalSetting( supervised_users::kContentPackDefaultFilteringBehavior, std::make_unique<base::Value>(SupervisedUserURLFilter::BLOCK)); @@ -437,12 +360,8 @@ ASSERT_EQ(SupervisedUserURLFilter::BLOCK, filter->GetFilteringBehaviorForURL(test_url)); - if (AreCommittedInterstitialsEnabled()) { - content::TestNavigationObserver observer(tab); - observer.Wait(); - } else { - content::RunThisRunLoop(&run_loop); - } + content::TestNavigationObserver observer(tab); + observer.Wait(); // Check that we got the interstitial. ASSERT_TRUE(ShownPageIsInterstitial(browser())); @@ -460,7 +379,7 @@ // Tests that it's possible to navigate from a blocked page to another blocked // page. -IN_PROC_BROWSER_TEST_P(SupervisedUserBlockModeTest, +IN_PROC_BROWSER_TEST_F(SupervisedUserBlockModeTest, NavigateFromBlockedPageToBlockedPage) { GURL test_url("http://www.example.com/simple.html"); ui_test_utils::NavigateToURL(browser(), test_url); @@ -477,7 +396,7 @@ } // Tests whether a visit attempt adds a special history entry. -IN_PROC_BROWSER_TEST_P(SupervisedUserBlockModeTest, HistoryVisitRecorded) { +IN_PROC_BROWSER_TEST_F(SupervisedUserBlockModeTest, HistoryVisitRecorded) { GURL allowed_url("http://www.example.com/simple.html"); const SupervisedUserURLFilter* filter = @@ -508,10 +427,7 @@ ASSERT_TRUE(ShownPageIsInterstitial(browser())); WebContents* tab = browser()->tab_strip_model()->GetActiveWebContents(); - if (AreCommittedInterstitialsEnabled()) - GoBackAndWaitForNavigation(tab); - else - GoBack(tab); + GoBackAndWaitForNavigation(tab); EXPECT_EQ(allowed_url.spec(), tab->GetURL().spec()); EXPECT_EQ(SupervisedUserURLFilter::ALLOW, @@ -527,22 +443,15 @@ history::QueryResults results; QueryHistory(history_service, "", options, &results); - // With committed interstitials enabled, going back to the site is an actual - // back navigation (instead of just closing the interstitial), so the most - // recent history entry will be the allowed site, with non-committed - // interstitials, the most recent one will be the blocked one. - int allowed = AreCommittedInterstitialsEnabled() ? 0 : 1; - int blocked = AreCommittedInterstitialsEnabled() ? 1 : 0; - // Check that the entries have the correct blocked_visit value. ASSERT_EQ(2u, results.size()); - EXPECT_EQ(blocked_url.spec(), results[blocked].url().spec()); - EXPECT_TRUE(results[blocked].blocked_visit()); - EXPECT_EQ(allowed_url.spec(), results[allowed].url().spec()); - EXPECT_FALSE(results[allowed].blocked_visit()); + EXPECT_EQ(blocked_url.spec(), results[1].url().spec()); + EXPECT_TRUE(results[1].blocked_visit()); + EXPECT_EQ(allowed_url.spec(), results[0].url().spec()); + EXPECT_FALSE(results[0].blocked_visit()); } -IN_PROC_BROWSER_TEST_P(SupervisedUserTest, GoBackOnDontProceed) { +IN_PROC_BROWSER_TEST_F(SupervisedUserTest, GoBackOnDontProceed) { // We start out at the initial navigation. WebContents* web_contents = browser()->tab_strip_model()->GetActiveWebContents(); @@ -559,9 +468,6 @@ SupervisedUserSettingsService* supervised_user_settings_service = SupervisedUserSettingsServiceFactory::GetForKey( browser()->profile()->GetProfileKey()); - auto message_loop_runner = base::MakeRefCounted<content::MessageLoopRunner>(); - InterstitialPageObserver interstitial_observer( - web_contents, message_loop_runner->QuitClosure()); supervised_user_settings_service->SetLocalSetting( supervised_users::kContentPackManualBehaviorHosts, std::move(dict)); @@ -570,12 +476,8 @@ ASSERT_EQ(SupervisedUserURLFilter::BLOCK, filter->GetFilteringBehaviorForURL(test_url)); - if (AreCommittedInterstitialsEnabled()) { - content::TestNavigationObserver observer(web_contents); - observer.Wait(); - } else { - message_loop_runner->Run(); - } + content::TestNavigationObserver block_observer(web_contents); + block_observer.Wait(); content::WindowedNotificationObserver observer( content::NOTIFICATION_LOAD_STOP, @@ -587,7 +489,7 @@ EXPECT_EQ(0, web_contents->GetController().GetCurrentEntryIndex()); } -IN_PROC_BROWSER_TEST_P(SupervisedUserTest, ClosingBlockedTabDoesNotCrash) { +IN_PROC_BROWSER_TEST_F(SupervisedUserTest, ClosingBlockedTabDoesNotCrash) { WebContents* web_contents = browser()->tab_strip_model()->GetActiveWebContents(); ASSERT_EQ(0, web_contents->GetController().GetCurrentEntryIndex()); @@ -603,9 +505,6 @@ SupervisedUserSettingsService* supervised_user_settings_service = SupervisedUserSettingsServiceFactory::GetForKey( browser()->profile()->GetProfileKey()); - auto message_loop_runner = base::MakeRefCounted<content::MessageLoopRunner>(); - InterstitialPageObserver interstitial_observer( - web_contents, message_loop_runner->QuitClosure()); supervised_user_settings_service->SetLocalSetting( supervised_users::kContentPackManualBehaviorHosts, std::move(dict)); @@ -614,13 +513,6 @@ ASSERT_EQ(SupervisedUserURLFilter::BLOCK, filter->GetFilteringBehaviorForURL(test_url)); - message_loop_runner->Run(); - - if (!AreCommittedInterstitialsEnabled()) { - InterstitialPage* interstitial_page = web_contents->GetInterstitialPage(); - ASSERT_TRUE(interstitial_page); - } - // Verify that there is no crash when closing the blocked tab // (https://crbug.com/719708). browser()->tab_strip_model()->CloseWebContentsAt( @@ -628,7 +520,7 @@ content::RunAllPendingInMessageLoop(); } -IN_PROC_BROWSER_TEST_P(SupervisedUserTest, BlockThenUnblock) { +IN_PROC_BROWSER_TEST_F(SupervisedUserTest, BlockThenUnblock) { GURL test_url("http://www.example.com/simple.html"); ui_test_utils::NavigateToURL(browser(), test_url); @@ -643,10 +535,6 @@ SupervisedUserSettingsService* supervised_user_settings_service = SupervisedUserSettingsServiceFactory::GetForKey( browser()->profile()->GetProfileKey()); - // TODO(carlosil): Remove this run_loop once Committed interstitials are the - // only code path. - base::RunLoop run_loop; - InterstitialPageObserver observer(web_contents, run_loop.QuitClosure()); supervised_user_settings_service->SetLocalSetting( supervised_users::kContentPackManualBehaviorHosts, std::move(dict)); @@ -655,12 +543,9 @@ ASSERT_EQ(SupervisedUserURLFilter::BLOCK, filter->GetFilteringBehaviorForURL(test_url)); - if (AreCommittedInterstitialsEnabled()) { - content::TestNavigationObserver observer(web_contents); - observer.Wait(); - } else { - content::RunThisRunLoop(&run_loop); - } + content::TestNavigationObserver block_observer(web_contents); + block_observer.Wait(); + ASSERT_TRUE(ShownPageIsInterstitial(browser())); dict = std::make_unique<base::DictionaryValue>(); @@ -670,17 +555,15 @@ ASSERT_EQ(SupervisedUserURLFilter::ALLOW, filter->GetFilteringBehaviorForURL(test_url)); - if (AreCommittedInterstitialsEnabled()) { - content::TestNavigationObserver observer(web_contents); - observer.Wait(); - } + content::TestNavigationObserver unblock_observer(web_contents); + unblock_observer.Wait(); ASSERT_EQ(test_url, web_contents->GetURL()); EXPECT_FALSE(ShownPageIsInterstitial(browser())); } -IN_PROC_BROWSER_TEST_P(SupervisedUserBlockModeTest, Unblock) { +IN_PROC_BROWSER_TEST_F(SupervisedUserBlockModeTest, Unblock) { GURL test_url("http://www.example.com/simple.html"); ui_test_utils::NavigateToURL(browser(), test_url);
diff --git a/chrome/browser/supervised_user/supervised_user_interstitial.cc b/chrome/browser/supervised_user/supervised_user_interstitial.cc index d4d500d..db5244180 100644 --- a/chrome/browser/supervised_user/supervised_user_interstitial.cc +++ b/chrome/browser/supervised_user/supervised_user_interstitial.cc
@@ -12,7 +12,6 @@ #include "base/metrics/histogram_macros.h" #include "base/scoped_observer.h" #include "base/strings/string_number_conversions.h" -#include "base/strings/stringprintf.h" #include "base/strings/utf_string_conversions.h" #include "base/task/post_task.h" #include "base/values.h" @@ -22,7 +21,6 @@ #include "chrome/browser/profiles/profile.h" #include "chrome/browser/supervised_user/supervised_user_service.h" #include "chrome/browser/supervised_user/supervised_user_service_factory.h" -#include "chrome/common/chrome_features.h" #include "chrome/common/pref_names.h" #include "chrome/grit/generated_resources.h" #include "components/infobars/core/infobar.h" @@ -120,36 +118,16 @@ SupervisedUserInterstitial::kTypeForTesting = &SupervisedUserInterstitial::kTypeForTesting; -// TODO(carlosil): Remove Show function and the rest of non-committed -// interstitials code once committed interstitials are the only code path. -// static -void SupervisedUserInterstitial::Show( - WebContents* web_contents, - const GURL& url, - supervised_user_error_page::FilteringBehaviorReason reason, - bool initial_page_load, - const base::Callback<void(bool)>& callback) { - DCHECK(!base::FeatureList::IsEnabled( - features::kSupervisedUserCommittedInterstitials)); - // |interstitial_page_| is responsible for deleting the interstitial. - SupervisedUserInterstitial* interstitial = new SupervisedUserInterstitial( - web_contents, url, reason, initial_page_load, callback); - - interstitial->Init(); -} - // static std::unique_ptr<SupervisedUserInterstitial> SupervisedUserInterstitial::Create( WebContents* web_contents, const GURL& url, supervised_user_error_page::FilteringBehaviorReason reason, bool initial_page_load, - const base::Callback<void(bool)>& callback) { - DCHECK(base::FeatureList::IsEnabled( - features::kSupervisedUserCommittedInterstitials)); + base::OnceClosure callback) { std::unique_ptr<SupervisedUserInterstitial> interstitial( new SupervisedUserInterstitial(web_contents, url, reason, - initial_page_load, callback)); + initial_page_load, std::move(callback))); // Caller is responsible for deleting the interstitial. interstitial->Init(); @@ -162,15 +140,12 @@ const GURL& url, supervised_user_error_page::FilteringBehaviorReason reason, bool initial_page_load, - const base::Callback<void(bool)>& callback) + base::OnceClosure callback) : web_contents_(web_contents), profile_(Profile::FromBrowserContext(web_contents->GetBrowserContext())), - interstitial_page_(NULL), url_(url), reason_(reason), - initial_page_load_(initial_page_load), - proceeded_(false), - callback_(callback), + callback_(std::move(callback)), scoped_observer_(this), weak_ptr_factory_(this) {} @@ -207,15 +182,6 @@ SupervisedUserService* supervised_user_service = SupervisedUserServiceFactory::GetForProfile(profile_); scoped_observer_.Add(supervised_user_service); - - if (!base::FeatureList::IsEnabled( - features::kSupervisedUserCommittedInterstitials)) { - // If committed interstitials are enabled we do not create an - // interstitial_page - interstitial_page_ = content::InterstitialPage::Create( - web_contents_, initial_page_load_, url_, this); - interstitial_page_->Show(); - } } // static @@ -259,12 +225,7 @@ UMA_HISTOGRAM_ENUMERATION("ManagedMode.BlockingInterstitialCommand", BACK, HISTOGRAM_BOUNDING_VALUE); - if (base::FeatureList::IsEnabled( - features::kSupervisedUserCommittedInterstitials)) { - DontProceedInternal(); - } else { - interstitial_page_->DontProceed(); - } + DontProceedInternal(); return; } @@ -275,9 +236,7 @@ SupervisedUserService* supervised_user_service = SupervisedUserServiceFactory::GetForProfile(profile_); - supervised_user_service->AddURLAccessRequest( - url_, base::Bind(&SupervisedUserInterstitial::OnAccessRequestAdded, - weak_ptr_factory_.GetWeakPtr())); + supervised_user_service->AddURLAccessRequest(url_, base::DoNothing()); return; } @@ -335,29 +294,7 @@ void SupervisedUserInterstitial::OnURLFilterChanged() { if (ShouldProceed()) { - if (base::FeatureList::IsEnabled( - features::kSupervisedUserCommittedInterstitials)) { - ProceedInternal(); - } else { - // Interstitial page deletes the interstitial when proceeding but not - // synchronously, so a check is required to avoid calling proceed twice. - if (!proceeded_) - interstitial_page_->Proceed(); - proceeded_ = true; - } - } -} - -void SupervisedUserInterstitial::OnAccessRequestAdded(bool success) { - DCHECK(!base::FeatureList::IsEnabled( - features::kSupervisedUserCommittedInterstitials)); - VLOG(1) << "Sent access request for " << url_.spec() - << (success ? " successfully" : " unsuccessfully"); - std::string jsFunc = - base::StringPrintf("setRequestStatus(%s);", success ? "true" : "false"); - if (interstitial_page_->GetMainFrame()) { - interstitial_page_->GetMainFrame()->ExecuteJavaScript( - base::ASCIIToUTF16(jsFunc), base::NullCallback()); + ProceedInternal(); } } @@ -382,20 +319,6 @@ if (web_contents_->IsBeingDestroyed()) return; - // If the interstitial was shown during a page load and there is no history - // entry to go back to, attempt to close the tab. - // This check is skipped when committed interstitials are on, because all - // interstitials are treated as initial page loads in this case, the case - // where there is nothing to go back to will be handled by the default case at - // the end. - if (!base::FeatureList::IsEnabled( - features::kSupervisedUserCommittedInterstitials) && - initial_page_load_) { - if (web_contents_->GetController().IsInitialBlankNavigation()) - TabCloser::MaybeClose(web_contents_); - return; - } - // If the interstitial was shown over an existing page, navigate back from // that page. If that is not possible, attempt to close the entire tab. if (web_contents_->GetController().CanGoBack()) { @@ -406,9 +329,8 @@ TabCloser::MaybeClose(web_contents_); } -void SupervisedUserInterstitial::DispatchContinueRequest( - bool continue_request) { - callback_.Run(continue_request); +void SupervisedUserInterstitial::OnInterstitialDone() { + std::move(callback_).Run(); // After this, the WebContents may be destroyed. Make sure we don't try to use // it again. @@ -416,17 +338,15 @@ } void SupervisedUserInterstitial::ProceedInternal() { - if (base::FeatureList::IsEnabled( - features::kSupervisedUserCommittedInterstitials) && - web_contents_) { + if (web_contents_) { // In the committed interstitials case, there will be nothing to resume, so // refresh instead. web_contents_->GetController().Reload(content::ReloadType::NORMAL, true); } - DispatchContinueRequest(true); + OnInterstitialDone(); } void SupervisedUserInterstitial::DontProceedInternal() { MoveAwayFromCurrentPage(); - DispatchContinueRequest(false); + OnInterstitialDone(); }
diff --git a/chrome/browser/supervised_user/supervised_user_interstitial.h b/chrome/browser/supervised_user/supervised_user_interstitial.h index df67241..a57fc7e 100644 --- a/chrome/browser/supervised_user/supervised_user_interstitial.h +++ b/chrome/browser/supervised_user/supervised_user_interstitial.h
@@ -18,7 +18,6 @@ #include "url/gurl.h" namespace content { -class InterstitialPage; class WebContents; } @@ -36,18 +35,12 @@ // Interstitial type, used for testing. static const content::InterstitialPageDelegate::TypeID kTypeForTesting; - static void Show(content::WebContents* web_contents, - const GURL& url, - supervised_user_error_page::FilteringBehaviorReason reason, - bool initial_page_load, - const base::Callback<void(bool)>& callback); - static std::unique_ptr<SupervisedUserInterstitial> Create( content::WebContents* web_contents, const GURL& url, supervised_user_error_page::FilteringBehaviorReason reason, bool initial_page_load, - const base::Callback<void(bool)>& callback); + base::OnceClosure callback); static std::string GetHTMLContents( Profile* profile, @@ -70,7 +63,7 @@ const GURL& url, supervised_user_error_page::FilteringBehaviorReason reason, bool initial_page_load, - const base::Callback<void(bool)>& callback); + base::OnceClosure callback); void Init(); @@ -84,8 +77,6 @@ void OnURLFilterChanged() override; // TODO(treib): Also listen to OnCustodianInfoChanged and update as required. - void OnAccessRequestAdded(bool success); - // Returns whether we should now proceed on a previously-blocked URL. // Called initially before the interstitial is shown (to catch race // conditions), or when the URL filtering prefs change. Note that this does @@ -97,7 +88,7 @@ // the request. void MoveAwayFromCurrentPage(); - void DispatchContinueRequest(bool continue_request); + void OnInterstitialDone(); void ProceedInternal(); @@ -108,20 +99,10 @@ Profile* profile_; - content::InterstitialPage* interstitial_page_; // Owns us. - GURL url_; supervised_user_error_page::FilteringBehaviorReason reason_; - // True if the interstitial was shown while loading a page (with a pending - // navigation), false if it was shown over an already loaded page. - // Interstitials behave very differently in those cases. - bool initial_page_load_; - - // True if we have already called Proceed() on the interstitial page. - bool proceeded_; - - base::Callback<void(bool)> callback_; + base::OnceClosure callback_; ScopedObserver<SupervisedUserService, SupervisedUserInterstitial> scoped_observer_;
diff --git a/chrome/browser/supervised_user/supervised_user_navigation_observer.cc b/chrome/browser/supervised_user/supervised_user_navigation_observer.cc index c2efbea6..0e1e0e1 100644 --- a/chrome/browser/supervised_user/supervised_user_navigation_observer.cc +++ b/chrome/browser/supervised_user/supervised_user_navigation_observer.cc
@@ -6,7 +6,6 @@ #include "base/bind.h" #include "base/callback.h" -#include "base/feature_list.h" #include "chrome/browser/history/history_service_factory.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/supervised_user/supervised_user_interstitial.h" @@ -14,7 +13,6 @@ #include "chrome/browser/supervised_user/supervised_user_service.h" #include "chrome/browser/supervised_user/supervised_user_service_factory.h" #include "chrome/browser/tab_contents/tab_util.h" -#include "chrome/common/chrome_features.h" #include "components/history/content/browser/history_context_helper.h" #include "components/history/core/browser/history_service.h" #include "components/history/core/browser/history_types.h" @@ -66,12 +64,10 @@ void SupervisedUserNavigationObserver::DidFinishNavigation( content::NavigationHandle* navigation_handle) { - // With committed interstitials on, if this is a different navigation than the - // one that triggered the interstitial, clear is_showing_interstitial_ + // If this is a different navigation than the one that triggered the + // interstitial, clear is_showing_interstitial_ if (is_showing_interstitial_ && - navigation_handle->GetNavigationId() != interstitial_navigation_id_ && - base::FeatureList::IsEnabled( - features::kSupervisedUserCommittedInterstitials)) { + navigation_handle->GetNavigationId() != interstitial_navigation_id_) { is_showing_interstitial_ = false; } @@ -150,22 +146,8 @@ if (!is_showing_interstitial_ && behavior == SupervisedUserURLFilter::FilteringBehavior::BLOCK) { - if (base::FeatureList::IsEnabled( - features::kSupervisedUserCommittedInterstitials)) { - web_contents()->GetController().Reload(content::ReloadType::NORMAL, - false); - return; - } - // TODO(carlosil): For now, we pass a 0 as the navigation id causing the - // interstitial for the non-committed interstitials case since we don't have - // the real id here, this doesn't cause issues since the navigation id is - // not used when committed interstitials are not enabled. This will be - // removed once committed interstitials are the only code path. - const bool initial_page_load = false; - MaybeShowInterstitial( - url, reason, initial_page_load, 0, - base::Callback<void( - SupervisedUserNavigationThrottle::CallbackActions)>()); + web_contents()->GetController().Reload(content::ReloadType::NORMAL, false); + return; } } @@ -178,54 +160,30 @@ void(SupervisedUserNavigationThrottle::CallbackActions)>& callback) { interstitial_navigation_id_ = navigation_id; is_showing_interstitial_ = true; - base::Callback<void(bool)> wrapped_callback = - base::Bind(&SupervisedUserNavigationObserver::OnInterstitialResult, - weak_ptr_factory_.GetWeakPtr(), callback); - if (base::FeatureList::IsEnabled( - features::kSupervisedUserCommittedInterstitials)) { - interstitial_ = SupervisedUserInterstitial::Create( - web_contents(), url, reason, initial_page_load, wrapped_callback); - callback.Run(SupervisedUserNavigationThrottle::CallbackActions:: - kCancelWithInterstitial); - return; - } - SupervisedUserInterstitial::Show(web_contents(), url, reason, - initial_page_load, wrapped_callback); + interstitial_ = SupervisedUserInterstitial::Create( + web_contents(), url, reason, initial_page_load, + base::BindOnce(&SupervisedUserNavigationObserver::OnInterstitialDone, + weak_ptr_factory_.GetWeakPtr())); + callback.Run(SupervisedUserNavigationThrottle::CallbackActions:: + kCancelWithInterstitial); } -void SupervisedUserNavigationObserver::OnInterstitialResult( - const base::Callback< - void(SupervisedUserNavigationThrottle::CallbackActions)>& callback, - bool result) { +void SupervisedUserNavigationObserver::OnInterstitialDone() { is_showing_interstitial_ = false; - // If committed interstitials are enabled, there is no navigation to cancel or - // defer at this point, so just clear the is_showing_interstitial variable. - if (callback && !base::FeatureList::IsEnabled( - features::kSupervisedUserCommittedInterstitials)) - callback.Run(result ? SupervisedUserNavigationThrottle::CallbackActions:: - kContinueNavigation - : SupervisedUserNavigationThrottle::CallbackActions:: - kCancelNavigation); } void SupervisedUserNavigationObserver::GoBack() { - DCHECK(base::FeatureList::IsEnabled( - features::kSupervisedUserCommittedInterstitials)); if (interstitial_ && is_showing_interstitial_) interstitial_->CommandReceived("\"back\""); } void SupervisedUserNavigationObserver::RequestPermission( RequestPermissionCallback callback) { - DCHECK(base::FeatureList::IsEnabled( - features::kSupervisedUserCommittedInterstitials)); if (interstitial_ && is_showing_interstitial_) interstitial_->RequestPermission(std::move(callback)); } void SupervisedUserNavigationObserver::Feedback() { - DCHECK(base::FeatureList::IsEnabled( - features::kSupervisedUserCommittedInterstitials)); if (interstitial_ && is_showing_interstitial_) interstitial_->CommandReceived("\"feedback\""); }
diff --git a/chrome/browser/supervised_user/supervised_user_navigation_observer.h b/chrome/browser/supervised_user/supervised_user_navigation_observer.h index 021cf57..2aaacfb 100644 --- a/chrome/browser/supervised_user/supervised_user_navigation_observer.h +++ b/chrome/browser/supervised_user/supervised_user_navigation_observer.h
@@ -82,10 +82,7 @@ const base::Callback< void(SupervisedUserNavigationThrottle::CallbackActions)>& callback); - void OnInterstitialResult( - const base::Callback< - void(SupervisedUserNavigationThrottle::CallbackActions)>& callback, - bool result); + void OnInterstitialDone(); // supervised_user::mojom::SupervisedUserCommands implementation. Should not // be called when an interstitial is no longer showing. This should be
diff --git a/chrome/browser/supervised_user/supervised_user_navigation_throttle.cc b/chrome/browser/supervised_user/supervised_user_navigation_throttle.cc index 968a0ef..591331b 100644 --- a/chrome/browser/supervised_user/supervised_user_navigation_throttle.cc +++ b/chrome/browser/supervised_user/supervised_user_navigation_throttle.cc
@@ -5,7 +5,6 @@ #include "chrome/browser/supervised_user/supervised_user_navigation_throttle.h" #include "base/bind.h" -#include "base/feature_list.h" #include "base/location.h" #include "base/logging.h" #include "base/memory/ptr_util.h" @@ -18,7 +17,6 @@ #include "chrome/browser/supervised_user/supervised_user_service.h" #include "chrome/browser/supervised_user/supervised_user_service_factory.h" #include "chrome/browser/supervised_user/supervised_user_url_filter.h" -#include "chrome/common/chrome_features.h" #include "content/public/browser/navigation_handle.h" #include "ui/base/page_transition_types.h" #include "url/gurl.h" @@ -239,24 +237,16 @@ void SupervisedUserNavigationThrottle::OnInterstitialResult( CallbackActions action) { switch (action) { - case kContinueNavigation: { - Resume(); - break; - } case kCancelNavigation: { CancelDeferredNavigation(CANCEL); break; } case kCancelWithInterstitial: { - DCHECK(base::FeatureList::IsEnabled( - features::kSupervisedUserCommittedInterstitials)); std::string interstitial_html = SupervisedUserInterstitial::GetHTMLContents( Profile::FromBrowserContext( navigation_handle()->GetWebContents()->GetBrowserContext()), reason_); - // If committed interstitials are enabled, include the HTML content in the - // ThrottleCheckResult. CancelDeferredNavigation(content::NavigationThrottle::ThrottleCheckResult( CANCEL, net::ERR_BLOCKED_BY_CLIENT, interstitial_html)); }
diff --git a/chrome/browser/supervised_user/supervised_user_navigation_throttle.h b/chrome/browser/supervised_user/supervised_user_navigation_throttle.h index 90b2563..47f36efd 100644 --- a/chrome/browser/supervised_user/supervised_user_navigation_throttle.h +++ b/chrome/browser/supervised_user/supervised_user_navigation_throttle.h
@@ -17,11 +17,7 @@ class SupervisedUserNavigationThrottle : public content::NavigationThrottle { public: - enum CallbackActions { - kContinueNavigation = 0, - kCancelNavigation, - kCancelWithInterstitial - }; + enum CallbackActions { kCancelNavigation = 0, kCancelWithInterstitial }; // Returns a new throttle for the given navigation, or nullptr if no // throttling is required.
diff --git a/chrome/browser/supervised_user/supervised_user_navigation_throttle_browsertest.cc b/chrome/browser/supervised_user/supervised_user_navigation_throttle_browsertest.cc index bc960b8..67a49a85 100644 --- a/chrome/browser/supervised_user/supervised_user_navigation_throttle_browsertest.cc +++ b/chrome/browser/supervised_user/supervised_user_navigation_throttle_browsertest.cc
@@ -5,11 +5,9 @@ #include <memory> #include "base/command_line.h" -#include "base/feature_list.h" #include "base/files/file_path.h" #include "base/path_service.h" #include "base/strings/utf_string_conversions.h" -#include "base/test/scoped_feature_list.h" #include "base/values.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/supervised_user/supervised_user_constants.h" @@ -19,7 +17,6 @@ #include "chrome/browser/supervised_user/supervised_user_settings_service_factory.h" #include "chrome/browser/ui/browser.h" #include "chrome/browser/ui/tabs/tab_strip_model.h" -#include "chrome/common/chrome_features.h" #include "chrome/common/chrome_switches.h" #include "chrome/test/base/in_process_browser_test.h" #include "chrome/test/base/ui_test_utils.h" @@ -48,9 +45,7 @@ } // namespace -class SupervisedUserNavigationThrottleTest - : public InProcessBrowserTest, - public testing::WithParamInterface<bool> { +class SupervisedUserNavigationThrottleTest : public InProcessBrowserTest { protected: SupervisedUserNavigationThrottleTest() {} ~SupervisedUserNavigationThrottleTest() override {} @@ -66,44 +61,24 @@ supervised_users::kContentPackManualBehaviorHosts, std::move(dict)); } - bool AreCommittedInterstitialsEnabled(); - bool IsInterstitialBeingShown(Browser* browser); private: void SetUpOnMainThread() override; void SetUpCommandLine(base::CommandLine* command_line) override; - - base::test::ScopedFeatureList feature_list; }; -bool SupervisedUserNavigationThrottleTest::AreCommittedInterstitialsEnabled() { - return base::FeatureList::IsEnabled( - features::kSupervisedUserCommittedInterstitials); -} - bool SupervisedUserNavigationThrottleTest::IsInterstitialBeingShown( Browser* browser) { WebContents* tab = browser->tab_strip_model()->GetActiveWebContents(); - if (AreCommittedInterstitialsEnabled()) { - base::string16 title; - ui_test_utils::GetCurrentTabTitle(browser, &title); - return tab->GetController().GetLastCommittedEntry()->GetPageType() == - content::PAGE_TYPE_ERROR && - title == base::ASCIIToUTF16("Site blocked"); - } - return tab->ShowingInterstitialPage(); + base::string16 title; + ui_test_utils::GetCurrentTabTitle(browser, &title); + return tab->GetController().GetLastCommittedEntry()->GetPageType() == + content::PAGE_TYPE_ERROR && + title == base::ASCIIToUTF16("Site blocked"); } void SupervisedUserNavigationThrottleTest::SetUpOnMainThread() { - if (GetParam()) { - feature_list.InitAndEnableFeature( - features::kSupervisedUserCommittedInterstitials); - } else { - feature_list.InitAndDisableFeature( - features::kSupervisedUserCommittedInterstitials); - } - // Resolve everything to localhost. host_resolver()->AddIPLiteralRule("*", "127.0.0.1", "localhost"); @@ -121,13 +96,9 @@ #endif } -INSTANTIATE_TEST_SUITE_P(, - SupervisedUserNavigationThrottleTest, - ::testing::Values(false, true)); - // Tests that navigating to a blocked page simply fails if there is no // SupervisedUserNavigationObserver. -IN_PROC_BROWSER_TEST_P(SupervisedUserNavigationThrottleTest, +IN_PROC_BROWSER_TEST_F(SupervisedUserNavigationThrottleTest, NoNavigationObserverBlock) { Profile* profile = browser()->profile(); SupervisedUserSettingsService* supervised_user_settings_service = @@ -150,7 +121,7 @@ EXPECT_FALSE(observer.last_navigation_succeeded()); } -IN_PROC_BROWSER_TEST_P(SupervisedUserNavigationThrottleTest, +IN_PROC_BROWSER_TEST_F(SupervisedUserNavigationThrottleTest, BlockMainFrameWithInterstitial) { BlockHost(kExampleHost2); @@ -165,7 +136,7 @@ EXPECT_TRUE(IsInterstitialBeingShown(browser())); } -IN_PROC_BROWSER_TEST_P(SupervisedUserNavigationThrottleTest, +IN_PROC_BROWSER_TEST_F(SupervisedUserNavigationThrottleTest, DontBlockSubFrame) { BlockHost(kExampleHost2); BlockHost(kIframeHost2); @@ -199,11 +170,7 @@ void SetUpCommandLine(base::CommandLine* command_line) override {} }; -INSTANTIATE_TEST_SUITE_P(, - SupervisedUserNavigationThrottleNotSupervisedTest, - ::testing::Values(false, true)); - -IN_PROC_BROWSER_TEST_P(SupervisedUserNavigationThrottleNotSupervisedTest, +IN_PROC_BROWSER_TEST_F(SupervisedUserNavigationThrottleNotSupervisedTest, DontBlock) { BlockHost(kExampleHost);
diff --git a/chrome/browser/sync/sync_ui_util.cc b/chrome/browser/sync/sync_ui_util.cc index 8920e47..f1f5488f 100644 --- a/chrome/browser/sync/sync_ui_util.cc +++ b/chrome/browser/sync/sync_ui_util.cc
@@ -5,16 +5,16 @@ #include "chrome/browser/sync/sync_ui_util.h" #include "chrome/browser/profiles/profile.h" -#include "chrome/browser/signin/signin_error_controller_factory.h" +#include "chrome/browser/signin/identity_manager_factory.h" #include "chrome/browser/signin/signin_util.h" #include "chrome/browser/sync/profile_sync_service_factory.h" #include "chrome/grit/chromium_strings.h" #include "chrome/grit/generated_resources.h" -#include "components/signin/core/browser/signin_error_controller.h" #include "components/strings/grit/components_strings.h" #include "components/sync/driver/sync_service.h" #include "components/sync/driver/sync_user_settings.h" #include "google_apis/gaia/google_service_auth_error.h" +#include "services/identity/public/cpp/identity_manager.h" #include "ui/base/l10n/l10n_util.h" namespace sync_ui_util { @@ -228,8 +228,10 @@ } const bool is_user_signout_allowed = signin_util::IsUserSignoutAllowedForProfile(profile); + CoreAccountInfo account_info = service->GetAuthenticatedAccountInfo(); GoogleServiceAuthError auth_error = - SigninErrorControllerFactory::GetForProfile(profile)->auth_error(); + IdentityManagerFactory::GetForProfile(profile) + ->GetErrorStateOfRefreshTokenForAccount(account_info.account_id); return GetStatusLabelsImpl(service, is_user_signout_allowed, auth_error, status_label, link_label, action_type); } @@ -269,9 +271,12 @@ } // Check for an auth error. - SigninErrorController* signin_error_controller = - SigninErrorControllerFactory::GetForProfile(profile); - if (signin_error_controller && signin_error_controller->HasError()) { + CoreAccountInfo account_info = service->GetAuthenticatedAccountInfo(); + GoogleServiceAuthError auth_error = + IdentityManagerFactory::GetForProfile(profile) + ->GetErrorStateOfRefreshTokenForAccount(account_info.account_id); + + if (auth_error.state() != GoogleServiceAuthError::State::NONE) { // The user can reauth to resolve the signin error. *content_string_id = IDS_SYNC_ERROR_USER_MENU_SIGNIN_MESSAGE; *button_string_id = IDS_SYNC_ERROR_USER_MENU_SIGNIN_BUTTON;
diff --git a/chrome/browser/sync/sync_ui_util_unittest.cc b/chrome/browser/sync/sync_ui_util_unittest.cc index db436df..a416e237 100644 --- a/chrome/browser/sync/sync_ui_util_unittest.cc +++ b/chrome/browser/sync/sync_ui_util_unittest.cc
@@ -86,6 +86,8 @@ // Make sure to fail authentication with an error in this case. std::string account_id = identity_manager->GetPrimaryAccountId(); identity::SetRefreshTokenForPrimaryAccount(identity_manager); + service->SetAuthenticatedAccountInfo( + identity_manager->GetPrimaryAccountInfo()); identity::UpdatePersistentErrorOfRefreshTokenForAccount( identity_manager, account_id, GoogleServiceAuthError(GoogleServiceAuthError::State::SERVICE_ERROR)); @@ -285,3 +287,48 @@ EXPECT_EQ(action_type, sync_ui_util::CONFIRM_SYNC_SETTINGS); } + +// Errors in non-sync accounts should be ignored. +TEST_F(SyncUIUtilTest, IgnoreSyncErrorForNonSyncAccount) { + std::unique_ptr<Profile> profile = BuildTestingProfile(); + + IdentityTestEnvironmentProfileAdaptor env_adaptor(profile.get()); + identity::IdentityTestEnvironment* environment = + env_adaptor.identity_test_env(); + identity::IdentityManager* identity_manager = environment->identity_manager(); + AccountInfo primary_account_info = + environment->MakePrimaryAccountAvailable(kTestUser); + + TestSyncService* service = static_cast<TestSyncService*>( + ProfileSyncServiceFactory::GetForProfile(profile.get())); + service->SetAuthenticatedAccountInfo(primary_account_info); + service->SetFirstSetupComplete(true); + + // Setup a secondary account. + AccountInfo secondary_account_info = + environment->MakeAccountAvailable("secondary-user@example.com"); + + // Verify that we do not have any existing errors. + base::string16 actionable_error_status_label; + base::string16 link_label; + sync_ui_util::ActionType action_type = sync_ui_util::NO_ACTION; + + sync_ui_util::MessageType message = sync_ui_util::GetStatusLabels( + profile.get(), &actionable_error_status_label, &link_label, &action_type); + + EXPECT_EQ(action_type, sync_ui_util::NO_ACTION); + EXPECT_EQ(message, sync_ui_util::MessageType::SYNCED); + + // Add an error to the secondary account. + identity::UpdatePersistentErrorOfRefreshTokenForAccount( + identity_manager, secondary_account_info.account_id, + GoogleServiceAuthError( + GoogleServiceAuthError::State::INVALID_GAIA_CREDENTIALS)); + + // Verify that we do not see any sign-in errors. + message = sync_ui_util::GetStatusLabels( + profile.get(), &actionable_error_status_label, &link_label, &action_type); + + EXPECT_EQ(action_type, sync_ui_util::NO_ACTION); + EXPECT_EQ(message, sync_ui_util::MessageType::SYNCED); +}
diff --git a/chrome/browser/sync/test/integration/sync_test.cc b/chrome/browser/sync/test/integration/sync_test.cc index 4194981..53a59d1c 100644 --- a/chrome/browser/sync/test/integration/sync_test.cc +++ b/chrome/browser/sync/test/integration/sync_test.cc
@@ -127,8 +127,8 @@ void OnProfileCreated(Profile* profile, bool success, bool is_new_profile) override { - g_browser_process->profile_manager()->RegisterTestingProfile(profile, true, - false); + g_browser_process->profile_manager()->RegisterTestingProfile( + base::WrapUnique(profile), true, false); // Perform any custom work needed before the profile is initialized. if (!on_profile_created_callback_.is_null())
diff --git a/chrome/browser/ui/BUILD.gn b/chrome/browser/ui/BUILD.gn index ba8ded8..a75c2bd 100644 --- a/chrome/browser/ui/BUILD.gn +++ b/chrome/browser/ui/BUILD.gn
@@ -2310,6 +2310,8 @@ "webui/settings_utils_win.cc", "webui/version_handler_win.cc", "webui/version_handler_win.h", + "webui/version_util_win.cc", + "webui/version_util_win.h", "webui/welcome/welcome_win10_handler.cc", "webui/welcome/welcome_win10_handler.h", "webui/welcome/welcome_win10_ui.cc",
diff --git a/chrome/browser/ui/OWNERS b/chrome/browser/ui/OWNERS index 51b794a..635ae05f 100644 --- a/chrome/browser/ui/OWNERS +++ b/chrome/browser/ui/OWNERS
@@ -21,6 +21,9 @@ per-file avatar_*=file://components/signin/OWNERS per-file signin_*=file://components/signin/OWNERS +per-file ui_features.cc=* +per-file ui_features.h=* + per-file settings_window_manager*chromeos*=file://chrome/browser/ui/ash/OWNERS # COMPONENT: UI>Browser
diff --git a/chrome/browser/ui/android/infobars/save_password_infobar.cc b/chrome/browser/ui/android/infobars/save_password_infobar.cc index c103904..50a71ef 100644 --- a/chrome/browser/ui/android/infobars/save_password_infobar.cc +++ b/chrome/browser/ui/android/infobars/save_password_infobar.cc
@@ -39,9 +39,7 @@ base::android::ScopedJavaLocalRef<jobject> infobar; infobar.Reset(Java_SavePasswordInfoBar_show( - env, GetEnumeratedIconId(), message_text, - save_password_delegate->message_link_range().start(), - save_password_delegate->message_link_range().end(), details_message_text, + env, GetEnumeratedIconId(), message_text, details_message_text, ok_button_text, cancel_button_text)); java_infobar_.Reset(env, infobar.obj());
diff --git a/chrome/browser/ui/android/infobars/update_password_infobar.cc b/chrome/browser/ui/android/infobars/update_password_infobar.cc index 34c072f..942d88ca 100644 --- a/chrome/browser/ui/android/infobars/update_password_infobar.cc +++ b/chrome/browser/ui/android/infobars/update_password_infobar.cc
@@ -40,21 +40,22 @@ env, update_password_delegate->GetDetailsMessageText()); std::vector<base::string16> usernames; + int selected_username = 0; if (update_password_delegate->ShowMultipleAccounts()) { - for (const auto& form : update_password_delegate->GetCurrentForms()) + for (const auto& form : update_password_delegate->GetCurrentForms()) { usernames.push_back(form->username_value); + if (usernames.back() == update_password_delegate->get_default_username()) + selected_username = usernames.size() - 1; + } } else { - usernames.push_back( - update_password_delegate->get_username_for_single_account()); + usernames.push_back(update_password_delegate->get_default_username()); } base::android::ScopedJavaLocalRef<jobject> infobar; infobar.Reset(Java_UpdatePasswordInfoBar_show( env, GetEnumeratedIconId(), - base::android::ToJavaArrayOfStrings(env, usernames), message_text, - update_password_delegate->message_link_range().start(), - update_password_delegate->message_link_range().end(), - details_message_text, ok_button_text)); + base::android::ToJavaArrayOfStrings(env, usernames), selected_username, + message_text, details_message_text, ok_button_text)); java_infobar_.Reset(env, infobar.obj()); return infobar;
diff --git a/chrome/browser/ui/apps/chrome_app_delegate.cc b/chrome/browser/ui/apps/chrome_app_delegate.cc index 6eaaed8..598ba66 100644 --- a/chrome/browser/ui/apps/chrome_app_delegate.cc +++ b/chrome/browser/ui/apps/chrome_app_delegate.cc
@@ -14,7 +14,6 @@ #include "chrome/browser/app_mode/app_mode_utils.h" #include "chrome/browser/apps/platform_apps/audio_focus_web_contents_observer.h" #include "chrome/browser/chrome_notification_types.h" -#include "chrome/browser/data_use_measurement/data_use_web_contents_observer.h" #include "chrome/browser/extensions/chrome_extension_web_contents_observer.h" #include "chrome/browser/favicon/favicon_utils.h" #include "chrome/browser/file_select_helper.h" @@ -206,8 +205,6 @@ } void ChromeAppDelegate::InitWebContents(content::WebContents* web_contents) { - data_use_measurement::DataUseWebContentsObserver::CreateForWebContents( - web_contents); favicon::CreateContentFaviconDriverForWebContents(web_contents); #if BUILDFLAG(ENABLE_PRINTING)
diff --git a/chrome/browser/ui/ash/launcher/chrome_launcher_controller.cc b/chrome/browser/ui/ash/launcher/chrome_launcher_controller.cc index b18eee83..1e0185f 100644 --- a/chrome/browser/ui/ash/launcher/chrome_launcher_controller.cc +++ b/chrome/browser/ui/ash/launcher/chrome_launcher_controller.cc
@@ -926,9 +926,9 @@ int index = 0; // Skip the app list and back button if they exist. - if (model_->items()[0].type == ash::TYPE_BACK_BUTTON) + if (model_->items()[0].type == ash::TYPE_BACK_BUTTON_DEPRECATED) ++index; - if (model_->items()[1].type == ash::TYPE_APP_LIST) + if (model_->items()[1].type == ash::TYPE_APP_LIST_DEPRECATED) ++index; // Apply pins in two steps. At the first step, go through the list of apps to @@ -1237,8 +1237,8 @@ int target_index) { // Update the pin position preference as needed. const ash::ShelfItem& item = model_->items()[target_index]; - DCHECK_NE(ash::TYPE_BACK_BUTTON, item.type); - DCHECK_NE(ash::TYPE_APP_LIST, item.type); + DCHECK_NE(ash::TYPE_BACK_BUTTON_DEPRECATED, item.type); + DCHECK_NE(ash::TYPE_APP_LIST_DEPRECATED, item.type); if (ItemTypeIsPinned(item) && should_sync_pin_changes_) SyncPinPosition(item.id); } @@ -1267,7 +1267,8 @@ ? IDS_ASH_SHELF_APP_LIST_LAUNCHER_SYNCING_TITLE : IDS_ASH_SHELF_APP_LIST_LAUNCHER_TITLE); - const int app_list_index = model_->GetItemIndexForType(ash::TYPE_APP_LIST); + const int app_list_index = + model_->GetItemIndexForType(ash::TYPE_APP_LIST_DEPRECATED); DCHECK_GE(app_list_index, 0); ash::ShelfItem item = model_->items()[app_list_index]; if (item.title != title) {
diff --git a/chrome/browser/ui/ash/launcher/chrome_launcher_controller_unittest.cc b/chrome/browser/ui/ash/launcher/chrome_launcher_controller_unittest.cc index 1ed2b24..87a16ab 100644 --- a/chrome/browser/ui/ash/launcher/chrome_launcher_controller_unittest.cc +++ b/chrome/browser/ui/ash/launcher/chrome_launcher_controller_unittest.cc
@@ -750,10 +750,10 @@ case ash::TYPE_BROWSER_SHORTCUT: result += "Chrome"; break; - case ash::TYPE_APP_LIST: + case ash::TYPE_APP_LIST_DEPRECATED: result += "AppList"; break; - case ash::TYPE_BACK_BUTTON: + case ash::TYPE_BACK_BUTTON_DEPRECATED: result += "Back"; break; default: @@ -3653,8 +3653,8 @@ TestLauncherControllerHelper* helper = new TestLauncherControllerHelper; SetLauncherControllerHelper(helper); - EXPECT_EQ(ash::TYPE_BACK_BUTTON, model_->items()[0].type); - EXPECT_EQ(ash::TYPE_APP_LIST, model_->items()[1].type); + EXPECT_EQ(ash::TYPE_BACK_BUTTON_DEPRECATED, model_->items()[0].type); + EXPECT_EQ(ash::TYPE_APP_LIST_DEPRECATED, model_->items()[1].type); EXPECT_EQ(ash::TYPE_BROWSER_SHORTCUT, model_->items()[2].type); TabStripModel* tab_strip_model = browser()->tab_strip_model(); @@ -3670,16 +3670,16 @@ EXPECT_TRUE(launcher_controller_->IsAppPinned("1")); launcher_controller_->PinAppWithID("2"); - EXPECT_EQ(ash::TYPE_BACK_BUTTON, model_->items()[0].type); - EXPECT_EQ(ash::TYPE_APP_LIST, model_->items()[1].type); + EXPECT_EQ(ash::TYPE_BACK_BUTTON_DEPRECATED, model_->items()[0].type); + EXPECT_EQ(ash::TYPE_APP_LIST_DEPRECATED, model_->items()[1].type); EXPECT_EQ(ash::TYPE_BROWSER_SHORTCUT, model_->items()[2].type); EXPECT_EQ(ash::TYPE_PINNED_APP, model_->items()[3].type); EXPECT_EQ(ash::TYPE_PINNED_APP, model_->items()[4].type); // Move browser shortcut item from index 1 to index 3. model_->Move(2, 4); - EXPECT_EQ(ash::TYPE_BACK_BUTTON, model_->items()[0].type); - EXPECT_EQ(ash::TYPE_APP_LIST, model_->items()[1].type); + EXPECT_EQ(ash::TYPE_BACK_BUTTON_DEPRECATED, model_->items()[0].type); + EXPECT_EQ(ash::TYPE_APP_LIST_DEPRECATED, model_->items()[1].type); EXPECT_EQ(ash::TYPE_PINNED_APP, model_->items()[2].type); EXPECT_EQ(ash::TYPE_PINNED_APP, model_->items()[3].type); EXPECT_EQ(ash::TYPE_BROWSER_SHORTCUT, model_->items()[4].type); @@ -3692,8 +3692,8 @@ launcher_controller_->Init(); // Check ShelfItems are restored after resetting ChromeLauncherController. - EXPECT_EQ(ash::TYPE_BACK_BUTTON, model_->items()[0].type); - EXPECT_EQ(ash::TYPE_APP_LIST, model_->items()[1].type); + EXPECT_EQ(ash::TYPE_BACK_BUTTON_DEPRECATED, model_->items()[0].type); + EXPECT_EQ(ash::TYPE_APP_LIST_DEPRECATED, model_->items()[1].type); EXPECT_EQ(ash::TYPE_PINNED_APP, model_->items()[2].type); EXPECT_EQ(ash::TYPE_PINNED_APP, model_->items()[3].type); EXPECT_EQ(ash::TYPE_BROWSER_SHORTCUT, model_->items()[4].type);
diff --git a/chrome/browser/ui/passwords/manage_passwords_state.cc b/chrome/browser/ui/passwords/manage_passwords_state.cc index fda40c3..9821506 100644 --- a/chrome/browser/ui/passwords/manage_passwords_state.cc +++ b/chrome/browser/ui/passwords/manage_passwords_state.cc
@@ -88,7 +88,7 @@ form_manager_ = std::move(form_manager); local_credentials_forms_ = DeepCopyNonPSLMapToVector(form_manager_->GetBestMatches()); - AppendDeepCopyVector(form_manager_->GetFormFetcher()->GetFederatedMatches(), + AppendDeepCopyVector(form_manager_->GetFederatedMatches(), &local_credentials_forms_); origin_ = form_manager_->GetOrigin(); SetState(password_manager::ui::PENDING_PASSWORD_STATE); @@ -100,7 +100,7 @@ form_manager_ = std::move(form_manager); local_credentials_forms_ = DeepCopyNonPSLMapToVector(form_manager_->GetBestMatches()); - AppendDeepCopyVector(form_manager_->GetFormFetcher()->GetFederatedMatches(), + AppendDeepCopyVector(form_manager_->GetFederatedMatches(), &local_credentials_forms_); origin_ = form_manager_->GetOrigin(); SetState(password_manager::ui::PENDING_PASSWORD_UPDATE_STATE); @@ -136,7 +136,7 @@ local_credentials_forms_.push_back( std::make_unique<autofill::PasswordForm>(*form.second)); } - AppendDeepCopyVector(form_manager_->GetFormFetcher()->GetFederatedMatches(), + AppendDeepCopyVector(form_manager_->GetFederatedMatches(), &local_credentials_forms_); origin_ = form_manager_->GetOrigin(); SetState(password_manager::ui::CONFIRMATION_STATE);
diff --git a/chrome/browser/ui/passwords/manage_passwords_ui_controller.cc b/chrome/browser/ui/passwords/manage_passwords_ui_controller.cc index 179c3c5..4442bdc 100644 --- a/chrome/browser/ui/passwords/manage_passwords_ui_controller.cc +++ b/chrome/browser/ui/passwords/manage_passwords_ui_controller.cc
@@ -69,6 +69,16 @@ return result; } +const password_manager::InteractionsStats* FindStatsByUsername( + base::span<const password_manager::InteractionsStats> stats, + const base::string16& username) { + auto it = std::find_if(stats.begin(), stats.end(), + [&username](const auto& element) { + return username == element.username_value; + }); + return it == stats.end() ? nullptr : &*it; +} + } // namespace ManagePasswordsUIController::ManagePasswordsUIController( @@ -326,8 +336,8 @@ DCHECK_EQ(password_manager::ui::PENDING_PASSWORD_STATE, GetState()); password_manager::PasswordFormManagerForUI* form_manager = passwords_data_.form_manager(); - return password_manager::FindStatsByUsername( - form_manager->GetFormFetcher()->GetInteractionsStats(), + return FindStatsByUsername( + form_manager->GetInteractionsStats(), form_manager->GetPendingCredentials().username_value); }
diff --git a/chrome/browser/ui/search/instant_theme_browsertest.cc b/chrome/browser/ui/search/instant_theme_browsertest.cc index 9a6115b..dbc1b9d 100644 --- a/chrome/browser/ui/search/instant_theme_browsertest.cc +++ b/chrome/browser/ui/search/instant_theme_browsertest.cc
@@ -62,8 +62,7 @@ } } - void MostVisitedItemsChanged(const std::vector<InstantMostVisitedItem>&, - bool is_custom_links) override {} + void MostVisitedItemsChanged(const InstantMostVisitedInfo&) override {} InstantService* const service_;
diff --git a/chrome/browser/ui/search/local_ntp_browsertest.cc b/chrome/browser/ui/search/local_ntp_browsertest.cc index 5c2bbe3d..abe95954 100644 --- a/chrome/browser/ui/search/local_ntp_browsertest.cc +++ b/chrome/browser/ui/search/local_ntp_browsertest.cc
@@ -103,8 +103,10 @@ } LocalNTPTest() - : LocalNTPTest(/*enabled_features=*/{}, - /*disabled_features=*/{features::kRemoveNtpFakebox}) {} + : LocalNTPTest( + /*enabled_features=*/{}, + /*disabled_features=*/{features::kRemoveNtpFakebox, + ntp_tiles::kDefaultSearchShortcut}) {} void SetUpOnMainThread() override { // Some tests depend on the prepopulated most visited tiles coming from
diff --git a/chrome/browser/ui/search/local_ntp_browsertest_base.cc b/chrome/browser/ui/search/local_ntp_browsertest_base.cc index b4e915a..01fafad 100644 --- a/chrome/browser/ui/search/local_ntp_browsertest_base.cc +++ b/chrome/browser/ui/search/local_ntp_browsertest_base.cc
@@ -125,9 +125,8 @@ } void TestInstantServiceObserver::MostVisitedItemsChanged( - const std::vector<InstantMostVisitedItem>& items, - bool is_custom_links) { - items_ = items; + const InstantMostVisitedInfo& most_visited_info) { + items_ = most_visited_info.items; if (quit_closure_most_visited_ && items_.size() == expected_count_) { std::move(quit_closure_most_visited_).Run();
diff --git a/chrome/browser/ui/search/local_ntp_browsertest_base.h b/chrome/browser/ui/search/local_ntp_browsertest_base.h index 7c27c53..33a2540d 100644 --- a/chrome/browser/ui/search/local_ntp_browsertest_base.h +++ b/chrome/browser/ui/search/local_ntp_browsertest_base.h
@@ -37,8 +37,8 @@ private: void ThemeInfoChanged(const ThemeBackgroundInfo& theme_info) override; - void MostVisitedItemsChanged(const std::vector<InstantMostVisitedItem>& items, - bool is_custom_links) override; + void MostVisitedItemsChanged( + const InstantMostVisitedInfo& most_visited_info) override; InstantService* const service_;
diff --git a/chrome/browser/ui/search/search_ipc_router.cc b/chrome/browser/ui/search/search_ipc_router.cc index 0c591d8b..ecf7379 100644 --- a/chrome/browser/ui/search/search_ipc_router.cc +++ b/chrome/browser/ui/search/search_ipc_router.cc
@@ -124,12 +124,11 @@ } void SearchIPCRouter::SendMostVisitedItems( - const std::vector<InstantMostVisitedItem>& items, - bool is_custom_links) { + const InstantMostVisitedInfo& most_visited_info) { if (!policy_->ShouldSendMostVisitedItems()) return; - embedded_search_client()->MostVisitedChanged(items, is_custom_links); + embedded_search_client()->MostVisitedChanged(most_visited_info); } void SearchIPCRouter::SendThemeBackgroundInfo( @@ -393,6 +392,34 @@ delegate_->OnOptOutOfSearchSuggestions(); } +void SearchIPCRouter::ApplyDefaultTheme() { + if (!policy_->ShouldProcessThemeChangeMessages()) + return; + + delegate_->OnApplyDefaultTheme(); +} + +void SearchIPCRouter::ApplyAutogeneratedTheme(SkColor color) { + if (!policy_->ShouldProcessThemeChangeMessages()) + return; + + delegate_->OnApplyAutogeneratedTheme(color); +} + +void SearchIPCRouter::RevertThemeChanges() { + if (!policy_->ShouldProcessThemeChangeMessages()) + return; + + delegate_->OnRevertThemeChanges(); +} + +void SearchIPCRouter::ConfirmThemeChanges() { + if (!policy_->ShouldProcessThemeChangeMessages()) + return; + + delegate_->OnConfirmThemeChanges(); +} + void SearchIPCRouter::set_delegate_for_testing(Delegate* delegate) { DCHECK(delegate); delegate_ = delegate;
diff --git a/chrome/browser/ui/search/search_ipc_router.h b/chrome/browser/ui/search/search_ipc_router.h index 0d65a18..37d27c9a 100644 --- a/chrome/browser/ui/search/search_ipc_router.h +++ b/chrome/browser/ui/search/search_ipc_router.h
@@ -137,6 +137,18 @@ // Called when a user selected to completely opt out of NTP search // suggestions. virtual void OnOptOutOfSearchSuggestions() = 0; + + // Called when users selects the default theme to apply. + virtual void OnApplyDefaultTheme() = 0; + + // Called when users selects an autogenerated theme to apply. + virtual void OnApplyAutogeneratedTheme(SkColor color) = 0; + + // Called when users cancels applied theme changes. + virtual void OnRevertThemeChanges() = 0; + + // Called when user confirms applied theme changes. + virtual void OnConfirmThemeChanges() = 0; }; // An interface to be implemented by consumers of SearchIPCRouter objects to @@ -172,6 +184,7 @@ virtual bool ShouldProcessBlocklistSearchSuggestionWithHash() = 0; virtual bool ShouldProcessSearchSuggestionSelected() = 0; virtual bool ShouldProcessOptOutOfSearchSuggestions() = 0; + virtual bool ShouldProcessThemeChangeMessages() = 0; }; // Creates chrome::mojom::EmbeddedSearchClient connections on request. @@ -203,8 +216,7 @@ OmniboxFocusChangeReason reason); // Tells the renderer about the most visited items. - void SendMostVisitedItems(const std::vector<InstantMostVisitedItem>& items, - bool is_custom_links); + void SendMostVisitedItems(const InstantMostVisitedInfo& most_visited_info); // Tells the renderer about the current theme background. void SendThemeBackgroundInfo(const ThemeBackgroundInfo& theme_info); @@ -269,6 +281,10 @@ int64_t task_id, const std::vector<uint8_t>& hash) override; void OptOutOfSearchSuggestions() override; + void ApplyDefaultTheme() override; + void ApplyAutogeneratedTheme(SkColor color) override; + void RevertThemeChanges() override; + void ConfirmThemeChanges() override; void set_embedded_search_client_factory_for_testing( std::unique_ptr<EmbeddedSearchClientFactory> factory) { embedded_search_client_factory_ = std::move(factory);
diff --git a/chrome/browser/ui/search/search_ipc_router_policy_impl.cc b/chrome/browser/ui/search/search_ipc_router_policy_impl.cc index 340858a..dd3b8c5 100644 --- a/chrome/browser/ui/search/search_ipc_router_policy_impl.cc +++ b/chrome/browser/ui/search/search_ipc_router_policy_impl.cc
@@ -120,3 +120,7 @@ bool SearchIPCRouterPolicyImpl::ShouldProcessOptOutOfSearchSuggestions() { return !is_incognito_ && search::IsInstantNTP(web_contents_); } + +bool SearchIPCRouterPolicyImpl::ShouldProcessThemeChangeMessages() { + return !is_incognito_ && search::IsInstantNTP(web_contents_); +}
diff --git a/chrome/browser/ui/search/search_ipc_router_policy_impl.h b/chrome/browser/ui/search/search_ipc_router_policy_impl.h index 0df882d..7ea8e9a 100644 --- a/chrome/browser/ui/search/search_ipc_router_policy_impl.h +++ b/chrome/browser/ui/search/search_ipc_router_policy_impl.h
@@ -51,6 +51,7 @@ bool ShouldProcessBlocklistSearchSuggestionWithHash() override; bool ShouldProcessSearchSuggestionSelected() override; bool ShouldProcessOptOutOfSearchSuggestions() override; + bool ShouldProcessThemeChangeMessages() override; // Used by unit tests. void set_is_incognito(bool is_incognito) {
diff --git a/chrome/browser/ui/search/search_ipc_router_unittest.cc b/chrome/browser/ui/search/search_ipc_router_unittest.cc index 77d73ce..0c5dc150 100644 --- a/chrome/browser/ui/search/search_ipc_router_unittest.cc +++ b/chrome/browser/ui/search/search_ipc_router_unittest.cc
@@ -97,6 +97,10 @@ MOCK_METHOD3(OnSearchSuggestionSelected, void(int task_version, long task_id, const uint8_t hash[4])); MOCK_METHOD0(OnOptOutOfSearchSuggestions, void()); + MOCK_METHOD0(OnApplyDefaultTheme, void()); + MOCK_METHOD1(OnApplyAutogeneratedTheme, void(SkColor color)); + MOCK_METHOD0(OnRevertThemeChanges, void()); + MOCK_METHOD0(OnConfirmThemeChanges, void()); }; class MockSearchIPCRouterPolicy : public SearchIPCRouter::Policy { @@ -128,6 +132,7 @@ MOCK_METHOD0(ShouldSendOmniboxFocusChanged, bool()); MOCK_METHOD0(ShouldSendMostVisitedItems, bool()); MOCK_METHOD0(ShouldSendThemeBackgroundInfo, bool()); + MOCK_METHOD0(ShouldProcessThemeChangeMessages, bool()); }; class MockEmbeddedSearchClientFactory @@ -769,9 +774,8 @@ .Times(1) .WillOnce(Return(true)); - EXPECT_CALL(*mock_embedded_search_client(), MostVisitedChanged(_, false)); - GetSearchIPCRouter().SendMostVisitedItems( - std::vector<InstantMostVisitedItem>(), false); + EXPECT_CALL(*mock_embedded_search_client(), MostVisitedChanged(_)); + GetSearchIPCRouter().SendMostVisitedItems(InstantMostVisitedInfo()); } TEST_F(SearchIPCRouterTest, DoNotSendMostVisitedItemsMsg) { @@ -782,10 +786,8 @@ .Times(1) .WillOnce(Return(false)); - EXPECT_CALL(*mock_embedded_search_client(), MostVisitedChanged(_, false)) - .Times(0); - GetSearchIPCRouter().SendMostVisitedItems( - std::vector<InstantMostVisitedItem>(), false); + EXPECT_CALL(*mock_embedded_search_client(), MostVisitedChanged(_)).Times(0); + GetSearchIPCRouter().SendMostVisitedItems(InstantMostVisitedInfo()); } TEST_F(SearchIPCRouterTest, SendThemeBackgroundInfoMsg) {
diff --git a/chrome/browser/ui/search/search_tab_helper.cc b/chrome/browser/ui/search/search_tab_helper.cc index 26eeb21..d9d3264 100644 --- a/chrome/browser/ui/search/search_tab_helper.cc +++ b/chrome/browser/ui/search/search_tab_helper.cc
@@ -11,6 +11,7 @@ #include "build/build_config.h" #include "chrome/browser/chrome_notification_types.h" #include "chrome/browser/profiles/profile.h" +#include "chrome/browser/search/chrome_colors/chrome_colors_factory.h" #include "chrome/browser/search/instant_service.h" #include "chrome/browser/search/instant_service_factory.h" #include "chrome/browser/search/search.h" @@ -111,6 +112,9 @@ search_suggest_service_ = SearchSuggestServiceFactory::GetForProfile(profile()); + + chrome_colors_service_ = + chrome_colors::ChromeColorsFactory::GetForProfile(profile()); } SearchTabHelper::~SearchTabHelper() { @@ -234,9 +238,8 @@ } void SearchTabHelper::MostVisitedItemsChanged( - const std::vector<InstantMostVisitedItem>& items, - bool is_custom_links) { - ipc_router_.SendMostVisitedItems(items, is_custom_links); + const InstantMostVisitedInfo& most_visited_info) { + ipc_router_.SendMostVisitedItems(most_visited_info); } void SearchTabHelper::FocusOmnibox(bool focus) { @@ -475,6 +478,26 @@ search_suggest_service_->OptOutOfSearchSuggestions(); } +void SearchTabHelper::OnApplyDefaultTheme() { + if (chrome_colors_service_) + chrome_colors_service_->ApplyDefaultTheme(); +} + +void SearchTabHelper::OnApplyAutogeneratedTheme(SkColor color) { + if (chrome_colors_service_) + chrome_colors_service_->ApplyAutogeneratedTheme(color); +} + +void SearchTabHelper::OnRevertThemeChanges() { + if (chrome_colors_service_) + chrome_colors_service_->RevertThemeChanges(); +} + +void SearchTabHelper::OnConfirmThemeChanges() { + if (chrome_colors_service_) + chrome_colors_service_->ConfirmThemeChanges(); +} + OmniboxView* SearchTabHelper::GetOmniboxView() { return const_cast<OmniboxView*>( const_cast<const SearchTabHelper*>(this)->GetOmniboxView());
diff --git a/chrome/browser/ui/search/search_tab_helper.h b/chrome/browser/ui/search/search_tab_helper.h index 999497d..1e16472 100644 --- a/chrome/browser/ui/search/search_tab_helper.h +++ b/chrome/browser/ui/search/search_tab_helper.h
@@ -12,6 +12,7 @@ #include "base/strings/string16.h" #include "base/time/time.h" #include "build/build_config.h" +#include "chrome/browser/search/chrome_colors/chrome_colors_service.h" #include "chrome/browser/search/instant_service_observer.h" #include "chrome/browser/ui/search/search_ipc_router.h" #include "chrome/common/search/instant_types.h" @@ -123,11 +124,15 @@ long task_id, const uint8_t hash[4]) override; void OnOptOutOfSearchSuggestions() override; + void OnApplyDefaultTheme() override; + void OnApplyAutogeneratedTheme(SkColor color) override; + void OnRevertThemeChanges() override; + void OnConfirmThemeChanges() override; // Overridden from InstantServiceObserver: void ThemeInfoChanged(const ThemeBackgroundInfo& theme_info) override; - void MostVisitedItemsChanged(const std::vector<InstantMostVisitedItem>& items, - bool is_custom_links) override; + void MostVisitedItemsChanged( + const InstantMostVisitedInfo& most_visited_info) override; // Overridden from SelectFileDialog::Listener: void FileSelected(const base::FilePath& path, @@ -156,6 +161,8 @@ scoped_refptr<ui::SelectFileDialog> select_file_dialog_; + chrome_colors::ChromeColorsService* chrome_colors_service_; + WEB_CONTENTS_USER_DATA_KEY_DECL(); DISALLOW_COPY_AND_ASSIGN(SearchTabHelper);
diff --git a/chrome/browser/ui/startup/startup_browser_creator_browsertest.cc b/chrome/browser/ui/startup/startup_browser_creator_browsertest.cc index f7e0b9ef..93760a8b 100644 --- a/chrome/browser/ui/startup/startup_browser_creator_browsertest.cc +++ b/chrome/browser/ui/startup/startup_browser_creator_browsertest.cc
@@ -1244,7 +1244,7 @@ } Profile* profile1_ptr = profile1.get(); ASSERT_TRUE(profile1_ptr); - profile_manager->RegisterTestingProfile(profile1.release(), true, false); + profile_manager->RegisterTestingProfile(std::move(profile1), true, false); Browser* browser = OpenNewBrowser(profile1_ptr); ASSERT_TRUE(browser); @@ -1318,7 +1318,7 @@ } Profile* profile1_ptr = profile1.get(); ASSERT_TRUE(profile1_ptr); - profile_manager->RegisterTestingProfile(profile1.release(), true, false); + profile_manager->RegisterTestingProfile(std::move(profile1), true, false); Browser* browser = OpenNewBrowser(profile1_ptr); ASSERT_TRUE(browser);
diff --git a/chrome/browser/ui/startup/startup_browser_creator_triggered_reset_browsertest_win.cc b/chrome/browser/ui/startup/startup_browser_creator_triggered_reset_browsertest_win.cc index 8b64fca..c51e56f3 100644 --- a/chrome/browser/ui/startup/startup_browser_creator_triggered_reset_browsertest_win.cc +++ b/chrome/browser/ui/startup/startup_browser_creator_triggered_reset_browsertest_win.cc
@@ -250,7 +250,8 @@ Profile::CreateProfile(path, nullptr, Profile::CREATE_MODE_SYNCHRONOUS); } Profile* other_profile_ptr = other_profile.get(); - profile_manager->RegisterTestingProfile(other_profile.release(), true, false); + profile_manager->RegisterTestingProfile(std::move(other_profile), true, + false); // Use a couple same-site HTTP URLs. ASSERT_TRUE(embedded_test_server()->Start());
diff --git a/chrome/browser/ui/tab_helpers.cc b/chrome/browser/ui/tab_helpers.cc index cf7830e..9e9585e 100644 --- a/chrome/browser/ui/tab_helpers.cc +++ b/chrome/browser/ui/tab_helpers.cc
@@ -20,7 +20,6 @@ #include "chrome/browser/content_settings/sound_content_setting_observer.h" #include "chrome/browser/content_settings/tab_specific_content_settings.h" #include "chrome/browser/data_reduction_proxy/data_reduction_proxy_tab_helper.h" -#include "chrome/browser/data_use_measurement/data_use_web_contents_observer.h" #include "chrome/browser/engagement/site_engagement_helper.h" #include "chrome/browser/engagement/site_engagement_service.h" #include "chrome/browser/external_protocol/external_protocol_observer.h" @@ -208,8 +207,6 @@ ConnectionHelpTabHelper::CreateForWebContents(web_contents); CoreTabHelper::CreateForWebContents(web_contents); DataReductionProxyTabHelper::CreateForWebContents(web_contents); - data_use_measurement::DataUseWebContentsObserver::CreateForWebContents( - web_contents); ExternalProtocolObserver::CreateForWebContents(web_contents); favicon::CreateContentFaviconDriverForWebContents(web_contents); FindTabHelper::CreateForWebContents(web_contents);
diff --git a/chrome/browser/ui/ui_features.cc b/chrome/browser/ui/ui_features.cc index d6ad055..826b393d 100644 --- a/chrome/browser/ui/ui_features.cc +++ b/chrome/browser/ui/ui_features.cc
@@ -39,7 +39,6 @@ const base::Feature kTabHoverCardImages{"TabHoverCardImages", base::FEATURE_DISABLED_BY_DEFAULT}; -#if !defined(OS_ANDROID) // Whether to enable "dark mode" enhancements in Mac Mojave or Windows 10 for // UIs implemented with web technologies. const base::Feature kWebUIDarkMode { @@ -50,6 +49,5 @@ base::FEATURE_DISABLED_BY_DEFAULT #endif // defined(OS_MACOSX) || defined(OS_WIN) }; -#endif // !defined(OS_ANDROID) } // namespace features
diff --git a/chrome/browser/ui/ui_features.h b/chrome/browser/ui/ui_features.h index 56a5000f..c20e3d9 100644 --- a/chrome/browser/ui/ui_features.h +++ b/chrome/browser/ui/ui_features.h
@@ -31,9 +31,7 @@ extern const base::Feature kTabHoverCardImages; -#if !defined(OS_ANDROID) extern const base::Feature kWebUIDarkMode; -#endif } // namespace features
diff --git a/chrome/browser/ui/views/profiles/profile_chooser_view_browsertest.cc b/chrome/browser/ui/views/profiles/profile_chooser_view_browsertest.cc index bf77c242..dc8a8f7df 100644 --- a/chrome/browser/ui/views/profiles/profile_chooser_view_browsertest.cc +++ b/chrome/browser/ui/views/profiles/profile_chooser_view_browsertest.cc
@@ -61,7 +61,7 @@ std::unique_ptr<Profile> profile = Profile::CreateProfile(path, nullptr, Profile::CREATE_MODE_SYNCHRONOUS); Profile* profile_ptr = profile.get(); - profile_manager->RegisterTestingProfile(profile.release(), true, false); + profile_manager->RegisterTestingProfile(std::move(profile), true, false); EXPECT_EQ(starting_number_of_profiles + 1, profile_manager->GetNumberOfProfiles()); return profile_ptr;
diff --git a/chrome/browser/ui/views/tabs/new_tab_button.cc b/chrome/browser/ui/views/tabs/new_tab_button.cc index f5021728..677455d 100644 --- a/chrome/browser/ui/views/tabs/new_tab_button.cc +++ b/chrome/browser/ui/views/tabs/new_tab_button.cc
@@ -74,7 +74,7 @@ ui::EF_MIDDLE_MOUSE_BUTTON); #endif - ink_drop_container = + ink_drop_container_ = AddChildView(std::make_unique<views::InkDropContainerView>()); SetInkDropMode(InkDropMode::ON); @@ -133,15 +133,16 @@ } void NewTabButton::Layout() { - ink_drop_container->SetBoundsRect(GetLocalBounds()); + views::ImageButton::Layout(); + ink_drop_container_->SetBoundsRect(GetLocalBounds()); } void NewTabButton::AddLayerBeneathView(ui::Layer* new_layer) { - ink_drop_container->AddLayerBeneathView(new_layer); + ink_drop_container_->AddLayerBeneathView(new_layer); } void NewTabButton::RemoveLayerBeneathView(ui::Layer* old_layer) { - ink_drop_container->RemoveLayerBeneathView(old_layer); + ink_drop_container_->RemoveLayerBeneathView(old_layer); } #if defined(OS_WIN)
diff --git a/chrome/browser/ui/views/tabs/new_tab_button.h b/chrome/browser/ui/views/tabs/new_tab_button.h index 4e0ebf7..211faf8 100644 --- a/chrome/browser/ui/views/tabs/new_tab_button.h +++ b/chrome/browser/ui/views/tabs/new_tab_button.h
@@ -111,7 +111,7 @@ TabStrip* tab_strip_; // Contains our ink drop layer so it can paint above our background. - views::InkDropContainerView* ink_drop_container; + views::InkDropContainerView* ink_drop_container_; // Promotional UI that appears next to the NewTabButton and encourages its // use. Owned by its NativeWidget.
diff --git a/chrome/browser/ui/views/toolbar/toolbar_button.cc b/chrome/browser/ui/views/toolbar/toolbar_button.cc index 815f670..81a7a80 100644 --- a/chrome/browser/ui/views/toolbar/toolbar_button.cc +++ b/chrome/browser/ui/views/toolbar/toolbar_button.cc
@@ -52,7 +52,7 @@ set_context_menu_controller(this); if (base::FeatureList::IsEnabled(views::kInstallableInkDropFeature)) - installable_ink_drop_ = std::make_unique<views::InstallableInkDrop>(); + installable_ink_drop_ = std::make_unique<views::InstallableInkDrop>(this); SetInkDropMode(InkDropMode::ON);
diff --git a/chrome/browser/ui/webui/browser_switch/browser_switch_ui.cc b/chrome/browser/ui/webui/browser_switch/browser_switch_ui.cc index 55fc6f0..273e5ce 100644 --- a/chrome/browser/ui/webui/browser_switch/browser_switch_ui.cc +++ b/chrome/browser/ui/webui/browser_switch/browser_switch_ui.cc
@@ -9,6 +9,7 @@ #include "base/bind.h" #include "base/macros.h" #include "base/metrics/histogram_macros.h" +#include "base/time/time.h" #include "base/values.h" #include "chrome/browser/browser_switcher/alternative_browser_driver.h" #include "chrome/browser/browser_switcher/browser_switcher_service.h" @@ -153,6 +154,8 @@ return source; } +} // namespace + class BrowserSwitchHandler : public content::WebUIMessageHandler { public: BrowserSwitchHandler(); @@ -160,8 +163,19 @@ // WebUIMessageHandler void RegisterMessages() override; + void OnJavascriptAllowed() override; + void OnJavascriptDisallowed() override; private: + void OnAllRulesetsParsed(browser_switcher::BrowserSwitcherService* service); + + void OnBrowserSwitcherPrefsChanged( + browser_switcher::BrowserSwitcherPrefs* prefs, + const std::vector<std::string>& changed_prefs); + + // For the internals page: tell JS to update all the page contents. + void UpdateEverything(); + // Launches the given URL in the configured alternative browser. Acts as a // bridge for |AlternativeBrowserDriver::TryLaunch()|. Then, if that succeeds, // closes the current tab. @@ -196,10 +210,42 @@ // } void HandleGetDecision(const base::ListValue* args); + // Resolves a promise with the time of the last policy fetch and next policy + // fetch, as JS timestamps. + // + // { + // "last_fetch": 123456789, + // "next_fetch": 234567890 + // } + void HandleGetTimestamps(const base::ListValue* args); + + // Resolves a promise with the configured sitelist XML download URLs. The keys + // are the name of the pref associated with the sitelist. + // + // { + // "browser_switcher": { + // "use_ie_sitelist": "http://example.com/sitelist.xml", + // "external_sitelist_url": "http://example.com/other_sitelist.xml", + // "external_greylist_url": null + // } + // } + void HandleGetRulesetSources(const base::ListValue* args); + + // Immediately re-download and apply XML rules. + void HandleRefreshXml(const base::ListValue* args); + + std::unique_ptr<browser_switcher::BrowserSwitcherPrefs::CallbackSubscription> + prefs_subscription_; + + std::unique_ptr< + browser_switcher::BrowserSwitcherService::CallbackSubscription> + service_subscription_; + DISALLOW_COPY_AND_ASSIGN(BrowserSwitchHandler); }; -BrowserSwitchHandler::BrowserSwitchHandler() = default; +BrowserSwitchHandler::BrowserSwitchHandler() {} + BrowserSwitchHandler::~BrowserSwitchHandler() = default; void BrowserSwitchHandler::RegisterMessages() { @@ -220,6 +266,47 @@ "getDecision", base::BindRepeating(&BrowserSwitchHandler::HandleGetDecision, base::Unretained(this))); + web_ui()->RegisterMessageCallback( + "getTimestamps", + base::BindRepeating(&BrowserSwitchHandler::HandleGetTimestamps, + base::Unretained(this))); + web_ui()->RegisterMessageCallback( + "getRulesetSources", + base::BindRepeating(&BrowserSwitchHandler::HandleGetRulesetSources, + base::Unretained(this))); + web_ui()->RegisterMessageCallback( + "refreshXml", base::BindRepeating(&BrowserSwitchHandler::HandleRefreshXml, + base::Unretained(this))); +} + +void BrowserSwitchHandler::OnJavascriptAllowed() { + auto* service = GetBrowserSwitcherService(web_ui()); + prefs_subscription_ = service->prefs().RegisterPrefsChangedCallback( + base::BindRepeating(&BrowserSwitchHandler::OnBrowserSwitcherPrefsChanged, + base::Unretained(this))); + service_subscription_ = + service->RegisterAllRulesetsParsedCallback(base::BindRepeating( + &BrowserSwitchHandler::OnAllRulesetsParsed, base::Unretained(this))); +} + +void BrowserSwitchHandler::OnJavascriptDisallowed() { + prefs_subscription_.reset(); + service_subscription_.reset(); +} + +void BrowserSwitchHandler::OnAllRulesetsParsed( + browser_switcher::BrowserSwitcherService* service) { + UpdateEverything(); +} + +void BrowserSwitchHandler::OnBrowserSwitcherPrefsChanged( + browser_switcher::BrowserSwitcherPrefs* prefs, + const std::vector<std::string>& changed_prefs) { + UpdateEverything(); +} + +void BrowserSwitchHandler::UpdateEverything() { + CallJavascriptFunction("updateEverything", base::Value()); } void BrowserSwitchHandler::HandleLaunchAlternativeBrowserAndCloseTab( @@ -335,7 +422,55 @@ ResolveJavascriptCallback(args->GetList()[0], retval); } -} // namespace +void BrowserSwitchHandler::HandleGetTimestamps(const base::ListValue* args) { + DCHECK(args); + AllowJavascript(); + + auto* service = GetBrowserSwitcherService(web_ui()); + auto* downloader = service->sitelist_downloader(); + + if (!downloader) { + ResolveJavascriptCallback(args->GetList()[0], base::Value()); + return; + } + + base::DictionaryValue retval; + retval.Set("last_fetch", std::make_unique<base::Value>( + downloader->last_refresh_time().ToJsTime())); + retval.Set("next_fetch", std::make_unique<base::Value>( + downloader->next_refresh_time().ToJsTime())); + + ResolveJavascriptCallback(args->GetList()[0], retval); +} + +void BrowserSwitchHandler::HandleGetRulesetSources( + const base::ListValue* args) { + DCHECK(args); + AllowJavascript(); + + auto* service = GetBrowserSwitcherService(web_ui()); + std::vector<browser_switcher::RulesetSource> sources = + service->GetRulesetSources(); + + base::DictionaryValue retval; + for (const auto& source : sources) { + std::unique_ptr<base::Value> val; + if (source.url.is_valid()) + val = std::make_unique<base::Value>(source.url.spec()); + else + val = std::make_unique<base::Value>(); + // |pref_name| is something like "browser_switcher.blah", so this will be in + // a nested object. + retval.Set(source.pref_name, std::move(val)); + } + ResolveJavascriptCallback(args->GetList()[0], retval); +} + +void BrowserSwitchHandler::HandleRefreshXml(const base::ListValue* args) { + DCHECK(args); + auto* service = GetBrowserSwitcherService(web_ui()); + service->StartDownload(base::TimeDelta()); +} BrowserSwitchUI::BrowserSwitchUI(content::WebUI* web_ui) : WebUIController(web_ui) {
diff --git a/chrome/browser/ui/webui/browser_switch/browser_switch_ui.h b/chrome/browser/ui/webui/browser_switch/browser_switch_ui.h index ee9dc5c..b2e43b62 100644 --- a/chrome/browser/ui/webui/browser_switch/browser_switch_ui.h +++ b/chrome/browser/ui/webui/browser_switch/browser_switch_ui.h
@@ -6,6 +6,7 @@ #define CHROME_BROWSER_UI_WEBUI_BROWSER_SWITCH_BROWSER_SWITCH_UI_H_ #include "base/macros.h" +#include "chrome/browser/browser_switcher/browser_switcher_prefs.h" #include "content/public/browser/web_ui_controller.h" class BrowserSwitchUI : public content::WebUIController {
diff --git a/chrome/browser/ui/webui/interventions_internals/interventions_internals_page_handler.cc b/chrome/browser/ui/webui/interventions_internals/interventions_internals_page_handler.cc index ad7d7c6..5c60c661 100644 --- a/chrome/browser/ui/webui/interventions_internals/interventions_internals_page_handler.cc +++ b/chrome/browser/ui/webui/interventions_internals/interventions_internals_page_handler.cc
@@ -28,7 +28,6 @@ // HTML DOM ID used in the JavaScript code. The IDs are generated here so that // the DOM would have sensible name instead of autogenerated IDs. const char kPreviewsAllowedHtmlId[] = "previews-allowed-status"; -const char kClientLoFiPreviewsHtmlId[] = "client-lofi-preview-status"; const char kLitePageRedirectHtmlId[] = "lite-page-redirect-status"; const char kNoScriptPreviewsHtmlId[] = "noscript-preview-status"; const char kResourceLoadingHintsHtmlId[] = "resource-loading-hints-status"; @@ -36,7 +35,6 @@ // Descriptions for previews. const char kPreviewsAllowedDescription[] = "Previews Allowed"; -const char kClientLoFiDescription[] = "Client LoFi Previews"; const char kLitePageRedirectDescription[] = "Lite Page Redirect / Server Previews"; const char kNoScriptDescription[] = "NoScript Previews"; @@ -249,12 +247,6 @@ noscript_status->htmlId = kNoScriptPreviewsHtmlId; statuses.push_back(std::move(noscript_status)); - auto client_lofi_status = mojom::PreviewsStatus::New(); - client_lofi_status->description = kClientLoFiDescription; - client_lofi_status->enabled = previews::params::IsClientLoFiEnabled(); - client_lofi_status->htmlId = kClientLoFiPreviewsHtmlId; - statuses.push_back(std::move(client_lofi_status)); - std::move(callback).Run(std::move(statuses)); }
diff --git a/chrome/browser/ui/webui/interventions_internals/interventions_internals_page_handler_unittest.cc b/chrome/browser/ui/webui/interventions_internals/interventions_internals_page_handler_unittest.cc index 53e7db1..1743e638 100644 --- a/chrome/browser/ui/webui/interventions_internals/interventions_internals_page_handler_unittest.cc +++ b/chrome/browser/ui/webui/interventions_internals/interventions_internals_page_handler_unittest.cc
@@ -55,7 +55,6 @@ constexpr char kLitePageRedirectHtmlId[] = "lite-page-redirect-status"; constexpr char kResourceLoadingHintsHtmlId[] = "resource-loading-hints-status"; constexpr char kNoScriptPreviewsHtmlId[] = "noscript-preview-status"; -constexpr char kClientLoFiPreviewsHtmlId[] = "client-lofi-preview-status"; // Descriptions for previews. constexpr char kPreviewsAllowedDescription[] = "Previews Allowed"; @@ -65,7 +64,6 @@ constexpr char kResourceLoadingHintsDescription[] = "ResourceLoadingHints Previews"; constexpr char kNoScriptDescription[] = "NoScript Previews"; -constexpr char kClientLoFiDescription[] = "Client LoFi Previews"; // The HTML DOM ID used in Javascript. constexpr char kOfflinePageFlagHtmlId[] = "offline-page-flag"; @@ -327,7 +325,7 @@ page_handler_->GetPreviewsEnabled( base::BindOnce(&MockGetPreviewsEnabledCallback)); - constexpr size_t expected = 6; + constexpr size_t expected = 5; EXPECT_EQ(expected, passed_in_modes.size()); } @@ -355,30 +353,6 @@ EXPECT_TRUE(previews_allowed->second->enabled); } -TEST_F(InterventionsInternalsPageHandlerTest, ClientLoFiDisabled) { - // Init with kClientLoFi disabled. - scoped_feature_list_->InitWithFeatures({}, {previews::features::kClientLoFi}); - - page_handler_->GetPreviewsEnabled( - base::BindOnce(&MockGetPreviewsEnabledCallback)); - auto client_lofi = passed_in_modes.find(kClientLoFiPreviewsHtmlId); - ASSERT_NE(passed_in_modes.end(), client_lofi); - EXPECT_EQ(kClientLoFiDescription, client_lofi->second->description); - EXPECT_FALSE(client_lofi->second->enabled); -} - -TEST_F(InterventionsInternalsPageHandlerTest, ClientLoFiEnabled) { - // Init with kClientLoFi enabled. - scoped_feature_list_->InitWithFeatures({previews::features::kClientLoFi}, {}); - - page_handler_->GetPreviewsEnabled( - base::BindOnce(&MockGetPreviewsEnabledCallback)); - auto client_lofi = passed_in_modes.find(kClientLoFiPreviewsHtmlId); - ASSERT_NE(passed_in_modes.end(), client_lofi); - EXPECT_EQ(kClientLoFiDescription, client_lofi->second->description); - EXPECT_TRUE(client_lofi->second->enabled); -} - TEST_F(InterventionsInternalsPageHandlerTest, NoScriptDisabled) { // Init with kNoScript disabled. scoped_feature_list_->InitWithFeatures(
diff --git a/chrome/browser/ui/webui/offline/offline_internals_ui_message_handler.cc b/chrome/browser/ui/webui/offline/offline_internals_ui_message_handler.cc index c5e4553..d8eadc54 100644 --- a/chrome/browser/ui/webui/offline/offline_internals_ui_message_handler.cc +++ b/chrome/browser/ui/webui/offline/offline_internals_ui_message_handler.cc
@@ -34,7 +34,6 @@ #include "components/offline_pages/core/prefetch/prefetch_background_task_handler.h" #include "components/offline_pages/core/prefetch/prefetch_dispatcher.h" #include "components/offline_pages/core/prefetch/prefetch_downloader.h" -#include "components/offline_pages/core/prefetch/prefetch_gcm_handler.h" #include "components/offline_pages/core/prefetch/prefetch_prefs.h" #include "components/offline_pages/core/prefetch/prefetch_service.h" #include "components/offline_pages/core/prefetch/prefetch_types.h" @@ -261,28 +260,20 @@ void OfflineInternalsUIMessageHandler::HandleScheduleNwake( const base::ListValue* args) { AllowJavascript(); - CHECK(!args->GetList().empty()); - base::Value callback_id = args->GetList()[0].Clone(); + const base::Value* callback_id; + CHECK(args->Get(0, &callback_id)); if (prefetch_service_) { - prefetch_service_->GetGCMToken(base::BindOnce( - &OfflineInternalsUIMessageHandler::ScheduleNwakeWithGCMToken, - weak_ptr_factory_.GetWeakPtr(), std::move(callback_id))); + prefetch_service_->ForceRefreshSuggestions(); + prefetch_service_->GetPrefetchBackgroundTaskHandler() + ->EnsureTaskScheduled(); + ResolveJavascriptCallback(*callback_id, base::Value("Scheduled.")); } else { - RejectJavascriptCallback(callback_id, + RejectJavascriptCallback(*callback_id, base::Value("No prefetch service available.")); } } -void OfflineInternalsUIMessageHandler::ScheduleNwakeWithGCMToken( - base::Value callback_id, - const std::string& gcm_token) { - prefetch_service_->ForceRefreshSuggestions(); - prefetch_service_->GetPrefetchBackgroundTaskHandler()->EnsureTaskScheduled( - gcm_token); - ResolveJavascriptCallback(callback_id, base::Value("Scheduled.")); -} - void OfflineInternalsUIMessageHandler::HandleCancelNwake( const base::ListValue* args) { AllowJavascript();
diff --git a/chrome/browser/ui/webui/offline/offline_internals_ui_message_handler.h b/chrome/browser/ui/webui/offline/offline_internals_ui_message_handler.h index 61e06e4..09a71868 100644 --- a/chrome/browser/ui/webui/offline/offline_internals_ui_message_handler.h +++ b/chrome/browser/ui/webui/offline/offline_internals_ui_message_handler.h
@@ -85,8 +85,6 @@ // Schedules an NWake signal. void HandleScheduleNwake(const base::ListValue* args); - void ScheduleNwakeWithGCMToken(base::Value callback_id, - const std::string& gcm_token); // Cancels an NWake signal. void HandleCancelNwake(const base::ListValue* args);
diff --git a/chrome/browser/ui/webui/policy_ui_browsertest.cc b/chrome/browser/ui/webui/policy_ui_browsertest.cc index f06534a..6286246 100644 --- a/chrome/browser/ui/webui/policy_ui_browsertest.cc +++ b/chrome/browser/ui/webui/policy_ui_browsertest.cc
@@ -47,8 +47,8 @@ #include "ui/shell_dialogs/select_file_policy.h" #include "url/gurl.h" -using testing::Return; using testing::_; +using testing::Return; namespace { @@ -142,6 +142,21 @@ return expected_policy; } +void SetChromeMetaData(base::DictionaryValue* expected) { + // Only set the expected keys and types and not the values since + // these can vary greatly on the platform, OS, architecture + // that is running. + constexpr char prefix[] = "chromeMetadata"; + expected->SetPath({prefix, "application"}, base::Value("")); + expected->SetPath({prefix, "version"}, base::Value("")); + expected->SetPath({prefix, "revision"}, base::Value("")); +#if defined(OS_CHROMEOS) + expected->SetPath({prefix, "platform"}, base::Value("")); +#else + expected->SetPath({prefix, "OS"}, base::Value("")); +#endif +} + void SetExpectedPolicy(base::DictionaryValue* expected, const std::string& name, const std::string& level, @@ -185,7 +200,7 @@ const policy::PolicyNamespace& policy_namespace, const policy::PolicyMap& policy); - void VerifyPolicies(const std::vector<std::vector<std::string> >& expected); + void VerifyPolicies(const std::vector<std::vector<std::string>>& expected); void VerifyExportingPolicies(const base::DictionaryValue& expected); @@ -237,11 +252,9 @@ } }; -PolicyUITest::PolicyUITest() { -} +PolicyUITest::PolicyUITest() {} -PolicyUITest::~PolicyUITest() { -} +PolicyUITest::~PolicyUITest() {} void PolicyUITest::SetUpInProcessBrowserTestFixture() { EXPECT_CALL(provider_, IsInitializationComplete(_)) @@ -266,7 +279,7 @@ } void PolicyUITest::VerifyPolicies( - const std::vector<std::vector<std::string> >& expected_policies) { + const std::vector<std::vector<std::string>>& expected_policies) { ui_test_utils::NavigateToURL(browser(), GURL("chrome://policy")); // Retrieve the text contents of the policy table cells for all policies. @@ -289,8 +302,8 @@ content::WebContents* contents = browser()->tab_strip_model()->GetActiveWebContents(); std::string json; - ASSERT_TRUE(content::ExecuteScriptAndExtractString(contents, javascript, - &json)); + ASSERT_TRUE( + content::ExecuteScriptAndExtractString(contents, javascript, &json)); std::unique_ptr<base::Value> value_ptr = base::JSONReader::ReadDeprecated(json); const base::ListValue* actual_policies = NULL; @@ -344,6 +357,24 @@ base::DictionaryValue* actual_policies = nullptr; EXPECT_TRUE(value_ptr->GetAsDictionary(&actual_policies)); + // Since Chrome Metadata has a lot of variations based on platform, OS, + // architecture and version, it is difficult to test for exact values. Test + // instead that the same keys exist in the meta data and also that the type of + // all the keys is a string. The incoming |expected| value should already be + // filled with the expected keys. + base::Value* chrome_metadata = actual_policies->FindKeyOfType( + "chromeMetadata", base::Value::Type::DICTIONARY); + EXPECT_NE(chrome_metadata, nullptr); + + base::DictionaryValue* chrome_metadata_dict = nullptr; + EXPECT_TRUE(chrome_metadata->GetAsDictionary(&chrome_metadata_dict)); + + // The |chrome_metadata| we compare against will have the actual values so + // those will be cleared to empty values so that the equals comparison below + // will just compare key existence and value types. + for (auto& key_value : *chrome_metadata_dict) + *(key_value.second) = base::Value(key_value.second->type()); + // Check that this dictionary is the same as expected. EXPECT_EQ(expected, *actual_policies); } @@ -353,6 +384,8 @@ policy::PolicyMap values; base::DictionaryValue expected_values; + SetChromeMetaData(&expected_values); + base::ListValue popups_blocked_for_urls; popups_blocked_for_urls.AppendString("aaa"); popups_blocked_for_urls.AppendString("bbb"); @@ -441,15 +474,14 @@ // Expect that the policy table contains all known policies in alphabetical // order and none of the policies have a set value. - std::vector<std::vector<std::string> > expected_policies; + std::vector<std::vector<std::string>> expected_policies; policy::Schema chrome_schema = policy::Schema::Wrap(policy::GetChromeSchemaData()); ASSERT_TRUE(chrome_schema.valid()); for (policy::Schema::Iterator it = chrome_schema.GetPropertiesIterator(); !it.IsAtEnd(); it.Advance()) { - expected_policies.push_back( - PopulateExpectedPolicy( - it.key(), std::string(), std::string(), nullptr, false)); + expected_policies.push_back(PopulateExpectedPolicy( + it.key(), std::string(), std::string(), nullptr, false)); } // Retrieve the contents of the policy table from the UI and verify that it @@ -504,7 +536,7 @@ // * All known policies whose value has been set, in alphabetical order. // * The unknown policy. // * All known policies whose value has not been set, in alphabetical order. - std::vector<std::vector<std::string> > expected_policies; + std::vector<std::vector<std::string>> expected_policies; size_t first_unset_position = 0; policy::Schema chrome_schema = policy::Schema::Wrap(policy::GetChromeSchemaData()); @@ -519,17 +551,14 @@ it == expected_values.end() ? std::string() : "Cloud"; const policy::PolicyMap::Entry* metadata = values.Get(props.key()); expected_policies.insert( - metadata ? expected_policies.begin() + first_unset_position++ : - expected_policies.end(), + metadata ? expected_policies.begin() + first_unset_position++ + : expected_policies.end(), PopulateExpectedPolicy(props.key(), value, source, metadata, false)); } expected_policies.insert( expected_policies.begin() + first_unset_position++, - PopulateExpectedPolicy(kUnknownPolicy, - expected_values[kUnknownPolicy], - "Platform", - values.Get(kUnknownPolicy), - true)); + PopulateExpectedPolicy(kUnknownPolicy, expected_values[kUnknownPolicy], + "Platform", values.Get(kUnknownPolicy), true)); expected_policies.insert( expected_policies.begin() + first_unset_position++, PopulateExpectedPolicy(
diff --git a/chrome/browser/ui/webui/policy_ui_handler.cc b/chrome/browser/ui/webui/policy_ui_handler.cc index fe23bb6d..5dd5419 100644 --- a/chrome/browser/ui/webui/policy_ui_handler.cc +++ b/chrome/browser/ui/webui/policy_ui_handler.cc
@@ -18,6 +18,8 @@ #include "base/macros.h" #include "base/memory/weak_ptr.h" #include "base/strings/string16.h" +#include "base/strings/stringprintf.h" +#include "base/strings/utf_string_conversions.h" #include "base/task/post_task.h" #include "base/task/task_traits.h" #include "base/time/time.h" @@ -32,6 +34,8 @@ #include "chrome/browser/policy/schema_registry_service.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/ui/webui/localized_string.h" +#include "chrome/common/channel_info.h" +#include "chrome/grit/chromium_strings.h" #include "components/policy/core/browser/browser_policy_connector.h" #include "components/policy/core/browser/cloud/message_util.h" #include "components/policy/core/browser/configuration_policy_handler_list.h" @@ -54,6 +58,7 @@ #include "components/policy/policy_constants.h" #include "components/policy/proto/device_management_backend.pb.h" #include "components/strings/grit/components_strings.h" +#include "components/version_info/version_info.h" #include "content/public/browser/web_contents.h" #include "extensions/buildflags/buildflags.h" #include "google_apis/gaia/gaia_auth_util.h" @@ -61,6 +66,10 @@ #include "ui/base/l10n/time_format.h" #include "ui/shell_dialogs/select_file_policy.h" +#if defined(OS_ANDROID) +#include "chrome/browser/ui/android/android_about_app_info.h" +#endif + #if defined(OS_CHROMEOS) #include "chrome/browser/browser_process_platform_part.h" #include "chrome/browser/chromeos/policy/active_directory_policy_manager.h" @@ -69,11 +78,16 @@ #include "chrome/browser/chromeos/policy/device_local_account_policy_service.h" #include "chrome/browser/chromeos/policy/user_cloud_policy_manager_chromeos.h" #include "chrome/browser/chromeos/profiles/profile_helper.h" +#include "chromeos/dbus/util/version_loader.h" #include "components/user_manager/user_manager.h" #else #include "components/policy/core/common/cloud/user_cloud_policy_manager.h" #endif +#if defined(OS_WIN) +#include "chrome/browser/ui/webui/version_util_win.h" +#endif + #if BUILDFLAG(ENABLE_EXTENSIONS) #include "extensions/browser/extension_registry.h" #include "extensions/common/extension.h" @@ -145,12 +159,12 @@ if (policy && policy->has_gaia_id()) dict->SetString("gaiaId", policy->gaia_id()); - base::TimeDelta refresh_interval = - base::TimeDelta::FromMilliseconds(refresh_scheduler ? - refresh_scheduler->GetActualRefreshDelay() : - policy::CloudPolicyRefreshScheduler::kDefaultRefreshDelayMs); - base::Time last_refresh_time = refresh_scheduler ? - refresh_scheduler->last_refresh() : base::Time(); + base::TimeDelta refresh_interval = base::TimeDelta::FromMilliseconds( + refresh_scheduler + ? refresh_scheduler->GetActualRefreshDelay() + : policy::CloudPolicyRefreshScheduler::kDefaultRefreshDelayMs); + base::Time last_refresh_time = + refresh_scheduler ? refresh_scheduler->last_refresh() : base::Time(); bool no_error = store->status() == policy::CloudPolicyStore::STATUS_OK && client && client->status() == policy::DM_STATUS_SUCCESS; @@ -160,16 +174,17 @@ dict->SetString("status", status); dict->SetString("clientId", client_id); dict->SetString("username", username); - dict->SetString("refreshInterval", - ui::TimeFormat::Simple(ui::TimeFormat::FORMAT_DURATION, - ui::TimeFormat::LENGTH_SHORT, - refresh_interval)); - dict->SetString("timeSinceLastRefresh", last_refresh_time.is_null() ? - l10n_util::GetStringUTF16(IDS_POLICY_NEVER_FETCHED) : - ui::TimeFormat::Simple(ui::TimeFormat::FORMAT_ELAPSED, - ui::TimeFormat::LENGTH_SHORT, - base::Time::NowFromSystemTime() - - last_refresh_time)); + dict->SetString( + "refreshInterval", + ui::TimeFormat::Simple(ui::TimeFormat::FORMAT_DURATION, + ui::TimeFormat::LENGTH_SHORT, refresh_interval)); + dict->SetString( + "timeSinceLastRefresh", + last_refresh_time.is_null() + ? l10n_util::GetStringUTF16(IDS_POLICY_NEVER_FETCHED) + : ui::TimeFormat::Simple( + ui::TimeFormat::FORMAT_ELAPSED, ui::TimeFormat::LENGTH_SHORT, + base::Time::NowFromSystemTime() - last_refresh_time)); } #if defined(OS_CHROMEOS) @@ -407,7 +422,8 @@ } CloudPolicyCoreStatusProvider::CloudPolicyCoreStatusProvider( - policy::CloudPolicyCore* core) : core_(core) { + policy::CloudPolicyCore* core) + : core_(core) { core_->store()->AddObserver(this); // TODO(bartfab): Add an observer that watches for client errors. Observing // core_->client() directly is not safe as the client may be destroyed and @@ -551,8 +567,7 @@ DeviceLocalAccountPolicyStatusProvider::DeviceLocalAccountPolicyStatusProvider( const std::string& user_id, policy::DeviceLocalAccountPolicyService* service) - : user_id_(user_id), - service_(service) { + : user_id_(user_id), service_(service) { service_->AddObserver(this); } @@ -664,9 +679,7 @@ #endif // defined(OS_CHROMEOS) -PolicyUIHandler::PolicyUIHandler() - : weak_factory_(this) { -} +PolicyUIHandler::PolicyUIHandler() : weak_factory_(this) {} PolicyUIHandler::~PolicyUIHandler() { GetPolicyService()->RemoveObserver(policy::POLICY_DOMAIN_CHROME, this); @@ -684,7 +697,7 @@ } void PolicyUIHandler::AddCommonLocalizedStringsToSource( - content::WebUIDataSource* source) { + content::WebUIDataSource* source) { AddLocalizedStringsBulk(source, policy::kPolicySources, policy::POLICY_SOURCE_COUNT); @@ -871,7 +884,7 @@ extensions::ExtensionRegistry::Get(profile)->enabled_extensions()) { // Skip this extension if it's not an enterprise extension. if (!extension->manifest()->HasPath( - extensions::manifest_keys::kStorageManagedSchema)) + extensions::manifest_keys::kStorageManagedSchema)) continue; auto extension_value = std::make_unique<base::DictionaryValue>(); extension_value->SetString("name", extension->name()); @@ -1002,10 +1015,61 @@ void PolicyUIHandler::WritePoliciesToJSONFile( const base::FilePath& path) const { - std::string json_policies = policy::GetAllPolicyValuesAsJSON( + constexpr bool is_pretty_print = true; + base::Value dict = policy::GetAllPolicyValuesAsDictionary( web_ui()->GetWebContents()->GetBrowserContext(), - true /* with_user_policies */, false /* with_device_data */, - true /* is_pretty_print */); + true /* with_user_policies */, false /* convert_values */, + false /* with_device_data */, is_pretty_print); + + base::Value chrome_metadata(base::Value::Type::DICTIONARY); + + chrome_metadata.SetKey( + "application", base::Value(l10n_util::GetStringUTF8(IDS_PRODUCT_NAME))); + std::string cohort_name; +#if defined(OS_WIN) + base::string16 cohort_version_info = + version_utils::win::GetCohortVersionInfo(); + if (!cohort_version_info.empty()) { + cohort_name = base::StringPrintf( + " %s", base::UTF16ToUTF8(cohort_version_info).c_str()); + } +#endif + std::string channel_name = chrome::GetChannelName(); + std::string version = base::StringPrintf( + "%s (%s)%s %s%s", version_info::GetVersionNumber().c_str(), + l10n_util::GetStringUTF8(version_info::IsOfficialBuild() + ? IDS_VERSION_UI_OFFICIAL + : IDS_VERSION_UI_UNOFFICIAL) + .c_str(), + (channel_name.empty() ? "" : " " + channel_name).c_str(), + l10n_util::GetStringUTF8(sizeof(void*) == 8 ? IDS_VERSION_UI_64BIT + : IDS_VERSION_UI_32BIT) + .c_str(), + cohort_name.c_str()); + chrome_metadata.SetKey("version", base::Value(version)); + +#if defined(OS_CHROMEOS) + chrome_metadata.SetKey("platform", + base::Value(chromeos::version_loader::GetVersion( + chromeos::version_loader::VERSION_FULL))); +#else + std::string os = version_info::GetOSType(); +#if defined(OS_WIN) + os += " " + version_utils::win::GetFullWindowsVersion(); +#elif defined(OS_ANDROID) + os += " " + AndroidAboutAppInfo::GetOsInfo(); +#endif + chrome_metadata.SetKey("OS", base::Value(os)); +#endif + chrome_metadata.SetKey("revision", + base::Value(version_info::GetLastChange())); + + dict.SetKey("chromeMetadata", std::move(chrome_metadata)); + + std::string json_policies; + base::JSONWriter::WriteWithOptions( + dict, (is_pretty_print ? base::JSONWriter::OPTIONS_PRETTY_PRINT : 0), + &json_policies); base::PostTaskWithTraits( FROM_HERE,
diff --git a/chrome/browser/ui/webui/settings/settings_localized_strings_provider.cc b/chrome/browser/ui/webui/settings/settings_localized_strings_provider.cc index 7f23e92..1cf1aab 100644 --- a/chrome/browser/ui/webui/settings/settings_localized_strings_provider.cc +++ b/chrome/browser/ui/webui/settings/settings_localized_strings_provider.cc
@@ -63,7 +63,6 @@ #if defined(OS_CHROMEOS) #include "ash/public/cpp/ash_switches.h" #include "ash/public/interfaces/voice_interaction_controller.mojom.h" -#include "base/strings/strcat.h" #include "base/system/sys_info.h" #include "chrome/browser/chromeos/account_manager/account_manager_util.h" #include "chrome/browser/chromeos/arc/arc_util.h" @@ -640,6 +639,7 @@ {"personalizationPageTitle", IDS_OS_SETTINGS_PERSONALIZATION}, {"openWallpaperApp", IDS_OS_SETTINGS_OPEN_WALLPAPER_APP}, {"setWallpaper", IDS_OS_SETTINGS_SET_WALLPAPER}, + {"osLanguagesPageTitle", IDS_OS_SETTINGS_LANGUAGES_AND_INPUT_PAGE_TITLE}, #endif #if defined(OS_LINUX) && !defined(OS_CHROMEOS) {"showWindowDecorations", IDS_SHOW_WINDOW_DECORATIONS}, @@ -1417,7 +1417,6 @@ void AddLanguagesStrings(content::WebUIDataSource* html_source) { static constexpr LocalizedString kLocalizedStrings[] = { - {"languagesPageTitle", IDS_SETTINGS_LANGUAGES_PAGE_TITLE}, {"languagesListTitle", IDS_SETTINGS_LANGUAGES_LANGUAGES_LIST_TITLE}, {"searchLanguages", IDS_SETTINGS_LANGUAGE_SEARCH}, {"languagesExpandA11yLabel", @@ -1490,6 +1489,17 @@ html_source->AddString( "languagesLearnMoreURL", base::ASCIIToUTF16(chrome::kLanguageSettingsLearnMoreUrl)); + // TODO(hsuregan): Remove once OS Browser split settings is complete. + html_source->AddString( + "languagesPageTitle", + l10n_util::GetStringUTF16( + base::FeatureList::IsEnabled(chromeos::features::kSplitSettings) + ? IDS_SETTINGS_LANGUAGES_PAGE_TITLE + : IDS_OS_SETTINGS_LANGUAGES_AND_INPUT_PAGE_TITLE)); +#else + html_source->AddString( + "languagesPageTitle", + l10n_util::GetStringUTF16(IDS_SETTINGS_LANGUAGES_PAGE_TITLE)); #endif } @@ -2298,9 +2308,7 @@ #endif {"searchEnginesManage", IDS_SETTINGS_SEARCH_MANAGE_SEARCH_ENGINES}, #if defined(OS_CHROMEOS) - {"osSearchPageTitle", is_assistant_allowed - ? IDS_SETTINGS_SEARCH_AND_ASSISTANT - : IDS_SETTINGS_SEARCH}, + {"osAssistantPageTitle", IDS_OS_SETTINGS_ASSISTANT}, {"searchGoogleAssistant", IDS_SETTINGS_SEARCH_GOOGLE_ASSISTANT}, {"searchGoogleAssistantEnabled", IDS_SETTINGS_SEARCH_GOOGLE_ASSISTANT_ENABLED}, @@ -2315,12 +2323,6 @@ base::ASCIIToUTF16(chrome::kOmniboxLearnMoreURL)); html_source->AddString("searchExplanation", search_explanation_text); #if defined(OS_CHROMEOS) - std::string settings_search_url = - base::StrCat({chrome::kChromeUISettingsURL, chrome::kSearchSubPage}); - html_source->AddString( - "osSearchEngineLabel", - l10n_util::GetStringFUTF16(IDS_OS_SETTINGS_SEARCH_ENGINE_LABEL, - base::ASCIIToUTF16(settings_search_url))); html_source->AddBoolean("isAssistantAllowed", is_assistant_allowed); #endif }
diff --git a/chrome/browser/ui/webui/signin/dice_turn_sync_on_helper_unittest.cc b/chrome/browser/ui/webui/signin/dice_turn_sync_on_helper_unittest.cc index 6450d64..b6aa3286 100644 --- a/chrome/browser/ui/webui/signin/dice_turn_sync_on_helper_unittest.cc +++ b/chrome/browser/ui/webui/signin/dice_turn_sync_on_helper_unittest.cc
@@ -4,6 +4,8 @@ #include "chrome/browser/ui/webui/signin/dice_turn_sync_on_helper.h" +#include <utility> + #include "base/bind.h" #include "base/callback.h" #include "base/files/file_path.h" @@ -107,12 +109,13 @@ return BuildTestingProfile(file_path, /*delegate=*/nullptr).release(); } - Profile* CreateProfileAsyncHelper(const base::FilePath& path, - Delegate* delegate) override { + std::unique_ptr<Profile> CreateProfileAsyncHelper( + const base::FilePath& path, + Delegate* delegate) override { base::ThreadTaskRunnerHandle::Get()->PostTask( FROM_HERE, base::BindOnce(base::IgnoreResult(&base::CreateDirectory), path)); - return BuildTestingProfile(path, this).release(); + return BuildTestingProfile(path, this); } };
diff --git a/chrome/browser/ui/webui/signin/sync_confirmation_handler.cc b/chrome/browser/ui/webui/signin/sync_confirmation_handler.cc index e1d569f..2c2978c 100644 --- a/chrome/browser/ui/webui/signin/sync_confirmation_handler.cc +++ b/chrome/browser/ui/webui/signin/sync_confirmation_handler.cc
@@ -11,6 +11,7 @@ #include "base/metrics/user_metrics.h" #include "base/threading/thread_task_runner_handle.h" #include "chrome/browser/consent_auditor/consent_auditor_factory.h" +#include "chrome/browser/profiles/profile.h" #include "chrome/browser/profiles/profile_avatar_icon_util.h" #include "chrome/browser/signin/identity_manager_factory.h" #include "chrome/browser/ui/browser_list.h" @@ -90,6 +91,7 @@ } void SyncConfirmationHandler::HandleGoToSettings(const base::ListValue* args) { + DCHECK(profile_->IsSyncAllowed()); did_user_explicitly_interact = true; RecordConsent(args); CloseModalSigninWindow(LoginUIService::CONFIGURE_SYNC_FIRST); @@ -102,6 +104,7 @@ void SyncConfirmationHandler::HandleAccountImageRequest( const base::ListValue* args) { + DCHECK(profile_->IsSyncAllowed()); base::Optional<AccountInfo> primary_account_info = identity_manager_->FindExtendedAccountInfoForAccount( identity_manager_->GetPrimaryAccountInfo()); @@ -165,6 +168,12 @@ } void SyncConfirmationHandler::SetUserImageURL(const std::string& picture_url) { + if (!profile_->IsSyncAllowed()) { + // The sync disabled confirmation handler does not present the user image. + // Avoid updating the image URL in this case. + return; + } + std::string picture_url_to_load; GURL picture_gurl(picture_url); if (picture_gurl.is_valid()) { @@ -179,12 +188,7 @@ base::Value picture_url_value(picture_url_to_load); AllowJavascript(); - if (unified_consent::IsUnifiedConsentFeatureEnabled()) { - FireWebUIListener("account-image-changed", picture_url_value); - } else { - CallJavascriptFunction("sync.confirmation.setUserImageURL", - picture_url_value); - } + FireWebUIListener("account-image-changed", picture_url_value); } void SyncConfirmationHandler::OnExtendedAccountInfoUpdated(
diff --git a/chrome/browser/ui/webui/signin/sync_confirmation_handler_unittest.cc b/chrome/browser/ui/webui/signin/sync_confirmation_handler_unittest.cc index 4e4a3a9..e3d4c495 100644 --- a/chrome/browser/ui/webui/signin/sync_confirmation_handler_unittest.cc +++ b/chrome/browser/ui/webui/signin/sync_confirmation_handler_unittest.cc
@@ -210,62 +210,12 @@ DISALLOW_COPY_AND_ASSIGN(SyncConfirmationHandlerTest); }; -class SyncConfirmationHandlerTest_UnifiedConsentDisabled - : public SyncConfirmationHandlerTest { - public: - SyncConfirmationHandlerTest_UnifiedConsentDisabled() - : scoped_unified_consent_( - unified_consent::UnifiedConsentFeatureState::kDisabled) {} - - private: - unified_consent::ScopedUnifiedConsent scoped_unified_consent_; - - DISALLOW_COPY_AND_ASSIGN(SyncConfirmationHandlerTest_UnifiedConsentDisabled); -}; - const char SyncConfirmationHandlerTest::kConsentText1[] = "consentText1"; const char SyncConfirmationHandlerTest::kConsentText2[] = "consentText2"; const char SyncConfirmationHandlerTest::kConsentText3[] = "consentText3"; const char SyncConfirmationHandlerTest::kConsentText4[] = "consentText4"; const char SyncConfirmationHandlerTest::kConsentText5[] = "consentText5"; -TEST_F(SyncConfirmationHandlerTest_UnifiedConsentDisabled, - TestSetImageIfPrimaryAccountReady) { - identity_test_env()->SimulateSuccessfulFetchOfAccountInfo( - account_info_.account_id, account_info_.email, account_info_.gaia, "", - "full_name", "given_name", "locale", - "http://picture.example.com/picture.jpg"); - - base::ListValue args; - args.Set(0, std::make_unique<base::Value>(kDefaultDialogHeight)); - handler()->HandleInitializedWithSize(&args); - EXPECT_EQ(2U, web_ui()->call_data().size()); - - // When the primary account is ready, setUserImageURL happens before - // clearFocus since the image URL is known before showing the dialog. - EXPECT_EQ("sync.confirmation.setUserImageURL", - web_ui()->call_data()[0]->function_name()); - EXPECT_TRUE(web_ui()->call_data()[0]->arg1()->is_string()); - std::string passed_picture_url; - EXPECT_TRUE( - web_ui()->call_data()[0]->arg1()->GetAsString(&passed_picture_url)); - - EXPECT_EQ("sync.confirmation.clearFocus", - web_ui()->call_data()[1]->function_name()); - - identity::IdentityManager* identity_manager = - IdentityManagerFactory::GetForProfile(profile()); - base::Optional<AccountInfo> primary_account_info = - identity_manager->FindExtendedAccountInfoForAccount( - identity_manager->GetPrimaryAccountInfo()); - std::string original_picture_url = - primary_account_info ? primary_account_info->picture_url : std::string(); - GURL picture_url_with_size = signin::GetAvatarImageURLWithOptions( - GURL(original_picture_url), kExpectedProfileImageSize, - false /* no_silhouette */); - EXPECT_EQ(picture_url_with_size.spec(), passed_picture_url); -} - TEST_F(SyncConfirmationHandlerTest, TestSetImageIfPrimaryAccountReady) { identity_test_env()->SimulateSuccessfulFetchOfAccountInfo( account_info_.account_id, account_info_.email, account_info_.gaia, "", @@ -281,55 +231,6 @@ web_ui()->call_data()[1]->function_name()); } -TEST_F(SyncConfirmationHandlerTest_UnifiedConsentDisabled, - TestSetImageIfPrimaryAccountReadyLater) { - base::ListValue args; - args.Set(0, std::make_unique<base::Value>(kDefaultDialogHeight)); - handler()->HandleInitializedWithSize(&args); - EXPECT_EQ(2U, web_ui()->call_data().size()); - - identity_test_env()->SimulateSuccessfulFetchOfAccountInfo( - account_info_.account_id, account_info_.email, account_info_.gaia, "", - "full_name", "given_name", "locale", - "http://picture.example.com/picture.jpg"); - - EXPECT_EQ(3U, web_ui()->call_data().size()); - - // When the primary account isn't yet ready when the dialog is shown, - // setUserImageURL is called with the default placeholder image. - EXPECT_EQ("sync.confirmation.setUserImageURL", - web_ui()->call_data()[0]->function_name()); - EXPECT_TRUE(web_ui()->call_data()[0]->arg1()->is_string()); - std::string passed_picture_url; - EXPECT_TRUE( - web_ui()->call_data()[0]->arg1()->GetAsString(&passed_picture_url)); - EXPECT_EQ(profiles::GetPlaceholderAvatarIconUrl(), passed_picture_url); - - // When the primary account isn't yet ready when the dialog is shown, - // clearFocus is called before the second call to setUserImageURL. - EXPECT_EQ("sync.confirmation.clearFocus", - web_ui()->call_data()[1]->function_name()); - - EXPECT_EQ("sync.confirmation.setUserImageURL", - web_ui()->call_data()[2]->function_name()); - EXPECT_TRUE(web_ui()->call_data()[2]->arg1()->is_string()); - EXPECT_TRUE( - web_ui()->call_data()[2]->arg1()->GetAsString(&passed_picture_url)); - - identity::IdentityManager* identity_manager = - IdentityManagerFactory::GetForProfile(profile()); - base::Optional<AccountInfo> primary_account_info = - identity_manager->FindExtendedAccountInfoForAccount( - identity_manager->GetPrimaryAccountInfo()); - - std::string original_picture_url = - primary_account_info ? primary_account_info->picture_url : std::string(); - GURL picture_url_with_size = signin::GetAvatarImageURLWithOptions( - GURL(original_picture_url), kExpectedProfileImageSize, - false /* no_silhouette */); - EXPECT_EQ(picture_url_with_size.spec(), passed_picture_url); -} - TEST_F(SyncConfirmationHandlerTest, TestSetImageIfPrimaryAccountReadyLater) { base::ListValue args; args.Set(0, std::make_unique<base::Value>(kDefaultDialogHeight)); @@ -349,36 +250,6 @@ ExpectAccountImageChanged(*web_ui()->call_data()[2]); } -TEST_F(SyncConfirmationHandlerTest_UnifiedConsentDisabled, - TestSetImageIgnoredIfSecondaryAccountUpdated) { - base::ListValue args; - args.Set(0, std::make_unique<base::Value>(kDefaultDialogHeight)); - handler()->HandleInitializedWithSize(&args); - EXPECT_EQ(2U, web_ui()->call_data().size()); - - AccountInfo account_info = - identity_test_env()->MakeAccountAvailable("bar@example.com"); - identity_test_env()->SimulateSuccessfulFetchOfAccountInfo( - account_info.account_id, account_info.email, account_info.gaia, "", - "bar_full_name", "bar_given_name", "bar_locale", - "http://picture.example.com/bar_picture.jpg"); - - // Updating the account info of a secondary account should not update the - // image of the sync confirmation dialog. - EXPECT_EQ(2U, web_ui()->call_data().size()); - - identity_test_env()->SimulateSuccessfulFetchOfAccountInfo( - account_info_.account_id, account_info_.email, account_info_.gaia, "", - "full_name", "given_name", "locale", - "http://picture.example.com/picture.jpg"); - - // Updating the account info of the primary account should update the - // image of the sync confirmation dialog. - EXPECT_EQ(3U, web_ui()->call_data().size()); - EXPECT_EQ("sync.confirmation.setUserImageURL", - web_ui()->call_data()[2]->function_name()); -} - TEST_F(SyncConfirmationHandlerTest, TestSetImageIgnoredIfSecondaryAccountUpdated) { base::ListValue args;
diff --git a/chrome/browser/ui/webui/signin/sync_confirmation_ui.cc b/chrome/browser/ui/webui/signin/sync_confirmation_ui.cc index 81e3ec8..31705c9 100644 --- a/chrome/browser/ui/webui/signin/sync_confirmation_ui.cc +++ b/chrome/browser/ui/webui/signin/sync_confirmation_ui.cc
@@ -29,10 +29,9 @@ SyncConfirmationUI::SyncConfirmationUI(content::WebUI* web_ui) : SigninWebDialogUI(web_ui), consent_feature_(consent_auditor::Feature::CHROME_SYNC) { + DCHECK(unified_consent::IsUnifiedConsentFeatureEnabled()); Profile* profile = Profile::FromWebUI(web_ui); bool is_sync_allowed = profile->IsSyncAllowed(); - bool is_unified_consent_enabled = - unified_consent::IsUnifiedConsentFeatureEnabled(); content::WebUIDataSource* source = content::WebUIDataSource::Create(chrome::kChromeUISyncConfirmationHost); @@ -42,7 +41,7 @@ int title_ids = -1; int confirm_button_ids = -1; int undo_button_ids = -1; - if (is_unified_consent_enabled && is_sync_allowed) { + if (is_sync_allowed) { source->SetDefaultResource(IDR_DICE_SYNC_CONFIRMATION_HTML); source->AddResourcePath("sync_confirmation_browser_proxy.html", IDR_DICE_SYNC_CONFIRMATION_BROWSER_PROXY_HTML); @@ -90,33 +89,13 @@ } else { source->SetDefaultResource(IDR_SYNC_CONFIRMATION_HTML); source->AddResourcePath("sync_confirmation.js", IDR_SYNC_CONFIRMATION_JS); - - source->AddBoolean("isSyncAllowed", is_sync_allowed); - - AddStringResource(source, "syncConfirmationChromeSyncTitle", - IDS_SYNC_CONFIRMATION_CHROME_SYNC_TITLE); - AddStringResource(source, "syncConfirmationChromeSyncBody", - IDS_SYNC_CONFIRMATION_CHROME_SYNC_MESSAGE); - AddStringResource(source, "syncConfirmationPersonalizeServicesTitle", - IDS_SYNC_CONFIRMATION_PERSONALIZE_SERVICES_TITLE); - AddStringResource(source, "syncConfirmationPersonalizeServicesBody", - IDS_SYNC_CONFIRMATION_PERSONALIZE_SERVICES_BODY); - AddStringResource(source, "syncConfirmationSyncSettingsLinkBody", - IDS_SYNC_CONFIRMATION_SYNC_SETTINGS_LINK_BODY); AddStringResource(source, "syncDisabledConfirmationDetails", IDS_SYNC_DISABLED_CONFIRMATION_DETAILS); - title_ids = AccountConsistencyModeManager::IsDiceEnabledForProfile(profile) - ? IDS_SYNC_CONFIRMATION_DICE_TITLE - : IDS_SYNC_CONFIRMATION_TITLE; - confirm_button_ids = IDS_SETTINGS_TURN_ON; - undo_button_ids = IDS_CANCEL; + title_ids = IDS_SYNC_DISABLED_CONFIRMATION_CHROME_SYNC_TITLE; + confirm_button_ids = IDS_SYNC_DISABLED_CONFIRMATION_CONFIRM_BUTTON_LABEL; + undo_button_ids = IDS_SYNC_DISABLED_CONFIRMATION_UNDO_BUTTON_LABEL; consent_feature_ = consent_auditor::Feature::CHROME_SYNC; - if (!is_sync_allowed) { - title_ids = IDS_SYNC_DISABLED_CONFIRMATION_CHROME_SYNC_TITLE; - confirm_button_ids = IDS_SYNC_DISABLED_CONFIRMATION_CONFIRM_BUTTON_LABEL; - undo_button_ids = IDS_SYNC_DISABLED_CONFIRMATION_UNDO_BUTTON_LABEL; - } } DCHECK_GE(title_ids, 0);
diff --git a/chrome/browser/ui/webui/version_handler_win.cc b/chrome/browser/ui/webui/version_handler_win.cc index 7f43123..c225e81 100644 --- a/chrome/browser/ui/webui/version_handler_win.cc +++ b/chrome/browser/ui/webui/version_handler_win.cc
@@ -8,74 +8,9 @@ #include "base/strings/stringprintf.h" #include "base/task/post_task.h" #include "base/win/windows_version.h" +#include "chrome/browser/ui/webui/version_util_win.h" #include "content/public/browser/web_ui.h" -namespace { - -// Return the marketing version of Windows OS, this may return an empty string -// if values returned by base::win::OSinfo are not defined below. -std::string FullWindowsVersion() { - std::string version; - base::win::OSInfo* gi = base::win::OSInfo::GetInstance(); - const int major = gi->version_number().major; - const int minor = gi->version_number().minor; - const int build = gi->version_number().build; - const int patch = gi->version_number().patch; - // Server or Desktop - const bool server = - gi->version_type() == base::win::VersionType::SUITE_SERVER; - // Service Pack - const std::string sp = gi->service_pack_str(); - - if (major == 10) { - version += (server) ? "Server OS" : "10 OS"; - } else if (major == 6) { - switch (minor) { - case 0: - // Windows Vista or Server 2008 - version += (server) ? "Server 2008 " : "Vista "; - version += sp; - break; - case 1: - // Windows 7 or Server 2008 R2 - version += (server) ? "Server 2008 R2 " : "7 "; - version += sp; - break; - case 2: - // Windows 8 or Server 2012 - version += (server) ? "Server 2012" : "8"; - break; - case 3: - // Windows 8.1 or Server 2012 R2 - version += (server) ? "Server 2012 R2" : "8.1"; - break; - default: - // unknown version - return base::StringPrintf("unknown version 6.%d", minor); - } - } else if ((major == 5) && (minor > 0)) { - // Windows XP or Server 2003 - version += (server) ? "Server 2003 " : "XP "; - version += sp; - } else { - // unknown version - return base::StringPrintf("unknown version %d.%d", major, minor); - } - - const std::string release_id = gi->release_id(); - - if (!release_id.empty()) - version += " Version " + release_id; - - if (patch > 0) - version += base::StringPrintf(" (Build %d.%d)", build, patch); - else - version += base::StringPrintf(" (Build %d)", build); - return version; -} - -} // namespace - VersionHandlerWindows::VersionHandlerWindows() : weak_factory_(this) {} VersionHandlerWindows::~VersionHandlerWindows() {} @@ -85,7 +20,7 @@ // Start the asynchronous load of the versions. base::PostTaskWithTraitsAndReplyWithResult( FROM_HERE, {base::MayBlock(), base::TaskPriority::BEST_EFFORT}, - base::BindOnce(&FullWindowsVersion), + base::BindOnce(&version_utils::win::GetFullWindowsVersion), base::BindOnce(&VersionHandlerWindows::OnVersion, weak_factory_.GetWeakPtr())); @@ -100,5 +35,5 @@ // static std::string VersionHandlerWindows::GetFullWindowsVersionForTesting() { - return FullWindowsVersion(); + return version_utils::win::GetFullWindowsVersion(); }
diff --git a/chrome/browser/ui/webui/version_ui.cc b/chrome/browser/ui/webui/version_ui.cc index 69b6cce2..54949a1e 100644 --- a/chrome/browser/ui/webui/version_ui.cc +++ b/chrome/browser/ui/webui/version_ui.cc
@@ -13,6 +13,7 @@ #include "chrome/browser/chrome_content_browser_client.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/ui/webui/version_handler.h" +#include "chrome/browser/ui/webui/version_util_win.h" #include "chrome/common/channel_info.h" #include "chrome/common/url_constants.h" #include "chrome/grit/chromium_strings.h" @@ -40,7 +41,6 @@ #if defined(OS_WIN) #include "chrome/browser/ui/webui/version_handler_win.h" -#include "chrome/install_static/install_details.h" #endif using content::WebUIDataSource; @@ -138,15 +138,8 @@ #endif #if defined(OS_WIN) - base::string16 update_cohort_name = - install_static::InstallDetails::Get().update_cohort_name(); - if (!update_cohort_name.empty()) { - html_source->AddString(version_ui::kUpdateCohortName, - l10n_util::GetStringFUTF16( - IDS_VERSION_UI_COHORT_NAME, update_cohort_name)); - } else { - html_source->AddString(version_ui::kUpdateCohortName, std::string()); - } + html_source->AddString(version_ui::kUpdateCohortName, + version_utils::win::GetCohortVersionInfo()); #endif // defined(OS_WIN) html_source->AddString(version_ui::kSanitizer, version_info::GetSanitizerList());
diff --git a/chrome/browser/ui/webui/version_util_win.cc b/chrome/browser/ui/webui/version_util_win.cc new file mode 100644 index 0000000..aeca2374 --- /dev/null +++ b/chrome/browser/ui/webui/version_util_win.cc
@@ -0,0 +1,88 @@ +// 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 "chrome/browser/ui/webui/version_util_win.h" + +#include "base/strings/stringprintf.h" +#include "base/win/windows_version.h" +#include "chrome/install_static/install_details.h" +#include "components/strings/grit/components_strings.h" +#include "ui/base/l10n/l10n_util.h" + +namespace version_utils { +namespace win { + +std::string GetFullWindowsVersion() { + std::string version; + base::win::OSInfo* gi = base::win::OSInfo::GetInstance(); + const int major = gi->version_number().major; + const int minor = gi->version_number().minor; + const int build = gi->version_number().build; + const int patch = gi->version_number().patch; + // Server or Desktop + const bool server = + gi->version_type() == base::win::VersionType::SUITE_SERVER; + // Service Pack + const std::string sp = gi->service_pack_str(); + + if (major == 10) { + version += (server) ? "Server OS" : "10 OS"; + } else if (major == 6) { + switch (minor) { + case 0: + // Windows Vista or Server 2008 + version += (server) ? "Server 2008 " : "Vista "; + version += sp; + break; + case 1: + // Windows 7 or Server 2008 R2 + version += (server) ? "Server 2008 R2 " : "7 "; + version += sp; + break; + case 2: + // Windows 8 or Server 2012 + version += (server) ? "Server 2012" : "8"; + break; + case 3: + // Windows 8.1 or Server 2012 R2 + version += (server) ? "Server 2012 R2" : "8.1"; + break; + default: + // unknown version + return base::StringPrintf("unknown version 6.%d", minor); + } + } else if ((major == 5) && (minor > 0)) { + // Windows XP or Server 2003 + version += (server) ? "Server 2003 " : "XP "; + version += sp; + } else { + // unknown version + return base::StringPrintf("unknown version %d.%d", major, minor); + } + + const std::string release_id = gi->release_id(); + + if (!release_id.empty()) + version += " Version " + release_id; + + if (patch > 0) + version += base::StringPrintf(" (Build %d.%d)", build, patch); + else + version += base::StringPrintf(" (Build %d)", build); + return version; +} + +base::string16 GetCohortVersionInfo() { + base::string16 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); + } + + return base::string16(); +} + +} // namespace win +} // namespace version_utils
diff --git a/chrome/browser/ui/webui/version_util_win.h b/chrome/browser/ui/webui/version_util_win.h new file mode 100644 index 0000000..d534732 --- /dev/null +++ b/chrome/browser/ui/webui/version_util_win.h
@@ -0,0 +1,27 @@ +// 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 CHROME_BROWSER_UI_WEBUI_VERSION_UTIL_WIN_H_ +#define CHROME_BROWSER_UI_WEBUI_VERSION_UTIL_WIN_H_ + +#include <string> + +#include "base/strings/string16.h" + +namespace version_utils { +namespace win { + +// Return the marketing version of Windows OS, this may return an empty string +// if values returned by base::win::OSinfo are not defined. +std::string GetFullWindowsVersion(); + +// Return a formatted version of the update cohort string +// IDS_VERSION_UI_COHORT_NAME filled with the update cohort of this Chromium +// install. +base::string16 GetCohortVersionInfo(); + +} // namespace win +} // namespace version_utils + +#endif // CHROME_BROWSER_UI_WEBUI_VERSION_UTIL_WIN_H_
diff --git a/chrome/chrome_cleaner/engines/broker/cleaner_sandbox_interface_unittest.cc b/chrome/chrome_cleaner/engines/broker/cleaner_sandbox_interface_unittest.cc index 5a54f00..b85b297 100644 --- a/chrome/chrome_cleaner/engines/broker/cleaner_sandbox_interface_unittest.cc +++ b/chrome/chrome_cleaner/engines/broker/cleaner_sandbox_interface_unittest.cc
@@ -17,12 +17,12 @@ #include "base/files/file_path.h" #include "base/files/file_util.h" #include "base/files/scoped_temp_dir.h" -#include "base/message_loop/message_loop.h" #include "base/path_service.h" #include "base/process/kill.h" #include "base/process/process.h" #include "base/strings/strcat.h" #include "base/strings/string16.h" +#include "base/test/scoped_task_environment.h" #include "base/test/test_reg_util_win.h" #include "base/test/test_timeouts.h" #include "chrome/chrome_cleaner/engines/common/registry_util.h" @@ -182,7 +182,7 @@ std::unique_ptr<chrome_cleaner::FileRemoverAPI> file_remover_; bool reboot_required_ = false; - base::MessageLoop message_loop_; + base::test::ScopedTaskEnvironment scoped_task_environment_; }; TEST_F(CleanerSandboxInterfaceDeleteFileTest, DeleteFile_BasicFile) {
diff --git a/chrome/chrome_cleaner/engines/controllers/engine_cleaner_unittest.cc b/chrome/chrome_cleaner/engines/controllers/engine_cleaner_unittest.cc index 2d3f86a7..83388cb8 100644 --- a/chrome/chrome_cleaner/engines/controllers/engine_cleaner_unittest.cc +++ b/chrome/chrome_cleaner/engines/controllers/engine_cleaner_unittest.cc
@@ -7,8 +7,8 @@ #include <utility> #include "base/bind.h" -#include "base/message_loop/message_loop.h" #include "base/run_loop.h" +#include "base/test/scoped_task_environment.h" #include "base/threading/sequenced_task_runner_handle.h" #include "chrome/chrome_cleaner/engines/broker/engine_client_mock.h" #include "chrome/chrome_cleaner/engines/common/engine_result_codes.h" @@ -94,7 +94,7 @@ TestPUPData test_pup_data_; std::unique_ptr<EngineCleaner> engine_cleaner_; - base::MessageLoop message_loop_; + base::test::ScopedTaskEnvironment scoped_task_environment_; ResultCode done_status_ = RESULT_CODE_INVALID; };
diff --git a/chrome/chrome_cleaner/engines/controllers/scanner_impl_unittest.cc b/chrome/chrome_cleaner/engines/controllers/scanner_impl_unittest.cc index 85682a533..92b8eaf 100644 --- a/chrome/chrome_cleaner/engines/controllers/scanner_impl_unittest.cc +++ b/chrome/chrome_cleaner/engines/controllers/scanner_impl_unittest.cc
@@ -11,8 +11,8 @@ #include "base/bind_helpers.h" #include "base/files/file_path.h" #include "base/files/scoped_temp_dir.h" -#include "base/message_loop/message_loop.h" #include "base/run_loop.h" +#include "base/test/scoped_task_environment.h" #include "base/threading/sequenced_task_runner_handle.h" #include "chrome/chrome_cleaner/engines/broker/engine_client_mock.h" #include "chrome/chrome_cleaner/engines/common/engine_result_codes.h" @@ -182,7 +182,7 @@ } TestPUPData test_pup_data_; - base::MessageLoop message_loop_; + base::test::ScopedTaskEnvironment scoped_task_environment_; scoped_refptr<StrictMockEngineClient> mock_engine_client_{ base::MakeRefCounted<StrictMockEngineClient>()};
diff --git a/chrome/chrome_cleaner/engines/controllers/uwe_scanner_wrapper_unittest.cc b/chrome/chrome_cleaner/engines/controllers/uwe_scanner_wrapper_unittest.cc index 79b8b2c..0b635cd 100644 --- a/chrome/chrome_cleaner/engines/controllers/uwe_scanner_wrapper_unittest.cc +++ b/chrome/chrome_cleaner/engines/controllers/uwe_scanner_wrapper_unittest.cc
@@ -12,8 +12,8 @@ #include "base/bind.h" #include "base/files/file_path.h" #include "base/files/scoped_temp_dir.h" -#include "base/message_loop/message_loop.h" #include "base/run_loop.h" +#include "base/test/scoped_task_environment.h" #include "base/threading/sequenced_task_runner_handle.h" #include "chrome/chrome_cleaner/chrome_utils/extension_id.h" #include "chrome/chrome_cleaner/constants/uws_id.h" @@ -210,7 +210,7 @@ UwEMatchers matchers_; TestPUPData test_pup_data_; - base::MessageLoop message_loop_; + base::test::ScopedTaskEnvironment scoped_task_environment_; scoped_refptr<StrictMockEngineClient> mock_engine_client_{ base::MakeRefCounted<StrictMockEngineClient>()};
diff --git a/chrome/chrome_cleaner/ipc/chrome_prompt_ipc_unittest.cc b/chrome/chrome_cleaner/ipc/chrome_prompt_ipc_unittest.cc index 583c7a0..ad3f1bd 100644 --- a/chrome/chrome_cleaner/ipc/chrome_prompt_ipc_unittest.cc +++ b/chrome/chrome_cleaner/ipc/chrome_prompt_ipc_unittest.cc
@@ -11,10 +11,10 @@ #include "base/bind.h" #include "base/bind_helpers.h" -#include "base/message_loop/message_loop.h" #include "base/run_loop.h" #include "base/strings/string_number_conversions.h" #include "base/strings/string_split.h" +#include "base/test/scoped_task_environment.h" #include "base/threading/sequenced_task_runner_handle.h" #include "chrome/chrome_cleaner/ipc/ipc_test_util.h" #include "chrome/chrome_cleaner/logging/scoped_logging.h" @@ -291,7 +291,7 @@ MULTIPROCESS_TEST_MAIN(ChromePromptIPCClientMain) { static constexpr int kInternalTestFailureExitCode = -1; - base::MessageLoop message_loop; + base::test::ScopedTaskEnvironment scoped_task_environment; scoped_refptr<MojoTaskRunner> mojo_task_runner = MojoTaskRunner::Create(); auto child_process =
diff --git a/chrome/chrome_cleaner/os/file_remover_unittest.cc b/chrome/chrome_cleaner/os/file_remover_unittest.cc index e67f46a..2d73202 100644 --- a/chrome/chrome_cleaner/os/file_remover_unittest.cc +++ b/chrome/chrome_cleaner/os/file_remover_unittest.cc
@@ -16,12 +16,12 @@ #include "base/files/file_util.h" #include "base/logging.h" #include "base/memory/scoped_refptr.h" -#include "base/message_loop/message_loop.h" #include "base/path_service.h" #include "base/strings/strcat.h" #include "base/strings/utf_string_conversions.h" #include "base/test/multiprocess_test.h" #include "base/test/scoped_path_override.h" +#include "base/test/scoped_task_environment.h" #include "chrome/chrome_cleaner/ipc/mojo_task_runner.h" #include "chrome/chrome_cleaner/logging/proto/removal_status.pb.h" #include "chrome/chrome_cleaner/os/disk_util.h" @@ -96,7 +96,7 @@ } FileRemover default_file_remover_; - base::MessageLoop message_loop_; + base::test::ScopedTaskEnvironment scoped_task_environment_; bool reboot_required_ = false; }; @@ -444,7 +444,7 @@ } bool use_reboot_removal_ = false; - base::MessageLoop message_loop_; + base::test::ScopedTaskEnvironment scoped_task_environment_; base::ScopedTempDir temp_dir_; std::unique_ptr<FileRemover> file_remover_; };
diff --git a/chrome/chrome_cleaner/parsers/broker/lnk_parser_sandbox_setup_unittest.cc b/chrome/chrome_cleaner/parsers/broker/lnk_parser_sandbox_setup_unittest.cc index a628641d..883ba0d 100644 --- a/chrome/chrome_cleaner/parsers/broker/lnk_parser_sandbox_setup_unittest.cc +++ b/chrome/chrome_cleaner/parsers/broker/lnk_parser_sandbox_setup_unittest.cc
@@ -7,6 +7,7 @@ #include "base/files/scoped_temp_dir.h" #include "base/memory/scoped_refptr.h" #include "base/test/multiprocess_test.h" +#include "base/test/scoped_task_environment.h" #include "base/win/scoped_handle.h" #include "base/win/shortcut.h" #include "chrome/chrome_cleaner/interfaces/parser_interface.mojom.h" @@ -54,7 +55,7 @@ ParsedLnkFile test_parsed_shortcut_; mojom::LnkParsingResult test_result_code_; - base::MessageLoop message_loop_; + base::test::ScopedTaskEnvironment scoped_task_environment_; base::FilePath not_lnk_file_path_; base::ScopedTempDir temp_dir_;
diff --git a/chrome/chrome_cleaner/parsers/target/parser_impl_unittest.cc b/chrome/chrome_cleaner/parsers/target/parser_impl_unittest.cc index d3ae8c1..a929a480 100644 --- a/chrome/chrome_cleaner/parsers/target/parser_impl_unittest.cc +++ b/chrome/chrome_cleaner/parsers/target/parser_impl_unittest.cc
@@ -10,6 +10,7 @@ #include "base/files/scoped_temp_dir.h" #include "base/memory/scoped_refptr.h" #include "base/synchronization/waitable_event.h" +#include "base/test/scoped_task_environment.h" #include "base/test/test_timeouts.h" #include "base/values.h" #include "base/win/scoped_handle.h" @@ -75,7 +76,7 @@ base::FilePath not_lnk_file_path_; base::ScopedTempDir temp_dir_; - base::MessageLoop message_loop_; + base::test::ScopedTaskEnvironment scoped_task_environment_; SandboxedShortcutParser shortcut_parser_; ParsedLnkFile test_parsed_shortcut_;
diff --git a/chrome/common/chrome_features.cc b/chrome/common/chrome_features.cc index 5d66a48..13275bf 100644 --- a/chrome/common/chrome_features.cc +++ b/chrome/common/chrome_features.cc
@@ -618,11 +618,6 @@ const base::Feature kSoundContentSetting{"SoundContentSetting", base::FEATURE_ENABLED_BY_DEFAULT}; -// Enables or disabled committed interstitials for Supervised User -// interstitials. -const base::Feature kSupervisedUserCommittedInterstitials{ - "SupervisedUserCommittedInterstitials", base::FEATURE_ENABLED_BY_DEFAULT}; - #if defined(OS_CHROMEOS) // Enables or disables chrome://sys-internals. const base::Feature kSysInternals{"SysInternals",
diff --git a/chrome/common/chrome_features.h b/chrome/common/chrome_features.h index 77bcd4f..5928915 100644 --- a/chrome/common/chrome_features.h +++ b/chrome/common/chrome_features.h
@@ -390,9 +390,6 @@ COMPONENT_EXPORT(CHROME_FEATURES) extern const base::Feature kSoundContentSetting; -COMPONENT_EXPORT(CHROME_FEATURES) -extern const base::Feature kSupervisedUserCommittedInterstitials; - #if defined(OS_CHROMEOS) COMPONENT_EXPORT(CHROME_FEATURES) extern const base::Feature kSysInternals;
diff --git a/chrome/common/heap_profiler_controller.cc b/chrome/common/heap_profiler_controller.cc index d164487..2993153 100644 --- a/chrome/common/heap_profiler_controller.cc +++ b/chrome/common/heap_profiler_controller.cc
@@ -7,6 +7,8 @@ #include <cmath> #include "base/bind.h" +#include "base/feature_list.h" +#include "base/metrics/field_trial_params.h" #include "base/rand_util.h" #include "base/sampling_heap_profiler/module_cache.h" #include "base/sampling_heap_profiler/sampling_heap_profiler.h" @@ -15,6 +17,13 @@ namespace { +// Enables reporting of sampling heap profiles over UMA. +const base::Feature kHeapProfilerReporting{"HeapProfilerReporting", + base::FEATURE_DISABLED_BY_DEFAULT}; + +// Sets sampling interval in bytes. +const char kHeapProfilerSamplingRate[] = "sampling-rate"; + constexpr base::TimeDelta kHeapCollectionInterval = base::TimeDelta::FromHours(24); @@ -33,7 +42,19 @@ stopped_->data.Set(); } +// static +bool HeapProfilerController::IsReportingEnabled() { + return base::FeatureList::IsEnabled(kHeapProfilerReporting); +} + void HeapProfilerController::Start() { + if (IsReportingEnabled()) { + int sampling_rate = base::GetFieldTrialParamByFeatureAsInt( + kHeapProfilerReporting, kHeapProfilerSamplingRate, 0); + if (sampling_rate > 0) + base::SamplingHeapProfiler::Get()->SetSamplingInterval(sampling_rate); + base::SamplingHeapProfiler::Get()->Start(); + } ScheduleNextSnapshot(task_runner_ ? std::move(task_runner_) : base::CreateTaskRunnerWithTraits( {base::TaskPriority::BEST_EFFORT}),
diff --git a/chrome/common/heap_profiler_controller.h b/chrome/common/heap_profiler_controller.h index aae5e915..731c168c 100644 --- a/chrome/common/heap_profiler_controller.h +++ b/chrome/common/heap_profiler_controller.h
@@ -27,6 +27,8 @@ task_runner_ = std::move(task_runner); } + static bool IsReportingEnabled(); + private: using StoppedFlag = base::RefCountedData<base::AtomicFlag>;
diff --git a/chrome/common/instant_struct_traits.h b/chrome/common/instant_struct_traits.h index 55260ca..d136896 100644 --- a/chrome/common/instant_struct_traits.h +++ b/chrome/common/instant_struct_traits.h
@@ -55,6 +55,12 @@ IPC_STRUCT_TRAITS_MEMBER(data_generation_time) IPC_STRUCT_TRAITS_END() +IPC_STRUCT_TRAITS_BEGIN(InstantMostVisitedInfo) + IPC_STRUCT_TRAITS_MEMBER(items) + IPC_STRUCT_TRAITS_MEMBER(items_are_custom_links) + IPC_STRUCT_TRAITS_MEMBER(use_most_visited) +IPC_STRUCT_TRAITS_END() + IPC_STRUCT_TRAITS_BEGIN(ThemeBackgroundInfo) IPC_STRUCT_TRAITS_MEMBER(using_default_theme) IPC_STRUCT_TRAITS_MEMBER(using_dark_mode)
diff --git a/chrome/common/search.mojom b/chrome/common/search.mojom index 019e2ab..faf74f2 100644 --- a/chrome/common/search.mojom +++ b/chrome/common/search.mojom
@@ -125,13 +125,25 @@ // Opts the user out of receiving search suggestions. OptOutOfSearchSuggestions(); + + // Applies the default theme. + ApplyDefaultTheme(); + + // Applies autogenerated theme for the given color. + ApplyAutogeneratedTheme(uint32 color); + + // Reverts applied theme changes. + RevertThemeChanges(); + + // Confirms applied theme changes. + ConfirmThemeChanges(); }; [Native] enum OmniboxFocusChangeReason; [Native] -struct InstantMostVisitedItem; +struct InstantMostVisitedInfo; [Native] struct ThemeBackgroundInfo; @@ -144,7 +156,7 @@ FocusChanged(OmniboxFocusState new_focus_state, OmniboxFocusChangeReason reason); - MostVisitedChanged(array<InstantMostVisitedItem> items, bool is_custom_links); + MostVisitedChanged(InstantMostVisitedInfo most_visited_info); SetInputInProgress(bool input_in_progress);
diff --git a/chrome/common/search.typemap b/chrome/common/search.typemap index 680cc1d..7e8030e3 100644 --- a/chrome/common/search.typemap +++ b/chrome/common/search.typemap
@@ -20,6 +20,6 @@ "chrome.mojom.NTPTileImpression=::ntp_tiles::NTPTileImpression", "chrome.mojom.OmniboxFocusState=::OmniboxFocusState", "chrome.mojom.OmniboxFocusChangeReason=::OmniboxFocusChangeReason", - "chrome.mojom.InstantMostVisitedItem=::InstantMostVisitedItem", + "chrome.mojom.InstantMostVisitedInfo=::InstantMostVisitedInfo", "chrome.mojom.ThemeBackgroundInfo=::ThemeBackgroundInfo", ]
diff --git a/chrome/common/search/instant_types.cc b/chrome/common/search/instant_types.cc index 26d9a05..eda566d 100644 --- a/chrome/common/search/instant_types.cc +++ b/chrome/common/search/instant_types.cc
@@ -51,3 +51,11 @@ const InstantMostVisitedItem& other) = default; InstantMostVisitedItem::~InstantMostVisitedItem() {} + +InstantMostVisitedInfo::InstantMostVisitedInfo() + : items_are_custom_links(false), use_most_visited(false) {} + +InstantMostVisitedInfo::InstantMostVisitedInfo( + const InstantMostVisitedInfo& other) = default; + +InstantMostVisitedInfo::~InstantMostVisitedInfo() {}
diff --git a/chrome/common/search/instant_types.h b/chrome/common/search/instant_types.h index aba03392..165e6c4 100644 --- a/chrome/common/search/instant_types.h +++ b/chrome/common/search/instant_types.h
@@ -9,6 +9,7 @@ #include <string> #include <utility> +#include <vector> #include "base/strings/string16.h" #include "base/time/time.h" @@ -125,6 +126,23 @@ base::Time data_generation_time; }; +struct InstantMostVisitedInfo { + InstantMostVisitedInfo(); + InstantMostVisitedInfo(const InstantMostVisitedInfo& other); + ~InstantMostVisitedInfo(); + + std::vector<InstantMostVisitedItem> items; + + // True if the source of the |items| is custom links (i.e. + // ntp_tiles::TileSource::CUSTOM_LINKS). Required since the source cannot be + // checked if |items| is empty. + bool items_are_custom_links; + + // True if Most Visited functionality is enabled instead of customizable + // shortcuts. + bool use_most_visited; +}; + // An InstantMostVisitedItem along with its assigned restricted ID. typedef std::pair<InstantRestrictedID, InstantMostVisitedItem> InstantMostVisitedItemIDPair;
diff --git a/chrome/common/search/mock_embedded_search_client.h b/chrome/common/search/mock_embedded_search_client.h index aeccb2e0..f9e0f38c 100644 --- a/chrome/common/search/mock_embedded_search_client.h +++ b/chrome/common/search/mock_embedded_search_client.h
@@ -15,8 +15,7 @@ MOCK_METHOD1(SetPageSequenceNumber, void(int)); MOCK_METHOD2(FocusChanged, void(OmniboxFocusState, OmniboxFocusChangeReason)); - MOCK_METHOD2(MostVisitedChanged, - void(const std::vector<InstantMostVisitedItem>&, bool)); + MOCK_METHOD1(MostVisitedChanged, void(const InstantMostVisitedInfo&)); MOCK_METHOD1(SetInputInProgress, void(bool)); MOCK_METHOD1(ThemeChanged, void(const ThemeBackgroundInfo&)); MOCK_METHOD0(SelectLocalImageSuccess, void());
diff --git a/chrome/renderer/net/net_error_helper_core.cc b/chrome/renderer/net/net_error_helper_core.cc index 84bba943..cb2ad2d 100644 --- a/chrome/renderer/net/net_error_helper_core.cc +++ b/chrome/renderer/net/net_error_helper_core.cc
@@ -369,26 +369,6 @@ return params; } -void ReportAutoReloadSuccess(const error_page::Error& error, size_t count) { - if (error.domain() != error_page::Error::kNetErrorDomain) - return; - base::UmaHistogramSparse("Net.AutoReload.ErrorAtSuccess", -error.reason()); - UMA_HISTOGRAM_COUNTS_1M("Net.AutoReload.CountAtSuccess", - static_cast<base::HistogramBase::Sample>(count)); - if (count == 1) { - base::UmaHistogramSparse("Net.AutoReload.ErrorAtFirstSuccess", - -error.reason()); - } -} - -void ReportAutoReloadFailure(const error_page::Error& error, size_t count) { - if (error.domain() != error_page::Error::kNetErrorDomain) - return; - base::UmaHistogramSparse("Net.AutoReload.ErrorAtStop", -error.reason()); - UMA_HISTOGRAM_COUNTS_1M("Net.AutoReload.CountAtStop", - static_cast<base::HistogramBase::Sample>(count)); -} - // Tracks navigation correction service usage in UMA to enable more in depth // analysis. void TrackClickUMA(std::string type_id) { @@ -524,13 +504,7 @@ { } -NetErrorHelperCore::~NetErrorHelperCore() { - if (committed_error_page_info_ && - committed_error_page_info_->auto_reload_triggered) { - ReportAutoReloadFailure(committed_error_page_info_->error, - auto_reload_count_); - } -} +NetErrorHelperCore::~NetErrorHelperCore() = default; void NetErrorHelperCore::CancelPendingFetches() { // Cancel loading the alternate error page, and prevent any pending error page @@ -546,11 +520,6 @@ } void NetErrorHelperCore::OnStop() { - if (committed_error_page_info_ && - committed_error_page_info_->auto_reload_triggered) { - ReportAutoReloadFailure(committed_error_page_info_->error, - auto_reload_count_); - } CancelPendingFetches(); uncommitted_load_started_ = false; auto_reload_count_ = 0; @@ -619,16 +588,6 @@ } navigation_from_button_ = NO_BUTTON; - if (committed_error_page_info_ && !pending_error_page_info_ && - committed_error_page_info_->auto_reload_triggered) { - const error_page::Error& error = committed_error_page_info_->error; - const GURL& error_url = error.url(); - if (url == error_url) - ReportAutoReloadSuccess(error, auto_reload_count_); - else if (url != content::kUnreachableWebDataURL) - ReportAutoReloadFailure(error, auto_reload_count_); - } - committed_error_page_info_ = std::move(pending_error_page_info_); }
diff --git a/chrome/renderer/net/net_error_helper_core_unittest.cc b/chrome/renderer/net/net_error_helper_core_unittest.cc index 8ba0cc20..3885911 100644 --- a/chrome/renderer/net/net_error_helper_core_unittest.cc +++ b/chrome/renderer/net/net_error_helper_core_unittest.cc
@@ -2453,183 +2453,6 @@ GURL(kFailedUrl))); } -class NetErrorHelperCoreHistogramTest - : public NetErrorHelperCoreAutoReloadTest { - public: - static const char kCountAtStop[]; - static const char kErrorAtStop[]; - static const char kCountAtSuccess[]; - static const char kErrorAtSuccess[]; - static const char kErrorAtFirstSuccess[]; - - protected: - base::HistogramTester histogram_tester_; -}; - -const char NetErrorHelperCoreHistogramTest::kCountAtStop[] = - "Net.AutoReload.CountAtStop"; -const char NetErrorHelperCoreHistogramTest::kErrorAtStop[] = - "Net.AutoReload.ErrorAtStop"; -const char NetErrorHelperCoreHistogramTest::kCountAtSuccess[] = - "Net.AutoReload.CountAtSuccess"; -const char NetErrorHelperCoreHistogramTest::kErrorAtSuccess[] = - "Net.AutoReload.ErrorAtSuccess"; -const char NetErrorHelperCoreHistogramTest::kErrorAtFirstSuccess[] = - "Net.AutoReload.ErrorAtFirstSuccess"; - -// Test that the success histograms are updated when auto-reload succeeds at the -// first attempt, and that the failure histograms are not updated. -TEST_F(NetErrorHelperCoreHistogramTest, SuccessAtFirstAttempt) { - DoErrorLoad(net::ERR_CONNECTION_RESET); - timer()->Fire(); - DoSuccessLoad(); - - // All of CountAtSuccess, ErrorAtSuccess, and ErrorAtFirstSuccess should - // reflect this successful load. The failure histograms should be unchanged. - histogram_tester_.ExpectTotalCount(kCountAtSuccess, 1); - histogram_tester_.ExpectTotalCount(kErrorAtSuccess, 1); - histogram_tester_.ExpectTotalCount(kErrorAtFirstSuccess, 1); - histogram_tester_.ExpectTotalCount(kCountAtStop, 0); - histogram_tester_.ExpectTotalCount(kErrorAtStop, 0); -} - -// Test that the success histograms are updated when auto-reload succeeds but -// not on the first attempt, and that the first-success histogram is not -// updated. -TEST_F(NetErrorHelperCoreHistogramTest, SuccessAtSecondAttempt) { - DoErrorLoad(net::ERR_CONNECTION_RESET); - timer()->Fire(); - EXPECT_TRUE(core()->ShouldSuppressErrorPage(NetErrorHelperCore::MAIN_FRAME, - default_url())); - timer()->Fire(); - DoSuccessLoad(); - - // CountAtSuccess and ErrorAtSuccess should reflect this successful load, but - // not ErrorAtFirstSuccess since it wasn't a first success. - histogram_tester_.ExpectTotalCount(kCountAtSuccess, 1); - histogram_tester_.ExpectTotalCount(kErrorAtSuccess, 1); - histogram_tester_.ExpectTotalCount(kErrorAtFirstSuccess, 0); - histogram_tester_.ExpectTotalCount(kCountAtStop, 0); - histogram_tester_.ExpectTotalCount(kErrorAtStop, 0); -} - -// Test that a user stop (caused by the user pressing the 'Stop' button) -// registers as an auto-reload failure if an auto-reload attempt is in flight. -// Note that "user stop" is also caused by a cross-process navigation, for which -// the browser process will send an OnStop to the old process. -TEST_F(NetErrorHelperCoreHistogramTest, UserStop) { - DoErrorLoad(net::ERR_CONNECTION_RESET); - timer()->Fire(); - core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME, - NetErrorHelperCore::NON_ERROR_PAGE); - core()->OnStop(); - - // CountAtStop and ErrorAtStop should reflect the failure. - histogram_tester_.ExpectTotalCount(kCountAtSuccess, 0); - histogram_tester_.ExpectTotalCount(kErrorAtSuccess, 0); - histogram_tester_.ExpectTotalCount(kErrorAtFirstSuccess, 0); - histogram_tester_.ExpectTotalCount(kCountAtStop, 1); - histogram_tester_.ExpectTotalCount(kErrorAtStop, 1); -} - -// Test that a user stop (caused by the user pressing the 'Stop' button) -// registers as an auto-reload failure even if an auto-reload attempt has not -// been launched yet (i.e., if the timer is running, but no reload is in -// flight), because this means auto-reload didn't successfully replace the error -// page. -TEST_F(NetErrorHelperCoreHistogramTest, OtherPageLoaded) { - DoErrorLoad(net::ERR_CONNECTION_RESET); - core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME, - NetErrorHelperCore::NON_ERROR_PAGE); - core()->OnStop(); - - histogram_tester_.ExpectTotalCount(kCountAtSuccess, 0); - histogram_tester_.ExpectTotalCount(kErrorAtSuccess, 0); - histogram_tester_.ExpectTotalCount(kErrorAtFirstSuccess, 0); - histogram_tester_.ExpectTotalCount(kCountAtStop, 1); - histogram_tester_.ExpectTotalCount(kErrorAtStop, 1); -} - -// Test that a commit of a different URL (caused by the user navigating to a -// different page) with an auto-reload attempt in flight registers as an -// auto-reload failure. -TEST_F(NetErrorHelperCoreHistogramTest, OtherPageLoadedAfterTimerFires) { - const GURL kTestUrl("https://anotherurl"); - DoErrorLoad(net::ERR_CONNECTION_RESET); - timer()->Fire(); - core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME, - NetErrorHelperCore::NON_ERROR_PAGE); - core()->OnCommitLoad(NetErrorHelperCore::MAIN_FRAME, kTestUrl); - core()->OnFinishLoad(NetErrorHelperCore::MAIN_FRAME); - - histogram_tester_.ExpectTotalCount(kCountAtSuccess, 0); - histogram_tester_.ExpectTotalCount(kErrorAtSuccess, 0); - histogram_tester_.ExpectTotalCount(kErrorAtFirstSuccess, 0); - histogram_tester_.ExpectTotalCount(kCountAtStop, 1); - histogram_tester_.ExpectTotalCount(kErrorAtStop, 1); -} - -// Test that a commit of the same URL with an auto-reload attempt in flight -// registers as an auto-reload success. -TEST_F(NetErrorHelperCoreHistogramTest, SamePageLoadedAfterTimerFires) { - DoErrorLoad(net::ERR_CONNECTION_RESET); - timer()->Fire(); - DoSuccessLoad(); - - histogram_tester_.ExpectTotalCount(kCountAtSuccess, 1); - histogram_tester_.ExpectTotalCount(kErrorAtSuccess, 1); - histogram_tester_.ExpectTotalCount(kErrorAtFirstSuccess, 1); - histogram_tester_.ExpectTotalCount(kCountAtStop, 0); - histogram_tester_.ExpectTotalCount(kErrorAtStop, 0); -} - -TEST_F(NetErrorHelperCoreHistogramTest, SamePageLoadedAfterLoadStarts) { - DoErrorLoad(net::ERR_CONNECTION_RESET); - timer()->Fire(); - // Autoreload attempt starts - core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME, - NetErrorHelperCore::NON_ERROR_PAGE); - // User does a manual reload - DoSuccessLoad(); - - histogram_tester_.ExpectTotalCount(kCountAtSuccess, 1); - histogram_tester_.ExpectTotalCount(kErrorAtSuccess, 1); - histogram_tester_.ExpectTotalCount(kErrorAtFirstSuccess, 1); - histogram_tester_.ExpectTotalCount(kCountAtStop, 0); - histogram_tester_.ExpectTotalCount(kErrorAtStop, 0); -} - -// In this test case, the user presses the reload button manually after an -// auto-reload fails and the error page is suppressed. -TEST_F(NetErrorHelperCoreHistogramTest, ErrorPageLoadedAfterTimerFires) { - DoErrorLoad(net::ERR_CONNECTION_RESET); - timer()->Fire(); - core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME, - NetErrorHelperCore::NON_ERROR_PAGE); - EXPECT_TRUE(core()->ShouldSuppressErrorPage(NetErrorHelperCore::MAIN_FRAME, - default_url())); - DoErrorLoad(net::ERR_CONNECTION_RESET); - - histogram_tester_.ExpectTotalCount(kCountAtSuccess, 0); - histogram_tester_.ExpectTotalCount(kErrorAtSuccess, 0); - histogram_tester_.ExpectTotalCount(kErrorAtFirstSuccess, 0); - histogram_tester_.ExpectTotalCount(kCountAtStop, 0); - histogram_tester_.ExpectTotalCount(kErrorAtStop, 0); -} - -TEST_F(NetErrorHelperCoreHistogramTest, SuccessPageLoadedBeforeTimerFires) { - DoErrorLoad(net::ERR_CONNECTION_RESET); - core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME, - NetErrorHelperCore::NON_ERROR_PAGE); - core()->OnCommitLoad(NetErrorHelperCore::MAIN_FRAME, GURL(kFailedHttpsUrl)); - - histogram_tester_.ExpectTotalCount(kCountAtSuccess, 0); - histogram_tester_.ExpectTotalCount(kErrorAtSuccess, 0); - histogram_tester_.ExpectTotalCount(kErrorAtFirstSuccess, 0); - histogram_tester_.ExpectTotalCount(kCountAtStop, 1); - histogram_tester_.ExpectTotalCount(kErrorAtStop, 1); -} - TEST_F(NetErrorHelperCoreTest, ExplicitReloadSucceeds) { DoErrorLoad(net::ERR_CONNECTION_RESET); EXPECT_EQ(0, reload_count());
diff --git a/chrome/renderer/searchbox/searchbox.cc b/chrome/renderer/searchbox/searchbox.cc index 5574106..3df0dd5 100644 --- a/chrome/renderer/searchbox/searchbox.cc +++ b/chrome/renderer/searchbox/searchbox.cc
@@ -301,7 +301,11 @@ } bool SearchBox::IsCustomLinks() const { - return is_custom_links_; + return items_are_custom_links_; +} + +bool SearchBox::IsUsingMostVisited() const { + return use_most_visited_; } void SearchBox::ToggleMostVisitedOrCustomLinks() { @@ -400,6 +404,22 @@ embedded_search_service_->OptOutOfSearchSuggestions(); } +void SearchBox::ApplyDefaultTheme() { + embedded_search_service_->ApplyDefaultTheme(); +} + +void SearchBox::ApplyAutogeneratedTheme(SkColor color) { + embedded_search_service_->ApplyAutogeneratedTheme(color); +} + +void SearchBox::RevertThemeChanges() { + embedded_search_service_->RevertThemeChanges(); +} + +void SearchBox::ConfirmThemeChanges() { + embedded_search_service_->ConfirmThemeChanges(); +} + void SearchBox::SetPageSequenceNumber(int page_seq_no) { page_seq_no_ = page_seq_no; } @@ -456,19 +476,21 @@ } void SearchBox::MostVisitedChanged( - const std::vector<InstantMostVisitedItem>& items, - bool is_custom_links) { + const InstantMostVisitedInfo& most_visited_info) { has_received_most_visited_ = true; - is_custom_links_ = is_custom_links; + items_are_custom_links_ = most_visited_info.items_are_custom_links; std::vector<InstantMostVisitedItemIDPair> last_known_items; GetMostVisitedItems(&last_known_items); - if (AreMostVisitedItemsEqual(last_known_items, items)) { + if (AreMostVisitedItemsEqual(last_known_items, most_visited_info.items) && + use_most_visited_ == most_visited_info.use_most_visited) { return; // Do not send duplicate onmostvisitedchange events. } - most_visited_items_cache_.AddItems(items); + use_most_visited_ = most_visited_info.use_most_visited; + + most_visited_items_cache_.AddItems(most_visited_info.items); if (can_run_js_in_renderframe_) { SearchBoxExtension::DispatchMostVisitedChanged( render_frame()->GetWebFrame());
diff --git a/chrome/renderer/searchbox/searchbox.h b/chrome/renderer/searchbox/searchbox.h index 791cfd5..742573a 100644 --- a/chrome/renderer/searchbox/searchbox.h +++ b/chrome/renderer/searchbox/searchbox.h
@@ -110,6 +110,9 @@ // Returns true if the most visited items are custom links. bool IsCustomLinks() const; + // Returns true if most visited is enabled instead of custom links. + bool IsUsingMostVisited() const; + // Sends ToggleMostVisitedOrCustomLinks to the browser. void ToggleMostVisitedOrCustomLinks(); @@ -166,6 +169,18 @@ // Opts the user out of receiving search suggestions. void OptOutOfSearchSuggestions(); + // Applies the default theme. + void ApplyDefaultTheme(); + + // Applies autogenerated theme for the given color. + void ApplyAutogeneratedTheme(SkColor color); + + // Reverts applied theme changes. + void RevertThemeChanges(); + + // Confirms applied theme changes. + void ConfirmThemeChanges(); + bool is_focused() const { return is_focused_; } bool is_input_in_progress() const { return is_input_in_progress_; } bool is_key_capture_enabled() const { return is_key_capture_enabled_; } @@ -180,8 +195,8 @@ void SetPageSequenceNumber(int page_seq_no) override; void FocusChanged(OmniboxFocusState new_focus_state, OmniboxFocusChangeReason reason) override; - void MostVisitedChanged(const std::vector<InstantMostVisitedItem>& items, - bool is_custom_links) override; + void MostVisitedChanged( + const InstantMostVisitedInfo& most_visited_info) override; void SetInputInProgress(bool input_in_progress) override; void ThemeChanged(const ThemeBackgroundInfo& theme_info) override; @@ -216,7 +231,9 @@ InstantRestrictedIDCache<InstantMostVisitedItem> most_visited_items_cache_; bool has_received_most_visited_; // True if the most visited items are custom links. - bool is_custom_links_ = false; + bool items_are_custom_links_ = false; + // True if most visited functionality is enabled instead of custom links. + bool use_most_visited_ = false; ThemeBackgroundInfo theme_info_; base::WeakPtrFactory<SearchBox> weak_ptr_factory_;
diff --git a/chrome/renderer/searchbox/searchbox_extension.cc b/chrome/renderer/searchbox/searchbox_extension.cc index abd8880..f660c0cb 100644 --- a/chrome/renderer/searchbox/searchbox_extension.cc +++ b/chrome/renderer/searchbox/searchbox_extension.cc
@@ -53,6 +53,7 @@ #include "v8/include/v8.h" namespace internal { // for testing. + // Whether NTP background should be considered dark, so the colors of various // UI elements can be adjusted. Light text implies dark theme. bool IsNtpBackgroundDark(SkColor ntp_text) { @@ -248,6 +249,41 @@ return color_array; } +// Converts given array to SkColor and returns whether the conversion is +// successful. +bool ArrayToSkColor(v8::Isolate* isolate, + v8::Local<v8::Array> color, + SkColor* color_result) { + if (color->Length() != 4) + return false; + + v8::Local<v8::Context> context = isolate->GetCurrentContext(); + v8::Local<v8::Value> r_value; + v8::Local<v8::Value> g_value; + v8::Local<v8::Value> b_value; + v8::Local<v8::Value> a_value; + + if (!color->Get(context, 0).ToLocal(&r_value) || + !color->Get(context, 1).ToLocal(&g_value) || + !color->Get(context, 2).ToLocal(&b_value) || + !color->Get(context, 3).ToLocal(&a_value)) + return false; + + base::Optional<int> r = CoerceToInt(isolate, *r_value); + base::Optional<int> g = CoerceToInt(isolate, *g_value); + base::Optional<int> b = CoerceToInt(isolate, *b_value); + base::Optional<int> a = CoerceToInt(isolate, *a_value); + + if (!r.has_value() || !g.has_value() || !b.has_value() || !a.has_value()) + return false; + + if (*a > 255 || *r > 255 || *g > 255 || *b > 255) + return false; + + *color_result = SkColorSetARGB(*a, *r, *g, *b); + return true; +} + v8::Local<v8::Object> GenerateThemeBackgroundInfo( v8::Isolate* isolate, const ThemeBackgroundInfo& theme_info) { @@ -611,6 +647,7 @@ static bool GetMostVisitedAvailable(v8::Isolate* isolate); static v8::Local<v8::Value> GetThemeBackgroundInfo(v8::Isolate* isolate); static bool GetIsCustomLinks(); + static bool GetIsUsingMostVisited(); // Handlers for JS functions visible to all NTPs. static void DeleteMostVisitedItem(v8::Isolate* isolate, @@ -660,6 +697,12 @@ int task_id, const std::string& hash); static void OptOutOfSearchSuggestions(); + static void UseDefaultTheme(); + static void ApplyDefaultTheme(); + static void ApplyAutogeneratedTheme(v8::Isolate* isolate, + v8::Local<v8::Value> color); + static void RevertThemeChanges(); + static void ConfirmThemeChanges(); DISALLOW_COPY_AND_ASSIGN(NewTabPageBindings); }; @@ -680,6 +723,8 @@ .SetProperty("themeBackgroundInfo", &NewTabPageBindings::GetThemeBackgroundInfo) .SetProperty("isCustomLinks", &NewTabPageBindings::GetIsCustomLinks) + .SetProperty("isUsingMostVisited", + &NewTabPageBindings::GetIsUsingMostVisited) .SetMethod("deleteMostVisitedItem", &NewTabPageBindings::DeleteMostVisitedItem) .SetMethod("undoAllMostVisitedDeletions", @@ -717,7 +762,14 @@ .SetMethod("searchSuggestionSelected", &NewTabPageBindings::SearchSuggestionSelected) .SetMethod("optOutOfSearchSuggestions", - &NewTabPageBindings::OptOutOfSearchSuggestions); + &NewTabPageBindings::OptOutOfSearchSuggestions) + .SetMethod("useDefaultTheme", &NewTabPageBindings::UseDefaultTheme) + .SetMethod("applyDefaultTheme", &NewTabPageBindings::ApplyDefaultTheme) + .SetMethod("applyAutogeneratedTheme", + &NewTabPageBindings::ApplyAutogeneratedTheme) + .SetMethod("revertThemeChanges", &NewTabPageBindings::RevertThemeChanges) + .SetMethod("confirmThemeChanges", + &NewTabPageBindings::ConfirmThemeChanges); } // static @@ -799,6 +851,15 @@ } // static +bool NewTabPageBindings::GetIsUsingMostVisited() { + const SearchBox* search_box = GetSearchBoxForCurrentContext(); + if (!search_box || !HasOrigin(GURL(chrome::kChromeSearchMostVisitedUrl))) + return false; + + return search_box->IsUsingMostVisited(); +} + +// static void NewTabPageBindings::DeleteMostVisitedItem(v8::Isolate* isolate, v8::Local<v8::Value> rid_value) { // Manually convert to integer, so that the string "\"1\"" is also accepted. @@ -1083,6 +1144,49 @@ search_box->OptOutOfSearchSuggestions(); } +// static +void NewTabPageBindings::ApplyDefaultTheme() { + SearchBox* search_box = GetSearchBoxForCurrentContext(); + if (!search_box) + return; + search_box->ApplyDefaultTheme(); +} + +// static +void NewTabPageBindings::UseDefaultTheme() { + SearchBox* search_box = GetSearchBoxForCurrentContext(); + if (!search_box) + return; + search_box->ApplyDefaultTheme(); + search_box->ConfirmThemeChanges(); +} + +// static +void NewTabPageBindings::ApplyAutogeneratedTheme(v8::Isolate* isolate, + v8::Local<v8::Value> value) { + SearchBox* search_box = GetSearchBoxForCurrentContext(); + if (!search_box || !value->IsArray()) + return; + SkColor color; + if (ArrayToSkColor(isolate, value.As<v8::Array>(), &color)) + search_box->ApplyAutogeneratedTheme(color); +} + +// static +void NewTabPageBindings::RevertThemeChanges() { + SearchBox* search_box = GetSearchBoxForCurrentContext(); + if (!search_box) + return; + search_box->RevertThemeChanges(); +} + +// static +void NewTabPageBindings::ConfirmThemeChanges() { + SearchBox* search_box = GetSearchBoxForCurrentContext(); + if (!search_box) + return; + search_box->ConfirmThemeChanges(); +} } // namespace // static
diff --git a/chrome/services/cups_proxy/BUILD.gn b/chrome/services/cups_proxy/BUILD.gn index 21e5128..224996e 100644 --- a/chrome/services/cups_proxy/BUILD.gn +++ b/chrome/services/cups_proxy/BUILD.gn
@@ -14,8 +14,6 @@ "cups_proxy_service.h", "cups_proxy_service_delegate.cc", "cups_proxy_service_delegate.h", - "socket_manager.cc", - "socket_manager.h", ] deps = [ @@ -34,6 +32,8 @@ sources += [ "printer_installer.cc", "printer_installer.h", + "socket_manager.cc", + "socket_manager.h", ] } @@ -57,23 +57,23 @@ source_set("unit_tests") { testonly = true - sources = [ - "socket_manager_unittest.cc", - ] - - deps = [ - ":cups_proxy", - ":test_support", - "//base", - "//chrome/services/cups_proxy/public/cpp", - "//testing/gtest", - ] - + # Target is empty unless libCUPS is available. if (use_cups) { - sources += [ "printer_installer_unittest.cc" ] - } + sources = [ + "printer_installer_unittest.cc", + "socket_manager_unittest.cc", + ] - data = [ - "//chrome/test/data/cups_proxy", - ] + deps = [ + ":cups_proxy", + ":test_support", + "//base", + "//chrome/services/cups_proxy/public/cpp", + "//testing/gtest", + ] + + data = [ + "//chrome/test/data/cups_proxy", + ] + } }
diff --git a/chrome/test/BUILD.gn b/chrome/test/BUILD.gn index ccc40be..d19a918 100644 --- a/chrome/test/BUILD.gn +++ b/chrome/test/BUILD.gn
@@ -937,6 +937,7 @@ "../browser/net/variations_http_headers_browsertest.cc", "../browser/net/websocket_browsertest.cc", "../browser/no_best_effort_tasks_browsertest.cc", + "../browser/no_best_effort_tasks_during_startup_browsertest.cc", "../browser/ntp_snippets/content_suggestions_service_factory_browsertest.cc", "../browser/ntp_tiles/ntp_tiles_browsertest.cc", "../browser/page_load_metrics/observers/ad_metrics/ads_page_load_metrics_observer_browsertest.cc", @@ -2104,6 +2105,7 @@ "../browser/chromeos/policy/login_policy_test_base.cc", "../browser/chromeos/policy/login_policy_test_base.h", "../browser/chromeos/policy/login_screen_default_policy_browsertest.cc", + "../browser/chromeos/policy/network_policy_application_browsertest.cc", "../browser/chromeos/policy/power_policy_browsertest.cc", "../browser/chromeos/policy/restore_on_startup_browsertest_chromeos.cc", "../browser/chromeos/policy/signin_profile_extensions_policy_browsertest.cc", @@ -2790,7 +2792,6 @@ "../browser/custom_handlers/protocol_handler_registry_unittest.cc", "../browser/data_reduction_proxy/data_reduction_proxy_chrome_settings_unittest.cc", "../browser/data_reduction_proxy/data_reduction_proxy_settings_unittest_android.cc", - "../browser/data_use_measurement/chrome_data_use_ascriber_unittest.cc", "../browser/download/chrome_download_manager_delegate_unittest.cc", "../browser/download/download_history_unittest.cc", "../browser/download/download_item_model_unittest.cc", @@ -4724,6 +4725,7 @@ "../browser/media/webrtc/native_desktop_media_list_unittest.cc", "../browser/metrics/upgrade_metrics_provider_unittest.cc", "../browser/policy/machine_level_user_cloud_policy_register_watcher_unittest.cc", + "../browser/profiles/profile_activity_metrics_recorder_unittest.cc", "../browser/signin/force_signin_verifier_unittest.cc", "../browser/signin/signin_global_error_unittest.cc", "../browser/signin/signin_ui_util_unittest.cc",
diff --git a/chrome/test/android/BUILD.gn b/chrome/test/android/BUILD.gn index 56417e08..38eedbc 100644 --- a/chrome/test/android/BUILD.gn +++ b/chrome/test/android/BUILD.gn
@@ -59,6 +59,7 @@ "javatests/src/org/chromium/chrome/test/omaha/MockRequestGenerator.java", "javatests/src/org/chromium/chrome/test/partnercustomizations/TestPartnerBrowserCustomizationsDelayedProvider.java", "javatests/src/org/chromium/chrome/test/partnercustomizations/TestPartnerBrowserCustomizationsProvider.java", + "javatests/src/org/chromium/chrome/test/ReducedModeNativeTestRule.java", "javatests/src/org/chromium/chrome/test/TestContentProvider.java", "javatests/src/org/chromium/chrome/test/util/ActivityUtils.java", "javatests/src/org/chromium/chrome/test/util/ApplicationTestUtils.java",
diff --git a/chrome/test/android/javatests/src/org/chromium/chrome/test/ReducedModeNativeTestRule.java b/chrome/test/android/javatests/src/org/chromium/chrome/test/ReducedModeNativeTestRule.java new file mode 100644 index 0000000..fc8c9be --- /dev/null +++ b/chrome/test/android/javatests/src/org/chromium/chrome/test/ReducedModeNativeTestRule.java
@@ -0,0 +1,106 @@ +// 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. + +package org.chromium.chrome.test; + +import org.junit.Assert; +import org.junit.rules.TestRule; +import org.junit.runner.Description; +import org.junit.runners.model.Statement; + +import org.chromium.base.library_loader.LibraryProcessType; +import org.chromium.base.library_loader.ProcessInitException; +import org.chromium.base.task.PostTask; +import org.chromium.chrome.browser.ChromeApplication; +import org.chromium.chrome.browser.ChromeFeatureList; +import org.chromium.chrome.browser.init.BrowserParts; +import org.chromium.chrome.browser.init.ChromeBrowserInitializer; +import org.chromium.chrome.browser.init.EmptyBrowserParts; +import org.chromium.chrome.test.util.browser.Features; +import org.chromium.content_public.browser.BrowserStartupController; +import org.chromium.content_public.browser.UiThreadTaskTraits; +import org.chromium.content_public.browser.test.util.Criteria; +import org.chromium.content_public.browser.test.util.CriteriaHelper; +import org.chromium.content_public.browser.test.util.TestThreadUtils; + +import java.util.concurrent.atomic.AtomicBoolean; + +/** + * Custom {@link TestRule} for test using native in reduced mode. This also enables the flags + * required for reduced mode to work. + */ +public class ReducedModeNativeTestRule implements TestRule { + private final AtomicBoolean mNativeLoaded = new AtomicBoolean(); + private final boolean mAutoLoadNative; + + public ReducedModeNativeTestRule() { + this(true /*autoLoadNative*/); + } + + public ReducedModeNativeTestRule(boolean autoLoadNative) { + mAutoLoadNative = autoLoadNative; + } + + @Override + public Statement apply(final Statement base, final Description description) { + return new Statement() { + @Override + public void evaluate() throws Throwable { + Features.getInstance().enable(ChromeFeatureList.NETWORK_SERVICE, + ChromeFeatureList.ALLOW_STARTING_SERVICE_MANAGER_ONLY); + // Unfortunately, Features has already formed the command line at this point. This + // forces another redo after we added new flags. + Features.ensureCommandLineIsUpToDate(); + if (mAutoLoadNative) { + loadNative(); + } + base.evaluate(); + } + }; + } + + public void loadNative() { + final BrowserParts parts = new EmptyBrowserParts() { + @Override + public void finishNativeInitialization() { + mNativeLoaded.set(true); + } + + @Override + public boolean startServiceManagerOnly() { + return true; + } + }; + PostTask.postTask(UiThreadTaskTraits.DEFAULT, () -> { + try { + ChromeBrowserInitializer.getInstance().handlePreNativeStartup(parts); + ChromeBrowserInitializer.getInstance().handlePostNativeStartup(true, parts); + } catch (ProcessInitException e) { + ChromeApplication.reportStartupErrorAndExit(e); + } + }); + waitForNativeLoaded(); + } + + private void waitForNativeLoaded() { + CriteriaHelper.pollUiThread( + new Criteria("Failed while waiting for starting Service Manager.") { + @Override + public boolean isSatisfied() { + return mNativeLoaded.get(); + } + }); + } + + public void assertOnlyServiceManagerStarted() { + TestThreadUtils.runOnUiThreadBlocking(() -> { + Assert.assertTrue("The native service manager has not been started.", + BrowserStartupController.get(LibraryProcessType.PROCESS_BROWSER) + .isServiceManagerSuccessfullyStarted()); + Assert.assertFalse("The full browser is started instead of ServiceManager only.", + BrowserStartupController.get(LibraryProcessType.PROCESS_BROWSER) + .isStartupSuccessfullyCompleted()); + }); + } +}
diff --git a/chrome/test/android/javatests/src/org/chromium/chrome/test/util/browser/suggestions/mostvisited/OWNERS b/chrome/test/android/javatests/src/org/chromium/chrome/test/util/browser/suggestions/mostvisited/OWNERS new file mode 100644 index 0000000..7885852 --- /dev/null +++ b/chrome/test/android/javatests/src/org/chromium/chrome/test/util/browser/suggestions/mostvisited/OWNERS
@@ -0,0 +1 @@ +file://chrome/android/java/src/org/chromium/chrome/browser/suggestions/mostvisited/OWNERS
diff --git a/chrome/test/data/webui/cr_elements/cr_icon_button_tests.js b/chrome/test/data/webui/cr_elements/cr_icon_button_tests.js index fd531db..613f752 100644 --- a/chrome/test/data/webui/cr_elements/cr_icon_button_tests.js +++ b/chrome/test/data/webui/cr_elements/cr_icon_button_tests.js
@@ -77,4 +77,22 @@ button = document.body.querySelector('cr-icon-button'); assertEquals('-1', button.getAttribute('tabindex')); }); + + test('ripple is a circle with background icon or single iron-icon', () => { + const ripple = button.getRipple(); + assertEquals(undefined, button.ironIcon); + assertTrue(ripple.classList.contains('circle')); + button.ironIcon = 'icon'; + assertTrue(ripple.classList.contains('circle')); + button.ironIcon = 'icon,icon'; + assertFalse(ripple.classList.contains('circle')); + }); + + test('multiple iron icons', () => { + button.ironIcon = 'icon1,icon2'; + const elements = button.shadowRoot.querySelectorAll('iron-icon'); + assertEquals(2, elements.length); + assertEquals('icon1', elements[0].icon); + assertEquals('icon2', elements[1].icon); + }); });
diff --git a/chrome/test/data/webui/cr_elements/cr_profile_avatar_selector_tests.js b/chrome/test/data/webui/cr_elements/cr_profile_avatar_selector_tests.js index 015c987..a47fa0c 100644 --- a/chrome/test/data/webui/cr_elements/cr_profile_avatar_selector_tests.js +++ b/chrome/test/data/webui/cr_elements/cr_profile_avatar_selector_tests.js
@@ -79,41 +79,41 @@ const items = getGridItems(); items[0].focus(); - assertTrue(items[0].focused); + assertEquals(getDeepActiveElement(), items[0]); MockInteractions.keyDownOn(items[0], 39, [], 'ArrowRight'); - assertTrue(items[1].focused); + assertEquals(getDeepActiveElement(), items[1]); MockInteractions.keyDownOn(items[0], 37, [], 'ArrowLeft'); - assertTrue(items[0].focused); + assertEquals(getDeepActiveElement(), items[0]); avatarSelector.ignoreModifiedKeyEvents = true; MockInteractions.keyDownOn(items[0], 39, 'alt', 'ArrowRight'); - assertTrue(items[0].focused); + assertEquals(getDeepActiveElement(), items[0]); MockInteractions.keyDownOn(items[0], 39, 'ctrl', 'ArrowRight'); - assertTrue(items[0].focused); + assertEquals(getDeepActiveElement(), items[0]); MockInteractions.keyDownOn(items[0], 39, 'meta', 'ArrowRight'); - assertTrue(items[0].focused); + assertEquals(getDeepActiveElement(), items[0]); MockInteractions.keyDownOn(items[0], 39, 'shift', 'ArrowRight'); - assertTrue(items[0].focused); + assertEquals(getDeepActiveElement(), items[0]); // Test RTL case. selector.dir = 'rtl'; MockInteractions.keyDownOn(items[0], 37, [], 'ArrowLeft'); - assertTrue(items[1].focused); + assertEquals(getDeepActiveElement(), items[1]); MockInteractions.keyDownOn(items[0], 37, [], 'ArrowLeft'); - assertTrue(items[2].focused); + assertEquals(getDeepActiveElement(), items[2]); MockInteractions.keyDownOn(items[0], 37, [], 'ArrowRight'); - assertTrue(items[1].focused); + assertEquals(getDeepActiveElement(), items[1]); MockInteractions.keyDownOn(items[0], 37, [], 'ArrowRight'); - assertTrue(items[0].focused); + assertEquals(getDeepActiveElement(), items[0]); }); }); }
diff --git a/chrome/test/data/webui/cr_elements/cr_tabs_test.js b/chrome/test/data/webui/cr_elements/cr_tabs_test.js index bf445d81..93dfea3 100644 --- a/chrome/test/data/webui/cr_elements/cr_tabs_test.js +++ b/chrome/test/data/webui/cr_elements/cr_tabs_test.js
@@ -116,4 +116,18 @@ await checkClickTab(1, 2); await checkClickTab(2, 2); }); + + test('selection underline does not freeze with two tabs', async () => { + const underline = tabs.$.selectionBar; + const fullyExpanded = 'translateX(0%) scaleX(1)'; + tabs.tabNames = ['tab1', 'tab2']; + assertEquals(undefined, tabs.selected); + tabs.selected = 0; + await PolymerTest.flushTasks(); + assertNotEquals(fullyExpanded, underline.style.transform); + underline.style.transform = fullyExpanded; + const wait = test_util.eventToPromise('transitionend', underline); + tabs.selected = 1; + await wait; + }); });
diff --git a/chrome/test/data/webui/settings/chromeos/os_settings_ui_browsertest.js b/chrome/test/data/webui/settings/chromeos/os_settings_ui_browsertest.js index 2ccd49ec..589a33d 100644 --- a/chrome/test/data/webui/settings/chromeos/os_settings_ui_browsertest.js +++ b/chrome/test/data/webui/settings/chromeos/os_settings_ui_browsertest.js
@@ -141,6 +141,60 @@ assertTrue(floatingMenu.advancedOpened); assertTrue(ui.advancedOpenedInMenu_); }); + + test('URL initiated search propagates to search box', () => { + toolbar = /** @type {!CrToolbarElement} */ (ui.$$('cr-toolbar')); + const searchField = + /** @type {CrToolbarSearchFieldElement} */ (toolbar.getSearchField()); + assertEquals('', searchField.getSearchInput().value); + + const query = 'foo'; + settings.navigateTo( + settings.routes.BASIC, new URLSearchParams(`search=${query}`)); + assertEquals(query, searchField.getSearchInput().value); + }); + + test('search box initiated search propagates to URL', () => { + toolbar = /** @type {!CrToolbarElement} */ (ui.$$('cr-toolbar')); + const searchField = + /** @type {CrToolbarSearchFieldElement} */ (toolbar.getSearchField()); + + settings.navigateTo( + settings.routes.BASIC, /* dynamicParams */ null, + /* removeSearch */ true); + assertEquals('', searchField.getSearchInput().value); + assertFalse(settings.getQueryParameters().has('search')); + + let value = 'GOOG'; + searchField.setValue(value); + assertEquals(value, settings.getQueryParameters().get('search')); + + // Test that search queries are properly URL encoded. + value = '+++'; + searchField.setValue(value); + assertEquals(value, settings.getQueryParameters().get('search')); + }); + + test('whitespace only search query is ignored', () => { + toolbar = /** @type {!CrToolbarElement} */ (ui.$$('cr-toolbar')); + const searchField = + /** @type {CrToolbarSearchFieldElement} */ (toolbar.getSearchField()); + searchField.setValue(' '); + let urlParams = settings.getQueryParameters(); + assertFalse(urlParams.has('search')); + + searchField.setValue(' foo'); + urlParams = settings.getQueryParameters(); + assertEquals('foo', urlParams.get('search')); + + searchField.setValue(' foo '); + urlParams = settings.getQueryParameters(); + assertEquals('foo ', urlParams.get('search')); + + searchField.setValue(' '); + urlParams = settings.getQueryParameters(); + assertFalse(urlParams.has('search')); + }); }); mocha.run();
diff --git a/chrome/tools/build/mac/run_verify_order.py b/chrome/tools/build/mac/run_verify_order.py index b9df88d..70802464 100644 --- a/chrome/tools/build/mac/run_verify_order.py +++ b/chrome/tools/build/mac/run_verify_order.py
@@ -15,12 +15,8 @@ description='A wrapper around verify_order that writes a stamp file.') parser.add_argument('--stamp', action='store', type=str, help='Touch this stamp file on success.') - parser.add_argument('--developer_dir', required=False, - help='Path to Xcode.') args, unknown_args = parser.parse_known_args() - if args.developer_dir: - os.environ['DEVELOPER_DIR'] = args.developer_dir this_script_dir = os.path.dirname(sys.argv[0]) rv = subprocess.check_call(
diff --git a/chrome/tools/build/mac/verify_order b/chrome/tools/build/mac/verify_order index add97eb..d41e766d 100755 --- a/chrome/tools/build/mac/verify_order +++ b/chrome/tools/build/mac/verify_order
@@ -13,15 +13,18 @@ # This script can be used to verify that all of the global text symbols in # a Mach-O file are accounted for in an order file. -if [ ${#} -ne 2 ] ; then - echo "usage: ${0} LAST_SYMBOL MACH_O_FILE" >& 2 +if [ ${#} -ne 3 ] ; then + echo "usage: ${0} LAST_SYMBOL MACH_O_FILE BIN_SEARCH_PATH" >& 2 exit 1 fi LAST_SYMBOL=${1} MACH_O_FILE=${2} +BIN_SEARCH_PATH=${3} +NM_PATH="${BIN_SEARCH_PATH}nm" +OTOOL_PATH="${BIN_SEARCH_PATH}otool" -SYMBOLS=$(nm -gjn "${MACH_O_FILE}" -s __TEXT __text) +SYMBOLS=$("${NM_PATH}" -gjn "${MACH_O_FILE}" -s __TEXT __text) if [ ${?} -ne 0 ] || [ -z "${SYMBOLS}" ] ; then echo "${0}: no symbols in ${MACH_O_FILE}" >& 2 exit 1 @@ -40,7 +43,7 @@ exit 1 fi -LIBS=$(otool -L "${MACH_O_FILE}") +LIBS=$("${OTOOL_PATH}" -L "${MACH_O_FILE}") if [ ${?} -ne 0 ] ; then echo "${0}: failed to get libraries in ${MACH_O_FILE}" >& 2 exit 1
diff --git a/chromecast/base/bind_to_task_runner_unittest.cc b/chromecast/base/bind_to_task_runner_unittest.cc index 8e0e692..100e585 100644 --- a/chromecast/base/bind_to_task_runner_unittest.cc +++ b/chromecast/base/bind_to_task_runner_unittest.cc
@@ -10,8 +10,8 @@ #include "base/bind.h" #include "base/bind_helpers.h" #include "base/callback.h" -#include "base/message_loop/message_loop.h" #include "base/run_loop.h" +#include "base/test/scoped_task_environment.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" @@ -50,7 +50,7 @@ public: ~BindToTaskRunnerTest() override { base::RunLoop().RunUntilIdle(); } - base::MessageLoop loop_; + base::test::ScopedTaskEnvironment scoped_task_environment_; MockCallbacks callbacks_; };
diff --git a/chromecast/base/cast_features.cc b/chromecast/base/cast_features.cc index d71bcc2..49ffb6f0 100644 --- a/chromecast/base/cast_features.cc +++ b/chromecast/base/cast_features.cc
@@ -278,7 +278,7 @@ } bool IsFeatureEnabled(const base::Feature& feature) { - DCHECK(base::ContainsValue(GetFeatures(), &feature)) << feature.name; + DCHECK(base::Contains(GetFeatures(), &feature)) << feature.name; return base::FeatureList::IsEnabled(feature); }
diff --git a/chromecast/base/observer.h b/chromecast/base/observer.h index 6605f85..f84ad28 100644 --- a/chromecast/base/observer.h +++ b/chromecast/base/observer.h
@@ -266,14 +266,14 @@ void AddObserver(Observer<T>* observer) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); DCHECK(observer); - DCHECK(!base::ContainsValue(observers_, observer)); + DCHECK(!base::Contains(observers_, observer)); observers_.push_back(observer); } void RemoveObserver(Observer<T>* observer) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); DCHECK(observer); - DCHECK(base::ContainsValue(observers_, observer)); + DCHECK(base::Contains(observers_, observer)); observers_.erase( std::remove(observers_.begin(), observers_.end(), observer), observers_.end());
diff --git a/chromecast/browser/cast_network_contexts.cc b/chromecast/browser/cast_network_contexts.cc index a39f2b0..64d14d4b 100644 --- a/chromecast/browser/cast_network_contexts.cc +++ b/chromecast/browser/cast_network_contexts.cc
@@ -205,6 +205,8 @@ network::mojom::NetworkContextParamsPtr context_params = CreateDefaultNetworkContextParams(); + content::UpdateCorsExemptHeader(context_params.get()); + // Copy of what's in ContentBrowserClient::CreateNetworkContext for now. context_params->accept_language = "en-us,en"; @@ -279,6 +281,7 @@ CastNetworkContexts::CreateSystemNetworkContextParams() { network::mojom::NetworkContextParamsPtr network_context_params = CreateDefaultNetworkContextParams(); + content::UpdateCorsExemptHeader(network_context_params.get()); network_context_params->context_name = std::string("system");
diff --git a/chromecast/device/bluetooth/le/le_scan_result_test.cc b/chromecast/device/bluetooth/le/le_scan_result_test.cc index d740f03..2fefefa 100644 --- a/chromecast/device/bluetooth/le/le_scan_result_test.cc +++ b/chromecast/device/bluetooth/le/le_scan_result_test.cc
@@ -121,7 +121,7 @@ ASSERT_EQ(6ul, all_uuids->size()); auto exists = [&all_uuids](const bluetooth_v2_shlib::Uuid& uuid) { - return base::ContainsValue(*all_uuids, uuid); + return base::Contains(*all_uuids, uuid); }; EXPECT_TRUE(exists(util::UuidFromInt16(kIncompleteUuid16)));
diff --git a/chromecast/device/bluetooth/le/scan_filter.cc b/chromecast/device/bluetooth/le/scan_filter.cc index 1180ebb..1fe47180 100644 --- a/chromecast/device/bluetooth/le/scan_filter.cc +++ b/chromecast/device/bluetooth/le/scan_filter.cc
@@ -35,7 +35,7 @@ return false; } - if (!base::ContainsValue(*all_uuids, *service_uuid)) { + if (!base::Contains(*all_uuids, *service_uuid)) { return false; } }
diff --git a/chromecast/graphics/cast_focus_client_aura.cc b/chromecast/graphics/cast_focus_client_aura.cc index 8b91b46..58ced0f 100644 --- a/chromecast/graphics/cast_focus_client_aura.cc +++ b/chromecast/graphics/cast_focus_client_aura.cc
@@ -125,7 +125,7 @@ aura::Window* top_level = GetZOrderWindow(window); DCHECK(top_level); DLOG(INFO) << "Requesting focus for " << LOG_WINDOW_INFO(top_level, window); - if (!base::ContainsValue(focusable_windows_, window)) { + if (!base::Contains(focusable_windows_, window)) { // We're not yet tracking this focusable window, so start tracking it as a // potential focus target. window->AddObserver(this);
diff --git a/chromecast/media/audio/cast_audio_mixer.cc b/chromecast/media/audio/cast_audio_mixer.cc index 95a57b70..8ac2f61e 100644 --- a/chromecast/media/audio/cast_audio_mixer.cc +++ b/chromecast/media/audio/cast_audio_mixer.cc
@@ -202,7 +202,7 @@ bool CastAudioMixer::Register(MixerProxyStream* proxy_stream) { DCHECK_CALLED_ON_VALID_THREAD(audio_thread_checker_); - DCHECK(!base::ContainsKey(proxy_streams_, proxy_stream)); + DCHECK(!base::Contains(proxy_streams_, proxy_stream)); // Do not allow opening new streams while in error state. if (error_) @@ -227,7 +227,7 @@ void CastAudioMixer::Unregister(MixerProxyStream* proxy_stream) { DCHECK_CALLED_ON_VALID_THREAD(audio_thread_checker_); - DCHECK(base::ContainsKey(proxy_streams_, proxy_stream)); + DCHECK(base::Contains(proxy_streams_, proxy_stream)); proxy_streams_.erase(proxy_stream);
diff --git a/chromecast/media/cma/backend/audio_decoder_software_wrapper.cc b/chromecast/media/cma/backend/audio_decoder_software_wrapper.cc index a3fdfaa5..03be213 100644 --- a/chromecast/media/cma/backend/audio_decoder_software_wrapper.cc +++ b/chromecast/media/cma/backend/audio_decoder_software_wrapper.cc
@@ -89,7 +89,7 @@ return true; } - if (base::ContainsValue(kPassthroughCodecs, config.codec)) { + if (base::Contains(kPassthroughCodecs, config.codec)) { LOG(INFO) << "Cannot use software decoder for " << config.codec; return false; }
diff --git a/chromeos/CHROMEOS_LKGM b/chromeos/CHROMEOS_LKGM index d15601bc..ad17fcd 100644 --- a/chromeos/CHROMEOS_LKGM +++ b/chromeos/CHROMEOS_LKGM
@@ -1 +1 @@ -12248.0.0 \ No newline at end of file +12258.0.0 \ No newline at end of file
diff --git a/chromeos/audio/audio_devices_pref_handler_stub.cc b/chromeos/audio/audio_devices_pref_handler_stub.cc index 996d47b..e0135de5 100644 --- a/chromeos/audio/audio_devices_pref_handler_stub.cc +++ b/chromeos/audio/audio_devices_pref_handler_stub.cc
@@ -15,9 +15,8 @@ double AudioDevicesPrefHandlerStub::GetOutputVolumeValue( const AudioDevice* device) { - if (!device || - !base::ContainsKey(audio_device_volume_gain_map_, - device->stable_device_id)) { + if (!device || !base::Contains(audio_device_volume_gain_map_, + device->stable_device_id)) { return kDefaultOutputVolumePercent; } return audio_device_volume_gain_map_[device->stable_device_id]; @@ -26,9 +25,8 @@ double AudioDevicesPrefHandlerStub::GetInputGainValue( const AudioDevice* device) { // TODO(rkc): The default value for gain is wrong. http://crbug.com/442489 - if (!device || - !base::ContainsKey(audio_device_volume_gain_map_, - device->stable_device_id)) { + if (!device || !base::Contains(audio_device_volume_gain_map_, + device->stable_device_id)) { return 75.0; } return audio_device_volume_gain_map_[device->stable_device_id];
diff --git a/chromeos/components/multidevice/remote_device_cache.cc b/chromeos/components/multidevice/remote_device_cache.cc index 4c56b10..51b10efa 100644 --- a/chromeos/components/multidevice/remote_device_cache.cc +++ b/chromeos/components/multidevice/remote_device_cache.cc
@@ -42,7 +42,7 @@ void RemoteDeviceCache::SetRemoteDevices( const RemoteDeviceList& remote_devices) { for (const auto& remote_device : remote_devices) { - if (base::ContainsKey(remote_device_map_, remote_device.GetDeviceId())) { + if (base::Contains(remote_device_map_, remote_device.GetDeviceId())) { // TODO(khorimoto): Do not overwrite device metadata if the new device // contains a stale timestamp; see https://crbug.com/856746. @@ -71,7 +71,7 @@ base::Optional<RemoteDeviceRef> RemoteDeviceCache::GetRemoteDevice( const std::string& device_id) const { - if (!base::ContainsKey(remote_device_map_, device_id)) + if (!base::Contains(remote_device_map_, device_id)) return base::nullopt; return RemoteDeviceRef(remote_device_map_.at(device_id));
diff --git a/chromeos/components/multidevice/remote_device_ref.cc b/chromeos/components/multidevice/remote_device_ref.cc index 5ef5be60..87740b6 100644 --- a/chromeos/components/multidevice/remote_device_ref.cc +++ b/chromeos/components/multidevice/remote_device_ref.cc
@@ -31,7 +31,7 @@ SoftwareFeatureState RemoteDeviceRef::GetSoftwareFeatureState( const SoftwareFeature& software_feature) const { - if (!base::ContainsKey(remote_device_->software_features, software_feature)) + if (!base::Contains(remote_device_->software_features, software_feature)) return SoftwareFeatureState::kNotSupported; return remote_device_->software_features.at(software_feature);
diff --git a/chromeos/components/nearby/count_down_latch_impl_unittest.cc b/chromeos/components/nearby/count_down_latch_impl_unittest.cc index 4bccda9f..8d4a952 100644 --- a/chromeos/components/nearby/count_down_latch_impl_unittest.cc +++ b/chromeos/components/nearby/count_down_latch_impl_unittest.cc
@@ -59,7 +59,7 @@ const base::UnguessableToken& id, const location::nearby::Exception::Value& expected_exception) { base::AutoLock al(map_lock_); - EXPECT_TRUE(base::ContainsKey(id_to_result_map_, id)); + EXPECT_TRUE(base::Contains(id_to_result_map_, id)); EXPECT_TRUE(id_to_result_map_[id]); EXPECT_EQ(expected_exception, id_to_result_map_[id]->exception()); } @@ -67,7 +67,7 @@ void VerifyBoolResultForAttemptId(const base::UnguessableToken& id, bool expected_result) { base::AutoLock al(map_lock_); - EXPECT_TRUE(base::ContainsKey(id_to_result_map_, id)); + EXPECT_TRUE(base::Contains(id_to_result_map_, id)); EXPECT_TRUE(id_to_result_map_[id]); EXPECT_TRUE(id_to_result_map_[id]->ok()); EXPECT_EQ(expected_result, id_to_result_map_[id]->result());
diff --git a/chromeos/components/nearby/lock_impl_unittest.cc b/chromeos/components/nearby/lock_impl_unittest.cc index 95ef1084..7564cf7 100644 --- a/chromeos/components/nearby/lock_impl_unittest.cc +++ b/chromeos/components/nearby/lock_impl_unittest.cc
@@ -74,8 +74,7 @@ bool HasSuccessfullyLockedWithAttemptId( const base::UnguessableToken& attempt_id) { lock_->lock(); - bool contains_key = - base::ContainsKey(successful_lock_attempts_, attempt_id); + bool contains_key = base::Contains(successful_lock_attempts_, attempt_id); lock_->unlock(); return contains_key; }
diff --git a/chromeos/components/nearby/settable_future_impl_unittest.cc b/chromeos/components/nearby/settable_future_impl_unittest.cc index e43ced85..a501740 100644 --- a/chromeos/components/nearby/settable_future_impl_unittest.cc +++ b/chromeos/components/nearby/settable_future_impl_unittest.cc
@@ -64,7 +64,7 @@ void VerifyAsyncResultForId(const base::UnguessableToken& id, bool expected_result) { base::AutoLock al(map_lock_); - EXPECT_TRUE(base::ContainsKey(id_to_async_result_map_, id)); + EXPECT_TRUE(base::Contains(id_to_async_result_map_, id)); EXPECT_TRUE(id_to_async_result_map_[id]); EXPECT_TRUE(id_to_async_result_map_[id]->ok()); EXPECT_EQ(expected_result, id_to_async_result_map_[id]->result());
diff --git a/chromeos/components/tether/active_host_network_state_updater_unittest.cc b/chromeos/components/tether/active_host_network_state_updater_unittest.cc index 277277e..31819c0 100644 --- a/chromeos/components/tether/active_host_network_state_updater_unittest.cc +++ b/chromeos/components/tether/active_host_network_state_updater_unittest.cc
@@ -8,7 +8,7 @@ #include "base/logging.h" #include "base/memory/ptr_util.h" -#include "base/message_loop/message_loop.h" +#include "base/test/scoped_task_environment.h" #include "chromeos/components/tether/fake_active_host.h" #include "chromeos/network/network_state.h" #include "chromeos/network/network_state_handler.h" @@ -98,7 +98,7 @@ EXPECT_TRUE(network_state->IsConnectedState()); } - base::MessageLoop message_loop_; + base::test::ScopedTaskEnvironment scoped_task_environment_; NetworkStateTestHelper helper_{true /* use_default_devices_and_services */};
diff --git a/chromeos/components/tether/disconnect_tethering_request_sender_impl.cc b/chromeos/components/tether/disconnect_tethering_request_sender_impl.cc index 4a28219..a059c368 100644 --- a/chromeos/components/tether/disconnect_tethering_request_sender_impl.cc +++ b/chromeos/components/tether/disconnect_tethering_request_sender_impl.cc
@@ -63,7 +63,7 @@ void DisconnectTetheringRequestSenderImpl::SendDisconnectRequestToDevice( const std::string& device_id) { - if (base::ContainsKey(device_id_to_operation_map_, device_id)) + if (base::Contains(device_id_to_operation_map_, device_id)) return; num_pending_host_fetches_++; @@ -126,7 +126,7 @@ bool had_pending_requests = HasPendingRequests(); - if (base::ContainsKey(device_id_to_operation_map_, device_id)) { + if (base::Contains(device_id_to_operation_map_, device_id)) { // Regardless of success/failure, unregister as a listener and delete the // operation. device_id_to_operation_map_.at(device_id)->RemoveObserver(this);
diff --git a/chromeos/components/tether/host_scan_scheduler_impl_unittest.cc b/chromeos/components/tether/host_scan_scheduler_impl_unittest.cc index 7187d80..d15e431 100644 --- a/chromeos/components/tether/host_scan_scheduler_impl_unittest.cc +++ b/chromeos/components/tether/host_scan_scheduler_impl_unittest.cc
@@ -36,12 +36,13 @@ const char kTetherGuid[] = "tetherGuid"; std::string CreateConfigurationJsonString(const std::string& guid, - const std::string& type) { + const std::string& type, + const std::string& state) { std::stringstream ss; ss << "{" << " \"GUID\": \"" << guid << "\"," << " \"Type\": \"" << type << "\"," - << " \"State\": \"" << shill::kStateReady << "\"" + << " \"State\": \"" << state << "\"" << "}"; return ss.str(); } @@ -86,10 +87,12 @@ host_scan_scheduler_->ScanRequested(type); } - void InitializeEthernet() { + void InitializeEthernet(bool is_initially_connected) { + std::string state = + is_initially_connected ? shill::kStateReady : shill::kStateIdle; ethernet_service_path_ = helper_->ConfigureService(CreateConfigurationJsonString( - kEthernetServiceGuid, shill::kTypeEthernet)); + kEthernetServiceGuid, shill::kTypeEthernet, state)); helper_->manager_test()->SetManagerProperty( shill::kDefaultServiceProperty, base::Value(ethernet_service_path_)); } @@ -135,8 +138,9 @@ helper_->network_state_handler()->AddTetherNetworkState( kTetherGuid, "name", "carrier", 100 /* battery_percentage */, 100 /* signal strength */, false /* has_connected_to_host */); - std::string wifi_service_path = helper_->ConfigureService( - CreateConfigurationJsonString(kWifiServiceGuid, shill::kTypeWifi)); + std::string wifi_service_path = + helper_->ConfigureService(CreateConfigurationJsonString( + kWifiServiceGuid, shill::kTypeWifi, shill::kStateReady)); helper_->network_state_handler() ->AssociateTetherNetworkStateWithWifiNetwork(kTetherGuid, kWifiServiceGuid); @@ -210,7 +214,7 @@ TEST_F(HostScanSchedulerImplTest, TestDeviceLockAndUnlock_Online) { // Simulate the device being online. - InitializeEthernet(); + InitializeEthernet(true /* is_initially_connected */); // Lock the screen. This should never trigger a scan. SetScreenLockedState(true /* is_locked */); @@ -337,7 +341,7 @@ } TEST_F(HostScanSchedulerImplTest, DefaultNetworkChanged) { - InitializeEthernet(); + InitializeEthernet(false /* is_initially_connected */); // When no Tether network is present, a scan should start when the default // network is disconnected.
diff --git a/chromeos/components/tether/host_scanner_operation.cc b/chromeos/components/tether/host_scanner_operation.cc index 0773d1d..8606f44 100644 --- a/chromeos/components/tether/host_scanner_operation.cc +++ b/chromeos/components/tether/host_scanner_operation.cc
@@ -177,9 +177,9 @@ void HostScannerOperation::OnDeviceAuthenticated( multidevice::RemoteDeviceRef remote_device) { - DCHECK(!base::ContainsKey( - device_id_to_tether_availability_request_start_time_map_, - remote_device.GetDeviceId())); + DCHECK( + !base::Contains(device_id_to_tether_availability_request_start_time_map_, + remote_device.GetDeviceId())); device_id_to_tether_availability_request_start_time_map_[remote_device .GetDeviceId()] = clock_->Now(); @@ -274,9 +274,8 @@ void HostScannerOperation::RecordTetherAvailabilityResponseDuration( const std::string device_id) { - if (!base::ContainsKey( - device_id_to_tether_availability_request_start_time_map_, - device_id) || + if (!base::Contains(device_id_to_tether_availability_request_start_time_map_, + device_id) || device_id_to_tether_availability_request_start_time_map_[device_id] .is_null()) { LOG(ERROR) << "Failed to record TetherAvailabilityResponse duration: "
diff --git a/chromeos/components/tether/message_transfer_operation.cc b/chromeos/components/tether/message_transfer_operation.cc index 5a01bc68..bc01277d 100644 --- a/chromeos/components/tether/message_transfer_operation.cc +++ b/chromeos/components/tether/message_transfer_operation.cc
@@ -172,8 +172,8 @@ remote_device_to_connection_attempt_delegate_map_.erase(remote_device); - if (base::ContainsKey(remote_device_to_client_channel_observer_map_, - remote_device)) { + if (base::Contains(remote_device_to_client_channel_observer_map_, + remote_device)) { remote_device_to_client_channel_observer_map_.erase(remote_device); } @@ -184,8 +184,8 @@ int MessageTransferOperation::SendMessageToDevice( multidevice::RemoteDeviceRef remote_device, std::unique_ptr<MessageWrapper> message_wrapper) { - DCHECK(base::ContainsKey(remote_device_to_client_channel_observer_map_, - remote_device)); + DCHECK(base::Contains(remote_device_to_client_channel_observer_map_, + remote_device)); int sequence_number = next_message_sequence_number_++; bool success = remote_device_to_client_channel_observer_map_[remote_device]
diff --git a/chromeos/components/tether/network_connection_handler_tether_delegate.cc b/chromeos/components/tether/network_connection_handler_tether_delegate.cc index fe62615c..3df02dc 100644 --- a/chromeos/components/tether/network_connection_handler_tether_delegate.cc +++ b/chromeos/components/tether/network_connection_handler_tether_delegate.cc
@@ -117,7 +117,7 @@ } void NetworkConnectionHandlerTetherDelegate::OnRequestSuccess(int request_num) { - DCHECK(base::ContainsKey(request_num_to_callbacks_map_, request_num)); + DCHECK(base::Contains(request_num_to_callbacks_map_, request_num)); request_num_to_callbacks_map_.at(request_num).success_callback.Run(); request_num_to_callbacks_map_.erase(request_num); } @@ -125,7 +125,7 @@ void NetworkConnectionHandlerTetherDelegate::OnRequestError( int request_num, const std::string& error_name) { - DCHECK(base::ContainsKey(request_num_to_callbacks_map_, request_num)); + DCHECK(base::Contains(request_num_to_callbacks_map_, request_num)); request_num_to_callbacks_map_.at(request_num).error_callback.Run(error_name); request_num_to_callbacks_map_.erase(request_num); }
diff --git a/chromeos/components/tether/network_host_scan_cache.cc b/chromeos/components/tether/network_host_scan_cache.cc index 8d4fdde..20293f4 100644 --- a/chromeos/components/tether/network_host_scan_cache.cc +++ b/chromeos/components/tether/network_host_scan_cache.cc
@@ -118,7 +118,7 @@ tether_network_guid); std::vector<std::string> connected_device_ids = tether_host_response_recorder_->GetPreviouslyConnectedHostIds(); - return base::ContainsValue(connected_device_ids, device_id); + return base::Contains(connected_device_ids, device_id); } } // namespace tether
diff --git a/chromeos/components/tether/network_host_scan_cache_unittest.cc b/chromeos/components/tether/network_host_scan_cache_unittest.cc index fb275f5..5febf3f 100644 --- a/chromeos/components/tether/network_host_scan_cache_unittest.cc +++ b/chromeos/components/tether/network_host_scan_cache_unittest.cc
@@ -82,8 +82,8 @@ } bool HasConnectedToHost(const std::string& tether_network_guid) { - return base::ContainsValue(has_connected_to_host_device_ids_, - tether_network_guid); + return base::Contains(has_connected_to_host_device_ids_, + tether_network_guid); } // Verifies that the information present in |expected_cache_| and
diff --git a/chromeos/components/tether/tether_connector_impl_unittest.cc b/chromeos/components/tether/tether_connector_impl_unittest.cc index 5303b1e..c4085ea9 100644 --- a/chromeos/components/tether/tether_connector_impl_unittest.cc +++ b/chromeos/components/tether/tether_connector_impl_unittest.cc
@@ -8,8 +8,8 @@ #include "base/bind.h" #include "base/memory/ptr_util.h" -#include "base/message_loop/message_loop.h" #include "base/test/metrics/histogram_tester.h" +#include "base/test/scoped_task_environment.h" #include "chromeos/components/multidevice/remote_device_ref.h" #include "chromeos/components/multidevice/remote_device_test_util.h" #include "chromeos/components/tether/connect_tethering_operation.h" @@ -313,7 +313,7 @@ } const multidevice::RemoteDeviceRefList test_devices_; - const base::MessageLoop message_loop_; + base::test::ScopedTaskEnvironment scoped_task_environment_; NetworkStateTestHelper helper_{true /* use_default_devices_and_services */}; std::unique_ptr<FakeConnectTetheringOperationFactory> fake_operation_factory_;
diff --git a/chromeos/components/tether/tether_network_disconnection_handler_unittest.cc b/chromeos/components/tether/tether_network_disconnection_handler_unittest.cc index 571356f..bf6d340 100644 --- a/chromeos/components/tether/tether_network_disconnection_handler_unittest.cc +++ b/chromeos/components/tether/tether_network_disconnection_handler_unittest.cc
@@ -170,7 +170,7 @@ SetWiFiTechnologyStateEnabled(false); std::unique_ptr<NetworkState> network = - std::make_unique<NetworkState>(kWifiNetworkGuid); + std::make_unique<NetworkState>(wifi_service_path_); network->SetGuid(kWifiNetworkGuid); handler_->NetworkConnectionStateChanged(network.get());
diff --git a/chromeos/components/tether/wifi_hotspot_disconnector_impl_unittest.cc b/chromeos/components/tether/wifi_hotspot_disconnector_impl_unittest.cc index 80bf490a..32535163 100644 --- a/chromeos/components/tether/wifi_hotspot_disconnector_impl_unittest.cc +++ b/chromeos/components/tether/wifi_hotspot_disconnector_impl_unittest.cc
@@ -230,7 +230,7 @@ SimulateConnectionToWifiNetwork(); SetWifiNetworkToDisconnected(); - CallDisconnect(wifi_service_path_); + CallDisconnect(kWifiNetworkGuid); EXPECT_EQ(NetworkConnectionHandler::kErrorNotConnected, GetResultAndReset()); // Configuration should not have been removed. @@ -243,7 +243,7 @@ should_disconnect_successfully_ = false; - CallDisconnect(wifi_service_path_); + CallDisconnect(kWifiNetworkGuid); EXPECT_EQ(NetworkConnectionHandler::kErrorDisconnectFailed, GetResultAndReset()); @@ -260,7 +260,7 @@ TEST_F(WifiHotspotDisconnectorImplTest, WifiDisconnectionSucceeds) { SimulateConnectionToWifiNetwork(); - CallDisconnect(wifi_service_path_); + CallDisconnect(kWifiNetworkGuid); EXPECT_EQ(kSuccessResult, GetResultAndReset()); // The Wi-Fi network should be disconnected.
diff --git a/chromeos/dbus/biod/biod_client_unittest.cc b/chromeos/dbus/biod/biod_client_unittest.cc index 8ad8958b..6f70b6b 100644 --- a/chromeos/dbus/biod/biod_client_unittest.cc +++ b/chromeos/dbus/biod/biod_client_unittest.cc
@@ -10,9 +10,9 @@ #include <utility> #include "base/bind.h" -#include "base/message_loop/message_loop.h" #include "base/run_loop.h" #include "base/strings/stringprintf.h" +#include "base/test/scoped_task_environment.h" #include "chromeos/dbus/biod/messages.pb.h" #include "chromeos/dbus/biod/test_utils.h" #include "dbus/mock_bus.h" @@ -158,7 +158,7 @@ std::map<std::string, std::unique_ptr<dbus::Response>> pending_method_calls_; - base::MessageLoop message_loop_; + base::test::ScopedTaskEnvironment scoped_task_environment_; // Mock bus and proxy for simulating calls. scoped_refptr<dbus::MockBus> bus_; @@ -182,7 +182,7 @@ dbus::ObjectProxy::OnConnectedCallback* on_connected_callback) { EXPECT_EQ(interface_name, kInterface); signal_callbacks_[signal_name] = signal_callback; - message_loop_.task_runner()->PostTask( + scoped_task_environment_.GetMainThreadTaskRunner()->PostTask( FROM_HERE, base::BindOnce(std::move(*on_connected_callback), interface_name, signal_name, true /* success */)); @@ -197,7 +197,7 @@ auto pending_response = std::move(it->second); pending_method_calls_.erase(it); - message_loop_.task_runner()->PostTask( + scoped_task_environment_.GetMainThreadTaskRunner()->PostTask( FROM_HERE, base::BindOnce(&RunResponseCallback, std::move(*callback), std::move(pending_response))); }
diff --git a/chromeos/dbus/biod/fake_biod_client.cc b/chromeos/dbus/biod/fake_biod_client.cc index 9f3176e..0d42e82c 100644 --- a/chromeos/dbus/biod/fake_biod_client.cc +++ b/chromeos/dbus/biod/fake_biod_client.cc
@@ -97,7 +97,7 @@ // more than five entries. for (const auto& entry : records_) { const std::unique_ptr<FakeRecord>& record = entry.second; - if (base::ContainsValue(record->fake_fingerprint, fingerprint)) { + if (base::Contains(record->fake_fingerprint, fingerprint)) { const std::string& user_id = record->user_id; matches[user_id].push_back(entry.first); }
diff --git a/chromeos/dbus/cec_service_client_unittest.cc b/chromeos/dbus/cec_service_client_unittest.cc index 08b1075d..48bde64 100644 --- a/chromeos/dbus/cec_service_client_unittest.cc +++ b/chromeos/dbus/cec_service_client_unittest.cc
@@ -11,9 +11,9 @@ #include "base/bind.h" #include "base/bind_helpers.h" #include "base/memory/ref_counted.h" -#include "base/message_loop/message_loop.h" #include "base/run_loop.h" #include "base/test/mock_callback.h" +#include "base/test/scoped_task_environment.h" #include "base/threading/thread_task_runner_handle.h" #include "chromeos/dbus/dbus_client_implementation_type.h" #include "dbus/bus.h" @@ -104,7 +104,7 @@ } protected: - base::MessageLoop message_loop_; + base::test::ScopedTaskEnvironment scoped_task_environment_; std::unique_ptr<CecServiceClient> client_; scoped_refptr<dbus::MockBus> mock_bus_; scoped_refptr<dbus::MockObjectProxy> mock_proxy_;
diff --git a/chromeos/dbus/cryptohome/fake_cryptohome_client.cc b/chromeos/dbus/cryptohome/fake_cryptohome_client.cc index bb6e3b7c..2cd6e20 100644 --- a/chromeos/dbus/cryptohome/fake_cryptohome_client.cc +++ b/chromeos/dbus/cryptohome/fake_cryptohome_client.cc
@@ -403,11 +403,11 @@ bool result = false; switch (key_type) { case attestation::KEY_DEVICE: - result = base::ContainsKey(device_certificate_map_, key_name); + result = base::Contains(device_certificate_map_, key_name); break; case attestation::KEY_USER: - result = base::ContainsKey(user_certificate_map_, - std::make_pair(cryptohome_id, key_name)); + result = base::Contains(user_certificate_map_, + std::make_pair(cryptohome_id, key_name)); break; }
diff --git a/chromeos/dbus/fake_debug_daemon_client.cc b/chromeos/dbus/fake_debug_daemon_client.cc index a731901f..8bdd65d 100644 --- a/chromeos/dbus/fake_debug_daemon_client.cc +++ b/chromeos/dbus/fake_debug_daemon_client.cc
@@ -222,7 +222,7 @@ const std::string& name, DebugDaemonClient::CupsRemovePrinterCallback callback, const base::Closure& error_callback) { - const bool has_printer = base::ContainsKey(printers_, name); + const bool has_printer = base::Contains(printers_, name); if (has_printer) printers_.erase(name);
diff --git a/chromeos/dbus/fake_image_loader_client.cc b/chromeos/dbus/fake_image_loader_client.cc index 4f1d402..6310e0a5 100644 --- a/chromeos/dbus/fake_image_loader_client.cc +++ b/chromeos/dbus/fake_image_loader_client.cc
@@ -27,7 +27,7 @@ } bool FakeImageLoaderClient::IsLoaded(const std::string& name) const { - return base::ContainsKey(loaded_components_, name); + return base::Contains(loaded_components_, name); } base::FilePath FakeImageLoaderClient::GetComponentInstallPath(
diff --git a/chromeos/dbus/oobe_configuration_client_unittest.cc b/chromeos/dbus/oobe_configuration_client_unittest.cc index 56e8aa7b..393544a 100644 --- a/chromeos/dbus/oobe_configuration_client_unittest.cc +++ b/chromeos/dbus/oobe_configuration_client_unittest.cc
@@ -8,8 +8,8 @@ #include <string> #include "base/bind.h" -#include "base/message_loop/message_loop.h" #include "base/run_loop.h" +#include "base/test/scoped_task_environment.h" #include "chromeos/dbus/oobe_config/oobe_config.pb.h" #include "dbus/message.h" #include "dbus/mock_bus.h" @@ -102,7 +102,7 @@ // The client to be tested. std::unique_ptr<OobeConfigurationClient> client_; // A message loop to emulate asynchronous behavior. - base::MessageLoop message_loop_; + base::test::ScopedTaskEnvironment scoped_task_environment_; // The mock bus. scoped_refptr<dbus::MockBus> mock_bus_; // The mock object proxy. @@ -125,7 +125,7 @@ EXPECT_EQ(expected_method_name_, method_call->GetMember()); dbus::MessageReader reader(method_call); argument_checker_.Run(&reader); - message_loop_.task_runner()->PostTask( + scoped_task_environment_.GetMainThreadTaskRunner()->PostTask( FROM_HERE, base::BindOnce(std::move(*response), response_)); } };
diff --git a/chromeos/dbus/power/power_manager_client_unittest.cc b/chromeos/dbus/power/power_manager_client_unittest.cc index 51aeaec1..1726a13 100644 --- a/chromeos/dbus/power/power_manager_client_unittest.cc +++ b/chromeos/dbus/power/power_manager_client_unittest.cc
@@ -14,8 +14,8 @@ #include "base/macros.h" #include "base/memory/ref_counted.h" #include "base/memory/weak_ptr.h" -#include "base/message_loop/message_loop.h" #include "base/run_loop.h" +#include "base/test/scoped_task_environment.h" #include "base/unguessable_token.h" #include "chromeos/dbus/power_manager/suspend.pb.h" #include "dbus/mock_bus.h" @@ -210,9 +210,11 @@ .WillRepeatedly(Return(proxy_.get())); EXPECT_CALL(*bus_, GetDBusTaskRunner()) - .WillRepeatedly(Return(message_loop_.task_runner().get())); + .WillRepeatedly( + Return(scoped_task_environment_.GetMainThreadTaskRunner().get())); EXPECT_CALL(*bus_, GetOriginTaskRunner()) - .WillRepeatedly(Return(message_loop_.task_runner().get())); + .WillRepeatedly( + Return(scoped_task_environment_.GetMainThreadTaskRunner().get())); // Save |client_|'s signal and name-owner-changed callbacks. EXPECT_CALL(*proxy_, DoConnectToSignal(kInterface, _, _, _)) @@ -295,7 +297,7 @@ static const int kSuspendDelayId = 100; static const int kDarkSuspendDelayId = 200; - base::MessageLoop message_loop_; + base::test::ScopedTaskEnvironment scoped_task_environment_; // Mock bus and proxy for simulating calls to powerd. scoped_refptr<dbus::MockBus> bus_; @@ -321,7 +323,7 @@ CHECK_EQ(interface_name, power_manager::kPowerManagerInterface); signal_callbacks_[signal_name] = signal_callback; - message_loop_.task_runner()->PostTask( + scoped_task_environment_.GetMainThreadTaskRunner()->PostTask( FROM_HERE, base::BindOnce(std::move(*on_connected_callback), interface_name, signal_name, true /* success */)); @@ -342,7 +344,7 @@ dbus::Response::FromMethodCall(method_call)); CHECK(dbus::MessageWriter(response.get()).AppendProtoAsArrayOfBytes(proto)); - message_loop_.task_runner()->PostTask( + scoped_task_environment_.GetMainThreadTaskRunner()->PostTask( FROM_HERE, base::BindOnce(&RunResponseCallback, std::move(*callback), std::move(response))); }
diff --git a/chromeos/dbus/power/power_policy_controller_unittest.cc b/chromeos/dbus/power/power_policy_controller_unittest.cc index 3615f79..a64c1864 100644 --- a/chromeos/dbus/power/power_policy_controller_unittest.cc +++ b/chromeos/dbus/power/power_policy_controller_unittest.cc
@@ -6,8 +6,8 @@ #include <memory> -#include "base/message_loop/message_loop.h" #include "base/run_loop.h" +#include "base/test/scoped_task_environment.h" #include "chromeos/dbus/power/fake_power_manager_client.h" #include "chromeos/dbus/power_manager/backlight.pb.h" #include "testing/gtest/include/gtest/gtest.h" @@ -38,7 +38,7 @@ } PowerPolicyController* policy_controller_; - base::MessageLoop message_loop_; + base::test::ScopedTaskEnvironment scoped_task_environment_; private: DISALLOW_COPY_AND_ASSIGN(PowerPolicyControllerTest);
diff --git a/chromeos/dbus/shill/fake_shill_manager_client.cc b/chromeos/dbus/shill/fake_shill_manager_client.cc index 437fa1a3..5b3699a 100644 --- a/chromeos/dbus/shill/fake_shill_manager_client.cc +++ b/chromeos/dbus/shill/fake_shill_manager_client.cc
@@ -357,26 +357,26 @@ return; } - // For the purposes of this stub, we're going to assume that the GUID property - // is set to the service path because we don't want to re-implement Shill's - // property matching magic here. - std::string service_path = guid; - std::string ipconfig_path; properties.GetString(shill::kIPConfigProperty, &ipconfig_path); - // Merge the new properties with existing properties, if any. - const base::DictionaryValue* existing_properties = - service_client->GetServiceProperties(service_path); - if (!existing_properties) { - // Add a new service to the service client stub because none exists, yet. - // This calls AddManagerService. + std::string service_path = service_client->FindServiceMatchingGUID(guid); + if (service_path.empty()) + service_path = service_client->FindSimilarService(properties); + if (service_path.empty()) { + // In the stub, service paths don't have to be DBus paths, so build + // something out of the GUID as service path. + // Don't use the GUID itself, so tests are forced to distinguish between + // service paths and GUIDs instead of assuming that service path == GUID. + service_path = "service_path_for_" + guid; service_client->AddServiceWithIPConfig( service_path, guid /* guid */, guid /* name */, type, shill::kStateIdle, ipconfig_path, true /* visible */); - existing_properties = service_client->GetServiceProperties(service_path); } + // Merge the new properties with existing properties. + const base::DictionaryValue* existing_properties = + service_client->GetServiceProperties(service_path); std::unique_ptr<base::DictionaryValue> merged_properties( existing_properties->DeepCopy()); merged_properties->MergeDictionary(&properties); @@ -602,6 +602,9 @@ complete_dict_list.emplace_back(std::move(properties_copy)); } + if (complete_dict_list.empty()) + return; + // Sort the service list using the same logic as Shill's Service::Compare. std::sort(complete_dict_list.begin(), complete_dict_list.end(), CompareNetworks);
diff --git a/chromeos/dbus/shill/fake_shill_profile_client.cc b/chromeos/dbus/shill/fake_shill_profile_client.cc index 7e0dc1b0a..f91ccee 100644 --- a/chromeos/dbus/shill/fake_shill_profile_client.cc +++ b/chromeos/dbus/shill/fake_shill_profile_client.cc
@@ -102,8 +102,10 @@ const base::Closure& callback, const ErrorCallback& error_callback) { ProfileProperties* profile = GetProfile(profile_path, error_callback); - if (!profile) + if (!profile) { + error_callback.Run("Error.InvalidProfile", profile_path.value()); return; + } if (!profile->entries.RemoveWithoutPathExpansion(entry_path, nullptr)) { error_callback.Run("Error.InvalidProfileEntry", entry_path);
diff --git a/chromeos/dbus/shill/fake_shill_service_client.cc b/chromeos/dbus/shill/fake_shill_service_client.cc index 50931c0..0944ecb 100644 --- a/chromeos/dbus/shill/fake_shill_service_client.cc +++ b/chromeos/dbus/shill/fake_shill_service_client.cc
@@ -14,6 +14,7 @@ #include "base/single_thread_task_runner.h" #include "base/strings/string_number_conversions.h" #include "base/strings/string_util.h" +#include "base/task_runner.h" #include "base/threading/thread_task_runner_handle.h" #include "base/values.h" #include "chromeos/dbus/shill/shill_device_client.h" @@ -44,6 +45,81 @@ return ShillManagerClient::Get()->GetTestInterface()->GetInteractiveDelay(); } +// Extracts the hex SSID from shill |service_properties|. +std::string GetHexSSID(const base::Value& service_properties) { + const std::string* hex_ssid = + service_properties.FindStringKey(shill::kWifiHexSsid); + if (hex_ssid) + return *hex_ssid; + const std::string* ssid = + service_properties.FindStringKey(shill::kSSIDProperty); + if (ssid) + return base::HexEncode(ssid->c_str(), ssid->size()); + return std::string(); +} + +std::string GetSecurityClass(const base::Value& service_properties) { + // Mimics shill's WiFiProvider::GetServiceParametersFromStorage with + // WiFiService::ComputeSecurityClass . + const std::string* security_class = + service_properties.FindStringKey(shill::kSecurityClassProperty); + const std::string* security = + service_properties.FindStringKey(shill::kSecurityProperty); + if (security_class && security && *security_class != *security) { + LOG(ERROR) << "Mismatch between SecurityClass " << *security_class + << " and Security " << *security; + } + + if (security_class) + return *security_class; + + if (security) { + if (*security == shill::kSecurityRsn || *security == shill::kSecurityWpa) + return shill::kSecurityPsk; + return *security; + } + + return shill::kSecurityNone; +} + +// Returns true if both |template_service_properties| and |service_properties| +// have the key |key| and both have the same value for it. +bool HaveSameValueForKey(const base::Value& template_service_properties, + const base::Value& service_properties, + base::StringPiece key) { + const base::Value* template_service_value = + template_service_properties.FindKey(key); + const base::Value* service_value = service_properties.FindKey(key); + return template_service_value && service_value && + *template_service_value == *service_value; +} + +// Mimics shill's similar service matching logic. This is only invoked if +// |template_service_properties| and |service_properties| refer to a service of +// the same type. +bool IsSimilarService(const std::string& service_type, + const base::Value& template_service_properties, + const base::Value& service_properties) { + if (service_type == shill::kTypeWifi) { + // Mimics shill's WiFiProvider::FindSimilarService. + return GetHexSSID(template_service_properties) == + GetHexSSID(service_properties) && + HaveSameValueForKey(template_service_properties, service_properties, + shill::kModeProperty) && + GetSecurityClass(template_service_properties) == + GetSecurityClass(service_properties); + } + + // Assume that Ethernet / EthernetEAP services are always similar. + if (service_type == shill::kTypeEthernet || + service_type == shill::kTypeEthernetEap) { + // Mimics shill's EthernetProvider::FindSimilarService. + return true; + } + + return false; +} + } // namespace FakeShillServiceClient::FakeShillServiceClient() : weak_ptr_factory_(this) {} @@ -85,10 +161,14 @@ call_status = DBUS_METHOD_CALL_FAILURE; } - base::ThreadTaskRunnerHandle::Get()->PostTask( - FROM_HERE, + base::OnceClosure property_update = base::BindOnce(&PassStubServiceProperties, callback, call_status, - base::Owned(result_properties.release()))); + base::Owned(result_properties.release())); + if (hold_back_service_property_updates_) + recorded_property_updates_.push_back(std::move(property_update)); + else + base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, + std::move(property_update)); } void FakeShillServiceClient::SetProperty(const dbus::ObjectPath& service_path, @@ -461,11 +541,15 @@ } // Notifiy Chrome of the property change. - base::ThreadTaskRunnerHandle::Get()->PostTask( - FROM_HERE, + base::OnceClosure property_update = base::BindOnce(&FakeShillServiceClient::NotifyObserversPropertyChanged, weak_ptr_factory_.GetWeakPtr(), - dbus::ObjectPath(service_path), changed_property)); + dbus::ObjectPath(service_path), changed_property); + if (hold_back_service_property_updates_) + recorded_property_updates_.push_back(std::move(property_update)); + else + base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, + std::move(property_update)); return true; } @@ -476,6 +560,46 @@ return properties; } +std::string FakeShillServiceClient::FindServiceMatchingGUID( + const std::string& guid) { + for (const auto& service_pair : stub_services_.DictItems()) { + const auto& service_path = service_pair.first; + const auto& service_properties = service_pair.second; + + const std::string* service_guid = + service_properties.FindStringKey(shill::kGuidProperty); + if (service_guid && *service_guid == guid) + return service_path; + } + + return std::string(); +} + +std::string FakeShillServiceClient::FindSimilarService( + const base::Value& template_service_properties) { + const std::string* template_type = + template_service_properties.FindStringKey(shill::kTypeProperty); + if (!template_type) + return std::string(); + + for (const auto& service_pair : stub_services_.DictItems()) { + const auto& service_path = service_pair.first; + const auto& service_properties = service_pair.second; + + const std::string* service_type = + service_properties.FindStringKey(shill::kTypeProperty); + if (!service_type || *service_type != *template_type) + continue; + + if (IsSimilarService(*service_type, template_service_properties, + service_properties)) { + return service_path; + } + } + + return std::string(); +} + void FakeShillServiceClient::ClearServices() { ShillManagerClient::Get()->GetTestInterface()->ClearManagerServices(); stub_services_.Clear(); @@ -487,6 +611,19 @@ connect_behavior_[service_path] = behavior; } +void FakeShillServiceClient::SetHoldBackServicePropertyUpdates(bool hold_back) { + hold_back_service_property_updates_ = hold_back; + std::vector<base::OnceClosure> property_updates; + recorded_property_updates_.swap(property_updates); + + if (hold_back_service_property_updates_) + return; + + for (auto& property_update : property_updates) + base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, + std::move(property_update)); +} + void FakeShillServiceClient::NotifyObserversPropertyChanged( const dbus::ObjectPath& service_path, const std::string& property) { @@ -574,7 +711,7 @@ return; } - if (base::ContainsKey(connect_behavior_, service_path)) { + if (base::Contains(connect_behavior_, service_path)) { const base::Closure& custom_connect_behavior = connect_behavior_[service_path]; VLOG(1) << "Running custom connect behavior for " << service_path;
diff --git a/chromeos/dbus/shill/fake_shill_service_client.h b/chromeos/dbus/shill/fake_shill_service_client.h index 50549c6..fd8b858 100644 --- a/chromeos/dbus/shill/fake_shill_service_client.h +++ b/chromeos/dbus/shill/fake_shill_service_client.h
@@ -100,9 +100,13 @@ const base::Value& value) override; const base::DictionaryValue* GetServiceProperties( const std::string& service_path) const override; + std::string FindServiceMatchingGUID(const std::string& guid) override; + std::string FindSimilarService( + const base::Value& template_service_properties) override; void ClearServices() override; void SetConnectBehavior(const std::string& service_path, const base::Closure& behavior) override; + void SetHoldBackServicePropertyUpdates(bool hold_back) override; private: typedef base::ObserverList<ShillPropertyChangedObserver>::Unchecked @@ -130,6 +134,15 @@ std::map<dbus::ObjectPath, std::unique_ptr<PropertyObserverList>> observer_list_; + // If this is true, the FakeShillServiceClient is recording service property + // updates and will only send them when SetHoldBackServicePropertyUpdates is + // called with false again. + bool hold_back_service_property_updates_ = false; + + // Property updates that were held back while + // |hold_back_service_property_updates_| was true. + std::vector<base::OnceClosure> recorded_property_updates_; + // Note: This should remain the last member so it'll be destroyed and // invalidate its weak pointers before any other members are destroyed. base::WeakPtrFactory<FakeShillServiceClient> weak_ptr_factory_;
diff --git a/chromeos/dbus/shill/shill_manager_client.cc b/chromeos/dbus/shill/shill_manager_client.cc index bb05c859..e3a81ee 100644 --- a/chromeos/dbus/shill/shill_manager_client.cc +++ b/chromeos/dbus/shill/shill_manager_client.cc
@@ -4,6 +4,7 @@ #include "chromeos/dbus/shill/shill_manager_client.h" +#include <ios> #include <memory> #include "base/bind.h"
diff --git a/chromeos/dbus/shill/shill_service_client.h b/chromeos/dbus/shill/shill_service_client.h index 84f271ec..2974376 100644 --- a/chromeos/dbus/shill/shill_service_client.h +++ b/chromeos/dbus/shill/shill_service_client.h
@@ -76,12 +76,28 @@ virtual const base::DictionaryValue* GetServiceProperties( const std::string& service_path) const = 0; + // Returns the service path for the service which has the GUID property set + // to |guid|. If no such service exists, returns the empty string. + virtual std::string FindServiceMatchingGUID(const std::string& guid) = 0; + + // Returns the service path for a service which is similar to the service + // described by |template_service_properties|. For Wifi, this means that + // security and mode match. Returns the empty string if no similar service + // is found. + virtual std::string FindSimilarService( + const base::Value& template_service_properties) = 0; + // Clears all Services from the Manager and Service stubs. virtual void ClearServices() = 0; virtual void SetConnectBehavior(const std::string& service_path, const base::Closure& behavior) = 0; + // If |hold_back| is set to true, stops sending service property updates to + // observers and records them instead. Then if this is called again with + // |hold_back| == false, sends all recorded property updates. + virtual void SetHoldBackServicePropertyUpdates(bool hold_back) = 0; + protected: virtual ~TestInterface() {} };
diff --git a/chromeos/network/auto_connect_handler_unittest.cc b/chromeos/network/auto_connect_handler_unittest.cc index 4c5f192..a683c84 100644 --- a/chromeos/network/auto_connect_handler_unittest.cc +++ b/chromeos/network/auto_connect_handler_unittest.cc
@@ -127,6 +127,7 @@ NetworkCertLoader::ForceHardwareBackedForTesting(); LoginState::Initialize(); + LoginState::Get()->set_always_logged_in(false); network_config_handler_.reset( NetworkConfigurationHandler::InitializeForTest( @@ -275,10 +276,10 @@ namespace { -const char* kConfigUnmanagedSharedConnected = +const char* kConfigWifi0UnmanagedSharedConnected = "{ \"GUID\": \"wifi0\", \"Type\": \"wifi\", \"State\": \"online\", " " \"Security\": \"wpa\", \"Profile\": \"/profile/default\" }"; -const char* kConfigManagedSharedConnectable = +const char* kConfigWifi1ManagedSharedConnectable = "{ \"GUID\": \"wifi1\", \"Type\": \"wifi\", \"State\": \"idle\", " " \"Connectable\": true, \"Security\": \"wpa\", \"Profile\": " "\"/profile/default\" }"; @@ -315,15 +316,19 @@ } // namespace TEST_F(AutoConnectHandlerTest, ReconnectOnCertLoading) { - EXPECT_FALSE(ConfigureService(kConfigUnmanagedSharedConnected).empty()); - EXPECT_FALSE(ConfigureService(kConfigManagedSharedConnectable).empty()); - helper().manager_test()->SetBestServiceToConnect("wifi1"); + std::string wifi0_service_path = + ConfigureService(kConfigWifi0UnmanagedSharedConnected); + ASSERT_FALSE(wifi0_service_path.empty()); + std::string wifi1_service_path = + ConfigureService(kConfigWifi1ManagedSharedConnectable); + ASSERT_FALSE(wifi1_service_path.empty()); + helper().manager_test()->SetBestServiceToConnect(wifi1_service_path); // User login shouldn't trigger any change until the certificates and policy // are loaded. LoginToRegularUser(); - EXPECT_EQ(shill::kStateOnline, GetServiceState("wifi0")); - EXPECT_EQ(shill::kStateIdle, GetServiceState("wifi1")); + EXPECT_EQ(shill::kStateOnline, GetServiceState(wifi0_service_path)); + EXPECT_EQ(shill::kStateIdle, GetServiceState(wifi1_service_path)); // Applying the policy which restricts autoconnect should disconnect from the // shared, unmanaged network. @@ -336,13 +341,13 @@ base::DictionaryValue(), // no global config true); // load as user policy SetupPolicy(kPolicy, global_config, false /* load as device policy */); - EXPECT_EQ(shill::kStateIdle, GetServiceState("wifi0")); - EXPECT_EQ(shill::kStateIdle, GetServiceState("wifi1")); + EXPECT_EQ(shill::kStateIdle, GetServiceState(wifi0_service_path)); + EXPECT_EQ(shill::kStateIdle, GetServiceState(wifi1_service_path)); // Certificate loading should trigger connecting to the 'best' network. StartNetworkCertLoader(); - EXPECT_EQ(shill::kStateIdle, GetServiceState("wifi0")); - EXPECT_EQ(shill::kStateOnline, GetServiceState("wifi1")); + EXPECT_EQ(shill::kStateIdle, GetServiceState(wifi0_service_path)); + EXPECT_EQ(shill::kStateOnline, GetServiceState(wifi1_service_path)); EXPECT_EQ(1, test_observer_->num_auto_connect_events()); EXPECT_EQ(AutoConnectHandler::AUTO_CONNECT_REASON_LOGGED_IN | AutoConnectHandler::AUTO_CONNECT_REASON_POLICY_APPLIED, @@ -350,28 +355,34 @@ } TEST_F(AutoConnectHandlerTest, ReconnectOnCertPatternResolved) { - EXPECT_FALSE(ConfigureService(kConfigUnmanagedSharedConnected).empty()); - EXPECT_FALSE(ConfigureService(kConfigManagedSharedConnectable).empty()); - helper().manager_test()->SetBestServiceToConnect("wifi0"); + std::string wifi0_service_path = + ConfigureService(kConfigWifi0UnmanagedSharedConnected); + ASSERT_FALSE(wifi0_service_path.empty()); + std::string wifi1_service_path = + ConfigureService(kConfigWifi1ManagedSharedConnectable); + ASSERT_FALSE(wifi1_service_path.empty()); + helper().manager_test()->SetBestServiceToConnect(wifi0_service_path); SetupPolicy(std::string(), // no device policy base::DictionaryValue(), // no global config false); // load as device policy + EXPECT_EQ(0, test_observer_->num_auto_connect_events()); + LoginToRegularUser(); - StartNetworkCertLoader(); SetupPolicy(kPolicyCertPattern, base::DictionaryValue(), // no global config true); // load as user policy - EXPECT_EQ(2, test_observer_->num_auto_connect_events()); + StartNetworkCertLoader(); + EXPECT_EQ(1, test_observer_->num_auto_connect_events()); EXPECT_EQ(AutoConnectHandler::AUTO_CONNECT_REASON_LOGGED_IN | AutoConnectHandler::AUTO_CONNECT_REASON_POLICY_APPLIED | AutoConnectHandler::AUTO_CONNECT_REASON_CERTIFICATE_RESOLVED, test_observer_->auto_connect_reasons()); - EXPECT_EQ(shill::kStateOnline, GetServiceState("wifi0")); - EXPECT_EQ(shill::kStateIdle, GetServiceState("wifi1")); + EXPECT_EQ(shill::kStateOnline, GetServiceState(wifi0_service_path)); + EXPECT_EQ(shill::kStateIdle, GetServiceState(wifi1_service_path)); - helper().manager_test()->SetBestServiceToConnect("wifi1"); + helper().manager_test()->SetBestServiceToConnect(wifi1_service_path); TestCertResolveObserver observer(client_cert_resolver_.get()); scoped_refptr<net::X509Certificate> cert = ImportTestClientCert(); @@ -380,9 +391,9 @@ scoped_task_environment_.RunUntilIdle(); EXPECT_TRUE(observer.DidNetworkPropertiesChange()); - EXPECT_EQ(shill::kStateIdle, GetServiceState("wifi0")); - EXPECT_EQ(shill::kStateOnline, GetServiceState("wifi1")); - EXPECT_EQ(3, test_observer_->num_auto_connect_events()); + EXPECT_EQ(shill::kStateIdle, GetServiceState(wifi0_service_path)); + EXPECT_EQ(shill::kStateOnline, GetServiceState(wifi1_service_path)); + EXPECT_EQ(2, test_observer_->num_auto_connect_events()); EXPECT_EQ(AutoConnectHandler::AUTO_CONNECT_REASON_LOGGED_IN | AutoConnectHandler::AUTO_CONNECT_REASON_POLICY_APPLIED | AutoConnectHandler::AUTO_CONNECT_REASON_CERTIFICATE_RESOLVED, @@ -392,9 +403,13 @@ // Ensure that resolving of certificate patterns only triggers a reconnect if at // least one pattern was resolved. TEST_F(AutoConnectHandlerTest, NoReconnectIfNoCertResolved) { - EXPECT_FALSE(ConfigureService(kConfigUnmanagedSharedConnected).empty()); - EXPECT_FALSE(ConfigureService(kConfigManagedSharedConnectable).empty()); - helper().manager_test()->SetBestServiceToConnect("wifi0"); + std::string wifi0_service_path = + ConfigureService(kConfigWifi0UnmanagedSharedConnected); + ASSERT_FALSE(wifi0_service_path.empty()); + std::string wifi1_service_path = + ConfigureService(kConfigWifi1ManagedSharedConnectable); + ASSERT_FALSE(wifi1_service_path.empty()); + helper().manager_test()->SetBestServiceToConnect(wifi0_service_path); SetupPolicy(std::string(), // no device policy base::DictionaryValue(), // no global config @@ -405,10 +420,10 @@ base::DictionaryValue(), // no global config true); // load as user policy - EXPECT_EQ(shill::kStateOnline, GetServiceState("wifi0")); - EXPECT_EQ(shill::kStateIdle, GetServiceState("wifi1")); + EXPECT_EQ(shill::kStateOnline, GetServiceState(wifi0_service_path)); + EXPECT_EQ(shill::kStateIdle, GetServiceState(wifi1_service_path)); - helper().manager_test()->SetBestServiceToConnect("wifi1"); + helper().manager_test()->SetBestServiceToConnect(wifi1_service_path); TestCertResolveObserver observer(client_cert_resolver_.get()); scoped_refptr<net::X509Certificate> cert = ImportTestClientCert(); ASSERT_TRUE(cert.get()); @@ -416,8 +431,8 @@ scoped_task_environment_.RunUntilIdle(); EXPECT_FALSE(observer.DidNetworkPropertiesChange()); - EXPECT_EQ(shill::kStateOnline, GetServiceState("wifi0")); - EXPECT_EQ(shill::kStateIdle, GetServiceState("wifi1")); + EXPECT_EQ(shill::kStateOnline, GetServiceState(wifi0_service_path)); + EXPECT_EQ(shill::kStateIdle, GetServiceState(wifi1_service_path)); EXPECT_EQ(1, test_observer_->num_auto_connect_events()); EXPECT_EQ(AutoConnectHandler::AUTO_CONNECT_REASON_LOGGED_IN | AutoConnectHandler::AUTO_CONNECT_REASON_POLICY_APPLIED, @@ -425,15 +440,19 @@ } TEST_F(AutoConnectHandlerTest, DisconnectOnPolicyLoading) { - EXPECT_FALSE(ConfigureService(kConfigUnmanagedSharedConnected).empty()); - EXPECT_FALSE(ConfigureService(kConfigManagedSharedConnectable).empty()); + std::string wifi0_service_path = + ConfigureService(kConfigWifi0UnmanagedSharedConnected); + ASSERT_FALSE(wifi0_service_path.empty()); + std::string wifi1_service_path = + ConfigureService(kConfigWifi1ManagedSharedConnectable); + ASSERT_FALSE(wifi1_service_path.empty()); // User login and certificate loading shouldn't trigger any change until the // policy is loaded. LoginToRegularUser(); StartNetworkCertLoader(); - EXPECT_EQ(shill::kStateOnline, GetServiceState("wifi0")); - EXPECT_EQ(shill::kStateIdle, GetServiceState("wifi1")); + EXPECT_EQ(shill::kStateOnline, GetServiceState(wifi0_service_path)); + EXPECT_EQ(shill::kStateIdle, GetServiceState(wifi1_service_path)); base::DictionaryValue global_config; global_config.SetKey( @@ -447,26 +466,30 @@ SetupPolicy(kPolicy, global_config, false /* load as device policy */); // Should not trigger any change until user policy is loaded - EXPECT_EQ(shill::kStateOnline, GetServiceState("wifi0")); - EXPECT_EQ(shill::kStateIdle, GetServiceState("wifi1")); + EXPECT_EQ(shill::kStateOnline, GetServiceState(wifi0_service_path)); + EXPECT_EQ(shill::kStateIdle, GetServiceState(wifi1_service_path)); SetupPolicy(std::string(), base::DictionaryValue(), true); - EXPECT_EQ(shill::kStateIdle, GetServiceState("wifi0")); - EXPECT_EQ(shill::kStateIdle, GetServiceState("wifi1")); + EXPECT_EQ(shill::kStateIdle, GetServiceState(wifi0_service_path)); + EXPECT_EQ(shill::kStateIdle, GetServiceState(wifi1_service_path)); EXPECT_EQ(0, test_observer_->num_auto_connect_events()); } TEST_F(AutoConnectHandlerTest, DisconnectOnPolicyLoadingAllowOnlyPolicyNetworksToConnect) { - EXPECT_FALSE(ConfigureService(kConfigUnmanagedSharedConnected).empty()); - EXPECT_FALSE(ConfigureService(kConfigManagedSharedConnectable).empty()); + std::string wifi0_service_path = + ConfigureService(kConfigWifi0UnmanagedSharedConnected); + ASSERT_FALSE(wifi0_service_path.empty()); + std::string wifi1_service_path = + ConfigureService(kConfigWifi1ManagedSharedConnectable); + ASSERT_FALSE(wifi1_service_path.empty()); // User login and certificate loading shouldn't trigger any change until the // policy is loaded. LoginToRegularUser(); StartNetworkCertLoader(); - EXPECT_EQ(shill::kStateOnline, GetServiceState("wifi0")); - EXPECT_EQ(shill::kStateIdle, GetServiceState("wifi1")); + EXPECT_EQ(shill::kStateOnline, GetServiceState(wifi0_service_path)); + EXPECT_EQ(shill::kStateIdle, GetServiceState(wifi1_service_path)); base::DictionaryValue global_config; global_config.SetKey( @@ -480,52 +503,60 @@ SetupPolicy(kPolicy, global_config, false /* load as device policy */); // Should not trigger any change until user policy is loaded - EXPECT_EQ(shill::kStateOnline, GetServiceState("wifi0")); - EXPECT_EQ(shill::kStateIdle, GetServiceState("wifi1")); + EXPECT_EQ(shill::kStateOnline, GetServiceState(wifi0_service_path)); + EXPECT_EQ(shill::kStateIdle, GetServiceState(wifi1_service_path)); SetupPolicy(std::string(), base::DictionaryValue(), true); - EXPECT_EQ(shill::kStateIdle, GetServiceState("wifi0")); - EXPECT_EQ(shill::kStateIdle, GetServiceState("wifi1")); + EXPECT_EQ(shill::kStateIdle, GetServiceState(wifi0_service_path)); + EXPECT_EQ(shill::kStateIdle, GetServiceState(wifi1_service_path)); EXPECT_EQ(0, test_observer_->num_auto_connect_events()); } // After login a reconnect is triggered even if there is no managed network. TEST_F(AutoConnectHandlerTest, ReconnectAfterLogin) { - EXPECT_FALSE(ConfigureService(kConfigUnmanagedSharedConnected).empty()); - EXPECT_FALSE(ConfigureService(kConfigManagedSharedConnectable).empty()); - helper().manager_test()->SetBestServiceToConnect("wifi1"); + std::string wifi0_service_path = + ConfigureService(kConfigWifi0UnmanagedSharedConnected); + ASSERT_FALSE(wifi0_service_path.empty()); + std::string wifi1_service_path = + ConfigureService(kConfigWifi1ManagedSharedConnectable); + ASSERT_FALSE(wifi1_service_path.empty()); + helper().manager_test()->SetBestServiceToConnect(wifi1_service_path); // User login and certificate loading shouldn't trigger any change until the // policy is loaded. LoginToRegularUser(); StartNetworkCertLoader(); - EXPECT_EQ(shill::kStateOnline, GetServiceState("wifi0")); - EXPECT_EQ(shill::kStateIdle, GetServiceState("wifi1")); + EXPECT_EQ(shill::kStateOnline, GetServiceState(wifi0_service_path)); + EXPECT_EQ(shill::kStateIdle, GetServiceState(wifi1_service_path)); // Applying an empty device policy will not trigger anything yet, until also // the user policy is applied. SetupPolicy(std::string(), // no network configs base::DictionaryValue(), // no global config false); // load as device policy - EXPECT_EQ(shill::kStateOnline, GetServiceState("wifi0")); - EXPECT_EQ(shill::kStateIdle, GetServiceState("wifi1")); + EXPECT_EQ(shill::kStateOnline, GetServiceState(wifi0_service_path)); + EXPECT_EQ(shill::kStateIdle, GetServiceState(wifi1_service_path)); // Applying also an empty user policy should trigger connecting to the 'best' // network. SetupPolicy(std::string(), // no network configs base::DictionaryValue(), // no global config true); // load as user policy - EXPECT_EQ(shill::kStateIdle, GetServiceState("wifi0")); - EXPECT_EQ(shill::kStateOnline, GetServiceState("wifi1")); + EXPECT_EQ(shill::kStateIdle, GetServiceState(wifi0_service_path)); + EXPECT_EQ(shill::kStateOnline, GetServiceState(wifi1_service_path)); EXPECT_EQ(1, test_observer_->num_auto_connect_events()); EXPECT_EQ(AutoConnectHandler::AUTO_CONNECT_REASON_LOGGED_IN, test_observer_->auto_connect_reasons()); } TEST_F(AutoConnectHandlerTest, ManualConnectAbortsReconnectAfterLogin) { - EXPECT_FALSE(ConfigureService(kConfigUnmanagedSharedConnected).empty()); - EXPECT_FALSE(ConfigureService(kConfigManagedSharedConnectable).empty()); - helper().manager_test()->SetBestServiceToConnect("wifi1"); + std::string wifi0_service_path = + ConfigureService(kConfigWifi0UnmanagedSharedConnected); + ASSERT_FALSE(wifi0_service_path.empty()); + std::string wifi1_service_path = + ConfigureService(kConfigWifi1ManagedSharedConnectable); + ASSERT_FALSE(wifi1_service_path.empty()); + helper().manager_test()->SetBestServiceToConnect(wifi1_service_path); // User login and certificate loading shouldn't trigger any change until the // policy is loaded. @@ -535,8 +566,8 @@ base::DictionaryValue(), // no global config false); // load as device policy - EXPECT_EQ(shill::kStateOnline, GetServiceState("wifi0")); - EXPECT_EQ(shill::kStateIdle, GetServiceState("wifi1")); + EXPECT_EQ(shill::kStateOnline, GetServiceState(wifi0_service_path)); + EXPECT_EQ(shill::kStateIdle, GetServiceState(wifi1_service_path)); // A manual connect request should prevent a reconnect after login. auto_connect_handler_->ConnectToNetworkRequested( @@ -547,20 +578,24 @@ SetupPolicy(std::string(), // no network configs base::DictionaryValue(), // no global config true); // load as user policy - EXPECT_EQ(shill::kStateOnline, GetServiceState("wifi0")); - EXPECT_EQ(shill::kStateIdle, GetServiceState("wifi1")); + EXPECT_EQ(shill::kStateOnline, GetServiceState(wifi0_service_path)); + EXPECT_EQ(shill::kStateIdle, GetServiceState(wifi1_service_path)); EXPECT_EQ(0, test_observer_->num_auto_connect_events()); } TEST_F(AutoConnectHandlerTest, DisconnectFromBlacklistedNetwork) { - EXPECT_FALSE(ConfigureService(kConfigUnmanagedSharedConnected).empty()); - EXPECT_FALSE(ConfigureService(kConfigManagedSharedConnectable).empty()); + std::string wifi0_service_path = + ConfigureService(kConfigWifi0UnmanagedSharedConnected); + ASSERT_FALSE(wifi0_service_path.empty()); + std::string wifi1_service_path = + ConfigureService(kConfigWifi1ManagedSharedConnectable); + ASSERT_FALSE(wifi1_service_path.empty()); LoginToRegularUser(); StartNetworkCertLoader(); - EXPECT_EQ(shill::kStateOnline, GetServiceState("wifi0")); - EXPECT_EQ(shill::kStateIdle, GetServiceState("wifi1")); - EXPECT_TRUE(helper().profile_test()->HasService("wifi0")); + EXPECT_EQ(shill::kStateOnline, GetServiceState(wifi0_service_path)); + EXPECT_EQ(shill::kStateIdle, GetServiceState(wifi1_service_path)); + EXPECT_TRUE(helper().profile_test()->HasService(wifi0_service_path)); // Apply a device policy, which blocks wifi0. No disconnects should occur // since we wait for both device & user policy before possibly disconnecting. @@ -570,30 +605,34 @@ global_config.SetKey(::onc::global_network_config::kBlacklistedHexSSIDs, base::Value(blacklist)); SetupPolicy(std::string(), global_config, false /* load as device policy */); - EXPECT_EQ(shill::kStateOnline, GetServiceState("wifi0")); - EXPECT_EQ(shill::kStateIdle, GetServiceState("wifi1")); - EXPECT_TRUE(helper().profile_test()->HasService("wifi0")); + EXPECT_EQ(shill::kStateOnline, GetServiceState(wifi0_service_path)); + EXPECT_EQ(shill::kStateIdle, GetServiceState(wifi1_service_path)); + EXPECT_TRUE(helper().profile_test()->HasService(wifi0_service_path)); // Apply an empty user policy (no whitelist for wifi0). Connection to wifi0 // should be disconnected due to being blacklisted. SetupPolicy(std::string(), base::DictionaryValue(), true /* load as user policy */); - EXPECT_EQ(shill::kStateIdle, GetServiceState("wifi0")); - EXPECT_EQ(shill::kStateIdle, GetServiceState("wifi1")); - EXPECT_FALSE(helper().profile_test()->HasService("wifi0")); + EXPECT_EQ(shill::kStateIdle, GetServiceState(wifi0_service_path)); + EXPECT_EQ(shill::kStateIdle, GetServiceState(wifi1_service_path)); + EXPECT_FALSE(helper().profile_test()->HasService(wifi0_service_path)); EXPECT_EQ(0, test_observer_->num_auto_connect_events()); } TEST_F(AutoConnectHandlerTest, AllowOnlyPolicyNetworksToConnectIfAvailable) { - EXPECT_FALSE(ConfigureService(kConfigUnmanagedSharedConnected).empty()); - EXPECT_FALSE(ConfigureService(kConfigManagedSharedConnectable).empty()); + std::string wifi0_service_path = + ConfigureService(kConfigWifi0UnmanagedSharedConnected); + ASSERT_FALSE(wifi0_service_path.empty()); + std::string wifi1_service_path = + ConfigureService(kConfigWifi1ManagedSharedConnectable); + ASSERT_FALSE(wifi1_service_path.empty()); LoginToRegularUser(); StartNetworkCertLoader(); - EXPECT_EQ(shill::kStateOnline, GetServiceState("wifi0")); - EXPECT_EQ(shill::kStateIdle, GetServiceState("wifi1")); - EXPECT_TRUE(helper().profile_test()->HasService("wifi0")); + EXPECT_EQ(shill::kStateOnline, GetServiceState(wifi0_service_path)); + EXPECT_EQ(shill::kStateIdle, GetServiceState(wifi1_service_path)); + EXPECT_TRUE(helper().profile_test()->HasService(wifi0_service_path)); // Apply 'AllowOnlyPolicyNetworksToConnectIfAvailable' policy as a device // policy and provide a network configuration for wifi1 to make it managed. @@ -602,18 +641,18 @@ kAllowOnlyPolicyNetworksToConnectIfAvailable, base::Value(true)); SetupPolicy(kPolicy, global_config, false /* load as device policy */); - EXPECT_EQ(shill::kStateOnline, GetServiceState("wifi0")); - EXPECT_EQ(shill::kStateIdle, GetServiceState("wifi1")); - EXPECT_TRUE(helper().profile_test()->HasService("wifi0")); + EXPECT_EQ(shill::kStateOnline, GetServiceState(wifi0_service_path)); + EXPECT_EQ(shill::kStateIdle, GetServiceState(wifi1_service_path)); + EXPECT_TRUE(helper().profile_test()->HasService(wifi0_service_path)); // Apply an empty user policy (no whitelist for wifi0). Connection to wifi0 // should be disconnected due to being unmanaged and managed network wifi1 // being available. wifi0 configuration should not be removed. SetupPolicy(std::string(), base::DictionaryValue(), true /* load as user policy */); - EXPECT_EQ(shill::kStateIdle, GetServiceState("wifi0")); - EXPECT_EQ(shill::kStateIdle, GetServiceState("wifi1")); - EXPECT_TRUE(helper().profile_test()->HasService("wifi0")); + EXPECT_EQ(shill::kStateIdle, GetServiceState(wifi0_service_path)); + EXPECT_EQ(shill::kStateIdle, GetServiceState(wifi1_service_path)); + EXPECT_TRUE(helper().profile_test()->HasService(wifi0_service_path)); EXPECT_EQ(0, test_observer_->num_auto_connect_events()); }
diff --git a/chromeos/network/managed_network_configuration_handler_impl.cc b/chromeos/network/managed_network_configuration_handler_impl.cc index 197fe3a8..8ff397db 100644 --- a/chromeos/network/managed_network_configuration_handler_impl.cc +++ b/chromeos/network/managed_network_configuration_handler_impl.cc
@@ -9,6 +9,7 @@ #include <vector> #include "base/bind.h" +#include "base/callback_helpers.h" #include "base/guid.h" #include "base/location.h" #include "base/logging.h" @@ -72,12 +73,15 @@ error_callback, service_path, error_name, error_msg); } -void LogErrorWithDict(const base::Location& from_where, - const std::string& error_name, - std::unique_ptr<base::DictionaryValue> error_data) { +void LogErrorWithDictAndCallCallback( + base::OnceClosure callback, + const base::Location& from_where, + const std::string& error_name, + std::unique_ptr<base::DictionaryValue> error_data) { device_event_log::AddEntry(from_where.file_name(), from_where.line_number(), device_event_log::LOG_TYPE_NETWORK, device_event_log::LOG_LEVEL_ERROR, error_name); + std::move(callback).Run(); } const base::DictionaryValue* GetByGUID(const GuidToPolicyMap& policies, @@ -547,7 +551,7 @@ DCHECK(onc_source != ::onc::ONC_SOURCE_DEVICE_POLICY || userhash.empty()); Policies* policies = NULL; - if (base::ContainsKey(policies_by_user_, userhash)) { + if (base::Contains(policies_by_user_, userhash)) { policies = policies_by_user_[userhash].get(); } else { policies = new Policies; @@ -622,7 +626,7 @@ return false; } - if (base::ContainsKey(policy_applicators_, userhash)) { + if (base::Contains(policy_applicators_, userhash)) { // A previous policy application is still running. Queue the modified // policies. // Note, even if |modified_policies| is empty, this means that a policy @@ -677,19 +681,26 @@ } void ManagedNetworkConfigurationHandlerImpl::CreateConfigurationFromPolicy( - const base::DictionaryValue& shill_properties) { + const base::DictionaryValue& shill_properties, + base::OnceClosure callback) { + base::RepeatingClosure adapted_callback = + base::AdaptCallbackForRepeating(std::move(callback)); network_configuration_handler_->CreateShillConfiguration( shill_properties, - base::Bind( + base::BindRepeating( &ManagedNetworkConfigurationHandlerImpl::OnPolicyAppliedToNetwork, - weak_ptr_factory_.GetWeakPtr()), - base::Bind(&LogErrorWithDict, FROM_HERE)); + weak_ptr_factory_.GetWeakPtr(), adapted_callback), + base::BindRepeating(&LogErrorWithDictAndCallCallback, adapted_callback, + FROM_HERE)); } void ManagedNetworkConfigurationHandlerImpl:: UpdateExistingConfigurationWithPropertiesFromPolicy( const base::DictionaryValue& existing_properties, - const base::DictionaryValue& new_properties) { + const base::DictionaryValue& new_properties, + base::OnceClosure callback) { + base::RepeatingClosure adapted_callback = + base::AdaptCallbackForRepeating(std::move(callback)); base::DictionaryValue shill_properties; std::string profile; @@ -716,10 +727,11 @@ network_configuration_handler_->CreateShillConfiguration( shill_properties, - base::Bind( + base::BindRepeating( &ManagedNetworkConfigurationHandlerImpl::OnPolicyAppliedToNetwork, - weak_ptr_factory_.GetWeakPtr()), - base::Bind(&LogErrorWithDict, FROM_HERE)); + weak_ptr_factory_.GetWeakPtr(), adapted_callback), + base::BindRepeating(&LogErrorWithDictAndCallCallback, adapted_callback, + FROM_HERE)); } void ManagedNetworkConfigurationHandlerImpl::OnPoliciesApplied( @@ -731,7 +743,7 @@ FROM_HERE, policy_applicators_[userhash].release()); policy_applicators_.erase(userhash); - if (base::ContainsKey(queued_modified_policies_, userhash)) { + if (base::Contains(queued_modified_policies_, userhash)) { std::set<std::string> modified_policies; queued_modified_policies_[userhash].swap(modified_policies); // Remove |userhash| from the queue. @@ -949,12 +961,21 @@ } void ManagedNetworkConfigurationHandlerImpl::OnPolicyAppliedToNetwork( + base::OnceClosure callback, const std::string& service_path, const std::string& guid) { - if (service_path.empty()) - return; + DCHECK(!service_path.empty()); + + // When this is called, the policy has been fully applied and is reflected in + // NetworkStateHandler, so it is safe to notify obserers. + // Notifying observers is the last step of policy application to + // |service_path|. for (auto& observer : observers_) observer.PolicyAppliedToNetwork(service_path); + + // Inform the caller that has requested policy application that it has + // finished. + std::move(callback).Run(); } // Get{Managed}Properties helpers
diff --git a/chromeos/network/managed_network_configuration_handler_impl.h b/chromeos/network/managed_network_configuration_handler_impl.h index 95c4274..1d99804 100644 --- a/chromeos/network/managed_network_configuration_handler_impl.h +++ b/chromeos/network/managed_network_configuration_handler_impl.h
@@ -116,11 +116,13 @@ // PolicyApplicator::ConfigurationHandler overrides void CreateConfigurationFromPolicy( - const base::DictionaryValue& shill_properties) override; + const base::DictionaryValue& shill_properties, + base::OnceClosure callback) override; void UpdateExistingConfigurationWithPropertiesFromPolicy( const base::DictionaryValue& existing_properties, - const base::DictionaryValue& new_properties) override; + const base::DictionaryValue& new_properties, + base::OnceClosure callback) override; void OnPoliciesApplied(const NetworkProfile& profile) override; @@ -176,7 +178,10 @@ // user or device policies. const Policies* GetPoliciesForProfile(const NetworkProfile& profile) const; - void OnPolicyAppliedToNetwork(const std::string& service_path, + // Called when a policy identified by |guid| has been applied to the network + // identified by |service_path|. Notifies observers and calls |callback|. + void OnPolicyAppliedToNetwork(base::OnceClosure callback, + const std::string& service_path, const std::string& guid); // Helper method to append associated Device properties to |properties|.
diff --git a/chromeos/network/managed_network_configuration_handler_unittest.cc b/chromeos/network/managed_network_configuration_handler_unittest.cc index a77a81cd..bd31f29f 100644 --- a/chromeos/network/managed_network_configuration_handler_unittest.cc +++ b/chromeos/network/managed_network_configuration_handler_unittest.cc
@@ -12,6 +12,7 @@ #include "base/macros.h" #include "base/message_loop/message_loop.h" #include "base/run_loop.h" +#include "base/test/values_test_util.h" #include "base/values.h" #include "chromeos/dbus/shill/shill_clients.h" #include "chromeos/dbus/shill/shill_profile_client.h" @@ -30,6 +31,7 @@ #include "third_party/cros_system_api/dbus/service_constants.h" namespace test_utils = ::chromeos::onc::test_utils; +using base::test::DictionaryHasValues; namespace chromeos { @@ -37,7 +39,22 @@ constexpr char kUser1[] = "user1"; constexpr char kUser1ProfilePath[] = "/profile/user1/shill"; -constexpr char kTestGuid1[] = "{a3860e83-f03d-4cb1-bafa-b22c9e746950}"; + +// The GUID used by chromeos/test/data/network/policy/*.{json,onc} files for a +// VPN. +constexpr char kTestGuidVpn[] = "{a3860e83-f03d-4cb1-bafa-b22c9e746950}"; + +// The GUID used by chromeos/test/data/network/policy/*.{json,onc} files for a +// managed Wifi service. +constexpr char kTestGuidManagedWifi[] = "policy_wifi1"; + +// The GUID used by chromeos/test/data/network/policy/*.{json,onc} files for an +// unmanaged Wifi service. +constexpr char kTestGuidUnmanagedWifi2[] = "wifi2"; + +// The GUID used by chromeos/test/data/network/policy/*.{json,onc} files for a +// Wifi service. +constexpr char kTestGuidEthernetEap[] = "policy_ethernet_eap"; std::string PrettyJson(const base::DictionaryValue& value) { std::string pretty; @@ -226,10 +243,14 @@ "policy/policy_wifi1_with_redundant_fields.onc"); base::RunLoop().RunUntilIdle(); + std::string service_path = + GetShillServiceClient()->FindServiceMatchingGUID(kTestGuidManagedWifi); + ASSERT_FALSE(service_path.empty()); const base::DictionaryValue* properties = - GetShillServiceClient()->GetServiceProperties("policy_wifi1"); + GetShillServiceClient()->GetServiceProperties(service_path); ASSERT_TRUE(properties); - EXPECT_EQ(*expected_shill_properties, *properties); + EXPECT_THAT(*properties, + DictionaryHasValues(expected_shill_properties->Clone())); } TEST_F(ManagedNetworkConfigurationHandlerTest, SetPolicyManageUnconfigured) { @@ -241,10 +262,14 @@ SetPolicy(::onc::ONC_SOURCE_USER_POLICY, kUser1, "policy/policy_wifi1.onc"); base::RunLoop().RunUntilIdle(); + std::string service_path = + GetShillServiceClient()->FindServiceMatchingGUID(kTestGuidManagedWifi); + ASSERT_FALSE(service_path.empty()); const base::DictionaryValue* properties = - GetShillServiceClient()->GetServiceProperties("policy_wifi1"); + GetShillServiceClient()->GetServiceProperties(service_path); ASSERT_TRUE(properties); - EXPECT_EQ(*expected_shill_properties, *properties); + EXPECT_THAT(*properties, + DictionaryHasValues(expected_shill_properties->Clone())); } TEST_F(ManagedNetworkConfigurationHandlerTest, EnableManagedCredentialsWiFi) { @@ -257,10 +282,14 @@ "policy/policy_wifi1_autoconnect.onc"); base::RunLoop().RunUntilIdle(); + std::string service_path = + GetShillServiceClient()->FindServiceMatchingGUID(kTestGuidManagedWifi); + ASSERT_FALSE(service_path.empty()); const base::DictionaryValue* properties = - GetShillServiceClient()->GetServiceProperties("policy_wifi1"); + GetShillServiceClient()->GetServiceProperties(service_path); ASSERT_TRUE(properties); - EXPECT_EQ(*expected_shill_properties, *properties); + EXPECT_THAT(*properties, + DictionaryHasValues(expected_shill_properties->Clone())); } TEST_F(ManagedNetworkConfigurationHandlerTest, EnableManagedCredentialsVPN) { @@ -273,8 +302,11 @@ "policy/policy_vpn_autoconnect.onc"); base::RunLoop().RunUntilIdle(); + std::string service_path = + GetShillServiceClient()->FindServiceMatchingGUID(kTestGuidVpn); + ASSERT_FALSE(service_path.empty()); const base::DictionaryValue* properties = - GetShillServiceClient()->GetServiceProperties(kTestGuid1); + GetShillServiceClient()->GetServiceProperties(service_path); ASSERT_TRUE(properties); EXPECT_EQ(*expected_shill_properties, *properties); } @@ -310,13 +342,14 @@ ::onc::ONC_SOURCE_USER_POLICY, kUser1, "policy/policy_ethernet_eap.onc"); base::RunLoop().RunUntilIdle(); - // Verify eth_entry is deleted. - EXPECT_FALSE(GetShillProfileClient()->HasService("eth_entry")); - + std::string service_path = + GetShillServiceClient()->FindServiceMatchingGUID(kTestGuidEthernetEap); + ASSERT_FALSE(service_path.empty()); const base::DictionaryValue* properties = - GetShillServiceClient()->GetServiceProperties("guid"); + GetShillServiceClient()->GetServiceProperties(service_path); ASSERT_TRUE(properties); - EXPECT_EQ(*expected_shill_properties, *properties); + EXPECT_THAT(*properties, + DictionaryHasValues(expected_shill_properties->Clone())); } TEST_F(ManagedNetworkConfigurationHandlerTest, SetPolicyIgnoreUnmodified) { @@ -411,10 +444,14 @@ // Verify old_entry_path is deleted. EXPECT_FALSE(GetShillProfileClient()->HasService("old_entry_path")); + std::string service_path = + GetShillServiceClient()->FindServiceMatchingGUID(kTestGuidManagedWifi); + ASSERT_FALSE(service_path.empty()); const base::DictionaryValue* properties = - GetShillServiceClient()->GetServiceProperties("policy_wifi1"); + GetShillServiceClient()->GetServiceProperties(service_path); ASSERT_TRUE(properties); - EXPECT_EQ(*expected_shill_properties, *properties); + EXPECT_THAT(*properties, + DictionaryHasValues(expected_shill_properties->Clone())); } TEST_F(ManagedNetworkConfigurationHandlerTest, SetPolicyUpdateManagedNewGUID) { @@ -443,10 +480,14 @@ // Verify old_entry_path is deleted. EXPECT_FALSE(GetShillProfileClient()->HasService("old_entry_path")); + std::string service_path = + GetShillServiceClient()->FindServiceMatchingGUID(kTestGuidManagedWifi); + ASSERT_FALSE(service_path.empty()); const base::DictionaryValue* properties = - GetShillServiceClient()->GetServiceProperties("policy_wifi1"); + GetShillServiceClient()->GetServiceProperties(service_path); ASSERT_TRUE(properties); - EXPECT_EQ(*expected_shill_properties, *properties); + EXPECT_THAT(*properties, + DictionaryHasValues(expected_shill_properties->Clone())); } TEST_F(ManagedNetworkConfigurationHandlerTest, SetPolicyUpdateManagedVPN) { @@ -456,8 +497,11 @@ SetPolicy(::onc::ONC_SOURCE_USER_POLICY, kUser1, "policy/policy_vpn.onc"); base::RunLoop().RunUntilIdle(); + std::string service_path = + GetShillServiceClient()->FindServiceMatchingGUID(kTestGuidVpn); + ASSERT_FALSE(service_path.empty()); const base::DictionaryValue* properties = - GetShillServiceClient()->GetServiceProperties(kTestGuid1); + GetShillServiceClient()->GetServiceProperties(service_path); ASSERT_TRUE(properties); std::unique_ptr<base::DictionaryValue> expected_shill_properties = test_utils::ReadTestDictionary("policy/shill_policy_on_managed_vpn.json"); @@ -478,7 +522,7 @@ // and OTP which should be allowed when authentication type is not explicitly // set. See https://crbug.com/817617 for details. const NetworkState* network_state = - network_state_handler_->GetNetworkStateFromGuid(kTestGuid1); + network_state_handler_->GetNetworkStateFromGuid(kTestGuidVpn); ASSERT_TRUE(network_state); std::unique_ptr<base::DictionaryValue> ui_config = test_utils::ReadTestDictionary("policy/policy_vpn_ui.json"); @@ -487,8 +531,11 @@ base::Bind(&ErrorCallback)); base::RunLoop().RunUntilIdle(); + std::string service_path = + GetShillServiceClient()->FindServiceMatchingGUID(kTestGuidVpn); + ASSERT_FALSE(service_path.empty()); const base::DictionaryValue* properties = - GetShillServiceClient()->GetServiceProperties(kTestGuid1); + GetShillServiceClient()->GetServiceProperties(service_path); ASSERT_TRUE(properties); std::unique_ptr<base::DictionaryValue> expected_shill_properties = test_utils::ReadTestDictionary( @@ -508,8 +555,11 @@ "policy/policy_vpn_no_user_auth_type.onc"); base::RunLoop().RunUntilIdle(); + std::string service_path = + GetShillServiceClient()->FindServiceMatchingGUID(kTestGuidVpn); + ASSERT_FALSE(service_path.empty()); const base::DictionaryValue* properties = - GetShillServiceClient()->GetServiceProperties(kTestGuid1); + GetShillServiceClient()->GetServiceProperties(service_path); ASSERT_TRUE(properties); EXPECT_EQ(*expected_shill_properties, *properties); } @@ -535,10 +585,14 @@ base::RunLoop().RunUntilIdle(); { + std::string service_path = + GetShillServiceClient()->FindServiceMatchingGUID(kTestGuidManagedWifi); + ASSERT_FALSE(service_path.empty()); const base::DictionaryValue* properties = - GetShillServiceClient()->GetServiceProperties("policy_wifi1"); + GetShillServiceClient()->GetServiceProperties(service_path); ASSERT_TRUE(properties); - EXPECT_EQ(*expected_shill_properties, *properties); + EXPECT_THAT(*properties, + DictionaryHasValues(expected_shill_properties->Clone())); } // If we apply the policy again, without change, then the Shill profile will @@ -547,10 +601,14 @@ base::RunLoop().RunUntilIdle(); { + std::string service_path = + GetShillServiceClient()->FindServiceMatchingGUID(kTestGuidManagedWifi); + ASSERT_FALSE(service_path.empty()); const base::DictionaryValue* properties = - GetShillServiceClient()->GetServiceProperties("policy_wifi1"); + GetShillServiceClient()->GetServiceProperties(service_path); ASSERT_TRUE(properties); - EXPECT_EQ(*expected_shill_properties, *properties); + EXPECT_THAT(*properties, + DictionaryHasValues(expected_shill_properties->Clone())); } } @@ -602,10 +660,14 @@ SetPolicy(::onc::ONC_SOURCE_USER_POLICY, kUser1, "policy/policy_wifi1.onc"); base::RunLoop().RunUntilIdle(); + std::string service_path = + GetShillServiceClient()->FindServiceMatchingGUID(kTestGuidManagedWifi); + ASSERT_FALSE(service_path.empty()); const base::DictionaryValue* properties = - GetShillServiceClient()->GetServiceProperties("policy_wifi1"); + GetShillServiceClient()->GetServiceProperties(service_path); ASSERT_TRUE(properties); - EXPECT_EQ(*expected_shill_properties, *properties); + EXPECT_THAT(*properties, + DictionaryHasValues(expected_shill_properties->Clone())); } TEST_F(ManagedNetworkConfigurationHandlerTest, AutoConnectDisallowed) { @@ -626,8 +688,11 @@ "policy/policy_allow_only_policy_networks_to_autoconnect.onc"); base::RunLoop().RunUntilIdle(); + std::string wifi2_service_path = + GetShillServiceClient()->FindServiceMatchingGUID(kTestGuidUnmanagedWifi2); + ASSERT_FALSE(wifi2_service_path.empty()); const base::DictionaryValue* properties = - GetShillServiceClient()->GetServiceProperties("wifi2"); + GetShillServiceClient()->GetServiceProperties(wifi2_service_path); ASSERT_TRUE(properties); EXPECT_EQ(*expected_shill_properties, *properties); @@ -643,7 +708,7 @@ std::unique_ptr<base::DictionaryValue> dictionary; managed_handler()->GetManagedProperties( - kUser1, "wifi2", + kUser1, wifi2_service_path, base::Bind( [](std::unique_ptr<base::DictionaryValue>* dictionary_out, const std::string& service_path, @@ -676,10 +741,14 @@ InitializeStandardProfiles(); base::RunLoop().RunUntilIdle(); + std::string service_path = + GetShillServiceClient()->FindServiceMatchingGUID(kTestGuidManagedWifi); + ASSERT_FALSE(service_path.empty()); const base::DictionaryValue* properties = - GetShillServiceClient()->GetServiceProperties("policy_wifi1"); + GetShillServiceClient()->GetServiceProperties(service_path); ASSERT_TRUE(properties); - EXPECT_EQ(*expected_shill_properties, *properties); + EXPECT_THAT(*properties, + DictionaryHasValues(expected_shill_properties->Clone())); } TEST_F(ManagedNetworkConfigurationHandlerTest,
diff --git a/chromeos/network/network_configuration_handler.cc b/chromeos/network/network_configuration_handler.cc index bb5fae5..75311de1 100644 --- a/chromeos/network/network_configuration_handler.cc +++ b/chromeos/network/network_configuration_handler.cc
@@ -403,7 +403,7 @@ const network_handler::ErrorCallback& error_callback) { // Service.Remove is not reliable. Instead, request the profile entries // for the service and remove each entry. - if (base::ContainsKey(profile_entry_deleters_, service_path)) { + if (base::Contains(profile_entry_deleters_, service_path)) { InvokeErrorCallback(service_path, error_callback, "RemoveConfigurationInProgress"); return; @@ -523,10 +523,8 @@ // |configure_callbacks_| will get triggered when NetworkStateHandler // notifies this that a state list update has occurred. |service_path| - // is unique per configuration. In the unlikely case that an existing - // configuration is reconfigured twice without a NetworkStateHandler update, - // (the UI should prevent that) the first callback will not get called. - configure_callbacks_[service_path.value()] = callback; + // is unique per configuration. + configure_callbacks_.insert(std::make_pair(service_path.value(), callback)); } void NetworkConfigurationHandler::ProfileEntryDeleterCompleted(
diff --git a/chromeos/network/network_configuration_handler.h b/chromeos/network/network_configuration_handler.h index a37d9afe..d57db5e 100644 --- a/chromeos/network/network_configuration_handler.h +++ b/chromeos/network/network_configuration_handler.h
@@ -91,6 +91,8 @@ // Creates a network with the given |properties| in the specified Shill // profile, and returns the new service_path to |callback| if successful. + // |callback| will only be called after the property update has been reflected + // in NetworkStateHandler. // kProfileProperty must be set in |properties|. This may also be used to // update an existing matching configuration, see Shill documentation for // Manager.ConfigureServiceForProfile. NOTE: Normally @@ -226,8 +228,9 @@ profile_entry_deleters_; // Map of configuration callbacks to run once the service becomes available - // in the NetworkStateHandler cache. - std::map<std::string, network_handler::ServiceResultCallback> + // in the NetworkStateHandler cache. This is a multimap because there can be + // multiple callbacks for the same network that have to be notified. + std::multimap<std::string, network_handler::ServiceResultCallback> configure_callbacks_; base::ObserverList<NetworkConfigurationObserver, true>::Unchecked observers_;
diff --git a/chromeos/network/network_configuration_handler_unittest.cc b/chromeos/network/network_configuration_handler_unittest.cc index 9689665..46e38c5 100644 --- a/chromeos/network/network_configuration_handler_unittest.cc +++ b/chromeos/network/network_configuration_handler_unittest.cc
@@ -473,9 +473,8 @@ base::RunLoop().RunUntilIdle(); ASSERT_TRUE(success); - // In FakeShillManagerClient, instead of re-implementing shill's behavior, - // guid is used for service_path. - EXPECT_EQ(service_path, kGuid); + EXPECT_EQ(service_path, + GetShillServiceClient()->FindServiceMatchingGUID(kGuid)); EXPECT_EQ(guid, kGuid); }
diff --git a/chromeos/network/network_connection_handler_impl.cc b/chromeos/network/network_connection_handler_impl.cc index 3cc634a4..9e9d52c0 100644 --- a/chromeos/network/network_connection_handler_impl.cc +++ b/chromeos/network/network_connection_handler_impl.cc
@@ -481,9 +481,8 @@ return; } if (network_state_handler_->OnlyManagedWifiNetworksAllowed() || - base::ContainsValue( - managed_configuration_handler_->GetBlacklistedHexSSIDs(), - hex_ssid_value->GetString())) { + base::Contains(managed_configuration_handler_->GetBlacklistedHexSSIDs(), + hex_ssid_value->GetString())) { ErrorCallbackForPendingRequest(service_path, kErrorBlockedByPolicy); return; }
diff --git a/chromeos/network/network_connection_handler_impl_unittest.cc b/chromeos/network/network_connection_handler_impl_unittest.cc index 3f89f76..56e6d67 100644 --- a/chromeos/network/network_connection_handler_impl_unittest.cc +++ b/chromeos/network/network_connection_handler_impl_unittest.cc
@@ -194,6 +194,13 @@ } protected: + std::string ServicePathFromGuid(const std::string& guid) { + std::string service_path = + helper_.service_test()->FindServiceMatchingGUID(guid); + EXPECT_FALSE(service_path.empty()); + return service_path; + } + void Connect(const std::string& service_path) { network_connection_handler_->ConnectToNetwork( service_path, @@ -331,19 +338,15 @@ namespace { const char* kNoNetwork = "no-network"; -const char* kWifi0 = "wifi0"; -const char* kWifi1 = "wifi1"; -const char* kWifi2 = "wifi2"; -const char* kWifi3 = "wifi3"; -const char* kConfigConnectable = +const char* kConfigWifi0Connectable = "{ \"GUID\": \"wifi0\", \"Type\": \"wifi\", \"State\": \"idle\", " " \"Connectable\": true }"; -const char* kConfigConnected = +const char* kConfigWifi1Connected = "{ \"GUID\": \"wifi1\", \"Type\": \"wifi\", \"State\": \"online\" }"; -const char* kConfigConnecting = +const char* kConfigWifi2Connecting = "{ \"GUID\": \"wifi2\", \"Type\": \"wifi\", \"State\": \"association\" }"; -const char* kConfigRequiresPassphrase = +const char* kConfigWifi3RequiresPassphrase = "{ \"GUID\": \"wifi3\", \"Type\": \"wifi\", " " \"PassphraseRequired\": true }"; @@ -356,19 +359,23 @@ TEST_F(NetworkConnectionHandlerImplTest, NetworkConnectionHandlerConnectSuccess) { - EXPECT_FALSE(ConfigureService(kConfigConnectable).empty()); - Connect(kWifi0); + std::string wifi0_service_path = ConfigureService(kConfigWifi0Connectable); + ASSERT_FALSE(wifi0_service_path.empty()); + Connect(wifi0_service_path); EXPECT_EQ(kSuccessResult, GetResultAndReset()); - EXPECT_EQ(shill::kStateOnline, - GetServiceStringProperty(kWifi0, shill::kStateProperty)); + EXPECT_EQ( + shill::kStateOnline, + GetServiceStringProperty(wifi0_service_path, shill::kStateProperty)); // Observer expectations - EXPECT_TRUE(network_connection_observer()->GetRequested(kWifi0)); - EXPECT_EQ(kSuccessResult, network_connection_observer()->GetResult(kWifi0)); + EXPECT_TRUE(network_connection_observer()->GetRequested(wifi0_service_path)); + EXPECT_EQ(kSuccessResult, + network_connection_observer()->GetResult(wifi0_service_path)); } TEST_F(NetworkConnectionHandlerImplTest, NetworkConnectionHandlerConnectBlockedByManagedOnly) { - EXPECT_FALSE(ConfigureService(kConfigConnectable).empty()); + std::string wifi0_service_path = ConfigureService(kConfigWifi0Connectable); + ASSERT_FALSE(wifi0_service_path.empty()); base::DictionaryValue global_config; global_config.SetKey( ::onc::global_network_config::kAllowOnlyPolicyNetworksToConnect, @@ -376,18 +383,19 @@ SetupPolicy("[]", global_config, false /* load as device policy */); SetupPolicy("[]", base::DictionaryValue(), true /* load as user policy */); LoginToRegularUser(); - Connect(kWifi0); + Connect(wifi0_service_path); EXPECT_EQ(NetworkConnectionHandler::kErrorBlockedByPolicy, GetResultAndReset()); SetupPolicy(kPolicyWifi0, global_config, false /* load as device policy */); - Connect(kWifi0); + Connect(wifi0_service_path); EXPECT_EQ(kSuccessResult, GetResultAndReset()); } TEST_F(NetworkConnectionHandlerImplTest, NetworkConnectionHandlerConnectBlockedByBlacklist) { - EXPECT_FALSE(ConfigureService(kConfigConnectable).empty()); + std::string wifi0_service_path = ConfigureService(kConfigWifi0Connectable); + ASSERT_FALSE(wifi0_service_path.empty()); // Set a device policy which blocks wifi0. base::Value::ListStorage blacklist; @@ -400,14 +408,14 @@ LoginToRegularUser(); - Connect(kWifi0); + Connect(wifi0_service_path); EXPECT_EQ(NetworkConnectionHandler::kErrorBlockedByPolicy, GetResultAndReset()); // Set a user policy, which configures wifi0 (==whitelisted). SetupPolicy(kPolicyWifi0, base::DictionaryValue(), true /* load as user policy */); - Connect(kWifi0); + Connect(wifi0_service_path); EXPECT_EQ(kSuccessResult, GetResultAndReset()); } @@ -421,27 +429,30 @@ EXPECT_EQ(NetworkConnectionHandler::kErrorConfigureFailed, network_connection_observer()->GetResult(kNoNetwork)); - EXPECT_FALSE(ConfigureService(kConfigConnected).empty()); - Connect(kWifi1); + std::string wifi1_service_path = ConfigureService(kConfigWifi1Connected); + ASSERT_FALSE(wifi1_service_path.empty()); + Connect(wifi1_service_path); EXPECT_EQ(NetworkConnectionHandler::kErrorConnected, GetResultAndReset()); - EXPECT_TRUE(network_connection_observer()->GetRequested(kWifi1)); + EXPECT_TRUE(network_connection_observer()->GetRequested(wifi1_service_path)); EXPECT_EQ(NetworkConnectionHandler::kErrorConnected, - network_connection_observer()->GetResult(kWifi1)); + network_connection_observer()->GetResult(wifi1_service_path)); - EXPECT_FALSE(ConfigureService(kConfigConnecting).empty()); - Connect(kWifi2); + std::string wifi2_service_path = ConfigureService(kConfigWifi2Connecting); + ASSERT_FALSE(wifi2_service_path.empty()); + Connect(wifi2_service_path); EXPECT_EQ(NetworkConnectionHandler::kErrorConnecting, GetResultAndReset()); - EXPECT_TRUE(network_connection_observer()->GetRequested(kWifi2)); + EXPECT_TRUE(network_connection_observer()->GetRequested(wifi2_service_path)); EXPECT_EQ(NetworkConnectionHandler::kErrorConnecting, - network_connection_observer()->GetResult(kWifi2)); + network_connection_observer()->GetResult(wifi2_service_path)); - EXPECT_FALSE(ConfigureService(kConfigRequiresPassphrase).empty()); - Connect(kWifi3); + std::string wifi3_service_path = + ConfigureService(kConfigWifi3RequiresPassphrase); + Connect(wifi3_service_path); EXPECT_EQ(NetworkConnectionHandler::kErrorPassphraseRequired, GetResultAndReset()); - EXPECT_TRUE(network_connection_observer()->GetRequested(kWifi3)); + EXPECT_TRUE(network_connection_observer()->GetRequested(wifi3_service_path)); EXPECT_EQ(NetworkConnectionHandler::kErrorPassphraseRequired, - network_connection_observer()->GetResult(kWifi3)); + network_connection_observer()->GetResult(wifi3_service_path)); } namespace { @@ -474,7 +485,7 @@ base::DictionaryValue(), // no global config true); // load as user policy - Connect("wifi4"); + Connect(ServicePathFromGuid("wifi4")); EXPECT_EQ(NetworkConnectionHandler::kErrorCertificateRequired, GetResultAndReset()); } @@ -489,7 +500,7 @@ base::DictionaryValue(), // no global config true); // load as user policy - Connect("wifi4"); + Connect(ServicePathFromGuid("wifi4")); EXPECT_EQ(kSuccessResult, GetResultAndReset()); } @@ -504,7 +515,7 @@ base::DictionaryValue(), // no global config true); // load as user policy - Connect("wifi4"); + Connect(ServicePathFromGuid("wifi4")); // Connect request came before the cert loader loaded certificates, so the // connect request should have been throttled until the certificates are @@ -521,9 +532,10 @@ TEST_F(NetworkConnectionHandlerImplTest, NetworkConnectionHandlerDisconnectSuccess) { - EXPECT_FALSE(ConfigureService(kConfigConnected).empty()); - Disconnect(kWifi1); - EXPECT_TRUE(network_connection_observer()->GetRequested(kWifi1)); + std::string wifi1_service_path = ConfigureService(kConfigWifi1Connected); + ASSERT_FALSE(wifi1_service_path.empty()); + Disconnect(wifi1_service_path); + EXPECT_TRUE(network_connection_observer()->GetRequested(wifi1_service_path)); EXPECT_EQ(kSuccessResult, GetResultAndReset()); } @@ -533,8 +545,9 @@ EXPECT_EQ(NetworkConnectionHandler::kErrorConfigureFailed, GetResultAndReset()); - EXPECT_FALSE(ConfigureService(kConfigConnectable).empty()); - Disconnect(kWifi0); + std::string wifi0_service_path = ConfigureService(kConfigWifi0Connectable); + ASSERT_FALSE(wifi0_service_path.empty()); + Disconnect(wifi0_service_path); EXPECT_EQ(NetworkConnectionHandler::kErrorNotConnected, GetResultAndReset()); } @@ -546,6 +559,7 @@ 100 /* signal_strength */, true /* has_connected_to_host */); network_connection_handler()->SetTetherDelegate(fake_tether_delegate()); + // For tether networks, guid == service_path. Connect(kTetherGuid /* service_path */); EXPECT_EQ(FakeTetherDelegate::DelegateFunctionType::CONNECT, @@ -566,6 +580,7 @@ 100 /* signal_strength */, true /* has_connected_to_host */); network_connection_handler()->SetTetherDelegate(fake_tether_delegate()); + // For tether networks, guid == service_path. Connect(kTetherGuid /* service_path */); EXPECT_EQ(FakeTetherDelegate::DelegateFunctionType::CONNECT, @@ -589,6 +604,7 @@ // Do not set a tether delegate. + // For tether networks, guid == service_path. Connect(kTetherGuid /* service_path */); EXPECT_EQ(FakeTetherDelegate::DelegateFunctionType::NONE, @@ -609,6 +625,7 @@ network_state_handler()->SetTetherNetworkStateConnecting(kTetherGuid); network_connection_handler()->SetTetherDelegate(fake_tether_delegate()); + // For tether networks, guid == service_path. Disconnect(kTetherGuid /* service_path */); EXPECT_EQ(FakeTetherDelegate::DelegateFunctionType::DISCONNECT, @@ -630,6 +647,7 @@ network_state_handler()->SetTetherNetworkStateConnecting(kTetherGuid); network_connection_handler()->SetTetherDelegate(fake_tether_delegate()); + // For tether networks, guid == service_path. Disconnect(kTetherGuid /* service_path */); EXPECT_EQ(FakeTetherDelegate::DelegateFunctionType::DISCONNECT, @@ -654,6 +672,7 @@ // Do not set a tether delegate. + // For tether networks, guid == service_path. Disconnect(kTetherGuid /* service_path */); EXPECT_EQ(FakeTetherDelegate::DelegateFunctionType::NONE,
diff --git a/chromeos/network/network_state_handler.cc b/chromeos/network/network_state_handler.cc index be8f9ec..c003816 100644 --- a/chromeos/network/network_state_handler.cc +++ b/chromeos/network/network_state_handler.cc
@@ -961,7 +961,7 @@ bool blocked_by_policy = !network->IsManagedByPolicy() && (OnlyManagedWifiNetworksAllowed() || - base::ContainsValue(blacklisted_hex_ssids_, network->GetHexSsid())); + base::Contains(blacklisted_hex_ssids_, network->GetHexSsid())); network->set_blocked_by_policy(blocked_by_policy); return prev_blocked_by_policy != blocked_by_policy; } @@ -1195,7 +1195,7 @@ std::map<std::string, std::unique_ptr<ManagedState>> managed_map; for (auto& item : *managed_list) { std::string path = item->path(); - DCHECK(!base::ContainsKey(managed_map, path)); + DCHECK(!base::Contains(managed_map, path)); managed_map[path] = std::move(item); } // Clear the list (objects are temporarily owned by managed_map).
diff --git a/chromeos/network/onc/onc_certificate_pattern.cc b/chromeos/network/onc/onc_certificate_pattern.cc index cf5ec16..54b30811 100644 --- a/chromeos/network/onc/onc_certificate_pattern.cc +++ b/chromeos/network/onc/onc_certificate_pattern.cc
@@ -72,7 +72,7 @@ } if (!pem_encoded_issuer_cas_.empty() && - !base::ContainsValue(pem_encoded_issuer_cas_, pem_encoded_issuer_ca)) { + !base::Contains(pem_encoded_issuer_cas_, pem_encoded_issuer_ca)) { return false; } return true;
diff --git a/chromeos/network/onc/onc_validator.cc b/chromeos/network/onc/onc_validator.cc index 19531ee..4663f0a6 100644 --- a/chromeos/network/onc/onc_validator.cc +++ b/chromeos/network/onc/onc_validator.cc
@@ -35,7 +35,7 @@ void AddKeyToList(const char* key, base::Value::ListStorage& list) { base::Value key_value(key); - if (!base::ContainsValue(list, key_value)) + if (!base::Contains(list, key_value)) list.push_back(std::move(key_value)); } @@ -49,7 +49,7 @@ const base::Value* recommended = object.FindKeyOfType(::onc::kRecommended, base::Value::Type::LIST); return recommended && - base::ContainsValue(recommended->GetList(), base::Value(field_name)); + base::Contains(recommended->GetList(), base::Value(field_name)); } bool FieldIsSetToValueOrRecommended(const base::DictionaryValue& object,
diff --git a/chromeos/network/policy_applicator.cc b/chromeos/network/policy_applicator.cc index 748cda1..7a14550 100644 --- a/chromeos/network/policy_applicator.cc +++ b/chromeos/network/policy_applicator.cc
@@ -9,6 +9,7 @@ #include "base/bind.h" #include "base/bind_helpers.h" +#include "base/callback_helpers.h" #include "base/location.h" #include "base/logging.h" #include "base/memory/ptr_util.h" @@ -27,10 +28,12 @@ namespace { -void LogErrorMessage(const base::Location& from_where, - const std::string& error_name, - const std::string& error_message) { +void LogErrorMessageAndInvokeCallback(base::RepeatingClosure callback, + const base::Location& from_where, + const std::string& error_name, + const std::string& error_message) { LOG(ERROR) << from_where.ToString() << ": " << error_message; + callback.Run(); } const base::DictionaryValue* GetByGUID( @@ -38,10 +41,20 @@ const std::string& guid) { auto it = policies.find(guid); if (it == policies.end()) - return NULL; + return nullptr; return it->second.get(); } +// Returns the GUID property from |onc_part|, or an empty string if no GUID was +// present. +std::string GetGUIDFromONCPart(const base::Value& onc_part) { + const base::Value* guid_value = onc_part.FindKeyOfType( + ::onc::network_config::kGUID, base::Value::Type::STRING); + if (!guid_value) + return std::string(); + return guid_value->GetString(); +} + // Special service name in shill remembering settings across ethernet services. // Chrome should not attempt to configure / delete this. const char kEthernetAnyService[] = "ethernet_any"; @@ -53,10 +66,10 @@ const GuidToPolicyMap& all_policies, const base::DictionaryValue& global_network_config, ConfigurationHandler* handler, - std::set<std::string>* modified_policies) + std::set<std::string>* modified_policy_guids) : handler_(handler), profile_(profile), weak_ptr_factory_(this) { global_network_config_.MergeDictionary(&global_network_config); - remaining_policies_.swap(*modified_policies); + remaining_policy_guids_.swap(*modified_policy_guids); for (const auto& policy_pair : all_policies) { all_policies_.insert(std::make_pair(policy_pair.first, policy_pair.second->CreateDeepCopy())); @@ -68,6 +81,7 @@ } void PolicyApplicator::Run() { + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); ShillProfileClient::Get()->GetProperties( dbus::ObjectPath(profile_.path), base::Bind(&PolicyApplicator::GetProfilePropertiesCallback, @@ -76,18 +90,11 @@ weak_ptr_factory_.GetWeakPtr())); } -void PolicyApplicator::ProfileEntryFinished(const std::string& entry) { - pending_get_entry_calls_.erase(entry); - if (pending_get_entry_calls_.empty()) { - ApplyRemainingPolicies(); - NotifyConfigurationHandlerAndFinish(); - } -} - void PolicyApplicator::GetProfilePropertiesCallback( const base::DictionaryValue& profile_properties) { + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); VLOG(2) << "Received properties for profile " << profile_.ToDebugString(); - const base::ListValue* entries = NULL; + const base::ListValue* entries = nullptr; if (!profile_properties.GetListWithoutPathExpansion( shill::kEntriesProperty, &entries)) { LOG(ERROR) << "Profile " << profile_.ToDebugString() @@ -116,15 +123,14 @@ base::Bind(&PolicyApplicator::GetEntryError, weak_ptr_factory_.GetWeakPtr(), entry)); } - if (pending_get_entry_calls_.empty()) { + if (pending_get_entry_calls_.empty()) ApplyRemainingPolicies(); - NotifyConfigurationHandlerAndFinish(); - } } void PolicyApplicator::GetProfilePropertiesError( const std::string& error_name, const std::string& error_message) { + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); LOG(ERROR) << "Could not retrieve properties of profile " << profile_.path << ": " << error_message; NotifyConfigurationHandlerAndFinish(); @@ -133,6 +139,7 @@ void PolicyApplicator::GetEntryCallback( const std::string& entry, const base::DictionaryValue& entry_properties) { + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); VLOG(2) << "Received properties for entry " << entry << " of profile " << profile_.ToDebugString(); @@ -141,15 +148,7 @@ entry_properties, ::onc::ONC_SOURCE_UNKNOWN, &onc::kNetworkWithStateSignature, nullptr /* network_state */)); - std::string old_guid; - if (!onc_part->GetStringWithoutPathExpansion(::onc::network_config::kGUID, - &old_guid)) { - VLOG(1) << "Entry " << entry << " of profile " << profile_.ToDebugString() - << " doesn't contain a GUID."; - // This might be an entry of an older ChromeOS version. Assume it to be - // unmanaged. - } - + std::string old_guid = GetGUIDFromONCPart(*onc_part); std::unique_ptr<NetworkUIData> ui_data = shill_property_util::GetUIDataFromProperties(entry_properties); if (!ui_data) { @@ -161,12 +160,11 @@ old_guid.clear(); } - bool was_managed = !old_guid.empty() && ui_data && - (ui_data->onc_source() == - ::onc::ONC_SOURCE_DEVICE_POLICY || - ui_data->onc_source() == ::onc::ONC_SOURCE_USER_POLICY); + bool was_managed = + ui_data && (ui_data->onc_source() == ::onc::ONC_SOURCE_DEVICE_POLICY || + ui_data->onc_source() == ::onc::ONC_SOURCE_USER_POLICY); - const base::DictionaryValue* new_policy = NULL; + const base::Value* new_policy = nullptr; if (was_managed) { // If we have a GUID that might match a current policy, do a lookup using // that GUID at first. In particular this is necessary, as some networks @@ -179,11 +177,12 @@ new_policy = policy_util::FindMatchingPolicy(all_policies_, *onc_part); } + auto profile_entry_finished_callback = + base::BindOnce(&PolicyApplicator::ProfileEntryFinished, + weak_ptr_factory_.GetWeakPtr(), entry); if (new_policy) { - std::string new_guid; - new_policy->GetStringWithoutPathExpansion(::onc::network_config::kGUID, - &new_guid); - + std::string new_guid = GetGUIDFromONCPart(*new_policy); + DCHECK(!new_guid.empty()); VLOG_IF(1, was_managed && old_guid != new_guid) << "Updating configuration previously managed by policy " << old_guid << " with new policy " << new_guid << "."; @@ -191,136 +190,194 @@ << " to previously unmanaged " << "configuration."; - if (old_guid == new_guid && - remaining_policies_.find(new_guid) == remaining_policies_.end()) { - VLOG(1) << "Not updating existing managed configuration with guid " - << new_guid << " because the policy didn't change."; - } else { - const base::DictionaryValue* user_settings = - ui_data ? ui_data->GetUserSettingsDictionary() : nullptr; - std::unique_ptr<base::DictionaryValue> new_shill_properties = - policy_util::CreateShillConfiguration(profile_, new_guid, - &global_network_config_, - new_policy, user_settings); - // A new policy has to be applied to this profile entry. In order to keep - // implicit state of Shill like "connected successfully before", keep the - // entry if a policy is reapplied (e.g. after reboot) or is updated. - // However, some Shill properties are used to identify the network and - // cannot be modified after initial configuration, so we have to delete - // the profile entry in these cases. Also, keeping Shill's state if the - // SSID changed might not be a good idea anyways. If the policy GUID - // changed, or there was no policy before, we delete the entry at first to - // ensure that no old configuration remains. - if (old_guid == new_guid && - shill_property_util::DoIdentifyingPropertiesMatch( - *new_shill_properties, entry_properties)) { - VLOG(1) << "Updating previously managed configuration with the " - << "updated policy " << new_guid << "."; - } else { - VLOG(1) << "Deleting profile entry before writing new policy " - << new_guid << " because of identifying properties changed."; - DeleteEntry(entry); - } + ApplyNewPolicy(entry, entry_properties, std::move(ui_data), old_guid, + new_guid, *new_policy, + std::move(profile_entry_finished_callback)); + return; + } - // In general, old entries should at first be deleted before new - // configurations are written to prevent inconsistencies. Therefore, we - // delay the writing of the new config here until ~PolicyApplicator. - // E.g. one problematic case is if a policy { {GUID=X, SSID=Y} } is - // applied to the profile entries - // { ENTRY1 = {GUID=X, SSID=X, USER_SETTINGS=X}, - // ENTRY2 = {SSID=Y, ... } }. - // At first ENTRY1 and ENTRY2 should be removed, then the new config be - // written and the result should be: - // { {GUID=X, SSID=Y, USER_SETTINGS=X} } - WriteNewShillConfiguration( - *new_shill_properties, *new_policy, true /* write later */); - remaining_policies_.erase(new_guid); - } - } else if (was_managed) { + if (was_managed) { VLOG(1) << "Removing configuration previously managed by policy " << old_guid << ", because the policy was removed."; // Remove the entry, because the network was managed but isn't anymore. // Note: An alternative might be to preserve the user settings, but it's // unclear which values originating the policy should be removed. - DeleteEntry(entry); - } else { - // The entry wasn't managed and doesn't match any current policy. Global - // network settings have to be applied. - base::DictionaryValue shill_properties_to_update; - policy_util::SetShillPropertiesForGlobalPolicy( - entry_properties, global_network_config_, &shill_properties_to_update); - if (shill_properties_to_update.empty()) { - VLOG(2) << "Ignore unmanaged entry."; - // Calling a SetProperties of Shill with an empty dictionary is a no op. - } else { - VLOG(2) << "Apply global network config to unmanaged entry."; - handler_->UpdateExistingConfigurationWithPropertiesFromPolicy( - entry_properties, shill_properties_to_update); - } + DeleteEntry(entry, std::move(profile_entry_finished_callback)); + return; } - ProfileEntryFinished(entry); + ApplyGlobalPolicyOnUnmanagedEntry(entry, entry_properties, + std::move(profile_entry_finished_callback)); } void PolicyApplicator::GetEntryError(const std::string& entry, const std::string& error_name, const std::string& error_message) { + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); LOG(ERROR) << "Could not retrieve entry " << entry << " of profile " << profile_.path << ": " << error_message; ProfileEntryFinished(entry); } -void PolicyApplicator::DeleteEntry(const std::string& entry) { - ShillProfileClient::Get()->DeleteEntry( - dbus::ObjectPath(profile_.path), entry, base::DoNothing(), - base::Bind(&LogErrorMessage, FROM_HERE)); +void PolicyApplicator::ApplyNewPolicy(const std::string& entry, + const base::Value& entry_properties, + std::unique_ptr<NetworkUIData> ui_data, + const std::string& old_guid, + const std::string& new_guid, + const base::Value& new_policy, + base::OnceClosure callback) { + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + if (old_guid == new_guid && + remaining_policy_guids_.find(new_guid) == remaining_policy_guids_.end()) { + VLOG(1) << "Not updating existing managed configuration with guid " + << new_guid << " because the policy didn't change."; + std::move(callback).Run(); + return; + } + remaining_policy_guids_.erase(new_guid); + + const base::DictionaryValue* new_policy_as_dict = nullptr; + new_policy.GetAsDictionary(&new_policy_as_dict); + DCHECK(new_policy_as_dict); + + const base::DictionaryValue* entry_properties_as_dict = nullptr; + entry_properties.GetAsDictionary(&entry_properties_as_dict); + DCHECK(entry_properties_as_dict); + + const base::DictionaryValue* user_settings = + ui_data ? ui_data->GetUserSettingsDictionary() : nullptr; + std::unique_ptr<base::DictionaryValue> new_shill_properties = + policy_util::CreateShillConfiguration(profile_, new_guid, + &global_network_config_, + new_policy_as_dict, user_settings); + // A new policy has to be applied to this profile entry. In order to keep + // implicit state of Shill like "connected successfully before", keep the + // entry if a policy is reapplied (e.g. after reboot) or is updated. + // However, some Shill properties are used to identify the network and + // cannot be modified after initial configuration, so we have to delete + // the profile entry in these cases. Also, keeping Shill's state if the + // SSID changed might not be a good idea anyways. If the policy GUID + // changed, or there was no policy before, we delete the entry at first to + // ensure that no old configuration remains. + if (old_guid == new_guid && + shill_property_util::DoIdentifyingPropertiesMatch( + *new_shill_properties, *entry_properties_as_dict)) { + VLOG(1) << "Updating previously managed configuration with the " + << "updated policy " << new_guid << "."; + WriteNewShillConfiguration(new_shill_properties->Clone(), + new_policy.Clone(), std::move(callback)); + } else { + VLOG(1) << "Deleting profile entry before writing new policy " << new_guid + << " because of identifying properties changed."; + // In general, old entries should at first be deleted before new + // configurations are written to prevent inconsistencies. Therefore, we + // delay the writing of the new config here until ~PolicyApplicator. + // E.g. one problematic case is if a policy { {GUID=X, SSID=Y} } is + // applied to the profile entries + // { ENTRY1 = {GUID=X, SSID=X, USER_SETTINGS=X}, + // ENTRY2 = {SSID=Y, ... } }. + // At first ENTRY1 and ENTRY2 should be removed, then the new config be + // written and the result should be: + // { {GUID=X, SSID=Y, USER_SETTINGS=X} } + DeleteEntry( + entry, base::BindOnce(&PolicyApplicator::WriteNewShillConfiguration, + weak_ptr_factory_.GetWeakPtr(), + new_shill_properties->Clone(), new_policy.Clone(), + std::move(callback))); + } } -void PolicyApplicator::WriteNewShillConfiguration( - const base::DictionaryValue& shill_dictionary, - const base::DictionaryValue& policy, - bool write_later) { +void PolicyApplicator::ApplyGlobalPolicyOnUnmanagedEntry( + const std::string& entry, + const base::DictionaryValue& entry_properties, + base::OnceClosure callback) { + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + // The entry wasn't managed and doesn't match any current policy. Global + // network settings have to be applied. + base::DictionaryValue shill_properties_to_update; + policy_util::SetShillPropertiesForGlobalPolicy( + entry_properties, global_network_config_, &shill_properties_to_update); + if (shill_properties_to_update.empty()) { + VLOG(2) << "Ignore unmanaged entry."; + // Calling a SetProperties of Shill with an empty dictionary is a no op. + std::move(callback).Run(); + return; + } + VLOG(2) << "Apply global network config to unmanaged entry."; + const base::DictionaryValue* entry_properties_as_dict = nullptr; + entry_properties.GetAsDictionary(&entry_properties_as_dict); + DCHECK(entry_properties_as_dict); + handler_->UpdateExistingConfigurationWithPropertiesFromPolicy( + *entry_properties_as_dict, shill_properties_to_update, + std::move(callback)); +} + +void PolicyApplicator::DeleteEntry(const std::string& entry, + base::OnceClosure callback) { + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + base::RepeatingClosure adapted_callback = + base::AdaptCallbackForRepeating(std::move(callback)); + ShillProfileClient::Get()->DeleteEntry( + dbus::ObjectPath(profile_.path), entry, adapted_callback, + base::BindRepeating(&LogErrorMessageAndInvokeCallback, adapted_callback, + FROM_HERE)); +} + +void PolicyApplicator::WriteNewShillConfiguration(base::Value shill_dictionary, + base::Value policy, + base::OnceClosure callback) { + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); // Ethernet (non EAP) settings, like GUID or UIData, cannot be stored per // user. Abort in that case. - std::string type; - policy.GetStringWithoutPathExpansion(::onc::network_config::kType, &type); - if (type == ::onc::network_type::kEthernet && + const std::string* type = policy.FindStringKey(::onc::network_config::kType); + if (type && *type == ::onc::network_type::kEthernet && profile_.type() == NetworkProfile::TYPE_USER) { - const base::DictionaryValue* ethernet = NULL; - policy.GetDictionaryWithoutPathExpansion(::onc::network_config::kEthernet, - ðernet); - std::string auth; - ethernet->GetStringWithoutPathExpansion(::onc::ethernet::kAuthentication, - &auth); - if (auth == ::onc::ethernet::kAuthenticationNone) - return; + const base::Value* ethernet = policy.FindKeyOfType( + ::onc::network_config::kEthernet, base::Value::Type::DICTIONARY); + if (ethernet) { + const std::string* auth = + ethernet->FindStringKey(::onc::ethernet::kAuthentication); + if (auth && *auth == ::onc::ethernet::kAuthenticationNone) { + std::move(callback).Run(); + return; + } + } } - if (write_later) - new_shill_configurations_.push_back(shill_dictionary.CreateDeepCopy()); - else - handler_->CreateConfigurationFromPolicy(shill_dictionary); + const base::DictionaryValue* shill_dictionary_as_dict; + shill_dictionary.GetAsDictionary(&shill_dictionary_as_dict); + handler_->CreateConfigurationFromPolicy(*shill_dictionary_as_dict, + std::move(callback)); +} + +void PolicyApplicator::ProfileEntryFinished(const std::string& entry) { + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + auto iter = pending_get_entry_calls_.find(entry); + DCHECK(iter != pending_get_entry_calls_.end()); + pending_get_entry_calls_.erase(iter); + if (pending_get_entry_calls_.empty()) + ApplyRemainingPolicies(); } void PolicyApplicator::ApplyRemainingPolicies() { + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); DCHECK(pending_get_entry_calls_.empty()); - // Write all queued configurations now. - for (const auto& configuration : new_shill_configurations_) { - handler_->CreateConfigurationFromPolicy(*configuration); - } - new_shill_configurations_.clear(); - - VLOG_IF(2, !remaining_policies_.empty()) + VLOG_IF(2, !remaining_policy_guids_.empty()) << "Create new managed network configurations in profile" << profile_.ToDebugString() << "."; - // All profile entries were compared to policies. |remaining_policies_| + if (remaining_policy_guids_.empty()) { + NotifyConfigurationHandlerAndFinish(); + return; + } + + // All profile entries were compared to policies. |remaining_policy_guids_| // contains all modified policies that didn't match any entry. For these // remaining policies, new configurations have to be created. - for (std::set<std::string>::iterator it = remaining_policies_.begin(); - it != remaining_policies_.end(); ++it) { + for (std::set<std::string>::iterator it = remaining_policy_guids_.begin(); + it != remaining_policy_guids_.end(); ++it) { const base::DictionaryValue* network_policy = GetByGUID(all_policies_, *it); DCHECK(network_policy); @@ -330,14 +387,25 @@ std::unique_ptr<base::DictionaryValue> shill_dictionary = policy_util::CreateShillConfiguration( profile_, *it, &global_network_config_, network_policy, - NULL /* no user settings */); - WriteNewShillConfiguration( - *shill_dictionary, *network_policy, false /* write now */); + nullptr /* no user settings */); + + handler_->CreateConfigurationFromPolicy( + *shill_dictionary, + base::BindOnce(&PolicyApplicator::RemainingPolicyApplied, + weak_ptr_factory_.GetWeakPtr(), *it /* entry */)); } - remaining_policies_.clear(); +} + +void PolicyApplicator::RemainingPolicyApplied(const std::string& entry) { + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + remaining_policy_guids_.erase(entry); + if (remaining_policy_guids_.empty()) { + NotifyConfigurationHandlerAndFinish(); + } } void PolicyApplicator::NotifyConfigurationHandlerAndFinish() { + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); weak_ptr_factory_.InvalidateWeakPtrs(); handler_->OnPoliciesApplied(profile_); }
diff --git a/chromeos/network/policy_applicator.h b/chromeos/network/policy_applicator.h index 54368b7..d0687f3 100644 --- a/chromeos/network/policy_applicator.h +++ b/chromeos/network/policy_applicator.h
@@ -11,12 +11,15 @@ #include <string> #include <vector> +#include "base/callback_forward.h" #include "base/macros.h" #include "base/memory/weak_ptr.h" +#include "base/sequence_checker.h" #include "base/values.h" #include "chromeos/network/network_profile.h" namespace chromeos { +class NetworkUIData; // This class compares (entry point is Run()) |modified_policies| with the // existing entries in the provided Shill profile |profile|. It fetches all @@ -31,13 +34,18 @@ // Write the new configuration with the properties |shill_properties| to // Shill. This configuration comes from a policy. Any conflicting or // existing configuration for the same network will have been removed - // before. + // before. |callback| will be called after the configuration update has been + // reflected in NetworkStateHandler, or on error. virtual void CreateConfigurationFromPolicy( - const base::DictionaryValue& shill_properties) = 0; + const base::DictionaryValue& shill_properties, + base::OnceClosure callback) = 0; + // before. |callback| will be called after the configuration update has been + // reflected in NetworkStateHandler, or on error. virtual void UpdateExistingConfigurationWithPropertiesFromPolicy( const base::DictionaryValue& existing_properties, - const base::DictionaryValue& new_properties) = 0; + const base::DictionaryValue& new_properties, + base::OnceClosure callback) = 0; // Called after all policies for |profile| were applied. At this point, the // list of networks should be updated. @@ -51,23 +59,18 @@ std::map<std::string, std::unique_ptr<base::DictionaryValue>>; // |handler| must outlive this object. - // |modified_policies| must not be NULL and will be empty afterwards. + // |modified_policy_guids| must not be nullptr and will be empty afterwards. PolicyApplicator(const NetworkProfile& profile, const GuidToPolicyMap& all_policies, const base::DictionaryValue& global_network_config, ConfigurationHandler* handler, - std::set<std::string>* modified_policies); + std::set<std::string>* modified_policy_guids); ~PolicyApplicator(); void Run(); private: - // Removes |entry| from the list of pending profile entries. - // If all entries were processed, applies the remaining policies and notifies - // |handler_|. - void ProfileEntryFinished(const std::string& entry); - // Called with the properties of the profile |profile_|. Requests the // properties of each entry, which are processed by GetEntryCallback. void GetProfilePropertiesCallback( @@ -84,31 +87,68 @@ const std::string& error_name, const std::string& error_message); - // Sends Shill the command to delete profile entry |entry| from |profile_|. - void DeleteEntry(const std::string& entry); + // Applies |new_policy| for |entry|. + // |entry_properties| are the current properties for the entry. |ui_data| is + // the NetworkUIData extracted from |entry_properties| and is passed so it + // doesn't have to be re-extracted. |old_guid| is the current GUID of the + // entry and may be empty. + // |callback| will be called when policy application for |entry| has finished. + void ApplyNewPolicy(const std::string& entry, + const base::Value& entry_properties, + std::unique_ptr<NetworkUIData> ui_data, + const std::string& old_guid, + const std::string& new_guid, + const base::Value& new_policy, + base::OnceClosure callback); - // Sends the Shill configuration |shill_dictionary| to Shill. If |write_later| - // is true, the configuration is queued for sending until ~PolicyApplicator. - void WriteNewShillConfiguration(const base::DictionaryValue& shill_dictionary, - const base::DictionaryValue& policy, - bool write_later); + // Applies the global network policy (if any) on |entry|, + // |entry_properties|} are the current properties for the entry. + // |callback| will be called when policy application for |entry| has finished + // or immediately if no global network policy is present. + void ApplyGlobalPolicyOnUnmanagedEntry( + const std::string& entry, + const base::DictionaryValue& entry_properties, + base::OnceClosure callback); + + // Sends Shill the command to delete profile entry |entry| from |profile_|. + // |callback| will be called when the profile entry has been deleted in shill. + void DeleteEntry(const std::string& entry, base::OnceClosure callback); + + // Applies |shill_dictionary| in shill. |policy_ is the ONC policy blob which + // lead to the policy application. |callback| will be called when policy + // application has finished, i.e. when the policy has been applied in shill + // NetworkStateHandler in chrome has reflected the changes. + void WriteNewShillConfiguration(base::Value shill_dictionary, + base::Value policy, + base::OnceClosure callback); + + // Removes |entry| from the list of pending profile entries. + // If all entries were processed, applies the remaining policies and notifies + // |handler_|. + void ProfileEntryFinished(const std::string& entry); // Creates new entries for all remaining policies, i.e. for which no matching // Profile entry was found. // This should only be called if all profile entries were processed. void ApplyRemainingPolicies(); + // This is called when the remaining policy application for |entry| scheduled + // by ApplyRemainingPolicies has finished. + void RemainingPolicyApplied(const std::string& entry); + // Called after all policies are applied or an error occurred. Notifies // |handler_|. void NotifyConfigurationHandlerAndFinish(); - std::set<std::string> remaining_policies_; + std::set<std::string> remaining_policy_guids_; std::set<std::string> pending_get_entry_calls_; ConfigurationHandler* handler_; NetworkProfile profile_; GuidToPolicyMap all_policies_; base::DictionaryValue global_network_config_; - std::vector<std::unique_ptr<base::DictionaryValue>> new_shill_configurations_; + + SEQUENCE_CHECKER(sequence_checker_); + base::WeakPtrFactory<PolicyApplicator> weak_ptr_factory_; DISALLOW_COPY_AND_ASSIGN(PolicyApplicator);
diff --git a/chromeos/printing/epson_driver_matching.cc b/chromeos/printing/epson_driver_matching.cc index cddbb69..d25b5a6 100644 --- a/chromeos/printing/epson_driver_matching.cc +++ b/chromeos/printing/epson_driver_matching.cc
@@ -30,18 +30,18 @@ case PrinterSearchData::PrinterDiscoveryType::kManual: // For manually discovered printers, supported_document_formats is // retrieved via an ippGetAttributes query to the printer. - return base::ContainsValue(sd.supported_document_formats, - "application/octet-stream"); + return base::Contains(sd.supported_document_formats, + "application/octet-stream"); case PrinterSearchData::PrinterDiscoveryType::kUsb: - return base::ContainsValue(sd.usb_command_set, "ESC/P-R"); + return base::Contains(sd.usb_command_set, "ESC/P-R"); case PrinterSearchData::PrinterDiscoveryType::kZeroconf: // For printers found through mDNS/DNS-SD discovery, // supported_document_formats is retrieved via the Printer Description TXT // Record(from the key 'pdl'). - return base::ContainsValue(sd.supported_document_formats, - "application/vnd.epson.escpr"); + return base::Contains(sd.supported_document_formats, + "application/vnd.epson.escpr"); default: return false;
diff --git a/chromeos/printing/ppd_provider.cc b/chromeos/printing/ppd_provider.cc index 9edf7d17..3a3d226 100644 --- a/chromeos/printing/ppd_provider.cc +++ b/chromeos/printing/ppd_provider.cc
@@ -459,12 +459,12 @@ for (const std::string& make_and_model : search_data.make_and_model) { // Check if we need to load its ppd_index int ppd_index_shard = IndexShard(make_and_model); - if (!base::ContainsKey(cached_ppd_idxs_, ppd_index_shard)) { + if (!base::Contains(cached_ppd_idxs_, ppd_index_shard)) { StartFetch(GetPpdIndexURL(ppd_index_shard), FT_PPD_INDEX); return true; } - if (base::ContainsKey(cached_ppd_idxs_[ppd_index_shard], - make_and_model)) { + if (base::Contains(cached_ppd_idxs_[ppd_index_shard], + make_and_model)) { // Found a hit, satisfy this resolution. RunPpdReferenceResolutionSucceeded(std::move(next.cb), make_and_model); @@ -545,7 +545,7 @@ } DCHECK(!next.reference.effective_make_and_model.empty()); int ppd_index_shard = IndexShard(next.reference.effective_make_and_model); - if (!base::ContainsKey(cached_ppd_idxs_, ppd_index_shard)) { + if (!base::Contains(cached_ppd_idxs_, ppd_index_shard)) { // Have to have the ppd index before we can resolve by ppd server // key. StartFetch(GetPpdIndexURL(ppd_index_shard), FT_PPD_INDEX); @@ -1488,7 +1488,7 @@ void ResolveUsbManufacturer(ResolvePpdReferenceCallback cb, int vendor_id) { std::string manufacturer; - if (base::ContainsKey(GetVendorIdMap(), vendor_id)) { + if (base::Contains(GetVendorIdMap(), vendor_id)) { manufacturer = GetVendorIdMap().at(vendor_id); } else { LOG(ERROR) << "Unable to find vendor_id: " << vendor_id;
diff --git a/chromeos/printing/ppd_provider_unittest.cc b/chromeos/printing/ppd_provider_unittest.cc index 96c0ede..3ea200b 100644 --- a/chromeos/printing/ppd_provider_unittest.cc +++ b/chromeos/printing/ppd_provider_unittest.cc
@@ -186,8 +186,8 @@ // It's sufficient to check for one of the expected locale keys to make sure // we got the right map. - EXPECT_TRUE(base::ContainsValue(result_vec, - "manufacturer_a_" + expected_used_locale)); + EXPECT_TRUE( + base::Contains(result_vec, "manufacturer_a_" + expected_used_locale)); } // Fake server being down, return ERR_ADDRESS_UNREACHABLE for all endpoints
diff --git a/chromeos/services/device_sync/BUILD.gn b/chromeos/services/device_sync/BUILD.gn index dc2a9de..4f1663b7 100644 --- a/chromeos/services/device_sync/BUILD.gn +++ b/chromeos/services/device_sync/BUILD.gn
@@ -25,6 +25,8 @@ "cryptauth_device_registry_impl.h", "cryptauth_device_sync_result.cc", "cryptauth_device_sync_result.h", + "cryptauth_device_syncer.cc", + "cryptauth_device_syncer.h", "cryptauth_enroller.h", "cryptauth_enroller_factory_impl.cc", "cryptauth_enroller_factory_impl.h", @@ -61,6 +63,10 @@ "cryptauth_scheduler.h", "cryptauth_scheduler_impl.cc", "cryptauth_scheduler_impl.h", + "cryptauth_v2_device_manager.cc", + "cryptauth_v2_device_manager.h", + "cryptauth_v2_device_manager_impl.cc", + "cryptauth_v2_device_manager_impl.h", "cryptauth_v2_enroller.cc", "cryptauth_v2_enroller.h", "cryptauth_v2_enroller_impl.cc",
diff --git a/chromeos/services/device_sync/cryptauth_device_registry.cc b/chromeos/services/device_sync/cryptauth_device_registry.cc index 32ad90ae..a0d6fdabef 100644 --- a/chromeos/services/device_sync/cryptauth_device_registry.cc +++ b/chromeos/services/device_sync/cryptauth_device_registry.cc
@@ -14,7 +14,7 @@ CryptAuthDeviceRegistry::~CryptAuthDeviceRegistry() = default; -const base::flat_map<std::string, CryptAuthDevice>& +const CryptAuthDeviceRegistry::InstanceIdToDeviceMap& CryptAuthDeviceRegistry::instance_id_to_device_map() const { return instance_id_to_device_map_; } @@ -28,25 +28,37 @@ return &it->second; } -void CryptAuthDeviceRegistry::AddDevice(const CryptAuthDevice& device) { +bool CryptAuthDeviceRegistry::AddDevice(const CryptAuthDevice& device) { + const CryptAuthDevice* existing_device = GetDevice(device.instance_id()); + if (existing_device && device == *existing_device) + return false; + instance_id_to_device_map_.insert_or_assign(device.instance_id(), device); OnDeviceRegistryUpdated(); + return true; } -void CryptAuthDeviceRegistry::DeleteDevice(const std::string& instance_id) { - DCHECK(base::Contains(instance_id_to_device_map_, instance_id)); +bool CryptAuthDeviceRegistry::DeleteDevice(const std::string& instance_id) { + if (!base::Contains(instance_id_to_device_map_, instance_id)) + return false; + instance_id_to_device_map_.erase(instance_id); OnDeviceRegistryUpdated(); + return true; } -void CryptAuthDeviceRegistry::SetRegistry( - const base::flat_map<std::string, CryptAuthDevice>& +bool CryptAuthDeviceRegistry::SetRegistry( + const CryptAuthDeviceRegistry::InstanceIdToDeviceMap& instance_id_to_device_map) { + if (instance_id_to_device_map_ == instance_id_to_device_map) + return false; + instance_id_to_device_map_ = instance_id_to_device_map; OnDeviceRegistryUpdated(); + return true; } } // namespace device_sync
diff --git a/chromeos/services/device_sync/cryptauth_device_registry.h b/chromeos/services/device_sync/cryptauth_device_registry.h index 6ad0dba4..30c5a687 100644 --- a/chromeos/services/device_sync/cryptauth_device_registry.h +++ b/chromeos/services/device_sync/cryptauth_device_registry.h
@@ -18,11 +18,12 @@ // Stores the devices managed by CryptAuth v2 DeviceSync. class CryptAuthDeviceRegistry { public: + using InstanceIdToDeviceMap = base::flat_map<std::string, CryptAuthDevice>; + virtual ~CryptAuthDeviceRegistry(); // Returns a map from Instance ID to CryptAuthDevice. - const base::flat_map<std::string, CryptAuthDevice>& - instance_id_to_device_map() const; + const InstanceIdToDeviceMap& instance_id_to_device_map() const; // Returns the device with Instance ID |instance_id| if it exists in the // registry, and returns null if it cannot be found. @@ -30,14 +31,16 @@ // Adds |device| to the registry. If a device with the same Instance ID // already exists in the registry, the existing device will be overwritten. - void AddDevice(const CryptAuthDevice& device); + // Returns true if the registry changes. + bool AddDevice(const CryptAuthDevice& device); - // Removes the device with corresponding |instance_id|. - void DeleteDevice(const std::string& instance_id); + // Removes the device with corresponding |instance_id|. Returns true if the + // registry changes. + bool DeleteDevice(const std::string& instance_id); - // Replaces the entire registry with |instance_id_to_device_map|. - void SetRegistry(const base::flat_map<std::string, CryptAuthDevice>& - instance_id_to_device_map); + // Replaces the entire registry with |instance_id_to_device_map|. Returns true + // if the registry changes. + bool SetRegistry(const InstanceIdToDeviceMap& instance_id_to_device_map); protected: CryptAuthDeviceRegistry(); @@ -46,7 +49,7 @@ virtual void OnDeviceRegistryUpdated() = 0; private: - base::flat_map<std::string, CryptAuthDevice> instance_id_to_device_map_; + InstanceIdToDeviceMap instance_id_to_device_map_; DISALLOW_COPY_AND_ASSIGN(CryptAuthDeviceRegistry); };
diff --git a/chromeos/services/device_sync/cryptauth_device_registry_impl.cc b/chromeos/services/device_sync/cryptauth_device_registry_impl.cc index da9a9f7..a27fdce 100644 --- a/chromeos/services/device_sync/cryptauth_device_registry_impl.cc +++ b/chromeos/services/device_sync/cryptauth_device_registry_impl.cc
@@ -7,7 +7,6 @@ #include <string> #include <utility> -#include "base/containers/flat_map.h" #include "base/memory/ptr_util.h" #include "base/no_destructor.h" #include "base/optional.h" @@ -59,7 +58,7 @@ : pref_service_(pref_service) { const base::Value* dict = pref_service_->Get(prefs::kCryptAuthDeviceRegistry); - base::flat_map<std::string, CryptAuthDevice> instance_id_to_device_map; + CryptAuthDeviceRegistry::InstanceIdToDeviceMap instance_id_to_device_map; for (const std::pair<const std::string&, const base::Value&>& id_device_pair : dict->DictItems()) { base::Optional<std::string> instance_id =
diff --git a/chromeos/services/device_sync/cryptauth_device_registry_impl_unittest.cc b/chromeos/services/device_sync/cryptauth_device_registry_impl_unittest.cc index 5f01f5e..08ea263 100644 --- a/chromeos/services/device_sync/cryptauth_device_registry_impl_unittest.cc +++ b/chromeos/services/device_sync/cryptauth_device_registry_impl_unittest.cc
@@ -9,13 +9,13 @@ #include <string> #include <utility> -#include "base/containers/flat_map.h" #include "base/macros.h" #include "base/no_destructor.h" #include "base/time/time.h" #include "base/values.h" #include "chromeos/components/multidevice/software_feature.h" #include "chromeos/components/multidevice/software_feature_state.h" +#include "chromeos/services/device_sync/cryptauth_device_registry.h" #include "chromeos/services/device_sync/pref_names.h" #include "chromeos/services/device_sync/proto/cryptauth_better_together_device_metadata.pb.h" #include "chromeos/services/device_sync/proto/cryptauth_v2_test_util.h" @@ -87,7 +87,7 @@ } base::Value AsDictionary( - const base::flat_map<std::string, CryptAuthDevice>& devices) const { + const CryptAuthDeviceRegistry::InstanceIdToDeviceMap& devices) const { base::Value dict(base::Value::Type::DICTIONARY); for (const std::pair<std::string, CryptAuthDevice>& id_device_pair : devices) { @@ -99,7 +99,7 @@ } void VerifyDeviceRegistry( - const base::flat_map<std::string, CryptAuthDevice>& expected_devices) { + const CryptAuthDeviceRegistry::InstanceIdToDeviceMap& expected_devices) { EXPECT_EQ(expected_devices, device_registry()->instance_id_to_device_map()); // Verify pref. @@ -122,8 +122,9 @@ TEST_F(DeviceSyncCryptAuthDeviceRegistryImplTest, AddAndGetDevices) { CreateDeviceRegistry(); - device_registry()->AddDevice(GetDeviceForTest(0)); - device_registry()->AddDevice(GetDeviceForTest(1)); + EXPECT_TRUE(device_registry()->AddDevice(GetDeviceForTest(0))); + EXPECT_FALSE(device_registry()->AddDevice(GetDeviceForTest(0))); + EXPECT_TRUE(device_registry()->AddDevice(GetDeviceForTest(1))); VerifyDeviceRegistry( {{kInstanceId0, GetDeviceForTest(0)}, @@ -135,13 +136,13 @@ TEST_F(DeviceSyncCryptAuthDeviceRegistryImplTest, OverwriteDevice) { CreateDeviceRegistry(); - device_registry()->AddDevice(GetDeviceForTest(0)); + EXPECT_TRUE(device_registry()->AddDevice(GetDeviceForTest(0))); EXPECT_EQ(GetDeviceForTest(0), *device_registry()->GetDevice(kInstanceId0)); CryptAuthDevice device_with_same_instance_id( kInstanceId0, "name", "key", base::Time::FromDoubleT(5000), cryptauthv2::BetterTogetherDeviceMetadata(), {}); - device_registry()->AddDevice(device_with_same_instance_id); + EXPECT_TRUE(device_registry()->AddDevice(device_with_same_instance_id)); EXPECT_EQ(device_with_same_instance_id, *device_registry()->GetDevice(kInstanceId0)); } @@ -149,31 +150,33 @@ TEST_F(DeviceSyncCryptAuthDeviceRegistryImplTest, OverwriteRegistry) { CreateDeviceRegistry(); - base::flat_map<std::string, CryptAuthDevice> old_devices = { + CryptAuthDeviceRegistry::InstanceIdToDeviceMap old_devices = { {kInstanceId0, GetDeviceForTest(0)}}; - device_registry()->SetRegistry(old_devices); + EXPECT_TRUE(device_registry()->SetRegistry(old_devices)); VerifyDeviceRegistry(old_devices); + EXPECT_FALSE(device_registry()->SetRegistry(old_devices)); - base::flat_map<std::string, CryptAuthDevice> new_devices = { + CryptAuthDeviceRegistry::InstanceIdToDeviceMap new_devices = { {kInstanceId1, GetDeviceForTest(1)}}; - device_registry()->SetRegistry(new_devices); + EXPECT_TRUE(device_registry()->SetRegistry(new_devices)); VerifyDeviceRegistry(new_devices); } TEST_F(DeviceSyncCryptAuthDeviceRegistryImplTest, DeleteDevice) { CreateDeviceRegistry(); - device_registry()->AddDevice(GetDeviceForTest(0)); + EXPECT_TRUE(device_registry()->AddDevice(GetDeviceForTest(0))); VerifyDeviceRegistry( {{kInstanceId0, GetDeviceForTest(0)}} /* expected_devices */); - device_registry()->DeleteDevice(kInstanceId0); + EXPECT_TRUE(device_registry()->DeleteDevice(kInstanceId0)); EXPECT_FALSE(device_registry()->GetDevice(kInstanceId0)); VerifyDeviceRegistry({} /* expected_devices */); + EXPECT_FALSE(device_registry()->DeleteDevice(kInstanceId0)); } TEST_F(DeviceSyncCryptAuthDeviceRegistryImplTest, PopulateRegistryFromPref) { - base::flat_map<std::string, CryptAuthDevice> expected_devices = { + CryptAuthDeviceRegistry::InstanceIdToDeviceMap expected_devices = { {kInstanceId0, GetDeviceForTest(0)}, {kInstanceId1, GetDeviceForTest(1)}}; pref_service()->Set(prefs::kCryptAuthDeviceRegistry, AsDictionary(expected_devices));
diff --git a/chromeos/services/device_sync/cryptauth_device_sync_result.h b/chromeos/services/device_sync/cryptauth_device_sync_result.h index cdb751e..651fe1b 100644 --- a/chromeos/services/device_sync/cryptauth_device_sync_result.h +++ b/chromeos/services/device_sync/cryptauth_device_sync_result.h
@@ -15,10 +15,8 @@ namespace device_sync { // Information about the result of a CryptAuth v2 DeviceSync attempt. -// -// These values are persisted to logs. Entries should not be renumbered and -// numeric values should never be reused. If entries are added, kMaxValue should -// be updated. +// TODO(nohle): Add a HaveDevicesChanged() function that returns true if the +// synced-device registry changes. class CryptAuthDeviceSyncResult { public: // Enum class to denote the result of a CryptAuth v2 DeviceSync attempt.
diff --git a/chromeos/services/device_sync/cryptauth_device_syncer.cc b/chromeos/services/device_sync/cryptauth_device_syncer.cc new file mode 100644 index 0000000..a8ca2f3c --- /dev/null +++ b/chromeos/services/device_sync/cryptauth_device_syncer.cc
@@ -0,0 +1,37 @@ +// 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 "chromeos/services/device_sync/cryptauth_device_syncer.h" + +#include <utility> + +namespace chromeos { + +namespace device_sync { + +CryptAuthDeviceSyncer::CryptAuthDeviceSyncer() = default; + +CryptAuthDeviceSyncer::~CryptAuthDeviceSyncer() = default; + +void CryptAuthDeviceSyncer::Sync( + const cryptauthv2::RequestContext& request_context, + DeviceSyncAttemptFinishedCallback callback) { + // Enforce that Sync() can only be called once. + DCHECK(!was_sync_called_); + was_sync_called_ = true; + + callback_ = std::move(callback); + + OnAttemptStarted(request_context); +} + +void CryptAuthDeviceSyncer::OnAttemptFinished( + const CryptAuthDeviceSyncResult& device_sync_result) { + DCHECK(callback_); + std::move(callback_).Run(device_sync_result); +} + +} // namespace device_sync + +} // namespace chromeos
diff --git a/chromeos/services/device_sync/cryptauth_device_syncer.h b/chromeos/services/device_sync/cryptauth_device_syncer.h new file mode 100644 index 0000000..6c9b05c9 --- /dev/null +++ b/chromeos/services/device_sync/cryptauth_device_syncer.h
@@ -0,0 +1,100 @@ +// 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 CHROMEOS_SERVICES_DEVICE_SYNC_CRYPTAUTH_DEVICE_SYNCER_H_ +#define CHROMEOS_SERVICES_DEVICE_SYNC_CRYPTAUTH_DEVICE_SYNCER_H_ + +#include "base/callback.h" +#include "base/macros.h" +#include "base/optional.h" + +namespace cryptauthv2 { +class RequestContext; +} // namespace cryptauthv2 + +namespace chromeos { + +namespace device_sync { + +class CryptAuthDeviceSyncResult; + +// Implements the client end of the CryptAuth v2 DeviceSync protocol, which +// consists of three to four request/response interactions with the CryptAuth +// servers: +// +// 1a) First SyncMetadataRequest: Contains what this device believes to be the +// group public key. This could be a newly generated key or one from local +// storage. The device's metadata is encrypted with this key and included in +// the request. +// +// 1b) First SyncMetadataResponse: The response from CryptAuth possibly includes +// the correct group key pair, where the private key is encrypted with this +// device's CryptAuthKeyBunde::kDeviceSyncBetterTogether public key. If the +// group public key is not set, the server is indicating that a new group +// key pair must be created by this device. In this case or if the group +// public key in the response differs from the one sent in the request, +// another SyncMetadataRequest is made. Otherwise, the second +// SyncMetadataRequest is skipped and the encrypted remote device metadata +// is decrypted using the group private key. +// +// 2a) (Possible) Second SyncMetadataRequest: Not invoked if the group public +// key from the first SyncMetadataResponse (1b) matches that sent in the +// first SyncMetadataRequest (1a). Now that the correct group key pair has +// been established, another request is made. +// +// 2b) (Possible) Second SyncMetadataResponse: The included remote device +// metadata can now be decrypted. The remote devices are only those +// registered in the DeviceSync:BetterTogether group, in other words, those +// using v2 DeviceSync. +// +// 3) BatchGetFeatureStatusesRequest/Response: Gets the supported and enabled +// states of all multidevice (BetterTogether) features for all devices. +// +// 4a) ShareGroupPrivateKeyRequest: Sends CryptAuth the device's group private +// key encrypted with each remote device's +// CryptAuthKeyBundle::kDeviceSyncBetterTogether public key. This ensures +// end-to-end encryption of the group private key and consequently the +// device metadata. +// +// 4b) ShareGroupPrivateKeyResponse: We view this response as an indication that +// the ShareGroupPrivateKeyRequest was successful. +// +// A CryptAuthDeviceSyncer object is designed to be used for only one Sync() +// call. For a new DeviceSync attempt, a new object should be created. +class CryptAuthDeviceSyncer { + public: + virtual ~CryptAuthDeviceSyncer(); + + using DeviceSyncAttemptFinishedCallback = + base::OnceCallback<void(const CryptAuthDeviceSyncResult&)>; + + // Starts the v2 DeviceSync flow. + // |request_context|: Information about the DeviceSync attempt--such as + // invocation reason and device identifiers--that is sent to CryptAuth in + // each request. + // |callback|: Invoked when the DeviceSync attempt concludes, successfully or + // not. The CryptAuthDeviceSyncResult provides information about the + // outcome of the DeviceSync attempt and possibly a new ClientDirective. + void Sync(const cryptauthv2::RequestContext& request_context, + DeviceSyncAttemptFinishedCallback callback); + + protected: + CryptAuthDeviceSyncer(); + + virtual void OnAttemptStarted( + const cryptauthv2::RequestContext& request_context) = 0; + + void OnAttemptFinished(const CryptAuthDeviceSyncResult& device_sync_result); + + DeviceSyncAttemptFinishedCallback callback_; + bool was_sync_called_ = false; + + DISALLOW_COPY_AND_ASSIGN(CryptAuthDeviceSyncer); +}; + +} // namespace device_sync + +} // namespace chromeos + +#endif // CHROMEOS_SERVICES_DEVICE_SYNC_CRYPTAUTH_DEVICE_SYNCER_H_
diff --git a/chromeos/services/device_sync/cryptauth_enrollment_manager.h b/chromeos/services/device_sync/cryptauth_enrollment_manager.h index 8e6c3a6..48eb09a 100644 --- a/chromeos/services/device_sync/cryptauth_enrollment_manager.h +++ b/chromeos/services/device_sync/cryptauth_enrollment_manager.h
@@ -45,10 +45,9 @@ // Begins scheduling periodic enrollment attempts. virtual void Start() = 0; - // Skips the waiting period and forces an enrollment immediately. If an - // enrollment is already in progress, this function does nothing. + // Skips the waiting period and requests an immediate enrollment. // |invocation_reason|: Specifies the reason that the enrollment was - // triggered, which is upload to the server. + // triggered, which is uploaded to the server. // |session_id|: The session ID sent by CryptAuth v2 in a GCM message // requesting enrollment. Null if enrollment was not triggered // by a GCM message or if no session ID was included in the GCM
diff --git a/chromeos/services/device_sync/cryptauth_v2_device_manager.cc b/chromeos/services/device_sync/cryptauth_v2_device_manager.cc new file mode 100644 index 0000000..093dc94c --- /dev/null +++ b/chromeos/services/device_sync/cryptauth_v2_device_manager.cc
@@ -0,0 +1,37 @@ +// 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 "chromeos/services/device_sync/cryptauth_v2_device_manager.h" + +namespace chromeos { + +namespace device_sync { + +CryptAuthV2DeviceManager::CryptAuthV2DeviceManager() = default; + +CryptAuthV2DeviceManager::~CryptAuthV2DeviceManager() = default; + +void CryptAuthV2DeviceManager::AddObserver(Observer* observer) { + observers_.AddObserver(observer); +} + +void CryptAuthV2DeviceManager::RemoveObserver(Observer* observer) { + observers_.RemoveObserver(observer); +} + +void CryptAuthV2DeviceManager::NotifyDeviceSyncStarted( + const cryptauthv2::ClientMetadata& client_metadata) { + for (auto& observer : observers_) + observer.OnDeviceSyncStarted(client_metadata); +} + +void CryptAuthV2DeviceManager::NotifyDeviceSyncFinished( + const CryptAuthDeviceSyncResult& device_sync_result) { + for (auto& observer : observers_) + observer.OnDeviceSyncFinished(device_sync_result); +} + +} // namespace device_sync + +} // namespace chromeos
diff --git a/chromeos/services/device_sync/cryptauth_v2_device_manager.h b/chromeos/services/device_sync/cryptauth_v2_device_manager.h new file mode 100644 index 0000000..cde63390 --- /dev/null +++ b/chromeos/services/device_sync/cryptauth_v2_device_manager.h
@@ -0,0 +1,94 @@ +// 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 CHROMEOS_SERVICES_DEVICE_SYNC_CRYPTAUTH_V2_DEVICE_MANAGER_H_ +#define CHROMEOS_SERVICES_DEVICE_SYNC_CRYPTAUTH_V2_DEVICE_MANAGER_H_ + +#include <string> + +#include "base/macros.h" +#include "base/observer_list.h" +#include "base/observer_list_types.h" +#include "base/optional.h" +#include "base/time/time.h" +#include "chromeos/services/device_sync/cryptauth_device.h" +#include "chromeos/services/device_sync/cryptauth_device_registry.h" +#include "chromeos/services/device_sync/cryptauth_device_sync_result.h" +#include "chromeos/services/device_sync/proto/cryptauth_common.pb.h" + +namespace chromeos { + +namespace device_sync { + +// Manages syncing the user's devices that are registered with CryptAuth v2's +// "DeviceSync:BetterTogether" group. +class CryptAuthV2DeviceManager { + public: + class Observer : public base::CheckedObserver { + public: + virtual void OnDeviceSyncStarted( + const cryptauthv2::ClientMetadata& client_metadata) {} + + virtual void OnDeviceSyncFinished( + const CryptAuthDeviceSyncResult& device_sync_result) {} + }; + + virtual ~CryptAuthV2DeviceManager(); + + void AddObserver(Observer* observer); + void RemoveObserver(Observer* observer); + + // Starts DeviceSync v2 scheduling. Should only be called once. + virtual void Start() = 0; + + // Returns a map from Instance ID to CryptAuthDevice of synced devices. This + // method makes no calls to CryptAuth, instead returning the local cache of + // devices from the most recent DeviceSync. + virtual const CryptAuthDeviceRegistry::InstanceIdToDeviceMap& + GetSyncedDevices() const = 0; + + // Requests an immediate v2 DeviceSync. + // |invocation_reason|: Specifies the reason that the DeviceSync was + // triggered, which is uploaded to the server. + // |session_id|: The session ID sent by CryptAuth v2 in a GCM message + // requesting a DeviceSync. Null if DeviceSync was not triggered + // by a GCM message or if no session ID was included in the GCM + // message. + virtual void ForceDeviceSyncNow( + const cryptauthv2::ClientMetadata::InvocationReason&, + const base::Optional<std::string>& session_id) = 0; + + // Returns true if a v2 DeviceSync attempt is currently in progress. + virtual bool IsDeviceSyncInProgress() const = 0; + + // Returns true if the last v2 DeviceSync attempt failed. + virtual bool IsRecoveringFromFailure() const = 0; + + // Returns the time of the last successful v2 DeviceSync. Returns null if no + // successful v2 DeviceSync has ever occurred. + virtual base::Optional<base::Time> GetLastDeviceSyncTime() const = 0; + + // Returns the time until the next scheduled v2 DeviceSync request. Returns + // null if there is no request scheduled. + virtual base::Optional<base::TimeDelta> GetTimeToNextAttempt() const = 0; + + protected: + CryptAuthV2DeviceManager(); + + void NotifyDeviceSyncStarted( + const cryptauthv2::ClientMetadata& client_metadata); + void NotifyDeviceSyncFinished( + const CryptAuthDeviceSyncResult& device_sync_result); + + private: + base::ObserverList<Observer> observers_; + + DISALLOW_COPY_AND_ASSIGN(CryptAuthV2DeviceManager); +}; + +} // namespace device_sync + +} // namespace chromeos + +#endif // CHROMEOS_SERVICES_DEVICE_SYNC_CRYPTAUTH_V2_DEVICE_MANAGER_H_
diff --git a/chromeos/services/device_sync/cryptauth_v2_device_manager_impl.cc b/chromeos/services/device_sync/cryptauth_v2_device_manager_impl.cc new file mode 100644 index 0000000..db8e590 --- /dev/null +++ b/chromeos/services/device_sync/cryptauth_v2_device_manager_impl.cc
@@ -0,0 +1,165 @@ +// 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 "chromeos/services/device_sync/cryptauth_v2_device_manager_impl.h" + +#include "base/memory/ptr_util.h" +#include "base/no_destructor.h" +#include "chromeos/components/multidevice/logging/logging.h" +#include "chromeos/services/device_sync/cryptauth_client.h" +#include "chromeos/services/device_sync/cryptauth_key_registry.h" + +namespace chromeos { + +namespace device_sync { + +// static +CryptAuthV2DeviceManagerImpl::Factory* + CryptAuthV2DeviceManagerImpl::Factory::test_factory_ = nullptr; + +// static +CryptAuthV2DeviceManagerImpl::Factory* +CryptAuthV2DeviceManagerImpl::Factory::Get() { + if (test_factory_) + return test_factory_; + + static base::NoDestructor<CryptAuthV2DeviceManagerImpl::Factory> factory; + return factory.get(); +} + +// static +void CryptAuthV2DeviceManagerImpl::Factory::SetFactoryForTesting( + Factory* test_factory) { + test_factory_ = test_factory; +} + +CryptAuthV2DeviceManagerImpl::Factory::~Factory() = default; + +std::unique_ptr<CryptAuthV2DeviceManager> +CryptAuthV2DeviceManagerImpl::Factory::BuildInstance( + CryptAuthDeviceRegistry* device_registry, + CryptAuthKeyRegistry* key_registry, + CryptAuthClientFactory* client_factory, + CryptAuthGCMManager* gcm_manager, + CryptAuthScheduler* scheduler) { + return base::WrapUnique(new CryptAuthV2DeviceManagerImpl( + device_registry, key_registry, client_factory, gcm_manager, scheduler)); +} + +CryptAuthV2DeviceManagerImpl::CryptAuthV2DeviceManagerImpl( + CryptAuthDeviceRegistry* device_registry, + CryptAuthKeyRegistry* key_registry, + CryptAuthClientFactory* client_factory, + CryptAuthGCMManager* gcm_manager, + CryptAuthScheduler* scheduler) + : device_registry_(device_registry), + gcm_manager_(gcm_manager), + scheduler_(scheduler), + scheduler_weak_ptr_factory_(this) { + gcm_manager_->AddObserver(this); +} + +CryptAuthV2DeviceManagerImpl::~CryptAuthV2DeviceManagerImpl() { + gcm_manager_->RemoveObserver(this); +} + +void CryptAuthV2DeviceManagerImpl::Start() { + scheduler_->StartDeviceSyncScheduling( + scheduler_weak_ptr_factory_.GetWeakPtr()); +} + +const CryptAuthDeviceRegistry::InstanceIdToDeviceMap& +CryptAuthV2DeviceManagerImpl::GetSyncedDevices() const { + return device_registry_->instance_id_to_device_map(); +} + +void CryptAuthV2DeviceManagerImpl::ForceDeviceSyncNow( + const cryptauthv2::ClientMetadata::InvocationReason& invocation_reason, + const base::Optional<std::string>& session_id) { + scheduler_->RequestDeviceSync(invocation_reason, session_id); +} + +base::Optional<base::Time> CryptAuthV2DeviceManagerImpl::GetLastDeviceSyncTime() + const { + return scheduler_->GetLastSuccessfulDeviceSyncTime(); +} + +base::Optional<base::TimeDelta> +CryptAuthV2DeviceManagerImpl::GetTimeToNextAttempt() const { + return scheduler_->GetTimeToNextDeviceSyncRequest(); +} + +bool CryptAuthV2DeviceManagerImpl::IsDeviceSyncInProgress() const { + return scheduler_->IsWaitingForDeviceSyncResult(); +} + +bool CryptAuthV2DeviceManagerImpl::IsRecoveringFromFailure() const { + return scheduler_->GetNumConsecutiveDeviceSyncFailures() > 0; +} + +void CryptAuthV2DeviceManagerImpl::OnDeviceSyncRequested( + const cryptauthv2::ClientMetadata& client_metadata) { + NotifyDeviceSyncStarted(client_metadata); + + current_client_metadata_ = client_metadata; + + // TODO(nohle): Log invocation reason metric. + + // TODO(nohle): Start DeviceSync flow here. +} + +void CryptAuthV2DeviceManagerImpl::OnResyncMessage( + const base::Optional<std::string>& session_id, + const base::Optional<CryptAuthFeatureType>& feature_type) { + PA_LOG(VERBOSE) << "Received GCM message to re-sync devices (session ID: " + << session_id.value_or("[No session ID]") << ")"; + + ForceDeviceSyncNow(cryptauthv2::ClientMetadata::SERVER_INITIATED, session_id); +} + +void CryptAuthV2DeviceManagerImpl::OnDeviceSyncFinished( + const CryptAuthDeviceSyncResult& device_sync_result) { + // TODO(nohle): Invalidate callback weak pointers, if applicable, and reset + // the DeviceSyncer instance. + + if (device_sync_result.IsSuccess()) { + PA_LOG(INFO) << "DeviceSync attempt with invocation reason " + << current_client_metadata_->invocation_reason() + << " succeeded with result code " + << device_sync_result.result_code(); + + // TODO(nohle): Log if the devices changed. + } else { + PA_LOG(WARNING) << "DeviceSync attempt with invocation reason " + << current_client_metadata_->invocation_reason() + << " failed with result code " + << device_sync_result.result_code(); + } + + current_client_metadata_.reset(); + + // TODO(nohle): Log DeviceSync result metrics: success, result code, and if + // devices changed. + + scheduler_->HandleDeviceSyncResult(device_sync_result); + + base::Optional<base::TimeDelta> time_to_next_attempt = GetTimeToNextAttempt(); + if (time_to_next_attempt) { + PA_LOG(INFO) << "Time until next DeviceSync attempt: " + << *time_to_next_attempt; + } else { + PA_LOG(INFO) << "No future DeviceSync requests currently scheduled"; + } + + if (!device_sync_result.IsSuccess()) { + PA_LOG(INFO) << "Number of consecutive Enrollment failures: " + << scheduler_->GetNumConsecutiveEnrollmentFailures(); + } + + NotifyDeviceSyncFinished(device_sync_result); +} + +} // namespace device_sync + +} // namespace chromeos
diff --git a/chromeos/services/device_sync/cryptauth_v2_device_manager_impl.h b/chromeos/services/device_sync/cryptauth_v2_device_manager_impl.h new file mode 100644 index 0000000..814f27bc --- /dev/null +++ b/chromeos/services/device_sync/cryptauth_v2_device_manager_impl.h
@@ -0,0 +1,109 @@ +// 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 CHROMEOS_SERVICES_DEVICE_SYNC_CRYPTAUTH_V2_DEVICE_MANAGER_IMPL_H_ +#define CHROMEOS_SERVICES_DEVICE_SYNC_CRYPTAUTH_V2_DEVICE_MANAGER_IMPL_H_ + +#include <memory> +#include <string> + +#include "base/macros.h" +#include "base/memory/weak_ptr.h" +#include "base/optional.h" +#include "base/time/time.h" +#include "chromeos/services/device_sync/cryptauth_device_registry.h" +#include "chromeos/services/device_sync/cryptauth_device_sync_result.h" +#include "chromeos/services/device_sync/cryptauth_gcm_manager.h" +#include "chromeos/services/device_sync/cryptauth_scheduler.h" +#include "chromeos/services/device_sync/cryptauth_v2_device_manager.h" +#include "chromeos/services/device_sync/proto/cryptauth_common.pb.h" + +namespace chromeos { + +namespace device_sync { + +class CryptAuthClientFactory; +class CryptAuthKeyRegistry; + +// Implementation of CryptAuthV2DeviceManager that considers three sources of +// DeviceSync requests: +// 1) The scheduler requests a DeviceSync to recover from a failed attempt or +// after receiving an InvokeNext instruction from CryptAuth in a +// ClientDirective. +// 2) The device manager listens to the GCM manager for re-sync requests. +// 3) The ForceDeviceSyncNow() method allows for immediate requests. +class CryptAuthV2DeviceManagerImpl + : public CryptAuthV2DeviceManager, + public CryptAuthScheduler::DeviceSyncDelegate, + public CryptAuthGCMManager::Observer { + public: + class Factory { + public: + static Factory* Get(); + static void SetFactoryForTesting(Factory* test_factory); + virtual ~Factory(); + virtual std::unique_ptr<CryptAuthV2DeviceManager> BuildInstance( + CryptAuthDeviceRegistry* device_registry, + CryptAuthKeyRegistry* key_registry, + CryptAuthClientFactory* client_factory, + CryptAuthGCMManager* gcm_manager, + CryptAuthScheduler* scheduler); + + private: + static Factory* test_factory_; + }; + + ~CryptAuthV2DeviceManagerImpl() override; + + protected: + CryptAuthV2DeviceManagerImpl(CryptAuthDeviceRegistry* device_registry, + CryptAuthKeyRegistry* key_registry, + CryptAuthClientFactory* client_factory, + CryptAuthGCMManager* gcm_manager, + CryptAuthScheduler* scheduler); + + private: + // CryptAuthV2DeviceManager: + void Start() override; + const CryptAuthDeviceRegistry::InstanceIdToDeviceMap& GetSyncedDevices() + const override; + void ForceDeviceSyncNow( + const cryptauthv2::ClientMetadata::InvocationReason&, + const base::Optional<std::string>& session_id) override; + bool IsDeviceSyncInProgress() const override; + bool IsRecoveringFromFailure() const override; + base::Optional<base::Time> GetLastDeviceSyncTime() const override; + base::Optional<base::TimeDelta> GetTimeToNextAttempt() const override; + + // CryptAuthScheduler::DeviceSyncDelegate: + void OnDeviceSyncRequested( + const cryptauthv2::ClientMetadata& client_metadata) override; + + // CryptAuthGCMManager::Observer: + void OnResyncMessage( + const base::Optional<std::string>& session_id, + const base::Optional<CryptAuthFeatureType>& feature_type) override; + + void OnDeviceSyncFinished( + const CryptAuthDeviceSyncResult& device_sync_result); + + CryptAuthDeviceRegistry* device_registry_ = nullptr; + CryptAuthGCMManager* gcm_manager_ = nullptr; + CryptAuthScheduler* scheduler_ = nullptr; + + base::Optional<cryptauthv2::ClientMetadata> current_client_metadata_; + + // For sending a weak pointer to the scheduler, whose lifetime exceeds that of + // CryptAuthV2DeviceManagerImpl. + base::WeakPtrFactory<CryptAuthV2DeviceManagerImpl> + scheduler_weak_ptr_factory_; + + DISALLOW_COPY_AND_ASSIGN(CryptAuthV2DeviceManagerImpl); +}; + +} // namespace device_sync + +} // namespace chromeos + +#endif // CHROMEOS_SERVICES_DEVICE_SYNC_CRYPTAUTH_V2_DEVICE_MANAGER_IMPL_H_
diff --git a/chromeos/services/device_sync/cryptauth_v2_enroller.h b/chromeos/services/device_sync/cryptauth_v2_enroller.h index 8a033ec..ef869650 100644 --- a/chromeos/services/device_sync/cryptauth_v2_enroller.h +++ b/chromeos/services/device_sync/cryptauth_v2_enroller.h
@@ -50,7 +50,8 @@ // 2b) EnrollKeysResponse: We simply view this response as an indication that // the EnrollKeysRequest was successful. // -// An instance of this class can only call Enroll() once. +// A CryptAuthV2Enroller object is designed to be used for only one Enroll() +// call. For a new Enrollment attempt, a new object should be created. class CryptAuthV2Enroller { public: virtual ~CryptAuthV2Enroller();
diff --git a/chromeos/services/multidevice_setup/eligible_host_devices_provider_impl_unittest.cc b/chromeos/services/multidevice_setup/eligible_host_devices_provider_impl_unittest.cc index 0c2ca99..5aa44b1 100644 --- a/chromeos/services/multidevice_setup/eligible_host_devices_provider_impl_unittest.cc +++ b/chromeos/services/multidevice_setup/eligible_host_devices_provider_impl_unittest.cc
@@ -113,11 +113,11 @@ base::flat_set<multidevice::RemoteDeviceRef> eligible_devices = provider()->GetEligibleHostDevices(); - EXPECT_TRUE(base::ContainsKey(eligible_devices, test_devices()[0])); - EXPECT_TRUE(base::ContainsKey(eligible_devices, test_devices()[1])); - EXPECT_TRUE(base::ContainsKey(eligible_devices, test_devices()[2])); - EXPECT_TRUE(base::ContainsKey(eligible_devices, test_devices()[3])); - EXPECT_FALSE(base::ContainsKey(eligible_devices, test_devices()[4])); + EXPECT_TRUE(base::Contains(eligible_devices, test_devices()[0])); + EXPECT_TRUE(base::Contains(eligible_devices, test_devices()[1])); + EXPECT_TRUE(base::Contains(eligible_devices, test_devices()[2])); + EXPECT_TRUE(base::Contains(eligible_devices, test_devices()[3])); + EXPECT_FALSE(base::Contains(eligible_devices, test_devices()[4])); } } // namespace multidevice_setup
diff --git a/chromeos/services/multidevice_setup/feature_state_manager_impl.cc b/chromeos/services/multidevice_setup/feature_state_manager_impl.cc index 231125d..ea9545e1 100644 --- a/chromeos/services/multidevice_setup/feature_state_manager_impl.cc +++ b/chromeos/services/multidevice_setup/feature_state_manager_impl.cc
@@ -310,7 +310,7 @@ bool FeatureStateManagerImpl::IsAllowedByPolicy(mojom::Feature feature) { // If no policy preference exists for this feature, the feature is implicitly // allowed. - if (!base::ContainsKey(feature_to_allowed_pref_name_map_, feature)) + if (!base::Contains(feature_to_allowed_pref_name_map_, feature)) return true; return pref_service_->GetBoolean(feature_to_allowed_pref_name_map_[feature]); @@ -390,7 +390,7 @@ mojom::FeatureState FeatureStateManagerImpl::GetEnabledOrDisabledState( mojom::Feature feature) { - if (!base::ContainsKey(feature_to_enabled_pref_name_map_, feature)) { + if (!base::Contains(feature_to_enabled_pref_name_map_, feature)) { PA_LOG(ERROR) << "FeatureStateManagerImpl::GetEnabledOrDisabledState(): " << "Feature not present in \"enabled pref\" map: " << feature; NOTREACHED();
diff --git a/chromeos/services/multidevice_setup/host_backend_delegate_impl.cc b/chromeos/services/multidevice_setup/host_backend_delegate_impl.cc index d45473d..c65804f9 100644 --- a/chromeos/services/multidevice_setup/host_backend_delegate_impl.cc +++ b/chromeos/services/multidevice_setup/host_backend_delegate_impl.cc
@@ -200,7 +200,7 @@ bool HostBackendDelegateImpl::IsHostEligible( const multidevice::RemoteDeviceRef& provided_host) { - return base::ContainsValue( + return base::Contains( eligible_host_devices_provider_->GetEligibleHostDevices(), provided_host); }
diff --git a/chromeos/services/multidevice_setup/public/cpp/first_run_field_trial.cc b/chromeos/services/multidevice_setup/public/cpp/first_run_field_trial.cc index d215c733..30af63c 100644 --- a/chromeos/services/multidevice_setup/public/cpp/first_run_field_trial.cc +++ b/chromeos/services/multidevice_setup/public/cpp/first_run_field_trial.cc
@@ -30,7 +30,7 @@ void CreateFirstRunFieldTrial(base::FeatureList* feature_list) { // If the hardware name of the current device is not one of the board names in // |kBoardsToEnableInstantTethering|, nothing needs to be done. - if (!base::ContainsValue( + if (!base::Contains( kBoardsToEnableInstantTethering, variations::VariationsFieldTrialCreator::GetShortHardwareClass())) { return;
diff --git a/chromeos/services/secure_channel/active_connection_manager_impl_unittest.cc b/chromeos/services/secure_channel/active_connection_manager_impl_unittest.cc index ed432be..9b6631b4 100644 --- a/chromeos/services/secure_channel/active_connection_manager_impl_unittest.cc +++ b/chromeos/services/secure_channel/active_connection_manager_impl_unittest.cc
@@ -185,9 +185,9 @@ const std::string& device_id) { ConnectionDetails connection_details(device_id, ConnectionMedium::kBluetoothLowEnergy); - if (!base::ContainsKey(fake_multiplexed_channel_factory_ - ->connection_details_to_active_channel_map(), - connection_details)) { + if (!base::Contains(fake_multiplexed_channel_factory_ + ->connection_details_to_active_channel_map(), + connection_details)) { return nullptr; }
diff --git a/chromeos/services/secure_channel/authenticated_channel_impl.cc b/chromeos/services/secure_channel/authenticated_channel_impl.cc index 934959f..45464a1 100644 --- a/chromeos/services/secure_channel/authenticated_channel_impl.cc +++ b/chromeos/services/secure_channel/authenticated_channel_impl.cc
@@ -75,7 +75,7 @@ int sequence_number = secure_channel_->SendMessage(feature, payload); - if (base::ContainsKey(sequence_number_to_callback_map_, sequence_number)) { + if (base::Contains(sequence_number_to_callback_map_, sequence_number)) { PA_LOG(ERROR) << "AuthenticatedChannelImpl::SendMessage(): Started sending " << "a message whose sequence number already exists in the " << "map."; @@ -121,7 +121,7 @@ int sequence_number) { DCHECK_EQ(secure_channel_.get(), secure_channel); - if (!base::ContainsKey(sequence_number_to_callback_map_, sequence_number)) { + if (!base::Contains(sequence_number_to_callback_map_, sequence_number)) { PA_LOG(WARNING) << "AuthenticatedChannelImpl::OnMessageSent(): Sent a " << "message whose sequence number did not exist in the " << "map. Disregarding.";
diff --git a/chromeos/services/secure_channel/authenticated_channel_impl_unittest.cc b/chromeos/services/secure_channel/authenticated_channel_impl_unittest.cc index 0e1565a7..f53484f93 100644 --- a/chromeos/services/secure_channel/authenticated_channel_impl_unittest.cc +++ b/chromeos/services/secure_channel/authenticated_channel_impl_unittest.cc
@@ -96,7 +96,7 @@ // -1 is returned by SendMessageAndVerifyResults() when // |expected_to_succeed| is false. EXPECT_NE(-1, sequence_number); - return base::ContainsKey(sent_sequence_numbers_, sequence_number); + return base::Contains(sent_sequence_numbers_, sequence_number); } void CallGetConnectionMetadata() {
diff --git a/chromeos/services/secure_channel/ble_advertiser_impl.cc b/chromeos/services/secure_channel/ble_advertiser_impl.cc index 4a45bad..e5b9343 100644 --- a/chromeos/services/secure_channel/ble_advertiser_impl.cc +++ b/chromeos/services/secure_channel/ble_advertiser_impl.cc
@@ -86,7 +86,7 @@ ConnectionPriority connection_priority) { requests_already_removed_due_to_failed_advertisement_.erase(request); - if (base::ContainsKey(all_requests_, request)) { + if (base::Contains(all_requests_, request)) { PA_LOG(ERROR) << "BleAdvertiserImpl::AddAdvertisementRequest(): Tried to " << "add advertisement request which was already present. " << "Request: " << request @@ -110,11 +110,11 @@ void BleAdvertiserImpl::UpdateAdvertisementRequestPriority( const DeviceIdPair& request, ConnectionPriority connection_priority) { - if (base::ContainsKey(requests_already_removed_due_to_failed_advertisement_, - request)) + if (base::Contains(requests_already_removed_due_to_failed_advertisement_, + request)) return; - if (!base::ContainsKey(all_requests_, request)) { + if (!base::Contains(all_requests_, request)) { PA_LOG(ERROR) << "BleAdvertiserImpl::UpdateAdvertisementRequestPriority(): " << "Tried to update request priority for a request, but that " << "request was not present. Request: " << request @@ -175,7 +175,7 @@ return; } - if (!base::ContainsKey(all_requests_, request)) { + if (!base::Contains(all_requests_, request)) { PA_LOG(ERROR) << "BleAdvertiserImpl::RemoveAdvertisementRequest(): Tried " << "to remove an advertisement request, but that request was " << "not present. Request: " << request; @@ -383,8 +383,8 @@ // If the request is not found, then that request has either been removed // again or re-scheduled after it failed to generate an advertisement, but // before this task could execute. - if (!base::ContainsKey(requests_already_removed_due_to_failed_advertisement_, - device_id_pair)) { + if (!base::Contains(requests_already_removed_due_to_failed_advertisement_, + device_id_pair)) { return; }
diff --git a/chromeos/services/secure_channel/ble_connection_manager.cc b/chromeos/services/secure_channel/ble_connection_manager.cc index 22874919..b6f58f6 100644 --- a/chromeos/services/secure_channel/ble_connection_manager.cc +++ b/chromeos/services/secure_channel/ble_connection_manager.cc
@@ -47,7 +47,7 @@ ConnectionPriority connection_priority, ConnectionSuccessCallback success_callback, const BleInitiatorFailureCallback& failure_callback) { - if (base::ContainsKey(id_pair_to_initiator_metadata_map_, device_id_pair)) { + if (base::Contains(id_pair_to_initiator_metadata_map_, device_id_pair)) { PA_LOG(ERROR) << "BleConnectionManager::AttemptBleInitiatorConnection(): " << "Tried to add BLE initiator connection attempt, but one " << "was already active. Device IDs: " << device_id_pair @@ -111,7 +111,7 @@ ConnectionPriority connection_priority, ConnectionSuccessCallback success_callback, const BleListenerFailureCallback& failure_callback) { - if (base::ContainsKey(id_pair_to_listener_metadata_map_, device_id_pair)) { + if (base::Contains(id_pair_to_listener_metadata_map_, device_id_pair)) { PA_LOG(ERROR) << "BleConnectionManager::AttemptBleListenerConnection(): " << "Tried to add BLE listener connection attempt, but one " << "was already active. Device IDs: " << device_id_pair @@ -184,7 +184,7 @@ const base::flat_set<ConnectionAttemptDetails>& BleConnectionManager::GetDetailsForRemoteDevice( const std::string& remote_device_id) { - if (!base::ContainsKey(remote_device_id_to_details_map_, remote_device_id)) { + if (!base::Contains(remote_device_id_to_details_map_, remote_device_id)) { PA_LOG(ERROR) << "BleConnectionManager::GetDetailsForRemoteDevice(): Tried " << "to get details for a remote device, but no device with " << "the provided ID existed. ID: " @@ -200,11 +200,9 @@ ConnectionRole connection_role) { switch (connection_role) { case ConnectionRole::kInitiatorRole: - return base::ContainsKey(id_pair_to_initiator_metadata_map_, - device_id_pair); + return base::Contains(id_pair_to_initiator_metadata_map_, device_id_pair); case ConnectionRole::kListenerRole: - return base::ContainsKey(id_pair_to_listener_metadata_map_, - device_id_pair); + return base::Contains(id_pair_to_listener_metadata_map_, device_id_pair); } } @@ -257,7 +255,7 @@ BleConnectionManager::InitiatorConnectionAttemptMetadata& BleConnectionManager::GetInitiatorEntry(const DeviceIdPair& device_id_pair) { - if (!base::ContainsKey(id_pair_to_initiator_metadata_map_, device_id_pair)) { + if (!base::Contains(id_pair_to_initiator_metadata_map_, device_id_pair)) { PA_LOG(ERROR) << "BleConnectionManager::GetInitiatorEntry(): Tried to get " << "map entry, but it did not exist. Device IDs: " << device_id_pair; @@ -272,7 +270,7 @@ BleConnectionManager::ListenerConnectionAttemptMetadata& BleConnectionManager::GetListenerEntry(const DeviceIdPair& device_id_pair) { - if (!base::ContainsKey(id_pair_to_listener_metadata_map_, device_id_pair)) { + if (!base::Contains(id_pair_to_listener_metadata_map_, device_id_pair)) { PA_LOG(ERROR) << "BleConnectionManager::GetListenerEntry(): Tried to get " << "map entry, but it did not exist. Device IDs: " << device_id_pair; @@ -290,8 +288,7 @@ ConnectionRole connection_role) { switch (connection_role) { case ConnectionRole::kInitiatorRole: - if (!base::ContainsKey(id_pair_to_initiator_metadata_map_, - device_id_pair)) { + if (!base::Contains(id_pair_to_initiator_metadata_map_, device_id_pair)) { PA_LOG(ERROR) << "BleConnectionManager::RemoveRequestMetadata(): Tried " << "to remove BLE initiator attempt, but no attempt " << "existed. Device IDs: " << device_id_pair; @@ -302,8 +299,7 @@ break; case ConnectionRole::kListenerRole: - if (!base::ContainsKey(id_pair_to_listener_metadata_map_, - device_id_pair)) { + if (!base::Contains(id_pair_to_listener_metadata_map_, device_id_pair)) { PA_LOG(ERROR) << "BleConnectionManager::RemoveRequestMetadata(): Tried " << "to remove BLE listener attempt, but no attempt " << "existed. Device IDs: " << device_id_pair;
diff --git a/chromeos/services/secure_channel/ble_connection_manager_impl.cc b/chromeos/services/secure_channel/ble_connection_manager_impl.cc index 4f98255..df15f2dc 100644 --- a/chromeos/services/secure_channel/ble_connection_manager_impl.cc +++ b/chromeos/services/secure_channel/ble_connection_manager_impl.cc
@@ -381,8 +381,8 @@ bool BleConnectionManagerImpl::DoesAuthenticatingChannelExist( const std::string& remote_device_id) { - return base::ContainsKey(remote_device_id_to_secure_channel_map_, - remote_device_id); + return base::Contains(remote_device_id_to_secure_channel_map_, + remote_device_id); } void BleConnectionManagerImpl::SetAuthenticatingChannel( @@ -623,7 +623,7 @@ ConnectionRole connection_role) { // If an entry already exists, there is nothing to do. This is expected if // more than one client is attempting a connection to the same device. - if (base::ContainsKey(remote_device_id_to_timestamps_map_, remote_device_id)) + if (base::Contains(remote_device_id_to_timestamps_map_, remote_device_id)) return; remote_device_id_to_timestamps_map_[remote_device_id] =
diff --git a/chromeos/services/secure_channel/ble_scanner.cc b/chromeos/services/secure_channel/ble_scanner.cc index 211a25d..fa94dc0 100644 --- a/chromeos/services/secure_channel/ble_scanner.cc +++ b/chromeos/services/secure_channel/ble_scanner.cc
@@ -17,7 +17,7 @@ BleScanner::~BleScanner() = default; void BleScanner::AddScanFilter(const ScanFilter& scan_filter) { - if (base::ContainsKey(scan_filters_, scan_filter)) { + if (base::Contains(scan_filters_, scan_filter)) { PA_LOG(ERROR) << "BleScanner::AddScanFilter(): Tried to add a scan filter " << "which already existed. Filter: " << scan_filter; NOTREACHED(); @@ -28,7 +28,7 @@ } void BleScanner::RemoveScanFilter(const ScanFilter& scan_filter) { - if (!base::ContainsKey(scan_filters_, scan_filter)) { + if (!base::Contains(scan_filters_, scan_filter)) { PA_LOG(ERROR) << "BleScanner::RemoveScanFilter(): Tried to remove a scan " << "filter which was not present. Filter: " << scan_filter; NOTREACHED(); @@ -39,7 +39,7 @@ } bool BleScanner::HasScanFilter(const ScanFilter& scan_filter) { - return base::ContainsKey(scan_filters_, scan_filter); + return base::Contains(scan_filters_, scan_filter); } DeviceIdPairSet BleScanner::GetAllDeviceIdPairs() {
diff --git a/chromeos/services/secure_channel/connection_attempt_base.h b/chromeos/services/secure_channel/connection_attempt_base.h index f52da05..6390e57 100644 --- a/chromeos/services/secure_channel/connection_attempt_base.h +++ b/chromeos/services/secure_channel/connection_attempt_base.h
@@ -79,7 +79,7 @@ ConnectionPriority priority_before_add = GetHighestRemainingConnectionPriority(); - if (base::ContainsKey(id_to_request_map_, request->GetRequestId())) { + if (base::Contains(id_to_request_map_, request->GetRequestId())) { PA_LOG(ERROR) << "ConnectionAttemptBase::" << "ProcessAddingNewConnectionRequest(): Processing " << "request whose ID has already been processed.";
diff --git a/chromeos/services/secure_channel/fake_ble_service_data_helper.cc b/chromeos/services/secure_channel/fake_ble_service_data_helper.cc index f2eebba..f2687d3 100644 --- a/chromeos/services/secure_channel/fake_ble_service_data_helper.cc +++ b/chromeos/services/secure_channel/fake_ble_service_data_helper.cc
@@ -37,7 +37,7 @@ std::unique_ptr<DataWithTimestamp> FakeBleServiceDataHelper::GenerateForegroundAdvertisement( const DeviceIdPair& device_id_pair) { - if (!base::ContainsKey(device_id_pair_to_service_data_map_, device_id_pair)) + if (!base::Contains(device_id_pair_to_service_data_map_, device_id_pair)) return nullptr; return std::make_unique<DataWithTimestamp>( @@ -48,8 +48,8 @@ FakeBleServiceDataHelper::PerformIdentifyRemoteDevice( const std::string& service_data, const DeviceIdPairSet& device_id_pair_set) { - if (!base::ContainsKey(service_data_to_device_with_background_bool_map_, - service_data)) { + if (!base::Contains(service_data_to_device_with_background_bool_map_, + service_data)) { return base::nullopt; }
diff --git a/chromeos/services/secure_channel/fake_connection_attempt.h b/chromeos/services/secure_channel/fake_connection_attempt.h index 8fcba10..06776e0 100644 --- a/chromeos/services/secure_channel/fake_connection_attempt.h +++ b/chromeos/services/secure_channel/fake_connection_attempt.h
@@ -64,7 +64,7 @@ std::unique_ptr<PendingConnectionRequest<FailureDetailType>> request) override { DCHECK(request); - DCHECK(!base::ContainsKey(id_to_request_map_, request->GetRequestId())); + DCHECK(!base::Contains(id_to_request_map_, request->GetRequestId())); id_to_request_map_[request->GetRequestId()] = std::move(request); }
diff --git a/chromeos/services/secure_channel/multiplexed_channel_impl.cc b/chromeos/services/secure_channel/multiplexed_channel_impl.cc index 3141723f8..35867fd0 100644 --- a/chromeos/services/secure_channel/multiplexed_channel_impl.cc +++ b/chromeos/services/secure_channel/multiplexed_channel_impl.cc
@@ -89,7 +89,7 @@ auto proxy = SingleClientMessageProxyImpl::Factory::Get()->BuildInstance( this /* delegate */, std::move(client_connection_parameters)); - DCHECK(!base::ContainsKey(id_to_proxy_map_, proxy->GetProxyId())); + DCHECK(!base::Contains(id_to_proxy_map_, proxy->GetProxyId())); id_to_proxy_map_[proxy->GetProxyId()] = std::move(proxy); }
diff --git a/chromeos/services/secure_channel/multiplexed_channel_impl_unittest.cc b/chromeos/services/secure_channel/multiplexed_channel_impl_unittest.cc index eca09b8..c3ad929 100644 --- a/chromeos/services/secure_channel/multiplexed_channel_impl_unittest.cc +++ b/chromeos/services/secure_channel/multiplexed_channel_impl_unittest.cc
@@ -184,7 +184,7 @@ } bool HasMessageBeenSent(int message_counter) { - return base::ContainsKey(sent_message_counters_, message_counter); + return base::Contains(sent_message_counters_, message_counter); } void DisconnectClientAndVerifyState( @@ -198,7 +198,7 @@ base::UnguessableToken proxy_id = sending_proxy->GetProxyId(); // All relevant parties should still indicate that the connection is valid. - EXPECT_TRUE(base::ContainsKey(id_to_active_proxy_map(), proxy_id)); + EXPECT_TRUE(base::Contains(id_to_active_proxy_map(), proxy_id)); EXPECT_FALSE( fake_authenticated_channel_->has_disconnection_been_requested()); EXPECT_FALSE(multiplexed_channel_->IsDisconnecting()); @@ -207,7 +207,7 @@ // Disconnecting the client should result in the proxy being deleted. sending_proxy->NotifyClientDisconnected(); - EXPECT_FALSE(base::ContainsKey(id_to_active_proxy_map(), proxy_id)); + EXPECT_FALSE(base::Contains(id_to_active_proxy_map(), proxy_id)); if (!is_last_client) return;
diff --git a/chromeos/services/secure_channel/pending_connection_manager_impl.cc b/chromeos/services/secure_channel/pending_connection_manager_impl.cc index 80bee9e..0e79238 100644 --- a/chromeos/services/secure_channel/pending_connection_manager_impl.cc +++ b/chromeos/services/secure_channel/pending_connection_manager_impl.cc
@@ -103,7 +103,7 @@ void PendingConnectionManagerImpl::OnConnectionAttemptSucceeded( const ConnectionDetails& connection_details, std::unique_ptr<AuthenticatedChannel> authenticated_channel) { - if (!base::ContainsKey(details_to_attempt_details_map_, connection_details)) { + if (!base::Contains(details_to_attempt_details_map_, connection_details)) { PA_LOG(ERROR) << "PendingConnectionManagerImpl::" << "OnConnectionAttemptSucceeded(): Attempt succeeded, but " << "there was no corresponding map entry. " @@ -162,8 +162,8 @@ ConnectionPriority connection_priority) { // If no ConnectionAttempt exists to this device in the initiator role, create // one. - if (!base::ContainsKey(id_pair_to_ble_initiator_connection_attempts_, - connection_attempt_details.device_id_pair())) { + if (!base::Contains(id_pair_to_ble_initiator_connection_attempts_, + connection_attempt_details.device_id_pair())) { id_pair_to_ble_initiator_connection_attempts_[connection_attempt_details .device_id_pair()] = BleInitiatorConnectionAttempt::Factory::Get()->BuildInstance( @@ -195,8 +195,8 @@ ConnectionPriority connection_priority) { // If no ConnectionAttempt exists to this device in the listener role, create // one. - if (!base::ContainsKey(id_pair_to_ble_listener_connection_attempts_, - connection_attempt_details.device_id_pair())) { + if (!base::Contains(id_pair_to_ble_listener_connection_attempts_, + connection_attempt_details.device_id_pair())) { id_pair_to_ble_listener_connection_attempts_[connection_attempt_details .device_id_pair()] = BleListenerConnectionAttempt::Factory::Get()->BuildInstance(
diff --git a/chromeos/services/secure_channel/pending_connection_manager_impl_unittest.cc b/chromeos/services/secure_channel/pending_connection_manager_impl_unittest.cc index ecbd3f43..bf2c3e91 100644 --- a/chromeos/services/secure_channel/pending_connection_manager_impl_unittest.cc +++ b/chromeos/services/secure_channel/pending_connection_manager_impl_unittest.cc
@@ -406,8 +406,8 @@ fake_pending_ble_initiator_connection_request_factory_ ->last_created_instance() ->GetRequestId(); - EXPECT_TRUE(base::ContainsKey(active_attempt->id_to_request_map(), - token_for_last_init_request)); + EXPECT_TRUE(base::Contains(active_attempt->id_to_request_map(), + token_for_last_init_request)); break; } @@ -418,8 +418,8 @@ fake_pending_ble_listener_connection_request_factory_ ->last_created_instance() ->GetRequestId(); - EXPECT_TRUE(base::ContainsKey(active_attempt->id_to_request_map(), - token_for_last_listen_request)); + EXPECT_TRUE(base::Contains(active_attempt->id_to_request_map(), + token_for_last_listen_request)); break; } }
diff --git a/chromeos/services/secure_channel/public/cpp/client/client_channel_impl_unittest.cc b/chromeos/services/secure_channel/public/cpp/client/client_channel_impl_unittest.cc index 2119605..352e5a8 100644 --- a/chromeos/services/secure_channel/public/cpp/client/client_channel_impl_unittest.cc +++ b/chromeos/services/secure_channel/public/cpp/client/client_channel_impl_unittest.cc
@@ -157,8 +157,8 @@ CallSendMessageCallback(std::move(sent_messages[0].second)); CallSendMessageCallback(std::move(sent_messages[1].second)); - EXPECT_TRUE(base::ContainsKey(message_counters_received_, message_1_counter)); - EXPECT_TRUE(base::ContainsKey(message_counters_received_, message_2_counter)); + EXPECT_TRUE(base::Contains(message_counters_received_, message_1_counter)); + EXPECT_TRUE(base::Contains(message_counters_received_, message_2_counter)); } TEST_F(SecureChannelClientChannelImplTest, TestReceiveMessage) {
diff --git a/chromeos/services/secure_channel/public/cpp/client/fake_secure_channel_client.h b/chromeos/services/secure_channel/public/cpp/client/fake_secure_channel_client.h index 5dfa4ad7..d165206 100644 --- a/chromeos/services/secure_channel/public/cpp/client/fake_secure_channel_client.h +++ b/chromeos/services/secure_channel/public/cpp/client/fake_secure_channel_client.h
@@ -61,8 +61,8 @@ multidevice::RemoteDeviceRef device_to_connect, multidevice::RemoteDeviceRef local_device) { auto device_id_pair = std::make_pair(device_to_connect, local_device); - if (!base::ContainsKey(device_pair_to_next_initiate_connection_attempt_, - device_id_pair)) { + if (!base::Contains(device_pair_to_next_initiate_connection_attempt_, + device_id_pair)) { return nullptr; } @@ -74,8 +74,8 @@ multidevice::RemoteDeviceRef device_to_connect, multidevice::RemoteDeviceRef local_device) { auto device_id_pair = std::make_pair(device_to_connect, local_device); - if (!base::ContainsKey(device_pair_to_next_listen_connection_attempt_, - device_id_pair)) { + if (!base::Contains(device_pair_to_next_listen_connection_attempt_, + device_id_pair)) { return nullptr; }
diff --git a/chromeos/services/secure_channel/secure_channel_disconnector_impl_unittest.cc b/chromeos/services/secure_channel/secure_channel_disconnector_impl_unittest.cc index 3c4da6f..7989205a 100644 --- a/chromeos/services/secure_channel/secure_channel_disconnector_impl_unittest.cc +++ b/chromeos/services/secure_channel/secure_channel_disconnector_impl_unittest.cc
@@ -54,7 +54,7 @@ } bool HasChannelBeenDeleted(const base::UnguessableToken id) { - return base::ContainsKey(deleted_request_ids_, id); + return base::Contains(deleted_request_ids_, id); } private:
diff --git a/chromeos/services/secure_channel/shared_resource_scheduler.cc b/chromeos/services/secure_channel/shared_resource_scheduler.cc index 0fb8ac8d..9805030 100644 --- a/chromeos/services/secure_channel/shared_resource_scheduler.cc +++ b/chromeos/services/secure_channel/shared_resource_scheduler.cc
@@ -57,7 +57,7 @@ void SharedResourceScheduler::ScheduleRequest( const DeviceIdPair& request, ConnectionPriority connection_priority) { - if (base::ContainsKey(request_to_priority_map_, request)) { + if (base::Contains(request_to_priority_map_, request)) { PA_LOG(ERROR) << "SharedResourceScheduler::ScheduleRequest(): Tried to " << "schedule a request which was already scheduled. Request: " << request << ", Priority: " << connection_priority; @@ -71,7 +71,7 @@ void SharedResourceScheduler::UpdateRequestPriority( const DeviceIdPair& request, ConnectionPriority connection_priority) { - if (!base::ContainsKey(request_to_priority_map_, request)) { + if (!base::Contains(request_to_priority_map_, request)) { PA_LOG(ERROR) << "SharedResourceScheduler::UpdateRequestPriority(): Tried " << "to update priority for a request which was not " << "scheduled. Request: " << request @@ -100,7 +100,7 @@ void SharedResourceScheduler::RemoveScheduledRequest( const DeviceIdPair& request) { - if (!base::ContainsKey(request_to_priority_map_, request)) { + if (!base::Contains(request_to_priority_map_, request)) { PA_LOG(ERROR) << "SharedResourceScheduler::RemoveScheduledRequest(): Tried " << "to remove a scheduled request, but that request was not " << "actually scheduled. Request: " << request;
diff --git a/chromeos/services/secure_channel/single_client_message_proxy_impl_unittest.cc b/chromeos/services/secure_channel/single_client_message_proxy_impl_unittest.cc index a1fa913d..73eee08 100644 --- a/chromeos/services/secure_channel/single_client_message_proxy_impl_unittest.cc +++ b/chromeos/services/secure_channel/single_client_message_proxy_impl_unittest.cc
@@ -124,7 +124,7 @@ } bool WasMessageSent(int message_counter) { - return base::ContainsKey(sent_message_counters_, message_counter); + return base::Contains(sent_message_counters_, message_counter); } void DisconnectFromClientSide() {
diff --git a/chromeos/strings/chromeos_strings_am.xtb b/chromeos/strings/chromeos_strings_am.xtb index 3413249..3c7a2e89 100644 --- a/chromeos/strings/chromeos_strings_am.xtb +++ b/chromeos/strings/chromeos_strings_am.xtb
@@ -3,14 +3,13 @@ <translationbundle lang="am"> <translation id="1510238584712386396">ማስጀመሪያ</translation> <translation id="1734367976349034509">ይህ መሣሪያ በድርጅት የሚቀናበር ነው</translation> +<translation id="1930797645656624981">የ Chrome OS ግቤት ዘዴ አገልግሎት</translation> <translation id="2049639323467105390">ይህ መሣሪያ በ<ph name="DOMAIN" /> ነው የሚቀናበረው።</translation> <translation id="2083960536266308407">በማያ ገጹ ላይ ምንም አልተገኘም</translation> <translation id="2338501278241028356">በአቅራቢያ ያሉ መሣሪያዎችን ለማግኘት ብሉቱዝን ያብሩ</translation> <translation id="2805756323405976993">መተግበሪያዎች</translation> <translation id="2872961005593481000">ዝጋ</translation> <translation id="3147142846278915599">ማስጀመሪያ (መተግበሪያዎችን በማመሳሰል ላይ...)</translation> -<translation id="3442261357327209537">አዲስ የይለፍ ቃል ለመምረጥ እዚህ ጠቅ ያድርጉ</translation> -<translation id="3506732833599356229">የይለፍ ቃል ጊዜው አልፎበታል</translation> <translation id="4731797938093519117">የወላጅ መዳረሻ</translation> <translation id="476166673298332917">የዚህ መሣሪያ አስተዳዳሪ የይለፍ ቃላት እና ግንኙነትን ጨምሮ የሁሉንም እንቅስቃሴ መዳረሻ አለው።</translation> <translation id="5212543919916444558">እኔ ላግዝ የምችልበት ምንም ነገር በእርስዎ ማያ ገጽ ላይ አላገኘሁም። @@ -21,8 +20,8 @@ <translation id="5832805196449965646">ሰው አክል</translation> <translation id="5895138241574237353">እንደገና ጀምር</translation> <translation id="6574601967010742428">የመሣሪያው አስተዳዳሪ የእርስዎን እንቅስቃሴ ሊከታተል ይችላል።</translation> -<translation id="7467001599725918325">የይለፍ ቃል በቅርቡ ጊዜው ያልፍበታል</translation> <translation id="7505377169174526985">{NUM_DAYS,plural, =0{የአሁኑ ይለፍ ቃልዎ ጊዜው አልፎበታል!}=1{የአሁኑ ይለፍ ቃልዎ ከአንድ ቀን ባነሰ ጊዜ ውስጥ ጊዜው ያልፍበታል!}one{የአሁኑ ይለፍ ቃልዎ ከ# ቀኖች ባነሰ ጊዜ ውስጥ ጊዜው ያልፍበታል!}other{የአሁኑ ይለፍ ቃልዎ ከ# ቀኖች ባነሰ ጊዜ ውስጥ ጊዜው ያልፍበታል!}}</translation> <translation id="7658239707568436148">ይቅር</translation> +<translation id="808894953321890993">የይለፍ ቃል ለውጥ</translation> <translation id="9111102763498581341">ክፈት</translation> </translationbundle> \ No newline at end of file
diff --git a/chromeos/strings/chromeos_strings_ar.xtb b/chromeos/strings/chromeos_strings_ar.xtb index a2d516b..f4f34f0 100644 --- a/chromeos/strings/chromeos_strings_ar.xtb +++ b/chromeos/strings/chromeos_strings_ar.xtb
@@ -9,8 +9,6 @@ <translation id="2805756323405976993">التطبيقات</translation> <translation id="2872961005593481000">إيقاف التشغيل</translation> <translation id="3147142846278915599">Launcher (مزامنة التطبيقات...)</translation> -<translation id="3442261357327209537">يمكنك النقر هنا لاختيار كلمة مرور جديدة.</translation> -<translation id="3506732833599356229">انتهت صلاحية كلمة المرور</translation> <translation id="4731797938093519117">وصول أحد الوالدين</translation> <translation id="476166673298332917">قد يراقب مشرف الجهاز نشاط التصفُح.</translation> <translation id="5212543919916444558">يتعذَّر عليَّ العثور على شيء مفيد في هذه الشاشة. @@ -21,8 +19,8 @@ <translation id="5832805196449965646">إضافة شخص</translation> <translation id="5895138241574237353">إعادة التشغيل</translation> <translation id="6574601967010742428">قد يتمكَّن مشرف الجهاز من مراقبة نشاطك.</translation> -<translation id="7467001599725918325">ستنتهي صلاحية كلمة المرور قريبًا</translation> <translation id="7505377169174526985">{NUM_DAYS,plural, =0{لقد انتهت صلاحية كلمة مرورك الحالية.}=1{ستنتهي صلاحية كلمة مرورك الحالية بعد أقل من يوم واحد.}two{ستنتهي صلاحية كلمة مرورك الحالية بعد أقل من يومين (#).}few{ستنتهي صلاحية كلمة مرورك الحالية بعد أقل من # أيام.}many{ستنتهي صلاحية كلمة مرورك الحالية بعد أقل من # يومًا.}other{ستنتهي صلاحية كلمة مرورك الحالية بعد أقل من # يوم.}}</translation> <translation id="7658239707568436148">إلغاء</translation> +<translation id="808894953321890993">تغيير كلمة المرور</translation> <translation id="9111102763498581341">فتح القفل</translation> </translationbundle> \ No newline at end of file
diff --git a/chromeos/strings/chromeos_strings_bg.xtb b/chromeos/strings/chromeos_strings_bg.xtb index 9a12c06..f298e9b 100644 --- a/chromeos/strings/chromeos_strings_bg.xtb +++ b/chromeos/strings/chromeos_strings_bg.xtb
@@ -3,14 +3,13 @@ <translationbundle lang="bg"> <translation id="1510238584712386396">Стартов панел</translation> <translation id="1734367976349034509">Това устройство се управлява корпоративно</translation> +<translation id="1930797645656624981">Услуга за метод на въвеждане в Chrome OS</translation> <translation id="2049639323467105390">Това устройство се управлява от <ph name="DOMAIN" />.</translation> <translation id="2083960536266308407">На екрана не бе намерено нищо</translation> <translation id="2338501278241028356">Включете Bluetooth, за да бъдат открити устройствата в близост</translation> <translation id="2805756323405976993">Приложения</translation> <translation id="2872961005593481000">Изключване</translation> <translation id="3147142846278915599">Стартов панел (приложенията се синхронизират...)</translation> -<translation id="3442261357327209537">Кликнете тук, за да изберете нова парола</translation> -<translation id="3506732833599356229">Валидността на паролата изтече</translation> <translation id="4731797938093519117">Достъп на родител</translation> <translation id="476166673298332917">Администраторът на устройството може да наблюдава активността ви при сърфиране.</translation> <translation id="5212543919916444558">На екрана ви не намирам нищо, за което да мога да ви помогна. @@ -21,8 +20,8 @@ <translation id="5832805196449965646">Добавяне на човек</translation> <translation id="5895138241574237353">Рестартиране</translation> <translation id="6574601967010742428">Администраторът на устройството може да е в състояние да наблюдава активността ви.</translation> -<translation id="7467001599725918325">Валидността на паролата скоро ще изтече</translation> <translation id="7505377169174526985">{NUM_DAYS,plural, =0{Валидността на текущата ви парола изтече!}=1{Валидността на текущата ви парола ще изтече след по-малко от един ден!}other{Валидността на текущата ви парола ще изтече след по-малко от # дни!}}</translation> <translation id="7658239707568436148">Отказ</translation> +<translation id="808894953321890993">Промяна на паролата</translation> <translation id="9111102763498581341">Отключване</translation> </translationbundle> \ No newline at end of file
diff --git a/chromeos/strings/chromeos_strings_bn.xtb b/chromeos/strings/chromeos_strings_bn.xtb index 74eeeae..30dd95f 100644 --- a/chromeos/strings/chromeos_strings_bn.xtb +++ b/chromeos/strings/chromeos_strings_bn.xtb
@@ -3,14 +3,13 @@ <translationbundle lang="bn"> <translation id="1510238584712386396">লঞ্চার</translation> <translation id="1734367976349034509">এই ডিভাইসটি এন্টারপ্রাইজ পরিচালিত</translation> +<translation id="1930797645656624981">Chrome OS ইনপুট পদ্ধতি পরিষেবা</translation> <translation id="2049639323467105390">এই ডিভাইস <ph name="DOMAIN" /> দ্বারা পরিচালিত হয়৷</translation> <translation id="2083960536266308407">স্ক্রিনে কিছুই পাওয়া যায়নি</translation> <translation id="2338501278241028356">আশেপাশের ডিভাইস খুঁজে পেতে ব্লুটুথ চালু করুন</translation> <translation id="2805756323405976993">অ্যাপ্স</translation> <translation id="2872961005593481000">বন্ধ করুন</translation> <translation id="3147142846278915599">লঞ্চার (অ্যাপ সিঙ্ক করা হচ্ছে...)</translation> -<translation id="3442261357327209537">একটি নতুন পাসওয়ার্ড বেছে নিতে এখানে ক্লিক করুন</translation> -<translation id="3506732833599356229">পাসওয়ার্ডের মেয়াদ শেষ হয়ে গেছে</translation> <translation id="4731797938093519117">অভিভাবকীয় অ্যাক্সেস</translation> <translation id="476166673298332917">ডিভাইস প্রশাসক আপনার ব্রাউজিং অ্যাক্টিভিটি পর্যবেক্ষণ করতে পারেন।</translation> <translation id="5212543919916444558">আপনাকে সাহায্য করতে পারি এমন কিছুই আপনার স্ক্রিনে আমি খুঁজে পাইনি। আমাকে কিছু জিজ্ঞাসা করতে মাইকে ট্যাপ করুন।</translation> @@ -20,8 +19,8 @@ <translation id="5832805196449965646">একজন ব্যক্তিকে যোগ করুন</translation> <translation id="5895138241574237353">পুনর্সূচনা</translation> <translation id="6574601967010742428">ডিভাইস অ্যাডমিনিস্ট্রেটর আপনার অ্যাক্টিভিটি হয়ত মনিটর করতে পারেন।</translation> -<translation id="7467001599725918325">পাসওয়ার্ডের মেয়াদ শীঘ্রই শেষ হয়ে যাবে</translation> <translation id="7505377169174526985">{NUM_DAYS,plural, =0{আপনার বর্তমান পাসওয়ার্ডের মেয়াদ শেষ হয়ে গেছে!}=1{আপনার বর্তমান পাসওয়ার্ডের মেয়াদ ১ দিনেরও কম সময়ে শেষ হয়ে যাবে!}one{আপনার বর্তমান পাসওয়ার্ডের মেয়াদ # দিনেরও কম সময়ে শেষ হয়ে যাবে!}other{আপনার বর্তমান পাসওয়ার্ডের মেয়াদ # দিনেরও কম সময়ে শেষ হয়ে যাবে!}}</translation> <translation id="7658239707568436148">বাতিল</translation> +<translation id="808894953321890993">পাসওয়ার্ড পরিবর্তন করুন</translation> <translation id="9111102763498581341">আনলক</translation> </translationbundle> \ No newline at end of file
diff --git a/chromeos/strings/chromeos_strings_ca.xtb b/chromeos/strings/chromeos_strings_ca.xtb index b2edcf29..4b967864 100644 --- a/chromeos/strings/chromeos_strings_ca.xtb +++ b/chromeos/strings/chromeos_strings_ca.xtb
@@ -3,14 +3,13 @@ <translationbundle lang="ca"> <translation id="1510238584712386396">Menú d'aplicacions</translation> <translation id="1734367976349034509">Aquest dispositiu està gestionat per una empresa</translation> +<translation id="1930797645656624981">Servei del mètode d'introducció de text a Chrome OS</translation> <translation id="2049639323467105390">Aquest dispositiu està gestionat per <ph name="DOMAIN" /></translation> <translation id="2083960536266308407">No s'ha trobat res a la pantalla</translation> <translation id="2338501278241028356">Activa el Bluetooth per detectar dispositius propers</translation> <translation id="2805756323405976993">Aplicacions</translation> <translation id="2872961005593481000">Apaga</translation> <translation id="3147142846278915599">Launcher (s'estan sincronitzant les aplicacions...)</translation> -<translation id="3442261357327209537">Fes clic aquí per triar una altra contrasenya</translation> -<translation id="3506732833599356229">La contrasenya ha caducat</translation> <translation id="4731797938093519117">Accés parental</translation> <translation id="476166673298332917">És possible que l'administrador del dispositiu supervisi l'activitat de navegació.</translation> <translation id="5212543919916444558">No he trobat res a la pantalla amb què et pugui ajudar. @@ -21,8 +20,8 @@ <translation id="5832805196449965646">Afegeix una persona</translation> <translation id="5895138241574237353">Reinicia</translation> <translation id="6574601967010742428">Pot ser que l'administrador del dispositiu pugui supervisar la teva activitat.</translation> -<translation id="7467001599725918325">La contrasenya caducarà aviat</translation> <translation id="7505377169174526985">{NUM_DAYS,plural, =0{La teva contrasenya actual ha caducat.}=1{La teva contrasenya actual caducarà d'aquí a menys d'un dia.}other{La teva contrasenya actual caducarà d'aquí a menys de # dies.}}</translation> <translation id="7658239707568436148">Cancel·la</translation> +<translation id="808894953321890993">Canvia la contrasenya</translation> <translation id="9111102763498581341">Desbloqueja</translation> </translationbundle> \ No newline at end of file
diff --git a/chromeos/strings/chromeos_strings_cs.xtb b/chromeos/strings/chromeos_strings_cs.xtb index e1a75636..25b8723 100644 --- a/chromeos/strings/chromeos_strings_cs.xtb +++ b/chromeos/strings/chromeos_strings_cs.xtb
@@ -3,14 +3,13 @@ <translationbundle lang="cs"> <translation id="1510238584712386396">Spouštěč</translation> <translation id="1734367976349034509">Toto zařízení je spravováno organizací</translation> +<translation id="1930797645656624981">Služba metod zadávání systému Chrome OS</translation> <translation id="2049639323467105390">Zařízení je spravováno doménou <ph name="DOMAIN" />.</translation> <translation id="2083960536266308407">Na obrazovce nebylo nic nalezeno</translation> <translation id="2338501278241028356">Chcete-li objevit okolní zařízení, zapněte Bluetooth</translation> <translation id="2805756323405976993">Aplikace</translation> <translation id="2872961005593481000">Vypnout</translation> <translation id="3147142846278915599">Spouštěč (synchronizace aplikací...)</translation> -<translation id="3442261357327209537">Klikněte sem a vyberte si nové heslo</translation> -<translation id="3506732833599356229">Platnost hesla vypršela</translation> <translation id="4731797938093519117">Rodičovský přístup</translation> <translation id="476166673298332917">Správce tohoto zařízení může monitorovat vaše aktivity v prohlížeči.</translation> <translation id="5212543919916444558">Na obrazovce nevidím nic, s čím vám můžu pomoct. @@ -21,8 +20,8 @@ <translation id="5832805196449965646">Přidat uživatele</translation> <translation id="5895138241574237353">Restartovat</translation> <translation id="6574601967010742428">Administrátor zařízení může mít možnost sledovat vaši aktivitu.</translation> -<translation id="7467001599725918325">Platnost hesla brzy vyprší</translation> <translation id="7505377169174526985">{NUM_DAYS,plural, =0{Platnost vašeho aktuálního hesla vypršela.}=1{Platnost vašeho aktuálního hesla vyprší za méně než jeden den.}few{Platnost vašeho aktuálního hesla vyprší za méně než # dny.}many{Platnost vašeho aktuálního hesla vyprší za méně než # dne.}other{Platnost vašeho aktuálního hesla vyprší za méně než # dní.}}</translation> <translation id="7658239707568436148">Zrušit</translation> +<translation id="808894953321890993">Změnit heslo</translation> <translation id="9111102763498581341">Odemknout</translation> </translationbundle> \ No newline at end of file
diff --git a/chromeos/strings/chromeos_strings_da.xtb b/chromeos/strings/chromeos_strings_da.xtb index d91fb93..7595520 100644 --- a/chromeos/strings/chromeos_strings_da.xtb +++ b/chromeos/strings/chromeos_strings_da.xtb
@@ -9,8 +9,6 @@ <translation id="2805756323405976993">Apps</translation> <translation id="2872961005593481000">Sluk</translation> <translation id="3147142846278915599">Starter (synkronisering af apps...)</translation> -<translation id="3442261357327209537">Klik her for at vælge en ny adgangskode</translation> -<translation id="3506732833599356229">Adgangskoden er udløbet</translation> <translation id="4731797938093519117">Forældreadgang</translation> <translation id="476166673298332917">Administratoren af enheden kan overvåge din browseraktivitet.</translation> <translation id="5212543919916444558">Jeg kan ikke finde noget på skærmen, jeg kan hjælpe med. Prøv at trykke på mikrofonen for at spørge mig om noget.</translation> @@ -20,8 +18,8 @@ <translation id="5832805196449965646">Tilføj person</translation> <translation id="5895138241574237353">Genstart</translation> <translation id="6574601967010742428">Enhedsadministratoren kan muligvis overvåge din aktivitet.</translation> -<translation id="7467001599725918325">Adgangskoden udløber snart</translation> <translation id="7505377169174526985">{NUM_DAYS,plural, =0{Din nuværende adgangskode er udløbet.}=1{Der er mindre end én dag til din nuværende adgangskode udløber.}one{Der er mindre end # dag til din nuværende adgangskode udløber.}other{Der er mindre end # dage til din nuværende adgangskode udløber.}}</translation> <translation id="7658239707568436148">Annuller</translation> +<translation id="808894953321890993">Skift adgangskode</translation> <translation id="9111102763498581341">Lås op</translation> </translationbundle> \ No newline at end of file
diff --git a/chromeos/strings/chromeos_strings_de.xtb b/chromeos/strings/chromeos_strings_de.xtb index 3e1eb2b..ab7f1be 100644 --- a/chromeos/strings/chromeos_strings_de.xtb +++ b/chromeos/strings/chromeos_strings_de.xtb
@@ -9,8 +9,6 @@ <translation id="2805756323405976993">Apps</translation> <translation id="2872961005593481000">Herunterfahren</translation> <translation id="3147142846278915599">Launcher (Apps werden synchronisiert...)</translation> -<translation id="3442261357327209537">Zum Ändern des Passworts hier klicken</translation> -<translation id="3506732833599356229">Passwort ist abgelaufen</translation> <translation id="4731797938093519117">Elternfreigabe</translation> <translation id="476166673298332917">Der Geräteadministrator überwacht unter Umständen Ihre Browseraktivitäten.</translation> <translation id="5212543919916444558">Ich finde nichts auf deinem Display, wobei ich dir helfen könnte. @@ -21,8 +19,8 @@ <translation id="5832805196449965646">Person hinzufügen</translation> <translation id="5895138241574237353">Neu starten</translation> <translation id="6574601967010742428">Der Geräteadministrator kann Ihre Aktivitäten möglicherweise überwachen.</translation> -<translation id="7467001599725918325">Passwort läuft demnächst ab</translation> <translation id="7505377169174526985">{NUM_DAYS,plural, =0{Ihr aktuelles Passwort ist abgelaufen.}=1{Ihr aktuelles Passwort läuft in weniger als einem Tag ab.}other{Ihr aktuelles Passwort läuft in weniger als # Tagen ab.}}</translation> <translation id="7658239707568436148">Abbrechen</translation> +<translation id="808894953321890993">Passwort ändern</translation> <translation id="9111102763498581341">Entsperren</translation> </translationbundle> \ No newline at end of file
diff --git a/chromeos/strings/chromeos_strings_el.xtb b/chromeos/strings/chromeos_strings_el.xtb index 6da9f280..253624f 100644 --- a/chromeos/strings/chromeos_strings_el.xtb +++ b/chromeos/strings/chromeos_strings_el.xtb
@@ -3,14 +3,13 @@ <translationbundle lang="el"> <translation id="1510238584712386396">Λειτουργία εκκίνησης</translation> <translation id="1734367976349034509">Αυτή η συσκευή βρίσκεται υπό τη διαχείριση επιχείρησης</translation> +<translation id="1930797645656624981">Υπηρεσία μεθόδου εισαγωγής Chrome OS</translation> <translation id="2049639323467105390">Η διαχείριση της συσκευής γίνεται από τον τομέα <ph name="DOMAIN" />.</translation> <translation id="2083960536266308407">Δεν βρέθηκε τίποτα στην οθόνη</translation> <translation id="2338501278241028356">Ενεργοποιήστε το Bluetooth, για να εντοπίσετε κοντινές συσκευές</translation> <translation id="2805756323405976993">Εφαρμογές </translation> <translation id="2872961005593481000">Τερματισμός λειτουργίας</translation> <translation id="3147142846278915599">Εφαρμογή εκκίνησης (συγχρονισμός εφαρμογών…)</translation> -<translation id="3442261357327209537">Κάντε κλικ εδώ για να επιλέξετε έναν νέο κωδικό πρόσβασης</translation> -<translation id="3506732833599356229">Ο κωδικός πρόσβασης έληξε</translation> <translation id="4731797938093519117">Γονική πρόσβαση</translation> <translation id="476166673298332917">Ο διαχειριστής της συσκευής μπορεί να παρακολουθεί τη δραστηριότητα περιήγησής σας.</translation> <translation id="5212543919916444558">Δεν βρέθηκε κάτι με το οποίο να μπορώ να σας βοηθήσω στην οθόνη σας. @@ -21,8 +20,8 @@ <translation id="5832805196449965646">Προσθήκη ατόμου</translation> <translation id="5895138241574237353">Επανεκκίνηση</translation> <translation id="6574601967010742428">Ο διαχειριστής της συσκευής ίσως έχει τη δυνατότητα να παρακολουθεί τη δραστηριότητά σας.</translation> -<translation id="7467001599725918325">Ο κωδικός πρόσβασης πρόκειται να λήξει σύντομα</translation> <translation id="7505377169174526985">{NUM_DAYS,plural, =0{Ο τρέχων κωδικός πρόσβασής σας έληξε!}=1{Ο τρέχων κωδικός πρόσβασής σας θα λήξει σε λιγότερο από μία ημέρα!}other{Ο τρέχων κωδικός πρόσβασής σας θα λήξει σε λιγότερο από # ημέρες!}}</translation> <translation id="7658239707568436148">Ακύρωση</translation> +<translation id="808894953321890993">Αλλαγή κωδικού πρόσβασης</translation> <translation id="9111102763498581341">Ξεκλείδωμα</translation> </translationbundle> \ No newline at end of file
diff --git a/chromeos/strings/chromeos_strings_en-GB.xtb b/chromeos/strings/chromeos_strings_en-GB.xtb index 940b4e2..cb38fbc 100644 --- a/chromeos/strings/chromeos_strings_en-GB.xtb +++ b/chromeos/strings/chromeos_strings_en-GB.xtb
@@ -3,14 +3,13 @@ <translationbundle lang="en-GB"> <translation id="1510238584712386396">Launcher</translation> <translation id="1734367976349034509">This device is enterprise managed</translation> +<translation id="1930797645656624981">Chrome OS Input Method Service</translation> <translation id="2049639323467105390">This device is managed by <ph name="DOMAIN" />.</translation> <translation id="2083960536266308407">Nothing found on screen</translation> <translation id="2338501278241028356">Turn on Bluetooth to discover nearby devices</translation> <translation id="2805756323405976993">Apps</translation> <translation id="2872961005593481000">Shut down</translation> <translation id="3147142846278915599">Launcher (syncing apps...)</translation> -<translation id="3442261357327209537">Click here to choose a new password</translation> -<translation id="3506732833599356229">Password has expired</translation> <translation id="4731797938093519117">Parent access</translation> <translation id="476166673298332917">The device admin may monitor your browsing activity.</translation> <translation id="5212543919916444558">I can't find anything on your screen that I can help with. @@ -21,8 +20,8 @@ <translation id="5832805196449965646">Add Person</translation> <translation id="5895138241574237353">Restart</translation> <translation id="6574601967010742428">The device administrator may be able to monitor your activity.</translation> -<translation id="7467001599725918325">Password will soon expire</translation> <translation id="7505377169174526985">{NUM_DAYS,plural, =0{Your current password has expired.}=1{Your current password will expire in less than one day.}other{Your current password will expire in less than # days.}}</translation> <translation id="7658239707568436148">Cancel</translation> +<translation id="808894953321890993">Change password</translation> <translation id="9111102763498581341">Unlock</translation> </translationbundle> \ No newline at end of file
diff --git a/chromeos/strings/chromeos_strings_es-419.xtb b/chromeos/strings/chromeos_strings_es-419.xtb index 2ebf34f0..82c68d37 100644 --- a/chromeos/strings/chromeos_strings_es-419.xtb +++ b/chromeos/strings/chromeos_strings_es-419.xtb
@@ -9,8 +9,6 @@ <translation id="2805756323405976993">Aplicaciones</translation> <translation id="2872961005593481000">Cerrar</translation> <translation id="3147142846278915599">Selector (sincronizando aplicaciones…)</translation> -<translation id="3442261357327209537">Haz clic aquí para elegir una nueva contraseña</translation> -<translation id="3506732833599356229">Caducó la contraseña</translation> <translation id="4731797938093519117">Acceso parental</translation> <translation id="476166673298332917">El administrador tiene acceso a toda la actividad, incluidas las contraseñas y comunicaciones.</translation> <translation id="5212543919916444558">No hay nada en la pantalla con lo que pueda ayudarte. @@ -21,8 +19,8 @@ <translation id="5832805196449965646">Agregar un usuario</translation> <translation id="5895138241574237353">Reiniciar</translation> <translation id="6574601967010742428">Es posible que el administrador del dispositivo supervise tu actividad.</translation> -<translation id="7467001599725918325">La contraseña caducará pronto</translation> <translation id="7505377169174526985">{NUM_DAYS,plural, =0{Caducó tu contraseña actual.}=1{Tu contraseña actual caducará en menos de un día.}other{Tu contraseña actual caducará en menos de # días.}}</translation> <translation id="7658239707568436148">Cancelar</translation> +<translation id="808894953321890993">Cambiar contraseña</translation> <translation id="9111102763498581341">Desbloquear</translation> </translationbundle> \ No newline at end of file
diff --git a/chromeos/strings/chromeos_strings_es.xtb b/chromeos/strings/chromeos_strings_es.xtb index d710224c..b1cde22 100644 --- a/chromeos/strings/chromeos_strings_es.xtb +++ b/chromeos/strings/chromeos_strings_es.xtb
@@ -9,8 +9,6 @@ <translation id="2805756323405976993">Aplicaciones</translation> <translation id="2872961005593481000">Apagar</translation> <translation id="3147142846278915599">Menú de aplicaciones (sincronizando aplicaciones...)</translation> -<translation id="3442261357327209537">Haz clic aquí para elegir una contraseña nueva</translation> -<translation id="3506732833599356229">La contraseña ha caducado</translation> <translation id="4731797938093519117">Acceso parental</translation> <translation id="476166673298332917">Es posible que el administrador del dispositivo supervise tu actividad de navegación.</translation> <translation id="5212543919916444558">No encuentro nada en la pantalla con lo que pueda ayudarte. Toca el micrófono para pedirme algo.</translation> @@ -20,8 +18,8 @@ <translation id="5832805196449965646">Añadir perfil</translation> <translation id="5895138241574237353">Reiniciar</translation> <translation id="6574601967010742428">Es posible que el administrador del dispositivo supervise tu actividad.</translation> -<translation id="7467001599725918325">La contraseña caducará pronto</translation> <translation id="7505377169174526985">{NUM_DAYS,plural, =0{Tu contraseña actual ha caducado.}=1{Tu contraseña actual caducará en menos de 1 día.}other{Tu contraseña actual caducará en # días.}}</translation> <translation id="7658239707568436148">Cancelar</translation> +<translation id="808894953321890993">Cambiar contraseña</translation> <translation id="9111102763498581341">Desbloquear</translation> </translationbundle> \ No newline at end of file
diff --git a/chromeos/strings/chromeos_strings_et.xtb b/chromeos/strings/chromeos_strings_et.xtb index 7e3a0f7..22abd83e 100644 --- a/chromeos/strings/chromeos_strings_et.xtb +++ b/chromeos/strings/chromeos_strings_et.xtb
@@ -3,14 +3,13 @@ <translationbundle lang="et"> <translation id="1510238584712386396">Käivitaja</translation> <translation id="1734367976349034509">Seda seadet haldab ettevõte</translation> +<translation id="1930797645656624981">Chrome OS sisestusmeetodi teenus</translation> <translation id="2049639323467105390">Seadet haldab <ph name="DOMAIN" />.</translation> <translation id="2083960536266308407">Ekraanilt ei leitud midagi</translation> <translation id="2338501278241028356">Lülitage Bluetooth sisse, et läheduses olevaid seadmeid avastada</translation> <translation id="2805756323405976993">Rakendused</translation> <translation id="2872961005593481000">Lülita välja</translation> <translation id="3147142846278915599">Käivitusprogramm (rakenduste sünkroonimine ...)</translation> -<translation id="3442261357327209537">Uue parooli valimiseks klõpsake siin</translation> -<translation id="3506732833599356229">Parool on aegunud</translation> <translation id="4731797938093519117">Vanema juurdepääs</translation> <translation id="476166673298332917">Seadme administraator võib jälgida teie sirvimistegevust.</translation> <translation id="5212543919916444558">Ma ei leia teie ekraanilt midagi, mille puhul saaksin aidata. @@ -21,8 +20,8 @@ <translation id="5832805196449965646">Lisa inimene</translation> <translation id="5895138241574237353">Taaskäivitamine</translation> <translation id="6574601967010742428">Seadme haldur võib saada teie tegevust jälgida.</translation> -<translation id="7467001599725918325">Parool aegub peagi</translation> <translation id="7505377169174526985">{NUM_DAYS,plural, =0{Teie praegune parool on aegunud.}=1{Teie praegune parool aegub vähem kui ühe päeva pärast.}other{Teie praegune parool aegub vähem kui # päeva pärast.}}</translation> <translation id="7658239707568436148">Tühista</translation> +<translation id="808894953321890993">Muuda parooli</translation> <translation id="9111102763498581341">Ava lukk</translation> </translationbundle> \ No newline at end of file
diff --git a/chromeos/strings/chromeos_strings_fa.xtb b/chromeos/strings/chromeos_strings_fa.xtb index 2f569db..2b2c515b 100644 --- a/chromeos/strings/chromeos_strings_fa.xtb +++ b/chromeos/strings/chromeos_strings_fa.xtb
@@ -9,8 +9,6 @@ <translation id="2805756323405976993">برنامهها</translation> <translation id="2872961005593481000">خاموش کردن</translation> <translation id="3147142846278915599">راه انداز (همگامسازی برنامهها...)</translation> -<translation id="3442261357327209537">برای انتخاب گذرواژه جدید، اینجا را کلیک کنید</translation> -<translation id="3506732833599356229">گذرواژه منقضی شده است</translation> <translation id="4731797938093519117">دسترسی والدین</translation> <translation id="476166673298332917">سرپرست دستگاه ممکن است فعالیت مرور شما را پایش کند.</translation> <translation id="5212543919916444558">در صفحهتان چیزی پیدا نمیکنم تا درمورد آن کمکتان کنم. @@ -21,8 +19,8 @@ <translation id="5832805196449965646">افزودن شخص</translation> <translation id="5895138241574237353">راهاندازی مجدد</translation> <translation id="6574601967010742428">سرپرست دستگاه ممکن است بر فعالیتتان نظارت داشته باشد.</translation> -<translation id="7467001599725918325">گذرواژه بهزودی منقضی میشود</translation> <translation id="7505377169174526985">{NUM_DAYS,plural, =0{گذرواژه کنونیتان منقضی شده است!}=1{گذرواژه کنونیتان کمتر از یک روز دیگر منقضی خواهد شد!}one{گذرواژه کنونیتان کمتر از # روز دیگر منقضی خواهد شد!}other{گذرواژه کنونیتان کمتر از # روز دیگر منقضی خواهد شد!}}</translation> <translation id="7658239707568436148">لغو</translation> +<translation id="808894953321890993">تغییر گذرواژه</translation> <translation id="9111102763498581341">باز کردن قفل</translation> </translationbundle> \ No newline at end of file
diff --git a/chromeos/strings/chromeos_strings_fi.xtb b/chromeos/strings/chromeos_strings_fi.xtb index aaa83fe..0dc88121 100644 --- a/chromeos/strings/chromeos_strings_fi.xtb +++ b/chromeos/strings/chromeos_strings_fi.xtb
@@ -3,14 +3,13 @@ <translationbundle lang="fi"> <translation id="1510238584712386396">Käynnistysohjelma</translation> <translation id="1734367976349034509">Tämä laite on yrityksen hallinnoima.</translation> +<translation id="1930797645656624981">Chrome-käyttöjärjestelmän syöttöpalvelu</translation> <translation id="2049639323467105390">Tätä laitetta hallinnoi <ph name="DOMAIN" />.</translation> <translation id="2083960536266308407">Ei tuloksia näytöllä</translation> <translation id="2338501278241028356">Löydä lähellä olevat laitteet ottamalla ensin Bluetooth käyttöön.</translation> <translation id="2805756323405976993">Sovellukset</translation> <translation id="2872961005593481000">Sammuta</translation> <translation id="3147142846278915599">Käynnistysohjelma (synkronoidaan sovelluksia…)</translation> -<translation id="3442261357327209537">Klikkaa tätä valitaksesi uuden salasanan</translation> -<translation id="3506732833599356229">Salasana on vanhentunut</translation> <translation id="4731797938093519117">Avaus vanhemmille</translation> <translation id="476166673298332917">Laitteen järjestelmänvalvoja voi valvoa selaustoimintaasi.</translation> <translation id="5212543919916444558">En löydä näytöltä mitään, minkä kanssa voisin auttaa sinua. @@ -21,8 +20,8 @@ <translation id="5832805196449965646">Lisää henkilö</translation> <translation id="5895138241574237353">Käynnistä uudelleen</translation> <translation id="6574601967010742428">Laitteen järjestelmänvalvoja voi ehkä seurata toimintaasi.</translation> -<translation id="7467001599725918325">Salasana vanhenee pian</translation> <translation id="7505377169174526985">{NUM_DAYS,plural, =0{Salasanasi on vanhentunut.}=1{Salasanasi vanhenee alle päivän päästä.}other{Salasanasi vanhenee alle # päivän päästä.}}</translation> <translation id="7658239707568436148">Peruuta</translation> +<translation id="808894953321890993">Vaihda salasana</translation> <translation id="9111102763498581341">Poista lukitus</translation> </translationbundle> \ No newline at end of file
diff --git a/chromeos/strings/chromeos_strings_fil.xtb b/chromeos/strings/chromeos_strings_fil.xtb index cd6457f..77ed6e5 100644 --- a/chromeos/strings/chromeos_strings_fil.xtb +++ b/chromeos/strings/chromeos_strings_fil.xtb
@@ -9,8 +9,6 @@ <translation id="2805756323405976993">Mga App</translation> <translation id="2872961005593481000">Shut down</translation> <translation id="3147142846278915599">Launcher (nagsi-sync ng mga app...)</translation> -<translation id="3442261357327209537">Mag-click dito para pumili ng bagong password</translation> -<translation id="3506732833599356229">Nag-expire na ang password</translation> <translation id="4731797938093519117">Pangunahing access</translation> <translation id="476166673298332917">Maaaring subaybayan ng admin ng device na ito ang iyong aktibidad sa pag-browse.</translation> <translation id="5212543919916444558">Wala akong makitang kahit ano sa iyong screen kung saan ako makakatulong. @@ -21,8 +19,8 @@ <translation id="5832805196449965646">Magdagdag ng Tao</translation> <translation id="5895138241574237353">I-restart</translation> <translation id="6574601967010742428">Maaaring masubaybayan ng administrator ng device ang iyong aktibidad.</translation> -<translation id="7467001599725918325">Malapit nang mag-expire ang password</translation> <translation id="7505377169174526985">{NUM_DAYS,plural, =0{Nag-expire na ang iyong kasalukuyang password!}=1{Mag-e-expire sa loob ng wala pang isang araw ang iyong kasalukuyang password!}one{Mag-e-expire sa loob ng wala pang # araw ang iyong kasalukuyang password!}other{Mag-e-expire sa loob ng wala pang # na araw ang iyong kasalukuyang password!}}</translation> <translation id="7658239707568436148">Kanselahin</translation> +<translation id="808894953321890993">Palitan ang password</translation> <translation id="9111102763498581341">I-unlock</translation> </translationbundle> \ No newline at end of file
diff --git a/chromeos/strings/chromeos_strings_fr.xtb b/chromeos/strings/chromeos_strings_fr.xtb index 4e14bcc..8d789f2c 100644 --- a/chromeos/strings/chromeos_strings_fr.xtb +++ b/chromeos/strings/chromeos_strings_fr.xtb
@@ -3,14 +3,13 @@ <translationbundle lang="fr"> <translation id="1510238584712386396">Lanceur d'applications</translation> <translation id="1734367976349034509">Cet appareil est géré par une entreprise</translation> +<translation id="1930797645656624981">Service de mode de saisie Chrome OS</translation> <translation id="2049639323467105390">Cet appareil est géré par <ph name="DOMAIN" />.</translation> <translation id="2083960536266308407">Aucun élément détecté sur l'écran</translation> <translation id="2338501278241028356">Activer le Bluetooth pour découvrir les appareils à proximité</translation> <translation id="2805756323405976993">Applications</translation> <translation id="2872961005593481000">Éteindre</translation> <translation id="3147142846278915599">Lanceur d'applications (synchronisation des applications en cours…)</translation> -<translation id="3442261357327209537">Cliquez ici pour définir un nouveau mot de passe</translation> -<translation id="3506732833599356229">Mot de passe expiré</translation> <translation id="4731797938093519117">Accès parental</translation> <translation id="476166673298332917">L'administrateur de cet appareil a accès à toute votre activité de navigation.</translation> <translation id="5212543919916444558">Je ne parviens pas à détecter d'éléments sur votre écran pour lesquels je peux vous aider. @@ -21,8 +20,8 @@ <translation id="5832805196449965646">Ajouter une personne</translation> <translation id="5895138241574237353">Redémarrer</translation> <translation id="6574601967010742428">Il est possible que l'administrateur de l'appareil puisse surveiller votre activité.</translation> -<translation id="7467001599725918325">Mot de passe bientôt expiré</translation> <translation id="7505377169174526985">{NUM_DAYS,plural, =0{Votre mot de passe actuel est arrivé à expiration !}=1{Votre mot de passe actuel arrive à expiration dans moins d'un jour !}one{Votre mot de passe actuel arrive à expiration dans moins de # jour !}other{Votre mot de passe actuel arrive à expiration dans moins de # jours !}}</translation> <translation id="7658239707568436148">Annuler</translation> +<translation id="808894953321890993">Modifier le mot de passe</translation> <translation id="9111102763498581341">Déverrouiller</translation> </translationbundle> \ No newline at end of file
diff --git a/chromeos/strings/chromeos_strings_gu.xtb b/chromeos/strings/chromeos_strings_gu.xtb index 697cfae..955e34f 100644 --- a/chromeos/strings/chromeos_strings_gu.xtb +++ b/chromeos/strings/chromeos_strings_gu.xtb
@@ -9,8 +9,6 @@ <translation id="2805756323405976993">એપ્સ</translation> <translation id="2872961005593481000">શટ ડાઉન કરો</translation> <translation id="3147142846278915599">લોન્ચર (એપ્લિકેશન્સને સમન્વયિત કરી રહ્યું છે..)</translation> -<translation id="3442261357327209537">નવો પાસવર્ડ પસંદ કરવા માટે અહીં ક્લિક કરો</translation> -<translation id="3506732833599356229">પાસવર્ડની સમયસીમા સમાપ્ત થઈ ગઈ છે</translation> <translation id="4731797938093519117">માતાપિતા માટે ઍક્સેસ</translation> <translation id="476166673298332917">ડિવાઇસ વ્યવસ્થાપક તમારી બ્રાઉઝિંગ પ્રવૃત્તિને મોનિટર કરી શકે છે.</translation> <translation id="5212543919916444558">મને તમારી સ્ક્રીન પર એવી કોઈપણ વસ્તુ મળી નથી કે જેમાં હું તમારી સહાય કરી શકું. મને કંઈપણ પૂછવા માટે માઇકને ટૅપ કરી જુઓ.</translation> @@ -20,8 +18,8 @@ <translation id="5832805196449965646">વ્યક્તિ ઉમેરો</translation> <translation id="5895138241574237353">પુનઃપ્રારંભ કરો</translation> <translation id="6574601967010742428">ડિવાઇસના વ્યવસ્થાપક તમારી પ્રવૃત્તિને મૉનિટર કરી શકે છે.</translation> -<translation id="7467001599725918325">પાસવર્ડની સમયસીમા ટૂંક સમયમાં સમાપ્ત થશે</translation> <translation id="7505377169174526985">{NUM_DAYS,plural, =0{તમારા હાલના પાસવર્ડની સમયસીમા સમાપ્ત થઈ ગઈ છે!}=1{તમારો વર્તમાન પાસવર્ડ સમાપ્ત થવામાં એક દિવસ કરતાં પણ ઓછો સમય બાકી!}one{તમારો વર્તમાન પાસવર્ડ સમાપ્ત થવામાં # દિવસ કરતાં પણ ઓછો સમય બાકી!}other{તમારો વર્તમાન પાસવર્ડ સમાપ્ત થવામાં # દિવસ કરતાં પણ ઓછો સમય બાકી!}}</translation> <translation id="7658239707568436148">રદ કરો</translation> +<translation id="808894953321890993">પાસવર્ડ બદલો</translation> <translation id="9111102763498581341">અનલોક કરો</translation> </translationbundle> \ No newline at end of file
diff --git a/chromeos/strings/chromeos_strings_hi.xtb b/chromeos/strings/chromeos_strings_hi.xtb index 028e245..a26cf68 100644 --- a/chromeos/strings/chromeos_strings_hi.xtb +++ b/chromeos/strings/chromeos_strings_hi.xtb
@@ -9,8 +9,6 @@ <translation id="2805756323405976993">ऐप्स</translation> <translation id="2872961005593481000">शट डाउन करें</translation> <translation id="3147142846278915599">लॉन्चर (ऐप्स समन्वयित किए जा रहे हैं...)</translation> -<translation id="3442261357327209537">नया पासवर्ड चुनने के लिए यहां क्लिक करें.</translation> -<translation id="3506732833599356229">पासवर्ड की समय-सीमा खत्म हो गई है</translation> <translation id="4731797938093519117">अभिभावक एक्सेस</translation> <translation id="476166673298332917">इस डिवाइस का एडमिन आपकी ब्राउज़िंग गतिविधि पर नज़र रख सकता है.</translation> <translation id="5212543919916444558">मुझे आपकी स्क्रीन पर ऐसा कुछ नहीं मिला जिसमें मैं आपकी सहायता कर पाऊं. @@ -21,8 +19,8 @@ <translation id="5832805196449965646">व्यक्ति जोड़ें</translation> <translation id="5895138241574237353">फिर से प्रारंभ करें</translation> <translation id="6574601967010742428">डिवाइस का एडमिन आपकी गतिविधि पर नज़र रख सकता है.</translation> -<translation id="7467001599725918325">पासवर्ड की समय-सीमा जल्दी ही खत्म हो जाएगी</translation> <translation id="7505377169174526985">{NUM_DAYS,plural, =0{आपके मौजूदा पासवर्ड की समय-सीमा खत्म हो चुकी है!}=1{आपके मौजूदा पासवर्ड की समय-सीमा एक दिन से कम समय में खत्म हो जाएगी!}one{आपके मौजूदा पासवर्ड की समय-सीमा # दिन से कम समय में खत्म हो जाएगी!}other{आपके मौजूदा पासवर्ड की समय-सीमा # दिन से कम समय में खत्म हो जाएगी!}}</translation> <translation id="7658239707568436148">अभी नहीं</translation> +<translation id="808894953321890993">पासवर्ड बदलें</translation> <translation id="9111102763498581341">अनलॉक करें</translation> </translationbundle> \ No newline at end of file
diff --git a/chromeos/strings/chromeos_strings_hr.xtb b/chromeos/strings/chromeos_strings_hr.xtb index 7d6d17d2..53b06b4 100644 --- a/chromeos/strings/chromeos_strings_hr.xtb +++ b/chromeos/strings/chromeos_strings_hr.xtb
@@ -3,14 +3,13 @@ <translationbundle lang="hr"> <translation id="1510238584712386396">Pokretač</translation> <translation id="1734367976349034509">Ovim uređajem upravlja tvrtka</translation> +<translation id="1930797645656624981">Usluga načina unosa OS-a Chrome</translation> <translation id="2049639323467105390">Ovim uređajem upravlja <ph name="DOMAIN" />.</translation> <translation id="2083960536266308407">Na zaslonu nije ništa pronađeno</translation> <translation id="2338501278241028356">Uključite Bluetooth da biste otkrili uređaje u blizini</translation> <translation id="2805756323405976993">Aplikacije</translation> <translation id="2872961005593481000">Isključi</translation> <translation id="3147142846278915599">Pokretač (sinkronizacija aplikacija...)</translation> -<translation id="3442261357327209537">Kliknite ovdje da biste odabrali novu zaporku</translation> -<translation id="3506732833599356229">Zaporka je istekla</translation> <translation id="4731797938093519117">Roditeljski pristup</translation> <translation id="476166673298332917">Administrator uređaja može pratiti vašu aktivnost pregledavanja.</translation> <translation id="5212543919916444558">Na zaslonu ne mogu pronaći ništa u vezi s čime mogu pružiti pomoć. @@ -21,8 +20,8 @@ <translation id="5832805196449965646">Dodaj osobu</translation> <translation id="5895138241574237353">Ponovno pokreni</translation> <translation id="6574601967010742428">Administrator uređaja možda može nadzirati vašu aktivnost.</translation> -<translation id="7467001599725918325">Zaporka će uskoro isteći</translation> <translation id="7505377169174526985">{NUM_DAYS,plural, =0{Vaša je trenutačna zaporka istekla!}=1{Vaša trenutačna zaporka isteći će za manje od jednog dana!}one{Vaša trenutačna zaporka isteći će za manje od # dana!}few{Vaša trenutačna zaporka isteći će za manje od # dana!}other{Vaša trenutačna zaporka isteći će za manje od # dana!}}</translation> <translation id="7658239707568436148">Odustani</translation> +<translation id="808894953321890993">Promjena zaporke</translation> <translation id="9111102763498581341">Otključaj</translation> </translationbundle> \ No newline at end of file
diff --git a/chromeos/strings/chromeos_strings_hu.xtb b/chromeos/strings/chromeos_strings_hu.xtb index 7c09680..4ef50ec8 100644 --- a/chromeos/strings/chromeos_strings_hu.xtb +++ b/chromeos/strings/chromeos_strings_hu.xtb
@@ -3,14 +3,13 @@ <translationbundle lang="hu"> <translation id="1510238584712386396">Indító</translation> <translation id="1734367976349034509">Az eszközt a vállalat felügyeli</translation> +<translation id="1930797645656624981">Chrome OS beviteli módszere szolgáltatás</translation> <translation id="2049639323467105390">Ezt az eszközt a(z) <ph name="DOMAIN" /> domain kezeli.</translation> <translation id="2083960536266308407">Semmi nem található a képernyőn</translation> <translation id="2338501278241028356">Kapcsolja be a Bluetooth-t a közeli eszközök felfedezéséhez</translation> <translation id="2805756323405976993">Alkalmazások</translation> <translation id="2872961005593481000">Leállítás</translation> <translation id="3147142846278915599">Indító (alkalmazások szinkronizálása…)</translation> -<translation id="3442261357327209537">Kattintson ide új jelszó választásához</translation> -<translation id="3506732833599356229">A jelszó lejárt</translation> <translation id="4731797938093519117">Szülői hozzáférés</translation> <translation id="476166673298332917">Az eszköz rendszergazdája figyelheti a böngészési tevékenységét.</translation> <translation id="5212543919916444558">Nem találok semmi olyat a képernyőn, amellyel kapcsolatban segíthetnék. @@ -21,8 +20,8 @@ <translation id="5832805196449965646">Személy hozzáadása</translation> <translation id="5895138241574237353">Újraindítás</translation> <translation id="6574601967010742428">Lehetséges, hogy tevékenységeit megfigyelheti az eszköz adminisztrátora.</translation> -<translation id="7467001599725918325">A jelszó hamarosan lejár</translation> <translation id="7505377169174526985">{NUM_DAYS,plural, =0{Jelenlegi jelszava lejárt!}=1{Jelenlegi jelszava 1 napon belül lejár!}other{Jelenlegi jelszava # napon belül lejár!}}</translation> <translation id="7658239707568436148">Mégse</translation> +<translation id="808894953321890993">Jelszó módosítása</translation> <translation id="9111102763498581341">Feloldás</translation> </translationbundle> \ No newline at end of file
diff --git a/chromeos/strings/chromeos_strings_id.xtb b/chromeos/strings/chromeos_strings_id.xtb index 3368ba2..79b2f76d 100644 --- a/chromeos/strings/chromeos_strings_id.xtb +++ b/chromeos/strings/chromeos_strings_id.xtb
@@ -9,8 +9,6 @@ <translation id="2805756323405976993">Apl</translation> <translation id="2872961005593481000">Matikan</translation> <translation id="3147142846278915599">Peluncur (menyinkronkan aplikasi...)</translation> -<translation id="3442261357327209537">Klik di sini untuk memilih sandi baru.</translation> -<translation id="3506732833599356229">Sandi sudah tidak berlaku</translation> <translation id="4731797938093519117">Akses orang tua</translation> <translation id="476166673298332917">Admin perangkat dapat memantau aktivitas akses internet Anda.</translation> <translation id="5212543919916444558">Di layar tidak ada apa pun yang membutuhkan bantuan saya. @@ -21,8 +19,8 @@ <translation id="5832805196449965646">Tambahkan Pengguna</translation> <translation id="5895138241574237353">Mulai Ulang</translation> <translation id="6574601967010742428">Administrator perangkat mungkin dapat memantau aktivitas Anda.</translation> -<translation id="7467001599725918325">Masa berlaku sandi akan segera berakhir</translation> <translation id="7505377169174526985">{NUM_DAYS,plural, =0{Sandi Anda saat ini sudah tidak berlaku.}=1{Masa berlaku sandi Anda saat ini akan berakhir dalam waktu kurang dari sehari.}other{Masa berlaku sandi Anda akan berakhir dalam # hari.}}</translation> <translation id="7658239707568436148">Batal</translation> +<translation id="808894953321890993">Ubah sandi</translation> <translation id="9111102763498581341">Buka kunci</translation> </translationbundle> \ No newline at end of file
diff --git a/chromeos/strings/chromeos_strings_it.xtb b/chromeos/strings/chromeos_strings_it.xtb index e50279e..819530c 100644 --- a/chromeos/strings/chromeos_strings_it.xtb +++ b/chromeos/strings/chromeos_strings_it.xtb
@@ -3,14 +3,13 @@ <translationbundle lang="it"> <translation id="1510238584712386396">Avvio applicazioni</translation> <translation id="1734367976349034509">Questo dispositivo è gestito dall'azienda</translation> +<translation id="1930797645656624981">Servizio metodo di immissione di Chrome OS</translation> <translation id="2049639323467105390">Questo dispositivo è gestito da <ph name="DOMAIN" />.</translation> <translation id="2083960536266308407">Non è stato trovato niente sullo schermo</translation> <translation id="2338501278241028356">Attiva il Bluetooth per trovare dispositivi nelle vicinanze</translation> <translation id="2805756323405976993">App</translation> <translation id="2872961005593481000">Spegni</translation> <translation id="3147142846278915599">Avvio applicazioni (sincronizzazione delle app...)</translation> -<translation id="3442261357327209537">Fai clic qui per scegliere una nuova password</translation> -<translation id="3506732833599356229">La password è scaduta</translation> <translation id="4731797938093519117">Accesso genitore</translation> <translation id="476166673298332917">L'amministratore del dispositivo può controllare l'attività di navigazione.</translation> <translation id="5212543919916444558">Non riesco a trovare nulla sullo schermo per cui poterti essere utile. @@ -21,8 +20,8 @@ <translation id="5832805196449965646">Aggiungi persona</translation> <translation id="5895138241574237353">Riavvia</translation> <translation id="6574601967010742428">L'amministratore del dispositivo potrebbe essere in grado di monitorare le tue attività.</translation> -<translation id="7467001599725918325">La password è prossima alla scadenza</translation> <translation id="7505377169174526985">{NUM_DAYS,plural, =0{La tua attuale password è scaduta.}=1{La tua attuale password scadrà tra meno di un giorno.}other{La tua attuale password scadrà tra meno di # giorni.}}</translation> <translation id="7658239707568436148">Annulla</translation> +<translation id="808894953321890993">Cambia password</translation> <translation id="9111102763498581341">Sblocca</translation> </translationbundle> \ No newline at end of file
diff --git a/chromeos/strings/chromeos_strings_iw.xtb b/chromeos/strings/chromeos_strings_iw.xtb index 592f328..dd19968 100644 --- a/chromeos/strings/chromeos_strings_iw.xtb +++ b/chromeos/strings/chromeos_strings_iw.xtb
@@ -9,8 +9,6 @@ <translation id="2805756323405976993">אפליקציות</translation> <translation id="2872961005593481000">כיבוי</translation> <translation id="3147142846278915599">מרכז האפליקציות (האפליקציות מסתנכרנות...)</translation> -<translation id="3442261357327209537">כדי לבחור סיסמה חדשה, יש ללחוץ כאן</translation> -<translation id="3506732833599356229">פג תוקף הסיסמה</translation> <translation id="4731797938093519117">גישת הורים</translation> <translation id="476166673298332917">מנהל המכשיר עשוי לנטר את פעילות הגלישה שלך.</translation> <translation id="5212543919916444558">לא מצאתי במסך משהו שאוכל לעזור בו. @@ -21,8 +19,8 @@ <translation id="5832805196449965646">הוספת משתמש</translation> <translation id="5895138241574237353">הפעל מחדש</translation> <translation id="6574601967010742428">למנהל המכשיר תהיה יכולת לעקוב אחרי הפעילות שלך.</translation> -<translation id="7467001599725918325">תוקף הסיסמה עומד לפוג</translation> <translation id="7505377169174526985">{NUM_DAYS,plural, =0{פג התוקף של הסיסמה הנוכחית!}=1{התוקף של הסיסמה הנוכחית יפוג תוך פחות מיום!}two{התוקף של הסיסמה הנוכחית יפוג תוך פחות מיומיים!}many{התוקף של הסיסמה הנוכחית יפוג תוך פחות מ-# ימים!}other{התוקף של הסיסמה הנוכחית יפוג תוך פחות מ-# ימים!}}</translation> <translation id="7658239707568436148">ביטול</translation> +<translation id="808894953321890993">שינוי הסיסמה</translation> <translation id="9111102763498581341">בטל נעילה</translation> </translationbundle> \ No newline at end of file
diff --git a/chromeos/strings/chromeos_strings_ja.xtb b/chromeos/strings/chromeos_strings_ja.xtb index 862a766..1da7a98 100644 --- a/chromeos/strings/chromeos_strings_ja.xtb +++ b/chromeos/strings/chromeos_strings_ja.xtb
@@ -9,8 +9,6 @@ <translation id="2805756323405976993">アプリ</translation> <translation id="2872961005593481000">終了</translation> <translation id="3147142846278915599">ランチャー(アプリを同期中...)</translation> -<translation id="3442261357327209537">新しいパスワードを指定するには、ここをクリックしてください</translation> -<translation id="3506732833599356229">パスワードの有効期限が切れています</translation> <translation id="4731797938093519117">保護者によるアクセス</translation> <translation id="476166673298332917">デバイス管理者が閲覧アクティビティを監視している可能性があります。</translation> <translation id="5212543919916444558">画面からはサポートできる内容が見つかりませんでした。 @@ -21,8 +19,8 @@ <translation id="5832805196449965646">ユーザーを追加</translation> <translation id="5895138241574237353">再起動</translation> <translation id="6574601967010742428">デバイスの管理者によりアクティビティが監視される可能性があります。</translation> -<translation id="7467001599725918325">パスワードの有効期限がまもなく切れます</translation> <translation id="7505377169174526985">{NUM_DAYS,plural, =0{現在のパスワードは有効期限が切れています。}=1{現在のパスワードは 1 日以内に有効期限が切れます。}other{現在のパスワードは # 日以内に有効期限が切れます。}}</translation> <translation id="7658239707568436148">キャンセル</translation> +<translation id="808894953321890993">パスワードの変更</translation> <translation id="9111102763498581341">ロック解除</translation> </translationbundle> \ No newline at end of file
diff --git a/chromeos/strings/chromeos_strings_kn.xtb b/chromeos/strings/chromeos_strings_kn.xtb index 05a4f10..8a277df 100644 --- a/chromeos/strings/chromeos_strings_kn.xtb +++ b/chromeos/strings/chromeos_strings_kn.xtb
@@ -9,8 +9,6 @@ <translation id="2805756323405976993">ಆಪ್ಸ್</translation> <translation id="2872961005593481000">ಮುಚ್ಚಿಬಿಡಿ </translation> <translation id="3147142846278915599">ಲಾಂಚರ್ (ಅಪ್ಲಿಕೇಶನ್ಗಳನ್ನು ಸಿಂಕ್ ಮಾಡಲಾಗುತ್ತಿದೆ...)</translation> -<translation id="3442261357327209537">ಹೊಸ ಪಾಸ್ವರ್ಡ್ ಅನ್ನು ಆಯ್ಕೆ ಮಾಡಲು ಇಲ್ಲಿ ಕ್ಲಿಕ್ ಮಾಡಿ</translation> -<translation id="3506732833599356229">ಪಾಸ್ವರ್ಡ್ ಅವಧಿ ಮೀರಿದೆ</translation> <translation id="4731797938093519117">ಪೋಷಕ ಪ್ರವೇಶ ಬಟನ್</translation> <translation id="476166673298332917">ಈ ಡಿವೈಸ್ ನಿರ್ವಾಹಕರು ನಿಮ್ಮ ಬ್ರೌಸಿಂಗ್ ಚಟುವಟಿಕೆಯನ್ನು ಗಮನಿಸಬಹುದು.</translation> <translation id="5212543919916444558">ನಾನು ನಿಮಗೆ ಸಹಾಯ ಮಾಡಬಹುದಾದ ಯಾವುದೇ ವಿಷಯ ನಿಮ್ಮ ಸ್ಕ್ರೀನ್ ಮೇಲೆ ನನಗೆ ಕಾಣಿಸಿಲ್ಲ. ನನ್ನ ಬಳಿ ಏನಾದರೂ ಕೇಳಬೇಕಿದ್ದರೆ, ಮೈಕ್ ಟ್ಯಾಪ್ ಮಾಡಿ.</translation> @@ -20,8 +18,8 @@ <translation id="5832805196449965646">ವ್ಯಕ್ತಿಯನ್ನು ಸೇರಿಸು</translation> <translation id="5895138241574237353">ಮರುಪ್ರಾರಂಭಿಸಿ</translation> <translation id="6574601967010742428">ನಿಮ್ಮ ಚಟುವಟಿಕೆಯನ್ನು ಮೇಲ್ವಿಚಾರಣೆ ಮಾಡಲು ಸಾಧನ ನಿರ್ವಾಹಕರಿಗೆ ಸಾಧ್ಯವಾಗಬಹುದು.</translation> -<translation id="7467001599725918325">ಪಾಸ್ವರ್ಡ್ ಶೀಘ್ರದಲ್ಲಿಯೇ ಅವಧಿ ಮೀರಲಿದೆ</translation> <translation id="7505377169174526985">{NUM_DAYS,plural, =0{ನಿಮ್ಮ ಪ್ರಸ್ತುತ ಪಾಸ್ವರ್ಡ್ ಅವಧಿ ಮೀರಿದೆ!}=1{ನಿಮ್ಮ ಪ್ರಸ್ತುತ ಪಾಸ್ವರ್ಡ್ ಒಂದು ದಿನಕ್ಕಿಂತಲೂ ಕಡಿಮೆ ಅವಧಿಯಲ್ಲಿ ಅವಧಿ ಮೀರುತ್ತದೆ!}one{ನಿಮ್ಮ ಪ್ರಸ್ತುತ ಪಾಸ್ವರ್ಡ್ # ದಿನಗಳಿಗಿಂತಲೂ ಕಡಿಮೆ ಅವಧಿಯಲ್ಲಿ ಅವಧಿ ಮೀರುತ್ತದೆ!}other{ನಿಮ್ಮ ಪ್ರಸ್ತುತ ಪಾಸ್ವರ್ಡ್ # ದಿನಗಳಿಗಿಂತಲೂ ಕಡಿಮೆ ಅವಧಿಯಲ್ಲಿ ಅವಧಿ ಮೀರುತ್ತದೆ!}}</translation> <translation id="7658239707568436148">ರದ್ದುಮಾಡಿ</translation> +<translation id="808894953321890993">ಪಾಸ್ವರ್ಡ್ ಬದಲಿಸಿ</translation> <translation id="9111102763498581341">ಅನ್ಲಾಕ್</translation> </translationbundle> \ No newline at end of file
diff --git a/chromeos/strings/chromeos_strings_ko.xtb b/chromeos/strings/chromeos_strings_ko.xtb index 61d5158..8bc720c4 100644 --- a/chromeos/strings/chromeos_strings_ko.xtb +++ b/chromeos/strings/chromeos_strings_ko.xtb
@@ -9,8 +9,6 @@ <translation id="2805756323405976993">앱</translation> <translation id="2872961005593481000">종료</translation> <translation id="3147142846278915599">런처(앱 동기화 중...)</translation> -<translation id="3442261357327209537">새 비밀번호를 선택하려면 여기를 클릭하세요.</translation> -<translation id="3506732833599356229">비밀번호가 만료됨</translation> <translation id="4731797938093519117">부모 액세스</translation> <translation id="476166673298332917">기기 관리자가 탐색 활동을 모니터링할 수 있습니다.</translation> <translation id="5212543919916444558">화면에 도움을 드릴 수 있는 항목이 보이지 않습니다. @@ -21,8 +19,8 @@ <translation id="5832805196449965646">사용자 추가</translation> <translation id="5895138241574237353">다시 시작</translation> <translation id="6574601967010742428">기기 관리자가 내 활동을 모니터링할 수도 있습니다.</translation> -<translation id="7467001599725918325">비밀번호가 곧 만료됨</translation> <translation id="7505377169174526985">{NUM_DAYS,plural, =0{현재 비밀번호가 만료되었습니다.}=1{1일 이내에 현재 비밀번호가 만료됩니다.}other{#일 이내에 현재 비밀번호가 만료됩니다.}}</translation> <translation id="7658239707568436148">취소</translation> +<translation id="808894953321890993">비밀번호 변경</translation> <translation id="9111102763498581341">잠금 해제</translation> </translationbundle> \ No newline at end of file
diff --git a/chromeos/strings/chromeos_strings_lt.xtb b/chromeos/strings/chromeos_strings_lt.xtb index 0359130..043ad97b 100644 --- a/chromeos/strings/chromeos_strings_lt.xtb +++ b/chromeos/strings/chromeos_strings_lt.xtb
@@ -3,14 +3,13 @@ <translationbundle lang="lt"> <translation id="1510238584712386396">Paleidimo priemonė</translation> <translation id="1734367976349034509">Šis įrenginys valdomas įmonės</translation> +<translation id="1930797645656624981">„Chrome“ OS įvesties metodo paslauga</translation> <translation id="2049639323467105390">Įrenginys valdomas „<ph name="DOMAIN" />“.</translation> <translation id="2083960536266308407">Ekrane nieko nerasta</translation> <translation id="2338501278241028356">Įjunkite „Bluetooth“, kad aptiktumėte įrenginius netoliese</translation> <translation id="2805756323405976993">Taikomosios programos</translation> <translation id="2872961005593481000">Stabdyti</translation> <translation id="3147142846278915599">Paleidimo priemonė (sinchronizuojamos programos...)</translation> -<translation id="3442261357327209537">Spustelėkite čia, jei norite pasirinkti naują slaptažodį</translation> -<translation id="3506732833599356229">Baigėsi slaptažodžio galiojimo laikas</translation> <translation id="4731797938093519117">Tėvų prieiga</translation> <translation id="476166673298332917">Šio įrenginio administratorius gali stebėti jūsų naršymo veiklą.</translation> <translation id="5212543919916444558">Ekrane nieko nerasta, dėl ko galėtume jums padėti. @@ -21,8 +20,8 @@ <translation id="5832805196449965646">Pridėti asmenį</translation> <translation id="5895138241574237353">Paleisti iš naujo</translation> <translation id="6574601967010742428">Įrenginio administratorius gali stebėti jūsų veiklą.</translation> -<translation id="7467001599725918325">Slaptažodžio galiojimas netrukus baigsis</translation> <translation id="7505377169174526985">{NUM_DAYS,plural, =0{Jūsų dabartinis slaptažodis nebegalioja!}=1{Jūsų dabartinis slaptažodis baigs galioti po mažiau nei vienos dienos!}one{Jūsų dabartinis slaptažodis baigs galioti po mažiau nei # dienos!}few{Jūsų dabartinis slaptažodis baigs galioti po mažiau nei # dienų!}many{Jūsų dabartinis slaptažodis baigs galioti po mažiau nei # dienos!}other{Jūsų dabartinis slaptažodis baigs galioti po mažiau nei # dienų!}}</translation> <translation id="7658239707568436148">Atšaukti</translation> +<translation id="808894953321890993">Keisti slaptažodį</translation> <translation id="9111102763498581341">Atrakinti</translation> </translationbundle> \ No newline at end of file
diff --git a/chromeos/strings/chromeos_strings_lv.xtb b/chromeos/strings/chromeos_strings_lv.xtb index 011b315..00fc211 100644 --- a/chromeos/strings/chromeos_strings_lv.xtb +++ b/chromeos/strings/chromeos_strings_lv.xtb
@@ -3,14 +3,13 @@ <translationbundle lang="lv"> <translation id="1510238584712386396">Lietojumprogrammu palaidējs</translation> <translation id="1734367976349034509">Šo ierīci pārvalda uzņēmums</translation> +<translation id="1930797645656624981">Chrome OS ievades metodes pakalpojums</translation> <translation id="2049639323467105390">Šo ierīci pārvalda vietne <ph name="DOMAIN" />.</translation> <translation id="2083960536266308407">Ekrānā nekas netika atrasts</translation> <translation id="2338501278241028356">Ieslēdziet Bluetooth, lai atklātu tuvumā esošas ierīces</translation> <translation id="2805756323405976993">Lietotnes</translation> <translation id="2872961005593481000">Beidzēt</translation> <translation id="3147142846278915599">Palaišanas programma (notiek lietotņu sinhronizēšana...)</translation> -<translation id="3442261357327209537">Noklikšķiniet šeit, lai izvēlētos jaunu paroli.</translation> -<translation id="3506732833599356229">Ir beidzies paroles derīguma termiņš</translation> <translation id="4731797938093519117">Vecāku piekļuve</translation> <translation id="476166673298332917">Ierīces administrators var novērot visas jūsu pārlūkošanas darbības.</translation> <translation id="5212543919916444558">Ekrānā neredzu neko, ar ko varētu palīdzēt. @@ -21,8 +20,8 @@ <translation id="5832805196449965646">Pievienot personu</translation> <translation id="5895138241574237353">Restartēt</translation> <translation id="6574601967010742428">Jūsu darbības var pārraudzīt ierīces pārvaldnieks.</translation> -<translation id="7467001599725918325">Drīz beigsies paroles derīguma termiņš</translation> <translation id="7505377169174526985">{NUM_DAYS,plural, =0{Jūsu pašreizējai parolei ir beidzies derīguma termiņš.}=1{Jūsu pašreizējās paroles derīguma termiņš beigsies pēc mazāk nekā vienas dienas.}zero{Jūsu pašreizējās paroles derīguma termiņš beigsies pēc mazāk nekā # dienām.}one{Jūsu pašreizējās paroles derīguma termiņš beigsies pēc mazāk nekā # dienas.}other{Jūsu pašreizējās paroles derīguma termiņš beigsies pēc mazāk nekā # dienām.}}</translation> <translation id="7658239707568436148">Atcelt</translation> +<translation id="808894953321890993">Mainīt paroli</translation> <translation id="9111102763498581341">Atbloķēt</translation> </translationbundle> \ No newline at end of file
diff --git a/chromeos/strings/chromeos_strings_ml.xtb b/chromeos/strings/chromeos_strings_ml.xtb index 004b732..d5cd6a8 100644 --- a/chromeos/strings/chromeos_strings_ml.xtb +++ b/chromeos/strings/chromeos_strings_ml.xtb
@@ -9,8 +9,6 @@ <translation id="2805756323405976993">ആപ്സ്</translation> <translation id="2872961005593481000">അടയ്ക്കുക</translation> <translation id="3147142846278915599">ലോഞ്ചർ (അപ്ലിക്കേഷൻ സമന്വയിപ്പിക്കുന്നു...)</translation> -<translation id="3442261357327209537">പുതിയൊരു പാസ്വേഡ് തിരഞ്ഞെടുക്കാൻ ഇവിടെ ക്ലിക്ക് ചെയ്യുക</translation> -<translation id="3506732833599356229">പാസ്വേഡ് കാലഹരണപ്പെട്ടു</translation> <translation id="4731797938093519117">രക്ഷാകർതൃ ആക്സസ്</translation> <translation id="476166673298332917">ഉപകരണ അഡ്മിൻ നിങ്ങളുടെ ബ്രൗസിംഗ് ആക്റ്റിവിറ്റി നിരീക്ഷിച്ചേക്കാം.</translation> <translation id="5212543919916444558">എനിക്ക് സഹായിക്കാനാവുന്ന ഒന്നും നിങ്ങളുടെ സ്ക്രീനിൽ കണ്ടെത്താനാവുന്നില്ല. എന്നോട് എന്തെങ്കിലും ആവശ്യപ്പെടാൻ മൈക്ക് ടാപ്പ് ചെയ്യുന്നത് പരീക്ഷിക്കൂ.</translation> @@ -20,8 +18,8 @@ <translation id="5832805196449965646">വ്യക്തിയെ ചേർക്കുക</translation> <translation id="5895138241574237353">പുനരാരംഭിക്കുക</translation> <translation id="6574601967010742428">ഉപകരണ അഡ്മിനിസ്ട്രേറ്റർക്ക് നിങ്ങളുടെ ആക്റ്റിവിറ്റി നിരീക്ഷിക്കാനായേക്കും.</translation> -<translation id="7467001599725918325">പാസ്വേഡ് ഉടൻ കാലഹരണപ്പെടും</translation> <translation id="7505377169174526985">{NUM_DAYS,plural, =0{നിങ്ങളുടെ നിലവിലെ പാസ്വേഡ് കാലഹരണപ്പെട്ടു!}=1{നിങ്ങളുടെ നിലവിലെ പാസ്വേഡ് ഒരു ദിവസത്തിനുള്ളിൽ കാലഹരണപ്പെടും!}other{നിങ്ങളുടെ നിലവിലെ പാസ്വേഡ് # ദിവസത്തിനുള്ളിൽ കാലഹരണപ്പെടും!}}</translation> <translation id="7658239707568436148">റദ്ദാക്കൂ</translation> +<translation id="808894953321890993">പാസ്വേഡ് മാറ്റുക</translation> <translation id="9111102763498581341">അണ്ലോക്ക് ചെയ്യുക</translation> </translationbundle> \ No newline at end of file
diff --git a/chromeos/strings/chromeos_strings_mr.xtb b/chromeos/strings/chromeos_strings_mr.xtb index 37c0c38..98a1082 100644 --- a/chromeos/strings/chromeos_strings_mr.xtb +++ b/chromeos/strings/chromeos_strings_mr.xtb
@@ -9,8 +9,6 @@ <translation id="2805756323405976993">ॲप्लिकेशन</translation> <translation id="2872961005593481000">बंद करा</translation> <translation id="3147142846278915599">लाँचर (संकालन ॲप्स...)</translation> -<translation id="3442261357327209537">नवीन पासवर्ड निवडण्यासाठी येथे क्लिक करा</translation> -<translation id="3506732833599356229">पासवर्ड एक्स्पायर झाला आहे</translation> <translation id="4731797938093519117">पालक अॅक्सेस</translation> <translation id="476166673298332917">डिव्हाइस प्रशासक तुमच्या ब्राउझिंग ॲक्टिव्हिटीचे परीक्षण करू शकतो.</translation> <translation id="5212543919916444558">मी मदत करू शकेन असे मला तुमच्या स्क्रीनवर काही आढळले नाही. @@ -21,8 +19,8 @@ <translation id="5832805196449965646">व्यक्ती जोडा</translation> <translation id="5895138241574237353">रीस्टार्ट करा</translation> <translation id="6574601967010742428">डिव्हाइस ॲडमिनिस्ट्रेटर कदाचित तुमची ॲक्टिव्हिटी नियंत्रित करू शकेल.</translation> -<translation id="7467001599725918325">पासवर्ड लवकर एक्स्पायर होईल</translation> <translation id="7505377169174526985">{NUM_DAYS,plural, =0{तुमचा सध्याचा पासवर्ड एक्स्पायर झाला आहे!}=1{तुमचा सध्याचा पासवर्ड एका दिवसापेक्षा कमी वेळेत एक्स्पायर होईल!}other{तुमचा सध्याचा पासवर्ड # दिवसांपेक्षा कमी वेळेत एक्स्पायर होईल!}}</translation> <translation id="7658239707568436148">रद्द करा</translation> +<translation id="808894953321890993">पासवर्ड बदला</translation> <translation id="9111102763498581341">अनलॉक करा</translation> </translationbundle> \ No newline at end of file
diff --git a/chromeos/strings/chromeos_strings_ms.xtb b/chromeos/strings/chromeos_strings_ms.xtb index d6c8155..6525797b4 100644 --- a/chromeos/strings/chromeos_strings_ms.xtb +++ b/chromeos/strings/chromeos_strings_ms.xtb
@@ -9,8 +9,6 @@ <translation id="2805756323405976993">Apl</translation> <translation id="2872961005593481000">Mematikan</translation> <translation id="3147142846278915599">Pelancar (menyegerakkan apl...)</translation> -<translation id="3442261357327209537">Klik di sini untuk memilih kata laluan baharu</translation> -<translation id="3506732833599356229">Kata laluan telah tamat tempoh</translation> <translation id="4731797938093519117">Akses ibu bapa</translation> <translation id="476166673298332917">Pentadbir peranti boleh memantau aktiviti penyemakan imbas anda.</translation> <translation id="5212543919916444558">Saya tidak menemui apa-apa pada skrin anda yang boleh saya bantu. @@ -21,8 +19,8 @@ <translation id="5832805196449965646">Tambah Orang</translation> <translation id="5895138241574237353">Mulakan Semula</translation> <translation id="6574601967010742428">Pentadbir peranti mungkin dapat memantau aktiviti anda</translation> -<translation id="7467001599725918325">Kata laluan akan tamat tempoh tidak lama lagi</translation> <translation id="7505377169174526985">{NUM_DAYS,plural, =0{Kata laluan semasa anda telah tamat tempoh!}=1{Kata laluan semasa anda akan tamat tempoh kurang daripada satu hari!}other{Kata laluan semasa anda akan tamat tempoh kurang daripada # hari!}}</translation> <translation id="7658239707568436148">Batal</translation> +<translation id="808894953321890993">Tukar kata laluan</translation> <translation id="9111102763498581341">Buka kunci</translation> </translationbundle> \ No newline at end of file
diff --git a/chromeos/strings/chromeos_strings_nl.xtb b/chromeos/strings/chromeos_strings_nl.xtb index f2b4cd5..737923d 100644 --- a/chromeos/strings/chromeos_strings_nl.xtb +++ b/chromeos/strings/chromeos_strings_nl.xtb
@@ -9,8 +9,6 @@ <translation id="2805756323405976993">Apps</translation> <translation id="2872961005593481000">Afsluiten</translation> <translation id="3147142846278915599">Launcher (apps synchroniseren...)</translation> -<translation id="3442261357327209537">Klik hier om een nieuw wachtwoord te kiezen</translation> -<translation id="3506732833599356229">Wachtwoord is verlopen</translation> <translation id="4731797938093519117">Toegang door ouders</translation> <translation id="476166673298332917">De apparaatbeheerder kan je browseactiviteit controleren.</translation> <translation id="5212543919916444558">Ik heb niets gevonden op je scherm waarmee ik kan helpen. @@ -21,8 +19,8 @@ <translation id="5832805196449965646">Persoon toevoegen</translation> <translation id="5895138241574237353">Opnieuw starten</translation> <translation id="6574601967010742428">De beheerder van het apparaat kan je activiteit mogelijk bekijken.</translation> -<translation id="7467001599725918325">Wachtwoord verloopt binnenkort</translation> <translation id="7505377169174526985">{NUM_DAYS,plural, =0{Je huidige wachtwoord is verlopen.}=1{Je huidige wachtwoord verloopt binnen één dag.}other{Je huidige wachtwoord verloopt binnen # dagen.}}</translation> <translation id="7658239707568436148">Annuleren</translation> +<translation id="808894953321890993">Wachtwoord wijzigen</translation> <translation id="9111102763498581341">Ontgrendelen</translation> </translationbundle> \ No newline at end of file
diff --git a/chromeos/strings/chromeos_strings_no.xtb b/chromeos/strings/chromeos_strings_no.xtb index f3d33f2..5f63a46 100644 --- a/chromeos/strings/chromeos_strings_no.xtb +++ b/chromeos/strings/chromeos_strings_no.xtb
@@ -3,14 +3,13 @@ <translationbundle lang="no"> <translation id="1510238584712386396">Appvelger</translation> <translation id="1734367976349034509">Denne enheten er administrert av en bedrift</translation> +<translation id="1930797645656624981">Tjeneste for Chrome OS-inndatametode</translation> <translation id="2049639323467105390">Denne enheten administreres av <ph name="DOMAIN" />.</translation> <translation id="2083960536266308407">Fant ingenting på skjermen</translation> <translation id="2338501278241028356">Slå på Bluetooth for å finne enheter i nærheten</translation> <translation id="2805756323405976993">Apper</translation> <translation id="2872961005593481000">Slå av</translation> <translation id="3147142846278915599">Appoversikt (synkroniserer apper ...)</translation> -<translation id="3442261357327209537">Klikk her for å velge nytt passord</translation> -<translation id="3506732833599356229">Passordet er utløpt</translation> <translation id="4731797938093519117">Foreldretilgang</translation> <translation id="476166673298332917">Enhetsadministratoren har tilgang til nettleseraktiviteten din.</translation> <translation id="5212543919916444558">Jeg finner ikke noe på skjermen jeg kan hjelpe deg med. @@ -21,8 +20,8 @@ <translation id="5832805196449965646">Legg til person</translation> <translation id="5895138241574237353">Start på nytt</translation> <translation id="6574601967010742428">Enhetsadministratoren kan muligens overvåke aktiviteten din.</translation> -<translation id="7467001599725918325">Passordet utløper snart</translation> <translation id="7505377169174526985">{NUM_DAYS,plural, =0{Det nåværende passordet ditt er utløpt!}=1{Det nåværende passordet ditt utløper om mindre enn én dag!}other{Det nåværende passordet ditt utløper om mindre enn # dager!}}</translation> <translation id="7658239707568436148">Avbryt</translation> +<translation id="808894953321890993">Endre passord</translation> <translation id="9111102763498581341">Lås opp</translation> </translationbundle> \ No newline at end of file
diff --git a/chromeos/strings/chromeos_strings_pl.xtb b/chromeos/strings/chromeos_strings_pl.xtb index a9291f3..50aaa6e3 100644 --- a/chromeos/strings/chromeos_strings_pl.xtb +++ b/chromeos/strings/chromeos_strings_pl.xtb
@@ -3,14 +3,13 @@ <translationbundle lang="pl"> <translation id="1510238584712386396">Menu z aplikacjami</translation> <translation id="1734367976349034509">Tym urządzeniem zarządza firma</translation> +<translation id="1930797645656624981">Usługa Metoda wprowadzania Chrome OS</translation> <translation id="2049639323467105390">To urządzenie jest zarządzane przez: <ph name="DOMAIN" />.</translation> <translation id="2083960536266308407">Na ekranie nic nie znaleziono</translation> <translation id="2338501278241028356">Włącz Bluetooth, by wykryć urządzenia w pobliżu</translation> <translation id="2805756323405976993">Aplikacje</translation> <translation id="2872961005593481000">Wyłącz</translation> <translation id="3147142846278915599">Menu z aplikacjami (synchronizuję aplikacje...)</translation> -<translation id="3442261357327209537">Kliknij tutaj, aby wybrać nowe hasło</translation> -<translation id="3506732833599356229">Hasło wygasło</translation> <translation id="4731797938093519117">Dostęp rodzica</translation> <translation id="476166673298332917">Administrator urządzenia może monitorować Twoją aktywność związaną z przeglądaniem.</translation> <translation id="5212543919916444558">Na Twoim ekranie nie ma nic, w czym mogę pomóc. @@ -21,8 +20,8 @@ <translation id="5832805196449965646">Dodaj osobę</translation> <translation id="5895138241574237353">Uruchom ponownie</translation> <translation id="6574601967010742428">Administrator urządzenia może monitorować Twoją aktywność.</translation> -<translation id="7467001599725918325">Hasło wkrótce straci ważność</translation> <translation id="7505377169174526985">{NUM_DAYS,plural, =0{Twoje obecne hasło wygasło.}=1{Twoje obecne hasło wygasa za mniej niż dzień.}few{Twoje obecne hasło wygasa za mniej niż # dni.}many{Twoje obecne hasło wygasa za mniej niż # dni.}other{Twoje obecne hasło wygasa za mniej niż # dni.}}</translation> <translation id="7658239707568436148">Anuluj</translation> +<translation id="808894953321890993">Zmień hasło</translation> <translation id="9111102763498581341">Odblokuj</translation> </translationbundle> \ No newline at end of file
diff --git a/chromeos/strings/chromeos_strings_pt-BR.xtb b/chromeos/strings/chromeos_strings_pt-BR.xtb index a4c7443..3908813 100644 --- a/chromeos/strings/chromeos_strings_pt-BR.xtb +++ b/chromeos/strings/chromeos_strings_pt-BR.xtb
@@ -9,8 +9,6 @@ <translation id="2805756323405976993">Apps</translation> <translation id="2872961005593481000">Desligar</translation> <translation id="3147142846278915599">Tela de início (sincronizando aplicativos...)</translation> -<translation id="3442261357327209537">Clique aqui para escolher uma nova senha</translation> -<translation id="3506732833599356229">A senha expirou</translation> <translation id="4731797938093519117">Acesso de pai/mãe</translation> <translation id="476166673298332917">O administrador deste dispositivo poderá monitorar sua atividade de navegação.</translation> <translation id="5212543919916444558">Não foi possível encontrar na sua tela nada com o que eu possa ajudar. @@ -21,8 +19,8 @@ <translation id="5832805196449965646">Adicionar pessoa</translation> <translation id="5895138241574237353">Reiniciar</translation> <translation id="6574601967010742428">O administrador do dispositivo pode conseguir monitorar sua atividade.</translation> -<translation id="7467001599725918325">A senha expirará em breve</translation> <translation id="7505377169174526985">{NUM_DAYS,plural, =0{Sua senha atual expirou.}=1{Sua senha atual expirará em menos de um dia.}one{Sua senha atual expirará em menos de # dia.}other{Sua senha atual expirará em menos de # dias.}}</translation> <translation id="7658239707568436148">Cancelar</translation> +<translation id="808894953321890993">Alterar senha</translation> <translation id="9111102763498581341">Desbloquear</translation> </translationbundle> \ No newline at end of file
diff --git a/chromeos/strings/chromeos_strings_pt-PT.xtb b/chromeos/strings/chromeos_strings_pt-PT.xtb index f54c92c..35b0172 100644 --- a/chromeos/strings/chromeos_strings_pt-PT.xtb +++ b/chromeos/strings/chromeos_strings_pt-PT.xtb
@@ -3,14 +3,13 @@ <translationbundle lang="pt-PT"> <translation id="1510238584712386396">Iniciador</translation> <translation id="1734367976349034509">Este dispositivo é gerido pela empresa</translation> +<translation id="1930797645656624981">Serviço do método de introdução do Chrome OS</translation> <translation id="2049639323467105390">Este aparelho é gerido por <ph name="DOMAIN" />.</translation> <translation id="2083960536266308407">Não foi encontrado nada no ecrã.</translation> <translation id="2338501278241028356">Ativar o Bluetooth para detetar dispositivos próximos</translation> <translation id="2805756323405976993">Aplicações</translation> <translation id="2872961005593481000">Encerrar</translation> <translation id="3147142846278915599">Launcher (a sincronizar aplicações...)</translation> -<translation id="3442261357327209537">Clique aqui para escolher uma nova palavra-passe</translation> -<translation id="3506732833599356229">A palavra-passe expirou</translation> <translation id="4731797938093519117">Acesso parental</translation> <translation id="476166673298332917">O administrador deste dispositivo poderá monitorizar a sua atividade de navegação.</translation> <translation id="5212543919916444558">Não consigo encontrar nada no ecrã com que possa ajudar. @@ -21,8 +20,8 @@ <translation id="5832805196449965646">Adicionar pessoa</translation> <translation id="5895138241574237353">Reiniciar</translation> <translation id="6574601967010742428">O administrador do dispositivo pode conseguir monitorizar a sua atividade.</translation> -<translation id="7467001599725918325">A palavra-passe expira em breve</translation> <translation id="7505377169174526985">{NUM_DAYS,plural, =0{A sua palavra-passe atual expirou!}=1{A sua palavra-passe atual expira em menos de um dia!}other{A sua palavra-passe atual expira em menos de # dias!}}</translation> <translation id="7658239707568436148">Cancelar</translation> +<translation id="808894953321890993">Alterar palavra-passe</translation> <translation id="9111102763498581341">Desbloquear</translation> </translationbundle> \ No newline at end of file
diff --git a/chromeos/strings/chromeos_strings_ro.xtb b/chromeos/strings/chromeos_strings_ro.xtb index 9489034..40c4a53 100644 --- a/chromeos/strings/chromeos_strings_ro.xtb +++ b/chromeos/strings/chromeos_strings_ro.xtb
@@ -3,14 +3,13 @@ <translationbundle lang="ro"> <translation id="1510238584712386396">Lansator</translation> <translation id="1734367976349034509">Acest dispozitiv este gestionat de companie</translation> +<translation id="1930797645656624981">Serviciul metodei de introducere a textului din sistemul de operare Chrome</translation> <translation id="2049639323467105390">Acest dispozitiv este gestionat de <ph name="DOMAIN" />.</translation> <translation id="2083960536266308407">Nu s-a găsit nimic pe ecran</translation> <translation id="2338501278241028356">Pentru a descoperi dispozitivele din apropiere, activează Bluetooth</translation> <translation id="2805756323405976993">Aplicații</translation> <translation id="2872961005593481000">Închide</translation> <translation id="3147142846278915599">Lansator (se sincronizează aplicațiile...)</translation> -<translation id="3442261357327209537">Dă clic aici pentru a alege o parolă nouă</translation> -<translation id="3506732833599356229">Parola a expirat</translation> <translation id="4731797938093519117">Acces pentru părinți</translation> <translation id="476166673298332917">Administratorul dispozitivului îți poate monitoriza activitatea de navigare.</translation> <translation id="5212543919916444558">Nu găsesc conținut pe ecran în privința căruia te-aș putea ajuta. @@ -21,8 +20,8 @@ <translation id="5832805196449965646">Adăugați un utilizator</translation> <translation id="5895138241574237353">Reîncepe</translation> <translation id="6574601967010742428">Administratorul dispozitivului poate să îți monitorizeze activitatea.</translation> -<translation id="7467001599725918325">Parola va expira în curând</translation> <translation id="7505377169174526985">{NUM_DAYS,plural, =0{Parola curentă a expirat!}=1{Parola curentă va expira în mai puțin de o zi!}few{Parola curentă va expira în mai puțin de # zile!}other{Parola curentă va expira în mai puțin de # de zile!}}</translation> <translation id="7658239707568436148">Anulează</translation> +<translation id="808894953321890993">Schimbă parola</translation> <translation id="9111102763498581341">Deblochează</translation> </translationbundle> \ No newline at end of file
diff --git a/chromeos/strings/chromeos_strings_ru.xtb b/chromeos/strings/chromeos_strings_ru.xtb index 37fa1ee..74c233e 100644 --- a/chromeos/strings/chromeos_strings_ru.xtb +++ b/chromeos/strings/chromeos_strings_ru.xtb
@@ -9,8 +9,6 @@ <translation id="2805756323405976993">Приложения</translation> <translation id="2872961005593481000">Завершить работу</translation> <translation id="3147142846278915599">Панель запуска (синхронизация приложений...)</translation> -<translation id="3442261357327209537">Нажмите, чтобы выбрать новый пароль.</translation> -<translation id="3506732833599356229">Срок действия пароля истек</translation> <translation id="4731797938093519117">Родительский доступ</translation> <translation id="476166673298332917">Администратору устройства доступна информация о том, какие страницы вы просматриваете в браузере.</translation> <translation id="5212543919916444558">Я не нашла на экране ничего подходящего. @@ -21,8 +19,8 @@ <translation id="5832805196449965646">Добавить пользователя</translation> <translation id="5895138241574237353">Перезапустить</translation> <translation id="6574601967010742428">Администратор может отслеживать ваши действия на этом устройстве.</translation> -<translation id="7467001599725918325">Срок действия пароля скоро истечет</translation> <translation id="7505377169174526985">{NUM_DAYS,plural, =0{Срок действия текущего пароля истек.}=1{Срок действия текущего пароля истекает менее чем через 1 день.}one{Срок действия текущего пароля истекает менее чем через # день.}few{Срок действия текущего пароля истекает менее чем через # дня.}many{Срок действия текущего пароля истекает менее чем через # дней.}other{Срок действия текущего пароля истекает менее чем через # дня.}}</translation> <translation id="7658239707568436148">Отмена</translation> +<translation id="808894953321890993">Сменить пароль</translation> <translation id="9111102763498581341">Разблокировать</translation> </translationbundle> \ No newline at end of file
diff --git a/chromeos/strings/chromeos_strings_sk.xtb b/chromeos/strings/chromeos_strings_sk.xtb index 075703e3..fdc01dc 100644 --- a/chromeos/strings/chromeos_strings_sk.xtb +++ b/chromeos/strings/chromeos_strings_sk.xtb
@@ -3,14 +3,13 @@ <translationbundle lang="sk"> <translation id="1510238584712386396">Spúšťač</translation> <translation id="1734367976349034509">Toto zariadenie je spravované organizáciou</translation> +<translation id="1930797645656624981">Služba metódy vstupu systému Chrome OS</translation> <translation id="2049639323467105390">Toto zariadenie je spravované doménou <ph name="DOMAIN" />.</translation> <translation id="2083960536266308407">Na obrazovke sa nič nenašlo</translation> <translation id="2338501278241028356">Ak chcete nájsť zariadenia v okolí, zapnite Bluetooth</translation> <translation id="2805756323405976993">Aplikácie</translation> <translation id="2872961005593481000">Vypnúť</translation> <translation id="3147142846278915599">Spúšťač (synchronizujú sa aplikácie...)</translation> -<translation id="3442261357327209537">Kliknite tu a vyberte nové heslo</translation> -<translation id="3506732833599356229">Platnosť hesla vypršala</translation> <translation id="4731797938093519117">Rodičovský prístup</translation> <translation id="476166673298332917">Správca zariadenia môže sledovať vašu aktivitu prehliadania.</translation> <translation id="5212543919916444558">Na obrazovke nie je nič, s čím by som mohol pomôcť. @@ -21,8 +20,8 @@ <translation id="5832805196449965646">Pridať osobu</translation> <translation id="5895138241574237353">Reštartovať</translation> <translation id="6574601967010742428">Správca zariadenia môže sledovať vašu aktivitu.</translation> -<translation id="7467001599725918325">Platnosť hesla čoskoro vyprší</translation> <translation id="7505377169174526985">{NUM_DAYS,plural, =0{Platnosť vášho aktuálneho hesla vypršala.}=1{Platnosť vášho aktuálneho hesla vyprší za menej ako deň.}few{Platnosť vášho aktuálneho hesla vyprší za menej ako # dni.}many{Platnosť vášho aktuálneho hesla vyprší za menej ako # dňa.}other{Platnosť vášho aktuálneho hesla vyprší za menej ako # dní.}}</translation> <translation id="7658239707568436148">Zrušiť</translation> +<translation id="808894953321890993">Zmeniť heslo</translation> <translation id="9111102763498581341">Odomknúť</translation> </translationbundle> \ No newline at end of file
diff --git a/chromeos/strings/chromeos_strings_sl.xtb b/chromeos/strings/chromeos_strings_sl.xtb index 9bf734ff..5230b405 100644 --- a/chromeos/strings/chromeos_strings_sl.xtb +++ b/chromeos/strings/chromeos_strings_sl.xtb
@@ -3,14 +3,13 @@ <translationbundle lang="sl"> <translation id="1510238584712386396">Zaganjalnik</translation> <translation id="1734367976349034509">To napravo upravlja podjetje</translation> +<translation id="1930797645656624981">Storitev načina vnosa v okolju OS Chrome</translation> <translation id="2049639323467105390">To napravo upravlja <ph name="DOMAIN" />.</translation> <translation id="2083960536266308407">Na zaslonu ni bilo mogoče najti ničesar</translation> <translation id="2338501278241028356">Vklopite Bluetooth, če želite odkriti naprave v bližini</translation> <translation id="2805756323405976993">Aplikacije</translation> <translation id="2872961005593481000">Zaustavitev</translation> <translation id="3147142846278915599">Zaganjalnik (sinhronizacija aplikacij ...)</translation> -<translation id="3442261357327209537">Izberite tukaj, če želite izbrati novo geslo</translation> -<translation id="3506732833599356229">Geslo je poteklo</translation> <translation id="4731797938093519117">Starševski dostop</translation> <translation id="476166673298332917">Skrbnik naprave morda spremlja vašo dejavnost brskanja.</translation> <translation id="5212543919916444558">Na zaslonu ni ničesar uporabnega. @@ -21,8 +20,8 @@ <translation id="5832805196449965646">Dodaj osebo</translation> <translation id="5895138241574237353">Znova zaženi</translation> <translation id="6574601967010742428">Upravitelj naprave lahko morda nadzira vašo dejavnost.</translation> -<translation id="7467001599725918325">Geslo bo kmalu poteklo</translation> <translation id="7505377169174526985">{NUM_DAYS,plural, =0{Trenutno geslo je poteklo.}=1{Trenutno geslo poteče čez manj kot en dan.}one{Trenutno geslo poteče čez manj kot # dan.}two{Trenutno geslo poteče čez manj kot # dneva.}few{Trenutno geslo poteče čez manj kot # dni.}other{Trenutno geslo poteče čez manj kot # dni.}}</translation> <translation id="7658239707568436148">Prekliči</translation> +<translation id="808894953321890993">Sprememba gesla</translation> <translation id="9111102763498581341">Odkleni</translation> </translationbundle> \ No newline at end of file
diff --git a/chromeos/strings/chromeos_strings_sr.xtb b/chromeos/strings/chromeos_strings_sr.xtb index 1fdb235..348360f 100644 --- a/chromeos/strings/chromeos_strings_sr.xtb +++ b/chromeos/strings/chromeos_strings_sr.xtb
@@ -3,14 +3,13 @@ <translationbundle lang="sr"> <translation id="1510238584712386396">Покретач</translation> <translation id="1734367976349034509">Овим уређајем управља предузеће</translation> +<translation id="1930797645656624981">Услуга метода уноса за Chrome ОС</translation> <translation id="2049639323467105390">Овим уређајем управља домен <ph name="DOMAIN" />.</translation> <translation id="2083960536266308407">Нисмо пронашли ништа на екрану</translation> <translation id="2338501278241028356">Укључите Bluetooth да бисте открили уређаје у близини</translation> <translation id="2805756323405976993">Апликације</translation> <translation id="2872961005593481000">Искључи</translation> <translation id="3147142846278915599">Покретач (апликације се синхронизују...)</translation> -<translation id="3442261357327209537">Кликните овде да бисте одабрали нову лозинку</translation> -<translation id="3506732833599356229">Лозинка је истекла</translation> <translation id="4731797938093519117">Родитељски приступ</translation> <translation id="476166673298332917">Администратор овог уређаја може да надгледа активности прегледања.</translation> <translation id="5212543919916444558">Не могу да пронађем на екрану ништа око чега могу да помогнем. @@ -21,8 +20,8 @@ <translation id="5832805196449965646">Додај особу</translation> <translation id="5895138241574237353">Покрени поново</translation> <translation id="6574601967010742428">Администратор уређаја ће можда моћи да надгледа ваше активности.</translation> -<translation id="7467001599725918325">Лозинка ускоро истиче</translation> <translation id="7505377169174526985">{NUM_DAYS,plural, =0{Актуелна лозинка је истекла!}=1{Актуелна лозинка истиче за мање од једног дана!}one{Актуелна лозинка истиче за мање од # дана!}few{Актуелна лозинка истиче за мање од # дана!}other{Актуелна лозинка истиче за мање од # дана!}}</translation> <translation id="7658239707568436148">Откажи</translation> +<translation id="808894953321890993">Промени лозинку</translation> <translation id="9111102763498581341">Откључај</translation> </translationbundle> \ No newline at end of file
diff --git a/chromeos/strings/chromeos_strings_sv.xtb b/chromeos/strings/chromeos_strings_sv.xtb index d7b77827..e306a8d 100644 --- a/chromeos/strings/chromeos_strings_sv.xtb +++ b/chromeos/strings/chromeos_strings_sv.xtb
@@ -9,8 +9,6 @@ <translation id="2805756323405976993">Appar</translation> <translation id="2872961005593481000">Stäng av</translation> <translation id="3147142846278915599">Översikt (appar synkroniseras …)</translation> -<translation id="3442261357327209537">Klicka här om du vill välja ett nytt lösenord</translation> -<translation id="3506732833599356229">Lösenordet har upphört att gälla</translation> <translation id="4731797938093519117">Föräldraåtkomst</translation> <translation id="476166673298332917">Enhetens administratör kan övervaka din webbhistorik</translation> <translation id="5212543919916444558">Det finns inget på skärmen som jag kan hjälpa till med. @@ -21,8 +19,8 @@ <translation id="5832805196449965646">Lägg till person</translation> <translation id="5895138241574237353">Starta om</translation> <translation id="6574601967010742428">Enhetsadministratören kan ha möjlighet att övervaka det du gör.</translation> -<translation id="7467001599725918325">Lösenordet upphör snart att gälla</translation> <translation id="7505377169174526985">{NUM_DAYS,plural, =0{Lösenordet har upphört att gälla.}=1{Lösenordet upphör att gälla om mindre än en dag.}other{Lösenordet upphör att gälla om mindre än # dagar.}}</translation> <translation id="7658239707568436148">Avbryt</translation> +<translation id="808894953321890993">Ändra lösenord</translation> <translation id="9111102763498581341">Lås upp</translation> </translationbundle> \ No newline at end of file
diff --git a/chromeos/strings/chromeos_strings_sw.xtb b/chromeos/strings/chromeos_strings_sw.xtb index 9b0c5a1..c369aa0f 100644 --- a/chromeos/strings/chromeos_strings_sw.xtb +++ b/chromeos/strings/chromeos_strings_sw.xtb
@@ -3,14 +3,13 @@ <translationbundle lang="sw"> <translation id="1510238584712386396">Kizindua</translation> <translation id="1734367976349034509">Kifaa hiki kinadhibitiwa kibiashara</translation> +<translation id="1930797645656624981">Huduma ya Mbinu ya Kuingiza Data kwenye Mfumo wa Uendeshaji wa Chrome</translation> <translation id="2049639323467105390">Kifaa hiki kinadhibitiwa na <ph name="DOMAIN" /> .</translation> <translation id="2083960536266308407">Sijapata chochote kwenye skrini</translation> <translation id="2338501278241028356">Washa Bluetooth ili ugundue vifaa vilivyo karibu</translation> <translation id="2805756323405976993">Programu</translation> <translation id="2872961005593481000">Zima</translation> <translation id="3147142846278915599">Kifungua programu (inasawazisha programu...)</translation> -<translation id="3442261357327209537">Bofya hapa ili uchague nenosiri jipya</translation> -<translation id="3506732833599356229">Muda wa kutumia nenosiri umekwisha</translation> <translation id="4731797938093519117">Idhini ya mzazi</translation> <translation id="476166673298332917">Msimamizi wa kifaa hiki anaweza kufuatilia shughuli zako za kuvinjari.</translation> <translation id="5212543919916444558">Sijapata swali lolote kwenye skrini yako. Jaribu kugonga maikrofoni ili uniulize chochote.</translation> @@ -20,8 +19,8 @@ <translation id="5832805196449965646">Ongeza Mtumiaji Mwingine</translation> <translation id="5895138241574237353">Zzima na uwashe</translation> <translation id="6574601967010742428">Huenda msimamizi wa kifaa hiki atafuatilia shughuli zako.</translation> -<translation id="7467001599725918325">Muda wa kutumia nenosiri utaisha hivi karibuni</translation> <translation id="7505377169174526985">{NUM_DAYS,plural, =0{Muda wa kutumia nenosiri lako la sasa umekwisha!}=1{Muda wa kutumia nenosiri lako la sasa unaisha ndani ya siku moja!}other{Muda wa kutumia nenosiri lako la sasa utaisha ndani ya siku #!}}</translation> <translation id="7658239707568436148">Ghairi</translation> +<translation id="808894953321890993">Badilisha nenosiri</translation> <translation id="9111102763498581341">Fungua</translation> </translationbundle> \ No newline at end of file
diff --git a/chromeos/strings/chromeos_strings_ta.xtb b/chromeos/strings/chromeos_strings_ta.xtb index 01bd08d..54e2a56 100644 --- a/chromeos/strings/chromeos_strings_ta.xtb +++ b/chromeos/strings/chromeos_strings_ta.xtb
@@ -9,8 +9,6 @@ <translation id="2805756323405976993">ஆப்ஸ்</translation> <translation id="2872961005593481000">நிறுத்து</translation> <translation id="3147142846278915599">துவக்கி (பயன்பாடுகளை ஒத்திசைக்கிறது...)</translation> -<translation id="3442261357327209537">புதிய கடவுச்சொல்லை உள்ளிட இங்கே கிளிக் செய்க</translation> -<translation id="3506732833599356229">கடவுச்சொல் காலாவதியானது</translation> <translation id="4731797938093519117">பெற்றோர் அணுகல்</translation> <translation id="476166673298332917">சாதன நிர்வாகி உங்கள் உலாவல் செயல்பாட்டைக் கண்காணிக்கக்கூடும்.</translation> <translation id="5212543919916444558">உங்களுக்கு நான் உதவும் வகையில், உங்கள் திரையில் எதுவுமில்லை. @@ -21,8 +19,8 @@ <translation id="5832805196449965646">நபரைச் சேர்</translation> <translation id="5895138241574237353">மறுதொடக்கம்</translation> <translation id="6574601967010742428">உங்கள் செயல்பாடு சாதன நிர்வாகியால் கண்காணிக்கப்படலாம்.</translation> -<translation id="7467001599725918325">கடவுச்சொல் கூடிய விரைவில் காலாவதியாகும்</translation> <translation id="7505377169174526985">{NUM_DAYS,plural, =0{தற்போதைய கடவுச்சொல் காலாவதியானது!}=1{தற்போதைய கடவுச்சொல் ஒரு நாளுக்குள் காலாவதியாகும்!}other{தற்போதைய கடவுச்சொல் # நாட்களுக்குள் காலாவதியாகும்!}}</translation> <translation id="7658239707568436148">ரத்து செய்</translation> +<translation id="808894953321890993">கடவுச்சொல்லை மாற்று</translation> <translation id="9111102763498581341">பூட்டைத் திற</translation> </translationbundle> \ No newline at end of file
diff --git a/chromeos/strings/chromeos_strings_te.xtb b/chromeos/strings/chromeos_strings_te.xtb index cdd3d0d..e9d2bac 100644 --- a/chromeos/strings/chromeos_strings_te.xtb +++ b/chromeos/strings/chromeos_strings_te.xtb
@@ -9,8 +9,6 @@ <translation id="2805756323405976993">యాప్స్</translation> <translation id="2872961005593481000">షట్ డౌన్ చెయ్యండి</translation> <translation id="3147142846278915599">లాంచర్ (అనువర్తనాలను సమకాలీకరిస్తోంది...)</translation> -<translation id="3442261357327209537">కొత్త పాస్వర్డ్ను ఎంచుకోవడానికి ఇక్కడ క్లిక్ చేయండి</translation> -<translation id="3506732833599356229">పాస్వర్డ్ గడువు ముగిసింది</translation> <translation id="4731797938093519117">తల్లి/తండ్రి యాక్సెస్</translation> <translation id="476166673298332917">పరికర నిర్వాహకులు మీ బ్రౌజింగ్ కార్యకలాపాన్ని పర్యవేక్షించవచ్చు.</translation> <translation id="5212543919916444558">నేను సహాయం అందించగలిగేలా మీ స్క్రీన్పై నాకు ఏదీ కనిపించలేదు. మైక్ను నొక్కి, నన్ను ఏదైనా అడగడానికి ప్రయత్నించండి.</translation> @@ -20,8 +18,8 @@ <translation id="5832805196449965646">వ్యక్తిని జోడించు</translation> <translation id="5895138241574237353">మళ్ళీ ప్రారంభించు</translation> <translation id="6574601967010742428">మీ కార్యకలాపాన్ని పరికర నిర్వాహకులు పర్యవేక్షించవచ్చు.</translation> -<translation id="7467001599725918325">పాస్వర్డ్ గడువు త్వరలో ముగుస్తుంది</translation> <translation id="7505377169174526985">{NUM_DAYS,plural, =0{మీ ప్రస్తుత పాస్వర్డ్ గడువు ముగిసింది!}=1{మీ ప్రస్తుత పాస్వర్డ్ గడువు ఒక రోజులోపు ముగుస్తుంది!}other{మీ ప్రస్తుత పాస్వర్డ్ గడువు # రోజులలో ముగుస్తుంది!}}</translation> <translation id="7658239707568436148">రద్దు చేయి</translation> +<translation id="808894953321890993">పాస్వర్డ్ను మార్చు</translation> <translation id="9111102763498581341">అన్లాక్ చేయి</translation> </translationbundle> \ No newline at end of file
diff --git a/chromeos/strings/chromeos_strings_th.xtb b/chromeos/strings/chromeos_strings_th.xtb index 70b1fe14..7fb9601 100644 --- a/chromeos/strings/chromeos_strings_th.xtb +++ b/chromeos/strings/chromeos_strings_th.xtb
@@ -3,14 +3,13 @@ <translationbundle lang="th"> <translation id="1510238584712386396">ตัวเรียกใช้งาน</translation> <translation id="1734367976349034509">อุปกรณ์นี้ได้รับการจัดการโดยองค์กร</translation> +<translation id="1930797645656624981">บริการวิธีการป้อนข้อมูลของ Chrome OS</translation> <translation id="2049639323467105390">อุปกรณ์นี้ได้รับการจัดการโดย <ph name="DOMAIN" /></translation> <translation id="2083960536266308407">ไม่พบสิ่งใดในหน้าจอ</translation> <translation id="2338501278241028356">เปิดบลูทูธเพื่อค้นหาอุปกรณ์ใกล้เคียง</translation> <translation id="2805756323405976993">แอป</translation> <translation id="2872961005593481000">ปิด</translation> <translation id="3147142846278915599">Launcher (กำลังซิงค์แอป...)</translation> -<translation id="3442261357327209537">คลิกที่นี่เพื่อเลือกรหัสผ่านใหม่</translation> -<translation id="3506732833599356229">รหัสผ่านหมดอายุแล้ว</translation> <translation id="4731797938093519117">การเข้าถึงของผู้ปกครอง</translation> <translation id="476166673298332917">ผู้ดูแลระบบของอุปกรณ์อาจตรวจสอบกิจกรรมการท่องเว็บของคุณ</translation> <translation id="5212543919916444558">ฉันไม่พบสิ่งที่จะช่วยได้ในหน้าจอ @@ -21,8 +20,8 @@ <translation id="5832805196449965646">เพิ่มบุคคล</translation> <translation id="5895138241574237353">ปิดแล้วเปิดอีกครั้ง</translation> <translation id="6574601967010742428">ผู้ดูแลระบบของอุปกรณ์อาจมีสิทธิ์ตรวจสอบกิจกรรมของคุณได้</translation> -<translation id="7467001599725918325">รหัสผ่านใกล้หมดอายุแล้ว</translation> <translation id="7505377169174526985">{NUM_DAYS,plural, =0{รหัสผ่านปัจจุบันของคุณหมดอายุแล้ว}=1{รหัสผ่านปัจจุบันของคุณจะหมดอายุในไม่ถึง 1 วัน}other{รหัสผ่านปัจจุบันของคุณจะหมดอายุในไม่ถึง # วัน}}</translation> <translation id="7658239707568436148">ยกเลิก</translation> +<translation id="808894953321890993">เปลี่ยนรหัสผ่าน</translation> <translation id="9111102763498581341">ปลดล็อก</translation> </translationbundle> \ No newline at end of file
diff --git a/chromeos/strings/chromeos_strings_tr.xtb b/chromeos/strings/chromeos_strings_tr.xtb index c9754ca..bc918f76 100644 --- a/chromeos/strings/chromeos_strings_tr.xtb +++ b/chromeos/strings/chromeos_strings_tr.xtb
@@ -9,8 +9,6 @@ <translation id="2805756323405976993">Uygulamalar</translation> <translation id="2872961005593481000">Kapat</translation> <translation id="3147142846278915599">Launcher (uygulamalar senkronize ediliyor...)</translation> -<translation id="3442261357327209537">Yeni bir şifre seçmek için burayı tıklayın</translation> -<translation id="3506732833599356229">Şifrenin süresi doldu</translation> <translation id="4731797938093519117">Ebeveyn erişimi</translation> <translation id="476166673298332917">Cihaz yöneticisi göz atma etkinliğinizi izleyebilir.</translation> <translation id="5212543919916444558">Ekranınızda size yardımcı olabileceğim bir şey bulamıyorum. @@ -21,8 +19,8 @@ <translation id="5832805196449965646">Kişi Ekle</translation> <translation id="5895138241574237353">Yeniden başlat</translation> <translation id="6574601967010742428">Cihaz yöneticisi, etkinliğinizi izleyebilir.</translation> -<translation id="7467001599725918325">Şifrenin süresi dolmak üzere</translation> <translation id="7505377169174526985">{NUM_DAYS,plural, =0{Mevcut şifrenizin süresi doldu!}=1{Mevcut şifrenizin süresi bir günden kısa bir süre içinde dolacak!}other{Mevcut şifrenizin süresi # günden kısa bir süre içinde dolacak}}</translation> <translation id="7658239707568436148">İptal</translation> +<translation id="808894953321890993">Şifreyi değiştir</translation> <translation id="9111102763498581341">Kilidi Aç</translation> </translationbundle> \ No newline at end of file
diff --git a/chromeos/strings/chromeos_strings_uk.xtb b/chromeos/strings/chromeos_strings_uk.xtb index 7350c0c6..f8fa721ed 100644 --- a/chromeos/strings/chromeos_strings_uk.xtb +++ b/chromeos/strings/chromeos_strings_uk.xtb
@@ -9,8 +9,6 @@ <translation id="2805756323405976993">Додатки</translation> <translation id="2872961005593481000">Завершити роботу</translation> <translation id="3147142846278915599">Панель запуску (синхронізація додатків…)</translation> -<translation id="3442261357327209537">Натисніть тут, щоб вибрати новий пароль</translation> -<translation id="3506732833599356229">Термін дії пароля закінчився</translation> <translation id="4731797938093519117">Батьківський доступ</translation> <translation id="476166673298332917">Адміністратор пристрою може бачити, що ви робите в Інтернеті.</translation> <translation id="5212543919916444558">На екрані не знайдено елементів, проблеми з якими я можу вирішити. @@ -21,8 +19,8 @@ <translation id="5832805196449965646">Додати користувача</translation> <translation id="5895138241574237353">Перезапустити</translation> <translation id="6574601967010742428">Адміністратор пристрою може відстежувати вашу активність.</translation> -<translation id="7467001599725918325">Термін дії пароля невдовзі закінчиться</translation> <translation id="7505377169174526985">{NUM_DAYS,plural, =0{Термін дії поточного пароля закінчився.}=1{Термін дії поточного пароля закінчиться менше ніж за один день.}one{Термін дії поточного пароля закінчиться менше ніж за # день.}few{Термін дії поточного пароля закінчиться менше ніж за # дні.}many{Термін дії поточного пароля закінчиться менше ніж за # днів.}other{Термін дії поточного пароля закінчиться менше ніж за # дня.}}</translation> <translation id="7658239707568436148">Скасувати</translation> +<translation id="808894953321890993">Змінити пароль</translation> <translation id="9111102763498581341">Розблокувати</translation> </translationbundle> \ No newline at end of file
diff --git a/chromeos/strings/chromeos_strings_vi.xtb b/chromeos/strings/chromeos_strings_vi.xtb index 9452073..c94e5b4 100644 --- a/chromeos/strings/chromeos_strings_vi.xtb +++ b/chromeos/strings/chromeos_strings_vi.xtb
@@ -9,8 +9,6 @@ <translation id="2805756323405976993">Ứng dụng</translation> <translation id="2872961005593481000">Tắt</translation> <translation id="3147142846278915599">Trình khởi chạy (đang đồng bộ hóa ứng dụng...)</translation> -<translation id="3442261357327209537">Hãy nhấp vào đây để chọn mật khẩu mới</translation> -<translation id="3506732833599356229">Mật khẩu đã hết hạn</translation> <translation id="4731797938093519117">Quyền truy cập của cha mẹ</translation> <translation id="476166673298332917">Quản trị viên thiết bị có thể theo dõi hoạt động duyệt web của bạn.</translation> <translation id="5212543919916444558">Tôi không tìm thấy nội dung nào trên màn hình để có thể trợ giúp cho bạn. @@ -21,8 +19,8 @@ <translation id="5832805196449965646">Thêm người</translation> <translation id="5895138241574237353">Khởi động lại</translation> <translation id="6574601967010742428">Quản trị viên thiết bị có thể theo dõi hoạt động của bạn.</translation> -<translation id="7467001599725918325">Mật khẩu sắp hết hạn</translation> <translation id="7505377169174526985">{NUM_DAYS,plural, =0{Mật khẩu hiện tại của bạn đã hết hạn!}=1{Còn chưa đến 1 ngày nữa là mật khẩu hiện tại của bạn sẽ hết hạn!}other{Còn chưa đến # ngày nữa là mật khẩu hiện tại của bạn sẽ hết hạn!}}</translation> <translation id="7658239707568436148">Hủy</translation> +<translation id="808894953321890993">Đổi mật khẩu</translation> <translation id="9111102763498581341">Mở khóa</translation> </translationbundle> \ No newline at end of file
diff --git a/chromeos/strings/chromeos_strings_zh-CN.xtb b/chromeos/strings/chromeos_strings_zh-CN.xtb index f3cda72..e0949ca 100644 --- a/chromeos/strings/chromeos_strings_zh-CN.xtb +++ b/chromeos/strings/chromeos_strings_zh-CN.xtb
@@ -9,8 +9,6 @@ <translation id="2805756323405976993">应用</translation> <translation id="2872961005593481000">关机</translation> <translation id="3147142846278915599">启动器(正在同步应用…)</translation> -<translation id="3442261357327209537">点击此处即可选择新密码</translation> -<translation id="3506732833599356229">密码已过期</translation> <translation id="4731797938093519117">家长访问</translation> <translation id="476166673298332917">此设备的管理员可能会监控您的浏览活动。</translation> <translation id="5212543919916444558">无法提供与您的屏幕上可以找到的任何内容相关的帮助。 @@ -21,8 +19,8 @@ <translation id="5832805196449965646">添加用户</translation> <translation id="5895138241574237353">重新启动</translation> <translation id="6574601967010742428">设备管理员或许能监控您的活动。</translation> -<translation id="7467001599725918325">密码即将过期</translation> <translation id="7505377169174526985">{NUM_DAYS,plural, =0{您当前的密码已过期!}=1{您当前的密码将在 1 天内过期!}other{您当前的密码将在 # 天内过期!}}</translation> <translation id="7658239707568436148">取消</translation> +<translation id="808894953321890993">更改密码</translation> <translation id="9111102763498581341">解锁</translation> </translationbundle> \ No newline at end of file
diff --git a/chromeos/strings/chromeos_strings_zh-TW.xtb b/chromeos/strings/chromeos_strings_zh-TW.xtb index 5df4a21..a2fe323 100644 --- a/chromeos/strings/chromeos_strings_zh-TW.xtb +++ b/chromeos/strings/chromeos_strings_zh-TW.xtb
@@ -9,8 +9,6 @@ <translation id="2805756323405976993">應用程式</translation> <translation id="2872961005593481000">關閉</translation> <translation id="3147142846278915599">啟動器 (正在同步處理應用程式...)</translation> -<translation id="3442261357327209537">按這裡即可選擇新密碼</translation> -<translation id="3506732833599356229">密碼已過期</translation> <translation id="4731797938093519117">家長存取</translation> <translation id="476166673298332917">裝置管理員可能會監控你的瀏覽活動。</translation> <translation id="5212543919916444558">系統在你的畫面上找不到任何能提供協助的內容。 @@ -21,8 +19,8 @@ <translation id="5832805196449965646">新增使用者</translation> <translation id="5895138241574237353">重新啟動</translation> <translation id="6574601967010742428">裝置管理員或許可監控你的活動。</translation> -<translation id="7467001599725918325">密碼即將過期</translation> <translation id="7505377169174526985">{NUM_DAYS,plural, =0{目前的密碼已過期!}=1{目前的密碼將於 1 天內過期!}other{目前的密碼將於 # 天內過期!}}</translation> <translation id="7658239707568436148">取消</translation> +<translation id="808894953321890993">變更密碼</translation> <translation id="9111102763498581341">解除鎖定</translation> </translationbundle> \ No newline at end of file
diff --git a/chromeos/test/data/network/policy/policy_ethernet_eap.onc b/chromeos/test/data/network/policy/policy_ethernet_eap.onc index 043e606..4a8a5c9 100644 --- a/chromeos/test/data/network/policy/policy_ethernet_eap.onc +++ b/chromeos/test/data/network/policy/policy_ethernet_eap.onc
@@ -13,7 +13,7 @@ "Outer":"EAP-TLS", } }, - "GUID":"guid", + "GUID":"policy_ethernet_eap", "Name":"name", "Type":"Ethernet" }
diff --git a/chromeos/test/data/network/policy/shill_policy_autoconnect_on_unconfigured_wifi1.json b/chromeos/test/data/network/policy/shill_policy_autoconnect_on_unconfigured_wifi1.json index e032113..8b9834fa 100644 --- a/chromeos/test/data/network/policy/shill_policy_autoconnect_on_unconfigured_wifi1.json +++ b/chromeos/test/data/network/policy/shill_policy_autoconnect_on_unconfigured_wifi1.json
@@ -4,13 +4,11 @@ "GUID": "policy_wifi1", "ManagedCredentials": true, "Mode": "managed", - "Name": "policy_wifi1", "Passphrase": "policy's passphrase", "PassphraseRequired": false, "Profile": "/profile/user1/shill", "SSID": "policy_wifi1", "SecurityClass": "psk", - "State": "idle", "Type": "wifi", "UIData": "{\"onc_source\":\"user_policy\"}", "Visible": true,
diff --git a/chromeos/test/data/network/policy/shill_policy_on_unconfigured_wifi1.json b/chromeos/test/data/network/policy/shill_policy_on_unconfigured_wifi1.json index f824e36..5b5d604b3 100644 --- a/chromeos/test/data/network/policy/shill_policy_on_unconfigured_wifi1.json +++ b/chromeos/test/data/network/policy/shill_policy_on_unconfigured_wifi1.json
@@ -2,13 +2,11 @@ "Device": "/device/wifi1", "GUID": "policy_wifi1", "Mode": "managed", - "Name": "policy_wifi1", "Passphrase": "policy's passphrase", "PassphraseRequired": false, "Profile": "/profile/user1/shill", "SSID": "policy_wifi1", "SecurityClass": "psk", - "State": "idle", "Type": "wifi", "UIData": "{\"onc_source\":\"user_policy\"}", "Visible": true,
diff --git a/chromeos/test/data/network/policy/shill_policy_on_unmanaged_ethernet_eap.json b/chromeos/test/data/network/policy/shill_policy_on_unmanaged_ethernet_eap.json index c181d25..b329ffc 100644 --- a/chromeos/test/data/network/policy/shill_policy_on_unmanaged_ethernet_eap.json +++ b/chromeos/test/data/network/policy/shill_policy_on_unmanaged_ethernet_eap.json
@@ -1,13 +1,9 @@ { "Device": "", "EAP.EAP": "TLS", - "GUID": "guid", - "Name": "guid", + "GUID": "policy_ethernet_eap", "Profile": "/profile/user1/shill", - "SSID": "guid", - "State": "idle", "Type": "etherneteap", "UIData": "{\"onc_source\":\"user_policy\"}", - "Visible": true, - "WiFi.HexSSID": "67756964" + "Visible": true }
diff --git a/chromeos/test/data/network/policy/shill_policy_on_unmanaged_wifi1.json b/chromeos/test/data/network/policy/shill_policy_on_unmanaged_wifi1.json index 14b198d..18547d2 100644 --- a/chromeos/test/data/network/policy/shill_policy_on_unmanaged_wifi1.json +++ b/chromeos/test/data/network/policy/shill_policy_on_unmanaged_wifi1.json
@@ -2,13 +2,11 @@ "Device": "/device/wifi1", "GUID": "policy_wifi1", "Mode": "managed", - "Name": "policy_wifi1", "Passphrase": "user's passphrase", "PassphraseRequired": false, "Profile": "/profile/user1/shill", "SSID": "policy_wifi1", "SecurityClass": "psk", - "State": "idle", "Type": "wifi", "UIData": "{\"onc_source\":\"user_policy\",\"user_settings\":{\"WiFi\":{\"Passphrase\":\"FAKE_CREDENTIAL_VPaJDV9x\"}}}", "Visible":true,
diff --git a/components/BUILD.gn b/components/BUILD.gn index 525606f..72308cc 100644 --- a/components/BUILD.gn +++ b/components/BUILD.gn
@@ -55,14 +55,6 @@ ] } - if (is_android) { - # The tracing unittests require this for testing unwinding. See - # stack_unwinder_android_unittest.cc. - if (can_unwind_with_cfi_table && is_official_build) { - add_unwind_tables_in_apk = true - } - } - # Add only ":unit_tests" dependencies here. If your tests have dependencies # (this would at least include the component itself), they should be on the # test source set and not here. @@ -181,6 +173,7 @@ if (toolkit_views) { deps += [ + "//components/media_message_center:unit_tests", "//components/ui_devtools:unit_tests", "//components/ui_devtools/views:unit_tests", ] @@ -304,7 +297,6 @@ "//components/signin/core/browser", "//components/signin/core/browser/android:java", "//components/spellcheck/browser/android:java", - "//components/tracing:tracing_test_helper_java", "//components/variations/android:variations_java", "//content/public/android:content_java", "//content/public/browser",
diff --git a/components/OWNERS b/components/OWNERS index c3e984d..51fa197a 100644 --- a/components/OWNERS +++ b/components/OWNERS
@@ -12,6 +12,7 @@ per-file dom_distiller_strings.grdp=file://components/dom_distiller/OWNERS per-file error_page_strings.grdp=file://components/error_page/OWNERS per-file management_strings.grdp=file://docs/privacy/OWNERS +per-file media_message_center_strings.grdp=file://components/media_message_center/OWNERS per-file ntp_snippets_strings.grdp=file://components/ntp_snippets/OWNERS per-file ntp_tiles_strings.grdp=file://components/ntp_tiles/OWNERS per-file omnibox_strings.grdp=file://components/omnibox/OWNERS
diff --git a/components/arc/usb/usb_host_bridge.cc b/components/arc/usb/usb_host_bridge.cc index 822f4d6a..2db745a 100644 --- a/components/arc/usb/usb_host_bridge.cc +++ b/components/arc/usb/usb_host_bridge.cc
@@ -332,7 +332,7 @@ DCHECK(device_info); // Update the device list. - DCHECK(!base::ContainsKey(devices_, device_info->guid)); + DCHECK(!base::Contains(devices_, device_info->guid)); std::string guid = device_info->guid; devices_.insert(std::make_pair(guid, std::move(device_info)));
diff --git a/components/assist_ranker/base_predictor.cc b/components/assist_ranker/base_predictor.cc index 07e585a..8fd8fbf5 100644 --- a/components/assist_ranker/base_predictor.cc +++ b/components/assist_ranker/base_predictor.cc
@@ -58,7 +58,7 @@ ukm::UkmEntryBuilder* ukm_builder) { DCHECK(ukm_builder); - if (!base::ContainsKey(*config_.feature_whitelist, feature_name)) { + if (!base::Contains(*config_.feature_whitelist, feature_name)) { DVLOG(1) << "Feature not whitelisted: " << feature_name; return; }
diff --git a/components/autofill/content/renderer/form_autofill_util.cc b/components/autofill/content/renderer/form_autofill_util.cc index 850a83b..01ea744 100644 --- a/components/autofill/content/renderer/form_autofill_util.cc +++ b/components/autofill/content/renderer/form_autofill_util.cc
@@ -139,7 +139,7 @@ return false; const WebFormControlElement form_control_element = element.ToConst<WebFormControlElement>(); - return base::ContainsValue(control_elements, form_control_element); + return base::Contains(control_elements, form_control_element); } bool IsElementInsideFormOrFieldSet(const WebElement& element, @@ -248,7 +248,7 @@ return base::string16(); } - if (element.HasHTMLTagName("div") && base::ContainsKey(divs_to_skip, node)) + if (element.HasHTMLTagName("div") && base::Contains(divs_to_skip, node)) return base::string16(); } @@ -292,11 +292,9 @@ bool IsLabelValid(base::StringPiece16 inferred_label, const std::vector<base::char16>& stop_words) { // If |inferred_label| has any character other than those in |stop_words|. - auto* first_non_stop_word = - std::find_if(inferred_label.begin(), inferred_label.end(), - [&stop_words](base::char16 c) { - return !base::ContainsValue(stop_words, c); - }); + auto* first_non_stop_word = std::find_if( + inferred_label.begin(), inferred_label.end(), + [&stop_words](base::char16 c) { return !base::Contains(stop_words, c); }); return first_non_stop_word != inferred_label.end(); } @@ -825,7 +823,7 @@ FormFieldData::LabelSource ancestor_label_source = FormFieldData::LabelSource::kUnknown; for (const std::string& tag_name : tag_names) { - if (base::ContainsKey(seen_tag_names, tag_name)) + if (base::Contains(seen_tag_names, tag_name)) continue; seen_tag_names.insert(tag_name);
diff --git a/components/autofill/content/renderer/form_cache.cc b/components/autofill/content/renderer/form_cache.cc index 982cf44b..0e67646 100644 --- a/components/autofill/content/renderer/form_cache.cc +++ b/components/autofill/content/renderer/form_cache.cc
@@ -244,7 +244,7 @@ if (num_fields_seen > form_util::kMaxParseableFields) return forms; - if (!base::ContainsKey(parsed_forms_, form) && + if (!base::Contains(parsed_forms_, form) && IsFormInteresting(form, num_editable_elements)) { for (auto it = parsed_forms_.begin(); it != parsed_forms_.end(); ++it) { if (it->SameFormAs(form)) { @@ -556,7 +556,7 @@ actual_autocomplete, " ", base::WhitespaceHandling::TRIM_WHITESPACE, base::SplitResult::SPLIT_WANT_NONEMPTY)) { // If we recognize the value but it's not correct, show a warning. - if (base::ContainsValue(kSupportedAutocompleteTypes, actual) && + if (base::Contains(kSupportedAutocompleteTypes, actual) && actual != predicted_autocomplete) { return true; }
diff --git a/components/autofill/content/renderer/html_based_username_detector.cc b/components/autofill/content/renderer/html_based_username_detector.cc index ad296d5a..d43ea91 100644 --- a/components/autofill/content/renderer/html_based_username_detector.cc +++ b/components/autofill/content/renderer/html_based_username_detector.cc
@@ -238,7 +238,7 @@ } if (fields_found > 0 && fields_found <= 2) - if (!base::ContainsValue(*username_predictions, chosen_field)) + if (!base::Contains(*username_predictions, chosen_field)) username_predictions->push_back(chosen_field); }
diff --git a/components/autofill/content/renderer/page_passwords_analyser.cc b/components/autofill/content/renderer/page_passwords_analyser.cc index ef70bae..e6d0be9 100644 --- a/components/autofill/content/renderer/page_passwords_analyser.cc +++ b/components/autofill/content/renderer/page_passwords_analyser.cc
@@ -197,8 +197,8 @@ // to be username or password fields. if (input.TagName() == "INPUT" && (!input.HasAttribute("type") || - base::ContainsValue(kTypeAttributes, - input.GetAttribute("type").Utf8()))) { + base::Contains(kTypeAttributes, + input.GetAttribute("type").Utf8()))) { form_input_collections.back().AddInput(input); inputs_with_forms.insert(input); }
diff --git a/components/autofill/content/renderer/password_autofill_agent.cc b/components/autofill/content/renderer/password_autofill_agent.cc index 8acc035..9946f94 100644 --- a/components/autofill/content/renderer/password_autofill_agent.cc +++ b/components/autofill/content/renderer/password_autofill_agent.cc
@@ -962,8 +962,8 @@ bool PasswordAutofillAgent::HasFillData( const WebFormControlElement& control_element) const { const WebInputElement* element = ToWebInputElement(&control_element); - return element && (base::ContainsKey(web_input_to_password_info_, *element) || - base::ContainsKey(password_to_username_, *element)); + return element && (base::Contains(web_input_to_password_info_, *element) || + base::Contains(password_to_username_, *element)); } bool PasswordAutofillAgent::ShowSuggestions(const WebInputElement& element, @@ -1554,7 +1554,7 @@ if (input_element->IsPasswordFieldForAutofill()) focused_field_type = FocusedFieldType::kFillablePasswordField; - else if (base::ContainsKey(web_input_to_password_info_, *input_element)) + else if (base::Contains(web_input_to_password_info_, *input_element)) focused_field_type = FocusedFieldType::kFillableUsernameField; else focused_field_type = FocusedFieldType::kFillableTextField;
diff --git a/components/autofill/content/renderer/password_generation_agent.cc b/components/autofill/content/renderer/password_generation_agent.cc index 8bdfffd1..6d034d8 100644 --- a/components/autofill/content/renderer/password_generation_agent.cc +++ b/components/autofill/content/renderer/password_generation_agent.cc
@@ -108,7 +108,7 @@ } bool ContainsURL(const std::vector<GURL>& urls, const GURL& url) { - return base::ContainsValue(urls, url); + return base::Contains(urls, url); } // Calculates the signature of |form| and searches it in |forms|. @@ -642,7 +642,7 @@ uint32_t last_focused_password_element_id = last_focused_password_element_.UniqueRendererFormControlId(); - bool is_automatic_generation_available = base::ContainsKey( + bool is_automatic_generation_available = base::Contains( generation_enabled_fields_, last_focused_password_element_id); if (!is_automatic_generation_available) {
diff --git a/components/autofill/core/browser/BUILD.gn b/components/autofill/core/browser/BUILD.gn index bf287114..855bf1b0 100644 --- a/components/autofill/core/browser/BUILD.gn +++ b/components/autofill/core/browser/BUILD.gn
@@ -627,6 +627,7 @@ "//third_party/libaddressinput:test_support", "//third_party/libaddressinput:util", "//third_party/libphonenumber", + "//third_party/re2:re2", "//ui/base", "//url", ]
diff --git a/components/autofill/core/browser/autofill_download_manager.cc b/components/autofill/core/browser/autofill_download_manager.cc index c77bd1e..bb9fc30 100644 --- a/components/autofill/core/browser/autofill_download_manager.cc +++ b/components/autofill/core/browser/autofill_download_manager.cc
@@ -20,7 +20,6 @@ #include "base/rand_util.h" #include "base/strings/strcat.h" #include "base/strings/string_number_conversions.h" -#include "base/strings/string_piece.h" #include "base/strings/string_util.h" #include "base/strings/stringprintf.h" #include "base/threading/thread_task_runner_handle.h" @@ -59,7 +58,7 @@ {3314445, 3314448}, {3314854, 3314883}, }; -const size_t kMaxQueryGetSize = 1400; // 1.25KB +const size_t kMaxQueryGetSize = 1400; // 1.25 KiB const size_t kAutofillDownloadManagerMaxFormCacheSize = 16; const size_t kMaxFieldsPerQueryRequest = 100; @@ -447,16 +446,22 @@ return upload_request.SerializeToString(payload); } -// Gets an API method URL given its type (query or upload) and an optional -// resource ID. +// Gets an API method URL given its type (query or upload), an optional +// resource ID, and the HTTP method to be used. // Example usage: -// * GetAPIMethodUrl(REQUEST_QUERY, "1234") will return "/v1/pages/1234". -// * GetAPIMethodUrl(REQUEST_UPLOAD, "") will return "/v1/forms:vote". +// * GetAPIMethodUrl(REQUEST_QUERY, "1234", "GET") will return "/v1/pages/1234". +// * GetAPIMethodUrl(REQUEST_QUERY, "1234", "POST") will return "/v1/pages:get". +// * GetAPIMethodUrl(REQUEST_UPLOAD, "", "POST") will return "/v1/forms:vote". std::string GetAPIMethodUrl(AutofillDownloadManager::RequestType type, - base::StringPiece resource_id) { + base::StringPiece resource_id, + base::StringPiece method) { const char* api_method_url; if (type == AutofillDownloadManager::REQUEST_QUERY) { - api_method_url = "/v1/pages"; + if (method == "POST") { + api_method_url = "/v1/pages:get"; + } else { + api_method_url = "/v1/pages"; + } } else if (type == AutofillDownloadManager::REQUEST_UPLOAD) { api_method_url = "/v1/forms:vote"; } else { @@ -470,6 +475,37 @@ return base::StrCat({api_method_url, "/", resource_id}); } +// Gets HTTP body payload for API POST request. +bool GetAPIBodyPayload(const std::string& payload, + AutofillDownloadManager::RequestType type, + std::string* output_payload) { + // Don't do anything for payloads not related to Query. + if (type != AutofillDownloadManager::REQUEST_QUERY) { + *output_payload = payload; + return true; + } + // Wrap query payload in a request proto to interface with API Query method. + AutofillPageResourceQueryRequest request; + request.set_serialized_request(payload); + if (!request.SerializeToString(output_payload)) { + return false; + } + return true; +} + +// Gets the data payload for API Query (POST and GET). +bool GetAPIQueryPayload(const AutofillQueryContents& query, + std::string* payload) { + std::string serialized_query; + if (!CreateApiRequestFromLegacyRequest(query).SerializeToString( + &serialized_query)) { + return false; + } + base::Base64UrlEncode(serialized_query, + base::Base64UrlEncodePolicy::INCLUDE_PADDING, payload); + return true; +} + } // namespace struct AutofillDownloadManager::FormRequestData { @@ -541,10 +577,8 @@ // Get the query request payload. std::string payload; - bool is_payload_serialized = - UseApi() - ? CreateApiRequestFromLegacyRequest(query).SerializeToString(&payload) - : query.SerializeToString(&payload); + bool is_payload_serialized = UseApi() ? GetAPIQueryPayload(query, &payload) + : query.SerializeToString(&payload); if (!is_payload_serialized) { return false; } @@ -640,6 +674,11 @@ } } +size_t AutofillDownloadManager::GetPayloadLength( + base::StringPiece payload) const { + return payload.length(); +} + std::tuple<GURL, std::string> AutofillDownloadManager::GetRequestURLAndMethod( const FormRequestData& request_data) const { std::string method("POST"); @@ -673,31 +712,27 @@ // ID of the resource to add to the API request URL. Nothing will be added if // |resource_id| is empty. std::string resource_id; + std::string method = "POST"; - // Get the resource id of corresponding webpage when doing a query request. if (request_data.request_type == AutofillDownloadManager::REQUEST_QUERY) { - if (request_data.payload.length() <= kMaxQueryGetSize) { - base::Base64UrlEncode(request_data.payload, - base::Base64UrlEncodePolicy::INCLUDE_PADDING, - &resource_id); + if (GetPayloadLength(request_data.payload) <= kMaxAPIQueryGetSize) { + resource_id = request_data.payload; + method = "GET"; + UMA_HISTOGRAM_BOOLEAN("Autofill.Query.ApiUrlIsTooLong", false); + } else { + UMA_HISTOGRAM_BOOLEAN("Autofill.Query.ApiUrlIsTooLong", true); } - // Query method is always GET (represented by 0) with API. - UMA_HISTOGRAM_BOOLEAN("Autofill.Query.Method", 0); + UMA_HISTOGRAM_BOOLEAN("Autofill.Query.Method", (method == "GET") ? 0 : 1); } // Make the canonical URL to query the API, e.g., // https://autofill.googleapis.com/v1/forms/1234?alt=proto. GURL url = autofill_server_url_.Resolve( - GetAPIMethodUrl(request_data.request_type, resource_id)); + GetAPIMethodUrl(request_data.request_type, resource_id, method)); // Add the query parameter to set the response format to a serialized proto. url = net::AppendQueryParameter(url, "alt", "proto"); - // Determine the HTTP method that should be used. - std::string method = - (request_data.request_type == AutofillDownloadManager::REQUEST_QUERY) - ? "GET" - : "POST"; return std::make_tuple(std::move(url), std::move(method)); } @@ -713,6 +748,14 @@ UseApi() ? GetRequestURLAndMethodForApi(request_data) : GetRequestURLAndMethod(request_data); + // Track the URL length for GET queries because the URL length can be in the + // thousands when rich metadata is enabled. + if (request_data.request_type == AutofillDownloadManager::REQUEST_QUERY && + method == "GET") { + UMA_HISTOGRAM_COUNTS_100000("Autofill.Query.GetUrlLength", + request_url.spec().length()); + } + auto resource_request = std::make_unique<network::ResourceRequest>(); resource_request->url = request_url; resource_request->load_flags = @@ -751,8 +794,17 @@ if (method == "POST") { const std::string content_type = UseApi() ? "application/x-protobuf" : "text/proto"; + std::string payload; + if (UseApi()) { + if (!GetAPIBodyPayload(request_data.payload, request_data.request_type, + &payload)) { + return false; + } + } else { + payload = request_data.payload; + } // Attach payload data and add data format header. - simple_loader->AttachStringForUpload(request_data.payload, content_type); + simple_loader->AttachStringForUpload(payload, content_type); } // Transfer ownership of the loader into url_loaders_. Temporarily hang
diff --git a/components/autofill/core/browser/autofill_download_manager.h b/components/autofill/core/browser/autofill_download_manager.h index f38c3ae8..4fb0ea0 100644 --- a/components/autofill/core/browser/autofill_download_manager.h +++ b/components/autofill/core/browser/autofill_download_manager.h
@@ -17,6 +17,7 @@ #include "base/compiler_specific.h" #include "base/gtest_prod_util.h" #include "base/memory/weak_ptr.h" +#include "base/strings/string_piece.h" #include "base/time/time.h" #include "components/autofill/core/browser/autofill_type.h" #include "components/variations/variations_http_header_provider.h" @@ -31,6 +32,8 @@ class AutofillDriver; class FormStructure; +const size_t kMaxAPIQueryGetSize = 10240; // 10 KiB + // A helper to make sure that tests which modify the set of active autofill // experiments do not interfere with one another. struct ScopedActiveAutofillExperiments { @@ -114,6 +117,12 @@ // pair. static void ClearUploadHistory(PrefService* pref_service); + protected: + // Gets the length of the payload from request data. Used to simulate + // different payload sizes when testing without the need for data. Do not use + // this when the length is needed to read/write a buffer. + virtual size_t GetPayloadLength(base::StringPiece payload) const; + private: friend class AutofillDownloadManagerTest; friend struct ScopedActiveAutofillExperiments;
diff --git a/components/autofill/core/browser/autofill_download_manager_unittest.cc b/components/autofill/core/browser/autofill_download_manager_unittest.cc index b6c34b6..fbda3ec 100644 --- a/components/autofill/core/browser/autofill_download_manager_unittest.cc +++ b/components/autofill/core/browser/autofill_download_manager_unittest.cc
@@ -52,6 +52,7 @@ #include "services/network/test/test_utils.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" +#include "third_party/re2/src/re2/re2.h" #include "url/third_party/mozilla/url_parse.h" using base::UTF8ToUTF16; @@ -105,6 +106,10 @@ bool GetUploadRequestProtoFromRequest( network::TestURLLoaderFactory::PendingRequest* loader_request, AutofillUploadRequest* upload_request) { + if (loader_request == nullptr) { + return false; + } + if (loader_request->request.request_body == nullptr) { return false; } @@ -117,6 +122,58 @@ return true; } +bool GetAutofillPageResourceQueryRequestFromRequest( + network::TestURLLoaderFactory::PendingRequest* loader_request, + AutofillPageResourceQueryRequest* query_request) { + if (loader_request == nullptr) { + return false; + } + + if (loader_request->request.request_body == nullptr) { + return false; + } + + std::string request_body_content = GetStringFromDataElements( + loader_request->request.request_body->elements()); + if (!query_request->ParseFromString(request_body_content)) { + return false; + } + return true; +} + +bool DeserializeAutofillPageQueryRequest(base::StringPiece serialized_content, + AutofillPageQueryRequest* request) { + std::string decoded_content; + if (!base::Base64UrlDecode(serialized_content, + base::Base64UrlDecodePolicy::REQUIRE_PADDING, + &decoded_content)) { + return false; + } + if (!request->ParseFromString(decoded_content)) { + return false; + } + return true; +} + +class AutofillDownloadManagerWithCustomPayloadSize + : public AutofillDownloadManager { + public: + ~AutofillDownloadManagerWithCustomPayloadSize() override {} + AutofillDownloadManagerWithCustomPayloadSize(AutofillDriver* driver, + Observer* observer, + const std::string& api_key, + size_t length) + : AutofillDownloadManager(driver, observer, api_key), length_(length) {} + + protected: + size_t GetPayloadLength(base::StringPiece payload) const override { + return length_; + } + + private: + size_t length_; +}; + } // namespace // This tests AutofillDownloadManager. AutofillDownloadManagerTest implements @@ -495,26 +552,161 @@ histogram.ExpectUniqueSample("Autofill.ServerQueryResponse", AutofillMetrics::QUERY_SENT, 1); histogram.ExpectUniqueSample("Autofill.Query.Method", METHOD_GET, 1); + { + auto buckets = histogram.GetAllSamples("Autofill.Query.GetUrlLength"); + ASSERT_EQ(1U, buckets.size()); + EXPECT_GT(buckets[0].count, 0); + } + histogram.ExpectUniqueSample("Autofill.Query.ApiUrlIsTooLong", false, 1); // Inspect the request that the test URL loader sent. network::TestURLLoaderFactory::PendingRequest* request = test_url_loader_factory_.GetPendingRequest(0); - // This is the URL we expect to query the API. The sub-path right after - // "/page" corresponds to the serialized AutofillPageQueryRequest proto (that - // we filled forms in) encoded in base64. The Autofill - // https://clients1.google.com/ domain URL corresponds to the default domain - // used by the download manager. - const std::string expected_url = { - "https://clients1.google.com/v1/pages/" - "Chc2LjEuMTcxNS4xNDQyL2VuIChHR0xMKRIlCU9O84MyjH9NEgsNeu" - "FP4BIAGgAiABILDZxOStASABoAIgAaAA==?" - "alt=proto"}; - EXPECT_EQ(request->request.url, expected_url); - std::string api_key_header_value; - EXPECT_TRUE(request->request.headers.GetHeader("X-Goog-Api-Key", - &api_key_header_value)); - EXPECT_EQ(api_key_header_value, "dummykey"); + // Verify request URL and the data payload it carries. + { + // This is the URL we expect to query the API. The sub-path right after + // "/page" corresponds to the serialized AutofillPageQueryRequest proto + // (that we filled forms in) encoded in base64. The Autofill + // https://clients1.google.com/ domain URL corresponds to the default domain + // used by the download manager, which is invalid, but good for testing. + const std::string expected_url = + R"(https://clients1.google.com/v1/pages/(.+)\?alt=proto)"; + std::string encoded_request; + ASSERT_TRUE(re2::RE2::FullMatch(request->request.url.spec(), expected_url, + &encoded_request)); + AutofillPageQueryRequest request_content; + ASSERT_TRUE( + DeserializeAutofillPageQueryRequest(encoded_request, &request_content)); + // Verify form content. + ASSERT_EQ(request_content.forms().size(), 1); + EXPECT_EQ(request_content.forms(0).signature(), + form_structures[0]->form_signature()); + // Verify field content. + ASSERT_EQ(request_content.forms(0).fields().size(), 2); + EXPECT_EQ(request_content.forms(0).fields(0).signature(), + form_structures[0]->field(0)->GetFieldSignature()); + EXPECT_EQ(request_content.forms(0).fields(1).signature(), + form_structures[0]->field(1)->GetFieldSignature()); + } + + // Verify API key header. + { + std::string header_value; + EXPECT_TRUE( + request->request.headers.GetHeader("X-Goog-Api-Key", &header_value)); + EXPECT_EQ(header_value, "dummykey"); + } + // Verify binary response header. + { + std::string header_value; + ASSERT_TRUE(request->request.headers.GetHeader( + "X-Goog-Encode-Response-If-Executable", &header_value)); + EXPECT_EQ(header_value, "base64"); + } + + // Verify response. + test_url_loader_factory_.SimulateResponseWithoutRemovingFromPendingList( + request, "dummy response"); + // Upon reception of a suggestions query, we expect OnLoadedServerPredictions + // to be called back from the observer and some histograms be incremented. + EXPECT_EQ(1U, responses_.size()); + EXPECT_EQ(responses_.front().type_of_response, + AutofillDownloadManagerTest::QUERY_SUCCESSFULL); + histogram.ExpectBucketCount("Autofill.Query.WasInCache", CACHE_MISS, 1); + histogram.ExpectBucketCount("Autofill.Query.HttpResponseOrErrorCode", + net::HTTP_OK, 1); +} + +TEST_F(AutofillDownloadManagerTest, QueryAPITestWhenTooLongUrl) { + base::test::ScopedFeatureList feature_list; + feature_list.InitWithFeatures( + // Enabled + // We want to query the API rather than the legacy server. + {features::kAutofillUseApi}, + // Disabled + {}); + + // Build the form structures that we want to query. + FormData form; + FormFieldData field; + field.label = UTF8ToUTF16("First Name"); + field.name = UTF8ToUTF16("firstname"); + field.form_control_type = "text"; + form.fields.push_back(field); + + std::vector<std::unique_ptr<FormStructure>> form_structures; + { + auto form_structure = std::make_unique<FormStructure>(form); + form_structure->set_is_rich_query_enabled(true); + form_structures.push_back(std::move(form_structure)); + } + + AutofillDownloadManagerWithCustomPayloadSize download_manager( + &driver_, this, "dummykey", kMaxAPIQueryGetSize + 1); + + // Start the query request and look if it is successful. No response was + // received yet. + base::HistogramTester histogram; + EXPECT_TRUE( + download_manager.StartQueryRequest(ToRawPointerVector(form_structures))); + + // Verify request. + // Verify if histograms are right. + histogram.ExpectUniqueSample("Autofill.ServerQueryResponse", + AutofillMetrics::QUERY_SENT, 1); + // Verify that the logged method is POST. + histogram.ExpectUniqueSample("Autofill.Query.Method", METHOD_POST, 1); + // Verify that too long URL is tracked. + histogram.ExpectUniqueSample("Autofill.Query.ApiUrlIsTooLong", true, 1); + + // Get the latest request that the test URL loader sent. + network::TestURLLoaderFactory::PendingRequest* request = + test_url_loader_factory_.GetPendingRequest(0); + // Verify that the POST URL is used when request data too large. + const std::string expected_url = { + "https://clients1.google.com/v1/pages:get?alt=proto"}; + // Verify API key header. + EXPECT_EQ(request->request.url, expected_url); + { + std::string header_value; + EXPECT_TRUE( + request->request.headers.GetHeader("X-Goog-Api-Key", &header_value)); + EXPECT_EQ(header_value, "dummykey"); + } + // Verify Content-Type header. + { + std::string header_value; + ASSERT_TRUE( + request->request.headers.GetHeader("Content-Type", &header_value)); + EXPECT_EQ(header_value, "application/x-protobuf"); + } + // Verify binary response header. + { + std::string header_value; + ASSERT_TRUE(request->request.headers.GetHeader( + "X-Goog-Encode-Response-If-Executable", &header_value)); + EXPECT_EQ(header_value, "base64"); + } + // Verify content of the POST body data. + { + AutofillPageResourceQueryRequest query_request; + ASSERT_TRUE(GetAutofillPageResourceQueryRequestFromRequest(request, + &query_request)); + AutofillPageQueryRequest request_content; + ASSERT_TRUE(DeserializeAutofillPageQueryRequest( + query_request.serialized_request(), &request_content)); + // Verify form content. + ASSERT_EQ(request_content.forms().size(), 1); + EXPECT_EQ(request_content.forms(0).signature(), + form_structures[0]->form_signature()); + // Verify field content. + ASSERT_EQ(request_content.forms(0).fields().size(), 1); + EXPECT_EQ(request_content.forms(0).fields(0).signature(), + form_structures[0]->field(0)->GetFieldSignature()); + } + + // Verify response. test_url_loader_factory_.SimulateResponseWithoutRemovingFromPendingList( request, "dummy response"); // Upon reception of a suggestions query, we expect OnLoadedServerPredictions
diff --git a/components/autofill/core/browser/autofill_external_delegate.cc b/components/autofill/core/browser/autofill_external_delegate.cc index 2ac43a0..f8d948d 100644 --- a/components/autofill/core/browser/autofill_external_delegate.cc +++ b/components/autofill/core/browser/autofill_external_delegate.cc
@@ -405,7 +405,7 @@ data_list_values_.end()); base::EraseIf(*suggestions, [&data_list_set](const Suggestion& suggestion) { return suggestion.frontend_id == POPUP_ITEM_ID_AUTOCOMPLETE_ENTRY && - base::ContainsKey(data_list_set, suggestion.value); + base::Contains(data_list_set, suggestion.value); }); #if !defined(OS_ANDROID)
diff --git a/components/autofill/core/browser/autofill_manager.cc b/components/autofill/core/browser/autofill_manager.cc index b54f08f0..bb1c6a1d 100644 --- a/components/autofill/core/browser/autofill_manager.cc +++ b/components/autofill/core/browser/autofill_manager.cc
@@ -1418,8 +1418,8 @@ // On a refill, only fill fields from type groups that were present during // the initial fill. if (is_refill && - !base::ContainsKey(filling_context->type_groups_originally_filled, - field_group_type)) { + !base::Contains(filling_context->type_groups_originally_filled, + field_group_type)) { continue; }
diff --git a/components/autofill/core/browser/autofill_metrics.cc b/components/autofill/core/browser/autofill_metrics.cc index 7981392a..0c6e4b5 100644 --- a/components/autofill/core/browser/autofill_metrics.cc +++ b/components/autofill/core/browser/autofill_metrics.cc
@@ -1154,12 +1154,12 @@ DCHECK_LT(metric, NUM_USER_HAPPINESS_METRICS); UMA_HISTOGRAM_ENUMERATION("Autofill.UserHappiness", metric, NUM_USER_HAPPINESS_METRICS); - if (base::ContainsKey(form_types, CREDIT_CARD_FORM)) { + if (base::Contains(form_types, CREDIT_CARD_FORM)) { UMA_HISTOGRAM_ENUMERATION("Autofill.UserHappiness.CreditCard", metric, NUM_USER_HAPPINESS_METRICS); LogUserHappinessBySecurityLevel(metric, CREDIT_CARD_FORM, security_level); } - if (base::ContainsKey(form_types, ADDRESS_FORM)) { + if (base::Contains(form_types, ADDRESS_FORM)) { UMA_HISTOGRAM_ENUMERATION("Autofill.UserHappiness.Address", metric, NUM_USER_HAPPINESS_METRICS); if (metric != AutofillMetrics::FORMS_LOADED) { @@ -1167,12 +1167,12 @@ } LogUserHappinessBySecurityLevel(metric, ADDRESS_FORM, security_level); } - if (base::ContainsKey(form_types, PASSWORD_FORM)) { + if (base::Contains(form_types, PASSWORD_FORM)) { UMA_HISTOGRAM_ENUMERATION("Autofill.UserHappiness.Password", metric, NUM_USER_HAPPINESS_METRICS); LogUserHappinessBySecurityLevel(metric, PASSWORD_FORM, security_level); } - if (base::ContainsKey(form_types, UNKNOWN_FORM_TYPE)) { + if (base::Contains(form_types, UNKNOWN_FORM_TYPE)) { UMA_HISTOGRAM_ENUMERATION("Autofill.UserHappiness.Unknown", metric, NUM_USER_HAPPINESS_METRICS); LogUserHappinessBySecurityLevel(metric, UNKNOWN_FORM_TYPE, security_level); @@ -1259,16 +1259,16 @@ parent_metric = "Autofill.FillDuration.FromInteraction.WithoutAutofill"; } LogFormFillDuration(parent_metric, duration); - if (base::ContainsKey(form_types, CREDIT_CARD_FORM)) { + if (base::Contains(form_types, CREDIT_CARD_FORM)) { LogFormFillDuration(parent_metric + ".CreditCard", duration); } - if (base::ContainsKey(form_types, ADDRESS_FORM)) { + if (base::Contains(form_types, ADDRESS_FORM)) { LogFormFillDuration(parent_metric + ".Address", duration); } - if (base::ContainsKey(form_types, PASSWORD_FORM)) { + if (base::Contains(form_types, PASSWORD_FORM)) { LogFormFillDuration(parent_metric + ".Password", duration); } - if (base::ContainsKey(form_types, UNKNOWN_FORM_TYPE)) { + if (base::Contains(form_types, UNKNOWN_FORM_TYPE)) { LogFormFillDuration(parent_metric + ".Unknown", duration); } }
diff --git a/components/autofill/core/browser/autofill_profile_sync_util.cc b/components/autofill/core/browser/autofill_profile_sync_util.cc index 62e14cc..9197b654 100644 --- a/components/autofill/core/browser/autofill_profile_sync_util.cc +++ b/components/autofill/core/browser/autofill_profile_sync_util.cc
@@ -41,7 +41,7 @@ DCHECK(base::IsValidGUID(entry.guid())); auto entity_data = std::make_unique<EntityData>(); - entity_data->non_unique_name = entry.guid(); + entity_data->name = entry.guid(); AutofillProfileSpecifics* specifics = entity_data->specifics.mutable_autofill_profile();
diff --git a/components/autofill/core/browser/autofill_profile_sync_util_unittest.cc b/components/autofill/core/browser/autofill_profile_sync_util_unittest.cc index ae6f9ff..0067781 100644 --- a/components/autofill/core/browser/autofill_profile_sync_util_unittest.cc +++ b/components/autofill/core/browser/autofill_profile_sync_util_unittest.cc
@@ -127,7 +127,7 @@ std::unique_ptr<EntityData> entity_data = CreateEntityDataFromAutofillProfile(profile); // The non-unique name should be set to the guid of the profile. - EXPECT_EQ(entity_data->non_unique_name, profile.guid()); + EXPECT_EQ(entity_data->name, profile.guid()); EXPECT_EQ(specifics.SerializeAsString(), entity_data->specifics.autofill_profile().SerializeAsString());
diff --git a/components/autofill/core/browser/autofill_profile_validation_util.cc b/components/autofill/core/browser/autofill_profile_validation_util.cc index d195b33..22a5d90 100644 --- a/components/autofill/core/browser/autofill_profile_validation_util.cc +++ b/components/autofill/core/browser/autofill_profile_validation_util.cc
@@ -248,7 +248,7 @@ SetAllAddressValidityStates(profile, AutofillDataModel::UNVALIDATED); - if (!base::ContainsValue( + if (!base::Contains( CountryDataMap::GetInstance()->country_codes(), base::UTF16ToUTF8(profile->GetRawInfo(ADDRESS_HOME_COUNTRY)))) { // If the country code is not in the database, the country code and the @@ -348,8 +348,8 @@ const std::string& country_code = base::UTF16ToUTF8(profile->GetRawInfo(ADDRESS_HOME_COUNTRY)); - if (!base::ContainsValue(CountryDataMap::GetInstance()->country_codes(), - country_code)) { + if (!base::Contains(CountryDataMap::GetInstance()->country_codes(), + country_code)) { // If the country code is not in the database, the phone number cannot be // validated. profile->SetValidityState(PHONE_HOME_WHOLE_NUMBER,
diff --git a/components/autofill/core/browser/data_model/address.cc b/components/autofill/core/browser/data_model/address.cc index ff6431b6..dbe5cdd 100644 --- a/components/autofill/core/browser/data_model/address.cc +++ b/components/autofill/core/browser/data_model/address.cc
@@ -245,7 +245,7 @@ // There's a good chance that this formatting is not intentional, but it's // also not obviously safe to just strip the newlines. if (storable_type == ADDRESS_HOME_STREET_ADDRESS && - base::ContainsValue(street_address_, base::string16())) { + base::Contains(street_address_, base::string16())) { street_address_.clear(); return false; }
diff --git a/components/autofill/core/browser/form_parsing/phone_field_unittest.cc b/components/autofill/core/browser/form_parsing/phone_field_unittest.cc index e6cff16..cdac7c96 100644 --- a/components/autofill/core/browser/form_parsing/phone_field_unittest.cc +++ b/components/autofill/core/browser/form_parsing/phone_field_unittest.cc
@@ -167,7 +167,7 @@ CheckField("areacode1", PHONE_HOME_CITY_CODE); CheckField("prefix2", PHONE_HOME_NUMBER); CheckField("suffix3", PHONE_HOME_NUMBER); - EXPECT_TRUE(base::ContainsKey(field_candidates_map_, ASCIIToUTF16("ext4"))); + EXPECT_TRUE(base::Contains(field_candidates_map_, ASCIIToUTF16("ext4"))); } }
diff --git a/components/autofill/core/browser/geo/autofill_country.cc b/components/autofill/core/browser/geo/autofill_country.cc index 260fd01..4eb8f2b 100644 --- a/components/autofill/core/browser/geo/autofill_country.cc +++ b/components/autofill/core/browser/geo/autofill_country.cc
@@ -54,8 +54,8 @@ std::string country_code = icu::Locale(likely_locale.c_str()).getCountry(); // Default to the United States if we have no better guess. - if (!base::ContainsValue(CountryDataMap::GetInstance()->country_codes(), - country_code)) { + if (!base::Contains(CountryDataMap::GetInstance()->country_codes(), + country_code)) { return "US"; }
diff --git a/components/autofill/core/browser/geo/autofill_country_unittest.cc b/components/autofill/core/browser/geo/autofill_country_unittest.cc index e9726a8d..8f3994d 100644 --- a/components/autofill/core/browser/geo/autofill_country_unittest.cc +++ b/components/autofill/core/browser/geo/autofill_country_unittest.cc
@@ -66,7 +66,7 @@ const std::vector<std::string>& country_codes = CountryDataMap::GetInstance()->country_codes(); for (const std::string& country_code : country_codes) { - if (base::ContainsKey(expected_failures, country_code)) + if (base::Contains(expected_failures, country_code)) continue; SCOPED_TRACE("Country code '" + country_code + "' should have a name."); EXPECT_NE(ASCIIToUTF16(country_code),
diff --git a/components/autofill/core/browser/payments/local_card_migration_manager.cc b/components/autofill/core/browser/payments/local_card_migration_manager.cc index d6d5aca..74c6c72 100644 --- a/components/autofill/core/browser/payments/local_card_migration_manager.cc +++ b/components/autofill/core/browser/payments/local_card_migration_manager.cc
@@ -190,7 +190,7 @@ // will remove any card from |migratable_credit_cards_| of which the GUID is // not in |selected_card_guids|. auto card_is_selected = [&selected_card_guids](MigratableCreditCard& card) { - return !base::ContainsValue(selected_card_guids, card.credit_card().guid()); + return !base::Contains(selected_card_guids, card.credit_card().guid()); }; base::EraseIf(migratable_credit_cards_, card_is_selected); // Populating risk data and offering migration two-round pop-ups occur
diff --git a/components/autofill/core/browser/personal_data_manager.cc b/components/autofill/core/browser/personal_data_manager.cc index 25d6d71..0a18e30 100644 --- a/components/autofill/core/browser/personal_data_manager.cc +++ b/components/autofill/core/browser/personal_data_manager.cc
@@ -1552,7 +1552,7 @@ AutofillCountry::CountryCodeForLocale(app_locale()))); } - return base::ContainsValue(country_codes, base::ToLowerASCII(country_code)); + return base::Contains(country_codes, base::ToLowerASCII(country_code)); } const std::string& PersonalDataManager::GetDefaultCountryCodeForNewAddress() @@ -1867,7 +1867,7 @@ std::string country_code = base::ToUpperASCII( base::UTF16ToASCII(profiles[i]->GetRawInfo(ADDRESS_HOME_COUNTRY))); - if (base::ContainsValue(country_codes, country_code)) { + if (base::Contains(country_codes, country_code)) { // Verified profiles count 100x more than unverified ones. votes[country_code] += profiles[i]->IsVerified() ? 100 : 1; }
diff --git a/components/autofill/core/browser/personal_data_manager_unittest.cc b/components/autofill/core/browser/personal_data_manager_unittest.cc index f65b122..2ce6351 100644 --- a/components/autofill/core/browser/personal_data_manager_unittest.cc +++ b/components/autofill/core/browser/personal_data_manager_unittest.cc
@@ -923,8 +923,7 @@ ASSERT_EQ(profiles.size(), personal_data_->GetProfiles().size()); for (size_t i = 0; i < profiles.size(); ++i) { - EXPECT_TRUE( - base::ContainsValue(profiles, *personal_data_->GetProfiles()[i])); + EXPECT_TRUE(base::Contains(profiles, *personal_data_->GetProfiles()[i])); } } @@ -1179,8 +1178,7 @@ ASSERT_EQ(cards.size(), personal_data_->GetCreditCards().size()); for (size_t i = 0; i < cards.size(); ++i) { - EXPECT_TRUE( - base::ContainsValue(cards, *personal_data_->GetCreditCards()[i])); + EXPECT_TRUE(base::Contains(cards, *personal_data_->GetCreditCards()[i])); } }
diff --git a/components/autofill/core/browser/webdata/autocomplete_sync_bridge.cc b/components/autofill/core/browser/webdata/autocomplete_sync_bridge.cc index b4b5ec238..4e4f151e 100644 --- a/components/autofill/core/browser/webdata/autocomplete_sync_bridge.cc +++ b/components/autofill/core/browser/webdata/autocomplete_sync_bridge.cc
@@ -72,7 +72,7 @@ autofill->add_usage_timestamp(entry.date_created().ToInternalValue()); if (entry.date_created() != entry.date_last_used()) autofill->add_usage_timestamp(entry.date_last_used().ToInternalValue()); - entity_data->non_unique_name = EscapeIdentifiers(*autofill); + entity_data->name = EscapeIdentifiers(*autofill); return entity_data; }
diff --git a/components/autofill/core/browser/webdata/autofill_profile_sync_bridge.cc b/components/autofill/core/browser/webdata/autofill_profile_sync_bridge.cc index f8dc050..2e92677f 100644 --- a/components/autofill/core/browser/webdata/autofill_profile_sync_bridge.cc +++ b/components/autofill/core/browser/webdata/autofill_profile_sync_bridge.cc
@@ -182,7 +182,7 @@ auto batch = std::make_unique<syncer::MutableDataBatch>(); for (const std::unique_ptr<AutofillProfile>& entry : entries) { std::string key = GetStorageKeyFromAutofillProfile(*entry); - if (base::ContainsKey(keys_set, key)) { + if (base::Contains(keys_set, key)) { batch->Put(key, CreateEntityDataFromAutofillProfile(*entry)); } }
diff --git a/components/autofill/core/browser/webdata/autofill_table.cc b/components/autofill/core/browser/webdata/autofill_table.cc index 1ea160b3..df8bf08b 100644 --- a/components/autofill/core/browser/webdata/autofill_table.cc +++ b/components/autofill/core/browser/webdata/autofill_table.cc
@@ -2686,7 +2686,7 @@ for (const FormFieldData& element : elements) { if (seen_names.size() >= kMaximumUniqueNames) break; - if (base::ContainsKey(seen_names, element.name)) + if (base::Contains(seen_names, element.name)) continue; result = result && AddFormFieldValueTime(element, changes, time); seen_names.insert(element.name);
diff --git a/components/autofill/core/browser/webdata/autofill_wallet_metadata_sync_bridge.cc b/components/autofill/core/browser/webdata/autofill_wallet_metadata_sync_bridge.cc index 57a4bba..dd11a91 100644 --- a/components/autofill/core/browser/webdata/autofill_wallet_metadata_sync_bridge.cc +++ b/components/autofill/core/browser/webdata/autofill_wallet_metadata_sync_bridge.cc
@@ -104,7 +104,7 @@ const AutofillMetadata& local_metadata) { auto entity_data = std::make_unique<EntityData>(); std::string specifics_id = GetSpecificsIdForMetadataId(local_metadata.id); - entity_data->non_unique_name = GetClientTagForSpecificsId(type, specifics_id); + entity_data->name = GetClientTagForSpecificsId(type, specifics_id); WalletMetadataSpecifics* remote_metadata = entity_data->specifics.mutable_wallet_metadata(); @@ -587,8 +587,7 @@ const AutofillMetadata& metadata = pair.second; TypeAndMetadataId parsed_storage_key = ParseWalletMetadataStorageKey(storage_key); - if (!storage_keys_set || - base::ContainsKey(*storage_keys_set, storage_key)) { + if (!storage_keys_set || base::Contains(*storage_keys_set, storage_key)) { batch->Put(storage_key, CreateEntityDataFromAutofillMetadata( parsed_storage_key.type, metadata)); }
diff --git a/components/autofill/core/browser/webdata/autofill_wallet_sync_bridge.cc b/components/autofill/core/browser/webdata/autofill_wallet_sync_bridge.cc index 0709338..1115ef2 100644 --- a/components/autofill/core/browser/webdata/autofill_wallet_sync_bridge.cc +++ b/components/autofill/core/browser/webdata/autofill_wallet_sync_bridge.cc
@@ -91,7 +91,7 @@ const AutofillProfile& address, bool enforce_utf8) { auto entity_data = std::make_unique<EntityData>(); - entity_data->non_unique_name = + entity_data->name = "Server profile " + GetBase64EncodedId(GetSpecificsIdFromAutofillProfile(address)); @@ -107,7 +107,7 @@ std::unique_ptr<EntityData> CreateEntityDataFromCard(const CreditCard& card, bool enforce_utf8) { auto entity_data = std::make_unique<EntityData>(); - entity_data->non_unique_name = + entity_data->name = "Server card " + GetBase64EncodedId(GetSpecificsIdFromCreditCard(card)); AutofillWalletSpecifics* wallet_specifics = @@ -122,7 +122,7 @@ std::unique_ptr<EntityData> CreateEntityDataFromPaymentsCustomerData( const PaymentsCustomerData& customer_data) { auto entity_data = std::make_unique<EntityData>(); - entity_data->non_unique_name = + entity_data->name = "Payments customer data " + GetBase64EncodedId(GetSpecificsIdFromPaymentsCustomerData(customer_data));
diff --git a/components/autofill/core/common/autofill_payments_features.cc b/components/autofill/core/common/autofill_payments_features.cc index 4092337..8ff15899 100644 --- a/components/autofill/core/common/autofill_payments_features.cc +++ b/components/autofill/core/common/autofill_payments_features.cc
@@ -42,6 +42,12 @@ const base::Feature kAutofillCreditCardAuthentication{ "AutofillCreditCardAuthentication", base::FEATURE_DISABLED_BY_DEFAULT}; +// When enabled, if credit card upload succeeded, the avatar icon will show a +// highlight otherwise, the credit card icon image will be updated and if user +// clicks on the icon, a save card failure bubble will pop up. +const base::Feature kAutofillCreditCardUploadFeedback{ + "AutofillCreditCardUploadFeedback", base::FEATURE_DISABLED_BY_DEFAULT}; + const base::Feature kAutofillDoNotMigrateUnsupportedLocalCards{ "AutofillDoNotMigrateUnsupportedLocalCards", base::FEATURE_DISABLED_BY_DEFAULT};
diff --git a/components/autofill/core/common/autofill_payments_features.h b/components/autofill/core/common/autofill_payments_features.h index 97324d8..084e1cd7 100644 --- a/components/autofill/core/common/autofill_payments_features.h +++ b/components/autofill/core/common/autofill_payments_features.h
@@ -21,6 +21,7 @@ // All features in alphabetical order. extern const base::Feature kAutofillCreditCardAblationExperiment; extern const base::Feature kAutofillCreditCardAuthentication; +extern const base::Feature kAutofillCreditCardUploadFeedback; extern const base::Feature kAutofillDoNotMigrateUnsupportedLocalCards; extern const base::Feature kAutofillDoNotUploadSaveUnsupportedCards; extern const base::Feature kAutofillDownstreamUseGooglePayBrandingOniOS;
diff --git a/components/bookmarks/browser/bookmark_model_unittest.cc b/components/bookmarks/browser/bookmark_model_unittest.cc index 2aeffc1..005c2b9 100644 --- a/components/bookmarks/browser/bookmark_model_unittest.cc +++ b/components/bookmarks/browser/bookmark_model_unittest.cc
@@ -1356,7 +1356,7 @@ } bool WasNodeUpdated(const BookmarkNode* node) { - return base::ContainsValue(updated_nodes_, node); + return base::Contains(updated_nodes_, node); } void ClearUpdatedNodes() {
diff --git a/components/bookmarks/browser/bookmark_utils.cc b/components/bookmarks/browser/bookmark_utils.cc index b14e122..9879555 100644 --- a/components/bookmarks/browser/bookmark_utils.cc +++ b/components/bookmarks/browser/bookmark_utils.cc
@@ -371,7 +371,7 @@ for (int i = 0; i < root_node->child_count(); ++i) { const BookmarkNode* node = root_node->GetChild(i); if (node->IsVisible() && model->client()->CanBeEditedByUser(node) && - !base::ContainsValue(nodes, node)) { + !base::Contains(nodes, node)) { nodes.push_back(node); if (nodes.size() == max_count)
diff --git a/components/bookmarks/test/test_bookmark_client.cc b/components/bookmarks/test/test_bookmark_client.cc index d9ad27b..51a4db0 100644 --- a/components/bookmarks/test/test_bookmark_client.cc +++ b/components/bookmarks/test/test_bookmark_client.cc
@@ -52,7 +52,7 @@ } bool TestBookmarkClient::IsExtraNodeRoot(const BookmarkNode* node) { - return base::ContainsValue(unowned_extra_nodes_, node); + return base::Contains(unowned_extra_nodes_, node); } bool TestBookmarkClient::IsAnExtraNode(const BookmarkNode* node) {
diff --git a/components/browser_watcher/stability_report_extractor_unittest.cc b/components/browser_watcher/stability_report_extractor_unittest.cc index 1c3b5298..cd037fb3 100644 --- a/components/browser_watcher/stability_report_extractor_unittest.cc +++ b/components/browser_watcher/stability_report_extractor_unittest.cc
@@ -203,7 +203,7 @@ EXPECT_EQ(Activity::ACT_EVENT_WAIT, activity.type()); EXPECT_EQ(kEventAddress, activity.event_address()); ASSERT_EQ(1U, activity.user_data().size()); - ASSERT_TRUE(base::ContainsKey(activity.user_data(), "some_int")); + ASSERT_TRUE(base::Contains(activity.user_data(), "some_int")); EXPECT_EQ(TypedValue::kSignedValue, activity.user_data().at("some_int").value_case()); EXPECT_EQ(42, activity.user_data().at("some_int").signed_value()); @@ -348,37 +348,37 @@ const auto& collected_data = report.process_states(0).data(); ASSERT_EQ(kInternalProcessDatums + 8U, collected_data.size()); - ASSERT_TRUE(base::ContainsKey(collected_data, "raw")); + ASSERT_TRUE(base::Contains(collected_data, "raw")); EXPECT_EQ(TypedValue::kBytesValue, collected_data.at("raw").value_case()); EXPECT_EQ("foo", collected_data.at("raw").bytes_value()); - ASSERT_TRUE(base::ContainsKey(collected_data, "string")); + ASSERT_TRUE(base::Contains(collected_data, "string")); EXPECT_EQ(TypedValue::kStringValue, collected_data.at("string").value_case()); EXPECT_EQ("bar", collected_data.at("string").string_value()); - ASSERT_TRUE(base::ContainsKey(collected_data, "char")); + ASSERT_TRUE(base::Contains(collected_data, "char")); EXPECT_EQ(TypedValue::kCharValue, collected_data.at("char").value_case()); EXPECT_EQ("9", collected_data.at("char").char_value()); - ASSERT_TRUE(base::ContainsKey(collected_data, "int")); + ASSERT_TRUE(base::Contains(collected_data, "int")); EXPECT_EQ(TypedValue::kSignedValue, collected_data.at("int").value_case()); EXPECT_EQ(-9999, collected_data.at("int").signed_value()); - ASSERT_TRUE(base::ContainsKey(collected_data, "uint")); + ASSERT_TRUE(base::Contains(collected_data, "uint")); EXPECT_EQ(TypedValue::kUnsignedValue, collected_data.at("uint").value_case()); EXPECT_EQ(9999U, collected_data.at("uint").unsigned_value()); - ASSERT_TRUE(base::ContainsKey(collected_data, "bool")); + ASSERT_TRUE(base::Contains(collected_data, "bool")); EXPECT_EQ(TypedValue::kBoolValue, collected_data.at("bool").value_case()); EXPECT_TRUE(collected_data.at("bool").bool_value()); - ASSERT_TRUE(base::ContainsKey(collected_data, "ref")); + ASSERT_TRUE(base::Contains(collected_data, "ref")); EXPECT_EQ(TypedValue::kBytesReference, collected_data.at("ref").value_case()); const TypedValue::Reference& ref = collected_data.at("ref").bytes_reference(); EXPECT_EQ(reinterpret_cast<uintptr_t>(string1), ref.address()); EXPECT_EQ(strlen(string1), static_cast<uint64_t>(ref.size())); - ASSERT_TRUE(base::ContainsKey(collected_data, "sref")); + ASSERT_TRUE(base::Contains(collected_data, "sref")); EXPECT_EQ(TypedValue::kStringReference, collected_data.at("sref").value_case()); const TypedValue::Reference& sref = @@ -412,7 +412,7 @@ // Expect 1 key/value pair. const auto& collected_data = report.process_states(0).data(); EXPECT_EQ(kInternalProcessDatums + 1U, collected_data.size()); - EXPECT_TRUE(base::ContainsKey(collected_data, "string")); + EXPECT_TRUE(base::Contains(collected_data, "string")); } TEST_F(StabilityReportExtractorTest, ModuleCollection) {
diff --git a/components/cast_certificate/cast_cert_validator.cc b/components/cast_certificate/cast_cert_validator.cc index ffcd2b1..08c5af7 100644 --- a/components/cast_certificate/cast_cert_validator.cc +++ b/components/cast_certificate/cast_cert_validator.cc
@@ -183,7 +183,7 @@ for (const auto& cert : result_path->certs) { if (cert->has_policy_oids()) { const std::vector<net::der::Input>& policies = cert->policy_oids(); - if (base::ContainsValue(policies, AudioOnlyPolicyOid())) { + if (base::Contains(policies, AudioOnlyPolicyOid())) { audio_only = true; break; }
diff --git a/components/certificate_transparency/chrome_require_ct_delegate.cc b/components/certificate_transparency/chrome_require_ct_delegate.cc index 846e62b..c5050115e 100644 --- a/components/certificate_transparency/chrome_require_ct_delegate.cc +++ b/components/certificate_transparency/chrome_require_ct_delegate.cc
@@ -291,7 +291,7 @@ // the organization information to itself. net::HashValue hash; if (net::x509_util::CalculateSha256SpkiHash(leaf_cert, &hash) && - base::ContainsValue(matches, hash)) { + base::Contains(matches, hash)) { *ct_required = false; return true; } @@ -301,7 +301,7 @@ std::vector<CRYPTO_BUFFER*> candidates; for (const auto& buffer : chain->intermediate_buffers()) { if (net::x509_util::CalculateSha256SpkiHash(buffer.get(), &hash) && - base::ContainsValue(matches, hash)) { + base::Contains(matches, hash)) { candidates.push_back(buffer.get()); } }
diff --git a/components/chromeos_camera/mjpeg_decode_accelerator_unittest.cc b/components/chromeos_camera/mjpeg_decode_accelerator_unittest.cc index 3490cb7..1bd1f73 100644 --- a/components/chromeos_camera/mjpeg_decode_accelerator_unittest.cc +++ b/components/chromeos_camera/mjpeg_decode_accelerator_unittest.cc
@@ -45,11 +45,6 @@ // Default test image file. const base::FilePath::CharType* kDefaultJpegFilename = FILE_PATH_LITERAL("peach_pi-1280x720.jpg"); -// Images with at least one odd dimension. -const base::FilePath::CharType* kOddJpegFilenames[] = { - FILE_PATH_LITERAL("peach_pi-40x23.jpg"), - FILE_PATH_LITERAL("peach_pi-41x22.jpg"), - FILE_PATH_LITERAL("peach_pi-41x23.jpg")}; constexpr int kDefaultPerfDecodeTimes = 600; // Decide to save decode results to files or not. Output files will be saved // in the same directory with unittest. File name is like input file but @@ -117,14 +112,10 @@ void InitializeSizes(int width, int height) { visible_size.SetSize(width, height); - // The parse result yields a coded size that rounds up to a whole MCU. - // However, we can use a smaller coded size for the decode result. Here, we - // simply round up to the next even dimension. That way, when we are - // building the video frame to hold the result of the decoding, the strides - // and pointers for the UV planes are computed correctly for JPEGs that - // require even-sized allocation (see - // media::VideoFrame::RequiresEvenSizeAllocation()) and whose visible size - // has at least one odd dimension. + // We don't expect odd dimensions for camera captures. + DCHECK_EQ(0, width % 2); + DCHECK_EQ(0, height % 2); + coded_size.SetSize((visible_size.width() + 1) & ~1, (visible_size.height() + 1) & ~1); // The JPEG decoder will always return the decoded frame in I420 format. @@ -186,8 +177,6 @@ std::unique_ptr<ParsedJpegImage> image_data_1280x720_default_; // Parsed data of failure image. std::unique_ptr<ParsedJpegImage> image_data_invalid_; - // Parsed data for images with at least one odd dimension. - std::vector<std::unique_ptr<ParsedJpegImage>> image_data_odd_; // Parsed data from command line. std::vector<std::unique_ptr<ParsedJpegImage>> image_data_user_; // Decode times for performance measurement. @@ -213,13 +202,6 @@ image_data_invalid_->data_str.resize(100, 0); image_data_invalid_->InitializeSizes(1280, 720); - // Load test images with at least one odd dimension. - for (const auto* filename : kOddJpegFilenames) { - const base::FilePath input_file = GetOriginalOrTestDataFilePath(filename); - auto image_data = ParsedJpegImage::CreateFromFile(input_file); - image_data_odd_.push_back(std::move(image_data)); - } - // |user_jpeg_filenames_| may include many files and use ';' as delimiter. std::vector<base::FilePath::StringType> filenames = base::SplitString( user_jpeg_filenames_, base::FilePath::StringType(1, ';'), @@ -764,17 +746,6 @@ TestDecode(images, expected_status, 3 /* num_concurrent_decoders */); } -#if !(BUILDFLAG(USE_V4L2_CODEC) && defined(ARCH_CPU_ARM_FAMILY)) -// TODO(andrescj): re-enable for ARM devices when crbug.com/852236 is fixed. -TEST_F(MjpegDecodeAcceleratorTest, OddDimensions) { - std::vector<ParsedJpegImage*> images; - for (auto& image : g_env->image_data_odd_) - images.push_back(image.get()); - const std::vector<ClientState> expected_status(images.size(), CS_DECODE_PASS); - TestDecode(images, expected_status); -} -#endif - TEST_F(MjpegDecodeAcceleratorTest, InputSizeChange) { // The size of |image_data_1280x720_black_| is smaller than // |image_data_1280x720_default_|.
diff --git a/components/cloud_devices/common/description_items.h b/components/cloud_devices/common/description_items.h index 5e2348e1..9d52f360 100644 --- a/components/cloud_devices/common/description_items.h +++ b/components/cloud_devices/common/description_items.h
@@ -60,7 +60,7 @@ const Option& operator[](size_t i) const { return options_[i]; } bool Contains(const Option& option) const { - return base::ContainsValue(options_, option); + return base::Contains(options_, option); } void AddOption(Option&& option) { options_.emplace_back(std::move(option)); } @@ -108,7 +108,7 @@ const Option& operator[](size_t i) const { return options_[i]; } bool Contains(const Option& option) const { - return base::ContainsValue(options_, option); + return base::Contains(options_, option); } const Option& GetDefault() const {
diff --git a/components/component_updater/component_updater_command_line_config_policy.cc b/components/component_updater/component_updater_command_line_config_policy.cc index 9d72dd1c..4596cca1 100644 --- a/components/component_updater/component_updater_command_line_config_policy.cc +++ b/components/component_updater/component_updater_command_line_config_policy.cc
@@ -78,16 +78,15 @@ #if defined(OS_WIN) background_downloads_enabled_ = - !base::ContainsValue(switch_values, kSwitchDisableBackgroundDownloads); + !base::Contains(switch_values, kSwitchDisableBackgroundDownloads); #else background_downloads_enabled_ = false; #endif - deltas_enabled_ = - !base::ContainsValue(switch_values, kSwitchDisableDeltaUpdates); - fast_update_ = base::ContainsValue(switch_values, kSwitchFastUpdate); - pings_enabled_ = !base::ContainsValue(switch_values, kSwitchDisablePings); - test_request_ = base::ContainsValue(switch_values, kSwitchTestRequestParam); + deltas_enabled_ = !base::Contains(switch_values, kSwitchDisableDeltaUpdates); + fast_update_ = base::Contains(switch_values, kSwitchFastUpdate); + pings_enabled_ = !base::Contains(switch_values, kSwitchDisablePings); + test_request_ = base::Contains(switch_values, kSwitchTestRequestParam); const std::string switch_url_source = GetSwitchArgument(switch_values, kSwitchUrlSource);
diff --git a/components/components_strings.grd b/components/components_strings.grd index 06d62e1..4dd5fde 100644 --- a/components/components_strings.grd +++ b/components/components_strings.grd
@@ -206,6 +206,7 @@ <part file="find_in_page_strings.grdp" /> <part file="history_strings.grdp" /> <part file="login_dialog_strings.grdp" /> + <part file="media_message_center_strings.grdp" /> <part file="new_or_sad_tab_strings.grdp" /> <part file="ntp_snippets_strings.grdp" /> <part file="ntp_tiles_strings.grdp" />
diff --git a/components/consent_auditor/consent_sync_bridge_impl.cc b/components/consent_auditor/consent_sync_bridge_impl.cc index 1432341..4964655 100644 --- a/components/consent_auditor/consent_sync_bridge_impl.cc +++ b/components/consent_auditor/consent_sync_bridge_impl.cc
@@ -56,7 +56,7 @@ std::unique_ptr<EntityData> MoveToEntityData( std::unique_ptr<UserConsentSpecifics> specifics) { auto entity_data = std::make_unique<EntityData>(); - entity_data->non_unique_name = + entity_data->name = base::NumberToString(specifics->client_consent_time_usec()); entity_data->specifics.set_allocated_user_consent(specifics.release()); return entity_data;
diff --git a/components/content_settings/core/browser/content_settings_ephemeral_provider.cc b/components/content_settings/core/browser/content_settings_ephemeral_provider.cc index c6a91eb..fee0ee21 100644 --- a/components/content_settings/core/browser/content_settings_ephemeral_provider.cc +++ b/components/content_settings/core/browser/content_settings_ephemeral_provider.cc
@@ -54,7 +54,7 @@ std::unique_ptr<base::Value>&& in_value) { DCHECK(CalledOnValidThread()); - if (!base::ContainsKey(supported_types_, content_type)) + if (!base::Contains(supported_types_, content_type)) return false; // Default settings are set using a wildcard pattern for both
diff --git a/components/content_settings/core/browser/content_settings_info.cc b/components/content_settings/core/browser/content_settings_info.cc index 809318da..7ea63af 100644 --- a/components/content_settings/core/browser/content_settings_info.cc +++ b/components/content_settings/core/browser/content_settings_info.cc
@@ -34,7 +34,7 @@ } bool ContentSettingsInfo::IsSettingValid(ContentSetting setting) const { - return base::ContainsKey(valid_settings_, setting); + return base::Contains(valid_settings_, setting); } // TODO(raymes): Find a better way to deal with the special-casing in @@ -56,7 +56,7 @@ return false; } - return base::ContainsKey(valid_settings_, setting); + return base::Contains(valid_settings_, setting); } } // namespace content_settings
diff --git a/components/content_settings/core/browser/content_settings_registry.cc b/components/content_settings/core/browser/content_settings_registry.cc index d179a47d..5c5030e 100644 --- a/components/content_settings/core/browser/content_settings_registry.cc +++ b/components/content_settings/core/browser/content_settings_registry.cc
@@ -510,7 +510,7 @@ if (!website_settings_info) return; - DCHECK(!base::ContainsKey(content_settings_info_, type)); + DCHECK(!base::Contains(content_settings_info_, type)); content_settings_info_[type] = std::make_unique<ContentSettingsInfo>( website_settings_info, whitelisted_schemes, valid_settings, incognito_behavior, storage_behavior, origin_restriction);
diff --git a/components/content_settings/core/browser/content_settings_registry_unittest.cc b/components/content_settings/core/browser/content_settings_registry_unittest.cc index 6e0b0b43..0aaa9ed 100644 --- a/components/content_settings/core/browser/content_settings_registry_unittest.cc +++ b/components/content_settings/core/browser/content_settings_registry_unittest.cc
@@ -152,7 +152,7 @@ } if (info->incognito_behavior() == ContentSettingsInfo::INHERIT_IN_INCOGNITO && - !base::ContainsValue(whitelist, info->website_settings_info()->type())) + !base::Contains(whitelist, info->website_settings_info()->type())) FAIL() << "Content setting not whitelisted."; } }
diff --git a/components/crash/content/browser/child_exit_observer_android.cc b/components/crash/content/browser/child_exit_observer_android.cc index aee39990..41f904e 100644 --- a/components/crash/content/browser/child_exit_observer_android.cc +++ b/components/crash/content/browser/child_exit_observer_android.cc
@@ -156,7 +156,7 @@ const content::ChildProcessData& data, const content::ChildProcessTerminationInfo& content_info) { DCHECK_CURRENTLY_ON(BrowserThread::UI); - DCHECK(!base::ContainsKey(browser_child_process_info_, data.id)); + DCHECK(!base::Contains(browser_child_process_info_, data.id)); TerminationInfo info; info.process_host_id = data.id; info.pid = data.GetProcess().Pid();
diff --git a/components/cronet/ios/BUILD.gn b/components/cronet/ios/BUILD.gn index b8659e29..2bf7142 100644 --- a/components/cronet/ios/BUILD.gn +++ b/components/cronet/ios/BUILD.gn
@@ -226,13 +226,6 @@ args += [ "--use_custom_libcxx" ] } - if (!use_system_xcode) { - args += [ - "--developer_dir", - hermetic_xcode_path, - ] - } - public_configs = [ ":cronet_static_config" ] }
diff --git a/components/cronet/native/test/buffer_test.cc b/components/cronet/native/test/buffer_test.cc index 1a95821e..a92129c 100644 --- a/components/cronet/native/test/buffer_test.cc +++ b/components/cronet/native/test/buffer_test.cc
@@ -8,8 +8,8 @@ #include "base/logging.h" #include "base/macros.h" -#include "base/message_loop/message_loop.h" #include "base/run_loop.h" +#include "base/test/scoped_task_environment.h" #include "components/cronet/native/test/test_util.h" #include "testing/gtest/include/gtest/gtest.h" @@ -25,8 +25,10 @@ Cronet_BufferPtr buffer); bool on_destroy_called() const { return on_destroy_called_; } - // Provide a message loop for use by TestExecutor instances. - base::MessageLoop message_loop_; + // Provide a task environment for use by TestExecutor instances. Do not + // initialize the ThreadPool as this is done by the Cronet_Engine + base::test::ScopedTaskEnvironment scoped_task_environment_{ + base::test::ScopedTaskEnvironment::ThreadingMode::MAIN_THREAD_ONLY}; private: void set_on_destroy_called(bool value) { on_destroy_called_ = value; }
diff --git a/components/cronet/native/test/executors_test.cc b/components/cronet/native/test/executors_test.cc index 76bf9a27..ab92dd7 100644 --- a/components/cronet/native/test/executors_test.cc +++ b/components/cronet/native/test/executors_test.cc
@@ -6,8 +6,8 @@ #include "base/logging.h" #include "base/macros.h" -#include "base/message_loop/message_loop.h" #include "base/run_loop.h" +#include "base/test/scoped_task_environment.h" #include "components/cronet/native/test/test_util.h" #include "testing/gtest/include/gtest/gtest.h" @@ -22,8 +22,10 @@ static void TestRunnable_Run(Cronet_RunnablePtr self); bool runnable_called() const { return runnable_called_; } - // Provide a message loop for use by TestExecutor instances. - base::MessageLoop message_loop_; + // Provide a task environment for use by TestExecutor instances. Do not + // initialize the ThreadPool as this is done by the Cronet_Engine + base::test::ScopedTaskEnvironment scoped_task_environment_{ + base::test::ScopedTaskEnvironment::ThreadingMode::MAIN_THREAD_ONLY}; private: void set_runnable_called(bool value) { runnable_called_ = value; }
diff --git a/components/cronet/native/test/url_request_test.cc b/components/cronet/native/test/url_request_test.cc index 1824146..f74bc0a 100644 --- a/components/cronet/native/test/url_request_test.cc +++ b/components/cronet/native/test/url_request_test.cc
@@ -10,9 +10,9 @@ #include "base/files/scoped_temp_dir.h" #include "base/logging.h" #include "base/macros.h" -#include "base/message_loop/message_loop.h" #include "base/run_loop.h" #include "base/synchronization/waitable_event.h" +#include "base/test/scoped_task_environment.h" #include "components/cronet/native/test/test_request_finished_info_listener.h" #include "components/cronet/native/test/test_upload_data_provider.h" #include "components/cronet/native/test/test_url_request_callback.h" @@ -484,8 +484,10 @@ bool expect_error); protected: - // Provide a message loop for use by TestExecutor instances. - base::MessageLoop message_loop_; + // Provide a task environment for use by TestExecutor instances. Do not + // initialize the ThreadPool as this is done by the Cronet_Engine + base::test::ScopedTaskEnvironment scoped_task_environment_{ + base::test::ScopedTaskEnvironment::ThreadingMode::MAIN_THREAD_ONLY}; // Not owned, |request_finished_listener_| destroys itself when run. This // pointer is only needed to unregister the listener from the Engine in
diff --git a/components/cronet/tools/hide_symbols.py b/components/cronet/tools/hide_symbols.py index 788c90ff..7140383e 100755 --- a/components/cronet/tools/hide_symbols.py +++ b/components/cronet/tools/hide_symbols.py
@@ -55,18 +55,11 @@ parser.add_option( '--use_custom_libcxx', default=False, action='store_true', help='Confirm there is a custom libc++ linked in.') - parser.add_option( - '--developer_dir', - help='Path to Xcode.') (options, args) = parser.parse_args() assert not args - if options.developer_dir: - os.environ['DEVELOPER_DIR'] = options.developer_dir - developer_dir = options.developer_dir + '/Contents/Developer' - else: - developer_dir = subprocess.check_output( - ['xcode-select', '--print-path']).strip() + developer_dir = subprocess.check_output( + ['xcode-select', '--print-path']).strip() xctoolchain_libs = glob.glob(developer_dir + '/Toolchains/XcodeDefault.xctoolchain/usr/lib'
diff --git a/components/cronet/url_request_context_config_unittest.cc b/components/cronet/url_request_context_config_unittest.cc index 584dd951..ff2729a7 100644 --- a/components/cronet/url_request_context_config_unittest.cc +++ b/components/cronet/url_request_context_config_unittest.cc
@@ -802,10 +802,8 @@ const net::HttpNetworkSession::Params* params = context->GetNetworkSessionParams(); - EXPECT_TRUE( - base::ContainsKey(params->quic_host_whitelist, "www.example.com")); - EXPECT_TRUE( - base::ContainsKey(params->quic_host_whitelist, "www.example.org")); + EXPECT_TRUE(base::Contains(params->quic_host_whitelist, "www.example.com")); + EXPECT_TRUE(base::Contains(params->quic_host_whitelist, "www.example.org")); } TEST(URLRequestContextConfigTest, SetQuicMaxTimeBeforeCryptoHandshake) {
diff --git a/components/data_reduction_proxy/core/browser/data_reduction_proxy_config_service_client_unittest.cc b/components/data_reduction_proxy/core/browser/data_reduction_proxy_config_service_client_unittest.cc index 069fc68..e3a307a 100644 --- a/components/data_reduction_proxy/core/browser/data_reduction_proxy_config_service_client_unittest.cc +++ b/components/data_reduction_proxy/core/browser/data_reduction_proxy_config_service_client_unittest.cc
@@ -35,6 +35,7 @@ #include "components/data_reduction_proxy/core/common/data_reduction_proxy_server.h" #include "components/data_reduction_proxy/core/common/data_reduction_proxy_switches.h" #include "components/data_reduction_proxy/proto/client_config.pb.h" +#include "components/prefs/pref_registry_simple.h" #include "net/base/network_change_notifier.h" #include "net/base/proxy_server.h" #include "net/http/http_request_headers.h"
diff --git a/components/data_use_measurement/content/BUILD.gn b/components/data_use_measurement/content/BUILD.gn deleted file mode 100644 index 58db8d3c..0000000 --- a/components/data_use_measurement/content/BUILD.gn +++ /dev/null
@@ -1,17 +0,0 @@ -# Copyright 2015 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. - -static_library("content") { - sources = [ - "content_url_request_classifier.cc", - "content_url_request_classifier.h", - ] - deps = [ - "//base", - "//content/public/browser", - "//content/public/common", - "//net:net", - "//ui/base", - ] -}
diff --git a/components/data_use_measurement/content/DEPS b/components/data_use_measurement/content/DEPS deleted file mode 100644 index ba4bf0e..0000000 --- a/components/data_use_measurement/content/DEPS +++ /dev/null
@@ -1,6 +0,0 @@ -include_rules = [ - "+content/public/browser", - "+content/public/common", - "+net", - "+ui/base", -]
diff --git a/components/data_use_measurement/content/content_url_request_classifier.cc b/components/data_use_measurement/content/content_url_request_classifier.cc deleted file mode 100644 index 2eb5744..0000000 --- a/components/data_use_measurement/content/content_url_request_classifier.cc +++ /dev/null
@@ -1,145 +0,0 @@ -// Copyright 2016 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/data_use_measurement/content/content_url_request_classifier.h" - -#include <string> - -#include "base/metrics/histogram_macros.h" -#include "base/metrics/sparse_histogram.h" -#include "base/strings/string_util.h" -#include "content/public/browser/resource_request_info.h" -#include "content/public/common/resource_type.h" -#include "net/http/http_response_headers.h" -#include "net/url_request/url_request.h" -#include "ui/base/page_transition_types.h" - -namespace { - -// Data use broken by page transition type. This enum must remain synchronized -// with the enum of the same name in metrics/histograms/histograms.xml. The enum -// values have the same meaning as ui::PageTransition in -// ui/base/page_transition_types.h. These values are written to logs. New enum -// values can be added, but existing enums must never be renumbered or deleted -// and reused. -enum DataUsePageTransition { - LINK = 0, - TYPED = 1, - AUTO_BOOKMARK = 2, - SUBFRAME = 3, // AUTO_SUBFRAME and MANUAL_SUBFRAME transitions. - GENERATED = 4, - AUTO_TOPLEVEL = 5, - FORM_SUBMIT = 6, - RELOAD = 7, - KEYWORD = 8, // KEYWORD and KEYWORD_GENERATED transitions. - FORWARD_BACK = 9, - HOME_PAGE = 10, - TRANSITION_MAX = 11, -}; - -} // namespace - -namespace data_use_measurement { - -DataUseUserData::DataUseContentType ContentURLRequestClassifier::GetContentType( - const net::URLRequest& request, - const net::HttpResponseHeaders& response_headers) const { - content::ResourceRequestInfo* request_info = - content::ResourceRequestInfo::ForRequest(&request); - std::string mime_type; - if (response_headers.GetMimeType(&mime_type)) { - if (mime_type == "text/html" && request_info && - request_info->GetResourceType() == content::ResourceType::kMainFrame) { - return DataUseUserData::MAIN_FRAME_HTML; - } - if (mime_type == "text/html") - return DataUseUserData::NON_MAIN_FRAME_HTML; - if (mime_type == "text/css") - return DataUseUserData::CSS; - if (base::StartsWith(mime_type, "image/", base::CompareCase::SENSITIVE)) - return DataUseUserData::IMAGE; - if (base::EndsWith(mime_type, "javascript", base::CompareCase::SENSITIVE) || - base::EndsWith(mime_type, "ecmascript", base::CompareCase::SENSITIVE)) { - return DataUseUserData::JAVASCRIPT; - } - if (mime_type.find("font") != std::string::npos) - return DataUseUserData::FONT; - if (base::StartsWith(mime_type, "audio/", base::CompareCase::SENSITIVE)) - return DataUseUserData::AUDIO; - if (base::StartsWith(mime_type, "video/", base::CompareCase::SENSITIVE)) - return DataUseUserData::VIDEO; - } - return DataUseUserData::OTHER; -} - -void ContentURLRequestClassifier::RecordPageTransitionUMA( - uint64_t page_transition, - int64_t received_bytes) const { - DataUsePageTransition data_use_page_transition = - DataUsePageTransition::TRANSITION_MAX; - if (received_bytes <= 0) - return; - - if (page_transition & ui::PAGE_TRANSITION_FORWARD_BACK) { - data_use_page_transition = DataUsePageTransition::FORWARD_BACK; - } else if (page_transition & ui::PAGE_TRANSITION_HOME_PAGE) { - data_use_page_transition = DataUsePageTransition::HOME_PAGE; - } else { - switch (page_transition & ui::PAGE_TRANSITION_CORE_MASK) { - case ui::PAGE_TRANSITION_LINK: - data_use_page_transition = DataUsePageTransition::LINK; - break; - case ui::PAGE_TRANSITION_TYPED: - data_use_page_transition = DataUsePageTransition::TYPED; - break; - case ui::PAGE_TRANSITION_AUTO_BOOKMARK: - data_use_page_transition = DataUsePageTransition::AUTO_BOOKMARK; - break; - case ui::PAGE_TRANSITION_AUTO_SUBFRAME: - case ui::PAGE_TRANSITION_MANUAL_SUBFRAME: - data_use_page_transition = DataUsePageTransition::SUBFRAME; - break; - case ui::PAGE_TRANSITION_GENERATED: - data_use_page_transition = DataUsePageTransition::GENERATED; - break; - case ui::PAGE_TRANSITION_AUTO_TOPLEVEL: - data_use_page_transition = DataUsePageTransition::AUTO_TOPLEVEL; - break; - case ui::PAGE_TRANSITION_FORM_SUBMIT: - data_use_page_transition = DataUsePageTransition::FORM_SUBMIT; - break; - case ui::PAGE_TRANSITION_RELOAD: - data_use_page_transition = DataUsePageTransition::RELOAD; - break; - case ui::PAGE_TRANSITION_KEYWORD: - case ui::PAGE_TRANSITION_KEYWORD_GENERATED: - data_use_page_transition = DataUsePageTransition::KEYWORD; - break; - default: - return; - } - } - DCHECK_NE(DataUsePageTransition::TRANSITION_MAX, data_use_page_transition); - - // Use the more primitive STATIC_HISTOGRAM_POINTER_BLOCK macro because the - // simple UMA_HISTOGRAM_ENUMERATION macros don't expose 'AddKiB'. - STATIC_HISTOGRAM_POINTER_BLOCK( - "DataUse.PageTransition.UserTrafficKB", - AddKiB(data_use_page_transition, received_bytes), - base::LinearHistogram::FactoryGet( - "DataUse.PageTransition.UserTrafficKB", 1, - DataUsePageTransition::TRANSITION_MAX, - DataUsePageTransition::TRANSITION_MAX + 1, - base::HistogramBase::kUmaTargetedHistogramFlag)); -} - -bool ContentURLRequestClassifier::IsFavIconRequest( - const net::URLRequest& request) const { - content::ResourceRequestInfo* request_info = - content::ResourceRequestInfo::ForRequest(&request); - return request_info && - request_info->GetResourceType() == content::ResourceType::kFavicon; -} - -} // namespace data_use_measurement
diff --git a/components/data_use_measurement/content/content_url_request_classifier.h b/components/data_use_measurement/content/content_url_request_classifier.h deleted file mode 100644 index 8ad2ec7..0000000 --- a/components/data_use_measurement/content/content_url_request_classifier.h +++ /dev/null
@@ -1,29 +0,0 @@ -// Copyright 2016 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_DATA_USE_MEASUREMENT_CONTENT_CONTENT_URL_REQUEST_CLASSIFIER_H_ -#define COMPONENTS_DATA_USE_MEASUREMENT_CONTENT_CONTENT_URL_REQUEST_CLASSIFIER_H_ - -#include "components/data_use_measurement/core/url_request_classifier.h" - -namespace net { -class URLRequest; -} - -namespace data_use_measurement { - -class ContentURLRequestClassifier : public URLRequestClassifier { - private: - // UrlRequestClassifier: - DataUseUserData::DataUseContentType GetContentType( - const net::URLRequest& request, - const net::HttpResponseHeaders& response_headers) const override; - void RecordPageTransitionUMA(uint64_t page_transition, - int64_t received_bytes) const override; - bool IsFavIconRequest(const net::URLRequest& request) const override; -}; - -} // namespace data_use_measurement - -#endif // COMPONENTS_DATA_USE_MEASUREMENT_CONTENT_CONTENT_URL_REQUEST_CLASSIFIER_H_
diff --git a/components/data_use_measurement/core/BUILD.gn b/components/data_use_measurement/core/BUILD.gn index bb15d87..f9f4bac 100644 --- a/components/data_use_measurement/core/BUILD.gn +++ b/components/data_use_measurement/core/BUILD.gn
@@ -17,14 +17,8 @@ sources = [ "data_use.cc", "data_use.h", - "data_use_ascriber.cc", - "data_use_ascriber.h", "data_use_measurement.cc", "data_use_measurement.h", - "data_use_network_delegate.cc", - "data_use_network_delegate.h", - "data_use_recorder.cc", - "data_use_recorder.h", ] deps = [ ":core", @@ -38,7 +32,6 @@ source_set("unit_tests") { sources = [ "data_use_measurement_unittest.cc", - "data_use_network_delegate_unittest.cc", ] testonly = true deps = [ @@ -47,6 +40,7 @@ "//base/test:test_support", "//components/metrics:metrics", "//net:test_support", + "//services/network:test_support", "//testing/gtest", ] }
diff --git a/components/data_use_measurement/core/DEPS b/components/data_use_measurement/core/DEPS index 73776fb..9592232 100644 --- a/components/data_use_measurement/core/DEPS +++ b/components/data_use_measurement/core/DEPS
@@ -2,4 +2,5 @@ "+net", "+components/metrics", "+services/network/public/cpp", + "+services/network/test", ]
diff --git a/components/data_use_measurement/core/data_use_ascriber.cc b/components/data_use_measurement/core/data_use_ascriber.cc deleted file mode 100644 index 462d320..0000000 --- a/components/data_use_measurement/core/data_use_ascriber.cc +++ /dev/null
@@ -1,61 +0,0 @@ -// Copyright 2016 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/data_use_measurement/core/data_use_ascriber.h" - -#include <memory> -#include <utility> - -#include "components/data_use_measurement/core/data_use_recorder.h" -#include "net/http/http_response_headers.h" - -namespace data_use_measurement { - -DataUseAscriber::DataUseAscriber() {} -DataUseAscriber::~DataUseAscriber() {} - -void DataUseAscriber::OnBeforeUrlRequest(net::URLRequest* request) { - DataUseRecorder* recorder = GetOrCreateDataUseRecorder(request); - if (!recorder) - return; - - recorder->OnBeforeUrlRequest(request); -} - -void DataUseAscriber::OnNetworkBytesSent(net::URLRequest* request, - int64_t bytes_sent) { - DataUseRecorder* recorder = GetDataUseRecorder(*request); - if (!recorder) - return; - - recorder->OnNetworkBytesSent(request, bytes_sent); - for (auto& observer : observers_) - observer.OnNetworkBytesUpdate(*request, &recorder->data_use()); -} - -void DataUseAscriber::OnNetworkBytesReceived(net::URLRequest* request, - int64_t bytes_received) { - DataUseRecorder* recorder = GetDataUseRecorder(*request); - if (!recorder) - return; - - recorder->OnNetworkBytesReceived(request, bytes_received); - for (auto& observer : observers_) - observer.OnNetworkBytesUpdate(*request, &recorder->data_use()); -} - -void DataUseAscriber::OnUrlRequestCompleted(net::URLRequest* request, - bool started) {} - -void DataUseAscriber::OnUrlRequestDestroyed(net::URLRequest* request) { - DataUseRecorder* recorder = GetDataUseRecorder(*request); - if (!recorder) - return; - - recorder->OnUrlRequestDestroyed(request); -} - -void DataUseAscriber::DisableAscriber() {} - -} // namespace data_use_measurement
diff --git a/components/data_use_measurement/core/data_use_ascriber.h b/components/data_use_measurement/core/data_use_ascriber.h deleted file mode 100644 index 984bec89..0000000 --- a/components/data_use_measurement/core/data_use_ascriber.h +++ /dev/null
@@ -1,123 +0,0 @@ -// Copyright 2016 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_DATA_USE_MEASUREMENT_CORE_DATA_USE_ASCRIBER_H_ -#define COMPONENTS_DATA_USE_MEASUREMENT_CORE_DATA_USE_ASCRIBER_H_ - -#include <stdint.h> - -#include <memory> - -#include "base/observer_list.h" -#include "base/threading/thread_checker.h" -#include "components/data_use_measurement/core/data_use_measurement.h" -#include "url/gurl.h" - -namespace net { -class NetworkDelegate; -class URLRequest; -} - -namespace data_use_measurement { - -class DataUse; -class DataUseRecorder; -class URLRequestClassifier; - -// Abstract class that manages instances of DataUseRecorder and maps -// a URLRequest instance to its appropriate DataUseRecorder. An embedder -// should provide an override if it is interested in tracking data usage. Data -// use from all URLRequests mapped to the same DataUseRecorder will be grouped -// together and reported as a single use. -class DataUseAscriber { - public: - // Provides the interface for observing data use of a pageload. - class PageLoadObserver { - public: - virtual ~PageLoadObserver() {} - - // The page load committed. |data_use| contains the currently committed URL, - // and the network data used by the page so far. - virtual void OnPageLoadCommit(DataUse* data_use) = 0; - - // A resource of a page loaded. This includes main frame, sub frame - // resource, subresource. |data_use| contains the network data used by the - // page so far. URL in |data_use| may not be available until OnCommit. - virtual void OnPageResourceLoad(const net::URLRequest& request, - DataUse* data_use) = 0; - - // The DidFinishLoad event occurred for the main frame. That is, the page - // load is nominally done (however, the page can still issue more network - // requests between this event and |OnPageLoadConcluded|. - virtual void OnPageDidFinishLoad(DataUse* data_use) = 0; - - // The page load completed. This is when the tab is closed or another - // navigation starts due to omnibox search, link clicks, page reload, etc. - virtual void OnPageLoadConcluded(DataUse* data_use) = 0; - - // Called whenever a request uses any amount of network data. |request| is - // the corresponding request that used data. |data_use| contains the network - // data used by the page so far. URL in |data_use| may not be available - // until OnCommit. - virtual void OnNetworkBytesUpdate(const net::URLRequest& request, - DataUse* data_use) = 0; - }; - - DataUseAscriber(); - virtual ~DataUseAscriber(); - - // Creates a network delegate that will be used to track data use. - virtual std::unique_ptr<net::NetworkDelegate> CreateNetworkDelegate( - std::unique_ptr<net::NetworkDelegate> wrapped_network_delegate) = 0; - - // Returns the DataUseRecorder to which data usage for the given URL should - // be ascribed. If no existing DataUseRecorder exists, a new one will be - // created. - virtual DataUseRecorder* GetOrCreateDataUseRecorder( - net::URLRequest* request) = 0; - - // Returns the existing DataUseRecorder to which data usage for the given URL - // should be ascribed. - virtual DataUseRecorder* GetDataUseRecorder( - const net::URLRequest& request) = 0; - - // Returns a URLRequestClassifier that can classify requests for metrics - // recording. - virtual std::unique_ptr<URLRequestClassifier> CreateURLRequestClassifier() - const = 0; - - // Observers should be added or removed in IO thread. The notifications will - // be called in the same thread. - void AddObserver(PageLoadObserver* observer) { - DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); - observers_.AddObserver(observer); - } - - void RemoveObserver(PageLoadObserver* observer) { - DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); - observers_.RemoveObserver(observer); - } - - // Methods called by DataUseNetworkDelegate to propagate data use information: - // OnBeforeUrlRequest may be called twice. e.g., in case of redirects. - virtual void OnBeforeUrlRequest(net::URLRequest* request); - virtual void OnNetworkBytesSent(net::URLRequest* request, int64_t bytes_sent); - virtual void OnNetworkBytesReceived(net::URLRequest* request, - int64_t bytes_received); - virtual void OnUrlRequestCompleted(net::URLRequest* request, bool started); - virtual void OnUrlRequestDestroyed(net::URLRequest* request); - - // Disables data use ascriber. - virtual void DisableAscriber(); - - protected: - base::ObserverList<PageLoadObserver>::Unchecked observers_; - - private: - THREAD_CHECKER(thread_checker_); -}; - -} // namespace data_use_measurement - -#endif // COMPONENTS_DATA_USE_MEASUREMENT_CORE_DATA_USE_ASCRIBER_H_
diff --git a/components/data_use_measurement/core/data_use_measurement.cc b/components/data_use_measurement/core/data_use_measurement.cc index cfd9420f..8386d27 100644 --- a/components/data_use_measurement/core/data_use_measurement.cc +++ b/components/data_use_measurement/core/data_use_measurement.cc
@@ -8,22 +8,13 @@ #include "base/bind.h" #include "base/feature_list.h" -#include "base/lazy_instance.h" #include "base/memory/ptr_util.h" #include "base/metrics/histogram_macros.h" #include "base/metrics/sparse_histogram.h" #include "base/strings/stringprintf.h" #include "build/build_config.h" -#include "components/data_use_measurement/core/data_use_ascriber.h" -#include "components/data_use_measurement/core/data_use_recorder.h" #include "components/data_use_measurement/core/data_use_user_data.h" -#include "components/data_use_measurement/core/url_request_classifier.h" -#include "net/base/network_change_notifier.h" -#include "net/base/upload_data_stream.h" -#include "net/http/http_response_headers.h" -#include "net/http/http_status_code.h" #include "net/traffic_annotation/network_traffic_annotation.h" -#include "net/url_request/url_request.h" #include "services/network/public/cpp/features.h" #if defined(OS_ANDROID) @@ -47,39 +38,11 @@ histogram_pointer->Add(sample); } -#if defined(OS_ANDROID) -void IncrementLatencyHistogramByCount(const std::string& name, - const base::TimeDelta& latency, - int64_t count) { - base::HistogramBase* histogram_pointer = base::Histogram::FactoryTimeGet( - name, - base::TimeDelta::FromMilliseconds(1), // Minimum sample - base::TimeDelta::FromHours(1), // Maximum sample - 50, // Bucket count. - base::HistogramBase::kUmaTargetedHistogramFlag); - histogram_pointer->AddCount(latency.InMilliseconds(), count); -} -#endif - -void RecordFavIconDataUse(const net::URLRequest& request) { - UMA_HISTOGRAM_COUNTS_100000( - "DataUse.FavIcon.Downstream", - request.was_cached() ? 0 : request.GetTotalReceivedBytes()); - if (request.status().is_success() && - request.GetResponseCode() != net::HTTP_OK) { - UMA_HISTOGRAM_COUNTS_100000("DataUse.FavIcon.Downstream.Non200Response", - request.GetTotalReceivedBytes()); - } -} - } // namespace DataUseMeasurement::DataUseMeasurement( - std::unique_ptr<URLRequestClassifier> url_request_classifier, - DataUseAscriber* ascriber, network::NetworkConnectionTracker* network_connection_tracker) - : url_request_classifier_(std::move(url_request_classifier)), - ascriber_(ascriber), + : #if defined(OS_ANDROID) app_state_(base::android::APPLICATION_STATE_HAS_RUNNING_ACTIVITIES), app_listener_(base::android::ApplicationStatusListener::New( @@ -92,16 +55,9 @@ network_connection_tracker_(network_connection_tracker), connection_type_(network::mojom::ConnectionType::CONNECTION_UNKNOWN) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - DCHECK(ascriber_ || - base::FeatureList::IsEnabled(network::features::kNetworkService)); - DCHECK(url_request_classifier_ || - base::FeatureList::IsEnabled(network::features::kNetworkService)); - DCHECK(network_connection_tracker_ || - !base::FeatureList::IsEnabled(network::features::kNetworkService)); + DCHECK(network_connection_tracker_); - if (network_connection_tracker_) { - network_connection_tracker_->AddNetworkConnectionObserver(this); - } + network_connection_tracker_->AddNetworkConnectionObserver(this); #if defined(OS_ANDROID) int64_t bytes = 0; @@ -116,99 +72,10 @@ DataUseMeasurement::~DataUseMeasurement() { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - if (network_connection_tracker_) - network_connection_tracker_->RemoveNetworkConnectionObserver(this); + network_connection_tracker_->RemoveNetworkConnectionObserver(this); DCHECK(!services_data_use_observer_list_.might_have_observers()); } -void DataUseMeasurement::OnBeforeURLRequest(net::URLRequest* request) { - DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - DataUseUserData* data_use_user_data = reinterpret_cast<DataUseUserData*>( - request->GetUserData(DataUseUserData::kUserDataKey)); - if (!data_use_user_data) { - data_use_user_data = new DataUseUserData(CurrentAppState()); - request->SetUserData(DataUseUserData::kUserDataKey, - base::WrapUnique(data_use_user_data)); - } else { - data_use_user_data->set_app_state(CurrentAppState()); - } -} - -void DataUseMeasurement::OnBeforeRedirect(const net::URLRequest& request, - const GURL& new_location) { - DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - // Recording data use of request on redirects. - // TODO(rajendrant): May not be needed when http://crbug/651957 is fixed. - UpdateDataUseToMetricsService( - request.GetTotalSentBytes() + request.GetTotalReceivedBytes(), - IsCurrentNetworkCellular(), - IsMetricsServiceRequest( - request.traffic_annotation().unique_id_hash_code)); - ReportServicesMessageSizeUMA(request); - if (url_request_classifier_->IsFavIconRequest(request)) - RecordFavIconDataUse(request); -} - -void DataUseMeasurement::OnHeadersReceived( - net::URLRequest* request, - const net::HttpResponseHeaders* response_headers) { - DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - DataUseUserData* data_use_user_data = reinterpret_cast<DataUseUserData*>( - request->GetUserData(DataUseUserData::kUserDataKey)); - if (data_use_user_data) { - data_use_user_data->set_content_type( - url_request_classifier_->GetContentType(*request, *response_headers)); - } -} - -void DataUseMeasurement::OnNetworkBytesReceived(const net::URLRequest& request, - int64_t bytes_received) { - DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - UMA_HISTOGRAM_COUNTS_1M("DataUse.BytesReceived.Delegate", bytes_received); - ReportDataUseUMA(request, DOWNSTREAM, bytes_received); -#if defined(OS_ANDROID) - bytes_transferred_since_last_traffic_stats_query_ += bytes_received; -#endif -} - -void DataUseMeasurement::OnNetworkBytesSent(const net::URLRequest& request, - int64_t bytes_sent) { - DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - UMA_HISTOGRAM_COUNTS_1M("DataUse.BytesSent.Delegate", bytes_sent); - ReportDataUseUMA(request, UPSTREAM, bytes_sent); -#if defined(OS_ANDROID) - bytes_transferred_since_last_traffic_stats_query_ += bytes_sent; -#endif -} - -void DataUseMeasurement::OnCompleted(const net::URLRequest& request, - bool started) { - DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - // TODO(amohammadkhan): Verify that there is no double recording in data use - // of redirected requests. - UpdateDataUseToMetricsService( - request.GetTotalSentBytes() + request.GetTotalReceivedBytes(), - IsCurrentNetworkCellular(), - IsMetricsServiceRequest( - request.traffic_annotation().unique_id_hash_code)); - ReportServicesMessageSizeUMA(request); - RecordPageTransitionUMA(request); -#if defined(OS_ANDROID) - MaybeRecordNetworkBytesOS(); -#endif - if (url_request_classifier_->IsFavIconRequest(request)) - RecordFavIconDataUse(request); -} - -// static -DataUseUserData::DataUseContentType -DataUseMeasurement::GetContentTypeForRequest(const net::URLRequest& request) { - DataUseUserData* attached_user_data = static_cast<DataUseUserData*>( - request.GetUserData(DataUseUserData::kUserDataKey)); - return attached_user_data ? attached_user_data->content_type() - : DataUseUserData::OTHER; -} - void DataUseMeasurement::RecordTrafficSizeMetric(bool is_user_traffic, bool is_downstream, bool is_tab_visible, @@ -224,63 +91,6 @@ CurrentAppState(), is_tab_visible, bytes); } -void DataUseMeasurement::ReportDataUseUMA(const net::URLRequest& request, - TrafficDirection dir, - int64_t bytes) { - bool is_user_traffic = - IsUserRequest(request.traffic_annotation().unique_id_hash_code); - - DataUseUserData* attached_service_data = static_cast<DataUseUserData*>( - request.GetUserData(DataUseUserData::kUserDataKey)); - DataUseUserData::AppState old_app_state = DataUseUserData::FOREGROUND; - DataUseUserData::AppState new_app_state = DataUseUserData::UNKNOWN; - - if (attached_service_data) - old_app_state = attached_service_data->app_state(); - - if (old_app_state == CurrentAppState()) - new_app_state = old_app_state; - - if (attached_service_data && old_app_state != new_app_state) - attached_service_data->set_app_state(CurrentAppState()); - -#if defined(OS_ANDROID) - if (dir == DOWNSTREAM && CurrentAppState() == DataUseUserData::BACKGROUND) { - DCHECK(!last_app_background_time_.is_null()); - - const base::TimeDelta time_since_background = - base::TimeTicks::Now() - last_app_background_time_; - IncrementLatencyHistogramByCount( - is_user_traffic ? "DataUse.BackgroundToDataRecievedPerByte.User" - : "DataUse.BackgroundToDataRecievedPerByte.System", - time_since_background, bytes); - if (no_reads_since_background_) { - no_reads_since_background_ = false; - IncrementLatencyHistogramByCount( - is_user_traffic ? "DataUse.BackgroundToFirstDownstream.User" - : "DataUse.BackgroundToFirstDownstream.System", - time_since_background, 1); - } - } -#endif - - bool is_tab_visible = false; - - if (is_user_traffic) { - if (const auto* recorder = ascriber_->GetDataUseRecorder(request)) - is_tab_visible = recorder->is_visible(); - } - RecordTrafficSizeMetric(is_user_traffic, dir == DOWNSTREAM, is_tab_visible, - bytes); - - if (attached_service_data && dir == DOWNSTREAM && - new_app_state != DataUseUserData::UNKNOWN) { - RecordContentTypeHistogram(attached_service_data->content_type(), - is_user_traffic, new_app_state, is_tab_visible, - bytes); - } -} - #if defined(OS_ANDROID) void DataUseMeasurement::OnApplicationStateChangeForTesting( base::android::ApplicationState application_state) { @@ -378,18 +188,6 @@ } #endif -void DataUseMeasurement::ReportServicesMessageSizeUMA( - const net::URLRequest& request) { - if (!IsUserRequest(request.traffic_annotation().unique_id_hash_code)) { - ReportDataUsageServices(request.traffic_annotation().unique_id_hash_code, - UPSTREAM, CurrentAppState(), - request.GetTotalSentBytes()); - ReportDataUsageServices(request.traffic_annotation().unique_id_hash_code, - DOWNSTREAM, CurrentAppState(), - request.GetTotalReceivedBytes()); - } -} - void DataUseMeasurement::ReportDataUsageServices( int32_t traffic_annotation_hash, TrafficDirection dir, @@ -426,44 +224,6 @@ RecordUMAHistogramCount(histogram_name, bytes); } -void DataUseMeasurement::RecordContentTypeHistogram( - DataUseUserData::DataUseContentType content_type, - bool is_user_traffic, - DataUseUserData::AppState app_state, - bool is_tab_visible, - int64_t bytes) { - if (content_type == DataUseUserData::AUDIO) { - content_type = app_state != DataUseUserData::FOREGROUND - ? DataUseUserData::AUDIO_APPBACKGROUND - : (!is_tab_visible ? DataUseUserData::AUDIO_TABBACKGROUND - : DataUseUserData::AUDIO); - } else if (content_type == DataUseUserData::VIDEO) { - content_type = app_state != DataUseUserData::FOREGROUND - ? DataUseUserData::VIDEO_APPBACKGROUND - : (!is_tab_visible ? DataUseUserData::VIDEO_TABBACKGROUND - : DataUseUserData::VIDEO); - } - if (is_user_traffic) { - UMA_HISTOGRAM_SCALED_ENUMERATION("DataUse.ContentType.UserTrafficKB", - content_type, bytes, 1024); - } else { - UMA_HISTOGRAM_SCALED_ENUMERATION("DataUse.ContentType.ServicesKB", - content_type, bytes, 1024); - } -} - -void DataUseMeasurement::RecordPageTransitionUMA( - const net::URLRequest& request) const { - if (!IsUserRequest(request.traffic_annotation().unique_id_hash_code)) - return; - - const DataUseRecorder* recorder = ascriber_->GetDataUseRecorder(request); - if (recorder) { - url_request_classifier_->RecordPageTransitionUMA( - recorder->page_transition(), request.GetTotalReceivedBytes()); - } -} - // static bool DataUseMeasurement::IsUserRequest( int32_t network_traffic_annotation_hash_id) { @@ -522,13 +282,8 @@ } bool DataUseMeasurement::IsCurrentNetworkCellular() const { - if (network_connection_tracker_) { - DCHECK(base::FeatureList::IsEnabled(network::features::kNetworkService)); - return network::NetworkConnectionTracker::IsConnectionCellular( - connection_type_); - } - return net::NetworkChangeNotifier::IsConnectionCellular( - net::NetworkChangeNotifier::GetConnectionType()); + return network::NetworkConnectionTracker::IsConnectionCellular( + connection_type_); } void DataUseMeasurement::OnConnectionChanged(
diff --git a/components/data_use_measurement/core/data_use_measurement.h b/components/data_use_measurement/core/data_use_measurement.h index 2e9daf1..8a46ebf 100644 --- a/components/data_use_measurement/core/data_use_measurement.h +++ b/components/data_use_measurement/core/data_use_measurement.h
@@ -17,25 +17,14 @@ #include "base/time/time.h" #include "build/build_config.h" #include "components/data_use_measurement/core/data_use_user_data.h" -#include "components/metrics/data_use_tracker.h" #include "services/network/public/cpp/network_connection_tracker.h" #if defined(OS_ANDROID) #include "base/android/application_status_listener.h" #endif -class GURL; - -namespace net { -class HttpResponseHeaders; -class URLRequest; -} - namespace data_use_measurement { -class DataUseAscriber; -class URLRequestClassifier; - // Records the data use of user traffic and various services in UMA histograms. // The UMA is broken down by network technology used (Wi-Fi vs cellular). On // Android, the UMA is further broken down by whether the application was in the @@ -64,36 +53,10 @@ static bool IsMetricsServiceRequest( int32_t network_traffic_annotation_hash_id); - // Returns the content-type saved in the request userdata when the response - // headers were received. - static DataUseUserData::DataUseContentType GetContentTypeForRequest( - const net::URLRequest& request); - DataUseMeasurement( - std::unique_ptr<URLRequestClassifier> url_request_classifier, - DataUseAscriber* ascriber, network::NetworkConnectionTracker* network_connection_tracker); ~DataUseMeasurement() override; - // Called before a request is sent. - void OnBeforeURLRequest(net::URLRequest* request); - - // Called right after a redirect response code was received for |request|. - void OnBeforeRedirect(const net::URLRequest& request, - const GURL& new_location); - - // Called when response headers are received for |request|. - void OnHeadersReceived(net::URLRequest* request, - const net::HttpResponseHeaders* response_headers); - - // Called when data is received or sent on the network, respectively. - void OnNetworkBytesReceived(const net::URLRequest& request, - int64_t bytes_received); - void OnNetworkBytesSent(const net::URLRequest& request, int64_t bytes_sent); - - // Indicates that |request| has been completed or failed. - void OnCompleted(const net::URLRequest& request, bool started); - #if defined(OS_ANDROID) // This function should just be used for testing purposes. A change in // application state can be simulated by calling this function. @@ -101,12 +64,6 @@ base::android::ApplicationState application_state); #endif - // Updates the data use to metrics service. |is_metrics_service_usage| - // indicates if the data use is from metrics component. - virtual void UpdateDataUseToMetricsService(int64_t total_bytes, - bool is_cellular, - bool is_metrics_service_usage) = 0; - void AddServicesDataUseObserver(ServicesDataUseObserver* observer); void RemoveServicesDataUseObserver(ServicesDataUseObserver* observer); @@ -184,16 +141,6 @@ base::android::ApplicationState application_state); #endif - // Records the data use of the |request|, thus |request| must be non-null. - // |dir| is the direction (which is upstream or downstream) and |bytes| is the - // number of bytes in the direction. - void ReportDataUseUMA(const net::URLRequest& request, - TrafficDirection dir, - int64_t bytes); - - // Reports the message size of the service requests. - void ReportServicesMessageSizeUMA(const net::URLRequest& request); - // Records data use histograms split on TrafficDirection, AppState and // TabState. void RecordTabStateHistogram(TrafficDirection dir, @@ -201,28 +148,10 @@ bool is_tab_visible, int64_t bytes) const; - // Records data use histograms split on page tranition. - void RecordPageTransitionUMA(const net::URLRequest& request) const; - - // Records data use histograms of user traffic and services traffic split on - // content type, AppState and TabState. - void RecordContentTypeHistogram( - DataUseUserData::DataUseContentType content_type, - bool is_user_traffic, - DataUseUserData::AppState app_state, - bool is_tab_visible, - int64_t bytes); - // NetworkConnectionObserver overrides void OnConnectionChanged( network::mojom::ConnectionType connection_type) override; - // Classifier for identifying if an URL request is user initiated. - std::unique_ptr<URLRequestClassifier> url_request_classifier_; - - // DataUseAscriber used to get the attributes of data use. - DataUseAscriber* ascriber_; - #if defined(OS_ANDROID) // Application listener store the last known state of the application in this // field.
diff --git a/components/data_use_measurement/core/data_use_measurement_unittest.cc b/components/data_use_measurement/core/data_use_measurement_unittest.cc index ee0d3f60..e988254b 100644 --- a/components/data_use_measurement/core/data_use_measurement_unittest.cc +++ b/components/data_use_measurement/core/data_use_measurement_unittest.cc
@@ -10,19 +10,10 @@ #include "base/macros.h" #include "base/run_loop.h" #include "base/test/metrics/histogram_tester.h" -#include "base/test/scoped_task_environment.h" #include "build/build_config.h" -#include "components/data_use_measurement/core/data_use_ascriber.h" -#include "components/data_use_measurement/core/data_use_recorder.h" -#include "components/data_use_measurement/core/url_request_classifier.h" #include "net/base/network_change_notifier.h" -#include "net/base/request_priority.h" -#include "net/socket/socket_test_util.h" -#include "net/traffic_annotation/network_traffic_annotation_test_helper.h" -#include "net/url_request/url_request.h" -#include "net/url_request/url_request_test_util.h" +#include "services/network/test/test_network_connection_tracker.h" #include "testing/gtest/include/gtest/gtest.h" -#include "url/gurl.h" #if defined(OS_ANDROID) #include "base/android/application_status_listener.h" @@ -30,182 +21,44 @@ namespace data_use_measurement { -class TestURLRequestClassifier : public base::SupportsUserData::Data, - public URLRequestClassifier { - public: - static const void* const kUserDataKey; - - TestURLRequestClassifier() : content_type_(DataUseUserData::OTHER) {} - - DataUseUserData::DataUseContentType GetContentType( - const net::URLRequest& request, - const net::HttpResponseHeaders& response_headers) const override { - return content_type_; - } - - void set_content_type(DataUseUserData::DataUseContentType content_type) { - content_type_ = content_type; - } - - void RecordPageTransitionUMA(uint64_t page_transition, - int64_t received_bytes) const override {} - - bool IsFavIconRequest(const net::URLRequest& request) const override { - return false; - } - - private: - DataUseUserData::DataUseContentType content_type_; -}; - -class TestDataUseAscriber : public DataUseAscriber { - public: - TestDataUseAscriber() : recorder_(DataUse::TrafficType::USER_TRAFFIC) {} - - DataUseRecorder* GetOrCreateDataUseRecorder( - net::URLRequest* request) override { - return &recorder_; - } - - DataUseRecorder* GetDataUseRecorder(const net::URLRequest& request) override { - return &recorder_; - } - - std::unique_ptr<net::NetworkDelegate> CreateNetworkDelegate( - std::unique_ptr<net::NetworkDelegate> wrapped_network_delegate) override { - return nullptr; - } - - std::unique_ptr<URLRequestClassifier> CreateURLRequestClassifier() - const override { - return nullptr; - } - - void SetTabVisibility(bool visible) { recorder_.set_is_visible(visible); } - - private: - DataUseRecorder recorder_; -}; - -class TestDataUseMeasurement : public DataUseMeasurement { - public: - TestDataUseMeasurement( - std::unique_ptr<URLRequestClassifier> url_request_classifier, - DataUseAscriber* ascriber) - : DataUseMeasurement(std::move(url_request_classifier), - ascriber, - nullptr) {} - - void UpdateDataUseToMetricsService(int64_t total_bytes, - bool is_cellular, - bool is_metrics_service_usage) override { - is_data_use_forwarder_called_ = true; - } - - bool is_data_use_forwarder_called_ = false; -}; - -// The more usual initialization of kUserDataKey would be along the lines of -// const void* const TestURLRequestClassifier::kUserDataKey = -// &TestURLRequestClassifier::kUserDataKey; -// but lld's identical constant folding then folds that with -// DataUseUserData::kUserDataKey which is initialized like that as well, and -// then TestURLRequestClassifier::IsUserRequest() starts classifying service -// requests as user requests. To work around this, make -// TestURLRequestClassifier::kUserDataKey point to an arbitrary integer -// instead. -// TODO(thakis): If we changed lld to only ICF over code and not over data, -// we could undo this again. -const int kICFBuster = 12345634; - -// static -const void* const TestURLRequestClassifier::kUserDataKey = &kICFBuster; - class DataUseMeasurementTest : public testing::Test { public: DataUseMeasurementTest() - : url_request_classifier_(new TestURLRequestClassifier()), - data_use_measurement_( - std::unique_ptr<URLRequestClassifier>(url_request_classifier_), - &ascriber_) { + : data_use_measurement_( + network::TestNetworkConnectionTracker::GetInstance()) { // During the test it is expected to not have cellular connection. DCHECK(!net::NetworkChangeNotifier::IsConnectionCellular( net::NetworkChangeNotifier::GetConnectionType())); } - // Creates a test request. - enum RequestKind { kServiceRequest, kUserRequest }; - std::unique_ptr<net::URLRequest> CreateTestRequest( - RequestKind is_user_request) { - net::TestDelegate test_delegate; - InitializeContext(); - net::MockRead reads[] = {net::MockRead("HTTP/1.1 200 OK\r\n" - "Content-Length: 12\r\n\r\n"), - net::MockRead("Test Content")}; - net::StaticSocketDataProvider socket_data(reads, - base::span<net::MockWrite>()); - socket_factory_->AddSocketDataProvider(&socket_data); - - const auto traffic_annotation = - (is_user_request == kServiceRequest) - ? TRAFFIC_ANNOTATION_FOR_TESTS - : net::DefineNetworkTrafficAnnotation("blink_resource_loader", - "blink resource loaded will " - "be treated as " - "user-initiated request"); - - std::unique_ptr<net::URLRequest> request( - context_->CreateRequest(GURL("http://foo.com"), net::DEFAULT_PRIORITY, - &test_delegate, traffic_annotation)); - if (is_user_request == kServiceRequest) { - request->SetUserData( - data_use_measurement::DataUseUserData::kUserDataKey, - std::make_unique<data_use_measurement::DataUseUserData>( - data_use_measurement_.CurrentAppState())); - } - - request->Start(); - base::RunLoop().RunUntilIdle(); - return request; - } - - // Sends a request and reports data use attaching either user data or service - // data based on |is_user_request|. - void SendRequest(RequestKind is_user_request) { - std::unique_ptr<net::URLRequest> request = - CreateTestRequest(is_user_request); - data_use_measurement_.OnBeforeURLRequest(request.get()); - data_use_measurement_.OnNetworkBytesReceived(*request, 1000); - data_use_measurement_.OnNetworkBytesSent(*request, 100); - data_use_measurement_.OnCompleted(*request, true); - } - // This function makes a user request and confirms that its effect is // reflected in proper histograms. void TestForAUserRequest(const std::string& target_dimension) { base::HistogramTester histogram_tester; - SendRequest(kUserRequest); + data_use_measurement_.RecordTrafficSizeMetric( + true /* is_user_traffic */, true /* is_downstream */, + true /* is_tab_visible */, 5 /* bytest */); + data_use_measurement_.RecordTrafficSizeMetric( + true /* is_user_traffic */, false /* is_downstream */, + true /* is_tab_visible */, 5 /* bytest */); histogram_tester.ExpectTotalCount("DataUse.TrafficSize.User.Downstream." + target_dimension + kConnectionType, 1); histogram_tester.ExpectTotalCount("DataUse.TrafficSize.User.Upstream." + target_dimension + kConnectionType, 1); - histogram_tester.ExpectTotalCount( - "DataUse.MessageSize.AllServices.Upstream." + target_dimension + - kConnectionType, - 0); - histogram_tester.ExpectTotalCount( - "DataUse.MessageSize.AllServices.Downstream." + target_dimension + - kConnectionType, - 0); } // This function makes a service request and confirms that its effect is // reflected in proper histograms. void TestForAServiceRequest(const std::string& target_dimension) { base::HistogramTester histogram_tester; - SendRequest(kServiceRequest); + data_use_measurement_.RecordTrafficSizeMetric( + false /* is_user_traffic */, true /* is_downstream */, + true /* is_tab_visible */, 5 /* bytest */); + data_use_measurement_.RecordTrafficSizeMetric( + false /* is_user_traffic */, false /* is_downstream */, + true /* is_tab_visible */, 5 /* bytest */); histogram_tester.ExpectTotalCount("DataUse.TrafficSize.System.Downstream." + target_dimension + kConnectionType, 1); @@ -216,27 +69,8 @@ DataUseMeasurement* data_use_measurement() { return &data_use_measurement_; } - bool IsDataUseForwarderCalled() { - return data_use_measurement_.is_data_use_forwarder_called_; - } - protected: - void InitializeContext() { - context_.reset(new net::TestURLRequestContext(true)); - socket_factory_.reset(new net::MockClientSocketFactory()); - context_->set_client_socket_factory(socket_factory_.get()); - context_->Init(); - } - - base::test::ScopedTaskEnvironment task_environment_{ - base::test::ScopedTaskEnvironment::MainThreadType::IO}; - - TestDataUseAscriber ascriber_; - TestURLRequestClassifier* url_request_classifier_; - TestDataUseMeasurement data_use_measurement_; - - std::unique_ptr<net::MockClientSocketFactory> socket_factory_; - std::unique_ptr<net::TestURLRequestContext> context_; + DataUseMeasurement data_use_measurement_; const std::string kConnectionType = "NotCellular"; DISALLOW_COPY_AND_ASSIGN(DataUseMeasurementTest); @@ -268,243 +102,4 @@ } #endif -TEST_F(DataUseMeasurementTest, DataUseForwarderIsCalled) { - EXPECT_FALSE(IsDataUseForwarderCalled()); - SendRequest(kUserRequest); - EXPECT_TRUE(IsDataUseForwarderCalled()); -} - -#if defined(OS_ANDROID) -TEST_F(DataUseMeasurementTest, TimeOfBackgroundDownstreamBytes) { - { - std::unique_ptr<net::URLRequest> request = CreateTestRequest(kUserRequest); - data_use_measurement_.OnBeforeURLRequest(request.get()); - base::HistogramTester histogram_tester; - data_use_measurement()->OnApplicationStateChangeForTesting( - base::android::APPLICATION_STATE_HAS_RUNNING_ACTIVITIES); - data_use_measurement_.OnNetworkBytesSent(*request, 100); - data_use_measurement_.OnNetworkBytesReceived(*request, 1000); - data_use_measurement_.OnNetworkBytesSent(*request, 200); - data_use_measurement_.OnNetworkBytesReceived(*request, 2000); - histogram_tester.ExpectTotalCount( - "DataUse.BackgroundToDataRecievedPerByte.User", 0); - histogram_tester.ExpectTotalCount( - "DataUse.BackgroundToFirstDownstream.User", 0); - } - - { - // Create new request when app is in foreground.. - base::HistogramTester histogram_tester; - std::unique_ptr<net::URLRequest> request = CreateTestRequest(kUserRequest); - data_use_measurement_.OnBeforeURLRequest(request.get()); - data_use_measurement_.OnNetworkBytesSent(*request, 100); - data_use_measurement_.OnNetworkBytesReceived(*request, 1000); - data_use_measurement_.OnNetworkBytesSent(*request, 200); - data_use_measurement_.OnNetworkBytesReceived(*request, 2000); - histogram_tester.ExpectTotalCount( - "DataUse.BackgroundToDataRecievedPerByte.User", 0); - histogram_tester.ExpectTotalCount( - "DataUse.BackgroundToFirstDownstream.User", 0); - } - - { - std::unique_ptr<net::URLRequest> request = CreateTestRequest(kUserRequest); - data_use_measurement_.OnBeforeURLRequest(request.get()); - base::HistogramTester histogram_tester; - data_use_measurement()->OnApplicationStateChangeForTesting( - base::android::APPLICATION_STATE_HAS_STOPPED_ACTIVITIES); - data_use_measurement_.OnNetworkBytesSent(*request, 100); - data_use_measurement_.OnNetworkBytesReceived(*request, 1000); - data_use_measurement_.OnNetworkBytesSent(*request, 200); - data_use_measurement_.OnNetworkBytesReceived(*request, 2000); - histogram_tester.ExpectTotalCount( - "DataUse.BackgroundToDataRecievedPerByte.User", 3000); - histogram_tester.ExpectTotalCount( - "DataUse.BackgroundToFirstDownstream.User", 1); - } - - { - // Create new request when app is in background. - base::HistogramTester histogram_tester; - std::unique_ptr<net::URLRequest> request = CreateTestRequest(kUserRequest); - data_use_measurement_.OnBeforeURLRequest(request.get()); - data_use_measurement_.OnNetworkBytesSent(*request, 100); - data_use_measurement_.OnNetworkBytesReceived(*request, 1000); - data_use_measurement_.OnNetworkBytesSent(*request, 200); - data_use_measurement_.OnNetworkBytesReceived(*request, 2000); - histogram_tester.ExpectTotalCount( - "DataUse.BackgroundToDataRecievedPerByte.User", 3000); - histogram_tester.ExpectTotalCount( - "DataUse.BackgroundToFirstDownstream.User", 0); - } - - { - // Create new request when app is in background. - base::HistogramTester histogram_tester; - std::unique_ptr<net::URLRequest> request = - CreateTestRequest(kServiceRequest); - data_use_measurement_.OnBeforeURLRequest(request.get()); - data_use_measurement_.OnNetworkBytesSent(*request, 100); - data_use_measurement_.OnNetworkBytesReceived(*request, 1000); - data_use_measurement_.OnNetworkBytesSent(*request, 200); - data_use_measurement_.OnNetworkBytesReceived(*request, 2000); - histogram_tester.ExpectTotalCount( - "DataUse.BackgroundToDataRecievedPerByte.System", 3000); - histogram_tester.ExpectTotalCount( - "DataUse.BackgroundToDataRecievedPerByte.User", 0); - histogram_tester.ExpectTotalCount( - "DataUse.BackgroundToFirstDownstream.System", 0); - histogram_tester.ExpectTotalCount( - "DataUse.BackgroundToFirstDownstream.User", 0); - } - - { - std::unique_ptr<net::URLRequest> request = CreateTestRequest(kUserRequest); - data_use_measurement_.OnBeforeURLRequest(request.get()); - base::HistogramTester histogram_tester; - data_use_measurement()->OnApplicationStateChangeForTesting( - base::android::APPLICATION_STATE_HAS_RUNNING_ACTIVITIES); - data_use_measurement_.OnNetworkBytesSent(*request, 100); - data_use_measurement_.OnNetworkBytesReceived(*request, 1000); - data_use_measurement_.OnNetworkBytesSent(*request, 200); - data_use_measurement_.OnNetworkBytesReceived(*request, 2000); - histogram_tester.ExpectTotalCount( - "DataUse.BackgroundToDataRecievedPerByte.User", 0); - histogram_tester.ExpectTotalCount( - "DataUse.BackgroundToFirstDownstream.User", 0); - } -} - -TEST_F(DataUseMeasurementTest, AppTabState) { - base::HistogramTester histogram_tester; - std::unique_ptr<net::URLRequest> request = CreateTestRequest(kUserRequest); - - // App in foreground, Tab in background. - data_use_measurement_.OnBeforeURLRequest(request.get()); - data_use_measurement_.OnNetworkBytesReceived(*request, 1000); - data_use_measurement_.OnNetworkBytesSent(*request, 100); - - histogram_tester.ExpectTotalCount( - "DataUse.AppTabState.Upstream.AppForeground.TabBackground", 1); - histogram_tester.ExpectTotalCount( - "DataUse.AppTabState.Downstream.AppForeground.TabBackground", 1); - - // App and Tab in foreground. - ascriber_.SetTabVisibility(true); - data_use_measurement_.OnBeforeURLRequest(request.get()); - data_use_measurement_.OnNetworkBytesReceived(*request, 1000); - data_use_measurement_.OnNetworkBytesSent(*request, 100); - - histogram_tester.ExpectTotalCount( - "DataUse.AppTabState.Upstream.AppForeground.TabForeground", 1); - histogram_tester.ExpectTotalCount( - "DataUse.AppTabState.Downstream.AppForeground.TabForeground", 1); - - // App and Tab in background. - data_use_measurement()->OnApplicationStateChangeForTesting( - base::android::APPLICATION_STATE_HAS_STOPPED_ACTIVITIES); - ascriber_.SetTabVisibility(false); - data_use_measurement_.OnBeforeURLRequest(request.get()); - // First network access changes the app state to UNKNOWN and the next nextwork - // access changes to BACKGROUND. - data_use_measurement_.OnNetworkBytesReceived(*request, 1000); - data_use_measurement_.OnNetworkBytesSent(*request, 100); - - histogram_tester.ExpectTotalCount( - "DataUse.AppTabState.Upstream.AppBackground", 1); - histogram_tester.ExpectTotalCount( - "DataUse.AppTabState.Downstream.AppBackground", 1); -} - -TEST_F(DataUseMeasurementTest, ContentType) { - { - base::HistogramTester histogram_tester; - std::unique_ptr<net::URLRequest> request = CreateTestRequest(kUserRequest); - data_use_measurement_.OnBeforeURLRequest(request.get()); - data_use_measurement_.OnNetworkBytesReceived(*request, 10 * 1024); - histogram_tester.ExpectUniqueSample("DataUse.ContentType.UserTrafficKB", - DataUseUserData::OTHER, 10); - } - - { - base::HistogramTester histogram_tester; - std::unique_ptr<net::URLRequest> request = - CreateTestRequest(kServiceRequest); - data_use_measurement_.OnBeforeURLRequest(request.get()); - data_use_measurement_.OnNetworkBytesReceived(*request, 1024); - histogram_tester.ExpectUniqueSample("DataUse.ContentType.ServicesKB", - DataUseUserData::OTHER, 1); - } - - // Video request in foreground. - { - base::HistogramTester histogram_tester; - std::unique_ptr<net::URLRequest> request = CreateTestRequest(kUserRequest); - - ascriber_.SetTabVisibility(true); - url_request_classifier_->set_content_type(DataUseUserData::VIDEO); - data_use_measurement_.OnBeforeURLRequest(request.get()); - data_use_measurement_.OnHeadersReceived(request.get(), nullptr); - data_use_measurement_.OnNetworkBytesReceived(*request, 10 * 1024); - - histogram_tester.ExpectUniqueSample("DataUse.ContentType.UserTrafficKB", - DataUseUserData::VIDEO, 10); - } - - // Audio request from background tab. - { - base::HistogramTester histogram_tester; - std::unique_ptr<net::URLRequest> request = CreateTestRequest(kUserRequest); - ascriber_.SetTabVisibility(false); - url_request_classifier_->set_content_type(DataUseUserData::AUDIO); - data_use_measurement_.OnBeforeURLRequest(request.get()); - data_use_measurement_.OnHeadersReceived(request.get(), nullptr); - data_use_measurement_.OnNetworkBytesReceived(*request, 10 * 1024); - - histogram_tester.ExpectUniqueSample("DataUse.ContentType.UserTrafficKB", - DataUseUserData::AUDIO_TABBACKGROUND, - 10); - } - - // Video request from background app. - { - base::HistogramTester histogram_tester; - std::unique_ptr<net::URLRequest> request = CreateTestRequest(kUserRequest); - url_request_classifier_->set_content_type(DataUseUserData::VIDEO); - data_use_measurement()->OnApplicationStateChangeForTesting( - base::android::APPLICATION_STATE_HAS_STOPPED_ACTIVITIES); - ascriber_.SetTabVisibility(false); - data_use_measurement_.OnBeforeURLRequest(request.get()); - data_use_measurement_.OnHeadersReceived(request.get(), nullptr); - data_use_measurement_.OnNetworkBytesReceived(*request, 10 * 1024); - - histogram_tester.ExpectUniqueSample("DataUse.ContentType.UserTrafficKB", - DataUseUserData::VIDEO_APPBACKGROUND, - 10); - } -} - -TEST_F(DataUseMeasurementTest, ContentTypeInKB) { - base::HistogramTester histogram_tester; - std::unique_ptr<net::URLRequest> request = CreateTestRequest(kUserRequest); - url_request_classifier_->set_content_type(DataUseUserData::VIDEO); - data_use_measurement()->OnApplicationStateChangeForTesting( - base::android::APPLICATION_STATE_HAS_STOPPED_ACTIVITIES); - ascriber_.SetTabVisibility(false); - data_use_measurement_.OnBeforeURLRequest(request.get()); - data_use_measurement_.OnHeadersReceived(request.get(), nullptr); - data_use_measurement_.OnNetworkBytesReceived(*request, 1024); - - // UserTrafficKB metric is recorded for the first 1KB of data use. - histogram_tester.ExpectTotalCount("DataUse.ContentType.UserTrafficKB", 1); - - data_use_measurement_.OnNetworkBytesReceived(*request, 3 * 1024); - - // UserTrafficKB recorded for the total 4KB. - histogram_tester.ExpectUniqueSample("DataUse.ContentType.UserTrafficKB", - DataUseUserData::VIDEO_APPBACKGROUND, 4); -} - -#endif - } // namespace data_use_measurement
diff --git a/components/data_use_measurement/core/data_use_network_delegate.cc b/components/data_use_measurement/core/data_use_network_delegate.cc deleted file mode 100644 index b741a95..0000000 --- a/components/data_use_measurement/core/data_use_network_delegate.cc +++ /dev/null
@@ -1,77 +0,0 @@ -// Copyright 2016 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/data_use_measurement/core/data_use_network_delegate.h" - -#include <memory> -#include <utility> - -#include "base/feature_list.h" -#include "components/data_use_measurement/core/data_use_ascriber.h" -#include "components/data_use_measurement/core/url_request_classifier.h" -#include "net/url_request/url_request.h" -#include "services/network/public/cpp/features.h" - -namespace data_use_measurement { -DataUseNetworkDelegate::DataUseNetworkDelegate( - std::unique_ptr<NetworkDelegate> nested_network_delegate, - DataUseAscriber* ascriber, - std::unique_ptr<DataUseMeasurement> data_use_measurement) - : net::LayeredNetworkDelegate(std::move(nested_network_delegate)), - ascriber_(ascriber), - data_use_measurement_(std::move(data_use_measurement)) { - DCHECK(ascriber); - DCHECK(!base::FeatureList::IsEnabled(network::features::kNetworkService)); -} - -DataUseNetworkDelegate::~DataUseNetworkDelegate() {} - -void DataUseNetworkDelegate::OnBeforeURLRequestInternal( - net::URLRequest* request, - GURL* new_url) { - ascriber_->OnBeforeUrlRequest(request); - data_use_measurement_->OnBeforeURLRequest(request); -} - -void DataUseNetworkDelegate::OnBeforeRedirectInternal( - net::URLRequest* request, - const GURL& new_location) { - data_use_measurement_->OnBeforeRedirect(*request, new_location); -} - -void DataUseNetworkDelegate::OnHeadersReceivedInternal( - net::URLRequest* request, - const net::HttpResponseHeaders* original_response_headers, - scoped_refptr<net::HttpResponseHeaders>* override_response_headers, - GURL* allowed_unsafe_redirect_url) { - data_use_measurement_->OnHeadersReceived(request, original_response_headers); -} - -void DataUseNetworkDelegate::OnNetworkBytesReceivedInternal( - net::URLRequest* request, - int64_t bytes_received) { - ascriber_->OnNetworkBytesReceived(request, bytes_received); - data_use_measurement_->OnNetworkBytesReceived(*request, bytes_received); -} - -void DataUseNetworkDelegate::OnNetworkBytesSentInternal( - net::URLRequest* request, - int64_t bytes_sent) { - ascriber_->OnNetworkBytesSent(request, bytes_sent); - data_use_measurement_->OnNetworkBytesSent(*request, bytes_sent); -} - -void DataUseNetworkDelegate::OnCompletedInternal(net::URLRequest* request, - bool started, - int net_error) { - ascriber_->OnUrlRequestCompleted(request, started); - data_use_measurement_->OnCompleted(*request, started); -} - -void DataUseNetworkDelegate::OnURLRequestDestroyedInternal( - net::URLRequest* request) { - ascriber_->OnUrlRequestDestroyed(request); -} - -} // namespace data_use_measurement
diff --git a/components/data_use_measurement/core/data_use_network_delegate.h b/components/data_use_measurement/core/data_use_network_delegate.h deleted file mode 100644 index d66ee1b7..0000000 --- a/components/data_use_measurement/core/data_use_network_delegate.h +++ /dev/null
@@ -1,72 +0,0 @@ -// Copyright 2016 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_DATA_USE_MEASUREMENT_CORE_DATA_USE_NETWORK_DELEGATE_H_ -#define COMPONENTS_DATA_USE_MEASUREMENT_CORE_DATA_USE_NETWORK_DELEGATE_H_ - -#include <stdint.h> - -#include <memory> - -#include "base/macros.h" -#include "components/data_use_measurement/core/data_use_measurement.h" -#include "net/base/layered_network_delegate.h" - -namespace net { -class NetworkDelegate; -class URLRequest; -} - -namespace data_use_measurement { - -class DataUseAscriber; - -// Propagates network data use events to the |ascriber_|. This class must be -// set up as a network delegate for the URLRequestContexts whose data use is to -// be tracked. -class DataUseNetworkDelegate : public net::LayeredNetworkDelegate { - public: - DataUseNetworkDelegate( - std::unique_ptr<net::NetworkDelegate> nested_network_delegate, - DataUseAscriber* ascriber, - std::unique_ptr<DataUseMeasurement> data_use_measurement); - - ~DataUseNetworkDelegate() override; - - // LayeredNetworkDelegate: - void OnBeforeURLRequestInternal(net::URLRequest* request, - GURL* new_url) override; - - void OnBeforeRedirectInternal(net::URLRequest* request, - const GURL& new_location) override; - - void OnHeadersReceivedInternal( - net::URLRequest* request, - const net::HttpResponseHeaders* original_response_headers, - scoped_refptr<net::HttpResponseHeaders>* override_response_headers, - GURL* allowed_unsafe_redirect_url) override; - - void OnNetworkBytesReceivedInternal(net::URLRequest* request, - int64_t bytes_received) override; - - void OnNetworkBytesSentInternal(net::URLRequest* request, - int64_t bytes_sent) override; - - void OnCompletedInternal(net::URLRequest* request, - bool started, - int net_error) override; - - void OnURLRequestDestroyedInternal(net::URLRequest* request) override; - - private: - DataUseAscriber* ascriber_; - - // Component to report data use UMA. - std::unique_ptr<data_use_measurement::DataUseMeasurement> - data_use_measurement_; -}; - -} // namespace data_use_measurement - -#endif // COMPONENTS_DATA_USE_MEASUREMENT_CORE_DATA_USE_NETWORK_DELEGATE_H_
diff --git a/components/data_use_measurement/core/data_use_network_delegate_unittest.cc b/components/data_use_measurement/core/data_use_network_delegate_unittest.cc deleted file mode 100644 index 13bf49c..0000000 --- a/components/data_use_measurement/core/data_use_network_delegate_unittest.cc +++ /dev/null
@@ -1,260 +0,0 @@ -// Copyright 2016 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/data_use_measurement/core/data_use_network_delegate.h" - -#include <memory> - -#include "base/run_loop.h" -#include "base/test/metrics/histogram_tester.h" -#include "base/test/scoped_task_environment.h" -#include "components/data_use_measurement/core/data_use_ascriber.h" -#include "components/data_use_measurement/core/url_request_classifier.h" -#include "components/metrics/data_use_tracker.h" -#include "net/socket/socket_test_util.h" -#include "net/traffic_annotation/network_traffic_annotation_test_helper.h" -#include "net/url_request/url_request.h" -#include "net/url_request/url_request_test_util.h" -#include "testing/gtest/include/gtest/gtest.h" -#include "url/gurl.h" - -namespace data_use_measurement { - -namespace { - -class TestURLRequestClassifier : public base::SupportsUserData::Data, - public URLRequestClassifier { - public: - static const void* const kUserDataKey; - - DataUseUserData::DataUseContentType GetContentType( - const net::URLRequest& request, - const net::HttpResponseHeaders& response_headers) const override { - return DataUseUserData::OTHER; - } - - void RecordPageTransitionUMA(uint64_t page_transition, - int64_t received_bytes) const override {} - - bool IsFavIconRequest(const net::URLRequest& request) const override { - return false; - } -}; - -class TestDataUseAscriber : public DataUseAscriber { - public: - TestDataUseAscriber() {} - - DataUseRecorder* GetOrCreateDataUseRecorder( - net::URLRequest* request) override { - return nullptr; - } - DataUseRecorder* GetDataUseRecorder(const net::URLRequest& request) override { - return nullptr; - } - - std::unique_ptr<net::NetworkDelegate> CreateNetworkDelegate( - std::unique_ptr<net::NetworkDelegate> wrapped_network_delegate) override { - return nullptr; - } - - std::unique_ptr<URLRequestClassifier> CreateURLRequestClassifier() - const override { - return nullptr; - } -}; - -class TestDataUseMeasurement : public DataUseMeasurement { - public: - TestDataUseMeasurement( - std::unique_ptr<URLRequestClassifier> url_request_classifier, - DataUseAscriber* ascriber) - : DataUseMeasurement(std::move(url_request_classifier), - ascriber, - nullptr) {} - - void UpdateDataUseToMetricsService(int64_t total_bytes, - bool is_cellular, - bool is_metrics_service_usage) override {} -}; - -// static -const void* const TestURLRequestClassifier::kUserDataKey = - &TestURLRequestClassifier::kUserDataKey; - -// This function requests a URL, and makes it return a known response. If -// |from_user| is true, it attaches a ResourceRequestInfo to the URLRequest, -// because requests from users have this info. If |from_user| is false, the -// request is presumed to be from a service, and the service name is set in the -// request's user data. (As an example suggestions service tag is attached). if -// |redirect| is true, it adds necessary socket data to have it follow redirect -// before getting the final response. -std::unique_ptr<net::URLRequest> RequestURL( - net::URLRequestContext* context, - net::MockClientSocketFactory* socket_factory, - bool from_user, - bool redirect) { - net::MockRead redirect_mock_reads[] = { - net::MockRead("HTTP/1.1 302 Found\r\n" - "Location: http://bar.com/\r\n\r\n"), - net::MockRead(net::SYNCHRONOUS, net::OK), - }; - net::StaticSocketDataProvider redirect_socket_data_provider( - redirect_mock_reads, base::span<net::MockWrite>()); - - if (redirect) - socket_factory->AddSocketDataProvider(&redirect_socket_data_provider); - net::MockRead response_mock_reads[] = { - net::MockRead("HTTP/1.1 200 OK\r\n\r\n"), - net::MockRead("response body"), - net::MockRead(net::SYNCHRONOUS, net::OK), - }; - const auto traffic_annotation = - from_user ? net::DefineNetworkTrafficAnnotation("blink_resource_loader", - "blink resource loaded " - "will be treated as " - "user-initiated request") - : TRAFFIC_ANNOTATION_FOR_TESTS; - net::StaticSocketDataProvider response_socket_data_provider( - response_mock_reads, base::span<net::MockWrite>()); - socket_factory->AddSocketDataProvider(&response_socket_data_provider); - net::TestDelegate test_delegate; - std::unique_ptr<net::URLRequest> request( - context->CreateRequest(GURL("http://example.com"), net::DEFAULT_PRIORITY, - &test_delegate, traffic_annotation)); - - if (!from_user) { - request->SetUserData( - data_use_measurement::DataUseUserData::kUserDataKey, - std::make_unique<data_use_measurement::DataUseUserData>( - data_use_measurement::DataUseUserData::FOREGROUND)); - } - request->Start(); - test_delegate.RunUntilComplete(); - return request; -} - -class DataUseNetworkDelegateTest : public testing::Test { - public: - DataUseNetworkDelegateTest() - : context_(true), - data_use_network_delegate_( - std::make_unique<net::TestNetworkDelegate>(), - &test_data_use_ascriber_, - std::make_unique<TestDataUseMeasurement>( - std::make_unique<TestURLRequestClassifier>(), - &test_data_use_ascriber_)) { - context_.set_client_socket_factory(&mock_socket_factory_); - context_.set_network_delegate(&data_use_network_delegate_); - context_.Init(); - } - - net::TestURLRequestContext* context() { return &context_; } - net::MockClientSocketFactory* socket_factory() { - return &mock_socket_factory_; - } - - private: - base::test::ScopedTaskEnvironment task_environment_{ - base::test::ScopedTaskEnvironment::MainThreadType::IO}; - net::MockClientSocketFactory mock_socket_factory_; - net::TestURLRequestContext context_; - TestDataUseAscriber test_data_use_ascriber_; - DataUseNetworkDelegate data_use_network_delegate_; -}; - -// This function tests data use measurement for requests by services. it makes a -// query which is similar to a query of a service, so it should affect -// DataUse.TrafficSize.System.Dimensions histogram. AppState and ConnectionType -// dimensions are always Foreground and NotCellular respectively. -TEST_F(DataUseNetworkDelegateTest, DataUseMeasurementServiceTest) { - base::HistogramTester histogram_tester; - - // A query from a service without redirection. - RequestURL(context(), socket_factory(), false, false); - EXPECT_FALSE( - histogram_tester - .GetTotalCountsForPrefix( - "DataUse.TrafficSize.System.Downstream.Foreground.NotCellular") - .empty()); - histogram_tester.ExpectTotalCount( - "DataUse.TrafficSize.System.Upstream.Foreground.NotCellular", 1); - histogram_tester.ExpectTotalCount( - "DataUse.TrafficSize.User.Downstream.Foreground.NotCellular", 0); - histogram_tester.ExpectTotalCount( - "DataUse.TrafficSize.User.Upstream.Foreground.NotCellular", 0); -} - -// This function tests data use measurement for requests by user.The query from -// a user should affect DataUse.TrafficSize.User.Dimensions histogram. AppState -// and ConnectionType dimensions are always Foreground and NotCellular -// respectively. -TEST_F(DataUseNetworkDelegateTest, DataUseMeasurementUserTest) { - base::HistogramTester histogram_tester; - - // A query from user without redirection. - RequestURL(context(), socket_factory(), true, false); - EXPECT_FALSE( - histogram_tester - .GetTotalCountsForPrefix( - "DataUse.TrafficSize.User.Downstream.Foreground.NotCellular") - .empty()); - histogram_tester.ExpectTotalCount( - "DataUse.TrafficSize.User.Upstream.Foreground.NotCellular", 1); - histogram_tester.ExpectTotalCount( - "DataUse.TrafficSize.System.Downstream.Foreground.NotCellular", 0); - histogram_tester.ExpectTotalCount( - "DataUse.TrafficSize.System.Upstream.Foreground.NotCellular", 0); -} - -// This function tests data use measurement for requests by services in case the -// request is redirected once. it makes a query which is similar to a query of a -// service, so it should affect DataUse.TrafficSize.System.Dimensions and -// histogram. AppState and ConnectionType dimensions are always Foreground and -// NotCellular respectively. -TEST_F(DataUseNetworkDelegateTest, DataUseMeasurementServiceTestWithRedirect) { - base::HistogramTester histogram_tester; - - // A query from user with one redirection. - RequestURL(context(), socket_factory(), false, true); - EXPECT_FALSE( - histogram_tester - .GetTotalCountsForPrefix( - "DataUse.TrafficSize.System.Downstream.Foreground.NotCellular") - .empty()); - histogram_tester.ExpectTotalCount( - "DataUse.TrafficSize.System.Upstream.Foreground.NotCellular", 2); - // Two uploads and two downloads message, so totalCount should be 4. - histogram_tester.ExpectTotalCount( - "DataUse.TrafficSize.User.Downstream.Foreground.NotCellular", 0); - histogram_tester.ExpectTotalCount( - "DataUse.TrafficSize.User.Upstream.Foreground.NotCellular", 0); -} - -// This function tests data use measurement for requests by user in case the -// request is redirected once.The query from a user should affect -// DataUse.TrafficSize.User.Dimensions histogram. AppState and ConnectionType -// dimensions are always Foreground and NotCellular respectively. -TEST_F(DataUseNetworkDelegateTest, DataUseMeasurementUserTestWithRedirect) { - base::HistogramTester histogram_tester; - - // A query from user with one redirection. - RequestURL(context(), socket_factory(), true, true); - - EXPECT_FALSE( - histogram_tester - .GetTotalCountsForPrefix( - "DataUse.TrafficSize.User.Downstream.Foreground.NotCellular") - .empty()); - histogram_tester.ExpectTotalCount( - "DataUse.TrafficSize.User.Upstream.Foreground.NotCellular", 2); - histogram_tester.ExpectTotalCount( - "DataUse.TrafficSize.System.Downstream.Foreground.NotCellular", 0); - histogram_tester.ExpectTotalCount( - "DataUse.TrafficSize.System.Upstream.Foreground.NotCellular", 0); -} - -} // namespace - -} // namespace data_use_measurement
diff --git a/components/data_use_measurement/core/data_use_recorder.cc b/components/data_use_measurement/core/data_use_recorder.cc deleted file mode 100644 index c4864e5..0000000 --- a/components/data_use_measurement/core/data_use_recorder.cc +++ /dev/null
@@ -1,90 +0,0 @@ -// Copyright 2016 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/data_use_measurement/core/data_use_recorder.h" - -#include "net/url_request/url_request.h" - -namespace data_use_measurement { - -DataUseRecorder::DataUseRecorder(DataUse::TrafficType traffic_type) - : main_url_request_(nullptr), data_use_(traffic_type), is_visible_(false) {} - -DataUseRecorder::~DataUseRecorder() {} - -bool DataUseRecorder::IsDataUseComplete() { - return pending_url_requests_.empty(); -} - -void DataUseRecorder::GetPendingURLRequests( - std::vector<net::URLRequest*>* requests) const { - // Reference to |pending_url_requests_| could be returned instead of copying - // to a vector. But that leads to issues when the caller calls other member - // functions that modify/erase the same map, while iterating. - requests->reserve(pending_url_requests_.size()); - for (const auto& request : pending_url_requests_) - requests->push_back(request.first); -} - -void DataUseRecorder::AddPendingURLRequest(net::URLRequest* request) { - pending_url_requests_.emplace(std::piecewise_construct, - std::forward_as_tuple(request), - std::forward_as_tuple()); -} - -void DataUseRecorder::OnUrlRequestDestroyed(net::URLRequest* request) { - pending_url_requests_.erase(request); -} - -void DataUseRecorder::MovePendingURLRequestTo(DataUseRecorder* other, - net::URLRequest* request) { - auto request_it = pending_url_requests_.find(request); - DCHECK(request_it != pending_url_requests_.end()); - DCHECK(other->pending_url_requests_.find(request) == - other->pending_url_requests_.end()); - - // Increment the bytes of the request in |other|, and decrement the bytes in - // |this|. - // TODO(rajendrant): Check if the moving the bytes in |data_use_| needs to be - // propogated to observers, which could store per-request user data. - other->AddPendingURLRequest(request); - other->UpdateNetworkByteCounts(request, request_it->second.bytes_received, - request_it->second.bytes_sent); - data_use_.IncrementTotalBytes(-request_it->second.bytes_received, - -request_it->second.bytes_sent); - pending_url_requests_.erase(request_it); -} - -base::TimeTicks DataUseRecorder::GetPendingURLRequestStartTime( - net::URLRequest* request) { - auto request_it = pending_url_requests_.find(request); - return request_it->second.started_time; -} - -void DataUseRecorder::RemoveAllPendingURLRequests() { - pending_url_requests_.clear(); -} - -void DataUseRecorder::OnBeforeUrlRequest(net::URLRequest* request) {} - -void DataUseRecorder::OnNetworkBytesReceived(net::URLRequest* request, - int64_t bytes_received) { - UpdateNetworkByteCounts(request, bytes_received, 0); -} - -void DataUseRecorder::OnNetworkBytesSent(net::URLRequest* request, - int64_t bytes_sent) { - UpdateNetworkByteCounts(request, 0, bytes_sent); -} - -void DataUseRecorder::UpdateNetworkByteCounts(net::URLRequest* request, - int64_t bytes_received, - int64_t bytes_sent) { - data_use_.IncrementTotalBytes(bytes_received, bytes_sent); - auto request_it = pending_url_requests_.find(request); - request_it->second.bytes_received += bytes_received; - request_it->second.bytes_sent += bytes_sent; -} - -} // namespace data_use_measurement
diff --git a/components/data_use_measurement/core/data_use_recorder.h b/components/data_use_measurement/core/data_use_recorder.h deleted file mode 100644 index aa2dedb..0000000 --- a/components/data_use_measurement/core/data_use_recorder.h +++ /dev/null
@@ -1,127 +0,0 @@ -// Copyright 2016 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_DATA_USE_MEASUREMENT_CORE_DATA_USE_RECORDER_H_ -#define COMPONENTS_DATA_USE_MEASUREMENT_CORE_DATA_USE_RECORDER_H_ - -#include <stdint.h> - -#include <map> -#include <vector> - -#include "base/macros.h" -#include "base/supports_user_data.h" -#include "base/time/time.h" -#include "components/data_use_measurement/core/data_use.h" -#include "net/base/net_export.h" - -namespace net { -class URLRequest; -} - -namespace data_use_measurement { - -// Tracks all network data used by a single high level entity. An entity -// can make multiple URLRequests, so there is a one:many relationship between -// DataUseRecorders and URLRequests. Data used by each URLRequest will be -// tracked by exactly one DataUseRecorder. -class DataUseRecorder { - public: - // Stores network data used by a URLRequest. - struct URLRequestDataUse { - URLRequestDataUse() - : bytes_received(0), - bytes_sent(0), - started_time(base::TimeTicks::Now()) {} - - int64_t bytes_received; - int64_t bytes_sent; - - // Time the request started and associated with the DataUseRecorder. - base::TimeTicks started_time; - - private: - DISALLOW_COPY_AND_ASSIGN(URLRequestDataUse); - }; - - explicit DataUseRecorder(DataUse::TrafficType traffic_type); - virtual ~DataUseRecorder(); - - // Returns the actual data used by the entity being tracked. - DataUse& data_use() { return data_use_; } - - const net::URLRequest* main_url_request() const { return main_url_request_; } - - void set_main_url_request(const net::URLRequest* request) { - main_url_request_ = request; - } - - bool is_visible() const { return is_visible_; } - - void set_is_visible(bool is_visible) { is_visible_ = is_visible; } - - uint64_t page_transition() const { return page_transition_; } - - void set_page_transition(uint64_t page_transition) { - page_transition_ = page_transition; - } - - // Returns whether data use is complete and no additional data can be used - // by the entity tracked by this recorder. For example, - bool IsDataUseComplete(); - - // Populate the pending requests to |requests|. - // Reference to the map is not returned since other member functions that - // modify/erase could be called while iterating. - void GetPendingURLRequests(std::vector<net::URLRequest*>* requests) const; - - // Adds |request| to the list of pending URLRequests that ascribe data use to - // this recorder. - void AddPendingURLRequest(net::URLRequest* request); - - // Moves pending |request| from |this| recorder to |other| recorder, and - // updates the data use for the recorders. - void MovePendingURLRequestTo(DataUseRecorder* other, - net::URLRequest* request); - - base::TimeTicks GetPendingURLRequestStartTime(net::URLRequest* request); - - // Clears the list of pending URLRequests that ascribe data use to this - // recorder. - void RemoveAllPendingURLRequests(); - - // Network Delegate methods: - void OnBeforeUrlRequest(net::URLRequest* request); - void OnUrlRequestDestroyed(net::URLRequest* request); - void OnNetworkBytesSent(net::URLRequest* request, int64_t bytes_sent); - void OnNetworkBytesReceived(net::URLRequest* request, int64_t bytes_received); - - private: - // Updates the network data use for the url request. - void UpdateNetworkByteCounts(net::URLRequest* request, - int64_t bytes_received, - int64_t bytes_sent); - - // Pending URLRequests whose data is being tracked by this DataUseRecorder. - std::map<net::URLRequest*, URLRequestDataUse> pending_url_requests_; - - // The main frame URLRequest for page loads. Null if this is not tracking a - // page load. - const net::URLRequest* main_url_request_; - - // The network data use measured by this DataUseRecorder. - DataUse data_use_; - - // Whether the entity that owns this data use is currently visible. - bool is_visible_; - - // ui::PageTransition casted as a uint64_t. - uint64_t page_transition_; - - DISALLOW_COPY_AND_ASSIGN(DataUseRecorder); -}; - -} // namespace data_use_measurement - -#endif // COMPONENTS_DATA_USE_MEASUREMENT_CORE_DATA_USE_RECORDER_H_
diff --git a/components/data_use_measurement/core/url_request_classifier.h b/components/data_use_measurement/core/url_request_classifier.h deleted file mode 100644 index 65a10894..0000000 --- a/components/data_use_measurement/core/url_request_classifier.h +++ /dev/null
@@ -1,41 +0,0 @@ -// Copyright 2016 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_DATA_USE_MEASUREMENT_CORE_URL_REQUEST_CLASSIFIER_H_ -#define COMPONENTS_DATA_USE_MEASUREMENT_CORE_URL_REQUEST_CLASSIFIER_H_ - -#include <stdint.h> - -#include "components/data_use_measurement/core/data_use_user_data.h" - -namespace net { -class HttpResponseHeaders; -class URLRequest; -} - -namespace data_use_measurement { - -// Interface for a classifier that can classify URL requests. -class URLRequestClassifier { - public: - virtual ~URLRequestClassifier() {} - - // Returns the content type of the URL request |request| with response headers - // |response_headers|. |is_app_foreground| and |is_tab_visible| indicate the - // current app and tab visibility state. - virtual DataUseUserData::DataUseContentType GetContentType( - const net::URLRequest& request, - const net::HttpResponseHeaders& response_headers) const = 0; - - // Records the page transition histograms. - virtual void RecordPageTransitionUMA(uint64_t page_transition, - int64_t received_bytes) const = 0; - - // Returns true if |request| is fetching a favicon. - virtual bool IsFavIconRequest(const net::URLRequest& request) const = 0; -}; - -} // namespace data_use_measurement - -#endif // COMPONENTS_DATA_USE_MEASUREMENT_CORE_URL_REQUEST_CLASSIFIER_H_
diff --git a/components/discardable_memory/service/discardable_shared_memory_manager.cc b/components/discardable_memory/service/discardable_shared_memory_manager.cc index 74900bd..293e678 100644 --- a/components/discardable_memory/service/discardable_shared_memory_manager.cc +++ b/components/discardable_memory/service/discardable_shared_memory_manager.cc
@@ -242,9 +242,12 @@ this); if (mojo_thread_message_loop_) { + // TODO(etiennep): Get rid of mojo_thread_message_loop_ entirely. + DCHECK(mojo_thread_task_runner_); if (mojo_thread_message_loop_ == base::MessageLoopCurrent::Get()) { mojo_thread_message_loop_->RemoveDestructionObserver(this); mojo_thread_message_loop_ = base::MessageLoopCurrent::GetNull(); + mojo_thread_task_runner_ = nullptr; } else { // If mojom::DiscardableSharedMemoryManager implementation is running in // another thread, we need invalidate all related weak ptrs on that @@ -252,7 +255,7 @@ base::WaitableEvent event( base::WaitableEvent::ResetPolicy::MANUAL, base::WaitableEvent::InitialState::NOT_SIGNALED); - bool result = mojo_thread_message_loop_->task_runner()->PostTask( + bool result = mojo_thread_task_runner_->PostTask( FROM_HERE, base::BindOnce( &DiscardableSharedMemoryManager::InvalidateMojoThreadWeakPtrs, @@ -269,9 +272,11 @@ const service_manager::BindSourceInfo& source_info) { DCHECK(!mojo_thread_message_loop_ || mojo_thread_message_loop_ == base::MessageLoopCurrent::Get()); - if (!mojo_thread_message_loop_) { + if (!mojo_thread_task_runner_) { + DCHECK(!mojo_thread_message_loop_); mojo_thread_message_loop_ = base::MessageLoopCurrent::Get(); mojo_thread_message_loop_->AddDestructionObserver(this); + mojo_thread_task_runner_ = base::ThreadTaskRunnerHandle::Get(); } mojo::MakeStrongBinding( @@ -406,8 +411,7 @@ void DiscardableSharedMemoryManager::WillDestroyCurrentMessageLoop() { // The mojo thead is going to be destroyed. We should invalidate all related // weak ptrs and remove the destrunction observer. - DCHECK( - mojo_thread_message_loop_->task_runner()->RunsTasksInCurrentSequence()); + DCHECK(mojo_thread_task_runner_->RunsTasksInCurrentSequence()); DLOG_IF(WARNING, mojo_thread_weak_ptr_factory_.HasWeakPtrs()) << "Some MojoDiscardableSharedMemoryManagerImpls are still alive. They " "will be leaked."; @@ -617,8 +621,7 @@ void DiscardableSharedMemoryManager::InvalidateMojoThreadWeakPtrs( base::WaitableEvent* event) { - DCHECK( - mojo_thread_message_loop_->task_runner()->RunsTasksInCurrentSequence()); + DCHECK(mojo_thread_task_runner_->RunsTasksInCurrentSequence()); mojo_thread_weak_ptr_factory_.InvalidateWeakPtrs(); mojo_thread_message_loop_->RemoveDestructionObserver(this); mojo_thread_message_loop_ = base::MessageLoopCurrent::GetNull();
diff --git a/components/discardable_memory/service/discardable_shared_memory_manager.h b/components/discardable_memory/service/discardable_shared_memory_manager.h index 7d779b5..b94f068 100644 --- a/components/discardable_memory/service/discardable_shared_memory_manager.h +++ b/components/discardable_memory/service/discardable_shared_memory_manager.h
@@ -23,6 +23,7 @@ #include "base/memory/weak_ptr.h" #include "base/message_loop/message_loop_current.h" #include "base/process/process_handle.h" +#include "base/single_thread_task_runner.h" #include "base/synchronization/lock.h" #include "base/threading/thread_task_runner_handle.h" #include "base/trace_event/memory_dump_provider.h" @@ -164,6 +165,7 @@ // A prerequisite for this is allowing objects to be bound to the lifetime // of a sequence directly. base::MessageLoopCurrent mojo_thread_message_loop_; + scoped_refptr<base::SingleThreadTaskRunner> mojo_thread_task_runner_; base::WeakPtrFactory<DiscardableSharedMemoryManager> weak_ptr_factory_;
diff --git a/components/domain_reliability/quic_error_mapping.cc b/components/domain_reliability/quic_error_mapping.cc index bda89eb4..93e58fd 100644 --- a/components/domain_reliability/quic_error_mapping.cc +++ b/components/domain_reliability/quic_error_mapping.cc
@@ -175,8 +175,10 @@ // A crypto handshake message specified an unsupported version. {quic::QUIC_CRYPTO_VERSION_NOT_SUPPORTED, "quic.crypto.version_not_supported"}, - // A crypto handshake message resulted in a stateless reject. - {quic::QUIC_CRYPTO_HANDSHAKE_STATELESS_REJECT, + // QUIC_CRYPTO_STATELESS_REJECT was code 72. The code has been + // deprecated, but to keep the assert below happy, there needs to be + // an entry for it, but the symbol is gone. + {static_cast<quic::QuicErrorCode>(72), "quic.crypto.handshake_stateless_reject"}, // There was no intersection between the crypto primitives supported by the // peer and ourselves.
diff --git a/components/download/internal/common/download_path_reservation_tracker.cc b/components/download/internal/common/download_path_reservation_tracker.cc index 8a400412..b7520dc 100644 --- a/components/download/internal/common/download_path_reservation_tracker.cc +++ b/components/download/internal/common/download_path_reservation_tracker.cc
@@ -400,7 +400,7 @@ // |key|. void RevokeReservation(ReservationKey key) { DCHECK(g_reservation_map != NULL); - DCHECK(base::ContainsKey(*g_reservation_map, key)); + DCHECK(base::Contains(*g_reservation_map, key)); g_reservation_map->erase(key); if (g_reservation_map->size() == 0) { // No more reservations. Delete map.
diff --git a/components/download/internal/common/in_progress_download_manager.cc b/components/download/internal/common/in_progress_download_manager.cc index f2aed88..7a05bfe4 100644 --- a/components/download/internal/common/in_progress_download_manager.cc +++ b/components/download/internal/common/in_progress_download_manager.cc
@@ -348,7 +348,7 @@ DownloadItemImpl* download) { if (!download) return base::Optional<DownloadEntry>(); - if (base::ContainsKey(download_entries_, download->GetGuid())) + if (base::Contains(download_entries_, download->GetGuid())) return download_entries_[download->GetGuid()]; return base::Optional<DownloadEntry>(); @@ -445,7 +445,7 @@ if (info->is_new_download && !should_persist_new_download) non_persistent_download_guids_.insert(download->GetGuid()); // If the download is not persisted, don't notify |download_db_cache_|. - if (!base::ContainsKey(non_persistent_download_guids_, download->GetGuid())) { + if (!base::Contains(non_persistent_download_guids_, download->GetGuid())) { download_db_cache_->AddOrReplaceEntry( CreateDownloadDBEntryFromItem(*download)); download->RemoveObserver(download_db_cache_.get()); @@ -517,7 +517,7 @@ uint32_t download_id = item->GetId(); // Remove entries with duplicate ids. if (download_id != DownloadItem::kInvalidId && - base::ContainsKey(download_ids, download_id)) { + base::Contains(download_ids, download_id)) { RemoveInProgressDownload(item->GetGuid()); num_duplicates++; continue;
diff --git a/components/drive/resource_metadata_storage_unittest.cc b/components/drive/resource_metadata_storage_unittest.cc index b3335b4..72e4851 100644 --- a/components/drive/resource_metadata_storage_unittest.cc +++ b/components/drive/resource_metadata_storage_unittest.cc
@@ -194,7 +194,7 @@ EXPECT_EQ(keys.size(), found_entries.size()); for (const std::string& key : keys) - EXPECT_TRUE(base::ContainsKey(found_entries, key)); + EXPECT_TRUE(base::Contains(found_entries, key)); } TEST_F(ResourceMetadataStorageTest, GetIdByResourceId) {
diff --git a/components/exo/layer_tree_frame_sink_holder.cc b/components/exo/layer_tree_frame_sink_holder.cc index ded1687..1288443 100644 --- a/components/exo/layer_tree_frame_sink_holder.cc +++ b/components/exo/layer_tree_frame_sink_holder.cc
@@ -118,7 +118,7 @@ for (auto& resource : resources) { // Skip resources that are also in last frame. This can happen if // the frame sink id changed. - if (base::ContainsValue(last_frame_resources_, resource.id)) { + if (base::Contains(last_frame_resources_, resource.id)) { continue; } resource_manager_.ReclaimResource(resource);
diff --git a/components/favicon/core/favicon_handler.cc b/components/favicon/core/favicon_handler.cc index bbf84c2..08c9c16 100644 --- a/components/favicon/core/favicon_handler.cc +++ b/components/favicon/core/favicon_handler.cc
@@ -76,7 +76,7 @@ for (float favicon_scale : favicon_scales) { int edge_size_in_pixel = std::ceil(desired_size_in_dip * favicon_scale); gfx::Size value(edge_size_in_pixel, edge_size_in_pixel); - if (!base::ContainsValue(favicon_sizes, value)) + if (!base::Contains(favicon_sizes, value)) return true; } return false;
diff --git a/components/favicon/core/favicon_service_impl.cc b/components/favicon/core/favicon_service_impl.cc index c0007f2..9d7f49b 100644 --- a/components/favicon/core/favicon_service_impl.cc +++ b/components/favicon/core/favicon_service_impl.cc
@@ -45,7 +45,7 @@ const std::vector<float> favicon_scales = favicon_base::GetFaviconScales(); for (size_t i = 0; i < image_reps.size(); ++i) { // Don't save if the scale isn't one of supported favicon scales. - if (!base::ContainsValue(favicon_scales, image_reps[i].scale())) + if (!base::Contains(favicon_scales, image_reps[i].scale())) continue; bitmaps.push_back(image_reps[i].GetBitmap()); }
diff --git a/components/favicon_base/select_favicon_frames.cc b/components/favicon_base/select_favicon_frames.cc index 15ef170..90b58e6 100644 --- a/components/favicon_base/select_favicon_frames.cc +++ b/components/favicon_base/select_favicon_frames.cc
@@ -123,7 +123,7 @@ return; } - if (base::ContainsValue(desired_sizes, 0)) { + if (base::Contains(desired_sizes, 0)) { // Just return the biggest image available. SelectionResult result; result.index = BiggestCandidate(candidate_sizes);
diff --git a/components/feature_engagement/internal/feature_config_condition_validator.cc b/components/feature_engagement/internal/feature_config_condition_validator.cc index cf7c5c0..c5881d3 100644 --- a/components/feature_engagement/internal/feature_config_condition_validator.cc +++ b/components/feature_engagement/internal/feature_config_condition_validator.cc
@@ -80,7 +80,7 @@ DCHECK(config.session_rate_impact.affected_features.has_value()); for (const std::string& feature_name : config.session_rate_impact.affected_features.value()) { - DCHECK(base::ContainsValue(all_feature_names, feature_name)); + DCHECK(base::Contains(all_feature_names, feature_name)); ++times_shown_for_feature_[feature_name]; } break;
diff --git a/components/feature_engagement/public/android/java/src/org/chromium/components/feature_engagement/FeatureConstants.java b/components/feature_engagement/public/android/java/src/org/chromium/components/feature_engagement/FeatureConstants.java index 4d5a22eb..073f03f 100644 --- a/components/feature_engagement/public/android/java/src/org/chromium/components/feature_engagement/FeatureConstants.java +++ b/components/feature_engagement/public/android/java/src/org/chromium/components/feature_engagement/FeatureConstants.java
@@ -34,7 +34,7 @@ FeatureConstants.TAB_GROUPS_QUICKLY_COMPARE_PAGES_FEATURE, FeatureConstants.TAB_GROUPS_TAP_TO_SEE_ANOTHER_TAB_FEATURE, FeatureConstants.TAB_GROUPS_YOUR_TABS_ARE_TOGETHER_FEATURE, - FeatureConstants.FEED_CARD_MENU_FEATURE}) + FeatureConstants.FEED_CARD_MENU_FEATURE, FeatureConstants.IDENTITY_DISC_FEATURE}) @Retention(RetentionPolicy.SOURCE) public @interface FeatureConstants { String DOWNLOAD_PAGE_FEATURE = "IPH_DownloadPage"; @@ -114,4 +114,10 @@ * An IPH feature to show on a card menu on the FeedNewTabPage. */ String FEED_CARD_MENU_FEATURE = "IPH_FeedCardMenu"; + + /** + * An IPH feature prompting user to tap on identity disc to navigate to "Sync and Google + * services" preferences. + */ + String IDENTITY_DISC_FEATURE = "IPH_IdentityDisc"; }
diff --git a/components/feature_engagement/public/feature_constants.cc b/components/feature_engagement/public/feature_constants.cc index 71c1ee9..d4529f4 100644 --- a/components/feature_engagement/public/feature_constants.cc +++ b/components/feature_engagement/public/feature_constants.cc
@@ -73,6 +73,8 @@ "IPH_HomePageButton", base::FEATURE_DISABLED_BY_DEFAULT}; const base::Feature kIPHHomepageTileFeature{"IPH_HomepageTile", base::FEATURE_DISABLED_BY_DEFAULT}; +const base::Feature kIPHIdentityDiscFeature{"IPH_IdentityDisc", + base::FEATURE_DISABLED_BY_DEFAULT}; const base::Feature kIPHKeyboardAccessoryAddressFillingFeature{ "IPH_KeyboardAccessoryAddressFilling", base::FEATURE_DISABLED_BY_DEFAULT}; const base::Feature kIPHKeyboardAccessoryPasswordFillingFeature{
diff --git a/components/feature_engagement/public/feature_constants.h b/components/feature_engagement/public/feature_constants.h index 5a43fea9..033edc7 100644 --- a/components/feature_engagement/public/feature_constants.h +++ b/components/feature_engagement/public/feature_constants.h
@@ -54,6 +54,7 @@ extern const base::Feature kIPHFeedCardMenuFeature; extern const base::Feature kIPHHomePageButtonFeature; extern const base::Feature kIPHHomepageTileFeature; +extern const base::Feature kIPHIdentityDiscFeature; extern const base::Feature kIPHKeyboardAccessoryAddressFillingFeature; extern const base::Feature kIPHKeyboardAccessoryPasswordFillingFeature; extern const base::Feature kIPHKeyboardAccessoryPaymentFillingFeature;
diff --git a/components/feature_engagement/public/feature_list.cc b/components/feature_engagement/public/feature_list.cc index a0c4ac7f..ba5fa7d 100644 --- a/components/feature_engagement/public/feature_list.cc +++ b/components/feature_engagement/public/feature_list.cc
@@ -37,6 +37,7 @@ &kIPHFeedCardMenuFeature, &kIPHHomePageButtonFeature, &kIPHHomepageTileFeature, + &kIPHIdentityDiscFeature, &kIPHKeyboardAccessoryAddressFillingFeature, &kIPHKeyboardAccessoryPasswordFillingFeature, &kIPHKeyboardAccessoryPaymentFillingFeature,
diff --git a/components/feature_engagement/public/feature_list.h b/components/feature_engagement/public/feature_list.h index 722c741c..5a413b4 100644 --- a/components/feature_engagement/public/feature_list.h +++ b/components/feature_engagement/public/feature_list.h
@@ -77,6 +77,7 @@ DEFINE_VARIATION_PARAM(kIPHFeedCardMenuFeature, "IPH_FeedCardMenu"); DEFINE_VARIATION_PARAM(kIPHHomePageButtonFeature, "IPH_HomePageButton"); DEFINE_VARIATION_PARAM(kIPHHomepageTileFeature, "IPH_HomepageTile"); +DEFINE_VARIATION_PARAM(kIPHIdentityDiscFeature, "IPH_IdentityDisc"); DEFINE_VARIATION_PARAM(kIPHKeyboardAccessoryAddressFillingFeature, "IPH_KeyboardAccessoryAddressFilling"); DEFINE_VARIATION_PARAM(kIPHKeyboardAccessoryPasswordFillingFeature, @@ -146,6 +147,7 @@ VARIATION_ENTRY(kIPHFeedCardMenuFeature), VARIATION_ENTRY(kIPHHomePageButtonFeature), VARIATION_ENTRY(kIPHHomepageTileFeature), + VARIATION_ENTRY(kIPHIdentityDiscFeature), VARIATION_ENTRY(kIPHKeyboardAccessoryAddressFillingFeature), VARIATION_ENTRY(kIPHKeyboardAccessoryPasswordFillingFeature), VARIATION_ENTRY(kIPHKeyboardAccessoryPaymentFillingFeature),
diff --git a/components/feed/core/feed_scheduler_host.cc b/components/feed/core/feed_scheduler_host.cc index b0b29ea..689f55f 100644 --- a/components/feed/core/feed_scheduler_host.cc +++ b/components/feed/core/feed_scheduler_host.cc
@@ -523,7 +523,7 @@ return kDontRefreshOutstandingRequest; } - if (base::ContainsKey(disabled_triggers_, trigger)) { + if (base::Contains(disabled_triggers_, trigger)) { DVLOG(2) << "Disabled trigger stopped refresh from trigger " << static_cast<int>(trigger); return kDontRefreshTriggerDisabled;
diff --git a/components/feedback/feedback_uploader_unittest.cc b/components/feedback/feedback_uploader_unittest.cc index 7fa32c2..8fc865f08 100644 --- a/components/feedback/feedback_uploader_unittest.cc +++ b/components/feedback/feedback_uploader_unittest.cc
@@ -80,8 +80,7 @@ // FeedbackUploaderChrome: void StartDispatchingReport() override { - if (base::ContainsKey(dispatched_reports_, - report_being_dispatched()->data())) + if (base::Contains(dispatched_reports_, report_being_dispatched()->data())) dispatched_reports_[report_being_dispatched()->data()]++; else dispatched_reports_[report_being_dispatched()->data()] = 1;
diff --git a/components/flags_ui/flags_state.cc b/components/flags_ui/flags_state.cc index 0ae3d7d..f04d81c4 100644 --- a/components/flags_ui/flags_state.cc +++ b/components/flags_ui/flags_state.cc
@@ -411,7 +411,7 @@ std::set<std::string> enabled_entries; GetSanitizedEnabledFlags(flags_storage, &enabled_entries); - const bool enabled = base::ContainsKey(enabled_entries, entry->internal_name); + const bool enabled = base::Contains(enabled_entries, entry->internal_name); switch_values_[entry->command_line_switch] = value; DidModifyOriginListFlag(*entry, enabled); } @@ -441,7 +441,7 @@ // For any featrue name in |features| that is not in |switch_added_values| - // i.e. it wasn't added by about_flags code, add it to |remaining_features|. for (const auto& feature : features) { - if (!base::ContainsKey(switch_added_values, feature.as_string())) + if (!base::Contains(switch_added_values, feature.as_string())) remaining_features.push_back(feature); } @@ -663,7 +663,7 @@ const std::string& switch_name, const std::string& switch_value, std::map<std::string, SwitchEntry>* name_to_switch_map) const { - DCHECK(!base::ContainsKey(*name_to_switch_map, key)); + DCHECK(!base::Contains(*name_to_switch_map, key)); SwitchEntry* entry = &(*name_to_switch_map)[key]; entry->switch_name = switch_name; @@ -675,7 +675,7 @@ const std::string& feature_name, bool feature_state, std::map<std::string, SwitchEntry>* name_to_switch_map) const { - DCHECK(!base::ContainsKey(*name_to_switch_map, key)); + DCHECK(!base::Contains(*name_to_switch_map, key)); SwitchEntry* entry = &(*name_to_switch_map)[key]; entry->feature_name = feature_name; @@ -744,11 +744,11 @@ std::vector<base::StringPiece> features = base::FeatureList::SplitFeatureListString(original_switch_value); // Only add features that don't already exist in the lists. - // Note: The base::ContainsValue() call results in O(n^2) performance, but in + // Note: The base::Contains() call results in O(n^2) performance, but in // practice n should be very small. for (const auto& entry : feature_switches) { if (entry.second == feature_state && - !base::ContainsValue(features, entry.first)) { + !base::Contains(features, entry.first)) { features.push_back(entry.first); appended_switches_[switch_name].insert(entry.first); }
diff --git a/components/flags_ui/flags_state_unittest.cc b/components/flags_ui/flags_state_unittest.cc index b278bc6d..5c08d0e5 100644 --- a/components/flags_ui/flags_state_unittest.cc +++ b/components/flags_ui/flags_state_unittest.cc
@@ -520,10 +520,10 @@ // This shouldn't do anything before ConvertFlagsToSwitches() wasn't called. flags_state_->RemoveFlagsSwitches(&switch_list); ASSERT_EQ(4u, switch_list.size()); - EXPECT_TRUE(base::ContainsKey(switch_list, kSwitch1)); - EXPECT_TRUE(base::ContainsKey(switch_list, switches::kFlagSwitchesBegin)); - EXPECT_TRUE(base::ContainsKey(switch_list, switches::kFlagSwitchesEnd)); - EXPECT_TRUE(base::ContainsKey(switch_list, "foo")); + EXPECT_TRUE(base::Contains(switch_list, kSwitch1)); + EXPECT_TRUE(base::Contains(switch_list, switches::kFlagSwitchesBegin)); + EXPECT_TRUE(base::Contains(switch_list, switches::kFlagSwitchesEnd)); + EXPECT_TRUE(base::Contains(switch_list, "foo")); // Call ConvertFlagsToSwitches(), then RemoveFlagsSwitches() again. base::CommandLine command_line(base::CommandLine::NO_PROGRAM); @@ -535,7 +535,7 @@ // Now the about:flags-related switch should have been removed. ASSERT_EQ(1u, switch_list.size()); - EXPECT_TRUE(base::ContainsKey(switch_list, "foo")); + EXPECT_TRUE(base::Contains(switch_list, "foo")); } TEST_F(FlagsStateTest, RemoveFlagSwitches_Features) { @@ -586,13 +586,13 @@ kDisableFeatures); auto switch_list = command_line.GetSwitches(); EXPECT_EQ(cases[i].expected_enable_features != nullptr, - base::ContainsKey(switch_list, kEnableFeatures)); + base::Contains(switch_list, kEnableFeatures)); if (cases[i].expected_enable_features) EXPECT_EQ(CreateSwitch(cases[i].expected_enable_features), switch_list[kEnableFeatures]); EXPECT_EQ(cases[i].expected_disable_features != nullptr, - base::ContainsKey(switch_list, kDisableFeatures)); + base::Contains(switch_list, kDisableFeatures)); if (cases[i].expected_disable_features) EXPECT_EQ(CreateSwitch(cases[i].expected_disable_features), switch_list[kDisableFeatures]); @@ -602,12 +602,12 @@ switch_list = command_line.GetSwitches(); flags_state_->RemoveFlagsSwitches(&switch_list); EXPECT_EQ(cases[i].existing_enable_features != nullptr, - base::ContainsKey(switch_list, kEnableFeatures)); + base::Contains(switch_list, kEnableFeatures)); if (cases[i].existing_enable_features) EXPECT_EQ(CreateSwitch(cases[i].existing_enable_features), switch_list[kEnableFeatures]); EXPECT_EQ(cases[i].existing_disable_features != nullptr, - base::ContainsKey(switch_list, kEnableFeatures)); + base::Contains(switch_list, kEnableFeatures)); if (cases[i].existing_disable_features) EXPECT_EQ(CreateSwitch(cases[i].existing_disable_features), switch_list[kDisableFeatures]);
diff --git a/components/gcm_driver/account_tracker.cc b/components/gcm_driver/account_tracker.cc index 38788dd..a1a0930 100644 --- a/components/gcm_driver/account_tracker.cc +++ b/components/gcm_driver/account_tracker.cc
@@ -131,7 +131,7 @@ } void AccountTracker::StartTrackingAccount(const std::string& account_key) { - if (!base::ContainsKey(accounts_, account_key)) { + if (!base::Contains(accounts_, account_key)) { DVLOG(1) << "StartTracking " << account_key; AccountState account_state; account_state.ids.account_key = account_key; @@ -143,7 +143,7 @@ void AccountTracker::StopTrackingAccount(const std::string account_key) { DVLOG(1) << "StopTracking " << account_key; - if (base::ContainsKey(accounts_, account_key)) { + if (base::Contains(accounts_, account_key)) { AccountState& account = accounts_[account_key]; if (!account.ids.gaia.empty()) { UpdateSignInState(account_key, /*is_signed_in=*/false); @@ -151,7 +151,7 @@ accounts_.erase(account_key); } - if (base::ContainsKey(user_info_requests_, account_key)) + if (base::Contains(user_info_requests_, account_key)) DeleteFetcher(user_info_requests_[account_key].get()); } @@ -161,7 +161,7 @@ } void AccountTracker::StartFetchingUserInfo(const std::string& account_key) { - if (base::ContainsKey(user_info_requests_, account_key)) { + if (base::Contains(user_info_requests_, account_key)) { DeleteFetcher(user_info_requests_[account_key].get()); } @@ -175,7 +175,7 @@ void AccountTracker::OnUserInfoFetchSuccess(AccountIdFetcher* fetcher, const std::string& gaia_id) { const std::string& account_key = fetcher->account_key(); - DCHECK(base::ContainsKey(accounts_, account_key)); + DCHECK(base::Contains(accounts_, account_key)); AccountState& account = accounts_[account_key]; account.ids.gaia = gaia_id; @@ -196,7 +196,7 @@ void AccountTracker::DeleteFetcher(AccountIdFetcher* fetcher) { DVLOG(1) << "DeleteFetcher " << fetcher->account_key(); const std::string& account_key = fetcher->account_key(); - DCHECK(base::ContainsKey(user_info_requests_, account_key)); + DCHECK(base::Contains(user_info_requests_, account_key)); DCHECK_EQ(fetcher, user_info_requests_[account_key].get()); user_info_requests_.erase(account_key); }
diff --git a/components/guest_view/browser/guest_view_manager.cc b/components/guest_view/browser/guest_view_manager.cc index 5d59ee5..5e61416 100644 --- a/components/guest_view/browser/guest_view_manager.cc +++ b/components/guest_view/browser/guest_view_manager.cc
@@ -260,8 +260,7 @@ void GuestViewManager::AddGuest(int guest_instance_id, WebContents* guest_web_contents) { - CHECK(!base::ContainsKey(guest_web_contents_by_instance_id_, - guest_instance_id)); + CHECK(!base::Contains(guest_web_contents_by_instance_id_, guest_instance_id)); CHECK(CanUseGuestInstanceID(guest_instance_id)); guest_web_contents_by_instance_id_[guest_instance_id] = guest_web_contents; @@ -450,7 +449,7 @@ bool GuestViewManager::CanUseGuestInstanceID(int guest_instance_id) { if (guest_instance_id <= last_instance_id_removed_) return false; - return !base::ContainsKey(removed_instance_ids_, guest_instance_id); + return !base::Contains(removed_instance_ids_, guest_instance_id); } // static
diff --git a/components/gwp_asan/client/guarded_page_allocator.cc b/components/gwp_asan/client/guarded_page_allocator.cc index 29d15fa..2a9cdb5 100644 --- a/components/gwp_asan/client/guarded_page_allocator.cc +++ b/components/gwp_asan/client/guarded_page_allocator.cc
@@ -173,6 +173,23 @@ UnmapRegion(); } +void* GuardedPageAllocator::MapRegionHint() const { +#if defined(ARCH_CPU_64_BITS) + // Mapping the GWP-ASan region in to the lower 32-bits of address space makes + // it much more likely that a bad pointer dereference points into our region + // and triggers a false positive report, so try to hint to the OS that we want + // the region to be in the upper address space. + static const uintptr_t kMinAddress = 1ULL << 32; + static const uintptr_t kMaxAddress = 1ULL << 46; + uint64_t rand = base::RandUint64() & (kMaxAddress - 1); + if (rand < kMinAddress) + rand += kMinAddress; + return reinterpret_cast<void*>(rand & ~(state_.page_size - 1)); +#else + return nullptr; +#endif // defined(ARCH_CPU_64_BITS) +} + void* GuardedPageAllocator::Allocate(size_t size, size_t align, const char* type) {
diff --git a/components/gwp_asan/client/guarded_page_allocator.h b/components/gwp_asan/client/guarded_page_allocator.h index 4c0b7d0..6292e59 100644 --- a/components/gwp_asan/client/guarded_page_allocator.h +++ b/components/gwp_asan/client/guarded_page_allocator.h
@@ -160,6 +160,9 @@ void* MapRegion(); void UnmapRegion(); + // Provide a hint for MapRegion() on where to place the GWP-ASan region. + void* MapRegionHint() const; + // Returns the size of the virtual memory region used to store allocations. size_t RegionSize() const;
diff --git a/components/gwp_asan/client/guarded_page_allocator_posix.cc b/components/gwp_asan/client/guarded_page_allocator_posix.cc index 16c6a7a..15b0dfc 100644 --- a/components/gwp_asan/client/guarded_page_allocator_posix.cc +++ b/components/gwp_asan/client/guarded_page_allocator_posix.cc
@@ -12,8 +12,8 @@ namespace internal { void* GuardedPageAllocator::MapRegion() { - return mmap(nullptr, RegionSize(), PROT_NONE, MAP_ANONYMOUS | MAP_PRIVATE, -1, - 0); + return mmap(MapRegionHint(), RegionSize(), PROT_NONE, + MAP_ANONYMOUS | MAP_PRIVATE, -1, 0); } void GuardedPageAllocator::UnmapRegion() {
diff --git a/components/gwp_asan/client/guarded_page_allocator_win.cc b/components/gwp_asan/client/guarded_page_allocator_win.cc index 62045f4..60638e5 100644 --- a/components/gwp_asan/client/guarded_page_allocator_win.cc +++ b/components/gwp_asan/client/guarded_page_allocator_win.cc
@@ -16,6 +16,11 @@ // protection routines can be broken out in base/ and merged with those used for // PartionAlloc/ProtectedMemory. void* GuardedPageAllocator::MapRegion() { + if (void* hint = MapRegionHint()) + if (void* ptr = + VirtualAlloc(hint, RegionSize(), MEM_RESERVE, PAGE_NOACCESS)) + return ptr; + return VirtualAlloc(nullptr, RegionSize(), MEM_RESERVE, PAGE_NOACCESS); }
diff --git a/components/heap_profiling/test_driver.cc b/components/heap_profiling/test_driver.cc index 8858ad2..412b58f 100644 --- a/components/heap_profiling/test_driver.cc +++ b/components/heap_profiling/test_driver.cc
@@ -80,7 +80,7 @@ base::kNullProcessHandle) continue; base::ProcessId pid = iter.GetCurrentValue()->GetProcess().Pid(); - if (base::ContainsValue(profiled_pids, pid)) { + if (base::Contains(profiled_pids, pid)) { return true; } }
diff --git a/components/history/core/browser/download_database.cc b/components/history/core/browser/download_database.cc index 49a80db..581cb61 100644 --- a/components/history/core/browser/download_database.cc +++ b/components/history/core/browser/download_database.cc
@@ -488,7 +488,7 @@ dropped_reason = DROPPED_REASON_BAD_DANGER_TYPE; } if (dropped_reason == DROPPED_REASON_MAX) { - DCHECK(!base::ContainsKey(info_map, info->id)); + DCHECK(!base::Contains(info_map, info->id)); uint32_t id = info->id; info_map[id] = info.release(); } @@ -511,7 +511,7 @@ // Confirm the id has already been seen--if it hasn't, discard the // record. - if (!base::ContainsKey(info_map, id)) + if (!base::Contains(info_map, id)) continue; // Confirm all previous URLs in the chain have already been seen;
diff --git a/components/history/core/browser/history_backend.cc b/components/history/core/browser/history_backend.cc index 62935e20..cee3caa 100644 --- a/components/history/core/browser/history_backend.cc +++ b/components/history/core/browser/history_backend.cc
@@ -1378,11 +1378,10 @@ return result; } -void HistoryBackend::QueryMostVisitedURLs(int result_count, - int days_back, - MostVisitedURLList* result) { +MostVisitedURLList HistoryBackend::QueryMostVisitedURLs(int result_count, + int days_back) { if (!db_) - return; + return {}; base::TimeTicks begin_time = base::TimeTicks::Now(); @@ -1394,14 +1393,17 @@ base::Time::Now() - base::TimeDelta::FromDays(days_back), result_count, url_filter); + MostVisitedURLList result; for (const std::unique_ptr<PageUsageData>& current_data : data) { RedirectList redirects = QueryRedirectsFrom(current_data->GetURL()); - result->emplace_back(current_data->GetURL(), current_data->GetTitle(), - redirects); + result.emplace_back(current_data->GetURL(), current_data->GetTitle(), + redirects); } UMA_HISTOGRAM_TIMES("History.QueryMostVisitedURLsTime", base::TimeTicks::Now() - begin_time); + + return result; } void HistoryBackend::GetRedirectsFromSpecificVisit(VisitID cur_visit, @@ -1759,7 +1761,7 @@ // a favicon bitmap mapped to |icon_url|. The one there is more correct // and having multiple equally sized favicon bitmaps for |page_url| is // ambiguous in terms of GetFaviconsForURL(). - if (base::ContainsValue(favicon_sizes, bitmaps_to_copy[j].pixel_size)) + if (base::Contains(favicon_sizes, bitmaps_to_copy[j].pixel_size)) continue; // Add the favicon bitmap as expired as it is not consistent with the
diff --git a/components/history/core/browser/history_backend.h b/components/history/core/browser/history_backend.h index 7be2653..c664d9f 100644 --- a/components/history/core/browser/history_backend.h +++ b/components/history/core/browser/history_backend.h
@@ -257,9 +257,7 @@ // Request the |result_count| most visited URLs and the chain of // redirects leading to each of these URLs. |days_back| is the // number of days of history to use. Used by TopSites. - void QueryMostVisitedURLs(int result_count, - int days_back, - MostVisitedURLList* result); + MostVisitedURLList QueryMostVisitedURLs(int result_count, int days_back); // Statistics ----------------------------------------------------------------
diff --git a/components/history/core/browser/history_backend_unittest.cc b/components/history/core/browser/history_backend_unittest.cc index 56e2040..89e723b3 100644 --- a/components/history/core/browser/history_backend_unittest.cc +++ b/components/history/core/browser/history_backend_unittest.cc
@@ -4016,8 +4016,7 @@ backend_->AddPage(args); } - MostVisitedURLList most_visited; - backend_->QueryMostVisitedURLs(100, 100, &most_visited); + MostVisitedURLList most_visited = backend_->QueryMostVisitedURLs(100, 100); const base::string16 kSomeTitle; // Ignored by equality operator. EXPECT_THAT(
diff --git a/components/history/core/browser/history_service.cc b/components/history/core/browser/history_service.cc index e7a6b46..851c854 100644 --- a/components/history/core/browser/history_service.cc +++ b/components/history/core/browser/history_service.cc
@@ -832,16 +832,15 @@ base::CancelableTaskTracker::TaskId HistoryService::QueryMostVisitedURLs( int result_count, int days_back, - const QueryMostVisitedURLsCallback& callback, + QueryMostVisitedURLsCallback callback, base::CancelableTaskTracker* tracker) { DCHECK(backend_task_runner_) << "History service being called after cleanup"; DCHECK(thread_checker_.CalledOnValidThread()); - MostVisitedURLList* result = new MostVisitedURLList(); - return tracker->PostTaskAndReply( + return tracker->PostTaskAndReplyWithResult( backend_task_runner_.get(), FROM_HERE, base::BindOnce(&HistoryBackend::QueryMostVisitedURLs, history_backend_, - result_count, days_back, base::Unretained(result)), - base::BindOnce(callback, base::Owned(result))); + result_count, days_back), + std::move(callback)); } void HistoryService::Cleanup() {
diff --git a/components/history/core/browser/history_service.h b/components/history/core/browser/history_service.h index 6242cdb..f2494de 100644 --- a/components/history/core/browser/history_service.h +++ b/components/history/core/browser/history_service.h
@@ -285,13 +285,13 @@ // Request the |result_count| most visited URLs and the chain of // redirects leading to each of these URLs. |days_back| is the // number of days of history to use. Used by TopSites. - typedef base::Callback<void(const MostVisitedURLList*)> - QueryMostVisitedURLsCallback; + using QueryMostVisitedURLsCallback = + base::OnceCallback<void(MostVisitedURLList)>; base::CancelableTaskTracker::TaskId QueryMostVisitedURLs( int result_count, int days_back, - const QueryMostVisitedURLsCallback& callback, + QueryMostVisitedURLsCallback callback, base::CancelableTaskTracker* tracker); // Statistics ----------------------------------------------------------------
diff --git a/components/history/core/browser/history_service_unittest.cc b/components/history/core/browser/history_service_unittest.cc index 9e603cf..1d86557 100644 --- a/components/history/core/browser/history_service_unittest.cc +++ b/components/history/core/browser/history_service_unittest.cc
@@ -145,18 +145,14 @@ base::RunLoop run_loop; history_service_->QueryMostVisitedURLs( kResultCount, kDaysBack, - base::BindRepeating(&HistoryServiceTest::OnQueryMostVisitedURLsComplete, - base::Unretained(this), run_loop.QuitClosure()), + base::BindLambdaForTesting([&](MostVisitedURLList urls) { + most_visited_urls_ = urls; + run_loop.Quit(); + }), &tracker_); run_loop.Run(); // Will be exited in *QueryComplete. } - void OnQueryMostVisitedURLsComplete(base::OnceClosure done, - const MostVisitedURLList* url_list) { - most_visited_urls_ = *url_list; - std::move(done).Run(); - } - base::ScopedTempDir temp_dir_; base::test::ScopedTaskEnvironment scoped_task_environment_;
diff --git a/components/history/core/browser/sync/typed_url_sync_bridge.cc b/components/history/core/browser/sync/typed_url_sync_bridge.cc index c59f8611..04a5502 100644 --- a/components/history/core/browser/sync/typed_url_sync_bridge.cc +++ b/components/history/core/browser/sync/typed_url_sync_bridge.cc
@@ -1176,7 +1176,7 @@ // Cannot write to specifics, ex. no TYPED visits. return nullptr; } - entity_data->non_unique_name = row.url().spec(); + entity_data->name = row.url().spec(); return entity_data; }
diff --git a/components/history/core/browser/top_sites_impl.cc b/components/history/core/browser/top_sites_impl.cc index 5e7cd2e2..aadfb560 100644 --- a/components/history/core/browser/top_sites_impl.cc +++ b/components/history/core/browser/top_sites_impl.cc
@@ -251,8 +251,8 @@ history_service_->QueryMostVisitedURLs( num_results_to_request_from_history(), kDaysOfHistory, - base::Bind(&TopSitesImpl::OnTopSitesAvailableFromHistory, - base::Unretained(this)), + base::BindOnce(&TopSitesImpl::OnTopSitesAvailableFromHistory, + base::Unretained(this)), &cancelable_task_tracker_); } @@ -469,10 +469,8 @@ &TopSitesImpl::StartQueryForMostVisited); } -void TopSitesImpl::OnTopSitesAvailableFromHistory( - const MostVisitedURLList* pages) { - DCHECK(pages); - SetTopSites(*pages, CALL_LOCATION_FROM_OTHER_PLACES); +void TopSitesImpl::OnTopSitesAvailableFromHistory(MostVisitedURLList pages) { + SetTopSites(pages, CALL_LOCATION_FROM_OTHER_PLACES); } void TopSitesImpl::OnURLsDeleted(HistoryService* history_service,
diff --git a/components/history/core/browser/top_sites_impl.h b/components/history/core/browser/top_sites_impl.h index 72a3df1..9c85817 100644 --- a/components/history/core/browser/top_sites_impl.h +++ b/components/history/core/browser/top_sites_impl.h
@@ -169,7 +169,7 @@ void OnGotMostVisitedURLs(const scoped_refptr<MostVisitedThreadSafe>& sites); // Called when history service returns a list of top URLs. - void OnTopSitesAvailableFromHistory(const MostVisitedURLList* data); + void OnTopSitesAvailableFromHistory(MostVisitedURLList data); // history::HistoryServiceObserver: void OnURLsDeleted(HistoryService* history_service,
diff --git a/components/infobars/core/infobar_container.cc b/components/infobars/core/infobar_container.cc index b4d3cee..75169447 100644 --- a/components/infobars/core/infobar_container.cc +++ b/components/infobars/core/infobar_container.cc
@@ -124,7 +124,7 @@ void InfoBarContainer::AddInfoBar(InfoBar* infobar, size_t position, bool animate) { - DCHECK(!base::ContainsValue(infobars_, infobar)); + DCHECK(!base::Contains(infobars_, infobar)); DCHECK_LE(position, infobars_.size()); infobars_.insert(infobars_.begin() + position, infobar); PlatformSpecificAddInfoBar(infobar, position);
diff --git a/components/invalidation/impl/registration_manager.cc b/components/invalidation/impl/registration_manager.cc index d39af92..214d801 100644 --- a/components/invalidation/impl/registration_manager.cc +++ b/components/invalidation/impl/registration_manager.cc
@@ -84,7 +84,7 @@ } for (auto it = to_register.begin(); it != to_register.end(); ++it) { - if (!base::ContainsKey(registration_statuses_, *it)) { + if (!base::Contains(registration_statuses_, *it)) { registration_statuses_[*it] = std::make_unique<RegistrationStatus>(*it, this); }
diff --git a/components/invalidation/impl/registration_manager_unittest.cc b/components/invalidation/impl/registration_manager_unittest.cc index abcd15a..6129b4e7 100644 --- a/components/invalidation/impl/registration_manager_unittest.cc +++ b/components/invalidation/impl/registration_manager_unittest.cc
@@ -54,7 +54,7 @@ ~FakeInvalidationClient() override {} void LoseRegistration(const invalidation::ObjectId& oid) { - EXPECT_TRUE(base::ContainsKey(registered_ids_, oid)); + EXPECT_TRUE(base::Contains(registered_ids_, oid)); registered_ids_.erase(oid); } @@ -69,7 +69,7 @@ void Acknowledge(const invalidation::AckHandle& handle) override {} void Register(const invalidation::ObjectId& oid) override { - EXPECT_FALSE(base::ContainsKey(registered_ids_, oid)); + EXPECT_FALSE(base::Contains(registered_ids_, oid)); registered_ids_.insert(oid); } @@ -78,7 +78,7 @@ } void Unregister(const invalidation::ObjectId& oid) override { - EXPECT_TRUE(base::ContainsKey(registered_ids_, oid)); + EXPECT_TRUE(base::Contains(registered_ids_, oid)); registered_ids_.erase(oid); }
diff --git a/components/invalidation/impl/sync_invalidation_listener_unittest.cc b/components/invalidation/impl/sync_invalidation_listener_unittest.cc index 97e5b84..dac233cb 100644 --- a/components/invalidation/impl/sync_invalidation_listener_unittest.cc +++ b/components/invalidation/impl/sync_invalidation_listener_unittest.cc
@@ -777,18 +777,18 @@ EXPECT_TRUE(GetSavedInvalidations().empty()); FireInvalidate(id, 1, "hello"); EXPECT_EQ(1U, GetSavedInvalidations().size()); - EXPECT_TRUE(base::ContainsKey(GetSavedInvalidations(), id)); + EXPECT_TRUE(base::Contains(GetSavedInvalidations(), id)); FireInvalidate(kPreferencesId_, 2, "world"); EXPECT_EQ(2U, GetSavedInvalidations().size()); - EXPECT_TRUE(base::ContainsKey(GetSavedInvalidations(), id)); - EXPECT_TRUE(base::ContainsKey(GetSavedInvalidations(), kPreferencesId_)); + EXPECT_TRUE(base::Contains(GetSavedInvalidations(), id)); + EXPECT_TRUE(base::Contains(GetSavedInvalidations(), kPreferencesId_)); ObjectIdSet ids; ids.insert(id); listener_.UpdateRegisteredIds(ids); EXPECT_EQ(1U, GetSavedInvalidations().size()); - EXPECT_TRUE(base::ContainsKey(GetSavedInvalidations(), id)); + EXPECT_TRUE(base::Contains(GetSavedInvalidations(), id)); } TEST_F(SyncInvalidationListenerTest, DuplicateInvaldiations_Simple) {
diff --git a/components/keyed_service/core/keyed_service_factory.cc b/components/keyed_service/core/keyed_service_factory.cc index 635df28..f24edcb 100644 --- a/components/keyed_service/core/keyed_service_factory.cc +++ b/components/keyed_service/core/keyed_service_factory.cc
@@ -83,7 +83,7 @@ KeyedService* KeyedServiceFactory::Associate( void* context, std::unique_ptr<KeyedService> service) { - DCHECK(!base::ContainsKey(mapping_, context)); + DCHECK(!base::Contains(mapping_, context)); auto iterator = mapping_.emplace(context, std::move(service)).first; return iterator->second.get(); } @@ -117,5 +117,5 @@ } bool KeyedServiceFactory::HasTestingFactory(void* context) { - return base::ContainsKey(testing_factories_, context); + return base::Contains(testing_factories_, context); }
diff --git a/components/keyed_service/core/refcounted_keyed_service_factory.cc b/components/keyed_service/core/refcounted_keyed_service_factory.cc index 5bde50c2..4a60e85 100644 --- a/components/keyed_service/core/refcounted_keyed_service_factory.cc +++ b/components/keyed_service/core/refcounted_keyed_service_factory.cc
@@ -82,7 +82,7 @@ scoped_refptr<RefcountedKeyedService> RefcountedKeyedServiceFactory::Associate( void* context, scoped_refptr<RefcountedKeyedService> service) { - DCHECK(!base::ContainsKey(mapping_, context)); + DCHECK(!base::Contains(mapping_, context)); auto iterator = mapping_.emplace(context, std::move(service)).first; return iterator->second; } @@ -118,7 +118,7 @@ } bool RefcountedKeyedServiceFactory::HasTestingFactory(void* context) { - return base::ContainsKey(testing_factories_, context); + return base::Contains(testing_factories_, context); } void RefcountedKeyedServiceFactory::CreateServiceNow(void* context) {
diff --git a/components/language/core/browser/language_prefs.cc b/components/language/core/browser/language_prefs.cc index 1af1c453d..769e262 100644 --- a/components/language/core/browser/language_prefs.cc +++ b/components/language/core/browser/language_prefs.cc
@@ -54,7 +54,7 @@ language::ToTranslateLanguageSynonym(&canonical_lang); const base::Value* fluents = prefs_->GetList(language::prefs::kFluentLanguages); - return base::ContainsValue(fluents->GetList(), base::Value(canonical_lang)); + return base::Contains(fluents->GetList(), base::Value(canonical_lang)); } void LanguagePrefs::SetFluent(const std::string& language) {
diff --git a/components/media_message_center/BUILD.gn b/components/media_message_center/BUILD.gn new file mode 100644 index 0000000..72e05fe --- /dev/null +++ b/components/media_message_center/BUILD.gn
@@ -0,0 +1,55 @@ +# 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. + +component("media_message_center") { + sources = [ + "media_notification_background.cc", + "media_notification_background.h", + "media_notification_constants.cc", + "media_notification_constants.h", + "media_notification_container.h", + "media_notification_controller.h", + "media_notification_item.cc", + "media_notification_item.h", + "media_notification_view.cc", + "media_notification_view.h", + ] + + defines = [ "IS_MEDIA_MESSAGE_CENTER_IMPL" ] + + deps = [ + "//base", + "//components/strings:components_strings_grit", + "//components/vector_icons", + "//services/media_session/public/mojom", + "//skia", + "//ui/accessibility", + "//ui/message_center", + "//ui/views", + ] +} + +source_set("unit_tests") { + testonly = true + + sources = [ + "media_notification_background_unittest.cc", + "media_notification_view_unittest.cc", + ] + + deps = [ + ":media_message_center", + "//base", + "//base/test:test_support", + "//services/media_session/public/cpp/test:test_support", + "//services/media_session/public/mojom", + "//skia", + "//testing/gmock", + "//testing/gtest", + "//ui/accessibility", + "//ui/message_center", + "//ui/views", + "//ui/views:test_support", + ] +}
diff --git a/components/media_message_center/DEPS b/components/media_message_center/DEPS new file mode 100644 index 0000000..5b362fb0 --- /dev/null +++ b/components/media_message_center/DEPS
@@ -0,0 +1,8 @@ +include_rules = [ + "+components/strings/grit/components_strings.h", + "+components/vector_icons", + "+mojo/public/cpp/bindings", + "+services/media_session/public", + "+skia/ext", + "+ui", +]
diff --git a/components/media_message_center/OWNERS b/components/media_message_center/OWNERS new file mode 100644 index 0000000..e4ffdff8 --- /dev/null +++ b/components/media_message_center/OWNERS
@@ -0,0 +1,2 @@ +beccahughes@chromium.org +steimel@chromium.org
diff --git a/ash/media/media_notification_background.cc b/components/media_message_center/media_notification_background.cc similarity index 98% rename from ash/media/media_notification_background.cc rename to components/media_message_center/media_notification_background.cc index b4e99a15..8c736c7 100644 --- a/ash/media/media_notification_background.cc +++ b/components/media_message_center/media_notification_background.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 "ash/media/media_notification_background.h" +#include "components/media_message_center/media_notification_background.h" #include <algorithm> #include <vector> @@ -15,7 +15,7 @@ #include "ui/views/style/typography.h" #include "ui/views/view.h" -namespace ash { +namespace media_message_center { namespace { @@ -409,4 +409,4 @@ : draw_bounds.right_center()); } -} // namespace ash +} // namespace media_message_center
diff --git a/ash/media/media_notification_background.h b/components/media_message_center/media_notification_background.h similarity index 83% rename from ash/media/media_notification_background.h rename to components/media_message_center/media_notification_background.h index 6f9245a..8953a20 100644 --- a/ash/media/media_notification_background.h +++ b/components/media_message_center/media_notification_background.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 ASH_MEDIA_MEDIA_NOTIFICATION_BACKGROUND_H_ -#define ASH_MEDIA_MEDIA_NOTIFICATION_BACKGROUND_H_ +#ifndef COMPONENTS_MEDIA_MESSAGE_CENTER_MEDIA_NOTIFICATION_BACKGROUND_H_ +#define COMPONENTS_MEDIA_MESSAGE_CENTER_MEDIA_NOTIFICATION_BACKGROUND_H_ #include <vector> -#include "ash/ash_export.h" +#include "base/component_export.h" #include "base/optional.h" #include "ui/gfx/image/image_skia.h" #include "ui/views/background.h" @@ -21,12 +21,13 @@ class View; } // namespace views -namespace ash { +namespace media_message_center { // MediaNotificationBackground draws a custom background for the media // notification showing the artwork clipped to a rounded rectangle faded into a // background color. -class ASH_EXPORT MediaNotificationBackground : public views::Background { +class COMPONENT_EXPORT(MEDIA_MESSAGE_CENTER) MediaNotificationBackground + : public views::Background { public: MediaNotificationBackground(views::View* owner, int top_radius, @@ -73,6 +74,6 @@ DISALLOW_COPY_AND_ASSIGN(MediaNotificationBackground); }; -} // namespace ash +} // namespace media_message_center -#endif // ASH_MEDIA_MEDIA_NOTIFICATION_BACKGROUND_H_ +#endif // COMPONENTS_MEDIA_MESSAGE_CENTER_MEDIA_NOTIFICATION_BACKGROUND_H_
diff --git a/ash/media/media_notification_background_unittest.cc b/components/media_message_center/media_notification_background_unittest.cc similarity index 98% rename from ash/media/media_notification_background_unittest.cc rename to components/media_message_center/media_notification_background_unittest.cc index af4afeb..4b58881 100644 --- a/ash/media/media_notification_background_unittest.cc +++ b/components/media_message_center/media_notification_background_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 "ash/media/media_notification_background.h" +#include "components/media_message_center/media_notification_background.h" #include <memory> @@ -15,7 +15,7 @@ #include "ui/gfx/skia_util.h" #include "ui/views/test/test_views.h" -namespace ash { +namespace media_message_center { namespace { @@ -385,4 +385,4 @@ EXPECT_EQ(25, background()->GetGradientEndPoint(gradient_bounds).y()); } -} // namespace ash +} // namespace media_message_center
diff --git a/components/media_message_center/media_notification_constants.cc b/components/media_message_center/media_notification_constants.cc new file mode 100644 index 0000000..c95bb967 --- /dev/null +++ b/components/media_message_center/media_notification_constants.cc
@@ -0,0 +1,13 @@ +// Copyright 2018 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "components/media_message_center/media_notification_constants.h" + +namespace media_message_center { + +const int kMediaSessionNotificationArtworkMinSize = 114; + +const int kMediaSessionNotificationArtworkDesiredSize = 512; + +} // namespace media_message_center
diff --git a/components/media_message_center/media_notification_constants.h b/components/media_message_center/media_notification_constants.h new file mode 100644 index 0000000..64d242e --- /dev/null +++ b/components/media_message_center/media_notification_constants.h
@@ -0,0 +1,25 @@ +// Copyright 2018 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef COMPONENTS_MEDIA_MESSAGE_CENTER_MEDIA_NOTIFICATION_CONSTANTS_H_ +#define COMPONENTS_MEDIA_MESSAGE_CENTER_MEDIA_NOTIFICATION_CONSTANTS_H_ + +#include "base/component_export.h" + +namespace media_message_center { + +// The minimum size in px that the media session artwork can be to be displayed +// in the notification. +COMPONENT_EXPORT(MEDIA_MESSAGE_CENTER) +extern const int kMediaSessionNotificationArtworkMinSize; + +// The desired size in px for the media session artwork to be displayed in the +// notification. The media session service will try and select artwork closest +// to this size. +COMPONENT_EXPORT(MEDIA_MESSAGE_CENTER) +extern const int kMediaSessionNotificationArtworkDesiredSize; + +} // namespace media_message_center + +#endif // COMPONENTS_MEDIA_MESSAGE_CENTER_MEDIA_NOTIFICATION_CONSTANTS_H_
diff --git a/components/media_message_center/media_notification_container.h b/components/media_message_center/media_notification_container.h new file mode 100644 index 0000000..46c4d2b --- /dev/null +++ b/components/media_message_center/media_notification_container.h
@@ -0,0 +1,23 @@ +// 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_MEDIA_MESSAGE_CENTER_MEDIA_NOTIFICATION_CONTAINER_H_ +#define COMPONENTS_MEDIA_MESSAGE_CENTER_MEDIA_NOTIFICATION_CONTAINER_H_ + +#include "base/component_export.h" + +namespace media_message_center { + +// MediaNotificationContainer is an interface for containers of +// MediaNotificationView components to receive events from the +// MediaNotificationView. +class COMPONENT_EXPORT(MEDIA_MESSAGE_CENTER) MediaNotificationContainer { + public: + // Called when MediaNotificationView's expanded state changes. + virtual void OnExpanded(bool expanded) = 0; +}; + +} // namespace media_message_center + +#endif // COMPONENTS_MEDIA_MESSAGE_CENTER_MEDIA_NOTIFICATION_CONTAINER_H_
diff --git a/components/media_message_center/media_notification_controller.h b/components/media_message_center/media_notification_controller.h new file mode 100644 index 0000000..ae1ed4f1 --- /dev/null +++ b/components/media_message_center/media_notification_controller.h
@@ -0,0 +1,26 @@ +// 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_MEDIA_MESSAGE_CENTER_MEDIA_NOTIFICATION_CONTROLLER_H_ +#define COMPONENTS_MEDIA_MESSAGE_CENTER_MEDIA_NOTIFICATION_CONTROLLER_H_ + +#include <string> + +#include "base/component_export.h" + +namespace media_message_center { + +// MediaNotificationController does the actual hiding and showing of the media +// notification. +class COMPONENT_EXPORT(MEDIA_MESSAGE_CENTER) MediaNotificationController { + public: + // Shows/hides a notification with the given request id. Called by + // MediaNotificationItem when the notification should be shown/hidden. + virtual void ShowNotification(const std::string& id) = 0; + virtual void HideNotification(const std::string& id) = 0; +}; + +} // namespace media_message_center + +#endif // COMPONENTS_MEDIA_MESSAGE_CENTER_MEDIA_NOTIFICATION_CONTROLLER_H_
diff --git a/ash/media/media_notification_item.cc b/components/media_message_center/media_notification_item.cc similarity index 94% rename from ash/media/media_notification_item.cc rename to components/media_message_center/media_notification_item.cc index 810be2df..bbec7339 100644 --- a/ash/media/media_notification_item.cc +++ b/components/media_message_center/media_notification_item.cc
@@ -2,21 +2,21 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "ash/media/media_notification_item.h" +#include "components/media_message_center/media_notification_item.h" -#include "ash/media/media_notification_constants.h" -#include "ash/media/media_notification_controller.h" -#include "ash/media/media_notification_view.h" #include "base/bind.h" #include "base/metrics/histogram_macros.h" #include "base/time/time.h" +#include "components/media_message_center/media_notification_constants.h" +#include "components/media_message_center/media_notification_controller.h" +#include "components/media_message_center/media_notification_view.h" #include "services/media_session/public/mojom/constants.mojom.h" #include "services/media_session/public/mojom/media_controller.mojom.h" #include "services/media_session/public/mojom/media_session.mojom.h" #include "ui/gfx/image/image.h" #include "ui/message_center/public/cpp/message_center_constants.h" -namespace ash { +namespace media_message_center { using media_session::mojom::MediaSessionAction; @@ -224,4 +224,4 @@ } } -} // namespace ash +} // namespace media_message_center
diff --git a/ash/media/media_notification_item.h b/components/media_message_center/media_notification_item.h similarity index 91% rename from ash/media/media_notification_item.h rename to components/media_message_center/media_notification_item.h index c5d461b9..7299f10 100644 --- a/ash/media/media_notification_item.h +++ b/components/media_message_center/media_notification_item.h
@@ -2,13 +2,13 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef ASH_MEDIA_MEDIA_NOTIFICATION_ITEM_H_ -#define ASH_MEDIA_MEDIA_NOTIFICATION_ITEM_H_ +#ifndef COMPONENTS_MEDIA_MESSAGE_CENTER_MEDIA_NOTIFICATION_ITEM_H_ +#define COMPONENTS_MEDIA_MESSAGE_CENTER_MEDIA_NOTIFICATION_ITEM_H_ #include <set> #include <string> -#include "ash/ash_export.h" +#include "base/component_export.h" #include "base/macros.h" #include "base/memory/weak_ptr.h" #include "base/optional.h" @@ -17,14 +17,14 @@ #include "services/media_session/public/mojom/media_session.mojom.h" #include "ui/gfx/image/image_skia.h" -namespace ash { +namespace media_message_center { class MediaNotificationController; class MediaNotificationView; // MediaNotificationItem manages hiding/showing a media notification and // updating the metadata for a single media session. -class ASH_EXPORT MediaNotificationItem +class COMPONENT_EXPORT(MEDIA_MESSAGE_CENTER) MediaNotificationItem : public media_session::mojom::MediaControllerObserver, public media_session::mojom::MediaControllerImageObserver { public: @@ -131,6 +131,6 @@ DISALLOW_COPY_AND_ASSIGN(MediaNotificationItem); }; -} // namespace ash +} // namespace media_message_center -#endif // ASH_MEDIA_MEDIA_NOTIFICATION_ITEM_H_ +#endif // COMPONENTS_MEDIA_MESSAGE_CENTER_MEDIA_NOTIFICATION_ITEM_H_
diff --git a/ash/media/media_notification_view.cc b/components/media_message_center/media_notification_view.cc similarity index 91% rename from ash/media/media_notification_view.cc rename to components/media_message_center/media_notification_view.cc index 53d72ae3..db27cbc 100644 --- a/ash/media/media_notification_view.cc +++ b/components/media_message_center/media_notification_view.cc
@@ -2,16 +2,16 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "ash/media/media_notification_view.h" +#include "components/media_message_center/media_notification_view.h" -#include "ash/media/media_notification_background.h" -#include "ash/media/media_notification_constants.h" -#include "ash/media/media_notification_container.h" -#include "ash/media/media_notification_item.h" -#include "ash/strings/grit/ash_strings.h" #include "base/metrics/histogram_macros.h" #include "base/stl_util.h" #include "base/strings/utf_string_conversions.h" +#include "components/media_message_center/media_notification_background.h" +#include "components/media_message_center/media_notification_constants.h" +#include "components/media_message_center/media_notification_container.h" +#include "components/media_message_center/media_notification_item.h" +#include "components/strings/grit/components_strings.h" #include "components/vector_icons/vector_icons.h" #include "services/media_session/public/mojom/media_session.mojom.h" #include "ui/accessibility/ax_node_data.h" @@ -25,7 +25,7 @@ #include "ui/views/style/typography.h" #include "ui/views/view_class_properties.h" -namespace ash { +namespace media_message_center { using media_session::mojom::MediaSessionAction; @@ -174,30 +174,34 @@ button_row->SetPreferredSize(kMediaNotificationButtonRowSize); button_row_ = main_row_->AddChildView(std::move(button_row)); - CreateMediaButton(MediaSessionAction::kPreviousTrack, - l10n_util::GetStringUTF16( - IDS_ASH_MEDIA_NOTIFICATION_ACTION_PREVIOUS_TRACK)); - CreateMediaButton(MediaSessionAction::kSeekBackward, - l10n_util::GetStringUTF16( - IDS_ASH_MEDIA_NOTIFICATION_ACTION_SEEK_BACKWARD)); + CreateMediaButton( + MediaSessionAction::kPreviousTrack, + l10n_util::GetStringUTF16( + IDS_MEDIA_MESSAGE_CENTER_MEDIA_NOTIFICATION_ACTION_PREVIOUS_TRACK)); + CreateMediaButton( + MediaSessionAction::kSeekBackward, + l10n_util::GetStringUTF16( + IDS_MEDIA_MESSAGE_CENTER_MEDIA_NOTIFICATION_ACTION_SEEK_BACKWARD)); // |play_pause_button_| toggles playback. auto play_pause_button = views::CreateVectorToggleImageButton(this); play_pause_button->set_tag(static_cast<int>(MediaSessionAction::kPlay)); play_pause_button->SetPreferredSize(kMediaButtonSize); play_pause_button->SetFocusBehavior(views::View::FocusBehavior::ALWAYS); - play_pause_button->SetTooltipText( - l10n_util::GetStringUTF16(IDS_ASH_MEDIA_NOTIFICATION_ACTION_PLAY)); - play_pause_button->SetToggledTooltipText( - l10n_util::GetStringUTF16(IDS_ASH_MEDIA_NOTIFICATION_ACTION_PAUSE)); + play_pause_button->SetTooltipText(l10n_util::GetStringUTF16( + IDS_MEDIA_MESSAGE_CENTER_MEDIA_NOTIFICATION_ACTION_PLAY)); + play_pause_button->SetToggledTooltipText(l10n_util::GetStringUTF16( + IDS_MEDIA_MESSAGE_CENTER_MEDIA_NOTIFICATION_ACTION_PAUSE)); play_pause_button_ = button_row_->AddChildView(std::move(play_pause_button)); - CreateMediaButton(MediaSessionAction::kSeekForward, - l10n_util::GetStringUTF16( - IDS_ASH_MEDIA_NOTIFICATION_ACTION_SEEK_FORWARD)); + CreateMediaButton( + MediaSessionAction::kSeekForward, + l10n_util::GetStringUTF16( + IDS_MEDIA_MESSAGE_CENTER_MEDIA_NOTIFICATION_ACTION_SEEK_FORWARD)); CreateMediaButton( MediaSessionAction::kNextTrack, - l10n_util::GetStringUTF16(IDS_ASH_MEDIA_NOTIFICATION_ACTION_NEXT_TRACK)); + l10n_util::GetStringUTF16( + IDS_MEDIA_MESSAGE_CENTER_MEDIA_NOTIFICATION_ACTION_NEXT_TRACK)); SetBackground(std::make_unique<MediaNotificationBackground>( this, message_center::kNotificationCornerRadius, @@ -240,7 +244,8 @@ node_data->role = ax::mojom::Role::kListItem; node_data->AddStringAttribute( ax::mojom::StringAttribute::kRoleDescription, - l10n_util::GetStringUTF8(IDS_ASH_MEDIA_NOTIFICATION_ACCESSIBLE_NAME)); + l10n_util::GetStringUTF8( + IDS_MEDIA_MESSAGE_CENTER_MEDIA_NOTIFICATION_ACCESSIBLE_NAME)); if (!accessible_name_.empty()) node_data->SetName(accessible_name_); @@ -507,4 +512,4 @@ } } -} // namespace ash +} // namespace media_message_center
diff --git a/ash/media/media_notification_view.h b/components/media_message_center/media_notification_view.h similarity index 90% rename from ash/media/media_notification_view.h rename to components/media_message_center/media_notification_view.h index 86b3381c..a1f3a01 100644 --- a/ash/media/media_notification_view.h +++ b/components/media_message_center/media_notification_view.h
@@ -2,10 +2,10 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef ASH_MEDIA_MEDIA_NOTIFICATION_VIEW_H_ -#define ASH_MEDIA_MEDIA_NOTIFICATION_VIEW_H_ +#ifndef COMPONENTS_MEDIA_MESSAGE_CENTER_MEDIA_NOTIFICATION_VIEW_H_ +#define COMPONENTS_MEDIA_MESSAGE_CENTER_MEDIA_NOTIFICATION_VIEW_H_ -#include "ash/ash_export.h" +#include "base/component_export.h" #include "base/memory/weak_ptr.h" #include "services/media_session/public/mojom/media_session.mojom.h" #include "ui/views/controls/button/button.h" @@ -31,7 +31,7 @@ class View; } // namespace views -namespace ash { +namespace media_message_center { class MediaNotificationBackground; class MediaNotificationContainer; @@ -39,8 +39,9 @@ // MediaNotificationView will show up as a custom view. It will show the // currently playing media and provide playback controls. -class ASH_EXPORT MediaNotificationView : public views::View, - public views::ButtonListener { +class COMPONENT_EXPORT(MEDIA_MESSAGE_CENTER) MediaNotificationView + : public views::View, + public views::ButtonListener { public: // The name of the histogram used when recorded whether the artwork was // present. @@ -146,6 +147,6 @@ DISALLOW_COPY_AND_ASSIGN(MediaNotificationView); }; -} // namespace ash +} // namespace media_message_center -#endif // ASH_MEDIA_MEDIA_NOTIFICATION_VIEW_H_ +#endif // COMPONENTS_MEDIA_MESSAGE_CENTER_MEDIA_NOTIFICATION_VIEW_H_
diff --git a/ash/media/media_notification_view_unittest.cc b/components/media_message_center/media_notification_view_unittest.cc similarity index 97% rename from ash/media/media_notification_view_unittest.cc rename to components/media_message_center/media_notification_view_unittest.cc index 2e686288..a761822 100644 --- a/ash/media/media_notification_view_unittest.cc +++ b/components/media_message_center/media_notification_view_unittest.cc
@@ -2,27 +2,26 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "ash/media/media_notification_view.h" +#include "components/media_message_center/media_notification_view.h" #include <memory> -#include "ash/media/media_notification_background.h" -#include "ash/media/media_notification_constants.h" -#include "ash/media/media_notification_container.h" -#include "ash/media/media_notification_controller.h" -#include "ash/media/media_notification_item.h" #include "base/bind.h" #include "base/macros.h" #include "base/strings/utf_string_conversions.h" #include "base/test/metrics/histogram_tester.h" #include "base/unguessable_token.h" +#include "components/media_message_center/media_notification_background.h" +#include "components/media_message_center/media_notification_constants.h" +#include "components/media_message_center/media_notification_container.h" +#include "components/media_message_center/media_notification_controller.h" +#include "components/media_message_center/media_notification_item.h" #include "services/media_session/public/cpp/test/test_media_controller.h" #include "services/media_session/public/mojom/audio_focus.mojom.h" #include "services/media_session/public/mojom/media_session.mojom.h" #include "testing/gmock/include/gmock/gmock.h" #include "ui/accessibility/ax_node_data.h" #include "ui/events/base_event_utils.h" -#include "ui/events/test/event_generator.h" #include "ui/message_center/message_center.h" #include "ui/message_center/public/cpp/message_center_constants.h" #include "ui/message_center/views/message_view_factory.h" @@ -31,7 +30,7 @@ #include "ui/views/controls/image_view.h" #include "ui/views/test/views_test_base.h" -namespace ash { +namespace media_message_center { using media_session::mojom::MediaSessionAction; using media_session::test::TestMediaController; @@ -894,4 +893,4 @@ EXPECT_EQ(base::ASCIIToUTF16("title - artist"), accessible_name()); } -} // namespace ash +} // namespace media_message_center
diff --git a/components/media_message_center_strings.grdp b/components/media_message_center_strings.grdp new file mode 100644 index 0000000..ac1c51e --- /dev/null +++ b/components/media_message_center_strings.grdp
@@ -0,0 +1,24 @@ +<?xml version="1.0" encoding="utf-8"?> +<grit-part> + <message name="IDS_MEDIA_MESSAGE_CENTER_MEDIA_NOTIFICATION_ACTION_PREVIOUS_TRACK" desc="The button to trigger media playback to go to the previous track."> + Previous Track + </message> + <message name="IDS_MEDIA_MESSAGE_CENTER_MEDIA_NOTIFICATION_ACTION_SEEK_BACKWARD" desc="The button to trigger media playback to seek backwards a few seconds."> + Seek Backward + </message> + <message name="IDS_MEDIA_MESSAGE_CENTER_MEDIA_NOTIFICATION_ACTION_PLAY" desc="The button to trigger media playback to start."> + Play + </message> + <message name="IDS_MEDIA_MESSAGE_CENTER_MEDIA_NOTIFICATION_ACTION_PAUSE" desc="The button to trigger media playback to pause."> + Pause + </message> + <message name="IDS_MEDIA_MESSAGE_CENTER_MEDIA_NOTIFICATION_ACTION_SEEK_FORWARD" desc="The button to trigger media playback to seek forwards a few seconds."> + Seek Forward + </message> + <message name="IDS_MEDIA_MESSAGE_CENTER_MEDIA_NOTIFICATION_ACTION_NEXT_TRACK" desc="The button to trigger media playback to go to the next track."> + Next Track + </message> + <message name="IDS_MEDIA_MESSAGE_CENTER_MEDIA_NOTIFICATION_ACCESSIBLE_NAME" desc="The accessible name for the media notification to control playback."> + Media Controls + </message> +</grit-part>
diff --git a/components/metrics/BUILD.gn b/components/metrics/BUILD.gn index 2936b894..d2a896a 100644 --- a/components/metrics/BUILD.gn +++ b/components/metrics/BUILD.gn
@@ -93,7 +93,6 @@ "stability_metrics_provider.h", "system_memory_stats_recorder.h", "system_memory_stats_recorder_linux.cc", - "system_memory_stats_recorder_win.cc", "system_session_analyzer_win.cc", "system_session_analyzer_win.h", "unsent_log_store.cc",
diff --git a/components/metrics/expired_histograms_checker.cc b/components/metrics/expired_histograms_checker.cc index d1d3ecb..43a6e05 100644 --- a/components/metrics/expired_histograms_checker.cc +++ b/components/metrics/expired_histograms_checker.cc
@@ -26,7 +26,7 @@ bool ExpiredHistogramsChecker::ShouldRecord(uint64_t histogram_hash) const { // If histogram is whitelisted then it should always be recorded. - if (base::ContainsKey(whitelist_, histogram_hash)) + if (base::Contains(whitelist_, histogram_hash)) return true; return !std::binary_search(array_, array_ + size_, histogram_hash); }
diff --git a/components/metrics/persistent_system_profile.cc b/components/metrics/persistent_system_profile.cc index fa35a44d..ef4bdff 100644 --- a/components/metrics/persistent_system_profile.cc +++ b/components/metrics/persistent_system_profile.cc
@@ -412,7 +412,7 @@ if (iter.ReadStringPiece(&trial) && iter.ReadStringPiece(&group)) { variations::ActiveGroupId field_ids = variations::MakeActiveGroupId(trial, group); - if (!base::ContainsKey(known_field_trial_ids, field_ids.name)) { + if (!base::Contains(known_field_trial_ids, field_ids.name)) { SystemProfileProto::FieldTrial* field_trial = system_profile->add_field_trial(); field_trial->set_name_id(field_ids.name);
diff --git a/components/metrics/system_memory_stats_recorder.h b/components/metrics/system_memory_stats_recorder.h index bdd30f0..7d39136 100644 --- a/components/metrics/system_memory_stats_recorder.h +++ b/components/metrics/system_memory_stats_recorder.h
@@ -13,9 +13,6 @@ // The type of memory UMA stats to be recorded in RecordMemoryStats. enum RecordMemoryStatsType { - // When a tab was discarded. - RECORD_MEMORY_STATS_TAB_DISCARDED, - // Right after the renderer for contents was killed. RECORD_MEMORY_STATS_CONTENTS_OOM_KILLED,
diff --git a/components/metrics/system_memory_stats_recorder_linux.cc b/components/metrics/system_memory_stats_recorder_linux.cc index c69dbaa..72c6084 100644 --- a/components/metrics/system_memory_stats_recorder_linux.cc +++ b/components/metrics/system_memory_stats_recorder_linux.cc
@@ -54,18 +54,6 @@ (memory.active_file + memory.inactive_file + memory.free) / 1024; switch (type) { - case RECORD_MEMORY_STATS_TAB_DISCARDED: { -#if defined(OS_CHROMEOS) - UMA_HISTOGRAM_MEGABYTES_LINEAR("Tabs.Discard.MemGraphicsMB", - mem_graphics_gem_mb); - UMA_HISTOGRAM_MEGABYTES_LINEAR("Tabs.Discard.MemShmemMB", mem_shmem_mb); -#endif - UMA_HISTOGRAM_ALLOCATED_MEGABYTES("Tabs.Discard.MemAllocatedMB", - mem_allocated_mb); - UMA_HISTOGRAM_LARGE_MEMORY_MB("Tabs.Discard.MemAvailableMB", - mem_available_mb); - break; - } case RECORD_MEMORY_STATS_CONTENTS_OOM_KILLED: { #if defined(OS_CHROMEOS) UMA_HISTOGRAM_MEGABYTES_LINEAR("Memory.OOMKill.Contents.MemGraphicsMB",
diff --git a/components/metrics/system_memory_stats_recorder_win.cc b/components/metrics/system_memory_stats_recorder_win.cc deleted file mode 100644 index 7d01182..0000000 --- a/components/metrics/system_memory_stats_recorder_win.cc +++ /dev/null
@@ -1,47 +0,0 @@ -// Copyright 2015 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/metrics/system_memory_stats_recorder.h" - -#include <windows.h> - -#include "base/metrics/histogram_macros.h" -#include "base/process/process_metrics.h" - -namespace metrics { -namespace { -enum { kMBytes = 1024 * 1024 }; -} - -void RecordMemoryStats(RecordMemoryStatsType type) { - MEMORYSTATUSEX mem_status; - mem_status.dwLength = sizeof(mem_status); - if (!::GlobalMemoryStatusEx(&mem_status)) - return; - - switch (type) { - case RECORD_MEMORY_STATS_TAB_DISCARDED: { - UMA_HISTOGRAM_CUSTOM_COUNTS("Memory.Stats.Win.MemoryLoad", - mem_status.dwMemoryLoad, 1, 100, 101); - UMA_HISTOGRAM_LARGE_MEMORY_MB("Memory.Stats.Win.TotalPhys2", - mem_status.ullTotalPhys / kMBytes); - UMA_HISTOGRAM_LARGE_MEMORY_MB("Memory.Stats.Win.AvailPhys2", - mem_status.ullAvailPhys / kMBytes); - UMA_HISTOGRAM_LARGE_MEMORY_MB("Memory.Stats.Win.TotalPageFile2", - mem_status.ullTotalPageFile / kMBytes); - UMA_HISTOGRAM_LARGE_MEMORY_MB("Memory.Stats.Win.AvailPageFile2", - mem_status.ullAvailPageFile / kMBytes); - UMA_HISTOGRAM_LARGE_MEMORY_MB("Memory.Stats.Win.TotalVirtual2", - mem_status.ullTotalVirtual / kMBytes); - UMA_HISTOGRAM_LARGE_MEMORY_MB("Memory.Stats.Win.AvailVirtual2", - mem_status.ullAvailVirtual / kMBytes); - break; - } - default: - NOTREACHED() << "Received unexpected notification"; - break; - } -} - -} // namespace metrics
diff --git a/components/network_session_configurator/browser/network_session_configurator_unittest.cc b/components/network_session_configurator/browser/network_session_configurator_unittest.cc index 916450a..67c81dd2 100644 --- a/components/network_session_configurator/browser/network_session_configurator_unittest.cc +++ b/components/network_session_configurator/browser/network_session_configurator_unittest.cc
@@ -578,10 +578,8 @@ ParseFieldTrials(); EXPECT_EQ(2u, params_.quic_host_whitelist.size()); - EXPECT_TRUE( - base::ContainsKey(params_.quic_host_whitelist, "www.example.com")); - EXPECT_TRUE( - base::ContainsKey(params_.quic_host_whitelist, "www.example.org")); + EXPECT_TRUE(base::Contains(params_.quic_host_whitelist, "www.example.com")); + EXPECT_TRUE(base::Contains(params_.quic_host_whitelist, "www.example.org")); } TEST_F(NetworkSessionConfiguratorTest, QuicHostWhitelistEmpty) {
diff --git a/components/ntp_snippets/category_rankers/constant_category_ranker.cc b/components/ntp_snippets/category_rankers/constant_category_ranker.cc index 01f22116..b408bb6f 100644 --- a/components/ntp_snippets/category_rankers/constant_category_ranker.cc +++ b/components/ntp_snippets/category_rankers/constant_category_ranker.cc
@@ -30,11 +30,11 @@ ConstantCategoryRanker::~ConstantCategoryRanker() = default; bool ConstantCategoryRanker::Compare(Category left, Category right) const { - if (!base::ContainsValue(ordered_categories_, left)) { + if (!base::Contains(ordered_categories_, left)) { LOG(DFATAL) << "The category with ID " << left.id() << " has not been added using AppendCategoryIfNecessary."; } - if (!base::ContainsValue(ordered_categories_, right)) { + if (!base::Contains(ordered_categories_, right)) { LOG(DFATAL) << "The category with ID " << right.id() << " has not been added using AppendCategoryIfNecessary."; } @@ -62,7 +62,7 @@ } void ConstantCategoryRanker::AppendCategoryIfNecessary(Category category) { - if (!base::ContainsValue(ordered_categories_, category)) { + if (!base::Contains(ordered_categories_, category)) { ordered_categories_.push_back(category); } } @@ -127,7 +127,7 @@ void ConstantCategoryRanker::AppendKnownCategory( KnownCategories known_category) { Category category = Category::FromKnownCategory(known_category); - DCHECK(!base::ContainsValue(ordered_categories_, category)); + DCHECK(!base::Contains(ordered_categories_, category)); ordered_categories_.push_back(category); }
diff --git a/components/ntp_snippets/category_rankers/fake_category_ranker.cc b/components/ntp_snippets/category_rankers/fake_category_ranker.cc index 42ce8bc..03c7cda6 100644 --- a/components/ntp_snippets/category_rankers/fake_category_ranker.cc +++ b/components/ntp_snippets/category_rankers/fake_category_ranker.cc
@@ -15,8 +15,8 @@ FakeCategoryRanker::~FakeCategoryRanker() = default; bool FakeCategoryRanker::Compare(Category left, Category right) const { - DCHECK(base::ContainsValue(categories_, left)); - DCHECK(base::ContainsValue(categories_, right)); + DCHECK(base::Contains(categories_, left)); + DCHECK(base::Contains(categories_, right)); return std::find(categories_.begin(), categories_.end(), left) < std::find(categories_.begin(), categories_.end(), right);
diff --git a/components/ntp_snippets/content_suggestions_service.cc b/components/ntp_snippets/content_suggestions_service.cc index 39ade14..532fb95a 100644 --- a/components/ntp_snippets/content_suggestions_service.cc +++ b/components/ntp_snippets/content_suggestions_service.cc
@@ -600,7 +600,7 @@ void ContentSuggestionsService::RegisterCategory( Category category, ContentSuggestionsProvider* provider) { - DCHECK(!base::ContainsKey(providers_by_category_, category)); + DCHECK(!base::Contains(providers_by_category_, category)); DCHECK(!IsCategoryDismissed(category)); providers_by_category_[category] = provider; @@ -664,12 +664,12 @@ } bool ContentSuggestionsService::IsCategoryDismissed(Category category) const { - return base::ContainsKey(dismissed_providers_by_category_, category); + return base::Contains(dismissed_providers_by_category_, category); } void ContentSuggestionsService::RestoreDismissedCategory(Category category) { auto dismissed_it = dismissed_providers_by_category_.find(category); - DCHECK(base::ContainsKey(dismissed_providers_by_category_, category)); + DCHECK(base::Contains(dismissed_providers_by_category_, category)); // Keep the reference to the provider and remove it from the dismissed ones, // because the category registration enforces that it's not dismissed.
diff --git a/components/ntp_snippets/remote/remote_suggestions_provider_impl.cc b/components/ntp_snippets/remote/remote_suggestions_provider_impl.cc index c862118..d6f32b78 100644 --- a/components/ntp_snippets/remote/remote_suggestions_provider_impl.cc +++ b/components/ntp_snippets/remote/remote_suggestions_provider_impl.cc
@@ -455,7 +455,7 @@ GURL RemoteSuggestionsProviderImpl::GetUrlWithFavicon( const ContentSuggestion::ID& suggestion_id) const { - DCHECK(base::ContainsKey(category_contents_, suggestion_id.category())); + DCHECK(base::Contains(category_contents_, suggestion_id.category())); const CategoryContent& content = category_contents_.at(suggestion_id.category()); @@ -758,7 +758,7 @@ GURL RemoteSuggestionsProviderImpl::FindSuggestionImageUrl( const ContentSuggestion::ID& suggestion_id) const { - DCHECK(base::ContainsKey(category_contents_, suggestion_id.category())); + DCHECK(base::Contains(category_contents_, suggestion_id.category())); const CategoryContent& content = category_contents_.at(suggestion_id.category()); @@ -776,7 +776,7 @@ return; } DCHECK(state_ == State::NOT_INITED); - DCHECK(base::ContainsKey(category_contents_, articles_category_)); + DCHECK(base::Contains(category_contents_, articles_category_)); base::TimeDelta database_load_time = base::TimeTicks::Now() - database_load_start_; @@ -1180,7 +1180,7 @@ [&content](const std::unique_ptr<RemoteSuggestion>& suggestion) { const std::vector<std::string>& ids = suggestion->GetAllIDs(); for (const auto& archived_suggestion : content->archived) { - if (base::ContainsValue(ids, archived_suggestion->id())) { + if (base::Contains(ids, archived_suggestion->id())) { return true; } } @@ -1365,7 +1365,7 @@ GURL RemoteSuggestionsProviderImpl::GetImageURLToFetch( const ContentSuggestion::ID& suggestion_id) const { - if (!base::ContainsKey(category_contents_, suggestion_id.category())) { + if (!base::Contains(category_contents_, suggestion_id.category())) { return GURL(); } return FindSuggestionImageUrl(suggestion_id);
diff --git a/components/offline_pages/core/client_policy_controller_unittest.cc b/components/offline_pages/core/client_policy_controller_unittest.cc index 11df089..535a174 100644 --- a/components/offline_pages/core/client_policy_controller_unittest.cc +++ b/components/offline_pages/core/client_policy_controller_unittest.cc
@@ -76,8 +76,8 @@ bool expectation) { EXPECT_EQ( expectation, - base::ContainsValue(controller()->GetNamespacesForUserRequestedDownload(), - name_space)) + base::Contains(controller()->GetNamespacesForUserRequestedDownload(), + name_space)) << "Namespace " << name_space << " had incorrect user generated download support when getting" " namespaces supported by user generaged download.";
diff --git a/components/offline_pages/core/page_criteria.cc b/components/offline_pages/core/page_criteria.cc index 2fd77762..6738b45 100644 --- a/components/offline_pages/core/page_criteria.cc +++ b/components/offline_pages/core/page_criteria.cc
@@ -35,12 +35,12 @@ return false; } if (criteria.client_ids && - !base::ContainsValue(criteria.client_ids.value(), client_id)) { + !base::Contains(criteria.client_ids.value(), client_id)) { return false; } if (criteria.client_namespaces && - !base::ContainsValue(criteria.client_namespaces.value(), - client_id.name_space)) { + !base::Contains(criteria.client_namespaces.value(), + client_id.name_space)) { return false; } if (criteria.supported_by_downloads && @@ -84,7 +84,7 @@ } if (criteria.offline_ids && - !base::ContainsValue(criteria.offline_ids.value(), item.offline_id)) { + !base::Contains(criteria.offline_ids.value(), item.offline_id)) { return false; }
diff --git a/components/offline_pages/core/prefetch/prefetch_background_task.cc b/components/offline_pages/core/prefetch/prefetch_background_task.cc index 6fc5f98..fdbc9555 100644 --- a/components/offline_pages/core/prefetch/prefetch_background_task.cc +++ b/components/offline_pages/core/prefetch/prefetch_background_task.cc
@@ -38,10 +38,8 @@ break; } - if (reschedule_type_ != PrefetchBackgroundTaskRescheduleType::NO_RESCHEDULE) { - DCHECK(!service_->GetCachedGCMToken().empty()); - handler->EnsureTaskScheduled(service_->GetCachedGCMToken()); - } + if (reschedule_type_ != PrefetchBackgroundTaskRescheduleType::NO_RESCHEDULE) + handler->EnsureTaskScheduled(); } void PrefetchBackgroundTask::SetReschedule(
diff --git a/components/offline_pages/core/prefetch/prefetch_background_task_handler.h b/components/offline_pages/core/prefetch/prefetch_background_task_handler.h index 699a56a6..cf06732 100644 --- a/components/offline_pages/core/prefetch/prefetch_background_task_handler.h +++ b/components/offline_pages/core/prefetch/prefetch_background_task_handler.h
@@ -6,7 +6,6 @@ #define COMPONENTS_OFFLINE_PAGES_CORE_PREFETCH_PREFETCH_BACKGROUND_TASK_HANDLER_H_ #include <memory> -#include <string> namespace offline_pages { @@ -20,7 +19,7 @@ // Ensures that Chrome will be started using a background task at an // appropriate time in the future. - virtual void EnsureTaskScheduled(const std::string& gcm_token) = 0; + virtual void EnsureTaskScheduled() = 0; // Requests that the network backoff be increased due to a server response. virtual void Backoff() = 0;
diff --git a/components/offline_pages/core/prefetch/prefetch_dispatcher_impl.cc b/components/offline_pages/core/prefetch/prefetch_dispatcher_impl.cc index 34bd528..4dc9a93 100644 --- a/components/offline_pages/core/prefetch/prefetch_dispatcher_impl.cc +++ b/components/offline_pages/core/prefetch/prefetch_dispatcher_impl.cc
@@ -91,17 +91,10 @@ background_task_->SetReschedule( PrefetchBackgroundTaskRescheduleType::RESCHEDULE_WITHOUT_BACKOFF); } else { - service_->GetGCMToken( - base::BindOnce(&PrefetchDispatcherImpl::EnsureTaskScheduledWithGCMToken, - weak_factory_.GetWeakPtr())); + service_->GetPrefetchBackgroundTaskHandler()->EnsureTaskScheduled(); } } -void PrefetchDispatcherImpl::EnsureTaskScheduledWithGCMToken( - const std::string& gcm_token) { - service_->GetPrefetchBackgroundTaskHandler()->EnsureTaskScheduled(gcm_token); -} - void PrefetchDispatcherImpl::AddCandidatePrefetchURLs( const std::string& name_space, const std::vector<PrefetchURL>& prefetch_urls) {
diff --git a/components/offline_pages/core/prefetch/prefetch_dispatcher_impl.h b/components/offline_pages/core/prefetch/prefetch_dispatcher_impl.h index 8e25cc54..5ddee71 100644 --- a/components/offline_pages/core/prefetch/prefetch_dispatcher_impl.h +++ b/components/offline_pages/core/prefetch/prefetch_dispatcher_impl.h
@@ -74,8 +74,6 @@ void DisposeTask(); - void EnsureTaskScheduledWithGCMToken(const std::string& gcm_token); - // Callbacks for network requests. void DidGenerateBundleOrGetOperationRequest( const std::string& request_name_for_logging,
diff --git a/components/offline_pages/core/prefetch/prefetch_dispatcher_impl_unittest.cc b/components/offline_pages/core/prefetch/prefetch_dispatcher_impl_unittest.cc index 37ceb4f..9982cb7 100644 --- a/components/offline_pages/core/prefetch/prefetch_dispatcher_impl_unittest.cc +++ b/components/offline_pages/core/prefetch/prefetch_dispatcher_impl_unittest.cc
@@ -305,6 +305,8 @@ taco_ = std::make_unique<PrefetchServiceTestTaco>(suggestion_source); prefetch_prefs::SetEnabledByServer(taco_->pref_service(), true); + prefetch_prefs::SetCachedPrefetchGCMToken(taco_->pref_service(), + "dummy_gcm_token"); dispatcher_ = new PrefetchDispatcherImpl(taco_->pref_service()); network_request_factory_ = new FakePrefetchNetworkRequestFactory( shared_url_loader_factory(), taco_->pref_service());
diff --git a/components/offline_pages/core/prefetch/prefetch_download_flow_unittest.cc b/components/offline_pages/core/prefetch/prefetch_download_flow_unittest.cc index a97a121..7e076d0 100644 --- a/components/offline_pages/core/prefetch/prefetch_download_flow_unittest.cc +++ b/components/offline_pages/core/prefetch/prefetch_download_flow_unittest.cc
@@ -44,6 +44,8 @@ prefetch_service_taco_->SetPrefService(std::move(prefs_)); prefetch_prefs::SetEnabledByServer(prefetch_service_taco_->pref_service(), true); + prefetch_prefs::SetCachedPrefetchGCMToken( + prefetch_service_taco_->pref_service(), "dummy_gcm_token"); auto downloader = std::make_unique<PrefetchDownloaderImpl>( &download_service_, kTestChannel, @@ -56,8 +58,6 @@ prefetch_service_taco_->SetPrefetchStore(store_util()->ReleaseStore()); prefetch_service_taco_->SetPrefetchDownloader(std::move(downloader)); prefetch_service_taco_->CreatePrefetchService(); - prefetch_service_taco_->prefetch_service()->SetCachedGCMToken( - "dummy_gcm_token"); item_generator()->set_client_namespace(kSuggestedArticlesNamespace); }
diff --git a/components/offline_pages/core/prefetch/prefetch_gcm_app_handler_unittest.cc b/components/offline_pages/core/prefetch/prefetch_gcm_app_handler_unittest.cc index b4d6753..69bc7ca3 100644 --- a/components/offline_pages/core/prefetch/prefetch_gcm_app_handler_unittest.cc +++ b/components/offline_pages/core/prefetch/prefetch_gcm_app_handler_unittest.cc
@@ -7,8 +7,7 @@ #include <utility> #include "base/bind.h" -#include "base/message_loop/message_loop.h" -#include "base/test/test_simple_task_runner.h" +#include "base/test/scoped_task_environment.h" #include "components/gcm_driver/instance_id/instance_id.h" #include "components/offline_pages/core/prefetch/prefetch_service_test_taco.h" #include "components/offline_pages/core/prefetch/test_prefetch_dispatcher.h" @@ -35,11 +34,7 @@ class PrefetchGCMAppHandlerTest : public testing::Test { public: - PrefetchGCMAppHandlerTest() : task_runner_(new base::TestSimpleTaskRunner) { - message_loop_.SetTaskRunner(task_runner_); - } - - void SetUp() override { + PrefetchGCMAppHandlerTest() { auto dispatcher = std::make_unique<TestPrefetchDispatcher>(); test_dispatcher_ = dispatcher.get(); @@ -56,10 +51,10 @@ prefetch_service_taco_->CreatePrefetchService(); } - void TearDown() override { + ~PrefetchGCMAppHandlerTest() override { // Ensures that the store is properly disposed off. prefetch_service_taco_.reset(); - task_runner_->RunUntilIdle(); + scoped_task_environment_.RunUntilIdle(); } TestPrefetchDispatcher* dispatcher() { return test_dispatcher_; } @@ -67,8 +62,7 @@ TestTokenFactory* token_factory() { return token_factory_; } private: - base::MessageLoop message_loop_; - scoped_refptr<base::TestSimpleTaskRunner> task_runner_; + base::test::ScopedTaskEnvironment scoped_task_environment_; std::unique_ptr<PrefetchServiceTestTaco> prefetch_service_taco_; // Owned by the taco.
diff --git a/components/offline_pages/core/prefetch/prefetch_prefs.cc b/components/offline_pages/core/prefetch/prefetch_prefs.cc index 8f6aa5a..0fbfcf47 100644 --- a/components/offline_pages/core/prefetch/prefetch_prefs.cc +++ b/components/offline_pages/core/prefetch/prefetch_prefs.cc
@@ -20,13 +20,12 @@ const char kEnabledByServer[] = "offline_prefetch.enabled_by_server"; const char kNextForbiddenCheckTimePref[] = "offline_prefetch.next_gpb_check"; const base::TimeDelta kForbiddenCheckDelay = base::TimeDelta::FromDays(7); +const char kPrefetchCachedGCMToken[] = "offline_prefetch.gcm_token"; } // namespace const char kUserSettingEnabled[] = "offline_prefetch.enabled"; const char kBackoff[] = "offline_prefetch.backoff"; -const char kContentSuggestionsNotificationsEnabled[] = - "ntp.content_suggestions.notifications.enabled"; void RegisterPrefs(PrefRegistrySimple* registry) { registry->RegisterListPref(kBackoff); @@ -36,7 +35,7 @@ registry->RegisterStringPref(kPrefetchTestingHeaderPref, std::string()); registry->RegisterBooleanPref(kEnabledByServer, false); registry->RegisterTimePref(kNextForbiddenCheckTimePref, base::Time()); - registry->RegisterBooleanPref(kContentSuggestionsNotificationsEnabled, true); + registry->RegisterStringPref(kPrefetchCachedGCMToken, std::string()); } void SetPrefetchingEnabledInSettings(PrefService* prefs, bool enabled) { @@ -123,5 +122,15 @@ prefs->SetTime(kNextForbiddenCheckTimePref, base::Time()); } +void SetCachedPrefetchGCMToken(PrefService* prefs, const std::string& value) { + DCHECK(prefs); + prefs->SetString(kPrefetchCachedGCMToken, value); +} + +std::string GetCachedPrefetchGCMToken(PrefService* prefs) { + DCHECK(prefs); + return prefs->GetString(kPrefetchCachedGCMToken); +} + } // namespace prefetch_prefs } // namespace offline_pages
diff --git a/components/offline_pages/core/prefetch/prefetch_prefs.h b/components/offline_pages/core/prefetch/prefetch_prefs.h index d9bb1557..24a1678 100644 --- a/components/offline_pages/core/prefetch/prefetch_prefs.h +++ b/components/offline_pages/core/prefetch/prefetch_prefs.h
@@ -18,7 +18,6 @@ extern const char kBackoff[]; extern const char kUserSettingEnabled[]; -extern const char kContentSuggestionsNotificationsEnabled[]; void RegisterPrefs(PrefRegistrySimple* registry); @@ -71,6 +70,11 @@ // run. void ResetForbiddenStateForTesting(PrefService* prefs); +// Caches the GCM token across browser restarts so that it can be accessed in +// reduced mode. +void SetCachedPrefetchGCMToken(PrefService* prefs, const std::string& value); +std::string GetCachedPrefetchGCMToken(PrefService* prefs); + } // namespace prefetch_prefs } // namespace offline_pages
diff --git a/components/offline_pages/core/prefetch/prefetch_service.h b/components/offline_pages/core/prefetch/prefetch_service.h index 53d1b8ee7..1be0ec5 100644 --- a/components/offline_pages/core/prefetch/prefetch_service.h +++ b/components/offline_pages/core/prefetch/prefetch_service.h
@@ -8,7 +8,6 @@ #include <string> #include "base/callback.h" -#include "base/memory/weak_ptr.h" #include "components/keyed_service/core/keyed_service.h" class GURL; @@ -88,13 +87,9 @@ // mode. virtual PrefetchGCMHandler* GetPrefetchGCMHandler() = 0; - // Obtains the current GCM token from the PrefetchGCMHandler - virtual void GetGCMToken(GCMTokenCallback callback) = 0; - - // Stores and retrieves a cached GCM token to be used if PrefetchGCMHandler is + // Retrieves a cached GCM token from prefs to be used if PrefetchGCMHandler is // unavailable. - virtual void SetCachedGCMToken(const std::string& gcm_token) = 0; - virtual const std::string& GetCachedGCMToken() const = 0; + virtual std::string GetCachedGCMToken() const = 0; virtual void SetEnabledByServer(PrefService* pref_service, bool enabled) = 0;
diff --git a/components/offline_pages/core/prefetch/prefetch_service_impl.cc b/components/offline_pages/core/prefetch/prefetch_service_impl.cc index ba3643b..610fc9b 100644 --- a/components/offline_pages/core/prefetch/prefetch_service_impl.cc +++ b/components/offline_pages/core/prefetch/prefetch_service_impl.cc
@@ -39,7 +39,8 @@ std::unique_ptr<PrefetchBackgroundTaskHandler> prefetch_background_task_handler, std::unique_ptr<ThumbnailFetcher> thumbnail_fetcher, - image_fetcher::ImageFetcher* image_fetcher) + image_fetcher::ImageFetcher* image_fetcher, + PrefService* prefs) : offline_metrics_collector_(std::move(offline_metrics_collector)), prefetch_dispatcher_(std::move(dispatcher)), network_request_factory_(std::move(network_request_factory)), @@ -49,6 +50,7 @@ prefetch_importer_(std::move(prefetch_importer)), prefetch_background_task_handler_( std::move(prefetch_background_task_handler)), + prefs_(prefs), suggested_articles_observer_(std::move(suggested_articles_observer)), thumbnail_fetcher_(std::move(thumbnail_fetcher)), image_fetcher_(image_fetcher), @@ -76,37 +78,24 @@ } } -void PrefetchServiceImpl::SetCachedGCMToken(const std::string& gcm_token) { - // This method is passed a cached token that was stored in the job scheduler, - // to be used until the PrefetchGCMHandler is created. In some cases, the - // PrefetchGCMHandler could have been already created and a fresher token - // requested before this function is called. Make sure to not override a - // fresher token with a stale one. - if (gcm_token_.empty()) - gcm_token_ = gcm_token; +std::string PrefetchServiceImpl::GetCachedGCMToken() const { + return prefetch_prefs::GetCachedPrefetchGCMToken(prefs_); } -const std::string& PrefetchServiceImpl::GetCachedGCMToken() const { - DCHECK(!gcm_token_.empty()) << "No cached token is set, you should call " - "PrefetchService::GetGCMToken instead"; - return gcm_token_; -} - -void PrefetchServiceImpl::GetGCMToken(GCMTokenCallback callback) { +void PrefetchServiceImpl::RefreshGCMToken() { DCHECK(prefetch_gcm_handler_); prefetch_gcm_handler_->GetGCMToken(base::AdaptCallbackForRepeating( - base::BindOnce(&PrefetchServiceImpl::OnGCMTokenReceived, GetWeakPtr(), - std::move(callback)))); + base::BindOnce(&PrefetchServiceImpl::OnGCMTokenReceived, GetWeakPtr()))); } void PrefetchServiceImpl::OnGCMTokenReceived( - GCMTokenCallback callback, const std::string& gcm_token, instance_id::InstanceID::Result result) { // TODO(dimich): Add UMA reporting on instance_id::InstanceID::Result. - // Keep the cached token fresh - gcm_token_ = gcm_token; - std::move(callback).Run(gcm_token); + if (result == instance_id::InstanceID::Result::SUCCESS) { + // Keep the cached token fresh + prefetch_prefs::SetCachedPrefetchGCMToken(prefs_, gcm_token); + } } void PrefetchServiceImpl::SetContentSuggestionsService(
diff --git a/components/offline_pages/core/prefetch/prefetch_service_impl.h b/components/offline_pages/core/prefetch/prefetch_service_impl.h index 5f44885..d7fefe8d 100644 --- a/components/offline_pages/core/prefetch/prefetch_service_impl.h +++ b/components/offline_pages/core/prefetch/prefetch_service_impl.h
@@ -33,7 +33,8 @@ std::unique_ptr<PrefetchImporter> prefetch_importer, std::unique_ptr<PrefetchBackgroundTaskHandler> background_task_handler, std::unique_ptr<ThumbnailFetcher> thumbnail_fetcher, - image_fetcher::ImageFetcher* image_fetcher_); + image_fetcher::ImageFetcher* image_fetcher_, + PrefService* prefs); ~PrefetchServiceImpl() override; @@ -46,9 +47,7 @@ void NewSuggestionsAvailable() override; void RemoveSuggestion(GURL url) override; PrefetchGCMHandler* GetPrefetchGCMHandler() override; - void SetCachedGCMToken(const std::string& gcm_token) override; - const std::string& GetCachedGCMToken() const override; - void GetGCMToken(GCMTokenCallback callback) override; + std::string GetCachedGCMToken() const override; void SetEnabledByServer(PrefService* pref_service, bool enabled) override; // Internal usage only functions. @@ -64,6 +63,7 @@ PrefetchBackgroundTaskHandler* GetPrefetchBackgroundTaskHandler() override; void SetPrefetchGCMHandler(std::unique_ptr<PrefetchGCMHandler> handler); + void RefreshGCMToken(); // Thumbnail fetchers. With Feed, GetImageFetcher() is available // and GetThumbnailFetcher() is null. @@ -78,12 +78,10 @@ void Shutdown() override; private: - void OnGCMTokenReceived(GCMTokenCallback callback, - const std::string& gcm_token, + void OnGCMTokenReceived(const std::string& gcm_token, instance_id::InstanceID::Result result); OfflineEventLogger logger_; - std::string gcm_token_; std::unique_ptr<PrefetchGCMHandler> prefetch_gcm_handler_; std::unique_ptr<OfflineMetricsCollector> offline_metrics_collector_; @@ -95,6 +93,7 @@ std::unique_ptr<PrefetchImporter> prefetch_importer_; std::unique_ptr<PrefetchBackgroundTaskHandler> prefetch_background_task_handler_; + PrefService* prefs_; // Zine/Feed: only non-null when using Zine. std::unique_ptr<SuggestedArticlesObserver> suggested_articles_observer_;
diff --git a/components/offline_pages/core/prefetch/prefetch_service_test_taco.cc b/components/offline_pages/core/prefetch/prefetch_service_test_taco.cc index f0eedd793..6759815 100644 --- a/components/offline_pages/core/prefetch/prefetch_service_test_taco.cc +++ b/components/offline_pages/core/prefetch/prefetch_service_test_taco.cc
@@ -46,7 +46,7 @@ StubPrefetchBackgroundTaskHandler() = default; ~StubPrefetchBackgroundTaskHandler() override = default; void CancelBackgroundTask() override {} - void EnsureTaskScheduled(const std::string& gcm_token) override {} + void EnsureTaskScheduled() override {} void Backoff() override {} void ResetBackoff() override {} void PauseBackoffUntilNextRun() override {} @@ -200,7 +200,8 @@ std::move(prefetch_store_), std::move(suggested_articles_observer_), std::move(prefetch_downloader_), std::move(prefetch_importer_), std::move(prefetch_background_task_handler_), - std::move(thumbnail_fetcher_), thumbnail_image_fetcher_.get()); + std::move(thumbnail_fetcher_), thumbnail_image_fetcher_.get(), + pref_service_.get()); service->SetPrefetchGCMHandler(std::move(gcm_handler_)); prefetch_service_ = std::move(service); }
diff --git a/components/offline_pages/core/prefetch/stub_prefetch_service.cc b/components/offline_pages/core/prefetch/stub_prefetch_service.cc index af8ddba..a7804f3 100644 --- a/components/offline_pages/core/prefetch/stub_prefetch_service.cc +++ b/components/offline_pages/core/prefetch/stub_prefetch_service.cc
@@ -18,14 +18,10 @@ void StubPrefetchService::RemoveSuggestion(GURL url) {} -void StubPrefetchService::SetCachedGCMToken(const std::string& gcm_token) {} - -void StubPrefetchService::GetGCMToken(GCMTokenCallback callback) {} - void StubPrefetchService::ForceRefreshSuggestions() {} -const std::string& StubPrefetchService::GetCachedGCMToken() const { - return gcm_token_; +std::string StubPrefetchService::GetCachedGCMToken() const { + return ""; } PrefetchGCMHandler* StubPrefetchService::GetPrefetchGCMHandler() {
diff --git a/components/offline_pages/core/prefetch/stub_prefetch_service.h b/components/offline_pages/core/prefetch/stub_prefetch_service.h index 6beef7f..7784c1a 100644 --- a/components/offline_pages/core/prefetch/stub_prefetch_service.h +++ b/components/offline_pages/core/prefetch/stub_prefetch_service.h
@@ -20,9 +20,7 @@ SuggestionsProvider* suggestions_provider) override; void NewSuggestionsAvailable() override; void RemoveSuggestion(GURL url) override; - void SetCachedGCMToken(const std::string& gcm_token) override; - const std::string& GetCachedGCMToken() const override; - void GetGCMToken(GCMTokenCallback callback) override; + std::string GetCachedGCMToken() const override; void ForceRefreshSuggestions() override; PrefetchGCMHandler* GetPrefetchGCMHandler() override; OfflineEventLogger* GetLogger() override; @@ -39,9 +37,6 @@ void SetEnabledByServer(PrefService* pref_service, bool enabled) override; SuggestedArticlesObserver* GetSuggestedArticlesObserverForTesting() override; - - private: - std::string gcm_token_; }; } // namespace offline_pages
diff --git a/components/offline_pages/core/prefetch/suggested_articles_observer_unittest.cc b/components/offline_pages/core/prefetch/suggested_articles_observer_unittest.cc index 25f4d75f..664ae3d 100644 --- a/components/offline_pages/core/prefetch/suggested_articles_observer_unittest.cc +++ b/components/offline_pages/core/prefetch/suggested_articles_observer_unittest.cc
@@ -5,10 +5,8 @@ #include "components/offline_pages/core/prefetch/suggested_articles_observer.h" #include "base/memory/ptr_util.h" -#include "base/message_loop/message_loop.h" -#include "base/run_loop.h" #include "base/strings/utf_string_conversions.h" -#include "base/test/test_simple_task_runner.h" +#include "base/test/scoped_task_environment.h" #include "components/offline_pages/core/client_namespace_constants.h" #include "components/offline_pages/core/prefetch/prefetch_dispatcher.h" #include "components/offline_pages/core/prefetch/prefetch_gcm_app_handler.h" @@ -41,12 +39,7 @@ class OfflinePageSuggestedArticlesObserverTest : public testing::Test { public: - OfflinePageSuggestedArticlesObserverTest() - : task_runner_(new base::TestSimpleTaskRunner) { - message_loop_.SetTaskRunner(task_runner_); - } - - void SetUp() override { + OfflinePageSuggestedArticlesObserverTest() { prefetch_service_test_taco_ = std::make_unique<PrefetchServiceTestTaco>(); test_prefetch_dispatcher_ = new TestPrefetchDispatcher(); prefetch_service_test_taco_->SetPrefetchDispatcher( @@ -56,10 +49,10 @@ prefetch_service_test_taco_->CreatePrefetchService(); } - void TearDown() override { + ~OfflinePageSuggestedArticlesObserverTest() override { // Ensure the store can be properly disposed off. prefetch_service_test_taco_.reset(); - task_runner_->RunUntilIdle(); + scoped_task_environment_.RunUntilIdle(); } SuggestedArticlesObserver* observer() { @@ -76,8 +69,7 @@ Category::FromKnownCategory(ntp_snippets::KnownCategories::ARTICLES); private: - base::MessageLoop message_loop_; - scoped_refptr<base::TestSimpleTaskRunner> task_runner_; + base::test::ScopedTaskEnvironment scoped_task_environment_; std::unique_ptr<PrefetchServiceTestTaco> prefetch_service_test_taco_; // Owned by the PrefetchServiceTestTaco.
diff --git a/components/offline_pages/core/prefetch/tasks/prefetch_task_test_base_unittest.cc b/components/offline_pages/core/prefetch/tasks/prefetch_task_test_base_unittest.cc index 029708e..8f09207 100644 --- a/components/offline_pages/core/prefetch/tasks/prefetch_task_test_base_unittest.cc +++ b/components/offline_pages/core/prefetch/tasks/prefetch_task_test_base_unittest.cc
@@ -39,7 +39,7 @@ case PrefetchItemState::FINISHED: case PrefetchItemState::ZOMBIE: EXPECT_TRUE( - base::ContainsValue(kOrderedPrefetchItemStates, maybe_valid_state)) + base::Contains(kOrderedPrefetchItemStates, maybe_valid_state)) << "Valid state was not found in the array: " << i; ++element_count; break;
diff --git a/components/omnibox/browser/contextual_suggestions_service.cc b/components/omnibox/browser/contextual_suggestions_service.cc index ec9f858f..a07b839 100644 --- a/components/omnibox/browser/contextual_suggestions_service.cc +++ b/components/omnibox/browser/contextual_suggestions_service.cc
@@ -31,21 +31,6 @@ namespace { -// Server address for the experimental suggestions service. -// -// For now, we wish to disable on-focus suggestions, but do so in a way that -// can be overridden by an experiment config file change. -// -// To disable on-focus suggestions, we set the address to a URL that will not -// reply. It returns a 404. (This URL is at the same host and similar to the -// URL that will reply.) -// -// We'd be able to enable on-focus suggestions again by overriding this -// default address in an experiment config. -const char kDefaultExperimentalServerAddress[] = - "https://cuscochromeextension-pa.googleapis.com/v_turned_down_returns_404/" - "omniboxsuggestions"; - void AddVariationHeaders(network::ResourceRequest* request) { // Add Chrome experiment state to the request headers. // @@ -176,10 +161,12 @@ return GURL(); } - if (!base::FeatureList::IsEnabled( - omnibox::kOnFocusSuggestionsCustomEndpoint)) { + // An empty custom endpoint URL parameter indicates the service should + // use the default endpoint, which is the default search provider. + const std::string server_address_param = + OmniboxFieldTrial::GetOnFocusSuggestionsCustomEndpointURL(); + if (server_address_param.empty()) return GURL(); - } // Check that the default search engine is Google. const TemplateURL& default_provider_url = @@ -191,11 +178,7 @@ return GURL(); } - const std::string server_address_param = - OmniboxFieldTrial::GetOnFocusSuggestionsCustomEndpointURL(); - GURL suggest_url(server_address_param.empty() - ? kDefaultExperimentalServerAddress - : server_address_param); + GURL suggest_url(server_address_param); // Check that the custom endpoint URL is valid. if (!suggest_url.is_valid()) { return GURL();
diff --git a/components/omnibox/browser/contextual_suggestions_service_unittest.cc b/components/omnibox/browser/contextual_suggestions_service_unittest.cc index 5caac0aa..a7fd19c 100644 --- a/components/omnibox/browser/contextual_suggestions_service_unittest.cc +++ b/components/omnibox/browser/contextual_suggestions_service_unittest.cc
@@ -10,7 +10,6 @@ #include "base/bind.h" #include "base/memory/scoped_refptr.h" #include "base/test/bind_test_util.h" -#include "base/test/scoped_feature_list.h" #include "base/test/test_mock_time_task_runner.h" #include "components/omnibox/common/omnibox_features.h" #include "components/search_engines/template_url_service.h" @@ -47,10 +46,6 @@ }; TEST_F(ContextualSuggestionsServiceTest, EnsureAttachCookies) { - base::test::ScopedFeatureList scoped_feature_list; - scoped_feature_list.InitAndDisableFeature( - omnibox::kOnFocusSuggestionsCustomEndpoint); - network::ResourceRequest resource_request; test_url_loader_factory_.SetInterceptor( base::BindLambdaForTesting([&](const network::ResourceRequest& request) {
diff --git a/components/omnibox/browser/omnibox_field_trial.cc b/components/omnibox/browser/omnibox_field_trial.cc index 35d16aa3..af945a1 100644 --- a/components/omnibox/browser/omnibox_field_trial.cc +++ b/components/omnibox/browser/omnibox_field_trial.cc
@@ -257,6 +257,7 @@ page_classification) == "Personalized"; } +// static bool OmniboxFieldTrial::InZeroSuggestRemoteSendURLFieldTrial( metrics::OmniboxEventProto::PageClassification page_classification) { return internal::GetValueForRuleInContextByFeature( @@ -265,18 +266,17 @@ } // static -int OmniboxFieldTrial::GetOnFocusSuggestionsCustomEndpointExperimentId() { - return base::GetFieldTrialParamByFeatureAsInt( - omnibox::kOnFocusSuggestionsCustomEndpoint, - kOnFocusSuggestionsEndpointExperimentIdParam, - /*default_value=*/-1); +std::string OmniboxFieldTrial::GetOnFocusSuggestionsCustomEndpointURL() { + return base::GetFieldTrialParamValueByFeature( + omnibox::kOnFocusSuggestions, kOnFocusSuggestionsEndpointURLParam); } // static -std::string OmniboxFieldTrial::GetOnFocusSuggestionsCustomEndpointURL() { - return base::GetFieldTrialParamValueByFeature( - omnibox::kOnFocusSuggestionsCustomEndpoint, - kOnFocusSuggestionsEndpointURLParam); +int OmniboxFieldTrial::GetOnFocusSuggestionsCustomEndpointExperimentId() { + return base::GetFieldTrialParamByFeatureAsInt( + omnibox::kOnFocusSuggestions, + kOnFocusSuggestionsEndpointExperimentIdParam, + /*default_value=*/-1); } bool OmniboxFieldTrial::ShortcutsScoringMaxRelevance(
diff --git a/components/omnibox/browser/omnibox_field_trial.h b/components/omnibox/browser/omnibox_field_trial.h index 838b1951..1c12dd9b 100644 --- a/components/omnibox/browser/omnibox_field_trial.h +++ b/components/omnibox/browser/omnibox_field_trial.h
@@ -181,16 +181,13 @@ bool InZeroSuggestRemoteSendURLFieldTrial( metrics::OmniboxEventProto::PageClassification page_classification); -// --------------------------------------------------------- -// For the On Focus Suggestions Custom Endpoint field trial. +// Returns the server address associated with the current field trial. +std::string GetOnFocusSuggestionsCustomEndpointURL(); // Returns the server-side experiment ID to use for contextual suggestions. // Returns -1 if there is no associated experiment ID. int GetOnFocusSuggestionsCustomEndpointExperimentId(); -// Returns the server address associated with the current field trial. -std::string GetOnFocusSuggestionsCustomEndpointURL(); - // --------------------------------------------------------- // For the ShortcutsScoringMaxRelevance experiment that's part of the // bundled omnibox field trial.
diff --git a/components/omnibox/browser/zero_suggest_provider_unittest.cc b/components/omnibox/browser/zero_suggest_provider_unittest.cc index 64a57338..94f2f39 100644 --- a/components/omnibox/browser/zero_suggest_provider_unittest.cc +++ b/components/omnibox/browser/zero_suggest_provider_unittest.cc
@@ -503,21 +503,14 @@ // experiments off, IsPersonalizedUrlDataCollectionActive true), and the // redirect to chrome mode on. base::test::ScopedFeatureList features; - features.InitWithFeaturesAndParameters( + features.InitAndEnableFeatureWithParameters( + omnibox::kOnFocusSuggestions, { - { - omnibox::kOnFocusSuggestions, - {{std::string(OmniboxFieldTrial::kZeroSuggestVariantRule) + - ":*:*", - "RemoteSendURL"}}, - }, - { - omnibox::kOnFocusSuggestionsCustomEndpoint, - {{OmniboxFieldTrial::kOnFocusSuggestionsEndpointURLParam, - "https://valid-but-fake-endpoint.com/fakepath"}}, - }, - }, - {}); + {std::string(OmniboxFieldTrial::kZeroSuggestVariantRule) + ":*:*", + "RemoteSendURL"}, + {OmniboxFieldTrial::kOnFocusSuggestionsEndpointURLParam, + "https://valid-but-fake-endpoint.com/fakepath"}, + }); EXPECT_CALL(*client_, IsAuthenticated()) .WillRepeatedly(testing::Return(true));
diff --git a/components/omnibox/common/omnibox_features.cc b/components/omnibox/common/omnibox_features.cc index 35afa1b..7390237 100644 --- a/components/omnibox/common/omnibox_features.cc +++ b/components/omnibox/common/omnibox_features.cc
@@ -275,27 +275,14 @@ "OmniboxMaterialDesignWeatherIcons", base::FEATURE_DISABLED_BY_DEFAULT}; // Feature to configure on-focus suggestions provided by ZeroSuggestProvider. -// This feature's main job is to contain the "ZeroSuggestVariant" field trial -// parameter, which configures the global mode of ZeroSuggestProvider. +// This feature's main job is to contain some field trial parameters such as: +// - "ZeroSuggestVariant" configures the per-page-classification mode of +// ZeroSuggestProvider. +// - "CustomEndpointURL" configures a custom endpoint for remote suggestions. +// - "CustomEndpointExperimentID" sends an id number to the custom endpoint. const base::Feature kOnFocusSuggestions{"OmniboxOnFocusSuggestions", base::FEATURE_ENABLED_BY_DEFAULT}; -// Feature used to specify a custom endpoint URL for on-focus suggestions that -// are sourced via RPC. -// -// This feature is *enabled* in order to *disable* all forms of suggestions -// based on the URL on-focus (whether from "redirect to Chrome" or the -// default suggest server). The actual disabling of redirect to Chrome -// suggestions happens in contextual_suggestions_service.cc. See comments -// by kDefaultExperimentalServerAddress. -// -// If this feature were not enabled, Chrome would use the default suggest -// server for suggestions based on the current URL on focus. There is no -// code in Chrome to disable that, so that why we took this route. -const base::Feature kOnFocusSuggestionsCustomEndpoint{ - "OmniboxOnFocusSuggestionsCustomEndpoint", - base::FEATURE_ENABLED_BY_DEFAULT}; - // Allow suggestions to be shown to the user on the New Tab Page upon focusing // URL bar (the omnibox). const base::Feature kZeroSuggestionsOnNTP{"OmniboxZeroSuggestionsOnNTP",
diff --git a/components/omnibox/common/omnibox_features.h b/components/omnibox/common/omnibox_features.h index 4ea8861..31fd1031 100644 --- a/components/omnibox/common/omnibox_features.h +++ b/components/omnibox/common/omnibox_features.h
@@ -51,7 +51,6 @@ // On-Focus Suggestions a.k.a. ZeroSuggest. extern const base::Feature kOnFocusSuggestions; -extern const base::Feature kOnFocusSuggestionsCustomEndpoint; extern const base::Feature kZeroSuggestionsOnNTP; } // namespace omnibox
diff --git a/components/password_manager/core/browser/credential_manager_impl_unittest.cc b/components/password_manager/core/browser/credential_manager_impl_unittest.cc index 065563a..c9a99b92 100644 --- a/components/password_manager/core/browser/credential_manager_impl_unittest.cc +++ b/components/password_manager/core/browser/credential_manager_impl_unittest.cc
@@ -375,8 +375,6 @@ RunAllPendingTasks(); EXPECT_TRUE(called); - EXPECT_EQ(FormFetcher::State::NOT_WAITING, - client_->pending_manager()->GetFormFetcher()->GetState()); autofill::PasswordForm new_form = client_->pending_manager()->GetPendingCredentials(); @@ -408,8 +406,6 @@ RunAllPendingTasks(); EXPECT_TRUE(called); - EXPECT_EQ(FormFetcher::State::NOT_WAITING, - client_->pending_manager()->GetFormFetcher()->GetState()); autofill::PasswordForm new_form = client_->pending_manager()->GetPendingCredentials(); @@ -447,8 +443,6 @@ RunAllPendingTasks(); EXPECT_TRUE(called); - EXPECT_EQ(FormFetcher::State::NOT_WAITING, - client_->pending_manager()->GetFormFetcher()->GetState()); client_->pending_manager()->Save(); RunAllPendingTasks();
diff --git a/components/password_manager/core/browser/form_parsing/form_parser.cc b/components/password_manager/core/browser/form_parsing/form_parser.cc index a7bc72b..26bcf770 100644 --- a/components/password_manager/core/browser/form_parsing/form_parser.cc +++ b/components/password_manager/core/browser/form_parsing/form_parser.cc
@@ -692,7 +692,7 @@ for (auto it = processed_fields.begin(); it != processed_fields.end(); ++it) { if (it->is_password && - base::ContainsValue(password_ids, it->field->unique_renderer_id)) { + base::Contains(password_ids, it->field->unique_renderer_id)) { first_relevant_password = it; break; }
diff --git a/components/password_manager/core/browser/http_credentials_cleaner.cc b/components/password_manager/core/browser/http_credentials_cleaner.cc index 8a118b79..dbfb3dec 100644 --- a/components/password_manager/core/browser/http_credentials_cleaner.cc +++ b/components/password_manager/core/browser/http_credentials_cleaner.cc
@@ -92,7 +92,7 @@ return; } - if (base::ContainsKey(user_it->second, form->password_value)) { + if (base::Contains(user_it->second, form->password_value)) { // The password store contains the same credentials (signon_realm, scheme, // username and password) on HTTPS version of the form. base::UmaHistogramEnumeration(
diff --git a/components/password_manager/core/browser/http_credentials_cleaner_unittest.cc b/components/password_manager/core/browser/http_credentials_cleaner_unittest.cc index ee1374f0..1e8e20ed 100644 --- a/components/password_manager/core/browser/http_credentials_cleaner_unittest.cc +++ b/components/password_manager/core/browser/http_credentials_cleaner_unittest.cc
@@ -229,7 +229,7 @@ // For no matching case https credentials were added and for an equivalent // case they already existed. - EXPECT_TRUE(base::ContainsKey(current_store, "https://example.org/")); + EXPECT_TRUE(base::Contains(current_store, "https://example.org/")); } else { // Hsts not enabled or credentials are have different passwords, so // nothing should change in the password store.
diff --git a/components/password_manager/core/browser/new_password_form_manager.cc b/components/password_manager/core/browser/new_password_form_manager.cc index be6aec8..4107516f 100644 --- a/components/password_manager/core/browser/new_password_form_manager.cc +++ b/components/password_manager/core/browser/new_password_form_manager.cc
@@ -28,6 +28,7 @@ #include "components/password_manager/core/browser/password_manager_client.h" #include "components/password_manager/core/browser/password_manager_driver.h" #include "components/password_manager/core/browser/password_manager_util.h" +#include "components/password_manager/core/browser/statistics_table.h" using autofill::FormData; using autofill::FormFieldData; @@ -206,10 +207,6 @@ return false; } -FormFetcher* NewPasswordFormManager::GetFormFetcher() { - return form_fetcher_; -} - const GURL& NewPasswordFormManager::GetOrigin() const { if (IsHttpAuth()) return observed_http_auth_digest_->origin; @@ -221,6 +218,11 @@ return best_matches_; } +std::vector<const autofill::PasswordForm*> +NewPasswordFormManager::GetFederatedMatches() const { + return form_fetcher_->GetFederatedMatches(); +} + const PasswordForm& NewPasswordFormManager::GetPendingCredentials() const { return pending_credentials_; } @@ -234,19 +236,20 @@ return metrics_recorder_.get(); } -const std::vector<const PasswordForm*>& +base::span<const autofill::PasswordForm* const> NewPasswordFormManager::GetBlacklistedMatches() const { - return blacklisted_matches_; + return base::make_span(blacklisted_matches_); +} + +base::span<const InteractionsStats> +NewPasswordFormManager::GetInteractionsStats() const { + return base::make_span(form_fetcher_->GetInteractionsStats()); } bool NewPasswordFormManager::IsBlacklisted() const { return !blacklisted_matches_.empty(); } -bool NewPasswordFormManager::IsPasswordOverridden() const { - return password_overridden_; -} - void NewPasswordFormManager::Save() { DCHECK_EQ(FormFetcher::State::NOT_WAITING, form_fetcher_->GetState()); DCHECK(!client_->IsIncognito()); @@ -411,6 +414,10 @@ return is_new_login_; } +FormFetcher* NewPasswordFormManager::GetFormFetcher() { + return form_fetcher_; +} + bool NewPasswordFormManager::IsPendingCredentialsPublicSuffixMatch() const { return pending_credentials_.is_public_suffix_match; } @@ -460,7 +467,7 @@ } bool NewPasswordFormManager::IsPasswordUpdate() const { - return IsPasswordOverridden(); + return password_overridden_; } std::vector<base::WeakPtr<PasswordManagerDriver>>
diff --git a/components/password_manager/core/browser/new_password_form_manager.h b/components/password_manager/core/browser/new_password_form_manager.h index d220ab9..b00cb5d 100644 --- a/components/password_manager/core/browser/new_password_form_manager.h +++ b/components/password_manager/core/browser/new_password_form_manager.h
@@ -128,17 +128,18 @@ const base::string16& password); // PasswordFormManagerForUI: - FormFetcher* GetFormFetcher() override; const GURL& GetOrigin() const override; const std::map<base::string16, const autofill::PasswordForm*>& GetBestMatches() const override; + std::vector<const autofill::PasswordForm*> GetFederatedMatches() + const override; const autofill::PasswordForm& GetPendingCredentials() const override; metrics_util::CredentialSourceType GetCredentialSource() override; PasswordFormMetricsRecorder* GetMetricsRecorder() override; - const std::vector<const autofill::PasswordForm*>& GetBlacklistedMatches() + base::span<const autofill::PasswordForm* const> GetBlacklistedMatches() const override; + base::span<const InteractionsStats> GetInteractionsStats() const override; bool IsBlacklisted() const override; - bool IsPasswordOverridden() const override; void Save() override; void Update(const autofill::PasswordForm& credentials_to_update) override; @@ -153,6 +154,7 @@ // PasswordFormManagerInterface: bool IsNewLogin() const override; + FormFetcher* GetFormFetcher() override; bool IsPendingCredentialsPublicSuffixMatch() const override; void PresaveGeneratedPassword(const autofill::PasswordForm& form) override; void PasswordNoLongerGenerated() override;
diff --git a/components/password_manager/core/browser/new_password_form_manager_unittest.cc b/components/password_manager/core/browser/new_password_form_manager_unittest.cc index c1460af..a44d9d0 100644 --- a/components/password_manager/core/browser/new_password_form_manager_unittest.cc +++ b/components/password_manager/core/browser/new_password_form_manager_unittest.cc
@@ -956,7 +956,7 @@ EXPECT_TRUE( form_manager_->ProvisionallySave(submitted_form, &driver_, false)); EXPECT_FALSE(form_manager_->IsNewLogin()); - EXPECT_TRUE(form_manager_->IsPasswordOverridden()); + EXPECT_TRUE(form_manager_->IsPasswordUpdate()); MockFormSaver& form_saver = MockFormSaver::Get(form_manager_.get()); PasswordForm updated_form; @@ -992,7 +992,6 @@ EXPECT_TRUE( form_manager_->ProvisionallySave(submitted_form, &driver_, false)); EXPECT_FALSE(form_manager_->IsNewLogin()); - EXPECT_TRUE(form_manager_->IsPasswordOverridden()); EXPECT_TRUE(form_manager_->IsPasswordUpdate()); MockFormSaver& form_saver = MockFormSaver::Get(form_manager_.get()); @@ -1121,7 +1120,7 @@ CheckPendingCredentials(expected, form_manager_->GetPendingCredentials()); EXPECT_FALSE(form_manager_->IsNewLogin()); - EXPECT_TRUE(form_manager_->IsPasswordOverridden()); + EXPECT_TRUE(form_manager_->IsPasswordUpdate()); } TEST_F(NewPasswordFormManagerTest, UpdatePasswordValueEmptyStore) { @@ -1164,7 +1163,7 @@ CheckPendingCredentials(saved_match_, form_manager_->GetPendingCredentials()); EXPECT_FALSE(form_manager_->IsNewLogin()); - EXPECT_FALSE(form_manager_->IsPasswordOverridden()); + EXPECT_FALSE(form_manager_->IsPasswordUpdate()); } TEST_F(NewPasswordFormManagerTest, UpdatePasswordValueMultiplePasswordFields) { @@ -1918,7 +1917,7 @@ // in state new login nor password overridden. ASSERT_TRUE(form_manager_->ProvisionallySaveHttpAuthForm(http_auth_form)); EXPECT_FALSE(form_manager_->IsNewLogin()); - EXPECT_FALSE(form_manager_->IsPasswordOverridden()); + EXPECT_FALSE(form_manager_->IsPasswordUpdate()); } TEST_F(NewPasswordFormManagerTest, HTTPAuthPasswordOverridden) { @@ -1945,7 +1944,7 @@ ASSERT_TRUE( form_manager_->ProvisionallySaveHttpAuthForm(submitted_http_auth_form)); EXPECT_FALSE(form_manager_->IsNewLogin()); - EXPECT_TRUE(form_manager_->IsPasswordOverridden()); + EXPECT_TRUE(form_manager_->IsPasswordUpdate()); // Check that the password is updated in the stored credential. PasswordForm updated_form;
diff --git a/components/password_manager/core/browser/password_form_manager.cc b/components/password_manager/core/browser/password_form_manager.cc index a8b6a17e..13c83ea 100644 --- a/components/password_manager/core/browser/password_form_manager.cc +++ b/components/password_manager/core/browser/password_form_manager.cc
@@ -255,6 +255,10 @@ return is_new_login_; } +FormFetcher* PasswordFormManager::GetFormFetcher() { + return form_fetcher_; +} + bool PasswordFormManager::IsPendingCredentialsPublicSuffixMatch() const { return pending_credentials_.is_public_suffix_match; } @@ -435,7 +439,7 @@ generation_state_ = std::make_unique<PasswordGenerationState>(form_saver_.get(), client_); } - if (!base::ContainsKey(best_matches_, form.username_value) || + if (!base::Contains(best_matches_, form.username_value) || form.username_value.empty()) { generation_state_->PresaveGeneratedPassword(form, {}); } else { @@ -875,7 +879,7 @@ bool PasswordFormManager::IsPasswordUpdate() const { return (!GetBestMatches().empty() && IsPossibleChangePasswordFormWithoutUsername()) || - IsPasswordOverridden() || retry_password_form_password_update_; + password_overridden_ || retry_password_form_password_update_; } void PasswordFormManager::LogSubmitPassed() { @@ -903,15 +907,16 @@ return submitted_form_.get(); } -FormFetcher* PasswordFormManager::GetFormFetcher() { - return form_fetcher_; -} - const std::map<base::string16, const autofill::PasswordForm*>& PasswordFormManager::GetBestMatches() const { return best_matches_; } +std::vector<const autofill::PasswordForm*> +PasswordFormManager::GetFederatedMatches() const { + return form_fetcher_->GetFederatedMatches(); +} + const GURL& PasswordFormManager::GetOrigin() const { return observed_form_.origin; } @@ -929,9 +934,14 @@ return metrics_recorder_.get(); } -const std::vector<const autofill::PasswordForm*>& +base::span<const autofill::PasswordForm* const> PasswordFormManager::GetBlacklistedMatches() const { - return blacklisted_matches_; + return base::make_span(blacklisted_matches_); +} + +base::span<const InteractionsStats> PasswordFormManager::GetInteractionsStats() + const { + return base::make_span(form_fetcher_->GetInteractionsStats()); } bool PasswordFormManager::IsBlacklisted() const { @@ -939,10 +949,6 @@ return !blacklisted_matches_.empty(); } -bool PasswordFormManager::IsPasswordOverridden() const { - return password_overridden_; -} - void PasswordFormManager::ResetStoredMatches() { preferred_match_ = nullptr; best_matches_.clear();
diff --git a/components/password_manager/core/browser/password_form_manager.h b/components/password_manager/core/browser/password_form_manager.h index a187dc1..8f31381d 100644 --- a/components/password_manager/core/browser/password_form_manager.h +++ b/components/password_manager/core/browser/password_form_manager.h
@@ -114,6 +114,7 @@ // PasswordFormManagerInterface: bool IsNewLogin() const override; + FormFetcher* GetFormFetcher() override; bool IsPendingCredentialsPublicSuffixMatch() const override; bool IsPossibleChangePasswordFormWithoutUsername() const override; bool IsPasswordUpdate() const override; @@ -195,17 +196,18 @@ std::unique_ptr<PasswordFormManager> Clone(); // PasswordFormManagerForUI: - FormFetcher* GetFormFetcher() override; const GURL& GetOrigin() const override; const std::map<base::string16, const autofill::PasswordForm*>& GetBestMatches() const override; + std::vector<const autofill::PasswordForm*> GetFederatedMatches() + const override; const autofill::PasswordForm& GetPendingCredentials() const override; metrics_util::CredentialSourceType GetCredentialSource() override; PasswordFormMetricsRecorder* GetMetricsRecorder() override; - const std::vector<const autofill::PasswordForm*>& GetBlacklistedMatches() + base::span<const autofill::PasswordForm* const> GetBlacklistedMatches() const override; + base::span<const InteractionsStats> GetInteractionsStats() const override; bool IsBlacklisted() const override; - bool IsPasswordOverridden() const override; void Save() override; void Update(const autofill::PasswordForm& credentials_to_update) override;
diff --git a/components/password_manager/core/browser/password_form_manager_for_ui.h b/components/password_manager/core/browser/password_form_manager_for_ui.h index 06e5984..27ec1aa 100644 --- a/components/password_manager/core/browser/password_form_manager_for_ui.h +++ b/components/password_manager/core/browser/password_form_manager_for_ui.h
@@ -8,6 +8,7 @@ #include <map> #include <vector> +#include "base/containers/span.h" #include "base/memory/weak_ptr.h" #include "base/strings/string16.h" #include "components/password_manager/core/browser/password_manager_metrics_util.h" @@ -19,6 +20,7 @@ namespace password_manager { class FormFetcher; +struct InteractionsStats; class PasswordFormMetricsRecorder; // Interface that contains all methods from PasswordFormManager that are used in @@ -27,10 +29,6 @@ public: virtual ~PasswordFormManagerForUI() = default; - // Returns the form fetcher which is responsible for fetching saved matches - // from the store for the observed from. - virtual FormFetcher* GetFormFetcher() = 0; - // Returns origin of the initially observed form. virtual const GURL& GetOrigin() const = 0; @@ -38,6 +36,10 @@ virtual const std::map<base::string16, const autofill::PasswordForm*>& GetBestMatches() const = 0; + // Returns the federated saved matches for the observed form. + virtual std::vector<const autofill::PasswordForm*> GetFederatedMatches() + const = 0; + // Returns credentials that are ready to be written (saved or updated) to a // password store. virtual const autofill::PasswordForm& GetPendingCredentials() const = 0; @@ -52,17 +54,15 @@ virtual PasswordFormMetricsRecorder* GetMetricsRecorder() = 0; // Returns the blacklisted matches for the current page. - virtual const std::vector<const autofill::PasswordForm*>& + virtual base::span<const autofill::PasswordForm* const> GetBlacklistedMatches() const = 0; + // Statistics for recent password bubble usage. + virtual base::span<const InteractionsStats> GetInteractionsStats() const = 0; + // Determines if the user opted to 'never remember' passwords for this form. virtual bool IsBlacklisted() const = 0; - // Returns whether filled password was overriden by the user. - // TODO(https://crbug.com/845826): Remove once mobile username - // editing is implemented. - virtual bool IsPasswordOverridden() const = 0; - // Handles save-as-new or update of the form managed by this manager. virtual void Save() = 0; @@ -111,6 +111,10 @@ // Returns whether it is a new (i.e. not saved yet) credentials. virtual bool IsNewLogin() const = 0; + // Returns the form fetcher which is responsible for fetching saved matches + // from the store for the observed from. + virtual FormFetcher* GetFormFetcher() = 0; + // Returns true if the current pending credentials were found using // origin matching of the public suffix, instead of the signon realm of the // form.
diff --git a/components/password_manager/core/browser/psl_matching_helper_unittest.cc b/components/password_manager/core/browser/psl_matching_helper_unittest.cc index 8fff5b5..a9fa650e 100644 --- a/components/password_manager/core/browser/psl_matching_helper_unittest.cc +++ b/components/password_manager/core/browser/psl_matching_helper_unittest.cc
@@ -479,7 +479,7 @@ for (int chr = 0; chr <= 255; ++chr) { const auto percent_encoded = base::StringPrintf("http://a%%%02Xb.hu/", chr); const GURL url(percent_encoded); - if (isalnum(chr) || base::ContainsValue(kExpectedNonAlnumChars, chr)) { + if (isalnum(chr) || base::Contains(kExpectedNonAlnumChars, chr)) { ASSERT_TRUE(url.is_valid()); const auto percent_decoded = base::StringPrintf( "http://a%cb.hu/", base::ToLowerASCII(static_cast<char>(chr)));
diff --git a/components/password_manager/core/browser/sql_table_builder.cc b/components/password_manager/core/browser/sql_table_builder.cc index 77a70f4..aab889f 100644 --- a/components/password_manager/core/browser/sql_table_builder.cc +++ b/components/password_manager/core/browser/sql_table_builder.cc
@@ -99,7 +99,7 @@ DCHECK(std::none_of(indices_.begin(), indices_.end(), [&old_name](const Index& index) { return index.max_version == kInvalidVersion && - base::ContainsValue(index.columns, old_name); + base::Contains(index.columns, old_name); })); if (sealed_version_ != kInvalidVersion && @@ -132,7 +132,7 @@ DCHECK(std::none_of(indices_.begin(), indices_.end(), [&name](const Index& index) { return index.max_version == kInvalidVersion && - base::ContainsValue(index.columns, name); + base::Contains(index.columns, name); })); if (sealed_version_ != kInvalidVersion && column->min_version <= sealed_version_) {
diff --git a/components/password_manager/core/browser/statistics_table.cc b/components/password_manager/core/browser/statistics_table.cc index 1cf0b6d7..6af1c38 100644 --- a/components/password_manager/core/browser/statistics_table.cc +++ b/components/password_manager/core/browser/statistics_table.cc
@@ -48,16 +48,6 @@ lhs.update_time == rhs.update_time; } -const InteractionsStats* FindStatsByUsername( - const std::vector<InteractionsStats>& stats, - const base::string16& username) { - auto it = std::find_if(stats.begin(), stats.end(), - [&username](const InteractionsStats& element) { - return username == element.username_value; - }); - return it == stats.end() ? nullptr : &*it; -} - StatisticsTable::StatisticsTable() : db_(nullptr) { }
diff --git a/components/password_manager/core/browser/statistics_table.h b/components/password_manager/core/browser/statistics_table.h index c47ed74a..75043c2 100644 --- a/components/password_manager/core/browser/statistics_table.h +++ b/components/password_manager/core/browser/statistics_table.h
@@ -36,11 +36,6 @@ bool operator==(const InteractionsStats& lhs, const InteractionsStats& rhs); -// Returns an element from |stats| with |username| or nullptr if not found. -const InteractionsStats* FindStatsByUsername( - const std::vector<InteractionsStats>& stats, - const base::string16& username); - // Represents the 'stats' table in the Login Database. class StatisticsTable { public:
diff --git a/components/password_manager/core/browser/sync/password_sync_bridge.cc b/components/password_manager/core/browser/sync/password_sync_bridge.cc index 76d55a7..3d0745daa 100644 --- a/components/password_manager/core/browser/sync/password_sync_bridge.cc +++ b/components/password_manager/core/browser/sync/password_sync_bridge.cc
@@ -101,7 +101,7 @@ const autofill::PasswordForm& form) { auto entity_data = std::make_unique<syncer::EntityData>(); *entity_data->specifics.mutable_password() = SpecificsFromPassword(form); - entity_data->non_unique_name = form.signon_realm; + entity_data->name = form.signon_realm; return entity_data; }
diff --git a/components/payments/content/manifest_verifier.cc b/components/payments/content/manifest_verifier.cc index 9d580ab..550f9024 100644 --- a/components/payments/content/manifest_verifier.cc +++ b/components/payments/content/manifest_verifier.cc
@@ -42,8 +42,8 @@ for (auto& app : *apps) { if (app_origin.IsSameOriginWith( url::Origin::Create(app.second->scope.GetOrigin()))) { - app.second->has_explicitly_verified_methods = base::ContainsValue( - supported_origin_strings, app_origin.Serialize()); + app.second->has_explicitly_verified_methods = + base::Contains(supported_origin_strings, app_origin.Serialize()); if (all_origins_supported || app.second->has_explicitly_verified_methods) { app.second->enabled_methods.emplace_back(method_manifest_url.spec());
diff --git a/components/payments/content/payment_method_manifest_table_unittest.cc b/components/payments/content/payment_method_manifest_table_unittest.cc index 3e3bcd5..a3d2c1a 100644 --- a/components/payments/content/payment_method_manifest_table_unittest.cc +++ b/components/payments/content/payment_method_manifest_table_unittest.cc
@@ -71,8 +71,8 @@ retrieved_web_app_ids = payment_method_manifest_table->GetManifest("https://bobpay.com"); ASSERT_EQ(web_app_ids.size(), retrieved_web_app_ids.size()); - ASSERT_TRUE(base::ContainsValue(retrieved_web_app_ids, web_app_ids[0])); - ASSERT_TRUE(base::ContainsValue(retrieved_web_app_ids, web_app_ids[1])); + ASSERT_TRUE(base::Contains(retrieved_web_app_ids, web_app_ids[0])); + ASSERT_TRUE(base::Contains(retrieved_web_app_ids, web_app_ids[1])); } TEST_F(PaymentMethodManifestTableTest, AddAndGetMultipleManifest) { @@ -106,14 +106,14 @@ bobpay_web_app_ids = payment_method_manifest_table->GetManifest(method_name_1); ASSERT_EQ(web_app_ids.size(), bobpay_web_app_ids.size()); - ASSERT_TRUE(base::ContainsValue(bobpay_web_app_ids, web_app_ids[0])); - ASSERT_TRUE(base::ContainsValue(bobpay_web_app_ids, web_app_ids[1])); + ASSERT_TRUE(base::Contains(bobpay_web_app_ids, web_app_ids[0])); + ASSERT_TRUE(base::Contains(bobpay_web_app_ids, web_app_ids[1])); alicepay_web_app_ids = payment_method_manifest_table->GetManifest(method_name_1); ASSERT_EQ(web_app_ids.size(), alicepay_web_app_ids.size()); - ASSERT_TRUE(base::ContainsValue(alicepay_web_app_ids, web_app_ids[0])); - ASSERT_TRUE(base::ContainsValue(alicepay_web_app_ids, web_app_ids[1])); + ASSERT_TRUE(base::Contains(alicepay_web_app_ids, web_app_ids[0])); + ASSERT_TRUE(base::Contains(alicepay_web_app_ids, web_app_ids[1])); } } // namespace
diff --git a/components/payments/content/payment_request.cc b/components/payments/content/payment_request.cc index a3e8d36..529145c9 100644 --- a/components/payments/content/payment_request.cc +++ b/components/payments/content/payment_request.cc
@@ -161,10 +161,9 @@ journey_logger_.SetRequestedPaymentMethodTypes( /*requested_basic_card=*/!spec_->supported_card_networks().empty(), /*requested_method_google=*/ - base::ContainsValue(spec_->url_payment_method_identifiers(), - google_pay_url) || - base::ContainsValue(spec_->url_payment_method_identifiers(), - android_pay_url), + base::Contains(spec_->url_payment_method_identifiers(), google_pay_url) || + base::Contains(spec_->url_payment_method_identifiers(), + android_pay_url), /*requested_method_other=*/non_google_it != spec_->url_payment_method_identifiers().end()); }
diff --git a/components/payments/content/service_worker_payment_app_factory.cc b/components/payments/content/service_worker_payment_app_factory.cc index 8248544..eefbab9 100644 --- a/components/payments/content/service_worker_payment_app_factory.cc +++ b/components/payments/content/service_worker_payment_app_factory.cc
@@ -40,7 +40,7 @@ if (requested.empty()) return true; for (const auto& request : requested) { - if (base::ContainsValue(capabilities, static_cast<int32_t>(request))) + if (base::Contains(capabilities, static_cast<int32_t>(request))) return true; } return false;
diff --git a/components/payments/content/service_worker_payment_instrument.cc b/components/payments/content/service_worker_payment_instrument.cc index dafe8e9..0658c8c 100644 --- a/components/payments/content/service_worker_payment_instrument.cc +++ b/components/payments/content/service_worker_payment_instrument.cc
@@ -176,14 +176,14 @@ DCHECK(spec_->details().modifiers); for (const auto& modifier : *spec_->details().modifiers) { - if (base::ContainsKey(supported_url_methods, - modifier->method_data->supported_method)) { + if (base::Contains(supported_url_methods, + modifier->method_data->supported_method)) { event_data->modifiers.emplace_back(modifier.Clone()); } } for (const auto& data : spec_->method_data()) { - if (base::ContainsKey(supported_url_methods, data->supported_method)) { + if (base::Contains(supported_url_methods, data->supported_method)) { event_data->method_data.push_back(data.Clone()); } } @@ -272,14 +272,14 @@ } DCHECK(spec_->details().modifiers); for (const auto& modifier : *spec_->details().modifiers) { - if (base::ContainsKey(supported_methods, - modifier->method_data->supported_method)) { + if (base::Contains(supported_methods, + modifier->method_data->supported_method)) { event_data->modifiers.emplace_back(modifier.Clone()); } } for (const auto& data : spec_->method_data()) { - if (base::ContainsKey(supported_methods, data->supported_method)) { + if (base::Contains(supported_methods, data->supported_method)) { event_data->method_data.push_back(data.Clone()); } } @@ -414,8 +414,8 @@ bool ServiceWorkerPaymentInstrument::IsValidForPaymentMethodIdentifier( const std::string& payment_method_identifier) const { DCHECK(!needs_installation_); - return base::ContainsValue(stored_payment_app_info_->enabled_methods, - payment_method_identifier); + return base::Contains(stored_payment_app_info_->enabled_methods, + payment_method_identifier); } gfx::ImageSkia ServiceWorkerPaymentInstrument::icon_image_skia() const {
diff --git a/components/payments/core/payment_manifest_downloader.cc b/components/payments/core/payment_manifest_downloader.cc index 8d8db86..5d398cba 100644 --- a/components/payments/core/payment_manifest_downloader.cc +++ b/components/payments/core/payment_manifest_downloader.cc
@@ -72,7 +72,7 @@ std::vector<std::string> rel_parts = base::SplitString(rel->second.value_or(""), HTTP_LWS, base::TRIM_WHITESPACE, base::SPLIT_WANT_NONEMPTY); - if (base::ContainsValue(rel_parts, "payment-method-manifest")) + if (base::Contains(rel_parts, "payment-method-manifest")) return url.Resolve(payment_method_manifest_url); }
diff --git a/components/pdf/renderer/pdf_accessibility_tree.cc b/components/pdf/renderer/pdf_accessibility_tree.cc index 423e2d5..49da6bf 100644 --- a/components/pdf/renderer/pdf_accessibility_tree.cc +++ b/components/pdf/renderer/pdf_accessibility_tree.cc
@@ -256,8 +256,7 @@ for (ui::AXNode* static_text : para->children()) { // Look up the page-relative character index for this node from a map // we built while the document was initially built. - DCHECK( - base::ContainsKey(node_id_to_char_index_in_page_, static_text->id())); + DCHECK(base::Contains(node_id_to_char_index_in_page_, static_text->id())); uint32_t char_index = node_id_to_char_index_in_page_[static_text->id()]; uint32_t len = static_text->data() .GetStringAttribute(ax::mojom::StringAttribute::kName)
diff --git a/components/policy/core/common/cloud/cloud_policy_client.cc b/components/policy/core/common/cloud/cloud_policy_client.cc index aea6b04..930ddaf 100644 --- a/components/policy/core/common/cloud/cloud_policy_client.cc +++ b/components/policy/core/common/cloud/cloud_policy_client.cc
@@ -913,7 +913,7 @@ if (policy_data.has_settings_entity_id()) entity_id = policy_data.settings_entity_id(); std::pair<std::string, std::string> key(type, entity_id); - if (base::ContainsKey(responses_, key)) { + if (base::Contains(responses_, key)) { LOG(WARNING) << "Duplicate PolicyFetchResponse for type: " << type << ", entity: " << entity_id << ", ignoring"; continue;
diff --git a/components/policy/core/common/cloud/component_cloud_policy_service_unittest.cc b/components/policy/core/common/cloud/component_cloud_policy_service_unittest.cc index 496a64d6..e576757 100644 --- a/components/policy/core/common/cloud/component_cloud_policy_service_unittest.cc +++ b/components/policy/core/common/cloud/component_cloud_policy_service_unittest.cc
@@ -302,8 +302,8 @@ std::map<std::string, std::string> contents; cache_->LoadAllSubkeys("extension-policy", &contents); ASSERT_EQ(2u, contents.size()); - EXPECT_TRUE(base::ContainsKey(contents, kTestExtension)); - EXPECT_TRUE(base::ContainsKey(contents, kTestExtension2)); + EXPECT_TRUE(base::Contains(contents, kTestExtension)); + EXPECT_TRUE(base::Contains(contents, kTestExtension2)); // Only policy for extension 1 is now being served, as the registry contains // only its schema. @@ -467,8 +467,8 @@ std::map<std::string, std::string> contents; cache_->LoadAllSubkeys("extension-policy", &contents); EXPECT_EQ(2u, contents.size()); - EXPECT_TRUE(base::ContainsKey(contents, kTestExtension)); - EXPECT_TRUE(base::ContainsKey(contents, kTestExtension2)); + EXPECT_TRUE(base::Contains(contents, kTestExtension)); + EXPECT_TRUE(base::Contains(contents, kTestExtension2)); } TEST_F(ComponentCloudPolicyServiceTest, SignInAfterStartup) { @@ -602,8 +602,8 @@ std::map<std::string, std::string> contents; cache_->LoadAllSubkeys("extension-policy", &contents); ASSERT_EQ(2u, contents.size()); - EXPECT_TRUE(base::ContainsKey(contents, kTestExtension)); - EXPECT_TRUE(base::ContainsKey(contents, kTestExtension2)); + EXPECT_TRUE(base::Contains(contents, kTestExtension)); + EXPECT_TRUE(base::Contains(contents, kTestExtension2)); PolicyBundle expected_bundle; expected_bundle.Get(kTestExtensionNS).CopyFrom(expected_policy_); @@ -624,8 +624,8 @@ contents.clear(); cache_->LoadAllSubkeys("extension-policy", &contents); ASSERT_EQ(1u, contents.size()); - EXPECT_TRUE(base::ContainsKey(contents, kTestExtension)); - EXPECT_FALSE(base::ContainsKey(contents, kTestExtension2)); + EXPECT_TRUE(base::Contains(contents, kTestExtension)); + EXPECT_FALSE(base::Contains(contents, kTestExtension2)); // And the service isn't publishing policy for the second extension anymore. expected_bundle.Clear();
diff --git a/components/policy/core/common/config_dir_policy_loader.cc b/components/policy/core/common/config_dir_policy_loader.cc index 6a81e76..3dae8fa 100644 --- a/components/policy/core/common/config_dir_policy_loader.cc +++ b/components/policy/core/common/config_dir_policy_loader.cc
@@ -197,7 +197,7 @@ for (base::DictionaryValue::Iterator domains_it(*domains_dictionary); !domains_it.IsAtEnd(); domains_it.Advance()) { - if (!base::ContainsKey(supported_domains, domains_it.key())) { + if (!base::Contains(supported_domains, domains_it.key())) { LOG(WARNING) << "Unsupported 3rd party policy domain: " << domains_it.key(); continue;
diff --git a/components/policy/core/common/remote_commands/remote_commands_service.cc b/components/policy/core/common/remote_commands/remote_commands_service.cc index 67b35671..83a553d 100644 --- a/components/policy/core/common/remote_commands/remote_commands_service.cc +++ b/components/policy/core/common/remote_commands/remote_commands_service.cc
@@ -95,7 +95,7 @@ } // If the command is already fetched, ignore it. - if (base::ContainsValue(fetched_command_ids_, command.command_id())) + if (base::Contains(fetched_command_ids_, command.command_id())) return; fetched_command_ids_.push_back(command.command_id());
diff --git a/components/policy/core/common/schema.cc b/components/policy/core/common/schema.cc index 2d8ea2dc..9d03cb7d 100644 --- a/components/policy/core/common/schema.cc +++ b/components/policy/core/common/schema.cc
@@ -888,7 +888,7 @@ std::string id_string; if (schema.GetString(schema::kId, &id_string)) { auto& id_map = references_and_ids->id_map; - if (base::ContainsKey(id_map, id_string)) { + if (base::Contains(id_map, id_string)) { *error = "Duplicated id: " + id_string; return false; } @@ -1287,7 +1287,7 @@ } for (const auto& required_property : GetRequiredProperties()) { - if (base::ContainsKey(present_properties, required_property)) + if (base::Contains(present_properties, required_property)) continue; SchemaErrorFound( @@ -1387,7 +1387,7 @@ } for (const auto& required_property : GetRequiredProperties()) { - if (base::ContainsKey(present_properties, required_property)) + if (base::Contains(present_properties, required_property)) continue; SchemaErrorFound(
diff --git a/components/policy/resources/policy_templates_am.xtb b/components/policy/resources/policy_templates_am.xtb index 80beb94..4a5a0bd 100644 --- a/components/policy/resources/policy_templates_am.xtb +++ b/components/policy/resources/policy_templates_am.xtb
@@ -131,15 +131,6 @@ መምሪያው ካልተዋቀረ ወይም ወደ ሐሰት ከተዋቀረ የገንቢ ማብሪያ ሁኔታው ሪፖርት አይደረግም።</translation> <translation id="1160479894929412407">የQUIC ፕሮቶኮል ይፍቀዱ</translation> <translation id="1160939557934457296">ከደህንነቱ የተጠበቀ አሰሳ ማስጠንቀቂያ ገጽ መቀጠልን ያሰናክሉ</translation> -<translation id="1171342272070128466">የተተከለውን ማጉያ ተደራሽነት ባህሪ ያንቁ። - - ይህ መመሪያ ወደ እውነት ከተዋቀረ፣ የተተከለው ማጉያ ሁልጊዜ እንደነቃ ይሆናል። - - ይህ መመሪያ ወደ ሐሰት ከተዋቀረ፣ የተተከለው ማጉያ ሁልጊዜ እንደተሰናከለ ይሆናል። - - ይህን መመሪያ ካዋቀሩት ተጠቃሚዎች ሊቀይሩት ወይም ሊሽሩት አይችሉም። - - ይህ መመሪያ እንዳልተዋቀረ ከተተወ የተሰካው ማጉያ መጀመሪያ ላይ ይሰናከላል ነገር ግን በማንኛውም ጊዜ በተጠቃሚው ሊነቃ ይችላል።</translation> <translation id="1189817621108632689">ምስሎችን እንዲያሳዩ የተፈቀደላቸው ጣቢያዎችን የሚገልጹ የዩአርኤል ስርዓተ ጥለቶችን እንዲያዘጋጁ ያስችልዎታል። ይህ መመሪያ እንዳልተዋቀረ ከተተወ ከተዋቀረ የ«DefaultImagesSetting» መመሪያው፣ አለበለዚያ የተጠቃሚው የግል ውቅረት ሁለገብ ነባሪ እሴት ለሁሉም ጣቢያዎች ሥራ ላይ ይውላል። @@ -1126,6 +1117,15 @@ ይህ መመሪያ ካልተዋቀረ ይበልጥ ውሱን የሆኑት መመሪያዎች ላይ ምንም ተጽዕኖ አያርፍም።</translation> <translation id="2987155890997901449">ARCን ያንቁ</translation> <translation id="2987227569419001736">የድር ብሉቱዝ ኤፒአይን አጠቃቀም ይቆጣጠሩ</translation> +<translation id="2990018289267778247">ይህ መመሪያ ወደ እውነተ ከተዋቀረ የተደራሽነት አማራጮች ሁልጊዜ በሥርዓት መሳቢያ ምናሌው ላይ ይታያሉ። + + ይህ መመሪያ ወደ ሐሰት ከተዋቀረ የተደራሽነት አማራጮች በጭራሽ በሥርዓት መሳቢያ ምናሌው ላይ አይታዩም። + + ይህን መመሪያ ካዋቀሩት ተጠቃሚዎች ሊቀይሩት ወይም ሊሽሩት አይችሉም። + + ይህ መመሪያ እንዳልተዋቀረ ከተተወ የተደራሽነት አማራጮች በሥርዓቱ የመሳቢያ ምናሌው ላይ አይታዩም፣ ነገር ግን ተጠቃሚው የተደራሽነት አማራጮቹ በቅንብሮች ገጽ በኩል እንዲታይ ማድረግ ይችላል። + + የተደራሽነት ባህሪዎች ከነቁ (በሌላ መንገድ ለምሳሌ በቁልፍ ቅንብር)፣ የተደራሽነት አማራጮች ሁልጊዜ በስርዓት መሳቢያ ምናሌው ላይ ይታያሉ።</translation> <translation id="3011301228198307065">በ<ph name="PRODUCT_NAME" /> ውስጥ ነባሪውን የመነሻ ገጽ ዩአርኤል ያዋቅረዋል እና ተጠቃሚዎች እንዳይቀይሩት ይከለክላቸዋል። መነሻ ገጹ በመነሻ አዝራሩ የተከፈተው ገጽ ነው። ጅምር ላይ የሚከፈቱ ገጾች በRestoreOnStartup መመሪያዎች ቁጥጥር የሚደረግባቸው ናቸው። @@ -1444,6 +1444,7 @@ ይህ መመሪያ በዴስክቶፕ ላይ በማሽን መጠነ ስፋት ያለ የደመና መመሪያ ምዝገባ አማካኝነት ጥቅም ላይ ሊውል ይችላል እና በመመዝገቢያ ወይም GPO በWindows ላይ፣ plist በMac ላይ እና JSON መመሪያ ፋይል በLinux ሊቀናበር ይችላል።</translation> <translation id="3660562134618097814">በመግባት ጊዜ የSAML IdP ኩኪዎችን ያስተላልፉ</translation> <translation id="3701121231485832347">በ<ph name="MS_AD_NAME" /> ለሚተዳደሩ የ<ph name="PRODUCT_OS_NAME" /> መሣሪያዎች የሆኑ ቅንብሮችን ይቆጣጠራል።</translation> +<translation id="3702518095257671450">በርቀት ማስረገጥ</translation> <translation id="3702647575225525306"><ph name="POLICY_NAME" /> (ባለነጠላ መስመር መስኩ ተቋርጧል እና ወደፊት ይወገዳል። እባክዎ ከዚህ በታች ባለብዙ መስመር የጽሑፍ ሳጥኑን መጠቀም ይጀምሩ።)</translation> <translation id="3709266154059827597">የተከለከሉ ቅጥያዎች ጭነት ዝርዝር ያዋቅሩ</translation> <translation id="3711895659073496551">አንጠልጥል</translation> @@ -1556,11 +1557,6 @@ መመሪያው ወደ ሐሰት ከተዋቀረ የክፍለ-ጊዜ መረጃ ሪፖርት አይደረግም። ወደ እውነት ከተዋቀረ ወይም እንዳልተዋቀረ ከተተወ የክፍለ-ጊዜ መረጃ ሪፖርት ይደረጋል።</translation> -<translation id="3852924591079583104"> - ይህ መመሪያ ወደ ArcSession ሲዋቀር Android ጀምሮ ከሆነ ተዘግቶ ሲወጣ መሣሪያው ዳግም እንዲነሳ ያስገድደዋል። - ወደ ሁልጊዜ ሲዋቀር ከእያንዳንዱ የተጠቃሚ ዘግቶ ሲወጣ መሣሪያው ዳግም እንዲነሳ ያስገድደዋል። - እንዳልተዋቀረ ከተተወ ምንም ውጤት አይኖረውም፣ እና ተጤቃሚው ዘግቶ ሲወጣ በግዳጅ ዳግም መነሳት የለም። ወደ በጭራሽ ከተዋቀረም እንዲሁ። - </translation> <translation id="3858658082795336534">ነባሪ ህትመት ዱፕሌክስ ሁነታ</translation> <translation id="3859780406608282662">በ<ph name="PRODUCT_OS_NAME" /> ውስጥ ያለ የተለዋዋጭነት ዘር የሚመጣበት ልኬት ያክሉ። @@ -1838,6 +1834,15 @@ ይህ መመሪያ የሚከበረው የ«DefaultSearchProviderEnabled» መመሪያ ሲነቃ ብቻ ነው።</translation> <translation id="4285674129118156176">አጋር ያልሆኑ ተጠቃሚዎች ARCን እንዲጠቀሙ ይፍቀዱ</translation> +<translation id="4289903996435140853">የትኛዎቹ ጣቢያዎች በራስ-ሰር ከቀረበው አገልግሎት ሻጭ እና የምርት መታወቂያዎች ጋር የዩኤስቢ መሣሪያን ለመድረስ ፈቃድ እንደሚሰጡ የዩአርኤሎች ዝርዝርን እንዲያዘጋጁ ያስችልዎታል። የሚሠራ እንዲሆን በዝርዝሩ ውስጥ ያለውን እያንዳንዱ ንጥል መሣሪያዎችን እና ዩአርኤሎችን ሁለቱንም በትክክለኛ አቀማመጥ መያዝ ይኖርበታል። በመሣሪያዎች ውስጥ ያለው እያንዳንዱ ንጥል የአገልግሎት ሻጭ መታወቂያ እና የምርት መታወቂያ መስክ በውስጡ ሊይዝ ይችላል። እንዲቀር የተደረገ ማናቸውም መታወቂያ ከአንድ ልዩ ሁኔታ ጋር እንደ ልዩ መታወቂያ ይስተናገዳል፤ ይኸው ልዩ ሁኔታ የምርት መታወቂያ የተለየ የሻጭ መታወቂያ በተጨማሪ ሳይጠቀስ ሊጠቀስ አይችልም። አለበለዚያ፣ መመሪያው የሚሠራ አይሆንም እና ችላ ተብሎ ይታለፋል። + + የዩኤስቢ ፈቃድ ሞዴሉ የጠያቂውን ጣቢያ («ጠያቂ ዩአርኤል») ዩአርኤል እና የከፍተኛውን ክፍለ ድረገጽ ዩአርኤል («ተካታች ዩአርኤል») ለጠያቂው ዩአርኤል ወደ ዩኤስቢ መሣሪያ እንዲደርስ ፈቃድ ለመስጠት ይጠቀማል። ጠያቂው ዩአርኤል በiframe ውስጥ የሚሰቀል ከሆነ ጠያቂው ዩአርኤል ከተካታቹ ዩአርኤል የተለየ ሊሆን ይችላል። በመሆኑም የ«ዩአርኤሎች» መስክ በኮማ የተለዩ እስከ ሁለት የሚደርሱ ዩአርኤል ኅብረ ቁምፊዎች በውስጡ ሊይዝ ይችላል። አንድ ብቻ ዩአርኤል ከተጠቀሰ ጠያቂው ዩአርኤል ተካታች ይሁን አይሁን ከግምት ሳይገባ ወደ ተዛማጆቹ ዩኤስቢ መሣሪያዎች መዳረሻ ይሰጣል። በ«ዩአርኤሎች» ውስጥ ያለው ዩአርኤል የሚሠሩ ዩአርኤል መሆን አለባቸው፤ አለበለዚያ መመሪያው ችላ ተብሎ ይታለፋል። + + ይህ መመሪያ ሳይቀናበር ከተተወ ሁለንተናዊው ነባሪ እሴት ከ«DefaultWebUsbGuardSetting» መመሪያ ከተዋቀረ ወይም የተጠቃሚው የግል ውቅረት አለበለዚያ ለሁሉም ጣቢያዎች ጥቅም ላይ ይውላል። + + በዚህ መመሪያ ውስጥ ያሉ ዩአርኤል ሥርዓተ ጥለቶች በWebUsbBlockedForUrls ከተዋቀሩት ጋር መጋጨት የለባቸውም። ግጭት ካለ፣ ይህ መመሪያ በWebUsbBlockedForUrls እና በWebUsbAskForUrls ላይ የበላይነት ይኖረዋል። + + ለዚህ መመሪያ እና ለ WebUsbAllowDevicesForUrls መመሪያ እሴቶች አንድ ላይ ይቀላቀላሉ።</translation> <translation id="4298509794364745131">በ<ph name="PRODUCT_OS_NAME" /> ማያ ገጽ ቁልፍ ላይ እንደ ማስታወሻ መውሰጃ መተግበሪያ ሊነቁ የሚችሉ የመተግበሪያዎች ዝርዝርን ይገልጻል። ተመራጩ የማስታወሻ መውሰጃ መተግበሪያ በማያ ገጽ ቁልፍ ላይ ከነቃ የማያ ገጽ ቁልፉ ተመራጩን የማስታወሻ መውሰጃ መተግበሪያን ለማስጀመር የዩአይ አባለ ነገር በውስጡ ይይዛል። @@ -1989,6 +1994,7 @@ <translation id="4639407427807680016">በተከለከሉ ዝርዝር ላይ የማይካተቱ የመልዕክት መላላኪያ አስተናጋጆች ስሞች</translation> <translation id="4650759511838826572">የዩ አር ኤል ፕሮቶኮል መርሐግብሮችን ያሰናክሉ</translation> <translation id="465099050592230505">የድርጅት ድር መደብር ዩአርኤል (የተቋረጠ)</translation> +<translation id="4661889655253181651">የይዘት ቅንብሮች እንዴት የአንድ የተወሰነ አይነት ይዘቶች (ለምሳሌ፣ ኩኪዎች፣ ምስሎች ወይም JavaScript) እንደሚያዙ እንዲገልጹ ያስችለዎታል።</translation> <translation id="4665897631924472251">የቅጥያ አስተዳደር ቅንብሮች</translation> <translation id="4668325077104657568">ነባሪ የምስሎች ቅንብር</translation> <translation id="4670865688564083639">ዝቅተኛ፦</translation> @@ -2032,6 +2038,11 @@ እነዚህ ጥቆማዎች ከGoogle አገልጋዮች ላይ ከርቀት ይወሰዳሉ። ይህ ቅንብር ወደ ሀሰት ከተቀናበረ፣ ጥቆማዎች አይወሰዱም ወይም አይታዩም።</translation> +<translation id="4759650396863318477">የትኛዎቹ ተጠቃሚዎች <ph name="PRODUCT_NAME" /> እንደገና መጀመር እንዳለበት ወይም አንድ የ<ph name="PRODUCT_OS_NAME" /> መሣሪያ በመጠባበቅ ላይ ያለ ዝማኔን ለመተግበር እንደገና መጀመር ይኖርበት እንደሆነ ማሳወኢያ የሚያገኙበት ጊዜን በሚሊሰከንዶች እንዲያቀናብሩ ያስችልዎታል። + + በዚህ ጊዜ ላይ ተጠቃሚው የዝማኔ አስፈላጊነት በተደጋጋሚ እንዲያውቁት ይደረጋሉ። ለ<ph name="PRODUCT_OS_NAME" /> መሣሪያዎች፣ በሥርዓት ትሪው ውስጥ በ <ph name="RELAUNCH_HEADS_UP_PERIOD_POLICY_NAME" /> መመሪያ መሠረት የዳግም ማስጀመሪያ ማሳወቂያ ብቅ ይላል። ለ<ph name="PRODUCT_NAME" /> አሳሾች፣ አንዴ የማሳወቂያው ክፍለ-ጊዜ አንድ ሦስተኛ ያህሉ እንዳለፈ ዳግም ማስጀመር እንደሚያስፈልግ ለመጠቆም የመተግበሪያው ምናሌ ይለውጣል። አንዴ የማሳወቂያው ክፍለ-ጊዜ ሁለት ሦስተኛው ካለፈ በኋላና እንዲሁም እንደገና ሙሉው ክፍለ-ጊዜ ካለፈ በኋላ ይህ ምናሌ ቀለም ይለውጣል። በ<ph name="RELAUNCH_NOTIFICATION_POLICY_NAME" /> መመሪያ የነቁ ተጨማሪ ማሳወቂያዎች ይህንኑ ተመሳሳይ የጊዜ መርሐግብር ይከተላሉ። + + ካልተዋቀረ ነባሪው ክፍለ-ጊዜ 345600000 ሚሊሰከንዶች (አራት ቀናት) ለ<ph name="PRODUCT_OS_NAME" /> መሣሪያዎች እና ሚሊሰከንዶች (አንድ ሳምንት) ለ<ph name="PRODUCT_NAME" /> ስራ ላይ ይውላሉ።</translation> <translation id="4788252609789586009">የ<ph name="PRODUCT_NAME" /> ራስ-ሙላ ባህሪን ያነቃል፣ እና ተጠቃሚዎች ከዚህ ቀደም የተከማቸ መረጃን በመጠቀም የክሬዲት ካርድ መረጃን በድር ቅጾች ላይ በራስ-እንዲያጠናቅቁ ያስችላቸዋል። ይህ ቅንብር ከተሰናከለ ራስ-ሙላ በጭራሽ የክሬዲት ካርድ መረጃን አይጠቁምም ወይም አይሞላም፣ እንዲሁም ተጠቃሚው ድሩን እያሰሰ ሳለ ሊያስገባ የሚችለውን የክሬድቲ ካርድ መረጃን አያስቀምጥም። @@ -2239,6 +2250,15 @@ ይህ መመሪያ እንዳልተዋቀረ ከተተወ ከተዋቀረ የ«DefaultNotificationsSetting» መመሪያ፣ አለበለዚያ ደግሞ የተጠቃሚው የግል ውቅር ሁለንተናዊ ነባሪ ዋጋ ስራ ላይ ይውላል።</translation> <translation id="5213038356678567351">የአሳሽ ቅየራን መቀስቀስ በጭራሽ የሌለባቸው ድር ጣቢያዎች።</translation> <translation id="5219844027738217407">ለAndroid መተግበሪያዎች፣ ይህ መመሪያ በማይክሮፎኑ ላይ ብቻ ነው ተጽዕኖ የሚኖረው። ይህ መመሪያ ወደ እውነት ሲዋቀር ማይክሮፎኑ አንድ ሳያስቀር ለሁሉም የAndroid መተግበሪያዎች ይዘጋል።</translation> +<translation id="5221394278852982313">የትኛዎቹ ጣቢያዎች በራስ-ሰር ከቀረበው አገልግሎት ሻጭ እና የምርት መታወቂያዎች ጋር የዩኤስቢ መሣሪያን ለመድረስ ፈቃድ እንደሚሰጡ የዩአርኤሎች ዝርዝርን እንዲያዘጋጁ ያስችልዎታል። የሚሠራ እንዲሆን በዝርዝሩ ውስጥ ያለውን እያንዳንዱ ንጥል መሣሪያዎችን እና ዩአርኤሎችን ሁለቱንም በትክክለኛ አቀማመጥ መያዝ ይኖርበታል። በመሣሪያዎች ውስጥ ያለው እያንዳንዱ ንጥል የአገልግሎት ሻጭ መታወቂያ እና የምርት መታወቂያ መስክ በውስጡ ሊይዝ ይችላል። እንዲቀር የተደረገ ማናቸውም መታወቂያ ከአንድ ልዩ ሁኔታ ጋር እንደ ልዩ መታወቂያ ይስተናገዳል፤ ይኸው ልዩ ሁኔታ የምርት መታወቂያ የተለየ የሻጭ መታወቂያ በተጨማሪ ሳይጠቀስ ሊጠቀስ አይችልም። አለበለዚያ፣ መመሪያው የሚሠራ አይሆንም እና ችላ ተብሎ ይታለፋል። + + የዩኤስቢ ፈቃድ ሞዴሉ የጠያቂውን ጣቢያ («ጠያቂ ዩአርኤል») ዩአርኤል እና የከፍተኛውን ክፍለ ድረገጽ ዩአርኤል («ተካታች ዩአርኤል») ለጠያቂው ዩአርኤል ወደ ዩኤስቢ መሣሪያ እንዲደርስ ፈቃድ ለመስጠት ይጠቀማል። ጠያቂው ዩአርኤል በiframe ውስጥ የሚሰቀል ከሆነ ጠያቂው ዩአርኤል ከተካታቹ ዩአርኤል የተለየ ሊሆን ይችላል። በመሆኑም የ«ዩአርኤሎች» መስክ በኮማ የተለዩ እስከ ሁለት የሚደርሱ ዩአርኤል ኅብረ ቁምፊዎች በውስጡ ሊይዝ ይችላል። አንድ ብቻ ዩአርኤል ከተጠቀሰ ጠያቂው ዩአርኤል ተካታች ይሁን አይሁን ከግምት ሳይገባ ወደ ተዛማጆቹ ዩኤስቢ መሣሪያዎች መዳረሻ ይሰጣል። በ«ዩአርኤሎች» ውስጥ ያለው ዩአርኤል የሚሠሩ ዩአርኤል መሆን አለባቸው፤ አለበለዚያ መመሪያው ችላ ተብሎ ይታለፋል። + + ይህ መመሪያ ሳይቀናበር ከተተወ ሁለንተናዊው ነባሪ እሴት ከ«DefaultWebUsbGuardSetting» መመሪያ ከተዋቀረ ወይም የተጠቃሚው የግል ውቅረት አለበለዚያ ለሁሉም ጣቢያዎች ጥቅም ላይ ይውላል። + + በዚህ መመሪያ ውስጥ ያሉ ዩአርኤል ሥርዓተ ጥለቶች በWebUsbBlockedForUrls ከተዋቀሩት ጋር መጋጨት የለባቸውም። ግጭት ካለ፣ ይህ መመሪያ በWebUsbBlockedForUrls እና በWebUsbAskForUrls ላይ የበላይነት ይኖረዋል።. + + የዚህ መመሪያ እና የ DeviceWebUsbAllowDevicesForUrls መመሪያ እሴቶች አንድ ላይ ይቀላቀላሉ።</translation> <translation id="5228316810085661003">የመሣሪያ-አካባቢ መለያ ራስ-ግባ መዘግየት። የ|DeviceLocalAccountAutoLoginId| መመሪያው ካልተዋቀረ ይህ መመሪያ ምንም ውጤት የለውም። አለበለዚያ፦ @@ -2970,6 +2990,21 @@ ይህ መመሪያ ወደ «ተጠቃሚዎች የእውቅና ማረጋገጫዎችን እንዲያቀናብሩ አትፍቀድ» ከተዋቀረ ተጠቃሚዎች የእውቅና ማረጋገጫዎችን ማቀናበር አይችሉም፣ መመልከት ብቻ ነው የሚችሉት።</translation> <translation id="6573305661369899995">የዩአርኤል ገደቦች ውጫዊ ምንጭን ያቀናብሩ</translation> +<translation id="6583851521569686409">የአታሚዎችን ዝርዝር ያዋቅራል + + ይህ መመሪያ አስተዳዳሪዎች ለእነርሱ ተጠቃሚዎች የአታሚ ውቅረቶችን እንዲያቀርቡ + ያስችላቸዋል። + + <ph name="PRINTER_DISPLAY_NAME" /> እና <ph name="PRINTER_DESCRIPTION" /> ለአታሚ ምርጫ ቅለት ብጁ ሊደረጉ የሚችሉ ነጻ የኅብረ ቁምፊ ዓይነቶች ናቸው። <ph name="PRINTER_MANUFACTURER" /> እና <ph name="PRINTER_MODEL" /> በመጨረሻ ተጠቃሚዎች የአታሚ ለይቶ ማወቅን ለማቅለል ያገለግላሉ። የአማራቹን እና የአታሚውን ሞዴል ይወክላሉ። <ph name="PRINTER_URI" /> የ <ph name="URI_SCHEME" />፣ <ph name="URI_PORT" />፣ እና <ph name="URI_QUEUE" /> ጨምሮ ከደንበኛው ኮምፒውተር ላይ ሊደረስበት የሚችል አድራሻ መሆን አለበት። <ph name="PRINTER_UUID" /> ግዴታ ያልሆነ ነው። ከተሰጠ፣ ድግምግሞሽ <ph name="ZEROCONF_DISCOVERY" /> አታሚዎችን ለማገዝ ጥቅም ላይ ይውላል። + + አሊያም <ph name="PRINTER_EFFECTIVE_MODEL" /> የአታሚውን ስም በውስጡ ሊይዝ ይገባል ወይም <ph name="PRINTER_AUTOCONF" /> ወደ እውነት መቀናበር አለበት። ሁለቱም ያሉዋቸው ወይም ምንም ይዘቶች የሌሉዋቸው አታሚዎች ችላ ይባላሉ። + + የአታሚ ቅንብር አታሚው ለመጀመሪያ ጊዜ ጥቅም ላይ ሲውል ይጠናቀቃል። PPDዎች አታሚው ጥቅም ላይ እስከሚውል ድረስ አይወርዱም። ከዚያ ጊዜ በኋላ፣ ብዙውን ጊዜ ጥቅም ላይ የሚውሉ PPDዎች ይሸጎጣሉ። + + ይህ መመሪያ ተጠቃሚዎች በነፍስ ወከፍ መሣሪያዎች ላይ አታሚዎችን ማዋቀር መቻለ አለመቻላቸው ላይ ምንም ተጽዕኖ አይኖረውም። በነፍስ ወከፍ ተጠቃሚዎች አታሚዎችን ሲያዋቅሩ እንደ ተጨማሪ አጋዥ እንዲሆን የታሰበ ነው። + + በ Active Directory ለሚተዳደሩ መሣሪያዎች ይህ መመሪያ <ph name="MACHINE_NAME_VARIABLE" /> ወደ Active Directory ማሽን ስሙ ወይም የእሱ ንዑስ ኅብረ ቁምፊ እንዲስፋፋ ይደግፋል። ለምሳሌ፣ የማሽኑ ስም <ph name="MACHINE_NAME_EXAMPLE" /> ከሆነ፣ <ph name="MACHINE_NAME_VARIABLE_EXAMPLE" /> ከ6ኛው ቦታ አቀማመጥ ጀምሮ በ4 ቁምፊዎች ይተካል፣ ለምሳሌ <ph name="MACHINE_NAME_PART_EXAMPLE" />። ቦታ አቀማመጡ በዜሮ ላይ የተመረኮዘ እንደሆነ ልብ ይበሉ። + </translation> <translation id="6598235178374410284">የተጠቃሚ አምሳያ ምስል</translation> <translation id="6603004149426829878">የጊዜ ሰቅ እየተፈታ ሳለ ሁልጊዜ ማንኛውም የሚገኝ የአካባቢ ሲግናሎችን ወደ አገልጋዩ ላክ</translation> <translation id="6628120204569232711">የማከማቻ ሁኔታን ሪፖርት አድርግ</translation> @@ -3423,7 +3458,6 @@ ይህ መመሪያ ወደ «RemoveLRUIfDormant» ወደሚል ከተዘጋጀ የራስ ሰር ማጽዳቱ ተጠቃሚዎችን ከገቡ የቆዩትን በማስቀደም ቢያንስ ለ3 ወራት ካልገቡት በመጀመር በቂ ነጻ ቦታ እስከሚኖር ድረስ ያስወግዳል። ይህ መመሪያ ካልተዘጋጀ የራስ ሰር ማጽዳት አብሮ የተገነባውን ነባሪ ዘዴ ይጠቀማል። በአሁኑ ወቅት ያለው የ«RemoveLRUIfDormant» ዘዴ ነው።</translation> -<translation id="7334274148831027933">የተተከለ ማጉያን ያንቁ</translation> <translation id="7336785017449297672">የሰዓት እና የሰዓት ሰቅ ቅንብሮችን ይቆጣጠራል።</translation> <translation id="7336878834592315572">ክፍለ ጊዜው እስከቆየበት ያህል ጊዜ ድረስ ኩኪዎችን አቆይ</translation> <translation id="7339315111520512972">የአውታረ መረብ ኮድ በአሳሽ ሂደቱ ላይ እንዲያሄድ አስገድድ</translation> @@ -4304,6 +4338,8 @@ <translation id="915194831143859291">ይህ መመሪያ ወደ ሐሰት ከተዋቀረ ወይም እንዳልተዋቀረ ከተተወ <ph name="PRODUCT_OS_NAME" /> ተጠቃሚው መሣሪያውን እንዲዘጋ ያስችለዋል። ይህ መመሪያ ወደ እውነት ከተዋቀረ ተጠቃሚ መሣሪያውን ሲያጠፋው <ph name="PRODUCT_OS_NAME" /> ዳግም ማስነሳት ይቀሰቅሳል። <ph name="PRODUCT_OS_NAME" /> ሁሉንም በበይነገጹ ውስጥ ያሉ የመዝጊያ አዝራሮች ክስተቶችን በዳግም ማስነሻ አዝራሮች ይተካቸዋል። ተጠቃሚው የኃይል አዝራሩን በመጠቀም መሣሪያውን ካጠፋው በራስ-ሰር ዳግም አይነሳም፣ መመሪያው ቢነቃም እንኳ።</translation> <translation id="9152473318295429890">የተዛማጅ የድር ገጾችን የነገር አገባብ የጠበቁ ጥቆማ ሐሳቦችን ያንቁ</translation> +<translation id="9153446010242995516">የሥርዓተ ክወና ስሪት ከዒላማው ይበልጥ አዲስ ከሆነ ይቀልብሱና በዒላማ ስሪቱ ላይ ይቆዩ። ከተቻለ የመሣሪያ-ደረጃ ውቅረት (የአውታረ መረብ መረጃዎች ጨምሮ) በቅልበሳ ሂደቱ በኩል ለማስተላለፍ ይሞክሩ፣ ነገር ግን ውሂቡን ወደነበረበት መመለስ የማይቻል (የዒላማ ስሪቱ ውሂብን ወደነበረበት መመለስ ስለማይደግፍ ወይም በኋሊዮሽ ኢ-ተኳኋኝነት ለውጥ ምክንያት) ቢሆንም እንኳ ቅልበሳውን በሙሉ ፓወርዋሽ ያከናውኑት። + በ<ph name="PRODUCT_OS_NAME" /> ስሪት 75 እና ከዚያ በላይ ላይ ይደገፋል። ቆየት ላሉ ደንበኛዎች ይህ እሴት ቅልበሳው ተሰናክሏል ማለት ነው።</translation> <translation id="9158929520101169054">በአሳሹ ውስጥ በርካታ በመለያ መግባትን ይፍቀዱ</translation> <translation id="9159126470527871268">በመጠባበቀቅ ላይ ያለ ዝማኔን ለመተግበር <ph name="PRODUCT_NAME" /> ዳግም መጀመር እንዳለበት ወይም <ph name="PRODUCT_OS_NAME" /> ዳግም መነሳት እንዳለበት ለተጠቃሚዎች ያሳውቁ።
diff --git a/components/policy/resources/policy_templates_ar.xtb b/components/policy/resources/policy_templates_ar.xtb index 5689105..fece8e13 100644 --- a/components/policy/resources/policy_templates_ar.xtb +++ b/components/policy/resources/policy_templates_ar.xtb
@@ -139,15 +139,6 @@ <translation id="1152117524387175066">الإبلاغ عن حالة مفتاح مطوّر الجهاز عند التشغيل. إذا تم تعيين السياسة على "خطأ"، فلن يتم تسجيل حالة مفتاح مطوّر الجهاز.</translation> <translation id="1160479894929412407">السماح ببروتوكول QUIC</translation> <translation id="1160939557934457296">إيقاف المتابعة من صفحة تحذير التصفح الآمن</translation> -<translation id="1171342272070128466">تعمل هذه السياسة على تفعيل ميزة إمكانية الوصول إلى المكبّر الذي تم إرساؤه. - - في حال ضبط هذه السياسة على "True"، سيتم دائمًا تفعيل المكبّر الذي تم إرساؤه. - - في حال ضبط هذه السياسة على "False"، سيتم دائمًا إيقاف المكبّر الذي تم إرساؤه. - - في حال تحديد هذه السياسة، لن يتمكَّن المستخدمون من تغييرها أو إلغائها. - - في حال ترك هذه السياسة بدون تحديد، يتم إيقاف المكبّر الذي تم إرساؤه في البداية مع إمكانية تفعيله من قِبل المستخدم في أي وقت.</translation> <translation id="1189817621108632689">تسمح لك بإعداد قائمة بأنماط عناوين url التي تحدّد المواقع الإلكترونية غير المسموح لها بعرض الصور. إذا لم يتم وضع هذه السياسة، ستُستخدم القيمة التلقائية العامة لكل المواقع الإلكترونية إما من سياسة "DefaultImagesSetting" في حال وضعها، أو التهيئة الشخصية للمستخدم بدلاً من ذلك. @@ -1527,11 +1518,6 @@ إذا تم تعيين السياسة على "false"، فلن يتم الإبلاغ عن معلومات جلسة الكشك وفي حالة تعيينها على "true" أو تركها دون تعيين، فسيتم الإبلاغ عن معلومات جلسة الكشك.</translation> -<translation id="3852924591079583104"> - عند ضبط هذه السياسة على ArcSession، فإنّها تفرض إعادة تشغيل الجهاز عند تسجيل خروج المستخدم في حال بدء Android. - عند ضبط هذه السياسة على "دائمًا"، ذلك يعني أنها تفرض إعادة تشغيل الجهاز عند تسجيل خروج كل مستخدم. - وفي حال تركها بدون ضبط، لن يكون لذلك أي تأثير ولا يتم فرض إعادة تشغيل الجهاز عند تسجيل خروج المستخدم. وينطبق الإجراء نفسه في حال ضبط السياسة على "أبدًا". - </translation> <translation id="3858658082795336534">الوضع المزدوج للطباعة التلقائية</translation> <translation id="3859780406608282662">يمكنك إضافة معلمة إلى جلب القيمة الأولية للأشكال المتنوعة من الأجهزة في <ph name="PRODUCT_OS_NAME" />. @@ -2299,6 +2285,11 @@ <translation id="5423001109873148185">تفرض هذه السياسة استيراد محركات البحث من المتصفح التلقائي الحالي إذا تم تمكينها. تؤثر هذه السياسة أيضًا على مربع الحوار "استيراد" إذا تم تمكينها. إذا تم إيقافها، فلن يتم استيراد محرك البحث التلقائي. إذا لم يتم تعيينها، فقد يتم سؤال المستخدم بشأن الاستيراد أو إجراء الاستيراد تلقائيًا.</translation> <translation id="5423197884968724595">اسم تقييد Android WebView:</translation> <translation id="5424147596523390018">السماح بجميع الأوضاع بالألوان</translation> +<translation id="5427003226809696696">تتحكّم هذه السياسة في ما إذا كان يجب إعادة تشغيل نافذة المتصفح في بداية الجلسة أم لا. + + في حال تفعيل هذه السياسة، لن تتم إعادة تشغيل نافذة المتصفح. + + في حال إيقاف هذه السياسة أو عدم تحديدها، لن يتم السماح بإعادة تشغيل نافذة المتصفح. تجدر الإشارة إلى أنه قد لا تتم إعادة تشغيل نافذة المتصفح بسبب سياسات أخرى أو علامات سطر الأوامر.</translation> <translation id="5427879482805712214">تسمح لك هذه السياسة بضبط الصورة الرمزية التي تمثل المستخدم على شاشة تسجيل الدخول. يتم ضبط السياسة من خلال تحديد عنوان URL الذي يمكن من خلاله لنظام التشغيل <ph name="PRODUCT_OS_NAME" /> تنزيل الصورة الرمزية وتجزئة التشفير المُستخدمة للتحقُّق من سلامة عملية التنزيل. يجب أن تكون الصورة بتنسيق JPEG، وألا يتجاوز حجمها 512 كيلوبايت. ويجب أن يكون الوصول إلى عنوان URL متاحًا بدون أي مصادقة. يتم تنزيل الصورة الرمزية وحفظها في ذاكرة التخزين المؤقت. وستتم إعادة تنزيلها كلما تغيّر عنوان URL أو تغيّرت التجزئة. @@ -3326,7 +3317,6 @@ إذا تم تعيين هذه السياسة على 'RemoveLRU'، فسيستمر التنظيف التلقائي بإزالة المستخدمين الذين لم يسجلوا بتسجيل خلال 3 شهور على الأقل في آخر تسجيل دخول بالترتيب إلى أن تتوفر مساحة قرص كافية. إذا لم يتم تعيين هذه السياسة، يستخدم التنظيف التلقائي الإستراتيجية المضمنة التلقائية. حاليًا الإستراتيجية المستخدمة هي 'RemoveLRUIfDormant'.</translation> -<translation id="7334274148831027933">تفعيل المكبّر الذي تم إرساؤه</translation> <translation id="7336785017449297672">تتحكم هذه السياسة في إعدادات المنطقة الزمنية والساعة.</translation> <translation id="7336878834592315572">الاحتفاظ بملفات تعريف الارتباط طوال مدة الجلسة</translation> <translation id="7339315111520512972">فرض تشغيل رمز الاتصال بالشبكات في معالجة المتصفِّح</translation> @@ -3755,6 +3745,7 @@ في حالة ترك هذه السياسة بدون تعيين، لن يكون هناك أي استثناءات لقائمة العناوين المحظورة من سياسة 'URLBlacklist'.</translation> <translation id="8176035528522326671">السماح لمستخدم المؤسسة بأن يكون مستخدمًا أساسيًا لملفات شخصية متعددة (السلوك التلقائي للمستخدمين تحت إدارة المؤسسات)</translation> +<translation id="8183108371184777472">إيقاف تشغيل نافذة المتصفح</translation> <translation id="8214600119442850823">توفر تهيئة مدير كلمات المرور.</translation> <translation id="8217516105848565518">تم إيقاف هذه السياسة. يُرجى استخدام RemoteAccessHostDomainList بدلاً منها.</translation> <translation id="8244171102276095471">تفعيل مجموعات تشفير RC4 في طبقة النقل الآمنة</translation>
diff --git a/components/policy/resources/policy_templates_bg.xtb b/components/policy/resources/policy_templates_bg.xtb index 0f0e3170..c14b7e2 100644 --- a/components/policy/resources/policy_templates_bg.xtb +++ b/components/policy/resources/policy_templates_bg.xtb
@@ -127,15 +127,6 @@ Ако за правилото е зададено „false“, състоянието няма да се известява.</translation> <translation id="1160479894929412407">Разрешаване на протокола QUIC</translation> <translation id="1160939557934457296">Деактивиране на продължаването от предупредителната страница на Безопасно сърфиране</translation> -<translation id="1171342272070128466">Активиране на функцията за достъпност „Лупа в прикрепен режим“. - - Ако за правилото е зададено true, лупата в прикрепен режим винаги ще бъде активирана. - - При false тя винаги ще бъде деактивирана. - - Ако зададете правилото, потребителите не могат да го променят или отменят. - - В случай че то не е зададено, първоначално лупата в прикрепен режим е деактивирана, но потребителят може да я активира по всяко време.</translation> <translation id="1189817621108632689">Позволява да съставите списък с образци на URL адреси, посочващи сайтове, на които не е разрешено да показват изображения. Ако това правило не е зададено, за всички сайтове ще се използва глобалната стандартна стойност от правилото DefaultImagesSetting, ако е зададено, или личната конфигурация на потребителя в противен случай. @@ -1104,6 +1095,15 @@ В случай че това правило не е зададено, поведението на по-конкретните правила не е засегнато.</translation> <translation id="2987155890997901449">Активиране на ARC</translation> <translation id="2987227569419001736">Контролиране на използването на приложния програмен интерфейс (API) Web Bluetooth</translation> +<translation id="2990018289267778247">Ако за това правило е зададено true, опциите за достъпност са винаги видими в менюто на системната област. + + При false те никога не се показват там. + + Ако зададете правилото, потребителите не могат да го променят или отменят. + + В случай че то не е зададено, опциите за достъпност няма да се показват в менюто на системната област, но потребителят може да ги направи видими чрез страницата „Настройки“. + + Когато функциите за достъпност са активирани (по друг начин, напр. чрез клавишна комбинация), съответните опции винаги ще се показват в менюто на системната област.</translation> <translation id="3011301228198307065">Конфигурира стандартния URL адрес на началната страница в <ph name="PRODUCT_NAME" /> и не разрешава на потребителите да го променят. Началната страница е тази, която се отваря чрез бутона „Начална страница“. Страниците при стартиране се контролират от правилата RestoreOnStartup. @@ -1416,6 +1416,7 @@ Това правило се използва при регистрирането на правила за облака на ниво устройство на настолни компютри и може да бъде зададено чрез системния регистър или GPO под Windows, plist за Mac и JSON файла с правила под Linux.</translation> <translation id="3660562134618097814">Прехвърляне на „бисквитките“, задавани от доставчици на удостоверителни услуги със SAML при влизане</translation> <translation id="3701121231485832347">Контролира настройките конкретно за управлявани чрез <ph name="MS_AD_NAME" /> устройства с <ph name="PRODUCT_OS_NAME" />.</translation> +<translation id="3702518095257671450">Отдалечено удостоверяване</translation> <translation id="3702647575225525306"><ph name="POLICY_NAME" /> (Едноредовото поле е оттеглено и ще бъде премахнато в бъдеще. Моля, започнете да използвате многоредовото текстово поле по-долу.)</translation> <translation id="3709266154059827597">Конфигуриране на черния списък за инсталиране на разширения</translation> <translation id="3711895659073496551">Спиране</translation> @@ -1528,11 +1529,6 @@ Информацията за тази сесия няма да се изпраща, ако за правилото е зададено false, и ще се изпраща, в случай че то е true или не е конфигурирано.</translation> -<translation id="3852924591079583104"> - Когато за това правило е зададено ArcSession, устройството ще се рестартира принудително, след като потребител излезе от профила си, ако операционната система Android е стартирана. - При задаване на Always устройството ще се рестартира при всяко излизане от профил. - Ако не е зададено, правилото няма ефект и устройството няма да се рестартира принудително при излизане от профил. Задаването на Never дава същия резултат. - </translation> <translation id="3858658082795336534">Стандартен режим за двустранно отпечатване</translation> <translation id="3859780406608282662">Добавете параметър за извличането на началното число за вариантите в <ph name="PRODUCT_OS_NAME" />. @@ -1814,6 +1810,15 @@ То се спазва само ако правилото „DefaultSearchProviderEnabled“ е активирано.</translation> <translation id="4285674129118156176">Разрешаване на външни потребители да използват ARC</translation> +<translation id="4289903996435140853">Дава възможност да определите списък с URL адреси, които посочват на кои сайтове автоматично ще бъде разрешен достъп до USB устройство с дадените идентификатори на производител и продукт. За да бъде валидно правилото, всеки елемент в списъка трябва да съдържа устройства и URL адреси. Всеки запис за устройство може да съдържа полета за идентификатор на производител и идентификатор на продукт. Ако бъде пропуснат идентификатор, той се третира като заместващ символ. Не може да бъде посочен идентификатор на продукта, без да бъде посочен и идентификатор на производителя. В противен случай правилото няма да бъде валидно и се пренебрегва. + +Моделът за разрешения за USB използва URL адреса на сайта, отправил заявката („URL адрес на заявката“), и URL адреса на съдържащия рамката сайт от най-високо ниво („URL адрес на вграждането“), за да предостави на URL адреса на заявката разрешение за достъп до USB устройството. URL адресът на заявката може да е различен от този на вграждането, когато отправилият заявката сайт е зареден във вложена рамка. Поради това полето urls може да съдържа до два низа за URL адрес, разделени със запетая, които посочват адресите съответно на заявката и на вграждането. Ако е посочен само един URL адрес, достъп до съответните USB устройства ще се предоставя, когато URL адресът на сайта, отправил заявката, съвпада с този адрес, независимо какво е състоянието на вграждане. URL адресите в полето urls трябва да са валидни, в противен случай правилото ще бъде пренебрегнато. + +Ако правилото не е зададено, за всички сайтове ще се използва глобалната стандартна стойност от правилото DefaultWebUsbGuardSetting, а ако то не е зададено, от личната конфигурация на потребителя. + +Образците на URL адреси в това правило не бива да са в конфликт с конфигурираните чрез WebUsbBlockedForUrls. В случай на конфликт това правило има приоритет пред WebUsbBlockedForUrls и WebUsbAskForUrls. + +Стойностите за това правило и за WebUsbAllowDevicesForUrls са обединени.</translation> <translation id="4298509794364745131">Служи за съставяне на списък с приложения, които да могат да се използват за водене на бележки на заключения екран на <ph name="PRODUCT_OS_NAME" />. Ако предпочитаното приложение за водене на бележки е активирано на заключения екран, той ще съдържа елемент от ПИ за отваряне на приложението. @@ -1959,6 +1964,7 @@ <translation id="4639407427807680016">Имената на хостовете за обмен на съобщения с приложения с директно изпълнение, които да бъдат изключени от черния списък</translation> <translation id="4650759511838826572">Деактивиране на схеми на протокол за URL адреси</translation> <translation id="465099050592230505">URL адрес на корпоративния уеб магазин (оттеглено)</translation> +<translation id="4661889655253181651">Настройките за съдържанието дават възможност да посочите как да се обработва конкретен тип съдържание (например „бисквитки“, изображения или JavaScript).</translation> <translation id="4665897631924472251">Настройки за управление на разширенията</translation> <translation id="4668325077104657568">Настройка по подразбиране за изображенията</translation> <translation id="4670865688564083639">Минимум:</translation> @@ -2003,6 +2009,11 @@ Тези предложения се извличат отдалечено от сървърите на Google. При false няма да се извличат или показват предложения.</translation> +<translation id="4759650396863318477">Дава възможност да зададете периода от време (в милисекунди), през който потребителите да бъдат известявани, че трябва да стартират отново <ph name="PRODUCT_NAME" /> или да рестартират устройството с <ph name="PRODUCT_OS_NAME" />, за да се приложи изчакваща актуализация. + + По време на този период потребителите ще бъдат уведомявани неколкократно за необходимостта от актуализиране. Според правилото <ph name="RELAUNCH_HEADS_UP_PERIOD_POLICY_NAME" /> в системната област на устройства с <ph name="PRODUCT_OS_NAME" /> ще се покаже известие за рестартиране. За браузъра <ph name="PRODUCT_NAME" /> менюто на приложението се променя, за да укаже, че е нужно повторно стартиране, щом изтече една трета от периода на известяване. Известието променя цвета си веднъж при изтичане на две трети от периода и втори път в края му. Този график важи и за допълнителните известия, активирани чрез правилото <ph name="RELAUNCH_NOTIFICATION_POLICY_NAME" />. + + Ако правилото не е зададено, за устройства с <ph name="PRODUCT_OS_NAME" /> ще се използва стандартният период от 345600000 милисекунди (четири дни), а за <ph name="PRODUCT_NAME" /> – 604800000 милисекунди (една седмица).</translation> <translation id="4788252609789586009">Активира функцията на <ph name="PRODUCT_NAME" /> за автоматично попълване и позволява на потребителите да попълват автоматично уеб формуляри чрез вече съхранена информация за кредитни карти. При деактивиране на тази настройка функцията няма да предлага или попълва информация за кредитни карти, нито ще запазва допълнителни данни за кредитни карти, ако потребителят въведе такива, докато сърфира в мрежата. @@ -2197,6 +2208,15 @@ <translation id="5208240613060747912">Позволява да зададете списък с образци за URL адреси, посочващи сайтове, на които не е разрешено да показват известия. Ако това правило е оставено незададено, за всички сайтове ще се използва глобалната стандартна стойност от правилото „DefaultNotificationsSetting“, ако е зададено, или в противен случай – личната конфигурация на потребителя.</translation> <translation id="5213038356678567351">Уебсайтове, които не бива да задействат превключване на браузъра.</translation> <translation id="5219844027738217407">Това правило засяга приложенията за Android само по отношение на микрофона. Когато е зададено true, той е заглушен за абсолютно всички приложения за Android.</translation> +<translation id="5221394278852982313">Дава възможност да определите списък с URL адреси, които посочват на кои сайтове автоматично ще бъде разрешен достъп до USB устройство с дадените идентификатори на производител и продукт. За да бъде валидно правилото, всеки елемент в списъка трябва да съдържа устройства и URL адреси. Всеки запис за устройство може да съдържа полета за идентификатор на производител и идентификатор на продукт. Ако бъде пропуснат идентификатор, той се третира като заместващ символ. Не може да бъде посочен идентификатор на продукта, без да бъде посочен и идентификатор на производителя. В противен случай правилото няма да бъде валидно и се пренебрегва. + +Моделът за разрешения за USB използва URL адреса на сайта, отправил заявката („URL адрес на заявката“), и URL адреса на съдържащия рамката сайт от най-високо ниво („URL адрес на вграждането“), за да предостави на URL адреса на заявката разрешение за достъп до USB устройството. URL адресът на заявката може да е различен от този на вграждането, когато отправилият заявката сайт е зареден във вложена рамка. Поради това полето urls може да съдържа до два низа за URL адрес, разделени със запетая, които посочват адресите съответно на заявката и на вграждането. Ако е посочен само един URL адрес, достъп до съответните USB устройства ще се предоставя, когато URL адресът на сайта, отправил заявката, съвпада с този адрес, независимо какво е състоянието на вграждане. URL адресите в полето urls трябва да са валидни, в противен случай правилото ще бъде пренебрегнато. + +Ако правилото не е зададено, за всички сайтове ще се използва глобалната стандартна стойност от правилото DefaultWebUsbGuardSetting, а ако то не е зададено, от личната конфигурация на потребителя. + +Образците на URL адреси в това правило не бива да са в конфликт с конфигурираните чрез WebUsbBlockedForUrls. В случай на конфликт това правило има приоритет пред WebUsbBlockedForUrls и WebUsbAskForUrls. + +Стойностите за това правило и за WebUsbAllowDevicesForUrls са обединени.</translation> <translation id="5228316810085661003">Забавянето преди автоматично влизане в локалния профил на устройството. Ако правилото |DeviceLocalAccountAutoLoginId| не е зададено, DeviceLocalAccountAutoLoginDelay няма ефект. В противен случай: @@ -2903,6 +2923,21 @@ Ако е зададено „Забраняване на потребителите да управляват сертификатите“, потребителите ще могат да преглеждат сертификатите, но не и да ги управляват.</translation> <translation id="6573305661369899995">Задаване на външен източник на ограничения за URL адреси</translation> +<translation id="6583851521569686409">Конфигурира списък с принтери. + + Това правило дава възможност на администраторите да предоставят конфигурации на принтери за +потребителите си. + + <ph name="PRINTER_DISPLAY_NAME" /> и <ph name="PRINTER_DESCRIPTION" /> са низове в свободна форма, които могат да се персонализират за улесняване на избирането на принтер. <ph name="PRINTER_MANUFACTURER" /> и <ph name="PRINTER_MODEL" /> служат за улесняване на разпознаването на принтерите от крайните потребители и представят производителя и модела на устройството. <ph name="PRINTER_URI" /> трябва да бъде адрес, достъпен от компютър клиент, като съдържа <ph name="URI_SCHEME" />, <ph name="URI_PORT" /> и <ph name="URI_QUEUE" />. Идентификаторът <ph name="PRINTER_UUID" /> не е задължителен. Ако бъде посочен, служи за по-лесно премахване на дублиращите се принтери, открити чрез протокола <ph name="ZEROCONF_DISCOVERY" />. + + <ph name="PRINTER_EFFECTIVE_MODEL" /> трябва да съдържа името на принтера или за <ph name="PRINTER_AUTOCONF" /> трябва да бъде зададено true. Принтерите, за които са използвани и двете свойства или за които не е зададено нито едно, ще бъдат пренебрегнати. + + Настройването на принтера завършва при първото му използване. PPD файловете не се изтеглят, преди принтерът да влезе в употреба. След това често използваните PPD файлове се кешират. + + Това правило няма ефект върху възможността на потребителите да конфигурират принтери на отделни устройства. То е предназначено да допълва конфигурирането на принтери от отделните потребители. + + За устройства, управлявани чрез Active Directory, това правило поддържа разширяване на <ph name="MACHINE_NAME_VARIABLE" /> до името на машината в Active Directory или до подниз от него. Ако например името е <ph name="MACHINE_NAME_EXAMPLE" />, променливата <ph name="MACHINE_NAME_VARIABLE_EXAMPLE" /> ще бъде заменена с четирите знака, започващи след шестата позиция, напр. <ph name="MACHINE_NAME_PART_EXAMPLE" />. Обърнете внимание, че отброяването на позицията започва от нула. + </translation> <translation id="6598235178374410284">Изображение на потребителския аватар</translation> <translation id="6603004149426829878">Наличните сигнали за местоположението винаги да се изпращат до сървъра при определяне на часовата зона</translation> <translation id="6628120204569232711">Съобщаване на състоянието на хранилищата</translation> @@ -3337,7 +3372,6 @@ При „RemoveLRUIfDormant“ от устройството ще се премахват потребители по ред на последно влизане, които не са влизали поне 3 месеца, като първи ще бъдат премахнати влезлите за последен път най-отдавна. Това ще се прави, докато не се освободи достатъчно място. В случай че това правило не е зададено, при автоматично почистване се ползва стандартната вградена стратегия. Понастоящем тя е „RemoveLRUIfDormant“.</translation> -<translation id="7334274148831027933">Активиране на лупата в прикрепен режим</translation> <translation id="7336785017449297672">Контролира настройките за часовника и часовата зона.</translation> <translation id="7336878834592315572">Съхраняване на „бисквитките“ за цялата продължителност на сесията</translation> <translation id="7339315111520512972">Кодът за мрежова комуникация да се изпълнява само в процеса на браузъра</translation> @@ -4212,6 +4246,8 @@ <translation id="915194831143859291">Ако за това правило е зададено false или то не е конфигурирано, потребителите ще могат да изключват устройството с <ph name="PRODUCT_OS_NAME" />. При true <ph name="PRODUCT_OS_NAME" /> ще се рестартира, когато потребител изключи устройството. Всички бутони за изключване в потребителския интерфейс на <ph name="PRODUCT_OS_NAME" /> ще бъдат заменени с такива за рестартиране. Ако устройството бъде изключено чрез бутона за захранване, то няма да се рестартира автоматично дори правилото да е активирано.</translation> <translation id="9152473318295429890">Активиране на контекстуалните предложения за сродни уеб страници</translation> +<translation id="9153446010242995516">Трайно възстановяване на целевата версия на операционната система, ако текущата версия е по-нова от нея. При възможност прехвърляне на конфигурацията на ниво устройство (включително идентификационните данни за мрежите) по време на процеса. Освен това извършване на Powerwash с пълен обхват дори ако възстановяването на данните не е възможно (поради това, че не се поддържа от целевата версия, или заради промяна, пораждаща обратна несъвместимост). +Поддържа се за <ph name="PRODUCT_OS_NAME" /> 75 и по-нови версии. При по-старите клиентски програми тази стойност означава, че възстановяването е деактивирано.</translation> <translation id="9158929520101169054">Разрешаване на централизирания вход в браузъра</translation> <translation id="9159126470527871268">Известяване на потребителите, че трябва да стартират отново <ph name="PRODUCT_NAME" /> или да рестартират <ph name="PRODUCT_OS_NAME" />, за да се приложи изчакваща актуализация.
diff --git a/components/policy/resources/policy_templates_bn.xtb b/components/policy/resources/policy_templates_bn.xtb index 66c8e587..697438b9 100644 --- a/components/policy/resources/policy_templates_bn.xtb +++ b/components/policy/resources/policy_templates_bn.xtb
@@ -142,15 +142,6 @@ যদি নীতিটি সেট ফলসে সেট করা থাকে, তাহলে dev স্যুইচের অবস্থা রিপোর্ট করা হবে না৷</translation> <translation id="1160479894929412407">QUIC প্রোটোকলের অনুমতি দিন</translation> <translation id="1160939557934457296">নিরাপদ ব্রাউজিংয়ের সতর্কতা পৃষ্ঠার থেকে এগিয়ে যাওয়া বন্ধ করুন</translation> -<translation id="1171342272070128466">ডক করা ম্যাগনিফায়ার অ্যাক্সেসিবিলিটি ফিচার চালু করে। - - এই নীতি ট্রু হিসেবে সেট করা থাকলে, ডক করা ম্যাগনিফায়ার সবসময় চালু থাকে। - - এই নীতি ফলস হিসেবে সেট করা থাকলে, ডক করা ম্যাগনিফায়ার সবসময় বন্ধ থাকে। - - আপনি এই নীতি সেট করলে, ব্যবহারকারী তা পরিবর্তন বা ওভাররাইড করতে পারেন না। - - এই নীতি সেট করা না থাকলে, ডক করা ম্যাগনিফায়ার শুরুতে বন্ধ থাকলেও ব্যবহারকারী যেকোনও সময় সেটি চালু করে নিতে পারেন।</translation> <translation id="1189817621108632689">যে সমস্ত সাইটকে ছবি দেখানোর অনুমতি দিতে চান না সেগুলির ইউআরএলের একটি তালিকা সেট করতে দেয়। এই নীতিটি যদি এখন সেট করা না হয় এবং 'DefaultImagesSetting' নীতিটি যদি সেট করা থাকে, তাহলে সেই অনুযায়ী সমস্ত সাইটের জন্য এই নীতির গ্লোবাল ডিফল্ট সেটিং নির্ধারণ করা হবে। তা না হলে, ব্যবহারকারীর ব্যক্তিগত কনফিগারেশন অনুযায়ী এটি সেট করা হবে। @@ -1127,6 +1118,15 @@ যখন নীতি সেট না করা থাকে, আরও-নির্দিষ্ট নীতিগুলির অ্যাক্টিভিটি অপ্রভাবিত থাকে।</translation> <translation id="2987155890997901449">ARC সক্ষম করে</translation> <translation id="2987227569419001736">ওয়েব ব্লুটুথ এপিআই-এর ব্যবহার নিয়ন্ত্রণ করে</translation> +<translation id="2990018289267778247">এই নীতি ট্রু হিসেবে সেট করা থাকলে, অ্যাক্সেসিবিলিটি বিকল্প যেকোনও সময়ে সিস্টেম ট্রে মেনুতে দেখা যায়। + + এই নীতি ফলস হিসেবে সেট করা থাকলে, অ্যাক্সেসিবিলিটি বিকল্প কখনই সিস্টেম ট্রে মেনুতে দেখা যায় না। + + আপনি এই নীতি সেট করলে, ব্যবহারকারী তা পরিবর্তন বা ওভাররাইড করতে পারবেন না। + + এই নীতি সেট করা না থাকলে, অ্যাক্সেসিবিলিটি বিকল্প সিস্টেম ট্রে মেনুতে দেখা যাবে না, কিন্তু ব্যবহারকারী অ্যাক্সেসিবিলিটি বিকল্পের সাহায্যে সেটিংস পৃষ্ঠায় দেখা যাবে কিনা তা নির্ধারণ করতে পারবে। + + অ্যাক্সেসিবিলিটি ফিচার চালু থাকলে (অন্য যেকোনও উপায়ে যেমন কোনও একটি কী সমন্বয়ের সাহায্যে), অ্যাক্সেসিবিলিটি বিকল্প সিস্টেম ট্রে মেনুতে যেকোনও সময়ে দেখা যাবে।</translation> <translation id="3011301228198307065"><ph name="PRODUCT_NAME" />-এ ডিফল্ট হোমপেজ ইউআরএল কনফিগার করে এবং ব্যবহারকারীকে সেটি পরিবর্তন করতে বাধা দেয়। 'হোম' বোতাম ব্যবহার করে যে পৃষ্ঠা খোলা যায় সেটিকে হোমপেজ বলা হয়। চালু হওয়ার সময় যে পৃষ্ঠা খোলে সেটি RestoreOnStartup নীতির মাধ্যমে নিয়ন্ত্রিত হয়। @@ -1448,6 +1448,7 @@ ডেস্কটপে মেশিন স্কোপ ক্লাউড পলিসি এনরোলমেন্টে এই নীতি ব্যবহার করা হয় এবং রেজিস্ট্রি, Windows-এ GPO, Mac-এ plist এবং Linux-এ JSON পলিসি ফাইল দ্বারা সেট করা যেতে পারে।</translation> <translation id="3660562134618097814">লগ-ইন করার সময় SAML IdP কুকি স্থানান্তর করে</translation> <translation id="3701121231485832347"><ph name="MS_AD_NAME" /> পরিচালিত <ph name="PRODUCT_OS_NAME" /> ডিভাইসের সেটিংস নিয়ন্ত্রণ করে।</translation> +<translation id="3702518095257671450">দূর থেকে যাচাইকরণ</translation> <translation id="3702647575225525306"><ph name="POLICY_NAME" /> (একক-লাইনের ক্ষেত্রটি বন্ধ করা হয়েছে এবং ভবিষ্যতে এটি সরানো হবে। অনুগ্রহ করে নিচের একাধিক লাইনের টেক্সট বক্সটি ব্যবহার করা শুরু করুন।)</translation> <translation id="3709266154059827597">এক্সটেনশন ইনস্টলেশন কালোতালিকা কনফিগার করুন</translation> <translation id="3711895659073496551">সাসপেন্ড</translation> @@ -1560,11 +1561,6 @@ নীতিটি ফলসে সেট করা থাকলে, সেশনের তথ্য প্রতিবেদন করা হবে না। ট্রুতে সেট থাকলে বা সেট না করে রাখা হলে, কিয়স্ক সেশনের তথ্য প্রতিবেদন করা হবে।</translation> -<translation id="3852924591079583104"> - এই নীতি ArcSession-এ সেট করা থাকলে এবং Android চালু হয়ে গেলে, ব্যবহারকারী সাইন-আউট করার পরে ডিভাইসকে রিবুট করতে বাধ্য করে। - 'সবসময়' হিসেবে সেট করা থাকলে, ব্যবহারকারী প্রত্যেকবার সাইন-আউট করার পরে ডিভাইসকে রিবুট করতে বাধ্য করে। - সেট করা না থাকলে, এর কোনও প্রভাব থাকে না এবং ব্যবহারকারী সাইন-আউট করার পরে ডিভাইস রিবুট হয় না। 'কখনই নয়' হিসেবে সেট করা থাকলেও একই ঘটনা ঘটে। - </translation> <translation id="3858658082795336534">ডিফল্ট ডুপ্লেক্স মোডে প্রিন্টিং</translation> <translation id="3859780406608282662"><ph name="PRODUCT_OS_NAME" />-এ বৈইমেজ্য সীড আনার সময়ে একটি প্যারামিটার যোগ করুন৷ @@ -1847,6 +1843,15 @@ যদি 'DefaultSearchProviderEnabled' নীতিটি চালু করা থাকে তাহলেই কেবল এই নীতিটি মেনে চলা হয়৷</translation> <translation id="4285674129118156176">অনুমোদিত ব্যবহারকারীদের ARC ব্যবহার করতে দিন</translation> +<translation id="4289903996435140853">যেসব ইউএসবি ডিভাইসের নির্দিষ্ট বিক্রেতা ও প্রোডাক্ট আইডি আছে তাদের অ্যাক্সেস করতে কোন সাইটগুলিকে অটোমেটিক অনুমতি দেওয়া হবে তা উল্লেখ করা রয়েছে এমন ইউআরএলগুলির একটি তালিকা সেট করতে আপনাকে অনুমতি দেয়। নীতিটি সঠিক হতে হলে তালিকার প্রতিটি আইটেমে ডিভাইস এবং ইউআরএল অবশ্যই থাকতে হবে। ডিভাইসে প্রতিটি আইটেমে বিক্রেতা আইডি এবং প্রোডাক্ট আইডি থাকতে পারে। একটি ব্যতিক্রম ছাড়া, উল্লেখ করা হয়নি এমন সব আইডি ওয়াইল্ডকার্ড হিসেবে বিবেচিত হয়। ব্যতিক্রমটি হল, প্রোডাক্ট আইডি কখনও বিক্রেতা আইডি ছাড়া উল্লেখ করা যাবে না। তা করা হলে, এই নীতি সঠিক থাকে না এবং নীতির ভুল মান উপেক্ষা করা হয়। + + ইউএসবি অনুমতি মডেল, ইউএসবি ডিভাইস অ্যাক্সেস করতে অনুরোধ করা ইউআরএল-কে অনুমতি দেওয়ার জন্য শীর্ষ স্তরের ফ্রেম সাইট ("এম্বেডিং ইউআরএল")-এর ইউআরএল এবং অনুরোধ করছে যে সাইট সেটির ইউআরএল ("ইউআরএল অনুরোধ") ব্যবহার করে। অনুরোধকারী সাইট কোনও একটি iframe লোড করা হলে, অনুরোধকারী ইউআরএলটি এম্বেডেড ইউআরএলের থেকে আলাদা হতে পারে। অতএব, "ইউআরএল" ফিল্ডে সব থেকে বেশি দুটি ইউআরএল স্ট্রিং থাকতে পারে যা অনুরোধ এবং এম্বেডিং ইউআরএল নির্দিষ্ট করতে কমা দ্বারা সীমিত থাকবে। যদি শুধুমাত্র একটি ইউআরএল নির্দিষ্ট থাকে, তাহলে সম্পর্কিত ইউএসবি ডিভাইসে অ্যাক্সেস তখনই অনুমোদিত হবে যখন এম্বেড করা স্ট্যাটাস নির্বিশেষে অনুরোধ করা ইউআরএলটি এই ইউআরএলের সাথে মিলবে। "ইউআরএল"-এর ইউআরএলটি অবশ্যই সঠিক ইউআরএল হতে হবে, অন্যথায় নীতি উপেক্ষা করা হবে। + + নীতিটি সেট না করা থাকলে, গ্লোবাল ডিফল্ট মানটি 'DefaultWebUsbGuardSetting' নীতি সেট করা থাকলে বা অন্যথায় ব্যবহারকারীর ব্যক্তিগত কনফিগারেশন থেকে সব সাইটের জন্য ব্যবহার করা যাবে। + + এই নীতির ইউআরএল প্যাটার্ন WebUsbBlockedForUrls-এর মাধ্যমে সেট করা প্যাটার্নের থেকে আলাদা হতে হবে। যদি দ্বন্দ্ব থাকে, তবে এই নীতিটি WebUsbBlockedForUrls এবং WebUsbAskForUrls-এ অগ্রাধিকার পাবে। + + এই নীতি এবং DeviceWebUsbAllowDevicesForUrls নীতির মান একসাথে মার্জ করা হয়েছে।</translation> <translation id="4298509794364745131"><ph name="PRODUCT_OS_NAME" />-এর লক স্ক্রিনে নোট লেখার অ্যাপ হিসাবে চালু করা যেতে পারে এমন অ্যাপের তালিকা নির্দিষ্ট করে। পছন্দসই নোট লেখার অ্যাপটি যদি লক স্ক্রিনে সক্রিয় করা থাকে তাহলে লক স্ক্রিনে সেটি চালু করার জন্য UI উপাদান থাকবে। @@ -1998,6 +2003,7 @@ <translation id="4639407427807680016">কালোতালিকা থেকে বাদ দিতে হবে এমন নেটিভ বার্তাপ্রেরণ হোস্টগুলির নাম</translation> <translation id="4650759511838826572">ইউআরএল প্রোটোকল স্কিমগুলি বন্ধ করুন</translation> <translation id="465099050592230505">এন্টারপ্রাইজ ওয়েব স্টোর ইউআরএল (থামানো হয়েছে)</translation> +<translation id="4661889655253181651">কোনও নির্দিষ্ট ধরনের কন্টেন্ট (যেমন কুকিজ, ছবি অথবা জাভাস্ক্রিপ্ট) কীভাবে ব্যবহার করা হয়, তা ম্যানেজ করতে কন্টেন্ট সেটিংসের থেকে অনুমোদন পাওয়া যায়।</translation> <translation id="4665897631924472251">এক্সটেনশন পরিচালনা সেটিংস</translation> <translation id="4668325077104657568">ডিফল্ট চিত্রসমূহের সেটিং</translation> <translation id="4670865688564083639">ন্যূনতম:</translation> @@ -2043,6 +2049,11 @@ এই সাজেশনগুলি Google সার্ভার থেকে আনা হয়। যদি এই সেটিং ফলসে সেট করা হয়, সাজেশনগুলি আনা হবে না বা প্রদর্শিত হবে না।</translation> +<translation id="4759650396863318477">এই সেটিংয়ে আপনি মিলিসেকেন্ডের হিসেবে এমন একটি সময়সীমা সেট করতে পারেন, যে সময়সীমা ধরে ব্যবহারকারীকে জানানো হবে যে <ph name="PRODUCT_NAME" /> রিলঞ্চ করতে হবে অথবা বাকি থাকা আপডেট প্রয়োগ করার জন্য <ph name="PRODUCT_OS_NAME" /> ডিভাইস রিস্টার্ট করতে হবে। + + এই সময়টি ধরে ব্যবহারকারীকে আপডেটটির প্রয়োজনীয়তা সম্পর্কে বারবার জানানো হবে। <ph name="RELAUNCH_HEADS_UP_PERIOD_POLICY_NAME" /> নীতি অনুযায়ী <ph name="PRODUCT_OS_NAME" /> ডিভাইসের জন্য রিস্টার্ট সংক্রান্ত বিজ্ঞপ্তি সিস্টেম ট্রে-তে দেখা যায়। <ph name="PRODUCT_NAME" /> ব্রাউজারের ক্ষেত্রে, বিজ্ঞপ্তির সময়সীমার এক তৃতীয়াংশ পেরিয়ে গেলেই অ্যাপ মেনুটি পরিবর্তিত হয়ে রিলঞ্চ করার বিজ্ঞপ্তি দেয়। সেট করা সময়ের দুই-তৃতীয়াংশ পেরিয়ে গেলে এই বিজ্ঞপ্তিটি প্রথমে একবার রঙ বদলায় এবং সময় শেষ হলে আরও একবার এটির রঙ পরিবর্তন হয়। <ph name="RELAUNCH_NOTIFICATION_POLICY_NAME" /> নীতির মাধ্যমে যে অতিরিক্ত বিজ্ঞপ্তি চালু হয় তা একই সময়সূচী মেনে চলে। + + সেট না করা হলে, <ph name="PRODUCT_OS_NAME" /> ডিভাইসের জন্য ৩৪৫৬০০০০০ মিলিসেকেন্ড (চার দিন) ও <ph name="PRODUCT_NAME" />-এর জন্য ৬০৪৮০০০০০ মিলিসেকেন্ড (এক সপ্তাহ) ডিফল্ট সময়সীমা রাখা হয়।</translation> <translation id="4788252609789586009"><ph name="PRODUCT_NAME" />-এর AutoFill বৈশিষ্ট্যটি চালু করে এবং ব্যবহারকারীদের আগে থেকে থাকা তথ্য ব্যবহার করে ক্রেডিট কার্ডের তথ্য ওয়েব ফর্মে নিজে থেকে পূরণ করার অনুমতি দেয়। যদি আপনি এই সেটিং বন্ধ করেন তবে Autofill ক্রেডিট কার্ডের তথ্যগুলি প্রস্তাবিত করবে না বা এটি অতিরিক্ত ক্রেডিট কার্ডের তথ্য সেভ করবে না যা ওয়েব ব্রাউজ করার সময় ব্যবহারকারী জমা দিতে পারেন। @@ -2253,6 +2264,15 @@ এই নীতিটি সেট না করা থাকলে গ্লোবাল ডিফল্ট ভ্যালুটি হয় "ডিফল্ট নোটিফিকেশন সেটিং" নীতি (যদি এটি সেট করা থাকে) অথবা ব্যবহারকারীর ব্যক্তিগত কনফিগারেশন থেকে সব সাইটের জন্য ব্যবহৃত হবে।</translation> <translation id="5213038356678567351">এমন ওয়েবসাইট যেগুলি কখনও অন্য ব্রাউজারে খোলার অনুরোধ করে না।</translation> <translation id="5219844027738217407">Android অ্যাপ্লিকেশানগুলির জন্য, এই নীতিটি কেবলমাত্র মাইক্রোফোনকে প্রভাবিত করে। এই নীতিটি সত্যতে সেট করা থাকলে, কোনো ব্যতিক্রম ছাড়াই সব Android অ্যাপ্লিকেশানগুলির জন্য মাইক্রোফোন মিউট করা থাকে।</translation> +<translation id="5221394278852982313">যেসব ইউএসবি ডিভাইসের নির্দিষ্ট বিক্রেতা ও প্রোডাক্ট আইডি আছে তাদের অ্যাক্সেস করতে কোন সাইটগুলিকে অটোমেটিক অনুমতি দেওয়া হবে তা উল্লেখ করা রয়েছে এমন ইউআরএলগুলির একটি তালিকা সেট করতে আপনাকে অনুমতি দেয়। নীতিটি সঠিক হতে হলে তালিকার প্রতিটি আইটেমে ডিভাইস এবং ইউআরএল অবশ্যই থাকতে হবে। ডিভাইসে প্রতিটি আইটেমে বিক্রেতা আইডি এবং প্রোডাক্ট আইডি থাকতে পারে। একটি ব্যতিক্রম ছাড়া, উল্লেখ করা হয়নি এমন সব আইডি ওয়াইল্ডকার্ড হিসেবে বিবেচিত হয়। ব্যতিক্রমটি হল, প্রোডাক্ট আইডি কখনও বিক্রেতা আইডি ছাড়া উল্লেখ করা যাবে না। তা করা হলে, এই নীতি সঠিক থাকে না এবং নীতির ভুল মান উপেক্ষা করা হয়। + + ইউএসবি অনুমতি মডেল, ইউএসবি ডিভাইস অ্যাক্সেস করতে অনুরোধ করা ইউআরএল-কে অনুমতি দেওয়ার জন্য শীর্ষ স্তরের ফ্রেম সাইট ("এম্বেডিং ইউআরএল")-এর ইউআরএল এবং অনুরোধ করছে যে সাইট সেটির ইউআরএল ("ইউআরএল অনুরোধ") ব্যবহার করে। অনুরোধকারী সাইটে কোনও একটি iframe লোড করা হলে, অনুরোধকারী ইউআরএলটি এম্বেডেড ইউআরএলের থেকে আলাদা হতে পারে। অতএব, "ইউআরএল" ফিল্ডে সব থেকে বেশি দুটি ইউআরএল স্ট্রিং থাকতে পারে যা অনুরোধ এবং এম্বেডিং ইউআরএল নির্দিষ্ট করতে কমা দ্বারা সীমিত থাকবে। যদি শুধুমাত্র একটি ইউআরএল নির্দিষ্ট থাকে, তাহলে সম্পর্কিত ইউএসবি ডিভাইসে অ্যাক্সেস তখনই অনুমোদিত হবে যখন এম্বেড করা স্ট্যাটাস নির্বিশেষে অনুরোধ করা ইউআরএলটি এই ইউআরএলের সাথে মিলবে। "ইউআরএল"-এর ইউআরএলটি অবশ্যই সঠিক ইউআরএল হতে হবে, অন্যথায় নীতি উপেক্ষা করা হবে। + + নীতিটি সেট না করা থাকলে, গ্লোবাল ডিফল্ট মানটি 'DefaultWebUsbGuardSetting' নীতি সেট করা থাকলে বা অন্যথায় ব্যবহারকারীর ব্যক্তিগত কনফিগারেশন থেকে সব সাইটের জন্য ব্যবহার করা যাবে। + + এই নীতির ইউআরএল প্যাটার্ন WebUsbBlockedForUrls-এর মাধ্যমে সেট করা প্যাটার্নের থেকে আলাদা হতে হবে। যদি দ্বন্দ্ব থাকে, তবে এই নীতিটি WebUsbBlockedForUrls এবং WebUsbAskForUrls-এ অগ্রাধিকার পাবে। + + এই নীতির এবং DeviceWebUsbAllowDevicesForUrls নীতির মান একসাথে মার্জ করা হয়েছে।</translation> <translation id="5228316810085661003">ডিভাইস-স্থানীয় অ্যাকাউন্টে নিজে থেকে লগ-ইনে বিলম্ব। যদি |DeviceLocalAccountAutoLoginId| নীতিটি সেট না করা থাকে, তাহলে এই নীতি কোনও প্রভাব ফেলবে না। অন্যথায়: @@ -2993,6 +3013,21 @@ এই নীতি "ব্যবহারকারীকে সার্টিফিকেট পরিচালনা করার অনুমতি দেবেন না" হিসেবে সেট করা থাকলে, ব্যবহারকারী সার্টিফিকেট দেখতে পেলেও পরিচালনা করতে পারবেন না।</translation> <translation id="6573305661369899995">URL বিধিনিষেধগুলির একটি বাহ্যিক উৎস সেট করুন</translation> +<translation id="6583851521569686409">প্রিন্টারের একটি তালিকা কনফিগার করে। + + এই নীতির সাহায্যে অ্যাডমিনিস্ট্রেটররা ব্যবহারকারীদের জন্য প্রিন্টার কনফিগার + করেন। + + সহজে প্রিন্টার বেছে নিতে কাস্টমাইজ করা যায় এমন <ph name="PRINTER_DISPLAY_NAME" /> ও <ph name="PRINTER_DESCRIPTION" /> ফ্রি-ফর্ম স্ট্রিং দুটি ব্যবহার করা হয়। <ph name="PRINTER_MANUFACTURER" /> ও <ph name="PRINTER_MODEL" />-এর সাহায্যে ব্যবহারকারীরা সহজেই কোনও প্রিন্টার চিনে নিতে পারেন। এই দুটি থেকে প্রিন্টারের প্রস্তুতকারক এবং মডেল নম্বর দেখা যায়। কোনও ক্লায়েন্ট কম্পিউটার থেকে অ্যাক্সেস করা যায় এমন একটি ঠিকানা <ph name="PRINTER_URI" />-এ উল্লেখ করতে হবে। সেটির মধ্যে <ph name="URI_SCHEME" />, <ph name="URI_PORT" /> ও <ph name="URI_QUEUE" /> অন্তর্ভুক্ত থাকে। ঐচ্ছিকভাবে <ph name="PRINTER_UUID" /> লেখা যেতে পারে। উল্লেখ করা থাকলে, এটি <ph name="ZEROCONF_DISCOVERY" /> প্রিন্টারের ডুপ্লিকেট সরানোর জন্য ব্যবহার করা হয়। + + <ph name="PRINTER_EFFECTIVE_MODEL" />-এ প্রিন্টারের নাম থাকতে হবে অথবা <ph name="PRINTER_AUTOCONF" />-কে ট্রু হিসেবে সেট করতে হবে। উভয় প্রপার্টি আছে বা কোনওটিই নেই এমন প্রিন্টার অগ্রাহ্য করা হবে। + + কোনও প্রিন্টার প্রথমবার ব্যবহার করার সময় সেটির সেট-আপ সম্পূর্ণ হয়। প্রিন্টার ব্যবহার না করা পর্যন্ত PPD ডাউনলোড হয় না। এর পরে, প্রায়ই ব্যবহার করা হয় এমন PPD ক্যাশে করে রাখা হয়। + + ব্যবহারকারীরা ব্যক্তিগত ডিভাইসে প্রিন্টার কনফিগার করতে পারবেন কিনা তার উপর এই নীতির কোনও প্রভাব পড়ে না। ব্যবহারকারী প্রিন্টারের যে কনফিগারেশন করেন সেটির পরিপূরক হিসেবে এই নীতি কাজ করে। + + অ্যাক্টিভ ডিরেক্টরি দ্বারা ম্যানেজ করা ডিভাইসের ক্ষেত্রে এই নীতি, অ্যাক্টিভ ডিরেক্টরি মেশিনের নাম বা সেটির একটি সাবস্ট্রিং <ph name="MACHINE_NAME_VARIABLE" />-এ অন্তর্ভুক্ত করতে দেয়। যেমন মেশিনের নাম <ph name="MACHINE_NAME_EXAMPLE" /> হলে, নামের ষষ্ঠ স্থানের পর থেকে শুরু করে ৪টি অক্ষর অর্থাৎ <ph name="MACHINE_NAME_PART_EXAMPLE" /> দিয়ে <ph name="MACHINE_NAME_VARIABLE_EXAMPLE" /> প্রতিস্থাপিত হয়ে যাবে। মনে রাখবেন যে স্থান শূন্য থেকে গণনা করা শুরু হয়। + </translation> <translation id="6598235178374410284">অবতার ছবি ব্যবহার করুন</translation> <translation id="6603004149426829878">সময় অঞ্চল নির্ধারণের সময়ে উপলব্ধ যেকোনও লোকেশন সঙ্কেত সবসময় সার্ভারে পাঠান</translation> <translation id="6628120204569232711">স্টোরেজের স্ট্যাটাসের বিষয়ে জানান</translation> @@ -3451,7 +3486,6 @@ যদি নীতিটি 'RemoveLRUIfDormant'এ সেট করা হয় তাহলে, পর্যাপ্ত মুক্ত স্থান না হওয়া পর্যন্ত স্বয়ংক্রিয় ক্লিন-আপ আচরণ 3 মাসে একবারও লগ ইন করেনি এমন ব্যবহারকারীদেরকে অন্তত-সম্প্রতি লগ ইন ক্রমে সরানোর চালিয়ে যাবে। যদি নীতিটি সেট না করা হয় তাহলে, স্বয়ংক্রিয় ক্লিন-আপ ডিফল্ট বিল্ট ইন কৌশল ব্যবহার করবে। বর্তমানে, এটি হল 'RemoveLRUIfDormant' কৌশল।</translation> -<translation id="7334274148831027933">ডক করা ম্যাগনিফায়ার চালু করুন</translation> <translation id="7336785017449297672">ঘড়ি ও টাইম জোনের সেটিংস নিয়ন্ত্রণ করে।</translation> <translation id="7336878834592315572">সেশনের স্থিতিকাল পর্যন্ত কুকিজ রাখুন</translation> <translation id="7339315111520512972">ব্রাউজার প্রসেসে নেটওয়ার্কিং কোড চালাতে বাধ্য করা</translation> @@ -4337,6 +4371,8 @@ <translation id="915194831143859291">এই নীতিটি মিথ্যাতে সেট করা হলে বা কনফিগার করা না থাকলে, <ph name="PRODUCT_OS_NAME" /> ব্যবহারকারীকে ডিভাইস শাট ডাউন করার অনুমতি দেবে। নীতিটি সত্যতে সেট করা থাকলে ব্যবহারকারী ডিভাইস শাট ডাউন করলে <ph name="PRODUCT_OS_NAME" /> রিবুট করার প্রক্রিয়া শুরু করবে। <ph name="PRODUCT_OS_NAME" /> রিবুট করার বোতাম দিয়ে UI-তে শাটডাউন বোতামগুলির সব ঘটনাকে প্রতিস্থাপন করবে। ব্যবহারকারী পাওয়ার বোতাম ব্যবহার করে ডিভাইসটি শাট ডাউন করলে, এটি অটোমেটিক রিবুট করা হবে না, এমনকি নীতিটি চালু করা থাকলেও।</translation> <translation id="9152473318295429890">সংশ্লিষ্ট ওয়েব পৃষ্ঠার প্রাসঙ্গিক সাজেশনগুলি চালু করুন</translation> +<translation id="9153446010242995516">OS ভার্সন টার্গেটের থেকে নতুন হলে টার্গেট ভার্সনে রোলব্যাক করুন এবং সেখানেই থাকুন। সম্ভব হলে, রোলব্যাক প্রসেসের সময় ডিভাইস-লেভেল কনফিগারেশন (নেটওয়ার্ক ক্রেডেনশিয়াল সহ) বহন করুন, কিন্তু ডেটা ফিরিয়ে আনা সম্ভব না হলেও (টার্গেট ভার্সন ডেটা ফিরিয়ে আনা সাপোর্ট করে না সেই কারণে অথবা পুরনো ভার্সনের সাথে বেমানান পরিবর্তনের জন্য) সম্পূর্ণ পাওয়ারওয়াশ সহ রোলব্যাক করুন। + <ph name="PRODUCT_OS_NAME" /> ভার্সন 75 বা উন্নত ভার্সনে ব্যবহার করা হয়। পুরানো ক্লায়েন্টের জন্য এই মানের অর্থ রোলব্যাক বন্ধ করা আছে।</translation> <translation id="9158929520101169054">ব্রাউজারের মধ্যে একাধিক সাইন-ইনের অনুমতি দিন</translation> <translation id="9159126470527871268">বাকি থাকা আপডেট প্রয়োগ করার জন্য অবশ্যই <ph name="PRODUCT_NAME" /> রিলঞ্চ করতে বা <ph name="PRODUCT_OS_NAME" /> রিস্টার্ট করতে হবে তা ব্যবহারকারীদের জানান।
diff --git a/components/policy/resources/policy_templates_ca.xtb b/components/policy/resources/policy_templates_ca.xtb index 1d32a6a9..686c48a 100644 --- a/components/policy/resources/policy_templates_ca.xtb +++ b/components/policy/resources/policy_templates_ca.xtb
@@ -132,15 +132,6 @@ Si la política s'estableix com a falsa, no s'informarà de l'estat del botó per a desenvolupadors.</translation> <translation id="1160479894929412407">Permet el protocol QUIC</translation> <translation id="1160939557934457296">Desactivació de l'accés des de la pàgina d'advertiment de Navegació segura</translation> -<translation id="1171342272070128466">Activa la funció d'accessibilitat de la lupa acoblada. - - Si aquesta política s'estableix en "true", la lupa acoblada sempre estarà activada. - - Si aquesta política s'estableix en "false", la lupa acoblada sempre estarà desactivada. - - Si estableixes aquesta política, els usuaris no la podran canviar ni substituir. - - Si aquesta política no s'estableix, la lupa acoblada estarà desactivada des d'un principi, però l'usuari la podrà activar en qualsevol moment.</translation> <translation id="1189817621108632689">Permet definir una llista de patrons d'URL que especifiquin llocs web que no poden mostrar imatges. Si aquesta política es deixa sense establir, s'utilitzarà per a tots els llocs web el valor global predeterminat indicat a la política DefaultImagesSetting (si s'ha definit) o el valor personalitzat que hagi definit l'usuari. @@ -1009,6 +1000,15 @@ El valor de la política s'ha d'indicar en mil·lisegons i es limita perquè sigui inferior o igual al retard de desactivació (si s'ha definit) i al retard d'inactivitat.</translation> <translation id="2987155890997901449">Activa ARC</translation> <translation id="2987227569419001736">Controla l'ús de l'API Web Bluetooth</translation> +<translation id="2990018289267778247">Si aquesta política s'estableix en "true", les opcions d'accessibilitat sempre es mostraran al menú de la safata del sistema. + + Si aquesta política s'estableix en "false", les opcions d'accessibilitat no es mostraran mai al menú de la safata del sistema. + + Si estableixes aquesta política, els usuaris no la podran canviar ni substituir. + + Si aquesta política es deixa sense establir, les opcions d'accessibilitat no es mostraran al menú de la safata del sistema, però l'usuari podrà fer que es mostrin des de la pàgina Configuració. + + Si s'activen les funcions d'accessibilitat (per altres mitjans, com ara una combinació de claus), les opcions d'accessibilitat sempre es mostraran al menú de la safata del sistema.</translation> <translation id="3011301228198307065">Configura l'URL de la pàgina d'inici predeterminada a <ph name="PRODUCT_NAME" /> i impedeix que els usuaris el canviïn. La pàgina d'inici és la que s'obre amb el botó Inici. Les pàgines que s'obren en iniciar el navegador les controlen les polítiques RestoreOnStartup. @@ -1294,6 +1294,7 @@ La inscripció a polítiques al núvol segons l'abast de l'equip utilitza aquesta política als ordinadors. La política es pot definir amb Registry o GPO a Windows, plist a Mac i el fitxer de polítiques JSON a Linux.</translation> <translation id="3660562134618097814">Transfereix les galetes del proveïdor d'identitat SAML durant l'inici de sessió</translation> <translation id="3701121231485832347">Controla la configuració específica dels dispositius <ph name="PRODUCT_OS_NAME" /> gestionats per <ph name="MS_AD_NAME" />.</translation> +<translation id="3702518095257671450">Testimoni remot</translation> <translation id="3702647575225525306"><ph name="POLICY_NAME" /> El camp d'una sola línia ja no està disponible i se suprimirà en el futur. Comença a utilitzar el quadre de text amb diverses línies que hi ha més avall.</translation> <translation id="3709266154059827597">Configura la llista negra d'instal·lació d'extensions</translation> <translation id="3711895659073496551">Suspèn</translation> @@ -1398,11 +1399,6 @@ Si la política s'estableix en "false", no s'ofereix informació de la sessió. Si s'estableix en "true" o no s'hi estableix cap valor, s'ofereix informació de la sessió.</translation> -<translation id="3852924591079583104"> - Si aquesta política s'estableix en "ArcSession", obliga el dispositiu a reiniciar-se quan l'usuari tanqui la sessió si Android s'ha iniciat. - Si s'estableix en "Sempre", obliga el dispositiu a reiniciar-se cada vegada que l'usuari tanqui la sessió. - Si es deixa sense establir, no té cap efecte i no obliga el dispositiu a reiniciar-se quan l'usuari tanqui la sessió. Funciona de la mateixa manera si s'estableix en "Mai". - </translation> <translation id="3858658082795336534">Mode d'impressió a doble cara predeterminat</translation> <translation id="3859780406608282662">Afegeix un paràmetre a l'obtenció de la propagació de variacions a <ph name="PRODUCT_OS_NAME" />. @@ -1662,6 +1658,15 @@ Aquesta política només es respecta si la política "DefaultSearchProviderEnabled" està activada.</translation> <translation id="4285674129118156176">Permet que els usuaris no afiliats facin servir ARC</translation> +<translation id="4289903996435140853">Permet definir una llista d'URL que especifiquin quins llocs web obtindran permís automàticament per accedir a un dispositiu USB amb els identificadors de proveïdor i producte que s'indiquin. Perquè la política sigui vàlida, tots els elements de la llista han d'incloure tant dispositius com URL. A més, cada dispositiu pot incloure un camp per a l'identificador de proveïdor i per al de producte. Els identificadors omesos es tracten com un comodí, amb excepció dels identificadors de producte, que no es poden especificar si no hi ha un identificador de proveïdor. En cas contrari, la política no serà vàlida i s'ignorarà. + + El model de permisos per a USB utilitza l'URL del lloc web que sol·licita permís ("URL sol·licitant") i l'URL del lloc web de marcs de nivell superior ("URL d'inserció") per concedir permís a l'URL sol·licitant per accedir al dispositiu USB. Si el lloc web que sol·licita permís es carrega en un iframe, l'URL sol·licitant pot ser diferent de l'URL d'inserció. Per tant, el camp urls pot incloure fins a dues cadenes d'URL delimitades per una coma a fi d'especificar l'URL sol·licitant i el d'inserció, respectivament. Si només se n'especifica un, l'accés als dispositius USB corresponents es concedeix quan l'URL del lloc web sol·licitant coincideixi amb aquest URL independentment de l'estat d'inserció. Els URL del camp urls han de ser vàlids. Si no, la política s'ignorarà. + + Si aquesta política es deixa sense establir, s'utilitzarà el valor predeterminat general per a tots els llocs web, ja sigui de la política DefaultWebUsbGuardSetting si està establerta o de la configuració personal de l'usuari si no ho està. + + Els patrons d'URL d'aquesta política no poden entrar en conflicte amb els configurats mitjançant WebUsbBlockedForUrls. Si hi ha un conflicte, aquesta política té prioritat sobre WebUsbBlockedForUrls i WebUsbAskForUrls. + + Els valors d'aquesta política i els de la política WebUsbAllowDevicesForUrls es fusionen.</translation> <translation id="4298509794364745131">Indica una llista d'aplicacions que es poden activar com a aplicacions per prendre notes a la pantalla de bloqueig de <ph name="PRODUCT_OS_NAME" />. Si l'aplicació preferida per prendre notes està activada a la pantalla de bloqueig, en aquesta pantalla s'hi mostrarà un element d'IU per iniciar-la. @@ -1796,6 +1801,7 @@ <translation id="4639407427807680016">Noms dels amfitrions de missatgeria nativa que no s'han d'incloure a la llista negra</translation> <translation id="4650759511838826572">Desactiva els esquemes del protocol URL</translation> <translation id="465099050592230505">URL de la botiga web de l'empresa (obsolet)</translation> +<translation id="4661889655253181651">A la configuració del contingut pots especificar la manera com es tracta el contingut d'un tipus determinat (per exemple, les galetes, les imatges o JavaScript).</translation> <translation id="4665897631924472251">Configuració de la gestió d'extensions</translation> <translation id="4668325077104657568">Configuració predeterminada de les imatges</translation> <translation id="4670865688564083639">Mínim:</translation> @@ -1840,6 +1846,11 @@ Aquests suggeriments s'obtenen dels servidors de Google de manera remota. Si aquesta opció de configuració s'estableix en "false", no s'obtindran ni es mostraran suggeriments.</translation> +<translation id="4759650396863318477">Et permet establir el període de temps, en mil·lisegons, durant el qual es notifica als usuaris que <ph name="PRODUCT_NAME" /> o <ph name="PRODUCT_OS_NAME" /> s'han de reiniciar per aplicar una actualització pendent. + + Durant aquest període de temps, s'informa l'usuari repetidament de la necessitat de dur a terme una actualització. En dispositius amb <ph name="PRODUCT_OS_NAME" />, es mostra una notificació de reinici a la safata del sistema de conformitat amb la política <ph name="RELAUNCH_HEADS_UP_PERIOD_POLICY_NAME" />. En navegadors <ph name="PRODUCT_NAME" />, el menú d'aplicacions canvia un cop transcorregut un terç del període de notificació per indicar que cal dur a terme un reinici. Aquesta notificació canvia de color quan han transcorregut dos terços del període de notificació i, de nou, quan ha transcorregut el període de notificació complet. Les altres notificacions activades per la política <ph name="RELAUNCH_NOTIFICATION_POLICY_NAME" /> segueixen aquest mateix patró. + + Si la política no s'estableix, s'utilitza el període predeterminat de 345.600.000 mil·lisegons (4 dies) per a dispositius amb <ph name="PRODUCT_OS_NAME" /> i 604.800.000 mil·lisegons (1 setmana) per a <ph name="PRODUCT_NAME" />.</translation> <translation id="4788252609789586009">Activa la funció Emplenament automàtic de <ph name="PRODUCT_NAME" /> i permet que els usuaris emplenin la informació de targetes de crèdit automàticament als formularis web amb dades emmagatzemades anteriorment. Si es desactiva aquesta opció, Emplenament automàtic mai no suggerirà ni emplenarà la informació de targetes de crèdit, ni tampoc desarà la informació addicional de targetes de crèdit que l'usuari enviï mentre navega pel web. @@ -2026,6 +2037,15 @@ <translation id="5208240613060747912">Us permet definir una llista de patrons d'URL que especifiquen els llocs en què no està permès mostrar notificacions. Si no es defineix aquesta política, s'utilitzarà el valor global predeterminat per a tots els llocs tant de la política "DefaultNotificationsSetting", si es defineix, com d'un altre tipus de configuració personal de l'usuari.</translation> <translation id="5213038356678567351">Llocs web que mai no han de provocar un canvi de navegador.</translation> <translation id="5219844027738217407">En el cas de les aplicacions per a Android, aquesta política afecta només el micròfon. Quan s'estableix en "true", es desactiva el micròfon en totes les aplicacions per a Android, sense cap excepció.</translation> +<translation id="5221394278852982313">Permet definir una llista d'URL que especifiquin quins llocs web obtindran permís automàticament per accedir a un dispositiu USB amb els identificadors de proveïdor i producte que s'indiquin. Perquè la política sigui vàlida, tots els elements de la llista han d'incloure tant dispositius com URL. A més, cada dispositiu pot incloure un camp per a l'identificador de proveïdor i per al de producte. Els identificadors omesos es tracten com un comodí, amb excepció dels identificadors de producte, que no es poden especificar si no hi ha un identificador de proveïdor. En cas contrari, la política no serà vàlida i s'ignorarà. + + El model de permisos per a USB utilitza l'URL del lloc web que sol·licita permís ("URL sol·licitant") i l'URL del lloc web de marcs de nivell superior ("URL d'inserció") per concedir permís a l'URL sol·licitant per accedir al dispositiu USB. Si el lloc web que sol·licita permís es carrega en un iframe, l'URL sol·licitant pot ser diferent de l'URL d'inserció. Per tant, el camp urls pot incloure fins a dues cadenes d'URL delimitades per una coma a fi d'especificar l'URL sol·licitant i el d'inserció, respectivament. Si només se n'especifica un, l'accés als dispositius USB corresponents es concedeix quan l'URL del lloc web sol·licitant coincideixi amb aquest URL independentment de l'estat d'inserció. Els URL del camp urls han de ser vàlids. Si no, la política s'ignorarà. + + Si aquesta política es deixa sense establir, s'utilitzarà el valor predeterminat general per a tots els llocs web, ja sigui de la política DefaultWebUsbGuardSetting si està establerta o de la configuració personal de l'usuari si no ho està. + + Els patrons d'URL d'aquesta política no poden entrar en conflicte amb els configurats mitjançant WebUsbBlockedForUrls. Si hi ha un conflicte, aquesta política té prioritat sobre WebUsbBlockedForUrls i WebUsbAskForUrls. + + Els valors d'aquesta política i els de la política DeviceWebUsbAllowDevicesForUrls es fusionen.</translation> <translation id="5228316810085661003">Retard de l'inici de sessió automàtic al compte local del dispositiu. Si no s'estableix la política |DeviceLocalAccountAutoLoginId|, aquesta política no té cap efecte. En cas contrari: @@ -2646,6 +2666,20 @@ Si s'estableix en "No permetis que els usuaris gestionin els certificats", els usuaris no podran gestionar els certificats, sinó només veure'ls.</translation> <translation id="6573305661369899995">Estableix una font externa de restriccions d'URL</translation> +<translation id="6583851521569686409">Configura una llista d'impressores. + + Aquesta política permet als administradors proporcionar configuracions d'impressores als usuaris. + + <ph name="PRINTER_DISPLAY_NAME" /> i <ph name="PRINTER_DESCRIPTION" /> són cadenes de format lliure que es poden personalitzar per facilitar la selecció de la impressora. <ph name="PRINTER_MANUFACTURER" /> i <ph name="PRINTER_MODEL" /> serveixen perquè els usuaris finals puguin identificar la impressora més fàcilment. Representen el fabricant i el model de la impressora. <ph name="PRINTER_URI" /> ha de ser una adreça accessible des d'un client i ha d'incloure <ph name="URI_SCHEME" />, <ph name="URI_PORT" /> i <ph name="URI_QUEUE" />. <ph name="PRINTER_UUID" /> és opcional. Si s'indica, s'utilitza per eliminar la duplicació d'impressores <ph name="ZEROCONF_DISCOVERY" />. + + <ph name="PRINTER_EFFECTIVE_MODEL" /> ha de contenir el nom de la impressora o bé <ph name="PRINTER_AUTOCONF" /> s'ha d'establir en "true". Les impressores que no tinguin cap d'aquestes propietats o que les tinguin totes dues s'ignoraran. + + La configuració d'una impressora es completa quan s'utilitza per primera vegada, moment en què es baixen els fitxers PPD. Després, es desen a la memòria cau els que s'utilitzen sovint. + + Aquesta política no repercuteix en la possibilitat dels usuaris de configurar impressores en dispositius concrets, sinó que s'ha creat per complementar la configuració d'impressores per part dels usuaris.sinó que s'ha creat per complementar la configuració d'impressores per part dels usuaris. + + En el cas dels dispositius gestionats d'Active Directory, aquesta política permet ampliar <ph name="MACHINE_NAME_VARIABLE" /> sinó que s'ha creat per complementar la configuració d'impressores per part dels usuaris.per incloure-hi el nom del dispositiu d'Active Directory o una subcadena d'aquest directori. Si, per exemple, el nom del dispositiu és <ph name="MACHINE_NAME_EXAMPLE" />, <ph name="MACHINE_NAME_VARIABLE_EXAMPLE" /> se substituirà pels 4 caràcters posteriors a la sisena posició, és a dir, <ph name="MACHINE_NAME_PART_EXAMPLE" />.sinó que s'ha creat per complementar la configuració d'impressores per part dels usuaris. Fixa't que la posició es basa en zero. + </translation> <translation id="6598235178374410284">Imatge d'avatar de l'usuari</translation> <translation id="6603004149426829878">Envia sempre els senyals d'ubicació disponibles al servidor mentre es determina la zona horària</translation> <translation id="6628120204569232711">Informa de l'estat de l'emmagatzematge</translation> @@ -3067,7 +3101,6 @@ Si aquesta política es defineix com a RemoveLRUIfDormant, la neteja automàtica continuarà suprimint usuaris que no hagin iniciat la sessió com a mínim durant els darrers tres mesos, començant pels que faci més temps que han iniciat la sessió, fins que hi hagi prou espai lliure. Si aquesta política no es defineix, la neteja automàtica utilitza l'estratègia integrada predeterminada. Actualment, és l'estratègia RemoveLRUIfDormant.</translation> -<translation id="7334274148831027933">Activa la lupa acoblada</translation> <translation id="7336785017449297672">Controla la configuració del rellotge i de la zona horària.</translation> <translation id="7336878834592315572">Conserva les galetes mentre duri la sessió</translation> <translation id="7339315111520512972">Obliga a executar el codi de xarxa cal procés del navegador</translation> @@ -3445,7 +3478,7 @@ Si no es defineix aquesta política, no es faran excepcions a la llista negra de la política "URLBlacklist".</translation> <translation id="8176035528522326671">Permet que un usuari d'empresa només sigui un usuari multiperfil principal (comportament predeterminat per a usuaris gestionats per l'empresa)</translation> -<translation id="8183108371184777472">Cancel·la l'inici de la finestra del navegador</translation> +<translation id="8183108371184777472">Impedeix que s'obri la finestra del navegador</translation> <translation id="8214600119442850823">Configura el gestor de contrasenyes.</translation> <translation id="8244171102276095471">Activa els sistemes de xifratge RC4 de TLS</translation> <translation id="8244525275280476362">Retard màxim en l'obtenció després de la invalidació d'una política</translation> @@ -3842,6 +3875,8 @@ <translation id="915194831143859291">Si aquesta política s'estableix en false o no es configura, <ph name="PRODUCT_OS_NAME" /> permetrà que l'usuari apagui el dispositiu. Si aquesta política s'estableix en true, <ph name="PRODUCT_OS_NAME" /> reiniciarà el dispositiu quan l'usuari l'apagui. És a dir, <ph name="PRODUCT_OS_NAME" /> substitueix tots els botons d'apagat de la interfície d'usuari per botons de reinici. Per tant, si l'usuari apaga el dispositiu amb el botó d'engegada, es reiniciarà de manera automàtica, encara que la política estigui activada.</translation> <translation id="9152473318295429890">Activa suggeriments contextuals de pàgines web relacionades</translation> +<translation id="9153446010242995516">Torna a la versió de destinació si la versió del sistema operatiu és més recent que la de destinació. Prova de dur a terme una configuració a nivell del dispositiu (que inclogui les credencials de xarxa) mitjançant el procés de reversió sempre que sigui possible. Executa la reversió amb la funció Powerwash completa, fins i tot si no es poden restaurar les dades, ja sigui perquè la versió de destinació no admet la restauració de dades o a causa d'un canvi incompatible amb versions anteriors. + S'admet a <ph name="PRODUCT_OS_NAME" /> en la versió 75 i posteriors. En clients més antics, aquest valor indica que la reversió està desactivada.</translation> <translation id="9158929520101169054">Permet l'inici de sessió múltiple al navegador</translation> <translation id="9159126470527871268">Notifica els usuaris que cal reiniciar <ph name="PRODUCT_NAME" /> o <ph name="PRODUCT_OS_NAME" /> per aplicar una actualització pendent.
diff --git a/components/policy/resources/policy_templates_cs.xtb b/components/policy/resources/policy_templates_cs.xtb index a680be4..f31fde0 100644 --- a/components/policy/resources/policy_templates_cs.xtb +++ b/components/policy/resources/policy_templates_cs.xtb
@@ -130,15 +130,6 @@ Pokud je tato zásada nastavena na hodnotu false, stav přepínače režimu pro vývojáře se hlásit nebude.</translation> <translation id="1160479894929412407">Povolit protokol QUIC</translation> <translation id="1160939557934457296">Zakázat pokračování ze stránky s upozorněním Bezpečného prohlížení</translation> -<translation id="1171342272070128466">Zapnout zadokovanou lupu (funkce pro usnadnění přístupu). - - Pokud je tato zásada nastavená na hodnotu true, bude zadokovaná lupa vždy zapnutá. - - Pokud je tato zásada nastavená na hodnotu false, bude zadokovaná lupa vždy vypnutá. - - Pokud tuto zásadu nastavíte, uživatelé ji nebudou moci změnit ani přepsat. - - Pokud ji ponecháte nenastavenou, zadokovaná lupa bude ve výchozím nastavení vypnutá, ale uživatel ji bude moci kdykoli zapnout.</translation> <translation id="1189817621108632689">Umožňuje nastavit seznam vzorů adres URL webových stránek, které nemají povoleno zobrazovat obrázky. Pokud tuto zásadu nenastavíte, použije se pro všechny webové stránky globální výchozí hodnota buď ze zásady DefaultImageSetting (pokud je nastavena), nebo z osobního nastavení uživatele. @@ -1105,6 +1096,15 @@ Pokud tato zásada nastavena není, chování konkrétnějších zásad nebude ovlivněno.</translation> <translation id="2987155890997901449">Povolit rozšíření ARC</translation> <translation id="2987227569419001736">Ovládat používání rozhraní Web Bluetooth API</translation> +<translation id="2990018289267778247">Pokud je tato zásada nastavená na hodnotu true, v nabídce hlavního panelu systému se vždy zobrazí možnosti usnadnění přístupu. + + Pokud je tato zásada nastavená na hodnotu false, možnosti usnadnění přístupu se v nabídce hlavního panelu systému nikdy nezobrazí. + + Pokud tuto zásadu nastavíte, uživatelé ji nebudou moci změnit ani přepsat. + + Pokud tato zásada není nastavená, možnosti usnadnění přístupu se v nabídce hlavního panelu systému nezobrazí, ale uživatelé jejich zobrazení mohou aktivovat na stránce Nastavení. + + Při aktivaci funkcí usnadnění přístupu (jiným způsobem, například klávesovou kombinací) se možnosti usnadnění přístupu v nabídce hlavního panelu systému zobrazí vždy.</translation> <translation id="3011301228198307065">Nakonfiguruje v prohlížeči <ph name="PRODUCT_NAME" /> adresu URL výchozí domovské stránky a zabrání uživatelům, aby toto nastavení změnili. Domovská stránka je stránka, která se otevírá tlačítkem Domovská stránka. Stránky, které se otevírají po spuštění, jsou určeny zásadami RestoreOnStartup. @@ -1420,6 +1420,7 @@ Tato zásada se používá k registraci cloudových zásad pro počítač. V systému Windows ji lze nastavit pomocí registru nebo objektů zásad skupiny, na počítačích Mac pomocí souboru plist a v Linuxu pomocí souboru JSON se zásadami.</translation> <translation id="3660562134618097814">Přenos souborů cookie od poskytovatele identity SAML při přihlášení</translation> <translation id="3701121231485832347">Ovládá nastavení specifická pro zařízení <ph name="PRODUCT_OS_NAME" /> spravovaná službou <ph name="MS_AD_NAME" />.</translation> +<translation id="3702518095257671450">Vzdálené ověření identity</translation> <translation id="3702647575225525306"><ph name="POLICY_NAME" /> (Podpora pole s jedním řádkem byla ukončena. Začněte používat níže uvedené textové pole s více řádky.)</translation> <translation id="3709266154059827597">Konfigurace seznamu zakázaných položek instalace rozšíření</translation> <translation id="3711895659073496551">Pozastavit</translation> @@ -1529,11 +1530,6 @@ <translation id="3851039766298741586">Hlášení informací o aktivní relaci veřejného terminálu, jako je ID a verze aplikace. Je-li tato zásada nastavena na hodnotu False, informace o relaci veřejného terminálu se hlásit nebudou. Pokud je nastavena na hodnotu True nebo nastavena není, informace o relaci veřejného terminálu se hlásit budou.</translation> -<translation id="3852924591079583104"> - Když je tato zásada nastavená na hodnotu ArcSession a byl spuštěn systém Android, bude po odhlášení uživatele vynucen restart zařízení. - Když je nastavená na možnost Always (Vždy), bude restart zařízení vynucen po každém odhlášení uživatele. - Pokud je ponechána nenastavená, nemá žádný účinek a restart se po odhlášení uživatele nevynucuje. To samé platí i v případě, že je nastavená na možnost Never (Nikdy). - </translation> <translation id="3858658082795336534">Výchozí režim oboustranného tisku</translation> <translation id="3859780406608282662">Přidá parametr k načítání počátečních hodnot variant v systému <ph name="PRODUCT_OS_NAME" />. @@ -1810,6 +1806,15 @@ Tato zásada je respektována pouze v případě, že je aktivována zásada DefaultSearchProviderEnabled.</translation> <translation id="4285674129118156176">Povolit cizím uživatelům používat ARC</translation> +<translation id="4289903996435140853">Umožňuje nastavit seznam adres URL určujících, kterým webům bude automaticky uděleno oprávnění k přístupu k zařízení USB od určitého dodavatele s určitými ID produktu. Aby zásada byla platná, musí každá položka v seznamu obsahovat jak zařízení, tak adresy URL. Každá položka zařízení může obsahovat pole ID dodavatele a ID produktu. Chybějící ID je považováno za zástupný znak. ID produktu však nesmí být zadáno bez ID dodavatele, jinak zásada nebude platná. + + Model oprávnění USB k udělení přístupu k zařízení USB žádajícímu webu používá adresu URL žádajícího webu („žádající adresa URL“) a adresu URL webu v rámci nejvyšší úrovně („adresa URL hlavního rámce“). Pokud je žádající web načten v prvku iframe, může se žádající adresa URL od adresy URL hlavního rámce lišit. Pole „urls“ proto může obsahovat až dva řetězce URL oddělené čárkou, které určují žádající adresu URL a adresu URL hlavního rámce. Pokud je zadána jen jedna adresa URL, bude přístup k příslušným zařízením USB udělen, když adresa URL žádajícího webu odpovídá této adrese URL, bez ohledu na stav vložení. Adresy URL v poli „urls“ musejí být platné, jinak tato zásada bude ignorována. + + Pokud tuto zásadu nenastavíte, použije se pro všechny webové stránky globální výchozí hodnota buď ze zásady DefaultWebUsbGuardSetting (pokud je nastavena), nebo z osobního nastavení uživatele. + + Vzory adres URL v této zásadě by neměly být v konfliktu se vzory nakonfigurovanými prostřednictvím zásady WebUsbBlockedForUrls. V případě konfliktu bude mít tato zásada před zásadami WebUsbBlockedForUrls a WebUsbAskForUrls přednost. + + Hodnoty této zásady a zásady WebUsbAllowDevicesForUrls se slučují dohromady.</translation> <translation id="4298509794364745131">Určuje seznam aplikací, které lze povolit jako aplikace k přidávání poznámek na obrazovku uzamčení v systému <ph name="PRODUCT_OS_NAME" />. Je-li na obrazovce uzamčení povolena preferovaná aplikace k přidávání poznámek, obrazovka uzamčení bude obsahovat prvek uživatelského rozhraní ke spuštění preferované aplikace. @@ -1961,6 +1966,7 @@ <translation id="4639407427807680016">Názvy hostitelů zasílání nativních zpráv, kterým chcete udělit výjimku ze seznamu zakázaných položek.</translation> <translation id="4650759511838826572">Deaktivovat schémata protokolu adresy URL</translation> <translation id="465099050592230505">Adresa URL podnikového úložiště aplikací (podpora ukončena)</translation> +<translation id="4661889655253181651">Nastavení obsahu umožňují určit, jakým způsobem bude zpracováván obsah určitého typu (například soubory cookie, obrázky nebo JavaScript).</translation> <translation id="4665897631924472251">Nastavení správy rozšíření</translation> <translation id="4668325077104657568">Výchozí nastavení obrázků</translation> <translation id="4670865688564083639">Minimum:</translation> @@ -2005,6 +2011,11 @@ Tyto návrhy se načítají vzdáleně ze serverů Google. Pokud je tato zásada nastavená na hodnotu false, návrhy se načítat ani zobrazovat nebudou.</translation> +<translation id="4759650396863318477">Umožňuje nastavit dobu v milisekundách, po kterou se uživatelům bude zobrazovat oznámení, že je třeba prohlížeč <ph name="PRODUCT_NAME" /> nebo zařízení se systémem <ph name="PRODUCT_OS_NAME" /> restartovat, aby bylo možné nainstalovat čekající aktualizaci. + + Během této doby bude uživatel opakovaně informován, že je potřeba nainstalovat aktualizaci. Na zařízeních se systémem <ph name="PRODUCT_OS_NAME" /> se oznámení o restartu zobrazuje na hlavním panelu systému podle zásady <ph name="RELAUNCH_HEADS_UP_PERIOD_POLICY_NAME" />. V prohlížečích <ph name="PRODUCT_NAME" /> se po uplynutí jedné třetiny lhůty pro oznámení změní nabídka aplikace na znamení, že je prohlížeč potřeba aktualizovat. Barva tohoto oznámení se změní po uplynutí dvou třetin lhůty a poté znovu po uplynutí celé lhůty. Další oznámení aktivovaná pomocí zásady <ph name="RELAUNCH_NOTIFICATION_POLICY_NAME" /> se řídí stejným časovým plánem. + + Pokud tuto zásadu nenastavíte, použije se pro systém <ph name="PRODUCT_OS_NAME" /> výchozí doba 345 600 000 milisekund (čtyři dny) a pro prohlížeč <ph name="PRODUCT_NAME" /> 604 800 000 milisekund (jeden týden).</translation> <translation id="4788252609789586009">Aktivuje v prohlížeči <ph name="PRODUCT_NAME" /> funkci Automatické vyplňování a umožňuje uživatelům automaticky ve webových formulářích vyplňovat informace o platebních kartách pomocí dříve uložených údajů. Pokud je toto nastavení vypnuto, nebude automatické vyplňování navrhovat ani vyplňovat informace o platebních kartách a nebude ani ukládat další informace o platebních kartách, které uživatel při prohlížení webu odešle. @@ -2211,6 +2222,15 @@ Pokud zásadu nenastavíte, použije se pro všechny webové stránky globální výchozí hodnota buď ze zásady DefaultNotificationsSetting (pokud je nastavena), nebo z osobního nastavení uživatele.</translation> <translation id="5213038356678567351">Weby, které by nikdy neměly spustit přepnutí prohlížeče.</translation> <translation id="5219844027738217407">U aplikací Android má tato zásada vliv pouze na mikrofon. Když je tato zásada nastavena na hodnotu True, je mikrofon pro všechny aplikace Android bez výjimky ztlumen.</translation> +<translation id="5221394278852982313">Umožňuje nastavit seznam adres URL určujících, kterým webům bude automaticky uděleno oprávnění k přístupu k zařízení USB od určitého dodavatele s určitými ID produktu. Aby zásada byla platná, musí každá položka v seznamu obsahovat jak zařízení, tak adresy URL. Každá položka zařízení může obsahovat pole ID dodavatele a ID produktu. Chybějící ID je považováno za zástupný znak. ID produktu však nesmí být zadáno bez ID dodavatele, jinak zásada nebude platná. + + Model oprávnění USB k udělení přístupu k zařízení USB žádajícímu webu používá adresu URL žádajícího webu („žádající adresa URL“) a adresu URL webu v rámci nejvyšší úrovně („adresa URL hlavního rámce“). Pokud je žádající web načten v prvku iframe, může se žádající adresa URL od adresy URL hlavního rámce lišit. Pole „urls“ proto může obsahovat až dva řetězce URL oddělené čárkou, které určují žádající adresu URL a adresu URL hlavního rámce. Pokud je zadána jen jedna adresa URL, bude přístup k příslušným zařízením USB udělen, když adresa URL žádajícího webu odpovídá této adrese URL, bez ohledu na stav vložení. Adresy URL v poli „urls“ musejí být platné, jinak tato zásada bude ignorována. + + Pokud tuto zásadu nenastavíte, použije se pro všechny webové stránky globální výchozí hodnota buď ze zásady DefaultWebUsbGuardSetting (pokud je nastavena), nebo z osobního nastavení uživatele. + + Vzory adres URL v této zásadě by neměly být v konfliktu se vzory nakonfigurovanými prostřednictvím zásady WebUsbBlockedForUrls. V případě konfliktu bude mít tato zásada před zásadami WebUsbBlockedForUrls a WebUsbAskForUrls přednost. + + Hodnoty této zásady a zásady DeviceWebUsbAllowDevicesForUrls se slučují dohromady.</translation> <translation id="5228316810085661003">Prodleva automatického přihlášení místního účtu na zařízení. Jestliže není nastavena zásada |DeviceLocalAccountAutoLoginId| nemá tato zásada žádný účinek. Jinak: @@ -2928,6 +2948,20 @@ Pokud je nastavená na možnost „Zakázat uživatelům správu certifikátů“, uživatelé certifikáty nebudou moci spravovat (budou je moci jen zobrazit).</translation> <translation id="6573305661369899995">Nastavit externí zdroj omezení adres URL</translation> +<translation id="6583851521569686409">Konfiguruje seznam tiskáren. + + Tato zásada administrátorům umožňuje poskytnout uživatelům konfigurace tiskáren. + + Hodnoty <ph name="PRINTER_DISPLAY_NAME" /> a <ph name="PRINTER_DESCRIPTION" /> jsou volně upravitelné textové řetězce, pomocí kterých lze usnadnit výběr tiskárny. Hodnoty <ph name="PRINTER_MANUFACTURER" /> a <ph name="PRINTER_MODEL" /> koncovým uživatelům umožní snáze tiskárnu rozpoznat. Představují výrobce a model tiskárny. Hodnota <ph name="PRINTER_URI" /> by měla být adresa přístupná z klientského počítače, včetně údajů <ph name="URI_SCHEME" />, <ph name="URI_PORT" /> a <ph name="URI_QUEUE" />. Hodnota <ph name="PRINTER_UUID" /> je volitelná. Pokud je zadána, slouží k odebrání duplicitních tiskáren <ph name="ZEROCONF_DISCOVERY" />. + + Pole <ph name="PRINTER_EFFECTIVE_MODEL" /> musí obsahovat název tiskárny, nebo je třeba nastavit příznak <ph name="PRINTER_AUTOCONF" /> na hodnotu true. Tiskárny s oběma těmito nastaveními nebo bez žádného z nich budou ignorovány. + + Nastavení tiskárny se dokončí při prvním použití. Soubory PPD se stáhnou až při použití tiskárny. Často používané soubory PPD budou následně uloženy do mezipaměti. + + Tato zásada nemá vliv na to, zda uživatelé mohou konfigurovat tiskárny na jednotlivých zařízeních. Je zamýšlena jako doplněk ke konfiguraci tiskáren ze strany jednotlivých uživatelů. + + U zařízení spravovaných pomocí služby Active Directory tato zásada podporuje rozšíření <ph name="MACHINE_NAME_VARIABLE" /> na název počítače ve službě Active Directory nebo jeho podřetězec. V případě názvu počítače <ph name="MACHINE_NAME_EXAMPLE" /> by byl řetězec <ph name="MACHINE_NAME_VARIABLE_EXAMPLE" /> nahrazen čtyřmi znaky po šesté pozici, tj. <ph name="MACHINE_NAME_PART_EXAMPLE" />. Pozice se počítají od nuly. + </translation> <translation id="6598235178374410284">Obrázek avatara uživatele</translation> <translation id="6603004149426829878">Při určování časového pásma na server vždy odesílat všechny dostupné signály týkající se polohy</translation> <translation id="6628120204569232711">Hlásit stav úložiště</translation> @@ -3373,7 +3407,6 @@ Je-li tato zásada nastavena na hodnotu RemoveLRUIfDormant, budou při automatickém čištění odstraňováni uživatelé, kteří se nejdelší dobu nepřihlásili, dokud nevznikne dostatek volného místa. Uživatelé, kteří se přihlásili během posledních 3 měsíců, však odstraněni nebudou. Pokud tato zásada nastavena není, bude při automatickém čištění použita výchozí integrovaná strategie. Aktuálně je to strategie RemoveLRUIfDormant.</translation> -<translation id="7334274148831027933">Zapnout zadokovanou lupu</translation> <translation id="7336785017449297672">Ovládá nastavení hodin a časového pásma.</translation> <translation id="7336878834592315572">Uchovat soubory cookie po dobu trvání návštěvy</translation> <translation id="7339315111520512972">Vynutit spuštění kódu pro sítě v procesu prohlížeče</translation> @@ -4242,6 +4275,8 @@ <translation id="915194831143859291">Pokud je tato zásada nastavena na hodnotu false nebo není nastavena, systém <ph name="PRODUCT_OS_NAME" /> umožní uživateli vypnout zařízení. Pokud je tato zásada nastavena na hodnotu true a uživatel vypne zařízení, spustí systém <ph name="PRODUCT_OS_NAME" /> restart. Systém <ph name="PRODUCT_OS_NAME" /> nahradí všechna tlačítka pro vypnutí v uživatelském rozhraní tlačítky pro restart. Pokud uživatel zařízení vypne pomocí vypínače, zařízení se automaticky restartovat nebude, a to ani v případě, že je tato zásada aktivována.</translation> <translation id="9152473318295429890">Povolit kontextové návrhy souvisejících webových stránek</translation> +<translation id="9153446010242995516">Pokud je verze operačního systému novější než cílová verze, vrátit se zpět k cílové verzi a zachovat ji. Při procesu vrácení se systém pokusí obnovit stávající konfiguraci na úrovni zařízení (včetně přihlašovacích údajů k sítím). Vrácení k cílové verzi a úplné vyčištění Powerwash se však provede i v případě, že obnovení těchto dat nebude možné (protože cílová verze nepodporuje obnovení dat nebo protože došlo ke změně, která není zpětně kompatibilní). + Tato funkce je podporována v systému <ph name="PRODUCT_OS_NAME" /> verze 75 a vyšších verzích. U starších klientů tato hodnota znamená, že je vrácení zpět zakázáno.</translation> <translation id="9158929520101169054">Povolit v prohlížeči vícenásobné přihlášení</translation> <translation id="9159126470527871268">Oznamuje uživateli, že je třeba restartovat prohlížeč <ph name="PRODUCT_NAME" /> nebo systém <ph name="PRODUCT_OS_NAME" />, aby bylo možné nainstalovat čekající aktualizaci.
diff --git a/components/policy/resources/policy_templates_da.xtb b/components/policy/resources/policy_templates_da.xtb index 75a767cc..60de99c 100644 --- a/components/policy/resources/policy_templates_da.xtb +++ b/components/policy/resources/policy_templates_da.xtb
@@ -132,15 +132,6 @@ Hvis politikken er angivet til Falsk, rapporteres tilstanden for udviklerkontakten ikke.</translation> <translation id="1160479894929412407">Tillad QUIC-protokol</translation> <translation id="1160939557934457296">Deaktiver fortsættelse fra advarselssiden for Beskyttet browsing</translation> -<translation id="1171342272070128466">Aktivér hjælpefunktionen Fastgjort lupvindue. - - Hvis politikken angives som Sand, er det fastgjorte lupvindue altid aktiveret. - - Hvis politikken angives som Falsk, er det fastgjorte lupvindue altid deaktiveret. - - Hvis politikken konfigureres, kan brugerne ikke ændre eller tilsidesætte den. - - Hvis politikken ikke konfigureres, er det fastgjorte lupvindue deaktiveret, men brugeren kan når som helst aktivere funktionen.</translation> <translation id="1189817621108632689">Giver dig mulighed for at oprette en liste med webadressemønstre, der angiver websites, hvor det ikke er tilladt at vise billeder. Hvis denne politik ikke angives, anvendes den globale standardværdi på alle websites, enten fra politikken "DefaultImagesSetting", hvis den er angivet, eller brugerens personlige konfiguration. @@ -1530,11 +1521,6 @@ Hvis politikken er angivet som falsk, rapporteres terminaloplysningerne ikke. Hvis den angives som sand eller ikke angives, rapporteres terminaloplysningerne.</translation> -<translation id="3852924591079583104"> - Hvis politikken er angivet som ArcSession, tvinges enheden til at genstarte, når brugeren logger ud, hvis Android er startet. - Hvis politikken er angivet som Altid, tvinges enheden til at genstarte, hver gang brugeren logger ud. - Hvis politikken ikke er konfigureret, har den ikke nogen effekt, og enheden tvinges ikke til at genstarte, når brugeren logger ud. Det samme gælder, hvis politikken er angivet som Aldrig. - </translation> <translation id="3858658082795336534">Standardudskrivning i duplex-tilstand</translation> <translation id="3859780406608282662">Føj en parameter til hentning af variationsbasistallet i <ph name="PRODUCT_OS_NAME" />. @@ -3357,7 +3343,6 @@ Hvis denne politik er angivet til "RemoveLRUIfDormant", vil den automatiske oprydningsfunktion fortsætte med at fjerne brugere, der ikke har været logget ind i minimum tre måneder, startende med den bruger, der ikke har været logget ind i længst tid, indtil der er tilstrækkelig ledig plads. Hvis denne politik ikke er indstillet, anvender den automatiske oprydningsfunktion standardstrategien. Denne strategi er i øjeblikket "RemoveLRUIfDormant".</translation> -<translation id="7334274148831027933">Aktivér fastgjort lupvindue</translation> <translation id="7336785017449297672">Styrer indstillingerne for tidszone</translation> <translation id="7336878834592315572">Behold cookies under sessionen</translation> <translation id="7339315111520512972">Tving netværkskoden til at køre i browserprocessen</translation>
diff --git a/components/policy/resources/policy_templates_de.xtb b/components/policy/resources/policy_templates_de.xtb index f32529a..802eeca 100644 --- a/components/policy/resources/policy_templates_de.xtb +++ b/components/policy/resources/policy_templates_de.xtb
@@ -139,15 +139,6 @@ Wird die Richtlinie auf "False" gesetzt, wird der Status des Entwicklerschalters nicht gemeldet.</translation> <translation id="1160479894929412407">QUIC-Protokoll zulassen</translation> <translation id="1160939557934457296">Fortfahren von der Safe Browsing-Hinweisseite deaktivieren</translation> -<translation id="1171342272070128466">Hierdurch wird die angedockte Lupe aktiviert. - - Wird die Richtlinie auf "true" festgelegt, ist die angedockte Lupe immer aktiviert. - - Falls die Richtlinie auf "false" festgelegt wurde, ist die angedockte Lupe immer deaktiviert. - - Wenn Sie diese Richtlinie konfigurieren, kann sie vom Nutzer nicht geändert oder überschrieben werden. - - Ist die Richtlinie nicht konfiguriert, so ist die angedockte Lupe anfangs deaktiviert, kann jedoch vom Nutzer jederzeit aktiviert werden.</translation> <translation id="1189817621108632689">Ermöglicht die Erstellung einer Liste mit URL-Mustern, die Websites angeben, denen das Anzeigen von Bildern nicht gestattet ist. Ist diese Richtlinie nicht konfiguriert, kommt für alle Websites entweder der globale Standardwert der Richtlinie "DefaultImagesSetting", sofern konfiguriert, oder die persönliche Konfiguration des Nutzers zum Einsatz. @@ -1541,11 +1532,6 @@ <translation id="3851039766298741586">Durch diese Richtlinien werden Informationen zur aktiven Kiosksitzung gesendet, etwa Anwendungs-ID und Anwendungsversion. Wenn für die Richtlinien "false" festgelegt wird, werden die Informationen zu der Kiosksitzung nicht gesendet. Wird für die Richtlinien "true" festgelegt oder werden sie nicht konfiguriert, werden die Informationen zu der Kiosksitzung gesendet.</translation> -<translation id="3852924591079583104"> - Wenn diese Richtlinie auf "ArcSession" gesetzt ist, wird das Gerät zum Neustart gezwungen, sobald sich ein Nutzer abmeldet, wenn Android gestartet wurde. - Ist sie auf "Immer" festgelegt, wird das Gerät nach jeder Nutzerabmeldung zu einem Neustart gezwungen. - Wenn die Richtlinie nicht konfiguriert ist, hat sie keine Auswirkung und es wird nach der Nutzerabmeldung kein Neustart erzwungen. Dasselbe gilt bei der Einstellung "Nie". - </translation> <translation id="3858658082795336534">Standardmäßiger Duplexmodus</translation> <translation id="3859780406608282662">Fügt einen Parameter für den Abruf des Varianten-Seeds in <ph name="PRODUCT_OS_NAME" /> hinzu. @@ -2328,7 +2314,7 @@ Ist sie aktiviert, wird das Browserfenster nicht geöffnet. - Wenn die Richtlinie deaktiviert oder nicht konfiguriert ist, kann das Browserfenster geöffnet werden. Unter Umständen verhindern andere Richtlinien oder Befehlszeilen-Flags, dass das Browserfenster geöffnet wird.</translation> + Wenn die Richtlinie deaktiviert oder nicht konfiguriert ist, kann das Browserfenster geöffnet werden. Unter Umständen verhindern jedoch andere Richtlinien oder Befehlszeilen-Flags, dass das Browserfenster geöffnet wird.</translation> <translation id="5427879482805712214">Über diese Richtlinie können Sie das Avatarbild des Nutzers für den Anmeldebildschirm konfigurieren. Zum Festlegen der Richtlinie muss die URL, über die <ph name="PRODUCT_OS_NAME" /> das Avatarbild herunterladen kann, sowie ein kryptografischer Hash angegeben werden, um die Integrität des Downloads zu verifizieren. Das Bild muss im JPEG-Format vorliegen und darf nicht größer als 512 KB sein. Der Zugriff auf die URL muss ohne Authentifizierung möglich sein. Das Avatarbild wird heruntergeladen und im Cache gespeichert. Sobald sich die URL oder der Hash ändert, wird es noch einmal heruntergeladen. @@ -3346,7 +3332,6 @@ Wenn für diese Richtlinie "RemoveLRUIfDormant" festgelegt ist, entfernt die automatische Bereinigungsfunktion nur diejenigen Nutzer vom Gerät, die seit mindestens drei Monaten nicht mehr angemeldet waren. Diese Nutzer werden in der chronologischen Reihenfolge ihrer letzten Anmeldung vom Gerät gelöscht, bis wieder genügend freier Speicher vorhanden ist. Ist die Richtlinie nicht konfiguriert, erfolgt die automatische Bereinigung auf Grundlage der integrierten Standardstrategie. Zurzeit handelt es sich dabei um die "RemoveLRUIfDormant"-Strategie.</translation> -<translation id="7334274148831027933">Angedockte Lupe aktivieren</translation> <translation id="7336785017449297672">Legt die Einstellungen für die Uhrzeit und Zeitzone fest.</translation> <translation id="7336878834592315572">Cookies für die Dauer der Sitzung beibehalten</translation> <translation id="7339315111520512972">Ausführung des Netzwerkcodes im Browserprozess erzwingen</translation>
diff --git a/components/policy/resources/policy_templates_el.xtb b/components/policy/resources/policy_templates_el.xtb index 5d5d6c26..c85ef9c 100644 --- a/components/policy/resources/policy_templates_el.xtb +++ b/components/policy/resources/policy_templates_el.xtb
@@ -147,15 +147,6 @@ Εάν αυτή η πολιτική οριστεί αναληθής, η κατάσταση του διακόπτη προγραμματισμού δεν θα αναφέρεται.</translation> <translation id="1160479894929412407">Επιτρέπει το πρωτόκολλο QUIC</translation> <translation id="1160939557934457296">Απενεργοποίηση συνέχισης από τη σελίδα προειδοποίησης της Ασφαλούς περιήγησης</translation> -<translation id="1171342272070128466">Ενεργοποίηση της λειτουργίας προσβασιμότητας μεγεθυντικού φακού σε παράθυρο. - - Εάν αυτή η πολιτική οριστεί ως αληθής, ο μεγεθυντικός φακός σε παράθυρο θα είναι πάντα ενεργοποιημένος. - - Εάν αυτή η πολιτική οριστεί ως ψευδής, ο μεγεθυντικός φακός σε παράθυρο θα είναι πάντα απενεργοποιημένος. - - Εάν ορίσετε αυτήν την πολιτική, οι χρήστες δεν μπορούν να την αλλάξουν ή να την παρακάμψουν. - - Εάν αυτή η πολιτική δεν οριστεί, ο μεγεθυντικός φακός σε παράθυρο απενεργοποιείται αρχικά, αλλά μπορεί να ενεργοποιηθεί ανά πάσα στιγμή από τον χρήστη.</translation> <translation id="1189817621108632689">Σας επιτρέπει να ορίσετε μια λίστα με τα μοτίβα διευθύνσεων url που προσδιορίζουν τους ιστοτόπους στους οποίους δεν επιτρέπεται να προβάλλουν εικόνες. Εάν αυτή η πολιτική δεν οριστεί θα χρησιμοποιηθεί η καθολική προεπιλεγμένη τιμή για όλους τους ιστοτόπους είτε από την πολιτική "DefaultImagesSetting" εφόσον έχει οριστεί, είτε από την προσωπική διαμόρφωση του χρήστη. @@ -1145,6 +1136,15 @@ Εάν δεν οριστεί αυτή η πολιτική, η συμπεριφορά των πιο συγκεκριμένων πολιτικών δεν επηρεάζεται.</translation> <translation id="2987155890997901449">Ενεργοποίηση ARC</translation> <translation id="2987227569419001736">Έλεγχος της χρήσης του API Bluetooth ιστού</translation> +<translation id="2990018289267778247">Εάν αυτή η πολιτική οριστεί ως αληθής, οι επιλογές προσβασιμότητας εμφανίζονται πάντα στο μενού της περιοχής ειδοποιήσεων. + + Εάν αυτή η πολιτική οριστεί ως μη αληθής, οι επιλογές προσβασιμότητας δεν εμφανίζονται ποτέ στο μενού της περιοχής ειδοποιήσεων. + + Εάν ορίσετε αυτήν την πολιτική, οι χρήστες δεν μπορούν να την αλλάξουν ή να την παρακάμψουν. + + Εάν δεν ορίσετε αυτήν την πολιτική, οι επιλογές προσβασιμότητας δεν θα εμφανίζονται στο μενού της περιοχής ειδοποιήσεων, αλλά ο χρήστης θα μπορεί να εμφανίζει τις επιλογές προσβασιμότητας μέσω της σελίδας Ρυθμίσεις. + + Όταν οι λειτουργίες προσβασιμότητας είναι ενεργοποιημένες (με άλλα μέσα, π.χ. με συνδυασμό πλήκτρων), οι επιλογές προσβασιμότητας θα εμφανίζονται πάντα στο μενού της περιοχής ειδοποιήσεων.</translation> <translation id="3011301228198307065">Διαμορφώνει το προεπιλεγμένο URL αρχικής σελίδας στο <ph name="PRODUCT_NAME" /> και εμποδίζει την αλλαγή του από τους χρήστες. Η αρχική σελίδα είναι η σελίδα που ανοίγει από το κουμπί της αρχικής οθόνης. Οι σελίδες που ανοίγουν κατά την εκκίνηση ελέγχονται από τις πολιτικές RestoreOnStartup. @@ -1468,6 +1468,7 @@ Αυτή η πολιτική χρησιμοποιείται από την εγγραφή πολιτικής cloud σε επίπεδο συσκευής για υπολογιστή και μπορεί να οριστεί από το Μητρώο ή το GPO σε Windows, το plist σε Mac και το αρχείο πολιτικής JSON σε Linux.</translation> <translation id="3660562134618097814">Μεταφορά cookie SAML IdP κατά τη σύνδεση</translation> <translation id="3701121231485832347">Ελέγχει τις ρυθμίσεις που αφορούν συγκεκριμένα τις συσκευές <ph name="PRODUCT_OS_NAME" /> των οποίων η διαχείριση γίνεται από <ph name="MS_AD_NAME" />.</translation> +<translation id="3702518095257671450">Απομακρυσμένη διαβεβαίωση</translation> <translation id="3702647575225525306"><ph name="POLICY_NAME" /> (Το πεδίο μίας γραμμής αποσύρθηκε και θα καταργηθεί στο μέλλον. Ξεκινήστε να χρησιμοποιείτε το πλαίσιο κειμένου πολλών γραμμών παρακάτω.)</translation> <translation id="3709266154059827597">Διαμόρφωση λίστας αποκλεισμένων για την εγκατάσταση επέκτασης</translation> <translation id="3711895659073496551">Αναστολή</translation> @@ -1576,11 +1577,6 @@ Εάν η πολιτική έχει οριστεί ως ψευδής, οι πληροφορίες περιόδου kiosk δεν θα αναφέρονται. Εάν έχει οριστεί ως αληθής ή δεν έχει οριστεί, οι πληροφορίες περιόδου kiosk θα αναφέρονται.</translation> -<translation id="3852924591079583104"> - Αυτή η πολιτική, όταν οριστεί σε ArcSession, επιβάλλει την επανεκκίνηση της συσκευής κατά την αποσύνδεση του χρήστη, εάν έχει ξεκινήσει το Android. - Όταν οριστεί σε Πάντα, επιβάλλει την επανεκκίνηση της συσκευής σε κάθε αποσύνδεση του χρήστη. - Εάν δεν οριστεί, τότε δεν εφαρμόζεται και δεν επιβάλλει επανεκκίνηση κατά την αποσύνδεση του χρήστη. Το ίδιο ισχύει και εάν οριστεί σε Ποτέ. - </translation> <translation id="3858658082795336534">Προεπιλεγμένη λειτουργία εκτύπωσης διπλής όψης</translation> <translation id="3859780406608282662">Προσθήκη μιας παραμέτρου στην ανάκτηση εισαγωγής Παραλλαγών στο <ph name="PRODUCT_OS_NAME" />. @@ -1867,6 +1863,15 @@ Αυτή η πολιτική εφαρμόζεται μόνο εάν έχει ενεργοποιηθεί η πολιτική "DefaultSearchProviderEnabled".</translation> <translation id="4285674129118156176">Να επιτρέπεται στους μη συγγενικούς χρήστες να χρησιμοποιούν το ARC</translation> +<translation id="4289903996435140853">Σας επιτρέπει να ορίσετε μια λίστα URL που καθορίζει τους ιστοτόπους στους οποίους θα παραχωρείται αυτόματα άδεια πρόσβασης σε μια συσκευή USB με το δεδομένο αναγνωριστικό προμηθευτή και προϊόντος. Κάθε στοιχείο στη λίστα θα πρέπει να περιέχει και τις συσκευές και τα URL προκειμένου να είναι έγκυρη η πολιτική. Κάθε στοιχείο στις συσκευές μπορεί να περιέχει πεδίο αναγνωριστικού προμηθευτή και αναγνωριστικού προϊόντος. Οποιοδήποτε αναγνωριστικό που παραλείπεται αντιμετωπίζεται ως χαρακτήρας μπαλαντέρ με την εξαίρεση το ότι δεν μπορεί να οριστεί αναγνωριστικό προϊόντος χωρίς να καθοριστεί επίσης αναγνωριστικό προμηθευτή. Διαφορετικά, η πολιτική δεν θα είναι έγκυρη και θα γίνεται παράβλεψή της + + Το μοντέλο αδειών USB χρησιμοποιεί το URL του ιστοτόπου που υποβάλει το αίτημα ("αιτούν URL") και το URL του ιστοτόπου πλαισίου ανώτατου επιπέδου ("URL ενσωμάτωσης") για τη χορήγηση άδειας στο URL που υποβάλει το αίτημα για πρόσβαση στη συσκευή USB. Το URL που υποβάλει το αίτημα μπορεί να είναι διαφορετικό από το URL ενσωμάτωσης όταν ο ιστότοπος που υποβάλει το αίτημα φορτώνεται σε ένα iframe. Συνεπώς, το πεδίο "URL" μπορεί να περιέχει έως και δύο συμβολοσειρές URL διαχωρισμένες με κόμμα για τον καθορισμό του αιτούντος URL και του URL ενσωμάτωσης αντίστοιχα. Εάν καθοριστεί μόνο ένα URL, τότε η πρόσβαση στις αντίστοιχες συσκευές USB θα παραχωρείται όταν το URL του ιστοτόπου που υποβάλει το αίτημα αντιστοιχεί σε αυτό URL ανεξάρτητα από την κατάσταση ενσωμάτωσης. Τα URL στο πεδίο "URL" θα πρέπει να αποτελούν έγκυρα URL, διαφορετικά θα γίνει παράβλεψη της πολιτικής. + + Εάν αυτή η πολιτική δεν οριστεί, η καθολική προεπιλεγμένη τιμή θα χρησιμοποιείται για όλους τους ιστοτόπους είτε από την πολιτική "DefaultWebUsbGuardSetting", εφόσον έχει οριστεί, είτε από την προσωπική διαμόρφωση του χρήστη σε διαφορετική περίπτωση. + + Τα μοτίβα URL σε αυτήν την πολιτική δεν θα πρέπει να έρχονται σε διένεξη με αυτά που έχουν διαμορφωθεί μέσω του WebUsbBlockedForUrls. Σε περίπτωση διένεξης, αυτή η πολιτική θα έχει προτεραιότητα σε σχέση με τις πολιτικές WebUsbBlockedForUrls και WebUsbAskForUrls + + Οι τιμές για αυτήν την πολιτική και την πολιτική WebUsbAllowDevicesForUrls συγχωνεύονται.</translation> <translation id="4298509794364745131">Ορίζει τη λίστα των εφαρμογών που μπορούν να ενεργοποιηθούν ως εφαρμογή σημειώσεων στο κλείδωμα οθόνης του <ph name="PRODUCT_OS_NAME" />. Εάν η προτιμώμενη εφαρμογή σημειώσεων ενεργοποιηθεί στο κλείδωμα οθόνης, το τελευταίο θα περιέχει στοιχείο διεπαφής χρήστη για την εκκίνηση της προτιμώμενης εφαρμογής σημειώσεων. @@ -2018,6 +2023,7 @@ <translation id="4639407427807680016">Ονόματα των εγγενών κεντρικών υπολογιστών ανταλλαγής μηνυμάτων για εξαίρεση από τη μαύρη λίστα</translation> <translation id="4650759511838826572">Απενεργοποίηση συνδυασμών πρωτοκόλλου διεύθυνσης URL</translation> <translation id="465099050592230505">URL διαδικτυακού αποθηκευτικού χώρου επιχείρησης (καταργήθηκε)</translation> +<translation id="4661889655253181651">Οι ρυθμίσεις περιεχομένου σάς επιτρέπουν να καθορίσετε τον τρόπο διαχείρισης ενός συγκεκριμένου τύπου περιεχομένων (για παράδειγμα, για cookie ή JavaScript).</translation> <translation id="4665897631924472251">Επέκταση ρυθμίσεων διαχείρισης</translation> <translation id="4668325077104657568">Προεπιλεγμένες ρυθμίσεις εικόνων</translation> <translation id="4670865688564083639">Ελάχιστο:</translation> @@ -2062,6 +2068,11 @@ Αυτές οι προτάσεις ανακτώνται απομακρυσμένα από τους διακομιστές της Google. Εάν αυτή η ρύθμιση οριστεί ως ψευδής, δεν θα ανακτώνται και δεν θα προβάλλονται προτάσεις.</translation> +<translation id="4759650396863318477">Σας επιτρέπει να ορίσετε τη χρονική περίοδο, σε χιλιοστά του δευτερολέπτου, κατά την οποία οι χρήστες ειδοποιούνται ότι θα πρέπει να γίνει επανεκκίνηση του <ph name="PRODUCT_NAME" /> ή επανεκκίνηση της συσκευής <ph name="PRODUCT_OS_NAME" /> για την εφαρμογή της ενημέρωσης που εκκρεμεί. + + Κατά τη διάρκεια αυτής της χρονικής περιόδου, ο χρήστης θα ενημερώνεται επανειλημμένως ότι απαιτείται ενημέρωση. Για συσκευές <ph name="PRODUCT_OS_NAME" /> εμφανίζεται μια ειδοποίηση επανεκκίνησης στην περιοχή ειδοποιήσεων, συμφωνα με την πολιτική <ph name="RELAUNCH_HEADS_UP_PERIOD_POLICY_NAME" />. Για προγράμματα περιήγησης <ph name="PRODUCT_NAME" /> το μενού εφαρμογών αλλάζει για να υποδείξει ότι απαιτείται επανεκκίνηση μόλις παρέλθει το ένα τρίτο της περιόδου ειδοποίησης. Αυτή η ειδοποίηση αλλάζει χρώμα μόλις παρέλθουν τα δύο τρίτα της περιόδου ειδοποίησης και έπειτα αλλάζει χρώμα ξανά μόλις παρέλθει η πλήρης περίοδος ειδοποίησης. Οι επιπλέον ειδοποιήσεις που ενεργοποιούνται από την πολιτική <ph name="RELAUNCH_NOTIFICATION_POLICY_NAME" /> ακολουθούν το ίδιο χρονοδιάγραμμα. + + Εάν δεν οριστεί, η προεπιλεγμένη περίοδος των 345.600.000 χιλιοστών του δευτερολέπτου (τέσσερις ημέρες) χρησιμοποιείται για συσκευές <ph name="PRODUCT_OS_NAME" /> και η περίοδος των 604.800.000 χιλιοστών του δευτερολέπτου (μία εβδομάδα) χρησιμοποιείται για <ph name="PRODUCT_NAME" />.</translation> <translation id="4788252609789586009">Ενεργοποιεί τη λειτουργία Αυτόματης Συμπλήρωσης του <ph name="PRODUCT_NAME" /> και επιτρέπει στους χρήστες την αυτόματη συμπλήρωση στοιχείων πιστωτικών καρτών σε φόρμες ιστού με χρήση πληροφοριών που αποθηκεύτηκαν στο παρελθόν. Εάν αυτή η ρύθμιση απενεργοποιηθεί, η Αυτόματη Συμπλήρωση δεν θα προτείνει ποτέ ή δεν θα συμπληρώνει τα στοιχεία των πιστωτικών καρτών, ούτε θα αποθηκεύει επιπλέον στοιχεία πιστωτικών καρτών που μπορεί να υποβάλει ο χρήστης κατά την περιήγηση στον ιστό. @@ -2271,6 +2282,15 @@ Αν αυτή η πολιτική δεν οριστεί θα χρησιμοποιηθεί η καθολική προεπιλεγμένη τιμή για όλους τους ιστότοπους είτε από την πολιτική ''DefaultNotificationsSetting'' εφόσον οριστεί, είτε από την προσωπική διαμόρφωση του χρήστη.</translation> <translation id="5213038356678567351">Ιστότοποι που δεν θα πρέπει να ενεργοποιούν ποτέ την εναλλαγή προγράμματος περιήγησης.</translation> <translation id="5219844027738217407">Για τις εφαρμογές Android, αυτή η πολιτική επηρεάζει μόνο το μικρόφωνο. Όταν αυτή η πολιτική ορίζεται αληθής, το μικρόφωνο τίθεται σε σίγαση για όλες τις εφαρμογές Android, χωρίς εξαίρεση.</translation> +<translation id="5221394278852982313">Σας επιτρέπει να ορίσετε μια λίστα URL που καθορίζει τους ιστοτόπους στους οποίους θα παραχωρείται αυτόματα άδεια πρόσβασης σε μια συσκευή USB με το δεδομένο αναγνωριστικό προμηθευτή και προϊόντος. Κάθε στοιχείο στη λίστα θα πρέπει να περιέχει και τις συσκευές και τα URL προκειμένου να είναι έγκυρη η πολιτική. Κάθε στοιχείο στις συσκευές μπορεί να περιέχει πεδίο αναγνωριστικού προμηθευτή και αναγνωριστικού προϊόντος. Οποιοδήποτε αναγνωριστικό που παραλείπεται αντιμετωπίζεται ως χαρακτήρας μπαλαντέρ με την εξαίρεση το ότι δεν μπορεί να οριστεί αναγνωριστικό προϊόντος χωρίς να καθοριστεί επίσης αναγνωριστικό προμηθευτή. Διαφορετικά, η πολιτική δεν θα είναι έγκυρη και θα γίνεται παράβλεψή της + + Το μοντέλο αδειών USB χρησιμοποιεί το URL του ιστοτόπου που υποβάλει το αίτημα ("αιτούν URL") και το URL του ιστοτόπου πλαισίου ανώτατου επιπέδου ("URL ενσωμάτωσης") για τη χορήγηση άδειας στο URL που υποβάλει το αίτημα για πρόσβαση στη συσκευή USB. Το URL που υποβάλει το αίτημα μπορεί να είναι διαφορετικό από το URL ενσωμάτωσης όταν ο ιστότοπος που υποβάλει το αίτημα φορτώνεται σε ένα iframe. Συνεπώς, το πεδίο "URL" μπορεί να περιέχει έως και δύο συμβολοσειρές URL διαχωρισμένες με κόμμα για τον καθορισμό του αιτούντος URL και του URL ενσωμάτωσης αντίστοιχα. Εάν καθοριστεί μόνο ένα URL, τότε η πρόσβαση στις αντίστοιχες συσκευές USB θα παραχωρείται όταν το URL του ιστοτόπου που υποβάλει το αίτημα αντιστοιχεί σε αυτό URL ανεξάρτητα από την κατάσταση ενσωμάτωσης. Τα URL στο πεδίο "URL" θα πρέπει να αποτελούν έγκυρα URL, διαφορετικά θα γίνει παράβλεψη της πολιτικής. + + Εάν αυτή η πολιτική δεν οριστεί, η καθολική προεπιλεγμένη τιμή θα χρησιμοποιείται για όλους τους ιστοτόπους είτε από την πολιτική "DefaultWebUsbGuardSetting", εφόσον έχει οριστεί, είτε από την προσωπική διαμόρφωση του χρήστη σε διαφορετική περίπτωση. + + Τα μοτίβα URL σε αυτήν την πολιτική δεν θα πρέπει να έρχονται σε διένεξη με αυτά που έχουν διαμορφωθεί μέσω του WebUsbBlockedForUrls. Σε περίπτωση διένεξης, αυτή η πολιτική θα έχει προτεραιότητα σε σχέση με τις πολιτικές WebUsbBlockedForUrls και WebUsbAskForUrls + + Οι τιμές για αυτήν την πολιτική και την πολιτική DeviceWebUsbAllowDevicesForUrls συγχωνεύονται.</translation> <translation id="5228316810085661003">Η καθυστέρηση αυτόματης σύνδεσης τοπικού λογαριασμού συσκευής. Εάν η πολιτική |DeviceLocalAccountAutoLoginId| δεν οριστεί, αυτή η πολιτική δεν έχει κάποια επίπτωση. Διαφορετικά: @@ -3011,6 +3031,21 @@ Αν αυτή η πολιτική έχει ρυθμιστεί σε "Να μην επιτρέπεται η διαχείριση των πιστοποιητικών από τους χρήστες", οι χρήστες δεν θα μπορούν να διαχειρίζονται τα πιστοποιητικά, αλλά μόνο να τα βλέπουν.</translation> <translation id="6573305661369899995">Ορισμός εξωτερικής πήγης περιορισμών URL</translation> +<translation id="6583851521569686409">Διαμορφώνει μια λίστα εκτυπωτών. + + Αυτή η πολιτική επιτρέπει στους διαχειριστές να παρέχουν διαμορφώσεις εκτυπωτή για + τους χρήστες τους. + + Τα <ph name="PRINTER_DISPLAY_NAME" /> και <ph name="PRINTER_DESCRIPTION" /> είναι συμβολοσειρές ελεύθερης μορφής που μπορούν να προσαρμοστούν για διευκόλυνση της επιλογής εκτυπωτή Τα <ph name="PRINTER_MANUFACTURER" /> και <ph name="PRINTER_MODEL" /> διευκολύνουν την αναγνώριση των εκτυπωτών από τους τελικούς χρήστες. Αντιπροσωπεύουν τον κατασκευαστή και το μοντέλο του εκτυπωτή. Το <ph name="PRINTER_URI" /> θα πρέπει να είναι διεύθυνση προσβάσιμη από υπολογιστή-πελάτη, συμπεριλαμβανομένων των <ph name="URI_SCHEME" />, <ph name="URI_PORT" /> και <ph name="URI_QUEUE" />. Το <ph name="PRINTER_UUID" /> είναι προαιρετικό. Εάν παρέχεται, χρησιμοποιείται για τη διευκόλυνση της κατάργησης διπλοτύπων εκτυπωτών <ph name="ZEROCONF_DISCOVERY" />. + + Θα πρέπει είτε το <ph name="PRINTER_EFFECTIVE_MODEL" /> να περιέχει το όνομα του εκτυπωτή ή το <ph name="PRINTER_AUTOCONF" /> να οριστεί ως αληθές. Οι εκτυπωτές που διαθέτουν και τα δύο ή που δεν διαθέτουν καθόλου ιδιότητες θα αγνοούνται. + + Η ρύθμιση εκτυπωτή ολοκληρώνεται με την πρώτη χρήση του εκτυπωτή. Δεν γίνεται λήψη των PPD μέχρι να χρησιμοποιηθεί ο εκτυπωτής. Μόλις συμβεί αυτό, θα αποθηκευτούν στην κρυφή μνήμη τα PPD που χρησιμοποιούνται συχνά. + + Αυτή η πολιτική δεν επηρεάζει τη δυνατότητα των χρηστών να διαμορφώσουν εκτυπωτές σε μεμονωμένες συσκευές. Προορίζεται να είναι συμπληρωματική στη διαμόρφωση των εκτυπωτών από μεμονωμένους χρήστες. + + Για συσκευές διαχειριζόμενες μέσω Active Directory, αυτή η πολιτική υποστηρίζει την επέκταση του <ph name="MACHINE_NAME_VARIABLE" /> στο όνομα υπολογιστή Active Directory ή σε ένα από τα τμήματα συμβολοσειράς του. Για παράδειγμα, αν το όνομα υπολογιστή είναι <ph name="MACHINE_NAME_EXAMPLE" />, τότε το <ph name="MACHINE_NAME_VARIABLE_EXAMPLE" /> θα αντικατασταθεί με τους 4 χαρακτήρες που ξεκινούν μετά την 6η θέση, δηλ. <ph name="MACHINE_NAME_PART_EXAMPLE" />. Έχετε υπόψη σας ότι η θέση έχει βάση το μηδέν. + </translation> <translation id="6598235178374410284">Εικόνα άβαταρ χρήστη</translation> <translation id="6603004149426829878">Να αποστέλλονται πάντα τυχόν διαθέσιμα σήματα τοποθεσίας στον διακομιστή κατά την επίλυση της ζώνης ώρας</translation> <translation id="6628120204569232711">Αναφορά κατάστασης αποθηκευτικού χώρου</translation> @@ -3467,7 +3502,6 @@ Εάν αυτή η πολιτική οριστεί ως "RemoveLRUIfDormant", η αυτόματη διαγραφή θα εξακολουθήσει να καταργεί χρήστες που δεν έχουν συνδεθεί κατά το διάστημα των τελευταίων 3 μηνών ξεκινώντας από αυτούς που συνδέθηκαν πιο παλιά, μέχρι να διατεθεί αρκετός ελεύθερος χώρος. Εάν αυτή η πολιτική δεν έχει οριστεί, η αυτόματη διαγραφή χρησιμοποιεί την προεπιλεγμένη ενσωματωμένη στρατηγική. Προς το παρόν, χρησιμοποιείται η στρατηγική "RemoveLRUIfDormant".</translation> -<translation id="7334274148831027933">Ενεργοποίηση μεγεθυντικού φακού σε παράθυρο</translation> <translation id="7336785017449297672">Ελέγχει τις ρυθμίσεις ρολογιού και ζώνης ώρας.</translation> <translation id="7336878834592315572">Διατήρηση cookie για τη διάρκεια της περιόδου σύνδεσης</translation> <translation id="7339315111520512972">Να επιβάλλεται η εκτέλεση του κώδικα δικτύωσης στη διεργασία του προγράμματος περιήγησης</translation> @@ -4378,6 +4412,8 @@ <translation id="915194831143859291">Αν αυτή η πολιτική οριστεί σε "False" ή αν δεν οριστεί, το <ph name="PRODUCT_OS_NAME" /> θα επιτρέπει στο χρήστη να κλείνει τη συσκευή. Αν αυτή η πολιτική οριστεί σε "True", το <ph name="PRODUCT_OS_NAME" /> θα εκτελεί επανεκκίνηση, όταν ο χρήστης κλείνει τη συσκευή. Το <ph name="PRODUCT_OS_NAME" /> αντικαθιστά όλες τις εμφανίσεις των κουμπιών τερματισμού λειτουργίας στη διεπαφή χρήστη με κουμπιά επανεκκίνησης. Αν ο χρήστης κλείσει τη συσκευή χρησιμοποιώντας το κουμπί λειτουργίας, δεν θα γίνει αυτόματη επανεκκίνηση, ακόμη και αν η πολιτική είναι ενεργοποιημένη.</translation> <translation id="9152473318295429890">Ενεργοποίηση προτάσεων για σχετικές ιστοσελίδες βάσει περιβάλλοντος</translation> +<translation id="9153446010242995516">Κάντε επαναφορά έκδοσης και μείνετε στην έκδοση προορισμού εάν η έκδοση του λειτουργικού συστήματος είναι νεότερη από την έκδοση προορισμού. Δοκιμάστε να μεταφέρετε τη διαμόρφωση σε επίπεδο συσκευής (συμπεριλαμβανομένων των διαπιστευτηρίων δικτύου) μέσω της διαδικασίας επαναφοράς, εάν είναι δυνατό, αλλά εκτελέστε την επαναφορά έκδοσης με πλήρες powerwash, ακόμα και εάν δεν είναι δυνατή η επαναφορά των δεδομένων (επειδή η έκδοση προορισμού δεν υποστηρίζει την επαναφορά δεδομένων ή εξαιτίας κάποιας αλλαγής που δεν είναι συμβατή με μετάβαση σε προηγούμενη έκδοση). + Υποστηρίζεται στην έκδοση 75 του <ph name="PRODUCT_OS_NAME" /> και σε νεότερες εκδόσεις. Για παλαιότερες εφαρμογές πελάτες, αυτή η τιμή σημαίνει ότι η επαναφορά έκδοσης είναι απενεργοποιημένη.</translation> <translation id="9158929520101169054">Να επιτρέπεται η σύνδεση σε πολλούς λογαριασμούς στο πρόγραμμα περιήγησης</translation> <translation id="9159126470527871268">Ειδοποιήστε τους χρήστες ότι θα πρέπει να γίνει επανεκκίνηση του προϊόντος <ph name="PRODUCT_NAME" /> ή του προϊόντος <ph name="PRODUCT_OS_NAME" />, προκειμένου να εφαρμοστεί μια ενημέρωση που είναι σε εκκρεμότητα.
diff --git a/components/policy/resources/policy_templates_en-GB.xtb b/components/policy/resources/policy_templates_en-GB.xtb index 32e35e4..96f383b 100644 --- a/components/policy/resources/policy_templates_en-GB.xtb +++ b/components/policy/resources/policy_templates_en-GB.xtb
@@ -144,15 +144,6 @@ If the policy is set to false, the state of the dev switch will not be reported.</translation> <translation id="1160479894929412407">Allow QUIC protocol</translation> <translation id="1160939557934457296">Disable proceeding from the Safe Browsing warning page</translation> -<translation id="1171342272070128466">Enable the docked magnifier accessibility feature. - - If this policy is set to true, the docked magnifier will always be enabled. - - If this policy is set to false, the docked magnifier will always be disabled. - - If you set this policy, users cannot change or override it. - - If this policy is left unset, the docked magnifier is disabled initially but can be enabled by the user at any time.</translation> <translation id="1189817621108632689">Allows you to set a list of URL patterns that specify sites which are not allowed to display images. If this policy is left not set, the global default value will be used for all sites, either from the 'DefaultImagesSetting' policy if it is set, or from the user's personal configuration. @@ -1141,6 +1132,15 @@ When this policy is unset, behaviour of the more specific policies remains unaffected.</translation> <translation id="2987155890997901449">Enable ARC</translation> <translation id="2987227569419001736">Control use of the Web Bluetooth API</translation> +<translation id="2990018289267778247">If this policy is set to true, Accessibility options always appear in system tray menu. + + If this policy is set to false, Accessibility options never appear in system tray menu. + + If you set this policy, users cannot change or override it. + + If this policy is left unset, Accessibility options will not appear in the system tray menu, but the user can cause the Accessibility options to appear via the Settings page. + + When accessibility features are enabled (by other means, e.g. by a key combination), Accessibility options will always appear in system tray menu.</translation> <translation id="3011301228198307065">Configures the default homepage URL in <ph name="PRODUCT_NAME" /> and prevents users from changing it. The homepage is the page opened by the Home button. The pages that open on start-up are controlled by the RestoreOnStartup policies. @@ -1461,6 +1461,7 @@ This policy is used by machine scope cloud policy enrolment on desktop and can be set by Registry or GPO on Windows, plist on Mac and JSON policy file on Linux.</translation> <translation id="3660562134618097814">Transfer SAML IdP cookies during login</translation> <translation id="3701121231485832347">Controls settings specific to <ph name="MS_AD_NAME" />-managed <ph name="PRODUCT_OS_NAME" /> devices.</translation> +<translation id="3702518095257671450">Remote attestation</translation> <translation id="3702647575225525306"><ph name="POLICY_NAME" /> (The single-line field is deprecated and will be removed in the future. Please start using the multi-line text box below.)</translation> <translation id="3709266154059827597">Configure extension installation blacklist</translation> <translation id="3711895659073496551">Suspend</translation> @@ -1573,11 +1574,6 @@ If the policy is set to false, the kiosk session information will not be reported. If set to true or left unset, kiosk session information will be reported.</translation> -<translation id="3852924591079583104"> - This policy, when set to ArcSession, forces the device to reboot when a user signs out if Android has started. - When set to Always, it forces the device to reboot on every user sign-out. - If left unset, it has no effect and no reboot is forced on user sign-out. The same applies if set to Never. - </translation> <translation id="3858658082795336534">Default printing duplex mode</translation> <translation id="3859780406608282662">Add a parameter to the fetching of the Variations seed in <ph name="PRODUCT_OS_NAME" />. @@ -1863,6 +1859,15 @@ This policy is only respected if the 'DefaultSearchProviderEnabled' policy is enabled.</translation> <translation id="4285674129118156176">Allow unaffiliated users to use ARC</translation> +<translation id="4289903996435140853">Allows you to set a list of URLs that specify which sites will automatically be granted permission to access a USB device with the given vendor and product IDs. Each item in the list must contain both devices and URLs in order for the policy to be valid. Each item in devices can contain a vendor ID and product ID field. Any ID that is omitted is treated as a wildcard with one exception, and that exception is that a product ID cannot be specified without a vendor ID also being specified. Otherwise, the policy will not be valid and will be ignored. + + The USB permission model uses the URL of the requesting site ('requesting URL') and the URL of the top-level frame site ('embedding URL') to grant permission to the requesting URL to access the USB device. The requesting URL may be different from the embedding URL when the requesting site is loaded in an iframe. Therefore, the 'URLs' field can contain up to two URL strings delimited by a comma to specify the requesting and embedding URL respectively. If only one URL is specified, then access to the corresponding USB devices will be granted when the requesting site's URL matches this URL regardless of embedding status. The URLs in 'URLs' must be valid URLs, otherwise the policy will be ignored. + + If this policy is left not set, the global default value will be used for all sites either from the 'DefaultWebUsbGuardSetting' policy if it is set, or the user's personal configuration otherwise. + + URL patterns in this policy should not clash with the ones configured via WebUsbBlockedForUrls. If there is a clash, this policy will take precedence over WebUsbBlockedForUrls and WebUsbAskForUrls. + + Values for this policy and the WebUsbAllowDevicesForUrls policy are merged together.</translation> <translation id="4298509794364745131">Specifies list of apps that can be enabled as a note-taking app on the <ph name="PRODUCT_OS_NAME" /> lock screen. If the preferred note-taking app is enabled on the lock screen, the lock screen will contain UI element for launching the preferred note taking app. @@ -2014,6 +2019,7 @@ <translation id="4639407427807680016">Names of the native messaging hosts to be exempt from the blacklist</translation> <translation id="4650759511838826572">Disable URL protocol schemes</translation> <translation id="465099050592230505">Enterprise web store URL (deprecated)</translation> +<translation id="4661889655253181651">Content settings allow you to specify how contents of a specific type (for example Cookies, Images or JavaScript) are handled.</translation> <translation id="4665897631924472251">Extension management settings</translation> <translation id="4668325077104657568">Default images setting</translation> <translation id="4670865688564083639">Minimum:</translation> @@ -2058,6 +2064,11 @@ These suggestions are fetched remotely from Google servers. If this setting is set to false, suggestions will not be fetched or displayed.</translation> +<translation id="4759650396863318477">Allows you to set the time period, in milliseconds, over which users are notified that <ph name="PRODUCT_NAME" /> must be relaunched or that a <ph name="PRODUCT_OS_NAME" /> device must be restarted to apply a pending update. + + Over this time period, the user will be repeatedly informed of the need for an update. For <ph name="PRODUCT_OS_NAME" /> devices, a restart notification appears in the system tray according to the <ph name="RELAUNCH_HEADS_UP_PERIOD_POLICY_NAME" /> policy. For <ph name="PRODUCT_NAME" /> browsers, the app menu changes to indicate that a relaunch is needed once one third of the notification period passes. This notification changes colour once two thirds of the notification period passes, and again once the full notification period has passed. The additional notifications enabled by the <ph name="RELAUNCH_NOTIFICATION_POLICY_NAME" /> policy follow this same schedule. + + If not set, the default period of 345600000 milliseconds (four days) is used for <ph name="PRODUCT_OS_NAME" /> devices and 604800000 milliseconds (one week) for <ph name="PRODUCT_NAME" />.</translation> <translation id="4788252609789586009">Enables <ph name="PRODUCT_NAME" />'s Auto-Fill feature and allows users to auto-complete credit card information in web forms using previously stored information. If this setting is disabled, Auto-fill will never suggest or fill in credit card information, nor will it save additional credit card information that the user might submit while browsing the web. @@ -2267,6 +2278,15 @@ If this policy is left unset the global default value will be used for all sites either from the 'DefaultNotificationsSetting' policy, if it is set, or the user's personal configuration otherwise.</translation> <translation id="5213038356678567351">Websites that should never trigger a browser switch.</translation> <translation id="5219844027738217407">For Android apps, this policy affects the microphone only. When this policy is set to true, the microphone is muted for all Android apps, with no exceptions.</translation> +<translation id="5221394278852982313">Allows you to set a list of URLs that specify which sites will automatically be granted permission to access a USB device with the given vendor and product IDs. Each item in the list must contain both devices and URLs in order for the policy to be valid. Each item in devices can contain a vendor ID and product ID field. Any ID that is omitted is treated as a wildcard with one exception, and that exception is that a product ID cannot be specified without a vendor ID also being specified. Otherwise, the policy will not be valid and will be ignored. + + The USB permission model uses the URL of the requesting site ('requesting URL') and the URL of the top-level frame site ('embedding URL') to grant permission to the requesting URL to access the USB device. The requesting URL may be different from the embedding URL when the requesting site is loaded in an iframe. Therefore, the 'URLs' field can contain up to two URL strings delimited by a comma to specify the requesting and embedding URL respectively. If only one URL is specified, then access to the corresponding USB devices will be granted when the requesting site's URL matches this URL regardless of embedding status. The URLs in 'URLs' must be valid URLs, otherwise the policy will be ignored. + + If this policy is left not set, the global default value will be used for all sites either from the 'DefaultWebUsbGuardSetting' policy if it is set, or the user's personal configuration otherwise. + + URL patterns in this policy should not clash with the ones configured via WebUsbBlockedForUrls. If there is a clash, this policy will take precedence over WebUsbBlockedForUrls and WebUsbAskForUrls. + + Values for this policy and the DeviceWebUsbAllowDevicesForUrls policy are merged together.</translation> <translation id="5228316810085661003">The device-local account auto-login delay. If the |DeviceLocalAccountAutoLoginId| policy is unset, this policy has no effect. Otherwise: @@ -3000,6 +3020,20 @@ If this policy is set to 'Disallow users to manage certificates', users will not be able to manage certificates, they can only view certificates.</translation> <translation id="6573305661369899995">Set an external source of URL restrictions</translation> +<translation id="6583851521569686409">Configures a list of printers. + + This policy allows administrators to provide printer configurations for their users. + + <ph name="PRINTER_DISPLAY_NAME" /> and <ph name="PRINTER_DESCRIPTION" /> are free-form strings that can be customised for ease of printer selection. <ph name="PRINTER_MANUFACTURER" /> and <ph name="PRINTER_MODEL" /> serve to ease printer identification by end users. They represent the manufacturer and model of the printer. <ph name="PRINTER_URI" /> should be an address reachable from a client computer including the <ph name="URI_SCHEME" />, <ph name="URI_PORT" /> and <ph name="URI_QUEUE" />. <ph name="PRINTER_UUID" /> is optional. If provided, it is used to help de-duplicate <ph name="ZEROCONF_DISCOVERY" /> printers. + + Either <ph name="PRINTER_EFFECTIVE_MODEL" /> should contain the name of the printer or <ph name="PRINTER_AUTOCONF" /> should be set to true. The printers with both or without any properties will be ignored. + + Printer setup is completed upon the first use of a printer. PPDs are not downloaded until the printer is used. After that time, frequently used PPDs are cached. + + This policy has no effect on whether users can configure printers on individual devices. It is intended to be supplementary to the configuration of printers by individual users. + + For Active Directory managed devices this policy supports expansion of <ph name="MACHINE_NAME_VARIABLE" /> to the Active Directory machine name or a substring of it. For example, if the machine name is <ph name="MACHINE_NAME_EXAMPLE" />, then <ph name="MACHINE_NAME_VARIABLE_EXAMPLE" /> would be replaced by the four characters starting after the sixth position, i.e. <ph name="MACHINE_NAME_PART_EXAMPLE" />. Note that the position is zero-based. + </translation> <translation id="6598235178374410284">User avatar image</translation> <translation id="6603004149426829878">Always send any available location signals to the server while resolving time zone</translation> <translation id="6628120204569232711">Report storage status</translation> @@ -3455,7 +3489,6 @@ If this policy is set to 'RemoveLRUIfDormant', the automatic clean-up will keep removing users who have not logged in for at least 3 months in least-recently-logged-in order until there is enough free space. If this policy is not set, automatic clean-up uses the default built-in strategy. Currently, it is the 'RemoveLRUIfDormant' strategy.</translation> -<translation id="7334274148831027933">Enable docked magnifier</translation> <translation id="7336785017449297672">Controls clock and time zone settings.</translation> <translation id="7336878834592315572">Keep cookies for the duration of the session.</translation> <translation id="7339315111520512972">Force networking code to run in the browser process</translation> @@ -4366,6 +4399,8 @@ <translation id="915194831143859291">If this policy is set to false or not configured, <ph name="PRODUCT_OS_NAME" /> will allow the user to shut down the device. If this policy is set to true, <ph name="PRODUCT_OS_NAME" /> will trigger a reboot when the user shuts down the device. <ph name="PRODUCT_OS_NAME" /> replaces all occurrences of shutdown buttons in the UI by reboot buttons. If the user shuts down the device using the power button, it will not automatically reboot, even if the policy is enabled.</translation> <translation id="9152473318295429890">Enable contextual suggestions of related web pages</translation> +<translation id="9153446010242995516">Roll back and stay on target version if OS version is newer than target. Try to carry over device-level configuration (including network credentials) through the rollback process, if possible, but do the rollback with full powerwash even if restoring the data is not possible (because the target version doesn't support restoring data or because of a backward-incompatible change). + Supported on <ph name="PRODUCT_OS_NAME" /> version 75 and higher. For older clients, this value means that rollback is disabled.</translation> <translation id="9158929520101169054">Allow Multiple Sign-in Within the Browser</translation> <translation id="9159126470527871268">Notify users that <ph name="PRODUCT_NAME" /> must be relaunched or <ph name="PRODUCT_OS_NAME" /> must be restarted to apply a pending update.
diff --git a/components/policy/resources/policy_templates_es-419.xtb b/components/policy/resources/policy_templates_es-419.xtb index 0a70400..999181ae 100644 --- a/components/policy/resources/policy_templates_es-419.xtb +++ b/components/policy/resources/policy_templates_es-419.xtb
@@ -142,15 +142,6 @@ Si esta política se establece en "False", no se informará sobre el estado del conmutador de dispositivo.</translation> <translation id="1160479894929412407">Permitir el protocolo QUIC</translation> <translation id="1160939557934457296">Inhabilita continuar desde la página de advertencia de Navegación segura.</translation> -<translation id="1171342272070128466">Habilita la función de accesibilidad de la lupa con vista acoplada. - - Si se establece esta política como verdadera, la lupa con vista acoplada estará siempre habilitada. - - Si se establece como falsa, la lupa estará siempre inhabilitada. - - Si la estableces, los usuarios no podrán cambiarla ni anularla. - - Si no la estableces, la lupa estará inicialmente inhabilitada, pero el usuario podrá habilitarla en cualquier momento.</translation> <translation id="1189817621108632689">Te permite configurar una lista de patrones de URL con los sitios no autorizados para mostrar imágenes. Si esta política no se configura, se usará el valor global predeterminado para todos los sitios ya sea de la política "DefaultImagesSetting" (si se establece) o la configuración personal del usuario. @@ -1534,11 +1525,6 @@ Si la política se establece como falsa, no se informarán los datos de la sesión del kiosco. Si se establece como verdadera o no se establece, se informarán los datos de la sesión del kiosco.</translation> -<translation id="3852924591079583104"> - Si se establece en ArcSession, esta política forzará el reinicio del dispositivo después de que el usuario salga de su cuenta en el caso de que se inicie Android. - Si se establece en Siempre, forzará el reinicio del dispositivo cada vez que el usuario salga de su cuenta. - Si no se establece, no tendrá ningún efecto y no se reiniciará el dispositivo cuando el usuario salga de su cuenta. El efecto es el mismo si se establece en Nunca. - </translation> <translation id="3858658082795336534">Modo predeterminado de impresión doble</translation> <translation id="3859780406608282662">Permite agregar un parámetro para la obtención del valor de inicialización de variaciones en <ph name="PRODUCT_OS_NAME" />. @@ -3358,7 +3344,6 @@ Si se establece el valor "RemoveLRUIfDormant" en esta política, el proceso de limpieza automática seguirá eliminando usuarios que no hayan accedido durante al menos 3 meses, empezando por quienes hayan accedido por última vez hace más tiempo hasta que se libere espacio suficiente. Si esta política no se establece, la limpieza automática utilizará la estrategia integrada predeterminada, que actualmente es "RemoveLRUIfDormant".</translation> -<translation id="7334274148831027933">Habilitar lupa con vista acoplada</translation> <translation id="7336785017449297672">Controla la configuración del reloj y la zona horaria.</translation> <translation id="7336878834592315572">Guardar las cookies durante la sesión</translation> <translation id="7339315111520512972">Forzar el código de red para que se ejecute en el proceso de navegación</translation>
diff --git a/components/policy/resources/policy_templates_es.xtb b/components/policy/resources/policy_templates_es.xtb index 34e744d7..91a9503f 100644 --- a/components/policy/resources/policy_templates_es.xtb +++ b/components/policy/resources/policy_templates_es.xtb
@@ -142,15 +142,6 @@ Si esta política se establece en False, no se informará sobre el estado del conector de modo de desarrollador.</translation> <translation id="1160479894929412407">Permitir protocolo QUIC</translation> <translation id="1160939557934457296">Inhabilitar seguir navegando desde la página de advertencia sobre Navegación Segura</translation> -<translation id="1171342272070128466">Habilita la función de accesibilidad de lupa fijada. - - Si se le asigna el valor "True" a esta política, la lupa fijada siempre estará habilitada. - - Si se le asigna el valor "False" a esta política, la lupa fijada siempre estará inhabilitada. - - Si asignas un valor a esta política, los usuarios no podrán cambiarlo ni anularlo. - - Si no se le asigna ningún valor, la lupa fijada se inhabilitará de forma inicial, pero el usuario podrá habilitarla en cualquier momento.</translation> <translation id="1189817621108632689">Permite establecer una lista de patrones de URL para especificar los sitios web que no pueden mostrar imágenes. Si no se establece esta política, se usará para todos los sitios web el valor general predeterminado que se indique en la política "DefaultImagesSetting" (si se ha establecido) o el valor personalizado que haya definido el usuario (en caso contrario). @@ -1575,11 +1566,6 @@ Si se asigna el valor false a la política, no se proporcionará ninguna información sobre la sesión. Si se asigna el valor true o si la política no se configura, sí se proporcionará información sobre la sesión.</translation> -<translation id="3852924591079583104"> - Si se asigna el valor "ArcSession" a esta política, fuerza al dispositivo a reiniciarse cuando el usuario cierre sesión (si Android se ha iniciado). - Si se le asigna el valor "Always", fuerza al dispositivo a reiniciarse cada vez que el usuario cierre sesión. - Si no se le asigna ningún valor, no tiene ningún efecto y no se fuerza al dispositivo a reiniciarse cuando el usuario cierre sesión. Lo mismo sucede si se le asigna el valor "Never". - </translation> <translation id="3858658082795336534">Modo predeterminado de impresión por las dos caras</translation> <translation id="3859780406608282662">Permite añadir un parámetro para la obtención de la base de las variaciones en <ph name="PRODUCT_OS_NAME" />. @@ -3467,7 +3453,6 @@ Si esta política se establece en RemoveLRUIfDormant, la limpieza automática seguirá eliminando usuarios que no hayan iniciado sesión durante al menos tres meses por orden de inicios de sesión menos recientes hasta que haya suficiente espacio libre. Si esta política no se establece, la limpieza automática utilizará la estrategia integrada predeterminada. Actualmente, se trata de la estrategia RemoveLRUIfDormant.</translation> -<translation id="7334274148831027933">Habilitar lupa fijada</translation> <translation id="7336785017449297672">Controla los ajustes del reloj y de la zona horaria.</translation> <translation id="7336878834592315572">Guardar las cookies durante la duración de la sesión</translation> <translation id="7339315111520512972">Forzar que el código de red se ejecute en el proceso del navegador</translation>
diff --git a/components/policy/resources/policy_templates_et.xtb b/components/policy/resources/policy_templates_et.xtb index 5a425e2..385fa29 100644 --- a/components/policy/resources/policy_templates_et.xtb +++ b/components/policy/resources/policy_templates_et.xtb
@@ -146,15 +146,6 @@ Kui määrate reegli olekule Väär, siis ei saadeta teavet arendaja lüliti oleku kohta.</translation> <translation id="1160479894929412407">QUIC-protokolli lubamine</translation> <translation id="1160939557934457296">Keela turvalise sirvimise hoiatuslehest edasiliikumine</translation> -<translation id="1171342272070128466">Lubatakse dokitud luubi juurdepääsufunktsioon. - - Kui see reegel on seatud väärtusele Tõene, on dokitud luup alati lubatud. - - Kui see reegel on seatud väärtusele Väär, on dokitud luup alati keelatud. - - Kui määrate reegli, ei saa kasutajad seda muuta ega alistada. - - Kui see reegel jäetakse määramata, on dokitud luup algselt keelatud, kuid kasutaja võib selle igal ajal lubada.</translation> <translation id="1189817621108632689">Võimaldab määrata URL-i mustrite loendi, mis määrab saidid, millel ei ole lubatud pilte kuvada. Kui jätate selle reegli määramata, siis kasutatakse kõikide saitide puhul globaalset vaikeväärtust, mis pärineb reeglist „DefaultImagesSetting”, kui see on määratud, või kasutaja isiklikku seadistust. @@ -1151,6 +1142,15 @@ Kui reegel on määramata, ei mõjuta see täpsemate reeglite toimimist.</translation> <translation id="2987155890997901449">ARC lubamine</translation> <translation id="2987227569419001736">Web Bluetooth API kasutuse kontrollimine</translation> +<translation id="2990018289267778247">Kui reegli väärtuseks määratakse Tõene, kuvatakse juurdepääsuvalikud alati süsteemisalve menüüs. + + Kui reegli väärtuseks määratakse Väär, ei kuvata juurdepääsuvalikuid süsteemisalve menüüs kunagi. + + Kui määrate reegli, ei saa kasutajad seda muuta ega alistada. + + Kui jätate reegli määramata, ei kuvata juurdepääsuvalikuid süsteemisalve menüüs, kuid kasutaja saab juurdepääsuvalikud kuvada lehe Seaded kaudu. + + Kui juurdepääsufunktsioonid on lubatud (muude meetoditega, näiteks klahvikombinatsiooniga), kuvatakse süsteemisalve menüüs alati juurdepääsetavuse valikud.</translation> <translation id="3011301228198307065">Seadistab rakenduse <ph name="PRODUCT_NAME" /> avalehe vaike-URL-i ja keelab kasutajatel selle muutmise. Avaleht on leht, mis avaneb nupu Avaleht vajutamisel. Käivitamisel avatavaid lehti juhivad reeglid RestoreOnStartup. @@ -1469,6 +1469,7 @@ Seda reeglit kasutatakse arvutites seadme ulatuses pilvereegli registreerimiseks ja selle saab määrata failiga Registry või GPO Windowsis, failiga plist Macis ja JSON-i reeglifailiga Linuxis.</translation> <translation id="3660562134618097814">SAML IdP küpsisefailide ülekandmine sisselogimisel</translation> <translation id="3701121231485832347">Haldab üksuse <ph name="MS_AD_NAME" /> hallatud operatsioonisüsteemiga <ph name="PRODUCT_OS_NAME" /> seadmete seadeid.</translation> +<translation id="3702518095257671450">Kaugatesteerimine</translation> <translation id="3702647575225525306"><ph name="POLICY_NAME" /> (Üherealist välja enam ei toetata ja tulevikus see eemaldatakse. Hakake kasutama allolevat mitmerealist tekstivälja.)</translation> <translation id="3709266154059827597">Laienduste installimise musta nimekirja seadistamine</translation> <translation id="3711895659073496551">Peata</translation> @@ -1581,11 +1582,6 @@ Kui selle reegli väärtuseks määratakse Väär, siis teavet seansi kohta ei saadeta. Kui väärtuseks määratakse Tõene või seda ei määrata, saadetakse teavet seansi kohta.</translation> -<translation id="3852924591079583104"> - Kui selle reegli väärtuseks on määratud ArcSession, taaskäivitab reegel seadme pärast kasutaja väljalogimist, kui Android on käivitunud. - Kui reegli väärtuseks on määratud Alati, taaskäivitub seade iga kord, kui kasutaja välja logib. - Kui reegel on määramata, puudub sellel mõju ning seadet pärast kasutaja väljalogimist ei taaskäivitata. Sama kehtib ka siis, kui reegli väärtuseks on määratud Mitte kunagi. - </translation> <translation id="3858658082795336534">Vaikimisi kasutatav printimise dupleksrežiim</translation> <translation id="3859780406608282662">Parameteri lisamine variatsioonide lähteväärtuse toomisel rakendusest <ph name="PRODUCT_OS_NAME" />. @@ -1869,6 +1865,15 @@ Reeglit järgitakse ainult siis, kui lubatud on reegel „DefaultSearchProviderEnabled”.</translation> <translation id="4285674129118156176">Seoseta kasutajatel ARC kasutamise lubamine</translation> +<translation id="4289903996435140853">Võimaldab teil määrata URL-ide loendi, mis määravad, millistele saitidele antakse automaatselt luba määratud tootja ja toote ID-ga USB-seadmele juurdepääsemiseks. Iga loendiüksus peab sisaldama nii seadmeid kui ka URL-e, et reegel kehtiks. Iga seadmete loendi üksus võib sisaldada tootja ID ja toote ID välja. Väljajäetud ID-sid käsitletakse metamärkidena ühe erandiga: ilma tootja ID-d määramata ei saa toote ID-d määrata. Muidu on reegel kehtetu ja seda eiratakse. + + USB loamudel kasutab taotluse esitanud saidi URL-i („taotleja URL”) ja ülataseme raamsaidi URL-i („manustamise URL”), et lubada taotluse esitanud URL-il USB-seadmele juurde pääseda. Taotleja URL võib manustamise URL-ist erineda juhul, kui taotluse esitanud sait laaditakse iframe'is. Seetõttu võib väli „URL-id” sisaldada kuni kaht komaga eraldatud URL-i, mis määravad vastavalt taotleja URL-i ja manustamise URL-i. Kui määratud on ainult üks URL, antakse juurdepääs vastavatele USB-seadmetele juhul, kui taotluse esitanud saidi URL kattub selle URL-iga, olenemata manustamise olekust. Väljal „URL-id” olevad URL-id peavad olema kehtivad, muidu reeglit eiratakse. + + Kui reegel jäetakse määramata, kasutatakse kõigi saitide puhul globaalset vaikeväärtust, mis pärineb reeglist „DefaultWebUsbGuardSetting” (kui see on määratud) või kasutaja isiklikust seadistusest. + + Reeglis määratud URL-i mustrid ei tohi olla vastuolus reegli WebUsbBlockedForUrls kaudu seadistatud URL-idega. Vastuolu korral on sellel reeglil eesõigus reeglite WebUsbBlockedForUrls ja WebUsbAskForUrls ees. + + Selle reegli ja reegli WebUsbAllowDevicesForUrls väärtused liidetakse.</translation> <translation id="4298509794364745131">Määratakse loend rakendustest, mille saab operatsioonisüsteemi <ph name="PRODUCT_OS_NAME" /> lukustuskuval lubada märkmete tegemise rakendustena. Kui eelistatud märkmete tegemise rakendus on lukustuskuval lubatud, sisaldab lukustuskuva kasutajaliidese elementi eelistatud märkmete tegemise rakenduse käivitamiseks. @@ -2020,6 +2025,7 @@ <translation id="4639407427807680016">Omasõnumside hostide nimed mustast nimekirjast välistamiseks</translation> <translation id="4650759511838826572">Keela URL-i protokolli skeemid</translation> <translation id="465099050592230505">Ettevõtte veebipoe URL (tugi on katkestatud)</translation> +<translation id="4661889655253181651">Sisu seaded võimaldavad teil määrata, kuidas kindlat tüüpi sisu (näiteks küpsiseid, kujutisi või JavaScripti) käsitletakse.</translation> <translation id="4665897631924472251">Laienduse haldamise seaded</translation> <translation id="4668325077104657568">Kujutiste vaikeseaded</translation> <translation id="4670865688564083639">Miinimum:</translation> @@ -2064,6 +2070,11 @@ Need soovitused tuuakse kaugühenduse kaudu Google'i serveritest. Kui reegel on seatud väärtusele Väär, siis soovitusi ei tooda ega kuvata.</translation> +<translation id="4759650396863318477">Võimaldab määrata ajavahemiku (millisekundites), mille jooksul antakse kasutajatele teada, et ootel oleva värskenduse rakendamiseks tuleb <ph name="PRODUCT_NAME" /> või operatsioonisüsteemiga <ph name="PRODUCT_OS_NAME" /> seade taaskäivitada. + + Selle vahemiku jooksul teavitatakse kasutajat värskendusest korduvalt. Operatsioonisüsteemiga <ph name="PRODUCT_OS_NAME" /> seadmete puhul kuvatakse taaskäivituse märguanne süsteemisalves reegli <ph name="RELAUNCH_HEADS_UP_PERIOD_POLICY_NAME" /> alusel. Brauseri <ph name="PRODUCT_NAME" /> puhul rakenduse menüü muutub, kui kolmandik ajavahemikust on möödunud, ja näitab, et rakendus on vaja taaskäivitada. Märguanne muudab esimest korda värvi siis, kui möödunud on kaks kolmandikku ajavahemikust, ja teist korda ajavahemiku lõpus. Reegliga <ph name="RELAUNCH_NOTIFICATION_POLICY_NAME" /> lubatud lisamärguanded järgivad sama ajakava. + + Kui reegel on määramata, kasutatakse vaikeperioodi, mis on operatsioonisüsteemiga <ph name="PRODUCT_OS_NAME" /> seadmete puhul 345 600 000 millisekundit (neli päeva) ja brauseri <ph name="PRODUCT_NAME" /> puhul 604 800 000 millisekundit (üks nädal).</translation> <translation id="4788252609789586009">Lubab rakenduse <ph name="PRODUCT_NAME" /> automaattäite funktsiooni ja võimaldab kasutajatel veebivormidel krediitkaardiandmeid automaatselt täita, kasutades selleks varem salvestatud teavet. Kui seade on keelatud, ei anna automaattäite funktsioon krediitkaardiandmete kohta soovitusi ega sisesta neid. Samuti ei salvesta see krediitkaardi lisateavet, mille kasutaja võib veebi sirvimisel esitada. @@ -2273,6 +2284,15 @@ Kui jätate selle reegli määramata, siis kasutatakse kõikide saitide puhul globaalset vaikeväärtust, mis pärineb reeglist „DefaultNotificationsSetting”, kui see on määratud, või kasutaja isiklikku konfigureerimist.</translation> <translation id="5213038356678567351">Veebisaidid, mis ei käivita kunagi brauserivahetust.</translation> <translation id="5219844027738217407">Androidi rakenduste puhul mõjutab see reegel ainult mikrofoni. Kui reegli väärtuseks on määratud Tõene, on mikrofon ilma eranditeta kõigi Androidi rakenduste puhul vaigistatud.</translation> +<translation id="5221394278852982313">Võimaldab teil määrata URL-ide loendi, mis määravad, millistele saitidele antakse automaatselt luba määratud tootja ja toote ID-ga USB-seadmele juurdepääsemiseks. Iga loendiüksus peab sisaldama nii seadmeid kui ka URL-e, et reegel kehtiks. Iga seadmete loendi üksus võib sisaldada tootja ID ja toote ID välja. Väljajäetud ID-sid käsitletakse metamärkidena ühe erandiga: ilma tootja ID-d määramata ei saa toote ID-d määrata. Muidu on reegel kehtetu ja seda eiratakse. + + USB loamudel kasutab taotluse esitanud saidi URL-i („taotleja URL”) ja ülataseme raamsaidi URL-i („manustamise URL”), et lubada taotluse esitanud URL-il USB-seadmele juurde pääseda. Taotleja URL võib manustamise URL-ist erineda juhul, kui taotluse esitanud sait laaditakse iframe'is. Seetõttu võib väli „URL-id” sisaldada kuni kaht komaga eraldatud URL-i, mis määravad vastavalt taotleja URL-i ja manustamise URL-i. Kui määratud on ainult üks URL, antakse juurdepääs vastavatele USB-seadmetele juhul, kui taotluse esitanud saidi URL kattub selle URL-iga, olenemata manustamise olekust. Väljal „URL-id” olevad URL-id peavad olema kehtivad, muidu reeglit eiratakse. + + Kui reegel jäetakse määramata, kasutatakse kõigi saitide puhul globaalset vaikeväärtust, mis pärineb reeglist „DefaultWebUsbGuardSetting” (kui see on määratud) või kasutaja isiklikust seadistusest. + + Reeglis määratud URL-i mustrid ei tohi olla vastuolus reegli WebUsbBlockedForUrls kaudu seadistatud URL-idega. Vastuolu korral on sellel reeglil eesõigus reeglite WebUsbBlockedForUrls ja WebUsbAskForUrls ees. + + Selle reegli ja reegli DeviceWebUsbAllowDevicesForUrls väärtused liidetakse.</translation> <translation id="5228316810085661003">Seadme kohaliku konto automaatse sisselogimise viivitus. Kui reegel |DeviceLocalAccountAutoLoginId| on määramata, ei ole sellel reeglil mingit mõju. Muidu on mõju järgmine. @@ -3015,6 +3035,20 @@ Kui selle reegli väärtuseks on määratud „Kasutajatel sertifikaatide haldamise keelamine”, saavad kasutajad sertifikaate ainult vaadata.</translation> <translation id="6573305661369899995">URL-i piirangute välise allika seadistamine</translation> +<translation id="6583851521569686409">Seadistab printerite loendi. + + Reegel võimaldab administraatoritel pakkuda kasutajatele printeriseadistusi. + + <ph name="PRINTER_DISPLAY_NAME" /> ja <ph name="PRINTER_DESCRIPTION" /> on vabas vormis stringid, mida saab kohandada, et hõlbustada printeri valimist. <ph name="PRINTER_MANUFACTURER" /> ja <ph name="PRINTER_MODEL" /> hõlbustavad lõppkasutajate jaoks printerite tuvastamist. Need näitavad printeri tootjat ja mudelit. <ph name="PRINTER_URI" /> peab olema aadress, mida saab külastada klientarvutist, sh <ph name="URI_SCHEME" />, <ph name="URI_PORT" /> ja <ph name="URI_QUEUE" />. <ph name="PRINTER_UUID" /> on valikuline. Selle olemasolul aitab see seadistus <ph name="ZEROCONF_DISCOVERY" /> printerite duplikaate eemaldada. + + <ph name="PRINTER_EFFECTIVE_MODEL" /> peab sisaldama printeri nime või <ph name="PRINTER_AUTOCONF" /> tuleb määrata väärtusele Tõene. Printereid, mis kasutavad mõlemat või millel puuduvad atribuudid, eiratakse. + + Printeri seadistus viiakse lõpule printeri esimesel kasutuskorral. PPD-sid ei laadita alla enne, kui printerit kasutatakse. Pärast seda salvestatakse sageli kasutatud PPD-d vahemällu. + + See reegel ei mõjuta seda, kas kasutajad saavad konkreetsetes seadmetes printereid seadistada. See on mõeldud kasutajate printerite seadistusi täiendama. + + Active Directory hallatavate seadmete puhul toetab see reegel seadme <ph name="MACHINE_NAME_VARIABLE" /> laiendamist Active Directory seadme nimele või selle alamstringile. Näiteks kui seadme nimi on <ph name="MACHINE_NAME_EXAMPLE" />, asendatakse <ph name="MACHINE_NAME_VARIABLE_EXAMPLE" /> nelja tähemärgiga pärast kuuendat positsiooni (nt <ph name="MACHINE_NAME_PART_EXAMPLE" />). Pange tähele, et positsioon algab nullist. + </translation> <translation id="6598235178374410284">Kasutaja avatarkujutis</translation> <translation id="6603004149426829878">Ajavööndi lahendamisel saada saadaolevad asukohasignaalid alati serverisse</translation> <translation id="6628120204569232711">Salvestusruumi oleku teavitamine</translation> @@ -3470,7 +3504,6 @@ Kui reegel on määratud valikule „RemoveLRUIfDormant”, jätkab automaatne puhastamine nende kasutajate eemaldamist, kes ei ole vähemalt 3 kuu jooksul sisse loginud, lähtudes sellest, milline kasutaja kõige kauem aega tagasi sisse logis, kuni on piisavalt vaba ruumi. Kui reegel on määramata, kasutab automaatne puhastamine sisseehitatud vaikestrateegiat. Praegu on selleks strateegia „RemoveLRUIfDormant”.</translation> -<translation id="7334274148831027933">Luba dokitud luup</translation> <translation id="7336785017449297672">Haldab kella ja ajavööndi seadeid.</translation> <translation id="7336878834592315572">Säilita küpsised seansi kestuse jooksul</translation> <translation id="7339315111520512972">Brauseri protsessis võrgustiku koodi sundkäitamine</translation> @@ -4382,6 +4415,8 @@ <translation id="915194831143859291">Kui reegel on määramata või seatud väärtusele Väär, lubab <ph name="PRODUCT_OS_NAME" /> kasutajal seadme välja lülitada. Kui reegel on seatud väärtusele Tõene ja kasutaja lülitab seadme välja, taaskäivitab <ph name="PRODUCT_OS_NAME" /> seadme. <ph name="PRODUCT_OS_NAME" /> asendab kasutajaliidese kõik väljalülitamisnupud taaskäivitusnuppudega. Kui kasutaja lülitab seadme toitenupuga välja, ei taaskäivitata seda automaatselt, isegi kui reegel on lubatud.</translation> <translation id="9152473318295429890">Seotud veebilehtede kontekstipõhiste soovituste lubamine</translation> +<translation id="9153446010242995516">Võimaldab naasta ja jääda sihtversioonile, kui operatsioonisüsteemi versioon on sihtversioonist uuem. Proovige võimaluse korral seadme tasemel seadistus (sh võrgumandaat) tagasiminekuprotsessi kaudu üle viia, ent tehke seejuures täielik powerwash, isegi kui andmete taastamine ei ole võimalik (kuna sihtversioon ei toeta andmete taastamist või muudatus ei ole tagasiühilduv). + Seda toetatakse alates operatsioonisüsteemi <ph name="PRODUCT_OS_NAME" /> 75. versioonist. Vanemate klientide puhul tähendab väärtus, et tagasiminek on keelatud.</translation> <translation id="9158929520101169054">Brauseris mitmele kontole sisselogimise lubamine</translation> <translation id="9159126470527871268">Võimaldab anda kasutajatele teada, et ootel oleva värskenduse rakendamiseks tuleb <ph name="PRODUCT_NAME" /> või <ph name="PRODUCT_OS_NAME" /> taaskäivitada.
diff --git a/components/policy/resources/policy_templates_fa.xtb b/components/policy/resources/policy_templates_fa.xtb index 0b61d58..31c4c5a 100644 --- a/components/policy/resources/policy_templates_fa.xtb +++ b/components/policy/resources/policy_templates_fa.xtb
@@ -142,15 +142,6 @@ اگر این خطمشی به درستی تنظیم نشود، وضعیت کلید برنامهنویس گزارش داده نمیشود.</translation> <translation id="1160479894929412407">مجاز کردن پروتکل QUIC</translation> <translation id="1160939557934457296">غیر فعال کردن ادامه از صفحه هشدار مرور ایمن</translation> -<translation id="1171342272070128466">فعال کردن ویژگی دسترسپذیری ذرهبین متصل. - - اگر این خطمشی روی درست تنظیم شود، ذرهبین متصل همواره فعال خواهد بود. - - اگر این خطمشی روی «نادرست» تنظیم شود، ذرهبین متصل همواره غیرفعال خواهد بود. - - اگر این خطمشی را تنظیم کنید، کاربران نمیتوانند آن را تغییر دهند یا لغو کنند. - - اگر این خطمشی تنظیم نشود، ذرهبین متصل درابتدا غیرفعال میشود اما کاربر میتواند هرزمانی که بخواهد آن را فعال کند.</translation> <translation id="1189817621108632689">به شما امکان میدهد فهرستی از الگوهای نشانی وب تنظیم کنید که سایتهایی را که مجاز به نمایش تصویر نیستند مشخص میکند. اگر این خطمشی تنظیم نشود، مقدار پیشفرض کلی برای همه سایتها استفاده میشود. این مقدار پیشفرض یا از خطمشی «DefaultImagesSetting» (اگر تنظیم شده باشد) یا از پیکربندی شخصی کاربر بهدست میآید. @@ -1535,11 +1526,6 @@ اگر خطمشی روی نادرست تنظیم شود، اطلاعات جلسه کیوسک گزارش داده نخواهد شد. اگر روی درست تنظیم شود یا تنظیم نشود، اطلاعات جلسه کیوسک گزارش داده خواهد شد.</translation> -<translation id="3852924591079583104"> - اگر این خطمشی روی ArcSession تنظیم شده باشد، اگر Android شروع بهکار کرده باشد، دستگاه وادار میشود هنگام خروج کاربر از سیستم راهاندازی مجدد شود. - اگر روی «همیشه» تنظیم شده باشد، دستگاه وادار میشود در همه دفعات خروج از سیستم کاربر، راهاندازی مجدد شود. - اگر بدون تنظیم نشود، تأثیری ندارد و دستگاه وادار نمیشود هنگام خروج کاربر از سیستم راهاندازی مجدد شود. اگر روی «هرگز» تنظیم شود هم همینطور است. - </translation> <translation id="3858658082795336534">حالت چاپ دورویه پیشفرض</translation> <translation id="3859780406608282662">پارامتری را به واکشی مقادیر متغیر در <ph name="PRODUCT_OS_NAME" /> اضافه کنید. @@ -3352,7 +3338,6 @@ اگر این خطمشی روی «RemoveLRUIfDormant» تنظیم شود، عملکرد پاک کردن خودکار کاربرانی را که حداقل سه ماه به سیستم وارد نشدند به ترتیب از کاربرانی که اخیراً کمتر به سیستم وارد شدند حذف میکند، تا زمانیکه فضای کافی روی دیسک ایجاد شود. اگر این خطمشی تنظیم نشده باشد، مرحله پاک کردن خودکار از استراتژی داخلی پیشفرض استفاده میکند. در حال حاضر این استراتژی «RemoveLRUIfDormant» است.</translation> -<translation id="7334274148831027933">فعال کردن ذرهبین متصل</translation> <translation id="7336785017449297672">تنظیمات ساعت و منطقه زمانی را کنترل میکند.</translation> <translation id="7336878834592315572">نگهداشتن کوکیها برای کل مدت جلسه</translation> <translation id="7339315111520512972">واداشتن کد ایجاد شبکه به اجرا در پردازش مرورگر</translation>
diff --git a/components/policy/resources/policy_templates_fi.xtb b/components/policy/resources/policy_templates_fi.xtb index 0d6c096..26796ae4 100644 --- a/components/policy/resources/policy_templates_fi.xtb +++ b/components/policy/resources/policy_templates_fi.xtb
@@ -142,15 +142,6 @@ Jos käytännön arvo on epätosi, kehittäjätilaa (käytössä / ei käytössä) ei ilmoiteta.</translation> <translation id="1160479894929412407">Salli QUIC-protokollan käyttö</translation> <translation id="1160939557934457296">Estä eteneminen Selaussuojan varoitussivulta</translation> -<translation id="1171342272070128466">Ota käyttöön kiinnitetty suurennus ‑esteettömyysominaisuus. - - Jos käytännön arvoksi on asetettu tosi, kiinnitetty suurennus on aina käytössä. - - Jos käytännön arvoksi on asetettu epätosi, kiinnitetty suurennus ei ole koskaan käytössä. - - Jos määrität tämän käytännön, käyttäjät eivät voi muuttaa tai ohittaa sitä. - - Jos tätä käytäntöä ei ole määritetty, kiinnitetty suurennus poistetaan oletuksena käytöstä, mutta käyttäjä voi ottaa sen käyttöön milloin tahansa.</translation> <translation id="1189817621108632689">Voit määrittää URL-mallien luettelon, jossa määritetään sivustot, jotka saavat näyttää kuvia. Jos tätä käytäntöä ei ole määritetty, kaikille sivustoille käytetään joko DefaultImagesSetting-käytännön yleistä oletusarvoa, jos se on asetettu, tai käyttäjän henkilökohtaisia määrityksiä. @@ -1124,6 +1115,15 @@ Jos tätä käytäntöä ei ole määritetty, toimintaa tarkemmin ohjaavien käytäntöjen toiminta pysyy ennallaan.</translation> <translation id="2987155890997901449">Ota ARC käyttöön.</translation> <translation id="2987227569419001736">Hallinnoi Web Bluetooth ‑sovellusliittymän käyttöä</translation> +<translation id="2990018289267778247">Jos tämän käytännön arvo on tosi, esteettömyysasetukset näkyvät aina ilmaisinalueen valikossa. + + Jos tämän käytännön arvo on epätosi, esteettömyysasetuksia ei koskaan näytetä ilmaisinalueen valikossa. + + Jos määrität tämän käytännön, käyttäjät eivät voi muuttaa tai ohittaa sitä. + + Jos tätä käytäntöä ei ole määritetty, esteettömyysasetuksia ei lisätä ilmaisinalueen valikkoon, mutta käyttäjä voi asettaa ne näkyviin Asetukset-sivulta. + + Kun esteettömyysominaisuudet on otettu käyttöön muilla keinoilla (esim. näppäinyhdistelmällä), esteettömyysasetukset näkyvät aina ilmaisinalueen valikossa.</translation> <translation id="3011301228198307065">Määrittää etusivun URL-osoitteen, jota <ph name="PRODUCT_NAME" /> käyttää oletuksena, ja estää käyttäjiä muuttamasta sitä. Etusivu avautuu, kun käyttäjä valitsee Etusivu-painikkeen. Käynnistyksen yhteydessä avautuvat sivut määritetään RestoreOnStartup-käytännöillä. @@ -1440,6 +1440,7 @@ Tätä käytännön arvoa käytetään laitteen laajuisessa pöytäkoneen rekisteröimisessä pilvikäytäntöön. Arvon voi asettaa Windowsissa rekisteri tai ryhmäkäytäntöobjekti, Macissa plist ja Linuxissa JSON-käytäntötiedosto.</translation> <translation id="3660562134618097814">SAML-tunnistuspalvelun evästeiden siirto kirjautumisen aikana</translation> <translation id="3701121231485832347">Määrittää sellaisten laitteiden (<ph name="PRODUCT_OS_NAME" />) asetukset, joita <ph name="MS_AD_NAME" /> ylläpitää</translation> +<translation id="3702518095257671450">Etätodennus</translation> <translation id="3702647575225525306"><ph name="POLICY_NAME" /> (Yksirivinen kenttä on poistettu käytöstä ja poistetaan pian kokonaan. Siirry käyttämään alla olevaa monirivistä tekstiruutua.)</translation> <translation id="3709266154059827597">Määritä, mitä laajennuksia ei saa asentaa</translation> <translation id="3711895659073496551">Keskeytä</translation> @@ -1550,11 +1551,6 @@ Jos käytännön arvo on Epätosi, käyttökertatietoja ei raportoida. Jos arvo on Tosi tai sitä ei aseteta, käyttökertatiedot raportoidaan.</translation> -<translation id="3852924591079583104"> - Kun käytännön arvoksi asetetaan ArcSession, se pakottaa laitteen käynnistymään uudelleen käyttäjän uloskirjautumisen yhteydessä, jos Android on käynnistynyt. - Kun arvo on Aina, se pakottaa laitteen käynnistymään uudelleen aina uloskirjautumisen yhteydessä. - Jos sitä ei aseteta, käytännöllä ei ole vaikutusta eikä uudelleenkäynnistys ole pakollinen uloskirjautumisen yhteydessä. Sama pätee myös Ei koskaan ‑valintaan. - </translation> <translation id="3858658082795336534">Kaksipuolisen tulostuksen oletustila</translation> <translation id="3859780406608282662">Lisää parametri muunnelmasiemenarvon noutamiseen tuotteessa <ph name="PRODUCT_OS_NAME" />. @@ -1840,6 +1836,15 @@ Käytäntö on voimassa vain, jos käytäntö DefaultSearchProviderEnabled on käytössä.</translation> <translation id="4285674129118156176">Salli ulkopuolisten käyttäjien käyttää ARC:tä</translation> +<translation id="4289903996435140853">Voit määrittää luettelon URL-osoitemalleja, jonka sivustot saavat automaattisesti pyytää käyttäjältä USB-laitteen käyttöoikeutta, jos sillä on tietty myyjän ja tuotteen tunnus. Luettelon jokaisessa kohteessa on oltava laitteita ja URL-osoitemalleja, jotta käytäntö voi astua voimaan. Jokainen laitekohta voi sisältää kentät myyjän tunnukselle ja tuotteen tunnukselle. Jos tunnusta ei mainita, tätä pidetään jokerimerkkinä, paitsi jos tuotteen tunnus mainitaan ilman myyjän tunnuksen mainitsemista – tämä ei ole mahdollista. Muuten käytäntö ei voi astua voimaan. Virheelliset käytännön arvot ohitetaan. + + USB-lupamallissa on pyytävän sivuston URL-osoite (pyytävä URL) ja ylimmän tason kehyssivuston URL-osoite (upottava URL), joiden avulla pyytävälle URL-osoitteelle annetaan lupa käyttää USB-laitetta. Pyytävä ja upottava URL-osoite voivat olla erilaiset, kun pyytävä sivusto ladataan iframella. Siksi "urls"-kentässä voi olla enintään kaksi URL-osoitekohtaa pilkulla erotettuna: pyytävä ja upottava URL-osoite. Jos vain yksi URL-osoite mainitaan, kyseisten USB-laitteiden käyttölupa annetaan, jos tämä osoite vastaa pyytävän sivun URL-osoitetta upotustilasta huolimatta. "urls"-kentän osoitteiden on oltava hyväksyttäviä URL-osoitteita, tai käytäntö ohitetaan. + + Jos tätä käytäntöä ei ole määritetty, kaikkiin sivustoihin sovelletaan DefaultWebUsbGuardSetting-käytäntöä (jos se on määritetty) tai käyttäjän omien asetusten mukaista arvoa. + + Tämän käytännön URL-osoitemallien on sovittava yhteen WebUsbBlockedForUrls-mallien kanssa. Ristiriitatilanteissa tätä käytäntöä sovelletaan ennen WebUsbBlockedForUrls- ja WebUsbAskForUrls-käytäntöjä. + + Tämän käytännön ja WebUsbAllowDevicesForUrls-käytännön arvot yhdistetään.</translation> <translation id="4298509794364745131">Määrittää luettelon sovelluksia, jotka <ph name="PRODUCT_OS_NAME" /> voi näyttää lukitusnäytöllä muistiinpanosovelluksina. Jos ensisijainen muistiinpanosovellus on käytettävissä lukitusnäytöllä, näytöllä näkyy sovelluksen käynnistävä käyttöliittymäelementti. @@ -1983,6 +1988,7 @@ <translation id="4639407427807680016">Laitteen omaa viestijärjestelmää käyttävät isännät, jotka tulee lisätä sallittujen luetteloon</translation> <translation id="4650759511838826572">Poista URL-protokollajärjestelmät käytöstä</translation> <translation id="465099050592230505">Enterprise-verkkomyymälän URL-osoite (ei enää käytössä)</translation> +<translation id="4661889655253181651">Sisältöasetuksissa voit määrittää, miten tietyn tyyppistä sisältöä (kuten evästeitä, kuvia tai JavaScriptiä) käsitellään.</translation> <translation id="4665897631924472251">Laajennusten hallinnan asetukset</translation> <translation id="4668325077104657568">Kuvien oletusasetus</translation> <translation id="4670865688564083639">Vähimmäismäärä:</translation> @@ -2026,6 +2032,11 @@ <translation id="4757671984625088193">Jos käytännön arvoksi on asetettu Tosi tai sille ei aseteta mitään arvoa, <ph name="PRODUCT_NAME" /> ehdottaa nykyiseen sivuun liittyviä sivuja. Ehdotukset haetaan Googlen palvelimilta. Jos sen arvo on Epätosi, ehdotuksia ei haeta tai näytetä.</translation> +<translation id="4759650396863318477">Voit määrittää ajanjakson (millisekunteina), jonka aikana käyttäjälle ilmoitetaan, että <ph name="PRODUCT_NAME" /> tai <ph name="PRODUCT_OS_NAME" /> ‑laite on käynnistettävä uudelleen odottavan päivityksen vuoksi. + + Tänä aikana käyttäjä saa toistuvia muistutuksia päivittämisestä. <ph name="PRODUCT_OS_NAME" /> ‑laitteilla uudelleenkäynnistysilmoitus näkyy ilmaisinalueella <ph name="RELAUNCH_HEADS_UP_PERIOD_POLICY_NAME" />-käytännön mukaan. <ph name="PRODUCT_NAME" /> ‑selaimissa sovellusvalikon muutos kertoo uudelleenkäynnistyksen tarpeesta, kun kolmannes ilmoitusajasta on kulunut. Ilmoituksen väri muuttuu, kun kaksi kolmannesta ilmoitusajasta on kulunut, ja uudelleen, kun koko ilmoitusaika on kulunut. <ph name="RELAUNCH_NOTIFICATION_POLICY_NAME" />-käytännön sallimat lisäilmoitukset noudattavat samaa aikataulua. + + Jos käytäntöä ei ole määritetty, <ph name="PRODUCT_OS_NAME" /> ‑laitteiden oletusajanjakso on 345 600 000 millisekuntia (neljä päivää) ja <ph name="PRODUCT_NAME" /> ‑selainten 604 800 000 millisekuntia (yksi viikko).</translation> <translation id="4788252609789586009">Kun tämä on käytössä, <ph name="PRODUCT_NAME" /> voi täyttää kenttiä automaattisesti. Käyttäjät voivat täyttää verkkolomakkeita aiemmin tallennetuilla luottokorttitiedoilla. Jos asetus poistetaan käytöstä, automaattinen täyttö ei ehdota luottokorttitietoja, täytä niitä tai tallenna uusia luottokorttitietoja myöhempää käyttöä varten selailun yhteydessä. @@ -2220,6 +2231,15 @@ <translation id="5208240613060747912">Voit määrittää luettelon URL-malleja, joissa määritetään sivustot, jotka eivät saa näyttää ilmoituksia. Jos tätä käytäntöä ei ole määritetty, kaikille sivustoille käytetään joko DefaultNotificationsSetting-käytännön yleistä oletusarvoa, jos se on asetettu, tai käyttäjän henkilökohtaisia määrityksiä.</translation> <translation id="5213038356678567351">Sivustot, jotka eivät koskaan aiheuta selaimen vaihtoa</translation> <translation id="5219844027738217407">Android-sovellusten kohdalla tämä käytäntö vaikuttaa vain mikrofoniin. Kun tämän käytännön arvoksi on määritetty tosi, mikrofoni on mykistetty kaikkien Android-sovellusten kohdalla, ilman poikkeuksia.</translation> +<translation id="5221394278852982313">Voit määrittää luettelon URL-osoitemalleja, jonka sivustot saavat automaattisesti pyytää käyttäjältä USB-laitteen käyttöoikeutta, jos sillä on tietty myyjän ja tuotteen tunnus. Luettelon jokaisessa kohteessa on oltava laitteita ja URL-osoitemalleja, jotta käytäntö voi astua voimaan. Jokainen laitekohta voi sisältää kentät myyjän tunnukselle ja tuotteen tunnukselle. Jos tunnusta ei mainita, tätä pidetään jokerimerkkinä, paitsi jos tuotteen tunnus mainitaan ilman myyjän tunnuksen mainitsemista – tämä ei ole mahdollista. Muuten käytäntö ei voi astua voimaan. Virheelliset käytännön arvot ohitetaan. + + USB-lupamallissa on pyytävän sivuston URL-osoite (pyytävä URL) ja ylimmän tason kehyssivuston URL-osoite (upottava URL), joiden avulla pyytävälle URL-osoitteelle annetaan lupa käyttää USB-laitetta. Pyytävä ja upottava URL-osoite voivat olla erilaiset, kun pyytävä sivusto ladataan iframella. Siksi "urls"-kentässä voi olla enintään kaksi URL-osoitekohtaa pilkulla erotettuna: pyytävä ja upottava URL-osoite. Jos vain yksi URL-osoite mainitaan, kyseisten USB-laitteiden käyttölupa annetaan, jos tämä osoite vastaa pyytävän sivun URL-osoitetta upotustilasta huolimatta. "urls"-kentän osoitteiden on oltava hyväksyttäviä URL-osoitteita, tai käytäntö ohitetaan. + + Jos tätä käytäntöä ei ole määritetty, kaikkiin sivustoihin sovelletaan DefaultWebUsbGuardSetting-käytäntöä (jos se on määritetty) tai käyttäjän omien asetusten mukaista arvoa. + + Tämän käytännön URL-osoitemallien on sovittava yhteen WebUsbBlockedForUrls-mallien kanssa. Ristiriitatilanteissa tätä käytäntöä sovelletaan ennen WebUsbBlockedForUrls- ja WebUsbAskForUrls-käytäntöjä. + + Tämän käytännön ja DeviceWebUsbAllowDevicesForUrls-käytännön arvot yhdistetään.</translation> <translation id="5228316810085661003">Laitteen paikallisen tilin automaattisen kirjautumisen viive. Jos |DeviceLocalAccountAutoLoginId|-käytäntöä ei ole määritetty, käytännöllä ei ole vaikutusta. Muutoin: @@ -2944,6 +2964,21 @@ Jos käytännön arvo on Estä käyttäjiä määrittämästä varmenteita, käyttäjät eivät voi määrittää varmenteita, ainoastaan lukea niitä.</translation> <translation id="6573305661369899995">Aseta URL-rajoitusten ulkopuolinen lähde</translation> +<translation id="6583851521569686409">Määrittää tulostinluettelon. + + Tämän käytännön avulla järjestelmänvalvojat voivat määrittää tulostinasetuksia + käyttäjiä varten. + + <ph name="PRINTER_DISPLAY_NAME" /> ja <ph name="PRINTER_DESCRIPTION" /> ovat vapaamuotoisia merkkijonoja, joita voidaan muokata tulostimen valinnan helpottamiseksi. <ph name="PRINTER_MANUFACTURER" /> ja <ph name="PRINTER_MODEL" /> auttavat käyttäjiä tunnistamaan tulostimet. Ne vastaavat tulostimen valmistajaa ja mallia. Lisää kohtaan <ph name="PRINTER_URI" /> osoite, joka on käytettävissä asiakastietokoneelta ja johon sisältyvät <ph name="URI_SCHEME" />, <ph name="URI_PORT" /> ja <ph name="URI_QUEUE" />. <ph name="PRINTER_UUID" /> on valinnainen arvo. Sen tarkoituksena on auttaa <ph name="ZEROCONF_DISCOVERY" /> ‑tulostinkopioiden poistamisessa. + + Tulostimen nimen tulee sisältyä <ph name="PRINTER_EFFECTIVE_MODEL" />-arvoon, tai <ph name="PRINTER_AUTOCONF" />-arvoksi on asetettava tosi. Sellaiset tulostimet ohitetaan, joissa on joko molemmat ominaisuudet tai ei kumpaakaan. + + Tulostin määritetään sen ensimmäisen käyttökerran yhteydessä. PPD:t ladataan vasta, kun tulostinta käytetään. Tämän jälkeen PPD:t tallennetaan välimuistiin, jos niitä käytetään usein. + + Tämä käytäntö ei vaikuta siihen, voivatko käyttäjät määrittää tulostimia yksittäisillä laitteilla. Se on tarkoitettu käytettäväksi yksittäisten käyttäjien tekemien tulostinmääritysten lisäksi. + + Jos laitetta hallinnoidaan Active Directoryn avulla, tämä käytäntö sallii, että <ph name="MACHINE_NAME_VARIABLE" /> liitetään Active Directory ‑koneen nimeen tai sen alimerkkijonoon. Jos koneen nimi on esimerkiksi <ph name="MACHINE_NAME_EXAMPLE" />, <ph name="MACHINE_NAME_VARIABLE_EXAMPLE" /> korvattaisiin kuudetta kohtaa seuraavilla neljällä merkillä: <ph name="MACHINE_NAME_PART_EXAMPLE" />. Huomaa, että kohtien laskeminen aloitetaan nollasta. + </translation> <translation id="6598235178374410284">Käyttäjän avatar-kuva</translation> <translation id="6603004149426829878">Lähetä aina käytettävissä olevat sijaintisignaalit palvelimelle aikavyöhykkeen selvittämisen yhteydessä.</translation> <translation id="6628120204569232711">Ilmoita tallennustilan tila</translation> @@ -3380,7 +3415,6 @@ Jos käytännön arvoksi asetetaan RemoveLRUIfDormant, automaattinen puhdistus poistaa laitteelta käyttäjiä, jotka eivät ole kirjautuneet sisään vähintään kolmeen kuukauteen, järjestyksessä, jossa pisimpään kirjautumatta ollut käyttäjä poistetaan ensin, kunnes levytilaa on vapautettu tarpeeksi. Jos käytäntöä ei määritetä, automaattinen puhdistus käyttää sisäänrakennettua oletustapaa, joka on tällä hetkellä RemoveLRUIfDormant.</translation> -<translation id="7334274148831027933">Ota kiinnitetty suurennus käyttöön</translation> <translation id="7336785017449297672">Määrittää kellon ja aikavyöhykkeen asetukset</translation> <translation id="7336878834592315572">Säilytä evästeet käyttökerran ajan</translation> <translation id="7339315111520512972">Pakota verkostokoodin suorittaminen selainprosessissa</translation> @@ -4264,6 +4298,8 @@ <translation id="915194831143859291">Jos tämän käytännön arvo on Epätosi tai jos sitä ei määritetä, <ph name="PRODUCT_OS_NAME" /> sallii käyttäjän sammuttaa laitteen. Jos tämän käytännön arvo on Tosi, <ph name="PRODUCT_OS_NAME" /> käynnistää laitteen uudelleen, jos käyttäjä sammuttaa sen. <ph name="PRODUCT_OS_NAME" /> korvaa käyttöliittymän kaikki sammutuspainikkeet uudelleenkäynnistyspainikkeilla. Jos käyttäjä käyttää sammuttamiseen laitteen virtapainiketta, laite ei käynnisty automaattisesti uudelleen, vaikka tämä käytäntö olisikin käytössä.</translation> <translation id="9152473318295429890">Salli vastaavien verkkosivujen ehdottaminen kontekstin perusteella</translation> +<translation id="9153446010242995516">Palaa kohdeversioon ja pysy siinä, jos käyttöjärjestelmän versio on uudempi kuin kohde. Pyri siirtämään laitetason määritykset (mukaan lukien verkon kirjautumistiedot) palautusprosessin yhteydessä, jos mahdollista, mutta tee palautuksessa täysi powerwash, vaikka datan palautus ei olisi mahdollista (koska kohdeversio ei tue datan palautusta tai muutos on yhteensopimaton vanhemman version kanssa). + Tuettu versiossa 75 ja uudemmissa (<ph name="PRODUCT_OS_NAME" />). Palautus ei siis ole mahdollinen vanhempia versioita käyttävissä asiakassovelluksissa.</translation> <translation id="9158929520101169054">Salli kirjautuminen usealle tilille selaimessa</translation> <translation id="9159126470527871268">Ilmoita käyttäjille, että <ph name="PRODUCT_NAME" /> tai <ph name="PRODUCT_OS_NAME" /> on käynnistettävä uudelleen odottavan päivityksen käyttöönottamiseksi.
diff --git a/components/policy/resources/policy_templates_fil.xtb b/components/policy/resources/policy_templates_fil.xtb index 6fcdc804..c03fa80 100644 --- a/components/policy/resources/policy_templates_fil.xtb +++ b/components/policy/resources/policy_templates_fil.xtb
@@ -144,15 +144,6 @@ Kung nakatakda ang patakaran sa false, hindi iuulat ang katayuan ng dev switch.</translation> <translation id="1160479894929412407">Payagan ang QUIC protocol</translation> <translation id="1160939557934457296">Huwag paganahin ang pagpapatuloy mula sa pahina ng babala sa Ligtas na Pag-browse</translation> -<translation id="1171342272070128466">I-enable ang feature ng pagiging naa-access ng naka-dock na magnifier. - - Kung nakatakda ang patakarang ito sa true, palaging naka-enable ang naka-dock na magnifier. - - Kung nakatakda ang patakarang ito sa false, palaging naka-disable ang naka-dock na magnifier. - - Kung itatakda mo ang patakarang ito, hindi ito mababago o mao-override ng mga user. - - Kung hahayaang hindi nakatakda ang patakarang ito, madi-disable sa simula ang naka-dock na magnifier pero puwede itong i-enable ng user anumang oras.</translation> <translation id="1189817621108632689">Binibigyang-daan kang magtakda ng listahan ng mga pattern ng url na tumutukoy ng mga site na hindi pinapayagang magpakita ng mga larawan. Kung hahayaang hindi nakatakda ang patakarang ito, gagamitin ang pangkalahatang default na value para sa lahat ng site mula sa patakarang 'DefaultImagesSetting' kung nakatakda ito, o kung hindi, sa personal na pag-configure ng user. @@ -1580,11 +1571,6 @@ Kung itatakda ang patakaran sa false, hindi iuulat ang impormasyon ng session sa kiosk. Kung itatakda sa true o kung sadyang hindi itatakda, iuulat ang impormasyon ng session sa kiosk.</translation> -<translation id="3852924591079583104"> - Pupuwersahin ng patakarang ito, kapag nakatakda sa ArcSession, na mag-reboot ang device kapag may user na nag-sign out kung nagsimula ang Android. - Kapag nakatakda sa Palagi, pupuwersahin nito ang device na mag-reboot sa tuwing pag-sign out ng user. - Kung iwang hindi nakatakda, wala itong epekto at hindi pupuwersahin ang pag-reboot sa pag-sign out ng user. Nalalapat din ito kung nakatakda sa Hindi Kailanman. - </translation> <translation id="3858658082795336534">Default na printing duplex mode</translation> <translation id="3859780406608282662">Magdagdag ng parameter sa pagkuha ng seed ng Mga Variation sa <ph name="PRODUCT_OS_NAME" />. @@ -3468,7 +3454,6 @@ Kung itinakda ang patakarang ito sa 'RemoveLRUIfDormant', patuloy na aalisin ng awtomatikong pag-clean-up ang mga user na hindi nag-log in sa nakalipas na tatlong buwan na nakaayos ayon sa pinakamatagal nang pag-log-in hanggang magkaroon ng sapat na espasyo sa disk. Kung hindi itinakda ang patakarang ito, gagamiting ng awtomatikong pag-clean-up ang default na built-in na diskarte. Sa kasalukuyan, ito ay ang 'RemoveLRUIfDormant' na diskarte.</translation> -<translation id="7334274148831027933">I-enable ang naka-dock na magnifier</translation> <translation id="7336785017449297672">Nagkokontrol sa mga setting ng clock at time zone.</translation> <translation id="7336878834592315572">Panatilihin ang cookies para sa kabuuan ng session</translation> <translation id="7339315111520512972">Sapilitang paganahin ang networking code sa proseso ng browser</translation>
diff --git a/components/policy/resources/policy_templates_fr.xtb b/components/policy/resources/policy_templates_fr.xtb index f26a0b4..47a5a45 100644 --- a/components/policy/resources/policy_templates_fr.xtb +++ b/components/policy/resources/policy_templates_fr.xtb
@@ -143,15 +143,6 @@ Si la règle est définie sur "False", l'état de l'interrupteur du mode développeur n'est pas communiqué.</translation> <translation id="1160479894929412407">Autoriser le protocole QUIC</translation> <translation id="1160939557934457296">Désactiver l'accès au site lors de l'affichage de la page d'avertissement par le service de navigation sécurisée</translation> -<translation id="1171342272070128466">Permet d'activer la fonctionnalité d'accessibilité Loupe ancrée. - - Si cette règle est définie sur "True", la loupe ancrée est toujours activée. - - Si cette règle est définie sur "False", la loupe ancrée est toujours désactivée. - - Si vous configurez cette règle, les utilisateurs ne peuvent pas la modifier ni l'ignorer. - - Si cette règle n'est pas définie, la loupe ancrée est initialement désactivée, mais les utilisateurs peuvent l'activer à tout moment.</translation> <translation id="1189817621108632689">Permet de définir une liste de formats d'URL spécifiant les sites non autorisés à afficher des images. Si cette règle n'est pas configurée, la valeur par défaut globale est utilisée pour tous les sites à partir de la règle "DefaultImagesSetting" si celle-ci est définie ou, à défaut, à partir de la configuration personnelle de l'utilisateur. @@ -1148,6 +1139,15 @@ Si cette règle n'est pas définie, le comportement des règles plus spécifiques n'est pas modifié.</translation> <translation id="2987155890997901449">Activer ARC</translation> <translation id="2987227569419001736">Contrôler l'utilisation de l'API Web Bluetooth</translation> +<translation id="2990018289267778247">Si cette règle est définie sur "True", les options d'accessibilité s'affichent en permanence dans le menu de la barre d'état système. + + Si cette règle est définie sur "False", les options d'accessibilité ne s'affichent jamais dans le menu de la barre d'état système. + + Si vous définissez cette règle, les utilisateurs ne peuvent pas la modifier ni l'ignorer. + + Si vous ne définissez pas cette règle, les options d'accessibilité ne s'affichent pas dans le menu de la barre d'état système, mais l'utilisateur peut activer leur affichage via la page "Paramètres". + + Lorsque les fonctionnalités d'accessibilité sont activées par d'autres moyens (par exemple une combinaison de touches), les options d'accessibilité restent affichées dans le menu de la barre d'état système.</translation> <translation id="3011301228198307065">Permet de configurer l'URL de la page d'accueil par défaut dans <ph name="PRODUCT_NAME" /> et d'empêcher les utilisateurs de la modifier. La page d'accueil est la page qui s'ouvre lorsque l'utilisateur clique sur le bouton d'accueil. Les pages qui s'affichent au démarrage sont gérées par les règles RestoreOnStartup. @@ -1468,6 +1468,7 @@ Cette règle est utilisée pour l'activation de la règle relative au cloud au niveau de la machine (pour les ordinateurs de bureau). Elle peut être définie sur le registre ou les GPO sur Windows, le fichier plist sur Mac, et le fichier de règle JSON sur Linux.</translation> <translation id="3660562134618097814">Transférer des cookies de fournisseurs d'identité SAML lors de la connexion</translation> <translation id="3701121231485832347">Contrôle les paramètres propres aux appareils <ph name="PRODUCT_OS_NAME" /> gérés par <ph name="MS_AD_NAME" />.</translation> +<translation id="3702518095257671450">Attestation à distance</translation> <translation id="3702647575225525306"><ph name="POLICY_NAME" /> (Le champ constitué d'une seule ligne est abandonné et va être supprimé prochainement. Utilisez à la place la zone de texte à plusieurs lignes ci-dessous.)</translation> <translation id="3709266154059827597">Configurer la liste noire d'installation des extensions</translation> <translation id="3711895659073496551">Arrêter</translation> @@ -1580,11 +1581,6 @@ Si la règle est définie sur "False", les informations sur la session kiosque ne sont pas transmises. Si elle est définie sur "True" ou si elle n'est pas configurée, les informations sur la session sont transmises.</translation> -<translation id="3852924591079583104"> - Lorsque l'option "ArcSession" est activée, cette règle contraint l'appareil à redémarrer lorsqu'un utilisateur se déconnecte si Android est en cours d'exécution. - Si l'option "Toujours" est sélectionnée, la règle imposera un redémarrage de l'appareil à chaque déconnexion d'utilisateur. - Si aucun paramètre n'est défini, la règle est sans effet et aucun redémarrage n'est imposé en cas de déconnexion d'utilisateur. Il en va de même si l'option "Jamais" est sélectionnée. - </translation> <translation id="3858658082795336534">Impression recto verso par défaut</translation> <translation id="3859780406608282662">Permet d'ajouter un paramètre à la récupération de la valeur de départ des variantes dans <ph name="PRODUCT_OS_NAME" />. @@ -1869,6 +1865,15 @@ Cette règle n'est respectée que si la règle "DefaultSearchProviderEnabled" est activée.</translation> <translation id="4285674129118156176">Autoriser les utilisateurs non affiliés à utiliser ARC</translation> +<translation id="4289903996435140853">Vous permet de définir une liste d'URL indiquant les sites automatiquement autorisés à accéder à un appareil USB correspondant aux ID de fournisseur et de produit indiqués. Chaque élément de la liste doit contenir à la fois les appareils et les URL pour que la règle soit valide. Chaque élément des appareils peut contenir un champ d'ID de produit et d'ID de fournisseur. Les ID non renseignés sont traités comme des caractères génériques, à une exception près : un ID de produit ne peut pas être spécifié si un ID de fournisseur n'est pas aussi spécifié. Sinon, la règle n'est pas valide et est ignorée. + + Le modèle d'autorisation USB utilise l'URL du site à l'origine de la demande ("URL de requête") et l'URL du site du cadre de premier niveau ("URL d'intégration") pour autoriser l'URL de requête à accéder à l'appareil USB. L'URL de requête peut être différente de l'URL d'intégration si le site à l'origine de la demande est chargé dans un iFrame. Le champ "URL" peut de ce fait contenir jusqu'à deux chaînes d'URL séparées par une virgule, afin d'indiquer l'URL de requête et l'URL d'intégration, respectivement. Si une seule URL est spécifiée, l'accès aux appareils USB concernés est autorisé si l'URL du site à l'origine de la demande correspond à cette URL, quel que soit l'état d'intégration. Si les URL indiquées dans le champ "URL" ne sont pas valides, la règle est ignorée. + + Si cette règle n'est pas configurée, la valeur par défaut globale sera utilisée pour tous les sites à partir de la règle DefaultWebUsbGuardSetting si celle-ci est définie ou, à défaut, à partir de la configuration personnelle de l'utilisateur. + + Les formats d'URL de cette règle ne doivent pas entrer en conflit avec ceux qui ont été configurés via WebUsbBlockedForUrls. En cas de conflit, cette règle est prioritaire sur les règles WebUsbBlockedForUrls et WebUsbAskForUrls. + + Les valeurs choisies pour cette règle sont fusionnées avec celles de la règle WebUsbAllowDevicesForUrls.</translation> <translation id="4298509794364745131">Liste des applications qui peuvent être activées pour la prise de notes sur l'écran de verrouillage de <ph name="PRODUCT_OS_NAME" />. Si l'application de prise de notes préférée est activée sur l'écran de verrouillage, ce dernier présente un élément permettant de la lancer. @@ -2020,6 +2025,7 @@ <translation id="4639407427807680016">Noms des hôtes de messagerie native à exclure de la liste noire</translation> <translation id="4650759511838826572">Désactiver les schémas de protocole d'URL</translation> <translation id="465099050592230505">URL de boutique en ligne d'entreprise (abandonné)</translation> +<translation id="4661889655253181651">L'option "Paramètres de contenu" permet d'indiquer la manière dont le contenu d'un type spécifique (par exemple, Cookies, Images ou JavaScript) est géré.</translation> <translation id="4665897631924472251">Paramètres de gestion des extensions</translation> <translation id="4668325077104657568">Paramètres d'images par défaut</translation> <translation id="4670865688564083639">Plage minimale :</translation> @@ -2064,6 +2070,11 @@ Ces suggestions sont récupérées à distance sur les serveurs Google. Si cette règle est définie sur False, aucune suggestion n'est récupérée ni affichée.</translation> +<translation id="4759650396863318477">Permet de définir la période, en millisecondes, pendant laquelle les utilisateurs sont avertis que <ph name="PRODUCT_NAME" /> doit être relancé ou qu'un appareil <ph name="PRODUCT_OS_NAME" /> doit être redémarré pour appliquer une mise à jour en attente. + + Au cours de cette période, l'utilisateur est régulièrement informé de la nécessité d'appliquer la mise à jour. Pour les appareils <ph name="PRODUCT_OS_NAME" />, une notification de redémarrage s'affiche dans la barre d'état système conformément à la règle <ph name="RELAUNCH_HEADS_UP_PERIOD_POLICY_NAME" />. Pour les navigateurs <ph name="PRODUCT_NAME" />, lorsqu'un tiers de la période de notification s'est écoulé, le menu d'application change pour indiquer qu'il est nécessaire de redémarrer le navigateur. La notification change de couleur une première fois lorsque les deux tiers de la période de notification se sont écoulés et une deuxième fois à l'issue de cette période. Les notifications supplémentaires activées par la règle <ph name="RELAUNCH_NOTIFICATION_POLICY_NAME" /> pour les navigateurs suivent ce même programme. + + Si ce paramètre n'est pas défini, la période par défaut est fixée à 345 600 000 millisecondes (quatre jours) pour les appareils <ph name="PRODUCT_OS_NAME" /> et à 604 800 000 millisecondes (une semaine) pour <ph name="PRODUCT_NAME" />.</translation> <translation id="4788252609789586009">Active la fonctionnalité de saisie automatique de <ph name="PRODUCT_NAME" />, qui permet à l'utilisateur de remplir automatiquement des formulaires Web à partir de données stockées précédemment, telles que des informations relatives à sa carte de crédit. Si ce paramètre est désactivé, ces informations ne sont jamais suggérées ni saisies automatiquement. De même, les informations complémentaires de carte de crédit que l'utilisateur est susceptible de fournir sur une page Web ne sont pas enregistrées. @@ -2273,6 +2284,15 @@ Si cette règle n'est pas configurée, la valeur par défaut globale sera utilisée pour tous les sites à partir de la règle "DefaultNotificationsSetting", si elle est définie, ou à défaut, à partir de la configuration personnelle de l'utilisateur.</translation> <translation id="5213038356678567351">Sites Web qui ne doivent jamais déclencher un changement de navigateur.</translation> <translation id="5219844027738217407">Cette règle ne s'applique qu'au micro pour les applications Android. Lorsqu'elle est définie sur "True", le son du micro est coupé pour toutes les applications Android sans exception.</translation> +<translation id="5221394278852982313">Vous permet de définir une liste d'URL indiquant les sites automatiquement autorisés à accéder à un appareil USB correspondant aux ID de fournisseur et de produit indiqués. Chaque élément de la liste doit contenir à la fois les appareils et les URL pour que la règle soit valide. Chaque élément des appareils peut contenir un champ d'ID de produit et d'ID de fournisseur. Les ID non renseignés sont traités comme des caractères génériques, à une exception près : un ID de produit ne peut pas être spécifié si un ID de fournisseur n'est pas aussi spécifié. Sinon, la règle n'est pas valide et est ignorée. + + Le modèle d'autorisation USB utilise l'URL du site à l'origine de la demande ("URL de requête") et l'URL du site du cadre de premier niveau ("URL d'intégration") pour autoriser l'URL de requête à accéder à l'appareil USB. L'URL de requête peut être différente de l'URL d'intégration si le site à l'origine de la demande est chargé dans un iFrame. Le champ "URL" peut de ce fait contenir jusqu'à deux chaînes d'URL séparées par une virgule, afin d'indiquer l'URL de requête et l'URL d'intégration, respectivement. Si une seule URL est spécifiée, l'accès aux appareils USB concernés est autorisé si l'URL du site à l'origine de la demande correspond à cette URL, quel que soit l'état d'intégration. Si les URL indiquées dans le champ "URL" ne sont pas valides, la règle est ignorée. + + Si cette règle n'est pas configurée, la valeur par défaut globale sera utilisée pour tous les sites à partir de la règle DefaultWebUsbGuardSetting si celle-ci est définie ou, à défaut, à partir de la configuration personnelle de l'utilisateur. + + Les formats d'URL de cette règle ne doivent pas entrer en conflit avec ceux qui ont été configurés via WebUsbBlockedForUrls. En cas de conflit, cette règle est prioritaire sur les règles WebUsbBlockedForUrls et WebUsbAskForUrls. + + Les valeurs choisies pour cette règle sont fusionnées avec celles de la règle DeviceWebUsbAllowDevicesForUrls.</translation> <translation id="5228316810085661003">Détermine le délai de connexion automatique à un compte local de l'appareil. Si la règle |DeviceLocalAccountAutoLoginId| n'est pas définie, elle n'a aucune incidence. @@ -3016,6 +3036,20 @@ Si cette règle est définie sur "Ne pas autoriser les utilisateurs à gérer les certificats", ils pourront consulter les certificats utilisateur, mais ne seront pas en mesure de les gérer.</translation> <translation id="6573305661369899995">Définir une source externe pour les restrictions d'URL</translation> +<translation id="6583851521569686409">Permet de configurer une liste d'imprimantes. + + Cette règle offre la possibilité aux administrateurs de proposer des configurations d'imprimantes à leurs utilisateurs. + + <ph name="PRINTER_DISPLAY_NAME" /> et <ph name="PRINTER_DESCRIPTION" /> sont des chaînes au format libre, que vous pouvez personnaliser pour faciliter la sélection de l'imprimante. <ph name="PRINTER_MANUFACTURER" /> et <ph name="PRINTER_MODEL" /> visent à aider les utilisateurs finaux à identifier rapidement une imprimante. Ces chaînes correspondent respectivement au fabricant et au modèle de l'imprimante. <ph name="PRINTER_URI" /> doit être une adresse accessible à partir d'un ordinateur client (cette chaîne doit inclure les éléments <ph name="URI_SCHEME" />, <ph name="URI_PORT" /> et <ph name="URI_QUEUE" />). <ph name="PRINTER_UUID" /> est facultatif. S'il est indiqué, il est utilisé pour supprimer les imprimantes <ph name="ZEROCONF_DISCOVERY" /> en double. + + Soit <ph name="PRINTER_EFFECTIVE_MODEL" /> doit contenir le nom de l'imprimante, soit <ph name="PRINTER_AUTOCONF" /> doit être défini sur "True". Toute imprimante avec ces deux propriétés ou sans aucune propriété est ignorée. + + La configuration d'une imprimante est effectuée lors de sa première utilisation. Les fichiers PPD ne sont pas téléchargés tant que l'imprimante ne sert pas. Par la suite, les fichiers PPD utilisés fréquemment sont mis en cache. + + Cette règle n'a aucune incidence pour les utilisateurs en ce qui concerne la possibilité ou non de configurer des imprimantes sur différents appareils. Elle est destinée à compléter la configuration des imprimantes effectuée par les différents utilisateurs. + + Pour les appareils gérés par Active Directory, cette règle permet l'expansion de <ph name="MACHINE_NAME_VARIABLE" /> en fonction du nom de machine Active Directory ou de l'une de ses sous-chaînes. Par exemple, si le nom de machine est <ph name="MACHINE_NAME_EXAMPLE" />, alors <ph name="MACHINE_NAME_VARIABLE_EXAMPLE" /> est remplacé par les quatre caractères suivant la sixième position, soit <ph name="MACHINE_NAME_PART_EXAMPLE" />. Notez que la numérotation des positions commence à zéro. + </translation> <translation id="6598235178374410284">Avatar de l'utilisateur</translation> <translation id="6603004149426829878">Toujours transmettre les signaux de localisation disponibles au serveur tout en mettant à jour le fuseau horaire</translation> <translation id="6628120204569232711">Envoyer des rapports sur l'état du stockage</translation> @@ -3465,7 +3499,6 @@ Si cette règle est définie sur "RemoveLRUIfDormant", le nettoyage automatique continue à supprimer les comptes des utilisateurs qui ne se sont pas connectés depuis au moins trois mois en commençant par ceux qui se sont connectés il y a le plus longtemps, et ce jusqu'à ce que l'espace libre soit suffisant. Si cette règle n'est pas définie, le nettoyage automatique utilise la stratégie intégrée par défaut. Actuellement, il s'agit de la stratégie "RemoveLRUIfDormant".</translation> -<translation id="7334274148831027933">Activer la loupe ancrée</translation> <translation id="7336785017449297672">Contrôle les paramètres d'horloge et de fuseau horaire.</translation> <translation id="7336878834592315572">Conserver les cookies pendant toute la durée de la session</translation> <translation id="7339315111520512972">Forcer le code réseau à s'exécuter dans le processus du navigateur</translation> @@ -4367,6 +4400,8 @@ <translation id="915194831143859291">Si la règle est définie sur "False" ou n'est pas configurée, <ph name="PRODUCT_OS_NAME" /> permet à l'utilisateur d'arrêter l'appareil. Si cette règle est définie sur "True", <ph name="PRODUCT_OS_NAME" /> déclenche un redémarrage lorsque l'utilisateur arrête l'appareil. <ph name="PRODUCT_OS_NAME" /> remplace toutes les occurrences des boutons d'arrêt de l'interface utilisateur par des boutons de redémarrage. Si l'utilisateur arrête l'appareil au moyen du bouton Marche/Arrêt, celui-ci ne redémarre pas automatiquement, même si la règle est activée.</translation> <translation id="9152473318295429890">Activer les suggestions contextuelles des pages Web associées</translation> +<translation id="9153446010242995516">Effectuez un rollback et conservez la version cible si elle est antérieure à la version de l'OS. Essayez de conserver la configuration de l'appareil (y compris les identifiants réseau) lors du processus si possible, mais effectuez un Powerwash complet même s'il est impossible de restaurer les données (car la version cible n'est pas compatible avec la restauration de données ou en raison d'une modification incompatible avec la restauration). + Compatible avec la version 75 et les versions ultérieures de <ph name="PRODUCT_OS_NAME" />. Pour les clients plus anciens, cette valeur signifie que la fonction de rollback est désactivée.</translation> <translation id="9158929520101169054">Autoriser la connexion multicompte dans le navigateur</translation> <translation id="9159126470527871268">Avertit les utilisateurs que <ph name="PRODUCT_NAME" /> doit être relancé ou que l'appareil <ph name="PRODUCT_OS_NAME" /> doit être redémarré pour qu'une mise à jour en cours puisse être appliquée.
diff --git a/components/policy/resources/policy_templates_gu.xtb b/components/policy/resources/policy_templates_gu.xtb index e6c1b82..19a61736 100644 --- a/components/policy/resources/policy_templates_gu.xtb +++ b/components/policy/resources/policy_templates_gu.xtb
@@ -144,15 +144,6 @@ જો નીતિ false પર સેટ કરેલી છે, તો dev switch ની સ્થિતિની જાણ કરવામાં આવશે નહીં.</translation> <translation id="1160479894929412407">QUIC પ્રોટોકૉલને મંજૂરી આપો</translation> <translation id="1160939557934457296">સલામત બ્રાઉઝિંગ ચેતવણી પેજ દ્વારા આગળ વધવું બંધ કરો</translation> -<translation id="1171342272070128466">ડૉક કરેલ મૅગ્નિફાયર ઍક્સેસિબિલિટી સુવિધા ચાલુ કરો. - - જો આ નીતિને true પર સેટ કરેલી હોય, તો ડૉક કરેલું મૅગ્નિફાયર હંમેશાં ચાલુ રહેશે. - - જો આ નીતિને false પર સેટ કરેલી હોય, તો ડૉક કરેલું મૅગ્નિફાયર હંમેશાં બંધ રહેશે. - - જો તમે આ નીતિ સેટ કરશો, તો વપરાશકર્તાઓ તેને બદલી કે ઓવરરાઇડ કરી નહીં શકે. - - જો આ નીતિને સેટ કર્યા વિના રાખી હોય, તો ડૉક કરેલું મૅગ્નિફાયર બંધ રહે છે, પણ વપરાશકર્તાઓ તેને કોઈપણ સમયે ચાલુ કરી છે.</translation> <translation id="1189817621108632689">તમને URL પૅટર્નની એવી સૂચિ સેટ કરવાની મંજૂરી આપે છે જે છબી બતાવવાની મંજૂરી ન ધરાવતી હોય તેવી સાઇટનો ઉલ્લેખ કરતી હોય. જો આ નીતિ સેટ કરેલી નહીં હોય, તો બધી સાઇટો માટે, 'DefaultImagesSetting' નીતિ સેટ કરેલી હશે તો તેમાંથી અન્યથા વપરાશકર્તાના વ્યક્તિગત કન્ફિગરેશનમાંથી વૈશ્વિક ડિફૉલ્ટ મૂલ્યનો ઉપયોગ કરવામાં આવશે. @@ -1558,11 +1549,6 @@ કરવામાં આવશે નહિ. જો true પર સેટ કરવામાં આવી હોય અથવા સેટ કર્યા વિના છોડી દેવામાં આવી હોય, તો કિઓસ્ક સત્ર માહિતીની જાણ કરવામાં આવશે.</translation> -<translation id="3852924591079583104"> - જ્યારે આ નીતિને ArcSession પર સેટ કરી હોય, ત્યારે તે Android ચાલુ થઈ જવા પર વપરાશકર્તા સાઇન આઉટ કરે ત્યારે ડિવાઇસને રીબૂટ કરવાનું જરૂરી બનાવે છે. - આ નીતિને 'હંમેશાં' પર સેટ કરી હોય ત્યારે તે દરેક વપરાશકર્તા સાઇન આઉટ કરે ત્યારે ડિવાઇસને રીબૂટ કરવાનું જરૂરી બનાવે છે. - જો આ નીતિને સેટ કર્યા વિના રાખી હશે, તો તેની કોઈ અસર થતી નથી અને વપરાશકર્તાના સાઇન આઉટ કરે ત્યારે રીબૂટ કરવાનું જરૂરી બનતું નથી. 'ક્યારેય નહીં' પર સેટ કરી હોય, ત્યારે પણ આ જ લાગુ થાય છે. - </translation> <translation id="3858658082795336534">ડિફૉલ્ટ પ્રિન્ટિંગ ડુપ્લેક્સ મોડ</translation> <translation id="3859780406608282662"><ph name="PRODUCT_OS_NAME" /> માં વેરિએશન્સ સીડ્સના આનયન પર એક પેરામીટર ઉમેરો. @@ -3446,7 +3432,6 @@ જો આ નીતિ 'RemoveLRUIfDormant' પર સેટ છે, તો જ્યાં સુધી પૂરતી ખાલી જગ્યા ન થાય ત્યાં સુધી સ્વચલિત ક્લિન-અપ ઓછામાં ઓછા 3 મહિનામાં તાજેતરમાં-ઓછા પ્રમાણમાં લોગ ઇન થયેલના ક્રમે વપરાકર્તાઓને દૂર કરવાનું ચાલુ રાખશે. જો આ નીતિ સેટ કરેલ નથી, તો સ્વચલિત ક્લિન-અપ ડિફોલ્ટ બિલ્ટ-ઇન વ્યૂહરચનાનો ઉપયોગ કરે છે. હાલમાં, તે 'RemoveLRUIfDormant' વ્યૂહરચના છે.</translation> -<translation id="7334274148831027933">ડૉક કરેલા મેગ્નિફાયરને ચાલુ કરો</translation> <translation id="7336785017449297672">ઘડિયાળ અને સમય ઝોન સેટિંગનું નિયંત્રણ કરે છે.</translation> <translation id="7336878834592315572">સત્રની અવધિ માટે કૂકીઝ રાખો</translation> <translation id="7339315111520512972">બ્રાઉઝર પ્રક્રિયામાં નેટવર્કિંગ કોડ ચલાવવાનું જરૂરી બનાવો</translation>
diff --git a/components/policy/resources/policy_templates_hi.xtb b/components/policy/resources/policy_templates_hi.xtb index 9f677c9..ae06dd2 100644 --- a/components/policy/resources/policy_templates_hi.xtb +++ b/components/policy/resources/policy_templates_hi.xtb
@@ -143,15 +143,6 @@ अगर यह नीति सेट नहीं की जाती है, या 'गलत' पर सेट की जाती है, तो डेवलपर स्विच की स्थिति की रिपोर्ट नहीं की जाएगी.</translation> <translation id="1160479894929412407">QUIC प्रोटोकॉल की मंज़ूरी देती है</translation> <translation id="1160939557934457296">'सुरक्षित ब्राउज़िंग' के चेतावनी पेज को नज़रअंदाज़ करके आगे बढ़ने की सुविधा बंद करें</translation> -<translation id="1171342272070128466">सामग्री को बड़ा दिखाने की डॉक की गई सुलभता सुविधा चालू करें. - - अगर यह नीति सही पर सेट की जाती है, तो सामग्री को बड़ा दिखाने की डॉक की गई सुविधा हमेशा चालू रहती है. - - अगर यह नीतित गलत पर सेट की जाती है, तो सामग्री को बड़ा दिखाने की डॉक की गई सुविधा हमेशा बंद रहती है. - - अगर आपने यह नीति सेट कर दी है, तो उपयोगकर्ता इसमें बदलाव नहीं कर सकते है. - - अगर यह नीति सेट किए बिना छोड़ी जाती है, तो सामग्री को बड़ा दिखाने वाली की डॉक की गई सुविधा शुरुआत में बंद की जाती है. हालांकि, उपयोगकर्ता इसे बाद में कभी भी चालू कर सकता है.</translation> <translation id="1189817621108632689">आपको उन साइटों के बारे में बताने वाले यूआरएल पैटर्न की सूची सेट करने देती है जिन्हें इमेज दिखाने की मंज़ूरी नहीं है. अगर यह नीति सेट किए बिना छोड़ दी जाती है, तो सभी साइटों के लिए वैश्विक डिफ़ॉल्ट मान का इस्तेमाल या तो 'DefaultImagesSetting' नीति के सेट होने पर इससे किया जाएगा या फिर उपयोगकर्ता के निजी कॉन्फ़िगरेशन से किया जाएगा. @@ -1578,11 +1569,6 @@ अगर नीति गलत पर सेट है, तो किओस्क सत्र की जानकारी की रिपोर्ट नहीं की जाएगी. अगर सही पर सेट है या सेट किए बिना छोड़ दी गई है, तो किओस्क सत्र की जानकारी की रिपोर्ट की जाएगी.</translation> -<translation id="3852924591079583104"> - इस नीति को ArcSession पर सेट किए जाने पर, जब उपयोगकर्ता साइन आउट करता है तब डिवाइस हर हाल में फिर से चालू हो जाता है. इसके लिए यह ज़रूरी है कि Android शुरू हो गया हो. - जब इसे 'हमेशा' पर सेट किया जाता है तब हर बार उपयोगकर्ता के साइन आउट करने पर, डिवाइस को हर हाल में फिर से चालू कर दिया जाता है. - कुछ भी सेट न किए जाने पर, कोई फ़र्क नहीं पड़ेगा. साथ ही, उपयोगकर्ता के साइन आउट करने पर डिवाइस को हर हाल में फिर से चालू नहीं किया जाएगा. 'कभी नहीं' पर सेट किए जाने पर भी ऐसा ही होता है. - </translation> <translation id="3858658082795336534">डिफ़ॉल्ट प्रिंटिंग डुप्लेक्स मोड</translation> <translation id="3859780406608282662"><ph name="PRODUCT_OS_NAME" /> में विविधता सीड को फ़ेच करने की प्रक्रिया में एक पैरामीटर जोड़ देगी. @@ -1662,7 +1648,7 @@ अगर यह गलत पर सेट है या अगर सेट नहीं है तो, कोई प्रमाणपत्र जनरेट नहीं किया जाएगा और enterprise.platformKeys एक्सटेंशन API (एपीआई) पर कॉल नहीं किया जा सकेगा.</translation> <translation id="3964262920683972987">अगर अभी तक किसी उपयोगकर्ता ने डिवाइस में साइन इन नहीं किया है, तो डिवाइस लेवल की वह वॉलपेपर इमेज कॉन्फ़िगर करें जो लॉगिन स्क्रीन पर दिखाई देती है. यह नीति सेट करने के लिए उस यूआरएल को तय किया जाता है जिससे Chrome OS डिवाइस वॉलपेपर इमेज डाउनलोड कर सकता है. साथ ही, डाउनलोड की सही तरीके से पुष्टि करने के लिए क्रिप्टोग्राफ़िक हैश का इस्तेमाल किया जाता है. इमेज JPEG फ़ॉर्मैट में होनी चाहिए, इसका आकार 16 एमबी से ज़्यादा नहीं होना चाहिए. यूआरएल ऐसा होना चाहिए जिसे बिना किसी प्रमाणीकरण के एक्सेस किया जा सके. वॉलपेपर इमेज को डाउनलोड और कैश कर लिया गया है. जब भी यूआरएल या हैश बदलेगा इसे फिर से डाउनलोड किया जाएगा. - अगर डिवाइस के वॉलपेपर की नीति सेट कर दी गई है, तो Chrome OS डिवाइस वॉलपेपर इमेज डाउनलोड करके उसका इस्तेमाल लॉगिन स्क्रीन पर कर सकता है. ऐसा Chrome OS डिवाइस तब कर सकता है, जब तक कोई उपयोगकर्ता उस डिवाइस पर साइन इन न कर ले. जब उपयोगकर्ता लॉगिन कर लेता है, तो उपयोगकर्ता की वॉलपेपर नीति लागू हो जाती है. + अगर डिवाइस के वॉलपेपर की नीति सेट कर दी गई है, तो Chrome OS डिवाइस वॉलपेपर इमेज डाउनलोड करके उसका इस्तेमाल लॉगिन स्क्रीन पर कर सकता है. ऐसा Chrome OS डिवाइस तब तक कर सकता है, जब तक कोई उपयोगकर्ता उस डिवाइस पर साइन इन न कर ले. जब उपयोगकर्ता लॉगिन कर लेता है, तो उपयोगकर्ता की वॉलपेपर नीति लागू हो जाती है. अगर डिवाइस के वॉलपेपर की नीति सेट नहीं की गई है, तो यह उपयोगकर्ता की नीति तय करेगी कि कौनसा वॉलपेपर दिखाया जाना चाहिए. ऐसा तब होगा जब उपयोगकर्ता की वॉलपेपर नीति सेट की गई हो.</translation> <translation id="3965339130942650562">गतिविधि नहीं कर रहे उपयोगकर्ता को जब तक लॉग-आउट नहीं कर दिया जाता तब तक टाइमआउट</translation> @@ -2421,7 +2407,7 @@ अगर आपने यह नीति सेट कर दी है, तो उपयोगकर्ता इसमें बदलाव नहीं कर सकते. - अगर नीति को सेट नहीं की जाती है, तो उपयोगकर्ता डेस्कटॉप और लॉगिन स्क्रीन बैकग्राउंड पर दिखाने के लिए इमेज चुन सकता है.</translation> + अगर नीति को सेट नहीं की जाती है, तो उपयोगकर्ता डेस्कटॉप पर और लॉगिन स्क्रीन बैकग्राउंड पर दिखाने के लिए इमेज चुन सकता है.</translation> <translation id="5437733496511628148">इस सेटिंग को चालू करने पर उन वेब पेज ऐलीमेंट से कुकी सेट नहीं हो पाती, जो उस डोमेन के नहीं हैं जो ब्राउज़र के पता बार में हैं. इस सेटिंग को बंद करने पर उन वेब पेज ऐलीमेंट से कुकी सेट की जा सकती हैं, जो उस डोमेन के नहीं हैं जो ब्राउज़र के पता बार में हैं. साथ ही, यह इस सेटिंग को बदलने से रोकती है. @@ -3465,7 +3451,6 @@ अगर यह नीति 'RemoveLRUIfDormant' पर सेट है, तो स्वचालित क्लीन-अप हाल ही में सबसे कम प्रवेश के क्रम में ऐसे उपयोगकर्ताओं को जिन्होंने कम से कम 3 माह से प्रवेश नहीं किया है, तब तक निकालना जारी रखेगा जब तक कि काफ़ी स्थान खाली न हो जाए. अगर यह नीति सेट नहीं है, तो स्वचालित क्लीन-अप डिफ़ॉल्ट अंतर्निहित कार्यनीति का उपयोग करता है. वर्तमान में, यह 'RemoveLRUIfDormant' कार्यनीति है.</translation> -<translation id="7334274148831027933">सामग्री को बड़ा दिखाने की डॉक की गई सुविधा चालू करें</translation> <translation id="7336785017449297672">घड़ी और समय क्षेत्र सेटिंग नियंत्रित करती है.</translation> <translation id="7336878834592315572">सत्र की अवधि तक कुकी बनाए रखना</translation> <translation id="7339315111520512972">नेटवर्किंग कोड को हर हाल में ब्राउज़र प्रोसेस में ही चलाएं</translation> @@ -4058,9 +4043,9 @@ <translation id="8549772397068118889">सामग्री पैक से बाहर की साइटें विज़िट करने पर चेतावनी दें</translation> <translation id="8566729013138025202">ऐसी नीतियों के समूह के बारे में बताता है जिन्हें ARC रनटाइम को सौंप दिया जाएगा. मान कोई मान्य JSON होना चाहिए. - इस नीति का इस्तेमाल यह कॉन्फ़िगर करने के लिए किया जा सकता है कि डिवाइस पर कौनसे ऐप्लिकेशन अपने आप इंस्टॉल किए जा सकते हैं. + इस नीति का इस्तेमाल यह कॉन्फ़िगर करने के लिए किया जा सकता है कि डिवाइस पर कौनसे Android ऐप्लिकेशन अपने आप इंस्टॉल किए जा सकते हैं. - लॉन्चर में ऐप्लिकेशन को सबसे ऊपर दिखाने के लिए, PinnedLauncherApps देखें.</translation> + लॉन्चर में ऐप्लिकेशन सबसे ऊपर दिखाने के लिए, PinnedLauncherApps देखें.</translation> <translation id="8566842294717252664">वेब स्टोर को नया टैब पेज और ऐप्लिकेशन लॉन्चर से छिपाएं</translation> <translation id="8569734380847633643"> अगर यह नीति गलत पर सेट है, तो <ph name="PRODUCT_OS_NAME" /> वाई-फ़ाई को बंद कर देगा और उपयोगकर्ता इसे फिर चालू नहीं कर पाएंगे.
diff --git a/components/policy/resources/policy_templates_hr.xtb b/components/policy/resources/policy_templates_hr.xtb index 4744e48..f7e9557c 100644 --- a/components/policy/resources/policy_templates_hr.xtb +++ b/components/policy/resources/policy_templates_hr.xtb
@@ -132,15 +132,6 @@ Ako se pravilo ne postavi ili se postavi na neistinito, izvješće o stanju prekidača za razvojne programere neće se generirati.</translation> <translation id="1160479894929412407">Dopusti QUIC protokol</translation> <translation id="1160939557934457296">Onemogući nastavljanje sa stranice upozorenja Sigurno pregledavanje</translation> -<translation id="1171342272070128466">Omogućite značajku pristupačnosti usidrenog povećala. - - Ako se to pravilo postavi na true, usidreno povećalo uvijek će biti omogućeno. - - Ako se to pravilo postavi na false, usidreno povećalo uvijek će biti onemogućeno. - - Ako postavite to pravilo, korisnici ga neće moći promijeniti ni nadjačati. - - Ako se to pravilo ne postavi, usidreno povećalo izvorno je onemogućeno, ali ga korisnici mogu u bilo kojem trenutku omogućiti.</translation> <translation id="1189817621108632689">Omogućuje postavljanje popisa uzoraka URL-ova koji određuju web-lokacije koje ne smiju prikazivati slike. Ako ovo pravilo nije postavljeno, upotrebljavat će se globalna zadana vrijednost za sve web-lokacije iz pravila "DefaultImagesSetting" ako je postavljeno, odnosno iz osobne konfiguracije korisnika ako nije. @@ -1112,6 +1103,15 @@ Ako se to pravilo ne postavi, ponašanje detaljnijih pravila ostat će nepromijenjeno.</translation> <translation id="2987155890997901449">Omogući ARC</translation> <translation id="2987227569419001736">Upravljanje upotrebom API-ja Web Bluetooth</translation> +<translation id="2990018289267778247">Ako se to pravilo postavi na true, opcije pristupačnosti uvijek se prikazuju na izborniku trake sustava. + + Ako se pravilo postavi na false, opcije pristupačnosti nikad se neće prikazivati na izborniku trake sustava. + + Ako postavite to pravilo, korisnici ga neće moći promijeniti ni nadjačati. + + Ako ne postavite to pravilo, opcije pristupačnosti neće se prikazivati na izborniku trake sustava, ali ih korisnik može prikazati putem stranice Postavke. + + Kada su omogućene značajke pristupačnosti (na drugi način, primjerice kombinacijom tipki), opcije pristupačnosti uvijek će se pojaviti na izborniku trake sustava.</translation> <translation id="3011301228198307065">Konfigurira URL zadane početne stranice u pregledniku <ph name="PRODUCT_NAME" /> i korisnicima onemogućuje da ga promijene. Početna je stranica ona koja se otvara gumbom početnog zaslona. Stranicama koje se otvaraju prilikom pokretanja upravljaju pravila RestoreOnStartup. @@ -1426,6 +1426,7 @@ To pravilo upotrebljava prijava za pravilo u oblaku strojnog opsega na radnoj površini i može ga postaviti Registry ili GPO u sustavu Windows, plist na Macu i JSON datoteka pravila na Linuxu.</translation> <translation id="3660562134618097814">Prenesi kolačiće SAML IdP-a tijekom prijave</translation> <translation id="3701121231485832347">Upravlja postavkama specifičnima za uređaje <ph name="PRODUCT_OS_NAME" /> kojima upravlja <ph name="MS_AD_NAME" />.</translation> +<translation id="3702518095257671450">Daljinsko atestiranje</translation> <translation id="3702647575225525306"><ph name="POLICY_NAME" /> (Polje s jednim retkom obustavljeno je i uklonit će se. Počnite upotrebljavati tekstni okvir s više redaka u nastavku.)</translation> <translation id="3709266154059827597">Konfiguriraj crnu listu instalacije proširenja</translation> <translation id="3711895659073496551">Obustavi</translation> @@ -1536,11 +1537,6 @@ Ako se pravilo postavi na "false", informacije sesije kioska neće se prijavljivati. Ako se postavi na "true" ili se ne postavi, prijavljivat će se informacije sesije kioska.</translation> -<translation id="3852924591079583104"> - Kada se postavi na ArcSession, to pravilo prisilno ponovo pokreće uređaj nakon što se korisnik odjavi, a Android je pokrenut. - Kada se postavi na Always, pravilo prisilno ponovo pokreće uređaj nakon svake odjave korisnika. - Ako se ne postavi, pravilo nema učinka i uređaj se neće prisilno ponovo pokrenuti nakon što se korisnik odjavi. Isto vrijedi i ako se pravilo postavi na Never (Nikad). - </translation> <translation id="3858658082795336534">Dvostrani način zadanog ispisa</translation> <translation id="3859780406608282662">Dodaje parametar dohvaćanju početne vrijednosti Varijacija u proizvodu <ph name="PRODUCT_OS_NAME" />. @@ -1823,6 +1819,15 @@ To se pravilo poštuje samo ako je omogućeno pravilo "DefaultSearchProviderEnabled".</translation> <translation id="4285674129118156176">Omogućuje nepridruženim korisnicima da upotrebljavaju ARC</translation> +<translation id="4289903996435140853">Omogućuje postavljanje popisa URL-ova koji navode koje će web-lokacije automatski dobiti dopuštenje za pristup USB uređaju s navedenim ID-jem dobavljača i ID-jem proizvoda. Svaka stavka na popisu mora sadržavati uređaje i URL-ove da bi pravilo bilo važeće. Svaka stavka na uređaju može sadržavati polje ID-ja dobavljača i ID-ja proizvoda. Svaki izostavljeni ID smatra se zamjenskim znakom s jednom iznimkom, a ta je iznimka da se ID proizvoda ne može navesti, a da se ne navede i ID dobavljača. U suprotnom pravilo neće biti važeće i zanemarit će se. + + Model dopuštenja za USB upotrebljava URL web-lokacije koja šalje zahtjev ("URL koji šalje zahtjev") i URL vršnih web-lokacija u okviru ("URL koji se ugrađuje") kako bi se URL-u koji šalje zahtjev dopustio pristup USB uređaju. URL koji šalje zahtjev može se razlikovati od URL-a koji se ugrađuje ako se web-lokacija koja šalje zahtjev učitava u iframeu. Stoga, da bi se odredio URL koji šalje zahtjev i URL koji se ugrađuje, polje za "URL-ove" može sadržavati najviše dva niza URL-a razdvojena zarezom. Ako se odredi samo jedan URL, pristup će biti dopušten odgovarajućim USB uređajima kada se URL web-lokacije koja šalje zahtjev podudara s ovim URL-om, bez obzira na status ugrađivanja. URL-ovi u polju "URL-ovi" moraju biti važeći. U protivnom će se pravilo zanemariti. + + Ako se to pravilo ne postavi, za sve web-lokacije upotrebljavat će se globalna zadana vrijednost iz pravila "DefaultWebUsbGuardSetting" ako je to pravilo postavljeno, a ako nije, upotrebljavat će se korisnikova osobna konfiguracija. + + Uzorci URL-a u ovom pravilu ne bi trebali biti u sukobu s onima koji su konfigurirani pravilom WebUsbBlockedForUrls. Ako se pojavi sukob, ovo će pravilo imati prednost pred pravilima WebUsbBlockedForUrls i WebUsbAskForUrls. + + Vrijednosti za to pravilo i pravilo WebUsbAllowDevicesForUrls spajaju se.</translation> <translation id="4298509794364745131">Navodi popis aplikacija koje se mogu omogućiti kao aplikacije za izradu bilježaka na zaključanom zaslonu uređaja sa sustavom <ph name="PRODUCT_OS_NAME" />. Ako je željena aplikacija za izradu bilježaka omogućena na zaključanom zaslonu, zaključani će zaslon sadržavati element korisničkog sučelja za pokretanje željene aplikacije. @@ -1966,6 +1971,7 @@ <translation id="4639407427807680016">Nazivi hostova za lokalno slanje poruka koje treba izuzeti s popisa nedopuštenih</translation> <translation id="4650759511838826572">Onemogući sheme URL protokola</translation> <translation id="465099050592230505">URL web-trgovine tvrtke (obustavljeno)</translation> +<translation id="4661889655253181651">Postavke sadržaja omogućuju određivanje načina postupanja s određenim vrstama sadržaja (kao što su kolačići, slike i JavaScript).</translation> <translation id="4665897631924472251">Postavke upravljanja proširenjima</translation> <translation id="4668325077104657568">Zadana postavka slika</translation> <translation id="4670865688564083639">Minimalno:</translation> @@ -2010,6 +2016,11 @@ Ti se prijedlozi dohvaćaju daljinski s Googleovih poslužitelja. Ako se pravilo postavi na False, prijedlozi se neće dohvaćati ni prikazivati.</translation> +<translation id="4759650396863318477">Omogućuje postavljanje razdoblja u milisekundama tijekom kojeg će se prikazivati obavijesti o ponovnom pokretanju preglednika <ph name="PRODUCT_NAME" /> ili da je potrebno ponovo pokrenuti <ph name="PRODUCT_OS_NAME" /> radi primjene ažuriranja na čekanju. + + Tijekom tog će se vremena korisniku prikazivati ponavljajuća obavijest o potrebnom ažuriranju. Za <ph name="PRODUCT_OS_NAME" /> uređaje obavijest o ponovnom pokretanju prikazuje se na traci sustava u skladu s pravilom <ph name="RELAUNCH_HEADS_UP_PERIOD_POLICY_NAME" />. Za preglednike <ph name="PRODUCT_NAME" /> izbornik aplikacije mijenja se kada istekne trećina razdoblja obavijesti kako bi se naznačilo da je potrebno ponovno pokretanje. Boja te obavijesti mijenja se kada isteknu dvije trećine razdoblja i još jednom kada istekne cijelo razdoblje. Dodatne obavijesti omogućene pravilom <ph name="RELAUNCH_NOTIFICATION_POLICY_NAME" /> za preglednike imaju isti raspored. + + Ako se ne postavi, za <ph name="PRODUCT_OS_NAME" /> uređaje upotrebljava se zadano razdoblje od 345.600.000 milisekundi (četiri dana), a za <ph name="PRODUCT_NAME" /> zadano razdoblje od 604.800.000 milisekundi (jedan tjedan).</translation> <translation id="4788252609789586009">Omogućuje značajku Automatsko popunjavanje na usluzi <ph name="PRODUCT_NAME" /> i omogućuje korisnicima automatsko unošenje podataka o kreditnim karticama u web-obrasce pomoću prethodno pohranjenih podataka. Ako se ta postavka onemogući, Automatsko popunjavanje nikada neće predlagati niti unositi podatke o kreditnim karticama niti će spremiti dodatne podatke o kreditnim karticama koje bi korisnik mogao unijeti tijekom pregledavanja weba. @@ -2209,6 +2220,15 @@ <translation id="5208240613060747912">Omogućuje postavljanje popisa uzoraka URL-ova koji određuju web-lokacije koje ne smiju prikazivati obavijesti. Ako ovo pravilo nije postavljeno, upotrebljavat će se globalna zadana vrijednost za sve web-lokacije iz pravila "DefaultNotificationsSetting" ako je postavljeno, odnosno iz osobne konfiguracije korisnika ako nije.</translation> <translation id="5213038356678567351">Web-lokacije koje nikad ne pokreću promjenu preglednika.</translation> <translation id="5219844027738217407">Za Android aplikacije to pravilo utječe samo na mikrofon. Kada se to pravilo postavi na True, mikrofon je isključen za sve Android aplikacije, bez iznimke.</translation> +<translation id="5221394278852982313">Omogućuje postavljanje popisa URL-ova koji navode koje će web-lokacije automatski dobiti dopuštenje za pristup USB uređaju s navedenim ID-jem dobavljača i ID-jem proizvoda. Svaka stavka na popisu mora sadržavati uređaje i URL-ove da bi pravilo bilo važeće. Svaka stavka na uređaju može sadržavati polje ID-ja dobavljača i ID-ja proizvoda. Svaki izostavljeni ID smatra se zamjenskim znakom s jednom iznimkom, a ta je iznimka da se ID proizvoda ne može navesti, a da se ne navede i ID dobavljača. U suprotnom pravilo neće biti važeće i zanemarit će se. + + Model dopuštenja za USB upotrebljava URL web-lokacije koja šalje zahtjev ("URL koji šalje zahtjev") i URL vršnih web-lokacija u okviru ("URL koji se ugrađuje") kako bi se URL-u koji šalje zahtjev dopustio pristup USB uređaju. URL koji šalje zahtjev može se razlikovati od URL-a koji se ugrađuje ako se web-lokacija koja šalje zahtjev učitava u iframeu. Stoga, da bi se odredio URL koji šalje zahtjev i URL koji se ugrađuje, polje za "URL-ove" može sadržavati najviše dva niza URL-a razdvojena zarezom. Ako se odredi samo jedan URL, pristup će biti dopušten odgovarajućim USB uređajima kada se URL web-lokacije koja šalje zahtjev podudara s ovim URL-om, bez obzira na status ugrađivanja. URL-ovi u polju "URL-ovi" moraju biti važeći. U protivnom će se pravilo zanemariti. + + Ako se to pravilo ne postavi, za sve web-lokacije upotrebljavat će se globalna zadana vrijednost iz pravila "DefaultWebUsbGuardSetting" ako je to pravilo postavljeno, a ako nije, upotrebljavat će se korisnikova osobna konfiguracija. + + Uzorci URL-a u ovom pravilu ne bi trebali biti u sukobu s onima koji su konfigurirani pravilom WebUsbBlockedForUrls. Ako se pojavi sukob, ovo će pravilo imati prednost pred pravilima WebUsbBlockedForUrls i WebUsbAskForUrls. + + Vrijednosti za to pravilo i pravilo DeviceWebUsbAllowDevicesForUrls spajaju se.</translation> <translation id="5228316810085661003">Odgoda automatske prijave lokalnog računa na uređaju. To se pravilo ne primjenjuje ako se ne postavi pravilo |DeviceLocalAccountAutoLoginId|. U protivnom: @@ -2930,6 +2950,21 @@ Ako se pravilo postavi na "Onemogući korisnicima upravljanje certifikatima", korisnici neće moći upravljati certifikatima, već će ih moći samo prikazati.</translation> <translation id="6573305661369899995">Postavi vanjski izvor ograničenja URL-ova</translation> +<translation id="6583851521569686409">Konfigurira popis pisača. + + To pravilo omogućuje administratorima da navedu konfiguracije pisača za + korisnike. + + <ph name="PRINTER_DISPLAY_NAME" /> i <ph name="PRINTER_DESCRIPTION" /> predstavljaju nizove slobodnog oblika koji se mogu prilagoditi radi lakšeg odabira pisača. <ph name="PRINTER_MANUFACTURER" /> i <ph name="PRINTER_MODEL" /> krajnjim korisnicima omogućuju da lakše prepoznaju pisač tako što predstavljaju proizvođača i model pisača. <ph name="PRINTER_URI" /> treba biti adresa kojoj se može pristupiti s računala klijenta, uključujući <ph name="URI_SCHEME" />, <ph name="URI_PORT" /> i <ph name="URI_QUEUE" />. <ph name="PRINTER_UUID" /> nije obavezan. Ako se navede, služi za uklanjanje duplikata <ph name="ZEROCONF_DISCOVERY" /> pisača. + + <ph name="PRINTER_EFFECTIVE_MODEL" /> treba sadržavati naziv pisača ili se <ph name="PRINTER_AUTOCONF" /> treba postaviti na true. Pisači s oba ta svojstva ili bez ijednog od tih svojstava zanemarit će se. + + Postavljanje pisača dovršava se po prvoj upotrebi pisača. PPD-ovi će se preuzeti tek prilikom upotrebe pisača. Nakon toga često korišteni PPD-ovi spremit će se u predmemoriju. + + To pravilo ne utječe na mogućnost korisnika da konfiguriraju pisače na pojedinačnim uređajima. Ono služi kao dodatno pravilo za konfiguraciju pisača pojedinačnih korisnika. + + Za uređaje kojima upravlja Active Directory to pravilo podržava proširivanje naziva uređaja <ph name="MACHINE_NAME_VARIABLE" /> na naziv uređaja Active Directoryja ili njegov podniz. Na primjer, ako naziv uređaja glasi <ph name="MACHINE_NAME_EXAMPLE" />, onda će se <ph name="MACHINE_NAME_VARIABLE_EXAMPLE" /> zamijeniti s četiri znaka iza šestog položaja, tj. <ph name="MACHINE_NAME_PART_EXAMPLE" />. Položaj se temelji na nuli. + </translation> <translation id="6598235178374410284">Slika avatara korisnika</translation> <translation id="6603004149426829878">Uvijek šalji sve dostupne signale lokacije poslužitelju prilikom utvrđivanja vremenske zone</translation> <translation id="6628120204569232711">Izvješćivanje o statusu pohrane</translation> @@ -3365,7 +3400,6 @@ Ako se to pravilo postavi na "RemoveLRUIfDormant", automatsko čišćenje uklanjat će korisnike koji se nisu prijavili najmanje 3 mjeseca počevši od onog koji se najdulje nije prijavljivao, sve dok ne bude dovoljno prostora. Ako se to pravilo ne postavi, automatsko čišćenje upotrebljava zadanu ugrađenu strategiju. Ta je strategija trenutačno "RemoveLRUIfDormant".</translation> -<translation id="7334274148831027933">Omogući usidreno povećalo</translation> <translation id="7336785017449297672">Upravlja postavkama sata i vremenske zone.</translation> <translation id="7336878834592315572">Zadrži kolačiće za vrijeme trajanja sesije</translation> <translation id="7339315111520512972">Nametni pokretanje koda za umrežavanje u procesu preglednika</translation> @@ -4237,6 +4271,8 @@ <translation id="915194831143859291">Ako se to pravilo postavi na "netočno" ili se ne konfigurira, <ph name="PRODUCT_OS_NAME" /> dopustit će korisniku isključivanje uređaja. Ako se pravilo postavi na "točno", <ph name="PRODUCT_OS_NAME" /> ponovo će pokrenuti uređaj kada ga korisnik isključi. <ph name="PRODUCT_OS_NAME" /> zamjenjuje sve gumbe za isključivanje na korisničkom sučelju gumbima za ponovno pokretanje. Ako korisnik isključi uređaj tipkom za uključivanje/isključivanje, uređaj se neće automatski ponovo pokrenuti, čak ni ako je to pravilo omogućeno.</translation> <translation id="9152473318295429890">Omogući kontekstualne prijedloge povezanih web-stranica</translation> +<translation id="9153446010242995516">Vraća uređaj na ciljnu verziju i ostaje na njoj ako je verzija OS-a novija od ciljne. Pokušajte prenijeti konfiguraciju uređaja (uključujući mrežne vjerodajnice) ako je moguće, ali vraćanje izvršite uz potpuni powerwash čak i ako oporavak podataka nije moguć (zato što ciljna verzija ne podržava oporavak podataka ili zbog promjene koja nije kompatibilna sa starijim verzijama). + Podržano u sustavu <ph name="PRODUCT_OS_NAME" /> verzije 75 i novijima. Za starije klijente ta vrijednost znači da vraćanje nije omogućeno.</translation> <translation id="9158929520101169054">Omogući višestruku prijavu u pregledniku</translation> <translation id="9159126470527871268">Obavještava korisnike da se <ph name="PRODUCT_NAME" /> mora ponovo pokrenuti ili se <ph name="PRODUCT_OS_NAME" /> mora ponovo pokrenuti radi primjene ažuriranja na čekanju.
diff --git a/components/policy/resources/policy_templates_hu.xtb b/components/policy/resources/policy_templates_hu.xtb index ee7ff92..af331499 100644 --- a/components/policy/resources/policy_templates_hu.xtb +++ b/components/policy/resources/policy_templates_hu.xtb
@@ -141,15 +141,6 @@ Ha a házirend értéke hamis, akkor a fejlesztői kapcsoló állapota nem lesz jelentve.</translation> <translation id="1160479894929412407">A QUIC protokoll engedélyezése</translation> <translation id="1160939557934457296">Biztonságos Böngészés figyelmeztetőoldal</translation> -<translation id="1171342272070128466">A dokkolt nagyító kisegítő funkció engedélyezése. - - Ha a házirend igaz értékre van beállítva, a dokkolt nagyító mindig engedélyezve lesz. - - Ha a házirend hamis értékre van beállítva, a dokkolt nagyító mindig le lesz tiltva. - - Ha beállítja ezt a házirendet, a felhasználók nem módosíthatják vagy bírálhatják felül. - - Ha nem állítja be a házirendet, akkor a dokkolt nagyító kezdetben le van tiltva, de a felhasználó bármikor engedélyezheti.</translation> <translation id="1189817621108632689">Lehetővé teszi, hogy megadja az URL-minták azon listáját, amely meghatározza, mely webhelyek nem jeleníthetnek meg képeket. Ha a házirend konfigurálatlanul marad, akkor a rendszer a „DefaultImagesSetting” házirend globális alapértelmezett értékét használja valamennyi webhelyre vonatkozóan (ha az be van állítva), vagy pedig a felhasználó saját személyes beállítását. @@ -1122,6 +1113,15 @@ Ha a házirend nincs beállítva, akkor nem befolyásolja a specifikusabb házirendek működését.</translation> <translation id="2987155890997901449">ARC engedélyezése</translation> <translation id="2987227569419001736">A Web Bluetooth API használatának irányítása</translation> +<translation id="2990018289267778247">Ha a házirend beállítása igaz, a kisegítő lehetőségek mindig megjelennek a tálca menüjében. + + Ha a házirend beállítása hamis, a kisegítő lehetőségek sosem jelennek meg a tálca menüjében. + + Ha beállítja ezt a házirendet, a felhasználó nem módosíthatja vagy bírálhatja felül. + + Ha nem állítja be a házirendet, akkor a kisegítő lehetőségek nem jelennek meg a tálca menüjében, de a felhasználó bármikor engedélyezheti a megjelenésüket a beállítások között. + + A kisegítő funkciók engedélyezésekor (ha az aktiválás más módszerrel, például billentyűkombinációval történt) a kisegítő lehetőségek mindig megjelennek a tálca menüjében.</translation> <translation id="3011301228198307065">Beállítja a kezdőlap alapértelmezett címét a <ph name="PRODUCT_NAME" /> böngészőben, és megakadályozza, hogy a felhasználók módosítsák. A kezdőlapot a Főoldal gomb megnyomásával lehet megnyitni. Az indításkor megnyíló oldalakat a RestoreOnStartup házirendek szabályozzák. @@ -1437,6 +1437,7 @@ Ez a házirend a gépek hatókörére vonatkozó, felhővel kapcsolatos házirend asztali környezetben való regisztrációjánál használható. Beállítása Windows rendszeren beállításjegyzék vagy GPO, Mac rendszeren plist, Linux esetében pedig JSON-házirendfájl használatával lehetséges.</translation> <translation id="3660562134618097814">SAML IdP cookie-k átadása a bejelentkezés során</translation> <translation id="3701121231485832347">A(z) <ph name="MS_AD_NAME" /> által kezelt <ph name="PRODUCT_OS_NAME" />-eszközök beállításainak módosítására szolgál.</translation> +<translation id="3702518095257671450">Távoli tanúsítás</translation> <translation id="3702647575225525306"><ph name="POLICY_NAME" /> (Az egysoros mező megszűnt, és a jövőben eltávolítjuk. Kérjük, használja az alábbi többsoros szövegmezőt.)</translation> <translation id="3709266154059827597">Bővítménytelepítési feketelista beállítása</translation> <translation id="3711895659073496551">Felfüggesztés</translation> @@ -1544,11 +1545,6 @@ <translation id="3851039766298741586">Információk (például alkalmazásazonosító és -verzió) jelentése az aktív kioszkmunkamenetről. Ha a házirend értéke hamis, a böngésző nem jelenti a kioszkmunkamenet információit. Ha igaz, illetve ha nincs beállítva, a böngésző jelenti ezeket az információkat.</translation> -<translation id="3852924591079583104"> - Az ArcSession beállítás kiválasztása esetén ez a házirend arra kényszeríti az eszközt, hogy újrainduljon, amikor a felhasználó kijelentkezik (ha az Android rendszer fut). - Ha a beállítás értéke Mindig, akkor az eszköz minden felhasználói kijelentkezéskor újraindul. - Ha nincs beállítva a házirend, akkor nincs hatása, és nem kényszeríti újraindulásra az eszközt a felhasználói kijelentkezések esetén. Ugyanez érvényes a Soha beállítás esetén is. - </translation> <translation id="3858658082795336534">Alapértelmezett kétoldalas nyomtatási mód</translation> <translation id="3859780406608282662">Hozzáad egy paramétert a <ph name="PRODUCT_OS_NAME" /> rendszer változatainak lekéréséhez. @@ -1832,6 +1828,15 @@ Ez a házirend csak akkor érvényesül, ha a „DefaultSearchProviderEnabled” házirend engedélyezve van.</translation> <translation id="4285674129118156176">Az ARC használatának engedélyezése nem társult felhasználók számára</translation> +<translation id="4289903996435140853">Lehetővé teszi egy olyan URL-lista megadását, amely meghatározza, hogy mely webhelyek kapnak automatikusan engedélyt az adott gyártótól származó és adott termékazonosítóval rendelkező USB-eszközhöz való hozzáférésre. A házirend csak akkor érvényes, ha a listán szereplő összes elemnél szerepel eszköz és URL-cím is. Az eszközök mindegyike tartalmazhat gyártó- és termékazonosítót is. A kihagyott azonosítókat a rendszer – egy kivételével – helyettesítő karakterként kezeli. Az egyetlen kivétel az, hogy a termékazonosítót nem lehet megadni a gyártóazonosító nélkül. Ellenkező esetben a rendszer érvénytelennek tekinti és figyelmen kívül hagyja a házirendet. + + Az USB-engedélyezési modell a kérelmező webhely URL-címét („kérelmező URL”) és a keretként szolgáló legfelső szintű webhely URL-címét („beágyazó URL”) használja arra, hogy engedélyt adjon a kérelmező URL-nek az USB-eszközhöz való hozzáférésre. A kérelmező URL és a beágyazó URL eltérhetnek egymástól, ha a kérelmező webhely betöltése iframe keretben történik. Az „urls” mező tehát két URL vesszővel elválasztott karakterláncát is tartalmazhatja a kérelmező és a beágyazó URL megadása érdekében. Ha csak egy URL van megadva, akkor a rendszer abban az esetben adja meg a hozzáférést az adott USB-eszközökhöz, ha a kérelmező webhely egyezik ezzel az URL-címmel (függetlenül a beágyazottsági állapottól). Az „urls” mezőben lévő URL-címeknek érvényes URL-eknek kell lenniük, máskülönben a rendszer figyelmen kívül hagyja a házirendet. + + Ha nem állítja be ezt a házirendet, akkor a böngésző valamennyi webhelyre vonatkozóan a globális alapértelmezett értéket használja a „DefaultWebUsbGuardSetting” házirend alapján (ha be van állítva) vagy a felhasználó személyes konfigurációja alapján (ha nincs beállítva az említett házirend). + + Az ebben a házirendben megadott URL-minták nem ütközhetnek a WebUsbBlockedForUrls házirendben beállítottakkal. Ha mégis ütközés van, akkor ez a házirend élvez elsőbbséget a WebUsbBlockedForUrls és WebUsbAskForUrls házirendekkel szemben. + + Az ebben és a WebUsbAllowDevicesForUrls házirendben megadott értékeket a rendszer egyesíti.</translation> <translation id="4298509794364745131">Olyan alkalmazásokból álló listát ad meg, amelyek jegyzetkészítő alkalmazásként engedélyezhetők a(z) <ph name="PRODUCT_OS_NAME" /> lezárási képernyőjén. Ha az előnyben részesített jegyzetkészítő alkalmazás engedélyezve van a lezárási képernyőn, akkor ezen a képernyőn szerepel majd az előnyben részesített jegyzetkészítő alkalmazás indítására szolgáló kezelőfelület-elem. @@ -1975,6 +1980,7 @@ <translation id="4639407427807680016">A tiltólistáról mentesülő natív üzenetkezelő gazdagépek neve</translation> <translation id="4650759511838826572">URL protokollsémák tiltása</translation> <translation id="465099050592230505">Vállalati internetes áruház URL-je (megszűnt)</translation> +<translation id="4661889655253181651">A tartalombeállítások lehetővé teszik az adott típusú tartalmak (pl. cookie-k, képek vagy JavaScriptek) kezelésének meghatározását.</translation> <translation id="4665897631924472251">Bővítménykezelési beállítások</translation> <translation id="4668325077104657568">Képek alapértelmezett beállítása</translation> <translation id="4670865688564083639">Legalább:</translation> @@ -2019,6 +2025,11 @@ Ezeket a javaslatokat a rendszer a Google szervereiről kéri le távolról. Ha értéke hamis, a böngésző nem kér le és nem jelenít meg javaslatokat.</translation> +<translation id="4759650396863318477">Lehetővé teszi annak az időtartamnak a beállítását (ezredmásodpercben), ameddig a felhasználóknak megjelenik az értesítés, hogy a <ph name="PRODUCT_NAME" /> böngészőt vagy a <ph name="PRODUCT_OS_NAME" />-t újra kell indítani a függőben lévő frissítés alkalmazásához. + + Ez alatt az idő alatt a rendszer többször is tájékoztatja a felhasználót a frissítés szükségességéről. <ph name="PRODUCT_OS_NAME" />-eszközök esetében az újraindítási értesítés a tálcán jelenik meg a <ph name="RELAUNCH_HEADS_UP_PERIOD_POLICY_NAME" /> házirendnek megfelelően. A <ph name="PRODUCT_NAME" /> böngésző esetében az értesítési időszak egyharmadának letelte után az alkalmazásmenü változása jelzi, hogy újraindításra van szükség. Az értesítési időszak kétharmadának elérésekor, valamint az értesítési időszak leteltekor az értesítés színe megváltozik. A <ph name="RELAUNCH_NOTIFICATION_POLICY_NAME" /> házirend által engedélyezett további értesítések is ezt a mintát követik. + + Ha nincs beállítva, akkor az alapértelmezett időszak 345 600 000 ezredmásodperc (négy nap) a <ph name="PRODUCT_OS_NAME" />-eszközök, és 604 800 000 ezredmásodperc (egy hét) a <ph name="PRODUCT_NAME" /> esetében.</translation> <translation id="4788252609789586009">Engedélyezi a <ph name="PRODUCT_NAME" /> automatikus kitöltés funkcióját, és lehetővé teszi a felhasználók számára az internetes űrlapok automatikus kitöltését korábban eltárolt hitelkártyaadatokkal. Ha le van tiltva ez a beállítás, az automatikus kitöltés funkció nem ajánlja fel és nem végzi el a hitelkártyaadatok kitöltését, és nem ment további hitelkártyaadatokat, amelyeket a felhasználó az interneten való böngészés közben ad meg. @@ -2213,6 +2224,15 @@ <translation id="5208240613060747912">Lehetővé teszi, hogy megadja az URL-minták egy olyan listáját, amely meghatározza, mely webhelyek nem jeleníthetnek meg értesítéseket. Ha ez a házirend beállítatlanul marad, akkor a globális alapértelmezett érték kerül felhasználásra valamennyi webhelyre vonatkozóan; vagy -- ha be van állítva -- a "DefaultNotificationsSetting" házirendből, vagy pedig a felhasználó személyes konfigurációjából.</translation> <translation id="5213038356678567351">Webhelyek, amelyek nem vezetnek böngészőváltáshoz.</translation> <translation id="5219844027738217407">Az Android-alkalmazások esetében ez a házirend csak a mikrofonra vonatkozik. Ha a házirend beállítása igaz, a rendszer kivétel nélkül valamennyi Android-alkalmazásra vonatkozóan némítja a mikrofont.</translation> +<translation id="5221394278852982313">Lehetővé teszi egy olyan URL-lista megadását, amely meghatározza, hogy mely webhelyek kapnak automatikusan engedélyt az adott gyártótól származó és adott termékazonosítóval rendelkező USB-eszközhöz való hozzáférésre. A házirend csak akkor érvényes, ha a listán szereplő összes elemnél szerepel eszköz és URL-cím is. Az eszközök mindegyike tartalmazhat gyártó- és termékazonosítót is. A kihagyott azonosítókat a rendszer – egy kivételével – helyettesítő karakterként kezeli. Az egyetlen kivétel az, hogy a termékazonosítót nem lehet megadni a gyártóazonosító nélkül. Ellenkező esetben a rendszer érvénytelennek tekinti és figyelmen kívül hagyja a házirendet. + + Az USB-engedélyezési modell a kérelmező webhely URL-címét („kérelmező URL”) és a keretként szolgáló legfelső szintű webhely URL-címét („beágyazó URL”) használja arra, hogy engedélyt adjon a kérelmező URL-nek az USB-eszközhöz való hozzáférésre. A kérelmező URL és a beágyazó URL eltérhetnek egymástól, ha a kérelmező webhely betöltése iframe keretben történik. Az „urls” mező tehát két URL vesszővel elválasztott karakterláncát is tartalmazhatja a kérelmező és a beágyazó URL megadása érdekében. Ha csak egy URL van megadva, akkor a rendszer abban az esetben adja meg a hozzáférést az adott USB-eszközökhöz, ha a kérelmező webhely egyezik ezzel az URL-címmel (függetlenül a beágyazottsági állapottól). Az „urls” mezőben lévő URL-címeknek érvényes URL-eknek kell lenniük, máskülönben a rendszer figyelmen kívül hagyja a házirendet. + + Ha nem állítja be ezt a házirendet, akkor a böngésző valamennyi webhelyre vonatkozóan a globális alapértelmezett értéket használja a „DefaultWebUsbGuardSetting” házirend alapján (ha be van állítva) vagy a felhasználó személyes konfigurációja alapján (ha nincs beállítva az említett házirend). + + Az ebben a házirendben megadott URL-minták nem ütközhetnek a WebUsbBlockedForUrls házirendben beállítottakkal. Ha mégis ütközés van, akkor ez a házirend élvez elsőbbséget a WebUsbBlockedForUrls és WebUsbAskForUrls házirendekkel szemben. + + Az ebben és a DeviceWebUsbAllowDevicesForUrls házirendben megadott értékeket a rendszer egyesíti.</translation> <translation id="5228316810085661003">Az eszköz helyi fiókjaira vonatkozó bejelentkezési késleltetés. Ha a |DeviceLocalAccountAutoLoginId| házirend nincs beállítva, ennek a házirendnek nincs hatása. Egyébként: @@ -2938,6 +2958,21 @@ Ha a házirend beállítása „A felhasználók nem kezelhetik a tanúsítványokat”, akkor a felhasználók kezelni nem, csak megtekinteni tudják a tanúsítványokat.</translation> <translation id="6573305661369899995">Külső URL-korlátozási forrás beállítása</translation> +<translation id="6583851521569686409">A nyomtatók listáját konfigurálja. + + Ez a házirend lehetővé teszi a rendszergazdák számára, hogy + nyomtatókonfigurációkat biztosítsanak felhasználóiknak. + + A <ph name="PRINTER_DISPLAY_NAME" /> és a <ph name="PRINTER_DESCRIPTION" /> szabad formájú karakterláncok, amelyek személyre szabhatók a nyomtatóválasztás megkönnyítése érdekében. A <ph name="PRINTER_MANUFACTURER" /> és a <ph name="PRINTER_MODEL" /> a nyomtató végfelhasználó általi azonosításának megkönnyítésére szolgálnak. A nyomtató gyártóját és modelljét jelölik. Az <ph name="PRINTER_URI" /> olyan cím, amelynek hozzáférhetőnek kell lennie ügyfélszámítógépről, és tartalmaznia kell a következőket: <ph name="URI_SCHEME" />, <ph name="URI_PORT" /> és <ph name="URI_QUEUE" />. Az <ph name="PRINTER_UUID" /> megadása nem kötelező. Ha meg van adva, segít elkerülni a <ph name="ZEROCONF_DISCOVERY" /> nyomtatók ismétlődését. + + Vagy az <ph name="PRINTER_EFFECTIVE_MODEL" /> elemnek kell tartalmaznia a nyomtató nevét, vagy igazra kell állítani az <ph name="PRINTER_AUTOCONF" /> beállítást. A rendszer figyelmen kívül hagyja a mindkét tulajdonsággal, illetve az egyikkel sem rendelkező nyomtatókat. + + A nyomtató beállítása a nyomtató első használatakor történik. A PPD-k csak a nyomtató használatakor töltődnek le. Ezután a gyakran használt PPD-k a gyorsítótárba kerülnek. + + A házirend nem befolyásolja, hogy a felhasználók beállíthatják-e a nyomtatókat saját eszközeiken. A házirend célja, hogy kiegészítse az egyes felhasználók nyomtatóbeállításait. + + Az Active Directory által kezelt eszközöknél a házirend támogatja a(z) <ph name="MACHINE_NAME_VARIABLE" /> kibővítését az Active Directory-gép nevére, vagy annak karakterláncrészére. Ha például a gép neve <ph name="MACHINE_NAME_EXAMPLE" />, akkor a(z) <ph name="MACHINE_NAME_VARIABLE_EXAMPLE" /> karakterláncot a 6. pozíciónál kezdődő négy karakter helyettesíti, vagyis: <ph name="MACHINE_NAME_PART_EXAMPLE" />. Megjegyzés: A pozíció meghatározásához a kiindulási pont a nulla. + </translation> <translation id="6598235178374410284">Felhasználó avatarképe</translation> <translation id="6603004149426829878">Mindig elküldi a rendelkezésre álló helyjeleket a szervernek az időzóna meghatározása során</translation> <translation id="6628120204569232711">A tárhelyállapot bejelentése</translation> @@ -3379,7 +3414,6 @@ Ha a házirend beállítása „RemoveLRUIfDormant”, akkor az automatikus tisztítás a felhasználókat addig távolítja el a legrégebbi bejelentkezés sorrendjében, amíg elég szabad terület nem lesz, akik legalább 3 hónapja nem jelentkeztek be. Ha a házirend nincs beállítva, akkor az automatikus tisztítás az alapértelmezett stratégiát használja. Ez jelenleg a „RemoveLRUIfDormant” stratégia.</translation> -<translation id="7334274148831027933">Dokkolt nagyító engedélyezése</translation> <translation id="7336785017449297672">Az óra és az időzóna beállításainak módosítására szolgál.</translation> <translation id="7336878834592315572">Cookie-k megtartása a munkamenet idejére</translation> <translation id="7339315111520512972">A hálózati kód kényszerítése a böngészőfolyamatban történő futásra.</translation> @@ -4265,6 +4299,8 @@ <translation id="915194831143859291">Ha a házirend értéke false (hamis), vagy ha nincs beállítva, a <ph name="PRODUCT_OS_NAME" /> engedélyezi a felhasználó számára az eszköz leállítását. Ha a házirend értéke true (igaz), a <ph name="PRODUCT_OS_NAME" /> újraindítást kezdeményez, amikor a felhasználó leállítja az eszközt. A <ph name="PRODUCT_OS_NAME" /> a felhasználói felület összes leállítógombját újraindítást kezdeményező gombokra cseréli ki. Ha a felhasználó a bekapcsológombbal állítja le az eszközt, az nem indul automatikusan újra automatikusan akkor sem, ha a házirend engedélyezve van.</translation> <translation id="9152473318295429890">Kontextus szerinti javaslatok engedélyezése kapcsolódó weboldalak formájában</translation> +<translation id="9153446010242995516">A korábbi állapot visszaállítása és a célverzió megtartása, ha az operációs rendszer verziója újabb, mint a célverzió. Megpróbálja átvinni az eszközszintű konfigurációt (a hálózati hitelesítő adatokkal együtt) a korábbi állapot visszaállítása során, de még akkor is elvégzi a teljes powerwash folyamatot, ha az adatok helyreállítása nem lehetséges (mert a célverzió nem támogatja az adatok helyreállítását, illetve visszafelé nem kompatibilis módosítás miatt). + Csak a <ph name="PRODUCT_OS_NAME" /> 75-ös és újabb verzióin támogatott. A régebbi ügyfelek esetén ez az érték azt jelenti, hogy a korábbi állapot visszaállítása le van tiltva.</translation> <translation id="9158929520101169054">Böngészőn belüli többfiókos bejelentkezés engedélyezése</translation> <translation id="9159126470527871268">A felhasználók értesítése arról, hogy szükség van a <ph name="PRODUCT_NAME" /> vagy a <ph name="PRODUCT_OS_NAME" /> újraindítására függőben lévő frissítés alkalmazása céljából.
diff --git a/components/policy/resources/policy_templates_id.xtb b/components/policy/resources/policy_templates_id.xtb index b5952281e..3b69551 100644 --- a/components/policy/resources/policy_templates_id.xtb +++ b/components/policy/resources/policy_templates_id.xtb
@@ -130,15 +130,6 @@ Jika kebijakan ini disetel ke false, status pengalih dev tidak akan dilaporkan.</translation> <translation id="1160479894929412407">Izinkan protokol QUIC</translation> <translation id="1160939557934457296">Menonaktifkan untuk melanjutkan dari halaman peringatan Safe Browsing</translation> -<translation id="1171342272070128466">Aktifkan fitur aksesibilitas kaca pembesar yang dipasang di dok. - - JIka kebijakan ini ditetapkan ke true, kaca pembesar yang dipasang di dok akan selalu diaktifkan. - - Jika kebijakan ini ditetapkan ke false, kaca pembesar yang dipasang di dok akan selalu dinonaktifkan. - - Jika kebijakan ini ditetapkan, pengguna tidak dapat mengubah atau menggantinya. - - Jika kebijakan ini tidak ditetapkan, kaca pembesar yang dipasang di dok mula-mula dinonaktifkan, tetapi dapat diaktifkan oleh pengguna kapan saja.</translation> <translation id="1189817621108632689">Memungkinkan Anda menyetel daftar pola URL yang menentukan situs mana yang tidak diizinkan untuk menampilkan gambar. Jika kebijakan ini tidak disetel, nilai default global akan digunakan untuk semua situs yaitu dari kebijakan 'DefaultImagesSetting' jika disetel, atau dari konfigurasi pribadi pengguna. @@ -1530,11 +1521,6 @@ Jika kebijakan disetel ke False, informasi sesi tidak akan dilaporkan. Jika disetel ke True atau tidak disetel, informasi sesi kios akan dilaporkan.</translation> -<translation id="3852924591079583104"> - Kebijakan ini, saat disetel ke ArcSession, akan memaksa perangkat untuk reboot saat pengguna logout jika Android telah dimulai. - Saat disetel ke Selalu, kebijakan ini akan memaksa perangkat untuk reboot setiap kali pengguna logout. - Jika tidak disetel, kebijakan ini tidak berpengaruh dan reboot paksa tidak akan dilakukan saat pengguna logout. Hal yang sama berlaku jika kebijakan disetel ke Jangan pernah. - </translation> <translation id="3858658082795336534">Mode dupleks pencetakan default</translation> <translation id="3859780406608282662">Tambahkan parameter untuk mengambil sumber Variasi di <ph name="PRODUCT_OS_NAME" />. @@ -3332,7 +3318,6 @@ Jika kebijakan ini disetel ke 'RemoveLRUIfDormant', pembersihan otomatis akan tetap membuang pengguna yang tidak melakukan proses masuk minimal selama 3 bulan dalam urutan yang paling lama tidak diakses hingga terdapat ruang kosong yang memadai. Jika kebijakan ini tidak disetel, pembersihan otomatis menggunakan strategi yang tertanam secara default. Saat ini, itu adalah strategi 'RemoveLRUIfDormant'.</translation> -<translation id="7334274148831027933">Aktifkan kaca pembesar yang dipasang ke dok</translation> <translation id="7336785017449297672">Mengontrol setelan jam dan zona waktu.</translation> <translation id="7336878834592315572">Menyimpan cookie selama durasi sesi</translation> <translation id="7339315111520512972">Paksa kode jaringan untuk dijalankan dalam proses browser</translation>
diff --git a/components/policy/resources/policy_templates_it.xtb b/components/policy/resources/policy_templates_it.xtb index 282369c..7a32538 100644 --- a/components/policy/resources/policy_templates_it.xtb +++ b/components/policy/resources/policy_templates_it.xtb
@@ -131,15 +131,6 @@ <translation id="1152117524387175066">Consente di indicare lo stato dello switch dev del dispositivo all'avvio. Se la norma viene impostata su False, lo stato dello switch dev non viene indicato.</translation> <translation id="1160479894929412407">Consenti protocollo QUIC</translation> <translation id="1160939557934457296">Disattiva procedendo dalla pagina di avviso Navigazione sicura</translation> -<translation id="1171342272070128466">Consente di attivare la funzione di accessibilità Lente d'ingrandimento ancorata. - - Se questo criterio viene impostato su true, la lente d'ingrandimento ancorata sarà sempre attiva. - - Se questo criterio viene impostato su false, la lente d'ingrandimento ancorata sarà sempre disattivata. - - Se questo criterio viene impostato, gli utenti non potranno modificarlo o ignorarlo. - - Se questo criterio non viene impostato, inizialmente la lente d'ingrandimento ancorata è disattivata, ma l'utente può attivarla in qualsiasi momento.</translation> <translation id="1189817621108632689">Questa norma consente di impostare un elenco di pattern URL che specificano i siti in cui non è consentita la visualizzazione di immagini. Se questa norma non viene impostata, per tutti i siti verrà utilizzato il valore predefinito globale della norma "DefaultImagesSetting", se è impostata, oppure verrà utilizzata la configurazione personale dell'utente. @@ -1096,6 +1087,15 @@ Quando questa norma non viene impostata, il comportamento delle norme più specifiche rimane invariato.</translation> <translation id="2987155890997901449">Attiva ARC</translation> <translation id="2987227569419001736">Controlla l'utilizzo dell'API Web Bluetooth</translation> +<translation id="2990018289267778247">Se questo criterio è impostato su true, le opzioni di accessibilità vengono visualizzate sempre nel menu della barra delle applicazioni. + + Se questo criterio è impostato su false, le opzioni di accessibilità non vengono mai visualizzate nel menu della barra delle applicazioni. + + Se imposti questo criterio, gli utenti non potranno modificarlo o ignorarlo. + + Se questo criterio non viene impostata, le opzioni di accessibilità non verranno visualizzate nel menu della barra delle applicazioni, ma l'utente potrà attivarne la visualizzazione tramite la pagina Impostazioni. + + Quando vengono attivate le funzionalità di accessibilità (in altri modi, ad esempio con una combinazione di tasti), le opzioni di accessibilità verranno sempre visualizzate nel menu della barra delle applicazioni.</translation> <translation id="3011301228198307065">Consente di configurare l'URL della home page predefinita di <ph name="PRODUCT_NAME" /> e di impedire agli utenti di modificarlo. La home page è la pagina che viene aperta facendo clic sul pulsante Home. Le pagine che si aprono all'avvio vengono stabilite dalle norme RestoreOnStartup. @@ -1408,6 +1408,7 @@ Questo criterio viene utilizzato su desktop dalla registrazione con criteri cloud in ambito macchina e può essere impostato tramite il file di criteri registry o GPO su Windows, plist su Mac e JSON su Linux.</translation> <translation id="3660562134618097814">Trasferisci i cookie dell'IdP SAML durante l'accesso</translation> <translation id="3701121231485832347">Consente di gestire le impostazioni specifiche dei dispositivi <ph name="PRODUCT_OS_NAME" /> gestiti da <ph name="MS_AD_NAME" />.</translation> +<translation id="3702518095257671450">Attestazione da remoto</translation> <translation id="3702647575225525306"><ph name="POLICY_NAME" /> (Il campo a una sola riga è obsoleto e sarà rimosso a breve. Inizia a usare la casella di testo multiriga qui sotto).</translation> <translation id="3709266154059827597">Configura blacklist per l'installazione delle estensioni</translation> <translation id="3711895659073496551">Sospensione</translation> @@ -1515,11 +1516,6 @@ <translation id="3851039766298741586">Consente di segnalare informazioni sulla sessione kiosk attiva, ad esempio l'ID e la versione dell'applicazione. Se la norma viene impostata su false, le informazioni relative alla sessione kiosk non verranno segnalate. Se viene impostata su true o non viene impostata, tali informazioni verranno segnalate.</translation> -<translation id="3852924591079583104"> - Se è impostata su ArcSession, questa norma forza il riavvio del dispositivo all'uscita dell'utente se Android è stato avviato. - Se è impostata su Sempre, forza il riavvio del dispositivo a ogni uscita dell'utente. - Se non è impostata, non sortisce alcun effetto e non viene forzato alcun riavvio all'uscita dell'utente. Lo stesso accade se è impostata su Mai. - </translation> <translation id="3858658082795336534">Modalità di stampa fronte/retro predefinita</translation> <translation id="3859780406608282662">Consente di aggiungere un parametro al recupero del numero di inizializzazione delle varianti in <ph name="PRODUCT_OS_NAME" />. @@ -1795,6 +1791,15 @@ Questa norma viene rispettata soltanto se la norma "DefaultSearchProviderEnabled" è attiva.</translation> <translation id="4285674129118156176">Consenti agli utenti non affiliati di usare ARC</translation> +<translation id="4289903996435140853">Consente di impostare un elenco di URL che specifica a quali siti verrà concessa automaticamente l'autorizzazione per accedere a un dispositivo USB con gli ID prodotto e vendor definiti. Perché la norma sia valida, ogni elemento dell'elenco deve contenere sia dispositivi sia URL. Ogni elemento nei dispositivi può contenere un campo ID vendor e un campo ID prodotto. Gli eventuali ID omessi verranno considerati caratteri jolly con l'eccezione che non è possibile specificare un ID prodotto senza aver specificato un ID vendor. In caso contrario, il criterio non sarà valido e verrà ignorato. + + Il modello di autorizzazione USB utilizza l'URL del sito richiedente ("URL richiedente") e l'URL del sito frame di livello principale ("URL di incorporamento") per concedere l'autorizzazione all'URL richiedente di accedere al dispositivo USB. L'URL richiedente può essere diverso dall'URL di incorporamento quando il sito richiedente viene caricato in un iframe. Di conseguenza il campo "URL" può contenere fino a due stringhe URL delimitate da virgola per specificare rispettivamente l'URL richiedente e l'URL di incorporamento. Se è specificato un solo URL, l'accesso ai dispositivi USB corrispondenti viene concesso quando l'URL del sito richiedente corrisponde all'URL, a prescindere dallo stato di incorporamento. Gli URL in "URL" devono essere validi, altrimenti il criterio viene ignorato. + + Se questo criterio non viene impostato, per tutti i siti viene usato il valore predefinito globale dal criterio "DefaultWebUsbGuardSetting" (se impostato) o dalla configurazione personale dell'utente (se non impostato). + + I pattern URL di questo criterio non devono essere in conflitto con quelli configurati tramite il criterio WebUsbBlockedForUrls. In caso di conflitto, questo criterio ha la precedenza su WebUsbBlockedForUrls e WebUsbAskForUrls. + + I valori di questo criterio e del criterio WebUsbAllowDevicesForUrls vengono uniti.</translation> <translation id="4298509794364745131">Consente di specificare l'elenco di app che è possibile attivare come app per scrivere note nella schermata di blocco di <ph name="PRODUCT_OS_NAME" />. Se nella schermata di blocco viene attivata l'app per scrivere note preferita, nella schermata sarà presente l'elemento dell'interfaccia utente per avviare tale app. @@ -1932,6 +1937,7 @@ <translation id="4639407427807680016">Nomi degli host di messaggi nativi da escludere dalla lista nera.</translation> <translation id="4650759511838826572">Disabilita schemi di protocollo dell'URL</translation> <translation id="465099050592230505">URL del web store dell'azienda (obsoleta)</translation> +<translation id="4661889655253181651">Le Impostazioni contenuti consentono di specificare la modalità di gestione di determinati tipi di contenuto (ad esempio Cookie, Immagini o JavaScript).</translation> <translation id="4665897631924472251">Impostazioni di gestione delle estensioni</translation> <translation id="4668325077104657568">Impostazione immagini predefinite</translation> <translation id="4670865688564083639">Minimo:</translation> @@ -1976,6 +1982,11 @@ Questi suggerimenti vengono recuperati da remoto dai server di Google. Se la norma è impostata su false, non verranno recuperati o mostrati suggerimenti.</translation> +<translation id="4759650396863318477">Consente di stabilire per quanto tempo, in millisecondi, gli utenti riceveranno notifiche relative alla necessità di riavviare <ph name="PRODUCT_NAME" /> o un dispositivo <ph name="PRODUCT_OS_NAME" /> per applicare un aggiornamento in sospeso. + + Durante questo periodo di tempo l'utente verrà informato più volte della necessità di un aggiornamento. Per quanto riguarda i dispositivi <ph name="PRODUCT_OS_NAME" />, nella barra delle applicazioni viene mostrata una notifica relativa al riavvio in base al criterio <ph name="RELAUNCH_HEADS_UP_PERIOD_POLICY_NAME" />. Per quanto riguarda i browser <ph name="PRODUCT_NAME" />, il menu delle app cambia per indicare che è necessario il riavvio una volta trascorso un terzo del periodo di notifica. Questa notifica cambia colore una volta trascorsi due terzi del periodo di notifica e lo cambia di nuovo al termine dell'intero periodo di notifica. Le notifiche aggiuntive attivate in base al criterio <ph name="RELAUNCH_NOTIFICATION_POLICY_NAME" /> seguono questa stessa pianificazione. + + Se il criterio non viene impostato, viene usato il periodo predefinito di 345600000 millisecondi (quattro giorni) per <ph name="PRODUCT_OS_NAME" /> e di 604800000 millisecondi (una settimana) per <ph name="PRODUCT_NAME" />.</translation> <translation id="4788252609789586009">Consente di attivare la funzione Compilazione automatica di <ph name="PRODUCT_NAME" /> e permette agli utenti di eseguire il completamento automatico dei dati della carta di credito nei moduli web utilizzando informazioni memorizzate in precedenza. Se questa impostazione è disattivata, la funzione Compilazione automatica non suggerirà o non inserirà mai i dati della carta di credito e non salverà i dati di altre carte di credito che l'utente potrebbe inviare durante la navigazione sul Web. @@ -2168,6 +2179,15 @@ <translation id="5208240613060747912">Consente di impostare un elenco di pattern URL che specificano i siti non autorizzati a visualizzare notifiche. Se questa norma non viene impostata, per tutti i siti verrà utilizzato il valore predefinito globale della norma "DefaultNotificationsSetting", se è impostata, oppure verrà utilizzata la configurazione personale dell'utente.</translation> <translation id="5213038356678567351">Siti web che non devono mai attivare il cambio di browser.</translation> <translation id="5219844027738217407">Nell'ambito delle app Android, la norma influisce solo sul microfono. Se la norma viene impostata su true, il microfono viene disattivato per tutte le app Android, senza alcuna eccezione.</translation> +<translation id="5221394278852982313">Consente di impostare un elenco di URL che specifica a quali siti verrà concessa automaticamente l'autorizzazione per accedere a un dispositivo USB con gli ID prodotto e vendor definiti. Perché la norma sia valida, ogni elemento dell'elenco deve contenere sia dispositivi sia URL. Ogni elemento nei dispositivi può contenere un campo ID vendor e un campo ID prodotto. Gli eventuali ID omessi verranno considerati caratteri jolly con l'eccezione che non è possibile specificare un ID prodotto senza aver specificato un ID vendor. In caso contrario, il criterio non sarà valido e verrà ignorato. + + Il modello di autorizzazione USB utilizza l'URL del sito richiedente ("URL richiedente") e l'URL del sito frame di livello principale ("URL di incorporamento") per concedere l'autorizzazione all'URL richiedente di accedere al dispositivo USB. L'URL richiedente può essere diverso dall'URL di incorporamento quando il sito richiedente viene caricato in un iframe. Di conseguenza il campo "URL" può contenere fino a due stringhe URL delimitate da virgola per specificare rispettivamente l'URL richiedente e l'URL di incorporamento. Se è specificato un solo URL, l'accesso ai dispositivi USB corrispondenti viene concesso quando l'URL del sito richiedente corrisponde all'URL, a prescindere dallo stato di incorporamento. Gli URL in "URL" devono essere validi, altrimenti il criterio viene ignorato. + + Se questo criterio non viene impostato, per tutti i siti viene usato il valore predefinito globale dal criterio "DefaultWebUsbGuardSetting" (se impostato) o dalla configurazione personale dell'utente (se non impostato). + + I pattern URL di questo criterio non devono essere in conflitto con quelli configurati tramite il criterio WebUsbBlockedForUrls. In caso di conflitto, questo criterio ha la precedenza su WebUsbBlockedForUrls e WebUsbAskForUrls. + + I valori di questo criterio e del criterio DeviceWebUsbAllowDevicesForUrls vengono uniti.</translation> <translation id="5228316810085661003">Il ritardo prima dell'accesso automatico all'account locale del dispositivo. Se non è impostata, la norma |DeviceLocalAccountAutoLoginId| non ha effetto. In caso contrario: @@ -2286,11 +2306,11 @@ <translation id="5423001109873148185">Se è attiva, questa norma impone l'importazione dei motori di ricerca dal browser predefinito corrente. Se la norma è attiva incide anche sulla finestra di dialogo di importazione. Se non è attiva, il motore di ricerca predefinito non viene importato. Se non viene impostata, all'utente potrebbe essere chiesto se desidera effettuare l'importazione, oppure l'importazione potrebbe avvenire automaticamente.</translation> <translation id="5423197884968724595">Nome della limitazione di Android WebView:</translation> <translation id="5424147596523390018">Consenti tutte le modalità a colori</translation> -<translation id="5427003226809696696">Questa norma consente di stabilire se avviare o meno la finestra del browser all'inizio della sessione. +<translation id="5427003226809696696">Questo criterio consente di stabilire se avviare o meno la finestra del browser all'inizio della sessione. - Se questa norma viene attivata, la finestra del browser non verrà avviata. + Se questo criterio viene attivato, la finestra del browser non verrà avviata. - Se questa norma viene disattivata o non viene impostata, è possibile avviare la finestra del browser. Tieni presente che la finestra del browser potrebbe non essere avviata a causa di altre norme o altri flag della riga di comando.</translation> + Se questo criterio viene disattivato o non viene impostato, è possibile avviare la finestra del browser. Tieni presente che la finestra del browser potrebbe non essere avviata a causa di altri criteri o altri flag della riga di comando.</translation> <translation id="5427879482805712214">Questo criterio consente di configurare l'immagine avatar che rappresenta l'utente sulla schermata di accesso. Il criterio viene impostato specificando l'URL da cui <ph name="PRODUCT_OS_NAME" /> può scaricare l'immagine e un hash crittografico utilizzato per verificare l'integrità del download. L'immagine deve essere in formato JPEG e avere dimensioni non superiori a 512 kB. L'URL deve essere accessibile senza nessuna autenticazione. L'immagine avatar viene scaricata e memorizzata nella cache. Verrà scaricata nuovamente ogni volta che l'URL o l'hash vengono modificati. @@ -2883,6 +2903,20 @@ Se la norma è impostata su "Non consentire più agli utenti di gestire i certificati", gli utenti non potranno gestire i certificati, ma solo visualizzarli.</translation> <translation id="6573305661369899995">Imposta una fonte esterna di limitazioni relative agli URL</translation> +<translation id="6583851521569686409">Consente di configurare un elenco di stampanti. + + Questo criterio consente agli amministratori di fornire configurazioni delle stampanti ai propri utenti. + + <ph name="PRINTER_DISPLAY_NAME" /> e <ph name="PRINTER_DESCRIPTION" /> sono stringhe in formato libero che è possibile personalizzare per selezionare facilmente le stampanti. I valori <ph name="PRINTER_MANUFACTURER" /> e <ph name="PRINTER_MODEL" />, che rappresentano il produttore e il modello della stampante, consentono agli utenti finali di identificare più facilmente le stampanti. Il valore <ph name="PRINTER_URI" /> dovrebbe essere un indirizzo raggiungibile da un computer client che includa <ph name="URI_SCHEME" />, <ph name="URI_PORT" /> e <ph name="URI_QUEUE" />. Il valore <ph name="PRINTER_UUID" /> è facoltativo, ma se è specificato viene utilizzato per consentire la deduplicazione delle stampanti <ph name="ZEROCONF_DISCOVERY" />. + + <ph name="PRINTER_EFFECTIVE_MODEL" /> deve contenere il nome della stampante oppure occorre impostare <ph name="PRINTER_AUTOCONF" /> su true. Le stampanti con entrambe le proprietà o prive di proprietà verranno ignorate. + + La configurazione viene completata al primo utilizzo della stampante. I file PPD vengono scaricati soltanto quando viene utilizzata la stampante. Dopodiché, i PPD utilizzati più spesso vengono memorizzati nella cache. + + Questo criterio non influisce sulla possibilità per gli utenti di configurare le stampanti su singoli dispositivi. È supplementare alla configurazione di stampanti da parte dei singoli utenti. + + Per i dispositivi Active Directory gestiti, questo criterio supporta l'espansione di <ph name="MACHINE_NAME_VARIABLE" /> al nome della macchina Active Directory oppure a una sua sottostringa. Ad esempio, se il nome della macchina è <ph name="MACHINE_NAME_EXAMPLE" />, la variabile <ph name="MACHINE_NAME_VARIABLE_EXAMPLE" /> verrà sostituita dai quattro caratteri che iniziano dopo la sesta posizione, ad esempio <ph name="MACHINE_NAME_PART_EXAMPLE" />. Tieni presente che la posizione è in base zero. + </translation> <translation id="6598235178374410284">Immagine avatar utente</translation> <translation id="6603004149426829878">Consente di inviare sempre al server i segnali relativi alla posizione disponibili durante le operazioni per stabilire il fuso orario</translation> <translation id="6628120204569232711">Segnala lo stato di archiviazione</translation> @@ -3318,7 +3352,6 @@ Se questa norma viene impostata su "RemoveLRUIfDormant", la pulizia automatica continua a rimuovere gli utenti che non hanno eseguito l'accesso negli ultimi tre mesi in ordine di accesso meno recente fino a liberare spazio a sufficienza. Se questa norma non viene impostata, la pulizia automatica utilizza la strategia incorporata predefinita, che al momento è "RemoveLRUIfDormant".</translation> -<translation id="7334274148831027933">Attiva lente d'ingrandimento ancorata</translation> <translation id="7336785017449297672">Consente di gestire le impostazioni relative all'orologio e al fuso orario.</translation> <translation id="7336878834592315572">Conserva cookie per tutta la durata della sessione</translation> <translation id="7339315111520512972">Forza l'esecuzione del codice di networking nel processo di browser</translation> @@ -4168,6 +4201,8 @@ <translation id="915194831143859291">Se questa norma viene impostata su false o non viene configurata, <ph name="PRODUCT_OS_NAME" /> consente all'utente di spegnere il dispositivo. Se questa norma viene impostata su true, <ph name="PRODUCT_OS_NAME" /> attiva il riavvio quando l'utente spegne il dispositivo. <ph name="PRODUCT_OS_NAME" /> sostituisce tutte le occorrenze dei pulsanti di spegnimento nell'interfaccia utente con pulsanti di riavvio. Se l'utente spegne il dispositivo utilizzando il tasto di accensione, il dispositivo non viene riavviato, anche se la norma è attivata.</translation> <translation id="9152473318295429890">Attiva i suggerimenti contestuali delle pagine web correlate</translation> +<translation id="9153446010242995516">Esegui il rollback e rimani nella versione target se la versione del sistema operativo è più recente di quella target. Prova a trasferire la configurazione a livello di dispositivo (incluse le credenziali di rete) tramite la procedura di rollback, se possibile, ma esegui il rollback con Powerwash completo anche se il ripristino dei dati non è possibile (perché la versione target non supporta il ripristino dei dati o a causa di una modifica non compatibile con le versioni precedenti). + Supportato su <ph name="PRODUCT_OS_NAME" /> 75 e versioni successive. Per i client precedenti, questo valore indica che il rollback è disattivato.</translation> <translation id="9158929520101169054">Consenti accesso simultaneo nel browser</translation> <translation id="9159126470527871268">Consente di inviare agli utenti una notifica che comunica che <ph name="PRODUCT_NAME" /> o <ph name="PRODUCT_OS_NAME" /> deve essere riavviato per applicare un aggiornamento in sospeso
diff --git a/components/policy/resources/policy_templates_iw.xtb b/components/policy/resources/policy_templates_iw.xtb index 5d03403..5532680 100644 --- a/components/policy/resources/policy_templates_iw.xtb +++ b/components/policy/resources/policy_templates_iw.xtb
@@ -135,15 +135,6 @@ אם המדיניות מוגדרת כ-False, מצב מתג dev לא ידיווח.</translation> <translation id="1160479894929412407">אישור פרוטוקול QUIC</translation> <translation id="1160939557934457296">השבת יכולת להמשיך מדף האזהרה של 'גלישה בטוחה'</translation> -<translation id="1171342272070128466">הפעלה של תכונת הנגישות 'זכוכית מגדלת במצב עגינה'. - - אם ערך המדיניות הזו הוא True, הזכוכית המגדלת במצב עגינה תמיד תהיה מופעלת. - - אם ערך המדיניות הוא False, הזכוכית המגדלת במצב עגינה תמיד תהיה מושבתת. - - אם המדיניות מוגדרת, משתמשים לא יכולים לשנות או לבטל אותה. - - אם המדיניות לא מוגדרת, הזכוכית המגדלת במצב עגינה מושבתת בהתחלה, אבל המשתמש יכול תמיד להפעיל אותה.</translation> <translation id="1189817621108632689">מאפשרת לך להגדיר רשימה של דפוסי כתובות אתרים המציינים אתרים שאינם מורשים להציג תמונות. אם המדיניות הזו לא מוגדרת, ייעשה שימוש בערך ברירת המחדל הכללי לכל האתרים. הערך הזה ייקבע על-פי המדיניות 'DefaultCookiesSetting' אם הוגדרה, או לחלופין, מהתצורה האישית של המשתמש. @@ -1537,11 +1528,6 @@ אם המדיניות מוגדרת כ-false, פרטי הפעלת הקיוסק לא ידווחו. אם היא מוגדרת כ-true או אינה מוגדרת, פרטי הפעלת הקיוסק ידווחו.</translation> -<translation id="3852924591079583104"> - כשהמדיניות הזו מקבלת את הערך ArcSession, היא מאלצת הפעלה מחדש של המכשיר כשהמשתמש יוצא, אם Android הופעל. - אם היא מקבלת את הערך 'תמיד', היא מאלצת הפעלה מחדש של המכשיר בכל פעם שהמשתמש יוצא. - אם המדיניות לא מוגדרת, אין לה השפעה ולא מתבצעת הפעלה מאולצת מחדש כשהמשתמש יוצא. למדיניות אין השפעה גם אם היא מקבלת את הערך 'אף פעם'. - </translation> <translation id="3858658082795336534">ברירת מחדל של מצב הדפסה משני צידי הדף</translation> <translation id="3859780406608282662">הוסף פרמטר להבאת ה-seed של הגרסאות ב-<ph name="PRODUCT_OS_NAME" />. @@ -3361,7 +3347,6 @@ אם המדיניות הזו מוגדרת כ-'RemoveLRUIfDormant', הניקוי האוטומטי ימשיך להסיר משתמשים שלא התחברו למשך 3 חודשים לפחות לפי סדר ההתחברות האחרונה הרחוקה ביותר, עד שיהיה מספיק מקום בדיסק. אם המדיניות הזו אינה מוגדרת, הניקוי האוטומטי עושה שימוש באסטרטגיה המובנית המוגדרת כברירת מחדל. נכון לעכשיו, זוהי אסטרטגיית 'RemoveLRUIfDormant'.</translation> -<translation id="7334274148831027933">הפעלת מגדיל במצב מעוגן</translation> <translation id="7336785017449297672">שולטת בהגדרות השעון ואזור הזמן.</translation> <translation id="7336878834592315572">שמור את קובצי ה-Cookie לכל משך ההפעלה.</translation> <translation id="7339315111520512972">אילוץ קוד הרשת לרוץ בתהליך הדפדפן</translation>
diff --git a/components/policy/resources/policy_templates_ja.xtb b/components/policy/resources/policy_templates_ja.xtb index f9ae3ff..c0e0f800 100644 --- a/components/policy/resources/policy_templates_ja.xtb +++ b/components/policy/resources/policy_templates_ja.xtb
@@ -143,15 +143,6 @@ このポリシーが False に設定されている場合、Dev スイッチの状態は報告されません。</translation> <translation id="1160479894929412407">QUIC プロトコルを許可する</translation> <translation id="1160939557934457296">セーフ ブラウジングの警告ページからの続行を無効にする</translation> -<translation id="1171342272070128466">拡大鏡(ドッキング)ユーザー補助機能を有効にします。 - - このポリシーが true の場合、拡大鏡(ドッキング)は常に有効になります。 - - このポリシーは false の場合、拡大鏡(ドッキング)は常に無効になります。 - - このポリシーが設定されている場合、ユーザーが設定を変更またはオーバーライドすることはできません。 - - このポリシーが未設定の場合、拡大鏡(ドッキング)は初期設定では無効ですが、ユーザーがいつでも有効にすることができます。</translation> <translation id="1189817621108632689">画像の表示を許可しないサイトの URL パターンリストを設定します。 このポリシーが未設定の場合は、すべてのサイトでグローバルなデフォルト値(「DefaultImagesSetting」ポリシーで値が設定されている場合はその値、設定されていない場合はユーザーの個人設定の値)が使用されます。 @@ -1534,11 +1525,6 @@ このポリシーを false に設定した場合、キオスク セッションに関する情報は 報告されません。true に設定するか未設定のままにした場合は、キオスク セッションに関する情報が報告されます。</translation> -<translation id="3852924591079583104"> - このポリシーを「ArcSession」に設定すると、ユーザーのログアウト時に Android が起動している場合はデバイスが再起動します。 - 「Always」に設定した場合、ユーザーがログアウトするたびにデバイスが再起動します。 - このポリシーを設定しない場合、ユーザーのログアウト時に再起動は行われません。「Never」に設定した場合も、ユーザーのログアウト時に再起動は行われません。 - </translation> <translation id="3858658082795336534">デフォルトの両面印刷モード</translation> <translation id="3859780406608282662"><ph name="PRODUCT_OS_NAME" /> でのバリエーション シードの取得にパラメータを追加します。 @@ -2309,7 +2295,7 @@ このポリシーが有効に設定されている場合は、ブラウザ ウィンドウを起動しません。 - このポリシーが無効に設定されているか未設定の場合は、ブラウザ ウィンドウを起動できます。ただし、ブラウザ ウィンドウは、他のポリシーやコマンドライン フラグが原因で起動しない場合もあります。</translation> + このポリシーが無効に設定されているか未設定の場合は、ブラウザ ウィンドウを起動できます。ただし、他のポリシーやコマンドライン フラグの設定によっては、ブラウザ ウィンドウが起動しない場合もあります。</translation> <translation id="5427879482805712214">このポリシーでは、ログイン画面でユーザーを表すアバター画像を設定できます。このポリシーを設定するには、<ph name="PRODUCT_OS_NAME" /> によるアバター画像のダウンロード元の URL と、ダウンロードの整合性の確認に使用する暗号化ハッシュを指定します。画像は JPEG 形式、サイズは 512 KB 以下とし、URL には認証なしでアクセスできる必要があります。 アバター画像はダウンロードされ、キャッシュに保存されます。URL またはハッシュが変更された場合は常に再ダウンロードされます。 @@ -3345,7 +3331,6 @@ このポリシーが「RemoveLRUIfDormant」に設定されている場合、自動クリーンアップでは、十分な空き容量が確保されるまで、前回のログイン日時が 3 か月以上前のユーザーがログイン日時の古い順にデバイスから削除されます。 このポリシーが設定されていない場合、自動クリーンアップは組み込みのデフォルト設定を使用します。現在、この設定は「RemoveLRUIfDormant」です。</translation> -<translation id="7334274148831027933">拡大鏡(ドッキング)を有効にする</translation> <translation id="7336785017449297672">時計とタイムゾーンの設定を制御します。</translation> <translation id="7336878834592315572">セッションの継続中は Cookie を保存する</translation> <translation id="7339315111520512972">ネットワーク用のコードをブラウザ プロセスで実行します</translation>
diff --git a/components/policy/resources/policy_templates_kn.xtb b/components/policy/resources/policy_templates_kn.xtb index b62dd16..4b68e7be 100644 --- a/components/policy/resources/policy_templates_kn.xtb +++ b/components/policy/resources/policy_templates_kn.xtb
@@ -127,15 +127,6 @@ ನೀತಿಯನ್ನು ತಪ್ಪು ಎಂದು ಹೊಂದಿಸದಿದ್ದರೆ, dev ಸ್ಥಿತಿಯ ಬದಲಾವಣೆಯನ್ನು ವರದಿಮಾಡಲಾಗುವುದಿಲ್ಲ.</translation> <translation id="1160479894929412407">QUIC ಪ್ರೊಟೊಕಾಲ್ ಅನುಮತಿಸಿ</translation> <translation id="1160939557934457296">ಸುರಕ್ಷಿತ ಬ್ರೌಸಿಂಗ್ ಎಚ್ಚರಿಕೆಯ ಪುಟದಿಂದ ಮುಂದುವರಿಸುವುದನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಿ</translation> -<translation id="1171342272070128466">ಡಾಕ್ ಮಾಡಿರುವ ವರ್ಧಕ ಪ್ರವೇಶಿಸುವಿಕೆ ವೈಶಿಷ್ಟ್ಯಗಳನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿ - - ಈ ಕಾರ್ಯನೀತಿಯನ್ನು ಸರಿ ಎಂದು ಹೊಂದಿಸಿದರೆ, ಡಾಕ್ ಮಾಡಿರುವ ವರ್ಧಕವು ಯಾವಾಗಲೂ ಸಕ್ರಿಯವಾಗಿರುತ್ತವೆ. - - ಈ ಕಾರ್ಯನೀತಿಯನ್ನು ತಪ್ಪು ಎಂದು ಹೊಂದಿಸಿದರೆ, ಡಾಕ್ ಮಾಡಿರುವ ವರ್ಧಕವು ಯಾವಾಗಲೂ ನಿಷ್ಕ್ರಿಯವಾಗಿರುತ್ತವೆ. - - ನೀವು ಈ ಕಾರ್ಯನೀತಿಯನ್ನು ಹೊಂದಿಸಿದರೆ, ಬಳಕೆದಾರರು ಅದನ್ನು ಬದಲಾಯಿಸಲು ಅಥವಾ ಅತಿಕ್ರಮಿಸಲು ಸಾಧ್ಯವಾಗುವುದಿಲ್ಲ. - - ಈ ಕಾರ್ಯನೀತಿಯನ್ನು ಹೊಂದಿಸದೆಯೇ ಬಿಟ್ಟರೆ, ಡಾಕ್ ಮಾಡಿರುವ ವರ್ಧಕವನ್ನು ಪ್ರಾರಂಭಿಕವಾಗಿ ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗುತ್ತದೆ, ಆದರೆ ಬಳಕೆದಾರರು ಅದನ್ನು ಯಾವಾಗ ಬೇಕಾದರೂ ಸಕ್ರಿಯಗೊಳಿಸಬಹುದು.</translation> <translation id="1189817621108632689">ಚಿತ್ರಗಳನ್ನು ಪ್ರದರ್ಶಿಸಲು ಅನುಮತಿ ಇಲ್ಲದಿರುವ ಸೈಟ್ಗಳನ್ನು ನಿರ್ದಿಷ್ಟಪಡಿಸುವ URL ಮಾದರಿಗಳ ಪಟ್ಟಿಯನ್ನು ಹೊಂದಿಸಲು ಇದು ನಿಮಗೆ ಅವಕಾಶ ನೀಡುತ್ತದೆ. ಈ ಕಾರ್ಯನೀತಿಯನ್ನು ಹೊಂದಿಸದೇ ಬಿಟ್ಟಿದ್ದು, 'DefaultImagesSetting' ಕಾರ್ಯನೀತಿಯನ್ನು ಹೊಂದಿಸಿದ್ದರೆ, ಎಲ್ಲಾ ಸೈಟ್ಗಳಿಗಾಗಿ ಸಮಗ್ರ ಡಿಫಾಲ್ಟ್ ಮೌಲ್ಯವನ್ನು ಅದರಿಂದಲೇ ಬಳಸಲಾಗುತ್ತದೆ, ಇಲ್ಲದಿದ್ದರೆ ಬಳಕೆದಾರರ ವೈಯಕ್ತಿಕ ಕಾನ್ಫಿಗರೇಶನ್ನಿಂದ ಬಳಸಲಾಗುತ್ತದೆ. @@ -1480,11 +1471,6 @@ ನೀತಿಯನ್ನು ತಪ್ಪು ಎಂಬುದಕ್ಕೆ ಹೊಂದಿಸಿದ್ದರೆ, ಕಿಯೋಸ್ಕ್ ಮಾಹಿತಿಯನ್ನು ವರದಿ ಮಾಡಲಾಗುವುದಿಲ್ಲ. ಸರಿ ಎಂಬುದಕ್ಕೆ ಹೊಂದಿಸಿದರೆ ಅಥವಾ ಹೊಂದಿಸದೇ ಬಿಟ್ಟರೆ, ಕಿಯೋಸ್ಕ್ ಸೆಷನ್ ಮಾಹಿತಿಯನ್ನು ವರದಿ ಮಾಡಲಾಗುತ್ತದೆ.</translation> -<translation id="3852924591079583104"> - ಈ ಕಾರ್ಯನೀತಿಯನ್ನು ArcSession ಗೆ ಹೊಂದಿಸಿರುವಾಗ, ಬಳಕೆದಾರರು ಸೈನ್ ಔಟ್ ಮಾಡಿದಾಗ Android ಪ್ರಾರಂಭಗೊಂಡರೆ, ಸಾಧನವನ್ನು ರೀಬೂಟ್ ಮಾಡುವಂತೆ ಒತ್ತಾಯಿಸುತ್ತದೆ. - ಯಾವಾಗಲೂ ಎಂದು ಹೊಂದಿಸಿರುವಾಗ, ಅದು ಬಳಕೆದಾರರು ಸೈನ್ ಔಟ್ ಮಾಡಿದ ಪ್ರತಿಬಾರಿಯೂ ಸಾಧನವನ್ನು ರೀಬೂಟ್ ಮಾಡುವಂತೆ ಒತ್ತಾಯಿಸುತ್ತದೆ. - ಹೊಂದಿಸದೆಯೇ ಬಿಟ್ಟರೆ, ಅದು ಯಾವುದೇ ಪರಿಣಾಮ ಬೀರುವುದಿಲ್ಲ ಮತ್ತು ಬಳಕೆದಾರರು ಸೈನ್ ಔಟ್ ಮಾಡಿದಾಗ ರೀಬೂಟ್ ಮಾಡುವಂತೆ ಒತ್ತಾಯಿಸುವುದಿಲ್ಲ. ಎಂದಿಗೂ ಬೇಡ ಎಂದು ಹೊಂದಿಸಿದ್ದರೂ, ಇದೇ ಅಂಶಗಳು ಅನ್ವಯವಾಗುತ್ತವೆ. - </translation> <translation id="3858658082795336534">ಡೀಫಾಲ್ಟ್ ಮುದ್ರಣದ ಡ್ಯೂಪ್ಲೆಕ್ಸ್ ಮೋಡ್</translation> <translation id="3859780406608282662"><ph name="PRODUCT_OS_NAME" /> ನಲ್ಲಿನ ವ್ಯತ್ಯಾಸಗಳ ಸೀಡ್ ಪಡೆಯುವಿಕೆಗೆ ಪ್ಯಾರಾಮೀಟರ್ ಸೇರಿಸಿ. @@ -3283,7 +3269,6 @@ ಈ ನೀತಿಯನ್ನು 'RemoveLRUIfDormant' ಗೆ ಹೊಂದಿಸಲಾಗಿದ್ದರೆ, ಸಾಕಷ್ಟು ಮುಕ್ತ ಸ್ಥಳಾವಕಾಶ ಲಭ್ಯವಾಗುವವರೆಗೆ, ಯಾರು ಕನಿಷ್ಠ 3 ತಿಂಗಳಿನಿಂದ ಲಾಗ್ ಇನ್ ಆಗಿಲ್ಲವೋ ಅಂತಹ ಬಳಕೆದಾರರನ್ನು ಕನಿಷ್ಠ-ಇತ್ತೀಚೆಗೆ-ಲಾಗಿನ್ ಆಗಿರುವ ಕ್ರಮದಲ್ಲಿ ಸ್ವಯಂಚಾಲಿತ ಕ್ಲೀನ್-ಅಪ್ ತೆಗೆದುಹಾಕುತ್ತಲೇ ಇರುತ್ತದೆ. ಈ ನೀತಿಯನ್ನು ಹೊಂದಿಸದೇ ಬಿಟ್ಟರೆ, ಡಿಫಾಲ್ಟ್ ಬಿಲ್ಟ್-ಇನ್ ಕಾರ್ಯತಂತ್ರವನ್ನು ಸ್ವಯಂಚಾಲಿತ ಕ್ಲೀನ್-ಅಪ್ ಬಳಸುತ್ತದೆ. ಸದ್ಯಕ್ಕೆ, ಇದು 'RemoveLRUIfDormant' ಕಾರ್ಯತಂತ್ರವಾಗಿದೆ.</translation> -<translation id="7334274148831027933">ಡಾಕ್ ಮಾಡಲಾದ ವರ್ಧಕವನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿ</translation> <translation id="7336785017449297672">ಗಡಿಯಾರ ಮತ್ತು ಸಮಯ ವಲಯದ ಸೆಟ್ಟಿಂಗ್ಗಳನ್ನು ನಿಯಂತ್ರಿಸುತ್ತದೆ.</translation> <translation id="7336878834592315572">ಸೆಶನ್ನ ಸಮಯದಲ್ಲಿ ಕುಕೀಗಳನ್ನು ಇರಿಸಿ</translation> <translation id="7339315111520512972">ನೆಟ್ವರ್ಕಿಂಗ್ ಕೋಡ್ ಅನ್ನು ಬ್ರೌಸಿಂಗ್ ಪ್ರಕ್ರಿಯೆಯಲ್ಲಿ ರನ್ ಆಗುವಂತೆ ಒತ್ತಾಯಿಸಿ</translation>
diff --git a/components/policy/resources/policy_templates_ko.xtb b/components/policy/resources/policy_templates_ko.xtb index eb4effc3..90cb36e 100644 --- a/components/policy/resources/policy_templates_ko.xtb +++ b/components/policy/resources/policy_templates_ko.xtb
@@ -143,15 +143,6 @@ 이 정책을 false로 설정하면 기기 개발자 스위치 상태가 보고되지 않습니다.</translation> <translation id="1160479894929412407">QUIC 프로토콜 허용</translation> <translation id="1160939557934457296">세이프 브라우징 경고 페이지 사용 중지</translation> -<translation id="1171342272070128466">고정 돋보기 접근성 기능을 사용 설정합니다. - - 이 정책이 True로 설정되면 고정 돋보기가 항상 사용됩니다. - - 이 정책이 False로 설정되면 고정 돋보기가 항상 사용 중지됩니다. - - 정책이 설정되면 사용자가 변경하거나 재정의할 수 없습니다. - - 이 정책이 설정되지 않은 경우 처음에 고정 돋보기가 사용 중지되어 있으나 사용자가 언제든지 사용하도록 설정할 수 있습니다.</translation> <translation id="1189817621108632689">이미지를 표시할 수 없는 사이트를 지정하는 URL 패턴 목록을 설정할 수 있습니다. 이 정책을 설정하지 않은 경우 'DefaultImagesSetting' 정책(설정된 경우) 또는 사용자 개인 설정의 전체 기본값이 모든 사이트에서 사용됩니다. @@ -1582,11 +1573,6 @@ 정책이 'false'로 설정된 경우 키오스크 세션 정보가 보고되지 않으며, 정책이 'true'로 설정되거나 설정되지 않은 경우 키오스크 세션 정보가 보고됩니다.</translation> -<translation id="3852924591079583104"> - 이 정책을 ArcSession으로 설정하면 Android가 시작되었을 때 사용자가 로그아웃하면 기기가 강제로 재부팅됩니다. - 항상으로 설정하면 사용자가 로그아웃할 때마다 기기가 강제로 재부팅됩니다. - 정책을 설정하지 않으면 정책이 적용되지 않으며 사용자가 로그아웃해도 강제로 재부팅하지 않습니다. 사용 안함으로 설정했을 때도 이와 마찬가지입니다. - </translation> <translation id="3858658082795336534">기본 양면 인쇄 모드</translation> <translation id="3859780406608282662"><ph name="PRODUCT_OS_NAME" />에서 버전 시드 가져오기에 대한 매개변수를 추가합니다. @@ -3474,7 +3460,6 @@ 이 정책을 'RemoveLRU'로 설정하면 자동 정리는 여유 공간을 확보할 때까지 3개월 이내에 로그인하지 않은 사용자를 가장 오래된 사용자 순서대로 기기에서 삭제합니다. 이 정책을 설정하지 않으면 자동 정리는 기본 전략을 사용합니다. 현재 기본 전략은 'RemoveLRUIfDormant'입니다.</translation> -<translation id="7334274148831027933">고정 돋보기 사용</translation> <translation id="7336785017449297672">시계 및 시간대 설정을 제어합니다.</translation> <translation id="7336878834592315572">세션이 지속되는 동안 쿠키를 유지합니다.</translation> <translation id="7339315111520512972">브라우저 프로세스에서 네트워킹 코드를 강제로 실행</translation>
diff --git a/components/policy/resources/policy_templates_lt.xtb b/components/policy/resources/policy_templates_lt.xtb index d5eeb33d..981eb46 100644 --- a/components/policy/resources/policy_templates_lt.xtb +++ b/components/policy/resources/policy_templates_lt.xtb
@@ -144,15 +144,6 @@ Jei ši politika nustatyta kaip „False“, „Dev“ perjungimo būsena nebus pateikta.</translation> <translation id="1160479894929412407">Leisti QUIC protokolą</translation> <translation id="1160939557934457296">Neleisti tęsti veiksmų iš Saugaus naršymo įspėjimo puslapio</translation> -<translation id="1171342272070128466">Įjunkite prie doko prijungto didintuvo pritaikymo neįgaliesiems funkciją. - - Jei ši politika nustatyta kaip „Tiesa“, prie doko prijungtas didintuvas visada bus įgalintas. - - Jei ši politika nustatyta kaip „Netiesa“, prie doko prijungtas didintuvas visada bus išjungtas. - - Jums nustačius šią politiką naudotojai negalės jos pakeisti ar nepaisyti. - - Jei ši politika nenustatyta, prie doko prijungtas didintuvas bus išjungtas, bet naudotojas galės jį bet kada įgalinti.</translation> <translation id="1189817621108632689">Leidžiama nustatyti URL šablonų, nurodančių svetaines, kuriose neleidžiama pateikti vaizdų, sąrašą. Nenustačius šios politikos, visose svetainėse naudojama visuotinė numatytoji vertė iš politikos „DefaultImagesSetting“ (jei nustatyta) arba naudotojo asmeninės konfigūracijos. @@ -1145,6 +1136,15 @@ Kai ši politika nenustatyta, konkretesnės politikos veikimas lieka nepakitęs.</translation> <translation id="2987155890997901449">ARC įgalinimas</translation> <translation id="2987227569419001736">Valdyti „Web Bluetooth“ API naudojimą</translation> +<translation id="2990018289267778247">Jei ši politika nustatyta kaip „true“, pasiekiamumo parinktys visada rodomos sistemos juostelės meniu. + + Jei ši politika nustatyta kaip „false“, pasiekiamumo parinktys niekada nerodomos sistemos juostelės meniu. + + Jums nustačius šią politiką naudotojai negalės jos pakeisti ar nepaisyti. + + Jei ši politika nenustatyta, pasiekiamumo parinktys nebus rodomos sistemos juostelės meniu, bet „Nustatymų“ puslapyje naudotojas galės nustatyti, kad pasiekiamumo parinktys būtų rodomos. + + Įgalinus pasiekiamumo ypatybes (kitais būdais, pvz., naudojant klavišų derinį), pasiekiamumo parinktys visada rodomos sistemos juostelės meniu.</translation> <translation id="3011301228198307065">Konfigūruojamas numatytasis pagrindinio puslapio URL „<ph name="PRODUCT_NAME" />“ ir naudotojams neleidžiama jo keisti. Pagrindinis puslapis – tai tas puslapis, kuris atidaromas spustelėjus pagrindinio puslapio mygtuką. Kokie puslapiai atidaromi paleidžiant, nustatoma pagal politiką „RestoreOnStartup“. @@ -1468,6 +1468,7 @@ Ši politika naudojama vykdant įrenginio debesies politikos registraciją staliniame kompiuteryje ir gali būti nustatyta naudojant registrą arba GPO sistemoje „Windows“, „plist“ sistemoje „Mac“ ir JSON politikos failą sistemoje „Linux“.</translation> <translation id="3660562134618097814">„SAML IdP“ slapukų perkėlimas prisijungiant</translation> <translation id="3701121231485832347">Valdomi nustatymai, taikomi „<ph name="MS_AD_NAME" />“ tvarkomiems „<ph name="PRODUCT_OS_NAME" />“ įrenginiams.</translation> +<translation id="3702518095257671450">Nuotolinis patvirtinimas</translation> <translation id="3702647575225525306">„<ph name="POLICY_NAME" />“ (Vienos eilutės laukelis nebenaudojamas ir ateityje bus pašalintas. Pradėkite naudoti toliau pateiktą kelių eilučių teksto laukelį.)</translation> <translation id="3709266154059827597">Konfigūruoti plėtinių diegimo juodąjį sąrašą</translation> <translation id="3711895659073496551">Laikinai sustabdyti</translation> @@ -1580,11 +1581,6 @@ Nustačius politiką kaip „False“, viešojo terminalo sesijos informacija nepranešama. Nustačius kaip „True“ arba nenustačius, viešojo terminalo sesijos informacija pranešama.</translation> -<translation id="3852924591079583104"> - Kai ši politika nustatyta kaip „ArcSession“, įrenginys priverstinai paleidžiamas iš naujo naudotojui atsijungus (jei „Android“ paleista). - Kai nustatyta „Visada“, įrenginys priverstinai paleidžiamas iš naujo kiekvieną kartą naudotojui atsijungus. - Jei politika nenustatyta, ji nedaro jokio poveikio ir naudotojui atsijungus įrenginys iš naujo nepaleidžiamas. Tas pats taikoma, jei nustatyta „Niekada“. - </translation> <translation id="3858658082795336534">Numatytasis spausdinimas dvipusiu režimu</translation> <translation id="3859780406608282662">Pridėti parametrą prie atsitiktinio varianto gavimo „<ph name="PRODUCT_OS_NAME" />“. @@ -1869,6 +1865,15 @@ Šios politikos laikomasi, tik jei įgalinta politika „DefaultSearchProviderEnabled“.</translation> <translation id="4285674129118156176">Leidžiama nesusietiems naudotojams naudoti ARC</translation> +<translation id="4289903996435140853">Galima nustatyti URL sąrašą, kuriame nurodoma, kurioms svetainėms automatiškai suteikiamas leidimas pasiekti USB įrenginį su nurodytais paslaugos teikėjo ir produkto ID. Kad politika galiotų, kiekviename sąraše esančiame elemente turi būti įrenginių ir URL. Kiekvienas įrenginiuose esantis elementas gali turėti paslaugos teikėjo ID ir produkto ID lauką. Kiekvienas nenurodytas ID laikomas pakaitos simboliu su viena išimtimi – produkto ID negali būti nurodytas, jei nenurodytas paslaugos teikėjo ID. Priešingu atveju politika negalios ir jos bus nepaisoma. + + Siekiant suteikti užklausą pateikusiam URL leidimą pasiekti USB įrenginį, USB leidimo modeliui naudojamas užklausą pateikusios svetainės URL („užklausą pateikęs URL“) ir aukščiausiojo lygio „iframe“ svetainės URL („įterptasis URL“). Užklausą pateikęs URL gali skirtis nuo įterptojo URL, kai užklausą pateikusi svetainė įkeliama „iframe“. Todėl URL lauke gali būti iki dviejų URL eilučių, atskirtų kableliu, taip atskirai nurodant užklausą pateikusį ir įterptąjį URL. Jei nurodomas tik vienas URL, prieiga prie atitinkamų USB įrenginių suteikiama, kai užklausą pateikusios svetainės URL atitinka šį URL, nepaisant įterpimo būsenos. URL atitinkamame lauke turi būti tinkami, priešingu atveju politikos bus nepaisoma. + + Jei ši politika nenustatyta, visose svetainėse bus naudojama bendroji numatytoji vertė iš politikos „DefaultWebUsbGuardSetting“ (jei nustatyta) arba pagal naudotojo asmeninę konfigūraciją. + + URL šablonai šioje politikoje negali neatitikti tų, kurie sukonfigūruoti pagal „WebUsbBlockedForUrls“. Jei yra neatitikimų, šiai politikai teikiama pirmenybė „WebUsbBlockedForUrls“ ir „WebUsbAskForUrls“ atžvilgiu. + + Šios politikos ir politikos „WebUsbAllowDevicesForUrls“ vertės yra sujungtos.</translation> <translation id="4298509794364745131">Nurodomas programų, kurias galite įgalinti kaip užrašų programas „<ph name="PRODUCT_OS_NAME" />“ užrakinimo ekrane, sąrašas. Jei pageidaujama užrašų programa įgalinta užrakinimo ekrane, jame bus NS elementas pageidaujamai užrašų programai paleisti. @@ -2020,6 +2025,7 @@ <translation id="4639407427807680016">Savųjų susirašinėjimo pranešimais programų prieglobų, kurios bus išskirtos iš juodojo sąrašo, pavadinimai</translation> <translation id="4650759511838826572">Neleisti URL protokolų schemų</translation> <translation id="465099050592230505">Įmonės internetinės parduotuvės URL (nebenaudojama)</translation> +<translation id="4661889655253181651">Turinio nustatymų skiltyje leidžiama nurodyti, kaip turi būti naudojamas konkretaus tipo turinys (pvz., slapukai, vaizdai arba „JavaScript“).</translation> <translation id="4665897631924472251">Plėtinių valdymo nustatymai</translation> <translation id="4668325077104657568">Numatytasis vaizdų nustatymas</translation> <translation id="4670865688564083639">Minimalus:</translation> @@ -2064,6 +2070,11 @@ Šie siūlymai gaunami nuotoliniu būdu iš „Google“ serverių. Jei šis nustatymas nustatytas kaip „false“, siūlymai nebus gaunami ar pateikiami.</translation> +<translation id="4759650396863318477">Galima nustatyti laikotarpį (milisekundėmis), per kurį naudotojams pranešama, kad „<ph name="PRODUCT_NAME" />“ reikia paleisti iš naujo arba kad „<ph name="PRODUCT_OS_NAME" />“ įrenginį reikia paleisti iš naujo, norint pritaikyti laukiantį naujinį. + + Per šį laikotarpį naudotojai bus pakartotinai pranešama apie būtinybę atnaujinti. „<ph name="PRODUCT_OS_NAME" />“ įrenginiuose pranešimas apie paleidimą iš naujo rodomas sistemos juostelėje pagal politiką „<ph name="RELAUNCH_HEADS_UP_PERIOD_POLICY_NAME" />“. Praėjus trečdaliui pranešimo laikotarpio „<ph name="PRODUCT_NAME" />“ naršyklėse pakeičiamas programų meniu nurodant, kad reikia paleisti iš naujo. Šio pranešimo spalva pakeičiama praėjus dviem trečdaliams pranešimo laikotarpio ir dar kartą pakeičiama praėjus visam pranešimo laikotarpiui. Tas pats tvarkaraštis taikomas papildomiems pranešimams, įgalintiems taikant politiką „<ph name="RELAUNCH_NOTIFICATION_POLICY_NAME" />“. + + Jei nenustatyta, „<ph name="PRODUCT_OS_NAME" />“ įrenginiuose naudojamas numatytasis 345 600 000 milisekundžių (keturių dienų) laikotarpis, o „<ph name="PRODUCT_NAME" />“ – 604 800 000 milisekundžių (vienos savaitės) laikotarpis.</translation> <translation id="4788252609789586009">Įgalinama „<ph name="PRODUCT_NAME" />“ automatinio pildymo funkcija ir naudotojams leidžiama automatiškai užpildyti žiniatinklio formas, naudojant anksčiau išsaugotą informaciją, pvz., kredito kortelės informaciją. Jei šis nustatymas išjungtas, Automatinio pildymo funkcija niekada nesiūlys ir automatiškai nepildys kredito kortelės informacijos, taip pat neišsaugos papildomos kredito kortelės informacijos, kurią naudotojas gali pateikti naršydamas žiniatinklyje. @@ -2275,6 +2286,15 @@ Nenustačius šios politikos, visose svetainėse naudojama visuotinė numatytoji vertė iš politikos „Numatytasis pranešimų nustatymas“ (jei nustatyta) arba naudotojo asmeninės konfigūracijos.</translation> <translation id="5213038356678567351">Svetainė, kurios niekada neturėtų suaktyvinti naršyklės perjungimo.</translation> <translation id="5219844027738217407">„Android“ programose ši politika turi įtakos tik mikrofonui. Kai ši politika nustatyta į „Tiesa“, mikrofonas be išimčių nutildomas visose „Android“ programose.</translation> +<translation id="5221394278852982313">Galima nustatyti URL sąrašą, kuriame nurodoma, kurioms svetainėms automatiškai suteikiamas leidimas pasiekti USB įrenginį su nurodytais paslaugos teikėjo ir produkto ID. Kad politika galiotų, kiekviename sąraše esančiame elemente turi būti įrenginių ir URL. Kiekvienas įrenginiuose esantis elementas gali turėti paslaugos teikėjo ID ir produkto ID lauką. Kiekvienas nenurodytas ID laikomas pakaitos simboliu su viena išimtimi – produkto ID negali būti nurodytas, jei nenurodytas paslaugos teikėjo ID. Priešingu atveju politika negalios ir jos bus nepaisoma. + + Siekiant suteikti užklausą pateikusiam URL leidimą pasiekti USB įrenginį, USB leidimo modeliui naudojamas užklausą pateikusios svetainės URL („užklausą pateikęs URL“) ir aukščiausiojo lygio „iframe“ svetainės URL („įterptasis URL“). Užklausą pateikęs URL gali skirtis nuo įterptojo URL, kai užklausą pateikusi svetainė įkeliama „iframe“. Todėl URL lauke gali būti iki dviejų URL eilučių, atskirtų kableliu, taip atskirai nurodant užklausą pateikusį ir įterptąjį URL. Jei nurodomas tik vienas URL, prieiga prie atitinkamų USB įrenginių suteikiama, kai užklausą pateikusios svetainės URL atitinka šį URL, nepaisant įterpimo būsenos. URL atitinkamame lauke turi būti tinkami, priešingu atveju politikos bus nepaisoma. + + Jei ši politika nenustatyta, visose svetainėse bus naudojama bendroji numatytoji vertė iš politikos „DefaultWebUsbGuardSetting“ (jei nustatyta) arba pagal naudotojo asmeninę konfigūraciją. + + URL šablonai šioje politikoje negali neatitikti tų, kurie sukonfigūruoti pagal „WebUsbBlockedForUrls“. Jei yra neatitikimų, šiai politikai teikiama pirmenybė „WebUsbBlockedForUrls“ ir „WebUsbAskForUrls“ atžvilgiu. + + Šios politikos ir politikos „DeviceWebUsbAllowDevicesForUrls“ vertės yra sujungtos.</translation> <translation id="5228316810085661003">Vietinės įrenginio paskyros automatinio prisijungimo delsa. Jei nenustatyta politika |DeviceLocalAccountAutoLoginId|, ji negalioja. Toliau nurodyti kiti atvejai. @@ -3018,6 +3038,21 @@ Jei ši politika nustatyta kaip „Neleisti naudotojams tvarkyti sertifikatų“, naudotojai negalės tvarkyti sertifikatų, jie galės juos tik peržiūrėti.</translation> <translation id="6573305661369899995">Išorinio URL apribojimų šaltinio nustatymas</translation> +<translation id="6583851521569686409">Konfigūruojamas spausdintuvų sąrašas. + + Taikant šią politiką leidžiama administratoriams teikti spausdintuvo konfigūracijas + naudotojams. + + „<ph name="PRINTER_DISPLAY_NAME" />“ ir „<ph name="PRINTER_DESCRIPTION" />“ yra laisvos formos eilutės, kurias galima tinkinti, kad būtų lengviau pasirinkti spausdintuvą. „<ph name="PRINTER_MANUFACTURER" />“ ir „<ph name="PRINTER_MODEL" />“ naudojamos siekiant palengvinti spausdintuvo identifikavimą galutiniams naudotojams. Jos nurodo spausdintuvo gamintoją ir modelį. „<ph name="PRINTER_URI" />“ turi būti adresas, kurį galima pasiekti iš kliento kompiuterio, įskaitant „<ph name="URI_SCHEME" />“, „<ph name="URI_PORT" />“ ir „<ph name="URI_QUEUE" />“. „<ph name="PRINTER_UUID" />“ yra pasirenkama. Jei nurodyta, ji naudojama siekiant panaikinti pasikartojančius „<ph name="ZEROCONF_DISCOVERY" />“ spausdintuvus. + + „<ph name="PRINTER_EFFECTIVE_MODEL" />“ turi būti nurodytas spausdintuvo pavadinimas arba „<ph name="PRINTER_AUTOCONF" />“ turi būti nustatyta kaip „true“. Spausdintuvų su abiem ypatybėmis arba visai be jų bus nepaisoma. + + Spausdintuvo sąranka užbaigiama pirmą kartą panaudojus spausdintuvą. PPD neatsisiunčiami, kol spausdintuvas nenaudojamas. Paskui dažnai naudojami PPD saugomi talpykloje. + + Ši politika neturi įtakos tam, ar naudotojai gali konfigūruoti spausdintuvus atskiruose įrenginiuose. Ji skirta papildyti atskirų naudotojų spausdintuvų konfigūraciją. + + Jei naudojami „Active Directory“ tvarkomi įrenginiai, ši politika palaiko „Active Directory“ įrenginio pavadinimo „<ph name="MACHINE_NAME_VARIABLE" />“ arba jo poeilučio plėtinį. Pavyzdžiui, jei įrenginio pavadinimas yra „<ph name="MACHINE_NAME_EXAMPLE" />“, tada „<ph name="MACHINE_NAME_VARIABLE_EXAMPLE" />“ būtų pakeistas 4 simboliais nuo 6-osios pozicijos, pvz., „<ph name="MACHINE_NAME_PART_EXAMPLE" />“. Atminkite, kad pozicija nustatoma nuo nulio. + </translation> <translation id="6598235178374410284">Naudotojo pseudoportreto vaizdas</translation> <translation id="6603004149426829878">Visada siųsti visus pasiekiamus vietovės signalus serveriui nustatant laiko juostą</translation> <translation id="6628120204569232711">Saugyklos būsenos ataskaitos pateikimas</translation> @@ -3473,7 +3508,6 @@ Jei ši politika nustatyta į „RemoveLRUIfDormant“, automatinis išvalymas šalins naudotojus, kurie neprisijungė bent 3 mėnesius (pagal seniausiai prisijungusiųjų tvarką), kol liks pakankamai laisvos vietos. Jei ši politika nenustatyta, automatinis išvalymas naudos numatytąją įdiegtą strategiją. Šiuo metu tai strategija „RemoveLRUIfDormant“.</translation> -<translation id="7334274148831027933">Įgalinti prie doko prijungtą didintuvą</translation> <translation id="7336785017449297672">Valdomi laikrodžio ir laiko juostos nustatymai.</translation> <translation id="7336878834592315572">Išsaugoti slapukus vykstant sesijai</translation> <translation id="7339315111520512972">Priverstinis darbo tinkle kodo vykdymas naršyklės procese</translation> @@ -4384,6 +4418,8 @@ <translation id="915194831143859291">Jei ši politika nustatyta į „false“ arba nesukonfigūruota, „<ph name="PRODUCT_OS_NAME" />“ leidžia naudotojui išjungti įrenginį. Jei ši politika nustatyta į „true“, „<ph name="PRODUCT_OS_NAME" />“ suaktyvina paleidimą iš naujo, kai naudotojas išjungia įrenginį. Visus išjungimo mygtukų atvejus NS „<ph name="PRODUCT_OS_NAME" />“ pakeičia paleidimo iš naujo mygtukais. Jei naudotojas išjungia įrenginį naudodamas maitinimo mygtuką, įrenginys nėra automatiškai paleidžiamas iš naujo, net jei politika įgalinta.</translation> <translation id="9152473318295429890">Kontekstinių susijusių tinklalapių siūlymų įgalinimas</translation> +<translation id="9153446010242995516">Grąžinti ir palikti tikslinę versiją, jei OS versija naujesnė nei tikslinė. Pabandykite perduoti įrenginio lygio konfigūraciją (įskaitant tinklo prisijungimo duomenis) vykdydami grąžinimo procesą, jei įmanoma, bet grąžinimą atlikite naudodami išsamų „Powerwash“, net jei negalima atkurti duomenų (nes tikslinė versija nepalaiko duomenų atkūrimo arba dėl nesuderinamo atgalinio pakeitimo). + Palaikoma naudojant 75 ir naujesnių versijų „<ph name="PRODUCT_OS_NAME" />“. Jei kliento programa senesnė, ši vertė reiškia, kad grąžinimas išjungtas.</translation> <translation id="9158929520101169054">Leidimas naršyklėje prisijungti prie kelių paskyrų</translation> <translation id="9159126470527871268">Pranešama naudotojams, kad būtina iš naujo paleisti „<ph name="PRODUCT_NAME" />“ arba „<ph name="PRODUCT_OS_NAME" />“, norint pritaikyti laukiantį naujinį.
diff --git a/components/policy/resources/policy_templates_lv.xtb b/components/policy/resources/policy_templates_lv.xtb index e4dff44c..af41a873 100644 --- a/components/policy/resources/policy_templates_lv.xtb +++ b/components/policy/resources/policy_templates_lv.xtb
@@ -133,15 +133,6 @@ Ja šai politikai ir norādīta vērtība “False”, netiks ziņots par izstrādes slēdža stāvokli.</translation> <translation id="1160479894929412407">QUIC protokola atļaušana</translation> <translation id="1160939557934457296">Aizliegums turpināt pārlūkošanu no Drošas pārlūkošanas brīdinājuma lapas</translation> -<translation id="1171342272070128466">Iespējot dokotas lupas pieejamības funkciju. - - Ja šai politikai ir iestatīta vērtība “true”, dokotā lupa vienmēr būs iespējota. - - Ja šai politikai ir iestatīta vērtība “false”, dokotā lupa vienmēr būs atspējota. - - Ja iestatīsiet šo politiku, lietotāji nevarēs to mainīt un ignorēt. - - Ja šī politika nav iestatīta, dokotā lupa sākotnēji ir atspējota, taču lietotājs var jebkurā brīdī to iespējot.</translation> <translation id="1189817621108632689">Ļauj iestatīt URL rakstu sarakstu ar vietnēm, kurām nav atļauts attēlot attēlus. Ja šī politika nav iestatīta, visām vietnēm tiks izmantota vispārējā noklusējuma vērtība no politikas DefaultImagesSetting (ja tā ir iestatīta) vai no lietotāja personiskās konfigurācijas. @@ -1136,6 +1127,15 @@ Ja šī politika netiek iestatīta, precīzāko politiku darbība netiek ietekmēta.</translation> <translation id="2987155890997901449">ARC iespējošana</translation> <translation id="2987227569419001736">Web Bluetooth API lietošanas pārvaldība</translation> +<translation id="2990018289267778247">Ja šai politikai ir iestatīta vērtība “True”, pieejamības iespējas vienmēr tiek rādītas sistēmas teknes izvēlnē. + + Ja šai politikai ir iestatīta vērtība “False”, pieejamības iespējas nekad netiek rādītas sistēmas teknes izvēlnē. + + Ja iestatīsiet šo politiku, lietotāji nevarēs to mainīt vai ignorēt. + + Ja šī politika netiks iestatīta, pieejamības iespējas netiks rādītas sistēmas teknes izvēlnē, taču lietotājs varēs iestatīt pieejamības iespēju rādīšanu lapā Iestatījumi. + + Ja ir iespējotas pieejamības funkcijas (citā veidā, piemēram, ar taustiņu kombināciju), pieejamības iespējas vienmēr tiek rādītas sistēmas teknes izvēlnē.</translation> <translation id="3011301228198307065">Konfigurē noklusējuma sākumlapas URL pārlūkprogrammā <ph name="PRODUCT_NAME" /> un neļauj lietotājiem to mainīt. Sākumlapa ir lapa, kas tiek atvērta, nospiežot pogu Sākums. Lapas, kas atvērtas startēšanas laikā, kontrolē RestoreOnStartup politikas. @@ -1457,6 +1457,7 @@ Šo politiku izmanto ierīces tvēruma mākoņa politikas reģistrācijai galddatoros, un to var iestatīt, izmantojot reģistru vai GPO operētājsistēmā Windows, “plist” failu operētājsistēmā Mac un JSON politikas failu operētājsistēmā Linux.</translation> <translation id="3660562134618097814">SAML identitātes nodrošinātāja sīkfailu pārsūtīšana pieteikšanās laikā</translation> <translation id="3701121231485832347">Kontrolē iestatījumus, kas ir raksturīgi <ph name="MS_AD_NAME" /> pārvaldītajām <ph name="PRODUCT_OS_NAME" /> ierīcēm.</translation> +<translation id="3702518095257671450">Attālinātā apstiprināšana</translation> <translation id="3702647575225525306"><ph name="POLICY_NAME" /> (Vienas rindas lauks ir novecojis, un to ir plānots noņemt. Lūdzu, sāciet lietot tālāk esošo vairākrindu tekstlodziņu.)</translation> <translation id="3709266154059827597">Konfigurē paplašinājumu instalēšanas melno sarakstu</translation> <translation id="3711895659073496551">Darbības apturēšana</translation> @@ -1566,11 +1567,6 @@ <translation id="3851039766298741586">Tiek sniegta informācija par aktīvo kioska režīma sesiju, piemēram, lietojumprogrammas ID un versija. Ja šai politikai ir iestatīta vērtība “Nepatiesa”, netiek sniegta informācija par sesiju. Ja ir iestatīta vērtība “Patiesa” vai nav iestatīta nekāda vērtība, informācija tiek sniegta.</translation> -<translation id="3852924591079583104"> - Kad šai politikai ir iestatīta vērtība “ArcSession”, tā liek ierīcei veikt atkārtotu palaišanu pēc lietotāja izrakstīšanās, ja operētājsistēma Android ir sākusi darbu. - Ja šai politikai ir iestatīta vērtība “Always”, tā liek ierīcei veikt atkārtotu palaišanu pēc katras lietotāja izrakstīšanās. - Ja šī politika nav iestatīta, tai nav nekādas ietekmes, un pēc lietotāja izrakstīšanās netiek veikta piespiedu atkārtota palaišana. Tas pats notiek, ja politikai ir iestatīta vērtība “Never”. - </translation> <translation id="3858658082795336534">Noklusējuma abpusējās drukāšanas režīms</translation> <translation id="3859780406608282662">Pievienot parametru variantu sēkas ienešanai operētājsistēmā <ph name="PRODUCT_OS_NAME" />. @@ -1854,6 +1850,15 @@ Šī politika ir spēkā tikai tad, ja ir iespējota politika “DefaultSearchProviderEnabled”.</translation> <translation id="4285674129118156176">Ļauj nesaistītiem lietotājiem izmantot ARC</translation> +<translation id="4289903996435140853">Ļauj jums iestatīt to vietrāžu URL sarakstu, kas norāda, kurām vietnēm tiks automātiski piešķirta atļauja piekļūt USB ierīcei, izmantojot norādīto pakalpojumu sniedzēja un produkta ID. Lai politika būtu derīga, katrā saraksta vienumā jānorāda gan ierīces, gan vietrāži URL. Katrs vienums ierīcēs var ietvert pakalpojumu sniedzēja ID un produkta ID lauku. Katrs izlaistais ID tiek uzskatīts par aizstājējzīmi, izņemot vienu gadījumu — produkta ID nevar norādīt, ja nav norādīts arī pakalpojumu sniedzēja ID. Pretējā gadījumā politika nebūs derīga un tiks ignorēta. + + USB atļauju modelis izmanto pieprasošās vietnes URL (“pieprasošais URL”) un augstākā līmeņa ietvara vietnes URL (“iegultais URL”), lai piešķirtu piekļuvi pieprasošajam URL piekļūt USB ierīcei. Pieprasošais URL var atšķirties no iegultā URL, kad pieprasošā vietne tiek ielādēta ietvarā iframe. Tāpēc laukā “urls” nedrīkst ietvert vairāk par divām URL virknēm, kas atdalītas ar komatu un norāda attiecīgi pieprasošo un iegulto URL. Ja ir norādīts tikai viens URL, piekļuve atbilstošajām USB ierīcēm tiks piešķirta, kad pieprasošās vietnes URL atbildīs šim URL neatkarīgi no iegulšanas statusa. Laukā “urls” ievadītajiem vietrāžiem URL ir jābūt derīgiem vietrāžiem URL, pretējā gadījumā politika tiks ignorēta. + + Ja politika netiks iestatīta, visām vietnēm tiks izmantota vispārējā noklusējuma vērtība no politikas “DefaultWebUsbGuardSetting” (ja tā ir iestatīta); pretējā gadījumā tiks izmantota lietotāja personīgā konfigurācija. + + Šajā politikā norādītie URL modeļi nedrīkst būt pretrunā ar modeļiem, kas konfigurēti politikā “WebUsbBlockedForUrls”. Ja rodas pretrunas, šai politikai ir augstāka prioritāte nekā politikām “WebUsbBlockedForUrls” un “WebUsbAskForUrls”. + + Šīs politikas un politikas “WebUsbAllowDevicesForUrls” vērtības ir apvienotas.</translation> <translation id="4298509794364745131">Nosaka lietotņu sarakstu, kuras var iespējot kā piezīmju lietotnes <ph name="PRODUCT_OS_NAME" /> bloķēšanas ekrānā. Ja bloķēšanas ekrānā ir iespējota vēlamā piezīmju lietotne, bloķēšanas ekrānā būs lietotāja saskarnes elements, ar ko varēs palaist vēlamo piezīmju lietotni. @@ -2005,6 +2010,7 @@ <translation id="4639407427807680016">Vietējās ziņojumapmaiņas saimniekdatoru nosaukumi, kas nav jāiekļauj melnajā sarakstā</translation> <translation id="4650759511838826572">Atspējo URL protokolu shēmas</translation> <translation id="465099050592230505">Uzņēmuma interneta veikala URL (darbība ir pārtraukta)</translation> +<translation id="4661889655253181651">Satura iestatījumi ļauj norādīt, kā jārīkojas ar noteikta veida saturu (piemēram, sīkfailiem, attēliem vai JavaScript).</translation> <translation id="4665897631924472251">Paplašinājumu pārvaldības iestatījumi</translation> <translation id="4668325077104657568">Noklusējuma attēlu iestatījums</translation> <translation id="4670865688564083639">Minimums:</translation> @@ -2049,6 +2055,11 @@ Šie ieteikumi tiek izgūti attāli no Google serveriem. Ja šīs politikas iestatījums ir “False”, ieteikumi netiks izgūti vai parādīti.</translation> +<translation id="4759650396863318477">Ļauj iestatīt laika periodu milisekundēs, kura laikā lietotājiem tiek paziņots par to, ka pārlūkprogramma <ph name="PRODUCT_NAME" /> ir atkārtoti jāpalaiž vai <ph name="PRODUCT_OS_NAME" /> ierīce ir jārestartē, lai veiktu nepabeigto atjaunināšanu. + + Šajā periodā lietotājs tiks atkārtoti informēts par atjaunināšanu. <ph name="PRODUCT_OS_NAME" /> ierīcēs paziņojums par restartēšanu tiek rādīts sistēmas teknē atbilstoši politikai <ph name="RELAUNCH_HEADS_UP_PERIOD_POLICY_NAME" />. <ph name="PRODUCT_NAME" /> pārlūkprogrammās: kad ir pagājusi trešdaļa no perioda, lietotnes izvēlne tiek mainīta, lai norādītu, ka nepieciešama atkārtota lietotnes palaišana. Kad ir pagājusi puse no perioda, šī paziņojuma krāsa tiek mainīta. Kad ir pagājis viss periods, paziņojuma krāsa tiek mainīta vēl vienu reizi. Tādā pašā veidā tiek rādīti arī pārlūkprogrammas <ph name="RELAUNCH_NOTIFICATION_POLICY_NAME" /> politikas papildu iespējotie paziņojumi. + + Ja šī politika nav iestatīta, <ph name="PRODUCT_OS_NAME" /> ierīcēs tiek izmantots noklusējuma periods 345 600 000 milisekundes (četras dienas), savukārt pārlūkprogrammā <ph name="PRODUCT_NAME" /> — 604 800 000 milisekundes (viena nedēļa).</translation> <translation id="4788252609789586009">Iespējo pārlūka <ph name="PRODUCT_NAME" /> funkciju Automātiskā aizpilde un ļauj lietotājiem automātiski aizpildīt kredītkaršu informāciju tīmekļa veidlapās, izmantojot iepriekš saglabāto informāciju. Ja šis iestatījums ir atspējots, funkcija Automātiskā aizpilde nekad nerādīs kredītkaršu informācijas ieteikumus un neaizpildīs šo informāciju, kā arī nesaglabās papildu kredītkaršu informāciju, ko lietotājs var norādīt, pārlūkojot tīmekli. @@ -2261,6 +2272,15 @@ Ja šī politika nav iestatīta, visām vietnēm tiks izmantota globālā noklusējuma vērtība no politikas DefaultNotificationsSetting (ja tā ir iestatīta) vai pretējā gadījumā no lietotāja personīgās konfigurācijas.</translation> <translation id="5213038356678567351">Vietnes, kuras nekad neaktivizēs pārlūkprogrammas pārslēgšanu.</translation> <translation id="5219844027738217407">Android lietotnēs šī politika ietekmē tikai mikrofonu. Kad šī politika ir iestatīta kā patiesa, mikrofons tiek izslēgts visās Android lietotnēs bez izņēmuma.</translation> +<translation id="5221394278852982313">Ļauj jums iestatīt to vietrāžu URL sarakstu, kas norāda, kurām vietnēm tiks automātiski piešķirta atļauja piekļūt USB ierīcei, izmantojot norādīto pakalpojumu sniedzēja un produkta ID. Lai politika būtu derīga, katrā saraksta vienumā jānorāda gan ierīces, gan vietrāži URL. Katrs vienums ierīcēs var ietvert pakalpojum sniedzēja ID un produkta ID lauku. Katrs izlaistais ID tiek uzskatīts par aizstājējzīmi, izņemot vienu gadījumu — produkta ID nevar norādīt, ja nav norādīts arī pakalpojumu sniedzēja ID. Pretējā gadījumā politika nebūs derīga un tiks ignorēta. + + USB atļauju modelis izmanto pieprasošās vietnes URL (“pieprasošais URL”) un augstākā līmeņa ietvara vietnes URL (“iegultais URL”), lai piešķirtu piekļuvi pieprasošajam URL piekļūt USB ierīcei. Pieprasošais URL var atšķirties no iegultā URL, kad pieprasošā vietne tiek ielādēta ietvarā iframe. Tāpēc laukā “urls” nedrīkst ietvert vairāk par divām URL virknēm, kas atdalītas ar komatu un norāda attiecīgi pieprasošo un iegulto URL. Ja ir norādīts tikai viens URL, piekļuve atbilstošajām USB ierīcēm tiks piešķirta, kad pieprasošās vietnes URL atbildīs šim URL neatkarīgi no iegulšanas statusa. Laukā “urls” ievadītajiem vietrāžiem URL ir jābūt derīgiem vietrāžiem URL, pretējā gadījumā politika tiks ignorēta. + + Ja šī politika netiks iestatīta, visām vietnēm tiks izmantota vispārējā noklusējuma vērtība no politikas “DefaultWebUsbGuardSetting” (ja tā ir iestatīta); pretējā gadījumā tiks izmantota lietotāja personīgā konfigurācija. + + Šajā politikā norādītie URL modeļi nedrīkst būt pretrunā ar modeļiem, kas konfigurēti politikā “WebUsbBlockedForUrls”. Ja rodas pretrunas, šai politikai ir augstāka prioritāte nekā politikām “WebUsbBlockedForUrls” un “WebUsbAskForUrls”. + + Šīs politikas un politikas “DeviceWebUsbAllowDevicesForUrls” vērtības ir apvienotas.</translation> <translation id="5228316810085661003">Ierīces lokālā konta automātiskās pieteikšanās aizkave. Ja politikas |DeviceLocalAccountAutoLoginId| vērtība nav iestatīta, šī politika nedarbojas. Pretējā gadījumā ir spēkā tālāk minētais. @@ -2989,6 +3009,21 @@ Ja šī politika ir iestatīta uz vērtību “Neatļaut lietotājiem pārvaldīt sertifikātus”, lietotāji nevarēs pārvaldīt sertifikātus, viņi varēs tikai tos skatīt.</translation> <translation id="6573305661369899995">Ārēja URL ierobežojumu avota iestatīšana</translation> +<translation id="6583851521569686409">Konfigurē printeru sarakstu. + + Izmantojot šo politiku, administratori var nodrošināt printeru + konfigurāciju lietotājiem. + + Parametri <ph name="PRINTER_DISPLAY_NAME" /> un <ph name="PRINTER_DESCRIPTION" /> ir brīva formāta virknes, ko var pielāgot ērtai printera atlasei. Parametri <ph name="PRINTER_MANUFACTURER" /> un <ph name="PRINTER_MODEL" /> ļauj galalietotājiem identificēt printeri. Tie apzīmē printera ražotāju un modeli. Parametram <ph name="PRINTER_URI" /> ir jābūt adresei, ko var sasniegt no klienta datora, tostarp <ph name="URI_SCHEME" />, <ph name="URI_PORT" /> un <ph name="URI_QUEUE" />. Parametrs <ph name="PRINTER_UUID" /> nav jānorāda obligāti. Ja tas ir norādīts, tas tiek izmantots, lai novērstu <ph name="ZEROCONF_DISCOVERY" /> printeru dublēšanu. + + Parametram <ph name="PRINTER_EFFECTIVE_MODEL" /> ir jāietver printera nosaukums, vai parametram <ph name="PRINTER_AUTOCONF" /> ir jābūt iestatītai vērtībai “True”. Printeri ar abiem parametriem vai bez tiem tiks ignorēti. + + Printera iestatīšana ir pabeigta, kad printeris tiek izmantots pirmo reizi. PPD faili netiek lejupielādēti, kamēr printeris netiek izmantots. Pēc tam bieži izmantotie PPD faili tiek saglabāti kešatmiņā. + + Šī politika neietekmē to, vai lietotāji var konfigurēt printerus atsevišķās ierīcēs. Tās mērķis ir papildināt printeru konfigurāciju, ko veic individuāli lietotāji. + + Ierīcēs, kas tiek pārvaldītas pakalpojumā Active Directory, šī politika atbalsta Active Directory ierīces nosaukuma vai tās apakšvirknes iekļaušanu ierīces <ph name="MACHINE_NAME_VARIABLE" /> nosaukumā. Piemēram, ja ierīces nosaukums ir <ph name="MACHINE_NAME_EXAMPLE" />, vērtība <ph name="MACHINE_NAME_VARIABLE_EXAMPLE" /> pēc sestās pozīcijas tiktu aizstāta ar četrām rakstzīmēm: <ph name="MACHINE_NAME_PART_EXAMPLE" />. Ņemiet vērā, ka pozīciju numurēšana sākas ar nulli. + </translation> <translation id="6598235178374410284">Lietotāja iemiesojuma attēls</translation> <translation id="6603004149426829878">Vienmēr sūtīt visus signālus par atrašanās vietu serverim laika joslas noteikšanas laikā</translation> <translation id="6628120204569232711">Ziņot par krātuves statusu</translation> @@ -3446,7 +3481,6 @@ Ja politikas iestatījums ir “RemoveLRUIfDormant”, veicot automātisko tīrīšanu, tiks noņemti lietotāji, kas nav pieteikušies vismaz 3 mēnešus (sākot no lietotāja, kas visilgāk nav pieteicies), līdz būs atbrīvots pietiekami daudz vietas. Ja šī politika nav iestatīta, automātiskajai tīrīšanai tiks izmantota noklusējuma tīrīšanas stratēģija. Pašlaik tā ir stratēģija “RemoveLRUIfDormant”.</translation> -<translation id="7334274148831027933">Iespējot dokotu lupu</translation> <translation id="7336785017449297672">Kontrolē pulksteņa un laika joslas iestatījumus.</translation> <translation id="7336878834592315572">Sīkfailu saglabāšana sesijas laikā</translation> <translation id="7339315111520512972">Piespiedu tīkla koda politika, lai darbotos pārlūka procesā</translation> @@ -4341,6 +4375,8 @@ <translation id="915194831143859291">Ja šai politikai ir iestatīta vērtība Nepatiesa vai ja politika nav konfigurēta, lietotājs var izslēgt <ph name="PRODUCT_OS_NAME" /> ierīci. Ja šai politikai ir iestatīta vērtība Patiesa, lietotājam izslēdzot ierīci, operētājsistēmā <ph name="PRODUCT_OS_NAME" /> tiek aktivizēta atkārtotā palaišana. <ph name="PRODUCT_OS_NAME" /> aizstāj visas lietotāja saskarnē esošās izslēgšanas pogas ar atkārtotas palaišanas pogām. Ja lietotājs izslēdz ierīci, izmantojot barošanas pogu, ierīce tiek automātiski atkārtoti palaista, pat ja ir iespējota politika.</translation> <translation id="9152473318295429890">Iespējojiet saistīto tīmekļa lapu kontekstuālos ieteikumus</translation> +<translation id="9153446010242995516">Veikt atriti un paturēt mērķa versiju, ja operētājsistēmas versija ir jaunāka nekā mērķa versija. Mēģiniet pārnest konfigurāciju ierīces līmenī (tostarp tīkla akreditācijas datus) ar atrites palīdzību, ja tas ir iespējams, taču veiciet atriti, pilnībā izmantojot funkciju Powerwash, pat ja datu atjaunošana nav iespējama (jo mērķa versija neatbalsta atjaunošanas datus vai atpakaļ nesavietojamu izmaiņu dēļ). + Tiek atbalstīts <ph name="PRODUCT_OS_NAME" /> 75. versijā un jaunākās. Senākiem klientiem šī vērtība nozīmē to, ka atrite ir atspējota.</translation> <translation id="9158929520101169054">Atļauj pārlūkā vairākkārtēju pierakstīšanos</translation> <translation id="9159126470527871268">Paziņo lietotājiem, ka pārlūks <ph name="PRODUCT_NAME" /> ir atkārtoti jāpalaiž vai <ph name="PRODUCT_OS_NAME" /> ierīce ir jārestartē, lai veiktu nepabeigto atjaunināšanu.
diff --git a/components/policy/resources/policy_templates_ml.xtb b/components/policy/resources/policy_templates_ml.xtb index 16c3e265..c8bc3b2 100644 --- a/components/policy/resources/policy_templates_ml.xtb +++ b/components/policy/resources/policy_templates_ml.xtb
@@ -130,15 +130,6 @@ നയം തെറ്റ് എന്ന് സജ്ജമാക്കിയാൽ, ഡെവലപ്പർ സ്വിച്ചിന്റെ നില റിപ്പോർട്ട് ചെയ്യില്ല.</translation> <translation id="1160479894929412407">QUIC പ്രോട്ടോക്കോൾ അനുവദിക്കുക</translation> <translation id="1160939557934457296">സുരക്ഷിത ബ്രൗസിംഗ് മുന്നറിയിപ്പ് പേജിൽ നിന്നും തുടരുന്നത് അപ്രാപ്തമാക്കുക</translation> -<translation id="1171342272070128466">ഡോക്ക് ചെയ്ത മാഗ്നിഫയറിന്റെ ഉപയോഗസഹായി ഫീച്ചർ പ്രവർത്തനക്ഷമമാക്കുക. - - ഈ നയം ശരി എന്ന് സജ്ജീകരിച്ചാൽ, ഡോക്ക് ചെയ്ത മാഗ്നിഫയർ എപ്പോഴും പ്രവർത്തനക്ഷമമായിരിക്കും. - - ഈ നയം തെറ്റ് എന്ന് സജ്ജീകരിച്ചാൽ, ഡോക്ക് ചെയ്ത മാഗ്നിഫയർ എപ്പോഴും പ്രവർത്തനരഹിതമായിരിക്കും. - - ഈ നയം സജ്ജീകരിച്ചാൽ, ഉപയോക്താക്കൾക്ക് അത് മാറ്റാനോ അസാധുവാക്കാനോ കഴിയില്ല. - - ഈ നയം സജ്ജീകരിക്കാതെ വിടുകയാണെങ്കിൽ, പ്രാഥമികമായി ഡോക്ക് ചെയ്ത മാഗ്നിഫയർ പ്രവർത്തനരഹിതമാകുമെങ്കിലും ഉപയോക്താവിന് ഏതുസമയത്തും അത് പ്രവർത്തനക്ഷമമാക്കാനാകും.</translation> <translation id="1189817621108632689">ചിത്രങ്ങൾ പ്രദർശിപ്പിക്കാൻ അനുവദിച്ചിട്ടില്ലാത്ത സൈറ്റുകൾ വ്യക്തമാക്കുന്ന url പാറ്റേണുകളുടെ ലിസ്റ്റ് സജ്ജീകരിക്കാൻ നിങ്ങളെ അനുവദിക്കുന്നു. ഈ നയം സജ്ജീകരിക്കാതിരുന്നാൽ, 'DefaultImagesSetting' നയം സജ്ജീകരിച്ചിട്ടുണ്ടെങ്കിൽ അതിൽനിന്നോ, അല്ലെങ്കിൽ ഉപയോക്താവിന്റെ വ്യക്തിപരമായ കോൺഫിഗറേഷനിൽ നിന്നോ എല്ലാ സൈറ്റുകൾക്കും ആഗോള ഡിഫോൾട്ട് മൂല്യം ഉപയോഗിക്കും. @@ -1546,11 +1537,6 @@ നയം തെറ്റ് എന്നാണ് സജ്ജമാക്കിയിരിക്കുന്നതെങ്കിൽ, കിയോസ്ക് വിവരങ്ങൾ റിപ്പോർട്ട് ചെയ്യില്ല. ശരി എന്ന് സജ്ജമാക്കുകയോ ഒന്നും സജ്ജമാക്കാതെ വിടുകയോ ആണെങ്കിൽ, കിയോസ്ക് വിവരങ്ങൾ റിപ്പോർട്ട് ചെയ്യും.</translation> -<translation id="3852924591079583104"> - ഈ നയം ArcSession എന്ന് സജ്ജീകരിക്കുമ്പോൾ, Android ആരംഭിച്ചിട്ടുണ്ടെങ്കിൽ ഉപയോക്താവ് സൈൻ ഔട്ട് ചെയ്യുമ്പോൾ ഉപകരണം നിർബന്ധിതമായി റീബൂട്ട് ചെയ്യുന്നു. - എപ്പോഴും എന്ന് സജ്ജീകരിക്കുമ്പോൾ, ഓരോ ഉപയോക്താവും സൈൻ ഔട്ട് ചെയ്യുമ്പോഴും ഉപകരണം നിർബന്ധിതമായി റീബൂട്ട് ചെയ്യുന്നു. - സജ്ജീകരിക്കാതെ വിട്ടാൽ, ഉപയോക്താവ് സൈൻ ഔട്ട് ചെയ്യുമ്പോൾ യാതൊരു നിര്വ്വഹണവും നിർബന്ധിത റീബൂട്ട് ചെയ്യലുമുണ്ടാകില്ല. ഒരിക്കലുമില്ല എന്ന് സജ്ജീകരിച്ചാൽ സമാനമായത് ബാധകമാകും. - </translation> <translation id="3858658082795336534">രണ്ട് വശത്തും അച്ചടിക്കാവുന്ന ഡിഫോൾട്ട് പ്രിന്റിംഗ് മോഡ്</translation> <translation id="3859780406608282662"><ph name="PRODUCT_OS_NAME" /> എന്നതിലെ വേരിയേഷൻ സീഡ് ലഭ്യമാക്കലിന് പാരാമീറ്റർ ചേർക്കുക. @@ -3398,7 +3384,6 @@ ഈ നയം 'RemoveLRUIfDormant' എന്ന് സജ്ജമാക്കുകയാണെങ്കിൽ, ആവശ്യമായ ഇടം ലഭിക്കുന്നതുവരെ സ്വയമേവയുള്ള ക്ലീൻ അപ്പ്, അടുത്തിടെ ലോഗിൻ ചെയ്യാത്തവർ എന്ന ക്രമത്തിൽ കുറഞ്ഞത് മൂന്ന് മാസത്തിനുള്ളിൽ ലോഗിൻ ചെയ്യാത്ത ഉപയോക്താക്കളെ ഉപകരണത്തിൽ നിന്നും നീക്കംചെയ്തുകൊണ്ടിരിക്കും. ഈ നയം സജ്ജമാക്കുന്നില്ലെങ്കിൽ, സ്വയമേവയുള്ള ക്ലീൻ അപ്പ് ഡിഫോൾട്ടായ ഇൻബിൽറ്റ് രീതി ഉപയോഗിക്കുന്നു. നിലവിൽ ഇത് 'RemoveLRUIfDormant രീതിയാണ് പിന്തുടരുന്നത്.</translation> -<translation id="7334274148831027933">ഡോക്ക് ചെയ്ത മാഗ്നിഫയർ പ്രവർത്തനക്ഷമമാക്കുക</translation> <translation id="7336785017449297672">ക്ലോക്കും സമയമേഖലാ ക്രമീകരണവും നിയന്ത്രിക്കുന്നു.</translation> <translation id="7336878834592315572">സെഷന്റെ ദൈർഘ്യത്തിനായി കുക്കികൾ നിലനിർത്തുക</translation> <translation id="7339315111520512972">ബ്രൗസർ പ്രോസസ്സിൽ റൺ ചെയ്യാനുള്ള നിർബന്ധിത നെറ്റ്വർക്കിംഗ് കോഡ്</translation>
diff --git a/components/policy/resources/policy_templates_mr.xtb b/components/policy/resources/policy_templates_mr.xtb index bbed82cc..29070416d 100644 --- a/components/policy/resources/policy_templates_mr.xtb +++ b/components/policy/resources/policy_templates_mr.xtb
@@ -131,15 +131,6 @@ धोरण असत्य वर सेट केले असल्यास, dev स्विचच्या स्थितीचा अहवाल दिला जाणार नाही.</translation> <translation id="1160479894929412407">QUIC प्रोटोकॉलला अनुमती द्या</translation> <translation id="1160939557934457296">सुरक्षित ब्राउझिंग चेतावणी पेजवरून पुढे जाणे अक्षम करा</translation> -<translation id="1171342272070128466">डॉक केलेले मॅग्निफायर अॅक्सेसिबिलिटी वैशिष्ट्ये सुरू करा. - - हे धोरण सत्य वर सेट केल्यास, डॉक केलेले मॅग्निफायर नेहमी सुरू राहील. - - हे धोरण असत्य वर सेट केले असल्यास, डॉक केलेल मॅग्निफायर नेहमी बंद राहील. - - तुम्ही हे धोरण सेट केल्यास, वापरकर्त्यांना ते बदलता किंवा ओव्हरराइड करता येणार नाही. - - हे धोरण सेट न करता सोडल्यास, डॉक केलेल मॅग्निफायर सुरुवातीला बंद राहील पण वापरकर्ता ते केव्हाही सुरू करू शकतो.</translation> <translation id="1189817621108632689">तुम्हाला इमेज दाखवण्याची अनुमती नसलेल्या साइट नमूद करणाऱ्या url पॅटर्नची सूची सेट करू देते. हे धोरण सेट न केलेले ठेवल्यास, 'DefaultImagesSetting' धोरण सेट केलेले असल्यास त्यावरून किंवा वापरकर्त्याच्या वैयक्तिक कॉन्फिगरेशवरून सर्व साइटसाठी ग्लोबल डीफॉल्ट मूल्य वापरले जाईल. @@ -1543,11 +1534,6 @@ <translation id="3851039766298741586">अॅप्लिकेशन आयडी आणि आवृत्ती यासारख्या सक्रिय कियॉस्क सेशनविषयी माहितीची तक्रार करा. धोरण असत्य वर सेट केल्यास, कियॉस्क सेशन माहितीचा अहवाल दिला जाणार नाही. सत्य वर सेट केल्यास किंवा सेट न केलेले ठेवल्यास, कियॉस्क सेशन माहितीचा अहवाल दिला जाईल.</translation> -<translation id="3852924591079583104"> - हे धोरण, ArcSession वर सेट केल्यावर, Android सुरू झाल्यास वापरकर्त्याने साइन आउट केल्यावर डिव्हाइसला सक्तीने रीबूट करायला लावते. - नेहमीवर सेट केल्यावर, प्रत्येक वापरकर्त्याने साइन आउट केल्यावर ते डिव्हाइसला सक्तीने रीबूट करायला लावते. - सेट न केलेले ठेवल्यास, त्यावर कोणताही परिणाम होत नाही आणि वापरकर्त्याने साइन आउट केल्यावर सक्तीने रीबूट करायला लावत नाही. कधीही नाहीवर सेट केल्यास हेच लागू होते. - </translation> <translation id="3858658082795336534">डीफॉल्ट प्रिंटिंग डुप्लेक्स मोड</translation> <translation id="3859780406608282662"><ph name="PRODUCT_OS_NAME" /> मधील तफावत सीड आणण्यासाठी एक मापदंड जोडा. @@ -3396,7 +3382,6 @@ हे धोरण 'RemoveLRUIfDormant' वर सेट केल्यास, स्वयंचलित साफ करणे पुरेशी मोकळी जागा असेपर्यंत किमान-अलीकडे-लॉग इन केलेल्या क्रमाने कमीत कमी 3 महिन्यांमध्ये लॉग इन न केलेल्या वापरकर्त्यांना काढणे सुरु ठेवेल. हे धोरण सेट केलेले नसल्यास, स्वयंचलित साफ करणे डीफॉल्ट अंगभूत तंत्रकौशल्य वापरते. सध्या, हे 'RemoveLRUIfDormant' तंत्रकौशल्य आहे.</translation> -<translation id="7334274148831027933">डॉक केलेले भिंग सुरू करा</translation> <translation id="7336785017449297672">घड्याळ आणि टाइमझोन सेटिंग्ज नियंत्रित करते.</translation> <translation id="7336878834592315572">सेशनच्या कालावधीसाठी कुकीज ठेवा</translation> <translation id="7339315111520512972">नेटवर्किंग कोडला ब्राउझर प्रक्रियेत सक्तीने रन व्हायला लावा</translation>
diff --git a/components/policy/resources/policy_templates_ms.xtb b/components/policy/resources/policy_templates_ms.xtb index 319ab7a..d2c03de9 100644 --- a/components/policy/resources/policy_templates_ms.xtb +++ b/components/policy/resources/policy_templates_ms.xtb
@@ -143,15 +143,6 @@ Jika dasar tidak ditetapkan atau ditetapkan kepada tidak benar, keadaan suis pembangun tidak akan dilaporkan.</translation> <translation id="1160479894929412407">Benarkan protokol QUIC</translation> <translation id="1160939557934457296">Lumpuhkan tindakan dari halaman amaran Penyemakan Imbas Selamat</translation> -<translation id="1171342272070128466">Dayakan ciri kebolehaksesan penggadang yang didok. - - Jika dasar ini ditetapkan kepada benar, penggadang yang didok akan sentiasa didayakan. - - Jika dasar ini ditetapkan kepada palsu, penggadang yang didok akan sentiasa dilumpuhkan. - - Jika anda menetapkan dasar ini, pengguna tidak boleh menukar atau membatalkannya. - - Jika dasar ini dibiarkan tanpa ditetapkan, penggadang yang didok dilumpuhkan pada mulanya tetapi boleh didayakan oleh pengguna pada bila-bila masa.</translation> <translation id="1189817621108632689">Membolehkan anda menetapkan beberapa corak url yang menentukan tapak yang tidak dibenarkan memaparkan imej. Jika dasar ini dibiarkan tanpa ditetapkan, nilai lalai global akan digunakan untuk semua tapak sama ada daripada dasar 'DefaultImagesSetting' jika dasar ini ditetapkan atau konfigurasi peribadi pengguna jika sebaliknya. @@ -1577,11 +1568,6 @@ Jika dasar ini ditetapkan kepada palsu, maklumat sesi kios tidak akan dilaporkan. Jika ditetapkan kepada benar atau dibiarkan tanpa ditetapkan, maklumat sesi kios akan dilaporkan.</translation> -<translation id="3852924591079583104"> - Jika Android telah dimulakan, dasar ini akan memaksa peranti untuk but semula apabila pengguna log keluar jika dasar ditetapkan kepada ArcSession. - Apabila ditetapkan kepada Sentiasa, dasar ini memaksa peranti untuk but semula setiap kali pengguna log keluar. - Jika dibiarkan tidak ditetapkan, dasar ini tiada sebarang kesan dan but semula tidak akan dipaksa apabila pengguna log keluar. Begitu juga halnya jika ditetapkan kepada Jangan sekali-kali. - </translation> <translation id="3858658082795336534">Mod dupleks pencetakan lalai</translation> <translation id="3859780406608282662">Tambahkan parameter untuk pengambilan benih Variasi dalam <ph name="PRODUCT_OS_NAME" />. @@ -3469,7 +3455,6 @@ Jika dasar ini ditetapkan kepada 'RemoveLRUIfDormant', pembersihan automatik akan terus mengalih keluar pengguna yang tidak melog masuk selama sekurang-kurangnya 3 bulan dalam susunan paling lama tidak melog masuk sehingga terdapat ruang kosong mencukupi. Jika dasar ini tidak ditetapkan, pembersihan autimatik menggunakan strategi terbina dalam lalai. Pada masa ini, itu adalah strategi 'RemoveLRUIfDormant'.</translation> -<translation id="7334274148831027933">Dayakan penggadang yang didok</translation> <translation id="7336785017449297672">Mengawal tetapan jam dan zon waktu.</translation> <translation id="7336878834592315572">Simpan kuki sepanjang tempoh sesi</translation> <translation id="7339315111520512972">Paksa kod rangkaian dijalankan dalam proses penyemak imbas</translation>
diff --git a/components/policy/resources/policy_templates_nl.xtb b/components/policy/resources/policy_templates_nl.xtb index 445f097f..ff4dae54 100644 --- a/components/policy/resources/policy_templates_nl.xtb +++ b/components/policy/resources/policy_templates_nl.xtb
@@ -143,15 +143,6 @@ Als het beleid is ingesteld op 'false', wordt de status van de schakelaar voor de ontwikkelaarsmodus niet gemeld.</translation> <translation id="1160479894929412407">QUIC-protocol toestaan</translation> <translation id="1160939557934457296">Doorgaan vanaf de waarschuwingspagina van Safe Browsing uitschakelen</translation> -<translation id="1171342272070128466">Schakel de toegankelijkheidsfunctie 'Gedockt vergrootglas' in. - - Als dit beleid is ingesteld op True, wordt het gedockte vergrootglas altijd ingeschakeld. - - Als dit beleid is ingesteld op False, wordt het gedockte vergrootglas altijd uitgeschakeld. - - Als je dit beleid instelt, kunnen gebruikers dit niet wijzigen of negeren. - - Als dit beleid niet wordt ingesteld, is het gedockte vergrootglas in eerste instantie uitgeschakeld, maar kan de gebruiker dit op elk gewenst moment inschakelen.</translation> <translation id="1189817621108632689">Hiermee kun je een lijst met URL's opgeven voor sites die afbeeldingen mogen weergeven. Als dit beleid niet wordt ingesteld, wordt de algemene standaardwaarde gebruikt voor alle sites, op basis van het beleid DefaultImagesSetting (als dit is ingesteld) of anders op basis van de configuratie van de gebruiker. @@ -1575,11 +1566,6 @@ Als het beleid is ingesteld op 'False', worden er geen sessiegegevens gerapporteerd. Als het beleid is ingesteld op 'True' of als er geen beleid is ingesteld, worden de kiosksessiegegevens gerapporteerd.</translation> -<translation id="3852924591079583104"> - Wanneer dit beleid is ingesteld op 'ArcSession', wordt het apparaat gedwongen opnieuw opgestart na het uitloggen van een gebruiker als Android is gestart. - Wanneer dit beleid is ingesteld op 'Altijd', wordt het apparaat elke keer na het uitloggen van een gebruiker gedwongen opnieuw opgestart. - Als dit beleid niet wordt ingesteld, heeft het geen effect en wordt opnieuw opstarten na het uitloggen van een gebruiker niet afgedwongen. Hetzelfde is van toepassing als het beleid is ingesteld op 'Nooit'. - </translation> <translation id="3858658082795336534">Standaard afdrukken in duplexmodus</translation> <translation id="3859780406608282662">Voeg een parameter toe aan het ophalen van de varianten-seed in <ph name="PRODUCT_OS_NAME" />. @@ -3440,7 +3426,6 @@ Als dit beleid is ingesteld op 'RemoveLRUIfDormant', blijft de automatische opschoonfunctie gebruikers verwijderen die ten minste drie maanden niet zijn ingelogd (waarbij gegevens van gebruikers die het minst recentelijk hebben ingelogd het eerste worden verwijderd) totdat er voldoende schijfruimte is. Als dit beleid niet wordt ingesteld, gebruikt de automatische opschoonfunctie de standaard ingebouwde strategie. Momenteel is dit de strategie'RemoveLRUIfDormant'.</translation> -<translation id="7334274148831027933">Gedockt vergrootglas inschakelen</translation> <translation id="7336785017449297672">Beheert instellingen voor de klok en tijdzone.</translation> <translation id="7336878834592315572">Cookies bewaren voor de duur van de sessie</translation> <translation id="7339315111520512972">Afdwingen dat netwerkcode wordt uitgevoerd in het browserproces</translation>
diff --git a/components/policy/resources/policy_templates_no.xtb b/components/policy/resources/policy_templates_no.xtb index b9872fd..ff887c1b 100644 --- a/components/policy/resources/policy_templates_no.xtb +++ b/components/policy/resources/policy_templates_no.xtb
@@ -130,15 +130,6 @@ Hvis innstillingen angis som «true», rapporteres ikke tilstanden til utviklerbryteren.</translation> <translation id="1160479894929412407">Tillat QUIC-protokollen</translation> <translation id="1160939557934457296">Deaktiver muligheten til å overse Safe Browsing-advarsler og fortsette til potensielt farlig nettsted</translation> -<translation id="1171342272070128466">Slå på tilgjengelighetsfunksjonen for dokket forstørrelse. - - Hvis denne regelen er satt til «true» (sann), er dokket forstørrelse alltid slått på. - - Hvis denne regelen er satt til «false» (usann), er dokket forstørrelse alltid slått av. - - Hvis du angir denne regelen, kan ikke brukerne endre eller overstyre den. - - Hvis denne regelen ikke angis, er dokket forstørrelse i utgangspunktet slått av, men brukerne kan når som helst slå funksjonen på.</translation> <translation id="1189817621108632689">Lar deg angi en liste over nettadressemønstre som spesifiserer nettsteder som ikke får vise bilder. Hvis denne regelen ikke angis, brukes den globale standardverdien for alle nettsteder, enten fra DefaultImagesSetting-regelen hvis den er angitt, eller fra brukerens egen konfigurasjon hvis ikke. @@ -1119,6 +1110,15 @@ Når denne regelen ikke er angitt, påvirkes ikke funksjonaliteten til de mer spesifikke reglene.</translation> <translation id="2987155890997901449">Slå på ARC</translation> <translation id="2987227569419001736">Kontrollér bruken av Web Bluetooth API</translation> +<translation id="2990018289267778247">Hvis denne regelen er satt til «true» (sann), vises alltid tilgjengelighetsalternativer i systemfeltmenyen. + + Hvis denne regelen er satt til «false» (usann), vises aldri tilgjengelighetsalternativer i systemfeltmenyen. + + Hvis du angir denne regelen, kan ikke brukerne endre eller overstyre den. + + Hvis denne regelen ikke er angitt, vises ikke tilgjengelighetsalternativer i systemfeltmenyen. Brukerne kan likevel få tilgjengelighetsalternativer til å vises via innstillingssiden. + + Når tilgjengelighetsfunksjoner er slått på (på andre måter, f.eks. via tastekombinasjoner), vises alltid tilgjengelighetsalternativer i systemfeltmenyen.</translation> <translation id="3011301228198307065">Konfigurerer nettadressen for startsiden som brukes som standard i <ph name="PRODUCT_NAME" />, og forhindrer at brukerne kan endre den. Startsiden er siden som åpnes med hjemknappen. Hvilke sider som åpnes ved oppstart, kontrolleres av RestoreOnStartup-reglene. @@ -1432,6 +1432,7 @@ Denne regelen brukes ved registrering av retningslinjer for nettskyer med maskinomfang på datamaskiner. Den kan angis via registeret eller GPO i Windows, plist på Mac og en JSON-regelfil i Linux.</translation> <translation id="3660562134618097814">Overfør SAML IdP-informasjonskapsler ved pålogging</translation> <translation id="3701121231485832347">Kontrollerer innstillinger som er spesifikke for <ph name="PRODUCT_OS_NAME" />-enheter som administreres av <ph name="MS_AD_NAME" />.</translation> +<translation id="3702518095257671450">Ekstern attestering</translation> <translation id="3702647575225525306"><ph name="POLICY_NAME" /> (Feltet med én linje er avviklet og det fjernes i nær fremtid. Begynn å bruke tekstfeltet med flere linjer nedenfor.)</translation> <translation id="3709266154059827597">Konfigurer installasjonssperrelisten for utvidelser</translation> <translation id="3711895659073496551">Suspender</translation> @@ -1542,11 +1543,6 @@ Hvis regelen settes til false (usann), rapporteres ikke informasjonen om kioskøkten. Hvis den settes til true (sann) eller ikke angis, rapporteres informasjonen om kioskøkten.</translation> -<translation id="3852924591079583104"> - Hvis denne regelen er satt til ArcSession og Android har startet, tvinges enheten til å starte på nytt når brukeren logger av. - Når regelen er satt til «Always» (Alltid), tvinges enheten til å starte på nytt hver gang brukeren logger av. - Hvis den ikke er angitt, har den ingen virkning, og enheten tvinges ikke til å starte på nytt når brukeren logger av. Det samme gjelder hvis den er satt til «Never» (Aldri). - </translation> <translation id="3858658082795336534">Utskrift på begge sider som standard</translation> <translation id="3859780406608282662">Legg til en parameter i hentingen av Variasjoner-utgangsverdien i <ph name="PRODUCT_OS_NAME" />. @@ -1833,6 +1829,15 @@ Denne innstillingen brukes bare hvis «DefaultSearchProviderEnabled»-innstillingen er aktivert.</translation> <translation id="4285674129118156176">Tillat at brukere uten tilknytning bruker ARC</translation> +<translation id="4289903996435140853">Lar deg angi en liste over nettadresser som spesifiserer nettsteder som automatisk får tilgang til USB-enheter fra gjeldende leverandører og produkt-ID-er. Hvert element på listen må inneholde både enhetene og nettadressene for at regelen skal gjelde. Hvert element i enheter kan inneholde felt for leverandør-ID og produkt-ID. Eventuelle ID-er som ikke føres opp på listen, behandles som jokertegn, med ett unntak: Du kan ikke angi en produkt-ID uten å angi en leverandør-ID. Hvis ikke er regelen ugyldig og den blir ignorert. + + USB-tillatelsesmodellen bruker nettadressen forespørselen kommer fra («forespørsel-nettadressen»), og nettadressen med den innebygde iframe-koden («nettadressen med innebygging») for å gi nettadressen forespørselen kommer fra, tilgang til USB-enheten. Forespørsel-nettadressen kan være forskjellig fra nettadressen med innebygging når nettstedet forespørselen kommer fra, ligger i en iframe. Derfor kan feltet «urls» (nettadresser) inneholde opptil to nettadressestrenger atskilt med komma for å spesifisere henholdsvis forespørsel-nettadressen og nettadressen med innebygging. Hvis kun én nettadresse er spesifisert, gis tilgang til de samsvarende USB-enhetene når forespørsel-nettadressen samsvarer med denne nettadressen, uavhengig av innebyggingsstatus. Nettadressene i «urls» (nettadresser) må være gyldige, ellers blir regelen ignorert. + + Hvis denne regelen ikke er angitt, brukes den globale standardverdien for alle nettsteder fra «DefaultWebUsbGuardSetting»-regelen hvis den er angitt, eller brukerens personlige konfigurasjon hvis den ikke er angitt. + + Nettadressemønstre i denne regelen må ikke kollidere med de som er konfigurert via WebUsbBlockedForUrls. Hvis de kolliderer, har denne regelen prioritet over WebUsbBlockedForUrls og WebUsbAskForUrls. + +Verdiene for denne regelen og WebUsbAllowDevicesForUrls-regelen slås sammen.</translation> <translation id="4298509794364745131">Angir en liste over apper som kan aktiveres som notatapper på låseskjermen for <ph name="PRODUCT_OS_NAME" />. Hvis den foretrukne notatappen er aktivert på låseskjermen, inneholder låseskjermen et UI-element for å starte den aktuelle appen. @@ -1984,6 +1989,7 @@ <translation id="4639407427807680016">Navnene på de innebygde meldingsvertene som skal unntas fra svartelisten.</translation> <translation id="4650759511838826572">Deaktiver protokollsystemer for nettadresse</translation> <translation id="465099050592230505">Nettadresse for bedriftens nettbutikk (avviklet)</translation> +<translation id="4661889655253181651">Innholdsinnstillinger lar deg angi hvordan innholdet for spesifikke elementer (f.eks. informasjonskapsler, bilder eller JavaScript) skal håndteres.</translation> <translation id="4665897631924472251">Innstillinger for administrasjon av utvidelser</translation> <translation id="4668325077104657568">Standardinnstilling for bilder</translation> <translation id="4670865688564083639">Minimum:</translation> @@ -2028,6 +2034,11 @@ Forslagene hentes fra Googles tjenere. Hvis innstillingen er angitt som usann, verken hentes eller vises forslag.</translation> +<translation id="4759650396863318477">Med denne regelen kan du angi tidsperioden (i millisekunder) der brukerne skal varsles om at <ph name="PRODUCT_NAME" /> eller en <ph name="PRODUCT_OS_NAME" />-enhet må startes på nytt for å ta i bruk en ventende oppdatering. + + I denne tidsperioden blir brukerne gjentatte ganger informert om behovet for oppdatering. På <ph name="PRODUCT_OS_NAME" />-enheter vises et varsel om omstart i systemfeltet i samsvar med <ph name="RELAUNCH_HEADS_UP_PERIOD_POLICY_NAME" />-regelen. I <ph name="PRODUCT_NAME" />-nettlesere endres appmenyen for å indikere at det er nødvendig med en omstart, når en tredjedel av varselperioden er gått. Varselet endrer farge når to tredjedeler av varselperioden er gått, og en gang til når hele varselperioden er omme. Tilleggsvarslene som slås på av <ph name="RELAUNCH_NOTIFICATION_POLICY_NAME" />-regelen, følger den samme tidsplanen. + + Hvis regelen ikke er angitt, brukes standardperioden på 345 600 000 millisekunder (fire dager) for <ph name="PRODUCT_OS_NAME" />-enheter og 604 800 000 millisekunder (én uke) for <ph name="PRODUCT_NAME" />.</translation> <translation id="4788252609789586009">Slår på autofyllfunksjonen i <ph name="PRODUCT_NAME" /> og gjør det mulig for brukere å fylle ut informasjon om kredittkort i nettskjemaer automatisk ved å bruke tidligere lagret informasjon. @@ -2229,6 +2240,15 @@ Hvis denne retningslinjen ikke angis, brukes den globale standardverdien for alle nettsteder, enten fra retningslinjen DefaultNotificationsSetting hvis den er angitt, eller fra brukerens egen konfigurasjon hvis den nevnte retningslinjen ikke er angitt.</translation> <translation id="5213038356678567351">Nettsteder som aldri skal utløse bytte av nettleser.</translation> <translation id="5219844027738217407">For Android-apper har denne regelen bare innvirkning på mikrofonen. Når denne regelen er angitt som «true» (sann), slås mikrofonen av for alle Android-apper – uten unntak.</translation> +<translation id="5221394278852982313">Lar deg angi en liste over nettadresser som spesifiserer nettsteder som automatisk får tilgang til USB-enheter fra gjeldende leverandører og produkt-ID-er. Hvert element på listen må inneholde både enhetene og nettadressene for at regelen skal gjelde. Hvert element i enheter kan inneholde felt for leverandør-ID og produkt-ID. Eventuelle ID-er som ikke føres opp på listen, behandles som jokertegn, med ett unntak: Du kan ikke angi en produkt-ID uten å angi en leverandør-ID. Hvis ikke er regelen ugyldig og den blir ignorert. + + USB-tillatelsesmodellen bruker nettadressen forespørselen kommer fra («forespørsel-nettadressen»), og nettadressen med den innebygde iframe-koden («nettadressen med innebygging») for å gi nettadressen forespørselen kommer fra, tilgang til USB-enheten. Forespørsel-nettadressen kan være forskjellig fra nettadressen med innebygging når nettstedet forespørselen kommer fra, ligger i en iframe. Derfor kan feltet «urls» (nettadresser) inneholde opptil to nettadressestrenger atskilt med komma for å spesifisere henholdsvis forespørsel-nettadressen og nettadressen med innebygging. Hvis kun én nettadresse er spesifisert, gis tilgang til de samsvarende USB-enhetene når forespørsel-nettadressen samsvarer med denne nettadressen, uavhengig av innebyggingsstatus. Nettadressene i «urls» (nettadresser) må være gyldige, ellers blir regelen ignorert. + + Hvis denne regelen ikke er angitt, brukes den globale standardverdien for alle nettsteder fra «DefaultWebUsbGuardSetting»-regelen hvis den er angitt, eller brukerens personlige konfigurasjon hvis den ikke er angitt. + + Nettadressemønstre i denne regelen må ikke kollidere med de som er konfigurert via WebUsbBlockedForUrls. Hvis de kolliderer, har denne regelen prioritet over WebUsbBlockedForUrls og WebUsbAskForUrls. + +Verdiene for denne regelen og DeviceWebUsbAllowDevicesForUrls-regelen slås sammen.</translation> <translation id="5228316810085661003">Forsinkelsen for automatisk pålogging for den lokale kontoen på enheten. Hvis regelen |DeviceLocalAccountAutoLoginId| ikke er angitt, har ikke denne regelen noen virkning. Ellers: @@ -2967,6 +2987,20 @@ Hvis denne regelen er satt til «Ikke la brukerne administrere sertifikater», kan brukerne bare se sertifikater. De kan ikke administrere dem.</translation> <translation id="6573305661369899995">Angi en ekstern kilde for nettadressebegrensninger</translation> +<translation id="6583851521569686409">Konfigurerer en liste over skrivere. + + Med denne regelen kan administratorer levere skriveroppsett til brukerne sine. + + <ph name="PRINTER_DISPLAY_NAME" /> og <ph name="PRINTER_DESCRIPTION" /> er strenger som kan tilpasses fritt for å gjøre det lett å velge skriver. Formålet med <ph name="PRINTER_MANUFACTURER" /> og <ph name="PRINTER_MODEL" /> er å gjøre det lett for brukere å identifisere skriverne. Strengene representerer skriverprodusenten og -modellen. <ph name="PRINTER_URI" /> skal være en adresse som klientdatamaskiner kan nå, inkludert <ph name="URI_SCHEME" />, <ph name="URI_PORT" /> og <ph name="URI_QUEUE" />. <ph name="PRINTER_UUID" /> er valgfritt. Hvis den angis, kan den bidra til å deduplisere <ph name="ZEROCONF_DISCOVERY" />-skrivere. + + Enten må <ph name="PRINTER_EFFECTIVE_MODEL" /> inneholde navnet på skriveren, eller så må <ph name="PRINTER_AUTOCONF" /> være satt til «true» (sann). Skrivere med begge eller uten noen av egenskapene ignoreres. + + Skriveroppsettet fullføres første gang en skriver tas i bruk. PPD-er lastes ikke ned før skriveren tas i bruk. Deretter blir mye brukte PPD-er bufret. + + Denne regelen har ingen innvirkning på om brukere kan konfigurere skrivere på enhetene sine. Den er ment å supplere skriveroppsettene til individuelle brukere. + + For enheter som administreres via Active Directory, har denne regelen støtte for å utvide <ph name="MACHINE_NAME_VARIABLE" /> til Active Directory-maskinnavnet eller en delstreng av dette. Hvis maskinnavnet for eksempel er <ph name="MACHINE_NAME_EXAMPLE" />, erstattes <ph name="MACHINE_NAME_VARIABLE_EXAMPLE" /> med de fire tegnene som kommer etter den sjette posisjonen, dvs. <ph name="MACHINE_NAME_PART_EXAMPLE" />. Legg merke til at posisjonen er nullbasert. + </translation> <translation id="6598235178374410284">Brukerbilde</translation> <translation id="6603004149426829878">Send alltid eventuelle tilgjengelige posisjonssignaler til tjeneren mens tidssonen påvises</translation> <translation id="6628120204569232711">Rapportér lagringsstatus</translation> @@ -3410,7 +3444,6 @@ Hvis denne innstillingen angis som «RemoveLRUIfDormant», fortsetter den automatiske oppryddingen å fjerne brukere som ikke har logget på de siste tre månedene (gamle pålogginger først) til det er nok ledig plass. Hvis denne innstillingen ikke angis, tar automatisk opprydding i bruk den innebygde standardstrategien. For øyeblikket er det «RemoveLRUIfDormant»-strategien.</translation> -<translation id="7334274148831027933">Aktivér den dokkede lupen</translation> <translation id="7336785017449297672">Kontrollerer innstillinger for klokke og tidssone.</translation> <translation id="7336878834592315572">Behold informasjonskapsler så lenge økten varer</translation> <translation id="7339315111520512972">Tving nettverkskode til å kjøre i nettleserprosessen</translation> @@ -4293,6 +4326,8 @@ <translation id="915194831143859291">Hvis denne regelen settes til usann eller ikke konfigureres, kan brukerne slå av enhetene sine i <ph name="PRODUCT_OS_NAME" />. Hvis denne regelen settes til sann, gjør <ph name="PRODUCT_OS_NAME" /> at enhetene starter på nytt når brukerne slår dem av. Alle «slå av»-knappene i <ph name="PRODUCT_OS_NAME" />-brukergrensesnittet blir byttet ut med «start på nytt»-knapper. Hvis brukerne slår av enhetene med den fysiske av/på-knappen, starter de ikke på nytt – selv om regelen er slått på.</translation> <translation id="9152473318295429890">Aktiver kontekstavhengige forslag for lignende nettsider</translation> +<translation id="9153446010242995516">Rull tilbake til og behold målversjonen hvis OS-versjonen er nyere enn målet. Prøv å overføre konfigurering på enhetsnivå (inkludert nettverkslegitimasjon) gjennom rollback-prosessen, hvis mulig, men gjennomfør rollback med full powerwash selv om gjenoppretting av data ikke er mulig (fordi målversjonen ikke støtter gjenoppretting av data, eller på grunn av en bakover-inkompatibel endring). + Støttes på <ph name="PRODUCT_OS_NAME" /> versjon 75 og nyere. For eldre klienter betyr denne verdien at rollback er deaktivert.</translation> <translation id="9158929520101169054">Tillat multipålogging i nettleseren</translation> <translation id="9159126470527871268">Varsle brukere om at <ph name="PRODUCT_NAME" /> eller <ph name="PRODUCT_OS_NAME" /> må startes på nytt på grunn av en ventende oppdatering.
diff --git a/components/policy/resources/policy_templates_pl.xtb b/components/policy/resources/policy_templates_pl.xtb index 5dcf85a..b6c2a77 100644 --- a/components/policy/resources/policy_templates_pl.xtb +++ b/components/policy/resources/policy_templates_pl.xtb
@@ -140,15 +140,6 @@ Jeśli ta zasada ma wartość Fałsz, stan przełącznika trybu dewelopera nie jest zgłaszany.</translation> <translation id="1160479894929412407">Zezwalaj na protokół QUIC</translation> <translation id="1160939557934457296">Wyłącz możliwość kontynuacji na stronie ostrzeżenia Bezpiecznego przeglądania</translation> -<translation id="1171342272070128466">Włącz funkcję lupy zadokowanej. - - Jeśli zasada ma wartość Prawda, lupa zadokowana będzie zawsze włączona. - - Jeśli zasada ma wartość Fałsz, lupa zadokowana będzie zawsze wyłączona. - - Jeśli skonfigurujesz tę zasadę, użytkownicy nie będą mogli jej zmienić ani zastąpić. - - Jeśli nie skonfigurujesz tej zasady, lupa zadokowana jest początkowo wyłączona, ale użytkownik może ją w każdej chwili włączyć.</translation> <translation id="1189817621108632689">Pozwala na ustawienie listy wzorców adresów URL określających witryny, którym nie wolno wyświetlać obrazów. Jeśli ta zasada nie zostanie skonfigurowana, dla wszystkich witryn będzie używana globalna wartość domyślna pochodząca z zasady „DefaultImagesSettings” (jeśli została skonfigurowana) lub z osobistej konfiguracji użytkownika. @@ -1116,6 +1107,15 @@ Gdy ta zasada nie jest skonfigurowana, nie ma wpływu na bardziej szczegółowe zasady.</translation> <translation id="2987155890997901449">Włączenie ARC</translation> <translation id="2987227569419001736">Kontrolowanie użycia interfejsu API Web Bluetooth</translation> +<translation id="2990018289267778247">Jeśli ta zasada ma wartość Prawda, opcje ułatwień dostępu są zawsze wyświetlane w menu w obszarze powiadomień. + + Jeśli ma wartość Fałsz, opcje ułatwień dostępu nie są wyświetlane w menu w obszarze powiadomień. + + Jeśli skonfigurujesz tę zasadę, użytkownicy nie będą mogli jej zmienić ani zastąpić. + + Jeśli pozostanie ona nieskonfigurowana, opcje ułatwień dostępu nie będą wyświetlane w menu w obszarze powiadomień, ale użytkownik będzie mógł włączyć ich wyświetlanie na stronie Ustawienia. + + Gdy funkcje ułatwień dostępu zostaną włączone (innym sposobem, np. skrótem klawiszowym), opcje ułatwień dostępu będą zawsze wyświetlane w menu w obszarze powiadomień.</translation> <translation id="3011301228198307065">Służy do konfigurowania adresu URL domyślnej strony głównej w <ph name="PRODUCT_NAME" /> i blokuje użytkownikom możliwość jego zmiany. Strona główna otwiera się po kliknięciu przycisku strony głównej. Listę stron otwieranych po uruchomieniu określają zasady RestoreOnStartup. @@ -1429,6 +1429,7 @@ Ta zasada jest używana przez rejestrację zasad chmurowych obejmującą cały komputer na komputerach osobistych. Można ją skonfigurować przy użyciu Rejestru lub obiektu zasad grupy (GPO) w systemie Windows, plist na Macu i pliku zasad JSON na Linuksie.</translation> <translation id="3660562134618097814">Prześlij pliki cookie dostawcy tożsamości SAML podczas logowania</translation> <translation id="3701121231485832347">Kontroluje ustawienia urządzeń z systemem <ph name="PRODUCT_OS_NAME" />, którymi zarządza <ph name="MS_AD_NAME" />.</translation> +<translation id="3702518095257671450">Zdalny atest</translation> <translation id="3702647575225525306"><ph name="POLICY_NAME" /> (Pole z jednym wierszem jest nieużywane i zostanie usunięte. Zacznij używać wielowierszowego pola tekstowego poniżej).</translation> <translation id="3709266154059827597">Konfiguruj czarną listę instalacji rozszerzeń</translation> <translation id="3711895659073496551">Wstrzymaj</translation> @@ -1536,11 +1537,6 @@ <translation id="3851039766298741586">Przesyłaj informacje o aktywnej sesji publicznej, np. identyfikator i wersję aplikacji. Jeśli ta zasada jest wyłączona, informacje o sesji nie będą przesyłane. Jeśli zasada jest włączona lub nieustawiona, informacje o sesji będą przesyłane.</translation> -<translation id="3852924591079583104"> - Gdy ta zasada jest ustawiona na ArcSession i uruchomiono Androida, po wylogowaniu użytkownika wymuszane jest ponowne uruchomienie urządzenia. - Gdy jest ustawiona na opcję Zawsze, ponowne uruchomienie urządzenia jest wymuszane po każdym wylogowaniu użytkownika. - Jeśli zasada jest nieskonfigurowana, nie ma żadnego efektu i po wylogowaniu użytkownika nie jest wymuszane ponowne uruchomienie urządzenia. Tak samo jest, gdy zasada jest ustawiona na opcję Nigdy. - </translation> <translation id="3858658082795336534">Domyślny tryb drukowania dwustronnego</translation> <translation id="3859780406608282662">Dodaj parametr do pobierania odmian referencyjnych w <ph name="PRODUCT_OS_NAME" />. @@ -1818,6 +1814,15 @@ Ta zasada jest uwzględniana tyko wtedy, gdy włączona jest zasada „DefaultSearchProviderEnabled”.</translation> <translation id="4285674129118156176">Zezwalaj użytkownikom z innych domen na używanie ARC</translation> +<translation id="4289903996435140853">Umożliwia ustawienie listy adresów URL określającej witryny, które mają automatycznie uzyskiwać dostęp do urządzeń USB o podanych identyfikatorach producenta i produktu. Aby zasada była poprawna, każda pozycja na liście musi zawierać zarówno urządzenia, jak i adresy URL. Każda definicja urządzenia może zawierać pole identyfikatora producenta i identyfikatora produktu. Każde pominięcie identyfikatora jest traktowane jako symbol wieloznaczny, ale nie można podać identyfikatora produktu bez podania identyfikatora producenta. W przeciwnym razie zasada będzie niepoprawna i będzie ignorowana. + + W modelu przyznawania dostępu do urządzeń USB rozróżniamy adres URL witryny wysyłającej żądanie („URL źródła żądania”) oraz URL witryny ramki najwyższego poziomu („URL miejsca osadzenia”). URL źródła żądania może być inny niż URL miejsca osadzenia, gdy witryna wysyłająca żądanie jest ładowana w elemencie iframe. Dlatego pole „adresy URL” może zawierać maksymalnie dwa adresy URL oddzielone przecinkiem – pierwszy to URL źródła żądania, a drugi to URL miejsca osadzenia. Jeśli podany jest tylko jeden URL, witryna o tym adresie uzyska dostęp do wskazanych urządzeń USB niezależnie od osadzenia. W polu „adresy URL” muszą znajdować się poprawne adresy URL – w przeciwnym razie zasada będzie ignorowana. + + Jeśli zasada pozostanie nieskonfigurowana, dla wszystkich witryn będzie stosowana globalna wartość domyślna pochodząca z zasady „DefaultWebUsbGuardSetting”, o ile ta jest skonfigurowana, a w przeciwnym razie z osobistej konfiguracji użytkownika. + + Wzorce adresów URL w tej zasadzie nie powinny być w konflikcie z wzorcami w zasadzie WebUsbBlockedForUrls. W przypadku konfliktu ta zasada ma pierwszeństwo nad WebUsbBlockedForUrls i WebUsbAskForUrls. + + Wartości tej zasady oraz zasady WebUsbAllowDevicesForUrls są scalone.</translation> <translation id="4298509794364745131">Określa listę aplikacji, które mogą być włączone jako aplikacje do notatek na ekranie blokady w: <ph name="PRODUCT_OS_NAME" />. Jeśli preferowana aplikacja do robienia notatek jest włączona na ekranie blokady, będą na nim dostępne elementy interfejsu umożliwiające uruchomienie tej aplikacji. @@ -1969,6 +1974,7 @@ <translation id="4639407427807680016">Nazwy hostów wiadomości natywnych do usunięcia z czarnej listy</translation> <translation id="4650759511838826572">Wyłącz schematy protokołów adresów URL</translation> <translation id="465099050592230505">URL firmowego sklepu internetowego (wycofana)</translation> +<translation id="4661889655253181651">Ustawienia treści umożliwiają określenie sposobu obsługi treści danego typu (na przykład plików cookie, grafik czy kodu JavaScript).</translation> <translation id="4665897631924472251">Ustawienia zarządzania rozszerzeniami</translation> <translation id="4668325077104657568">Domyślne ustawienie grafik</translation> <translation id="4670865688564083639">Minimalnie:</translation> @@ -2009,6 +2015,11 @@ Takie propozycje są pobierane zdalnie z serwerów Google. Jeśli to ustawienie ma wartość fałsz, propozycje nie będą pobierane ani wyświetlane.</translation> +<translation id="4759650396863318477">Umożliwia określenie czasu (w milisekundach), przez który użytkownicy będą powiadamiani o konieczności ponownego uruchomienia <ph name="PRODUCT_NAME" /> lub urządzenia z <ph name="PRODUCT_OS_NAME" /> w celu zainstalowania oczekującej aktualizacji. + + Przez ten czas użytkownik będzie wciąż informowany o konieczności aktualizacji. Na urządzeniach z <ph name="PRODUCT_OS_NAME" /> powiadomienie o konieczności ponownego uruchomienia będzie wyświetlane w obszarze powiadomień zgodnie z zasadą <ph name="RELAUNCH_HEADS_UP_PERIOD_POLICY_NAME" />. W przeglądarkach <ph name="PRODUCT_NAME" /> po upływie jednej trzeciej okresu powiadamiania zmieni się menu aplikacji. Powiadomienie zmieni kolor po upływie dwóch trzecich okresu powiadamiania i ponownie po upływie całego tego okresu. Dodatkowe powiadomienia, które włącza zasada <ph name="RELAUNCH_NOTIFICATION_POLICY_NAME" />, mają ten sam harmonogram. + + Jeśli zasada nie jest skonfigurowana, na urządzeniach z <ph name="PRODUCT_OS_NAME" /> stosowany jest domyślny czas 345 600 000 milisekund (cztery dni), a w <ph name="PRODUCT_NAME" /> – 604 800 000 milisekund (tydzień).</translation> <translation id="4788252609789586009">Włącza funkcję autouzupełniania w <ph name="PRODUCT_NAME" />, umożliwiając użytkownikom automatyczne wprowadzanie wcześniej zapisanych danych karty kredytowej w formularzach na stronach internetowych. Jeśli to ustawienie jest wyłączone, autouzupełnianie nie będzie podpowiadać ani wypełniać danych karty kredytowej, nie będzie też zapisywać dodatkowych danych karty kredytowej, które użytkownik może podawać na stronach internetowych. @@ -2200,6 +2211,15 @@ <translation id="5208240613060747912">Umożliwia skonfigurowanie listy wzorcowych URL-i określających witryny, w których nie mogą być wyświetlane powiadomienia. Jeśli ta zasada nie zostanie skonfigurowana, dla wszystkich witryn będzie używana globalna wartość domyślna pochodząca z zasady „DefaultNotificationsSetting” (jeśli została skonfigurowana) lub z osobistej konfiguracji użytkownika.</translation> <translation id="5213038356678567351">Witryny, które nigdy nie będą powodować zmiany przeglądarki.</translation> <translation id="5219844027738217407">W przypadku aplikacji na Androida ta zasada wpływa tylko na mikrofon. Gdy jest ona włączona, mikrofon jest wyłączony dla wszystkich aplikacji na Androida bez żadnych wyjątków.</translation> +<translation id="5221394278852982313">Umożliwia ustawienie listy adresów URL określającej witryny, które mają automatycznie uzyskiwać dostęp do urządzeń USB o podanych identyfikatorach producenta i produktu. Aby zasada była poprawna, każda pozycja na liście musi zawierać zarówno urządzenia, jak i adresy URL. Każda definicja urządzenia może zawierać pole identyfikatora producenta i identyfikatora produktu. Każde pominięcie identyfikatora jest traktowane jako symbol wieloznaczny, ale nie można podać identyfikatora produktu bez podania identyfikatora producenta. W przeciwnym razie zasada będzie niepoprawna i będzie ignorowana. + + W modelu przyznawania dostępu do urządzeń USB rozróżniamy adres URL witryny wysyłającej żądanie („URL źródła żądania”) oraz URL witryny ramki najwyższego poziomu („URL miejsca osadzenia”). URL źródła żądania może być inny niż URL miejsca osadzenia, gdy witryna wysyłająca żądanie jest ładowana w elemencie iframe. Dlatego pole „adresy URL” może zawierać maksymalnie dwa adresy URL oddzielone przecinkiem – pierwszy to URL źródła żądania, a drugi to URL miejsca osadzenia. Jeśli podany jest tylko jeden URL, witryna o tym adresie uzyska dostęp do wskazanych urządzeń USB niezależnie od osadzenia. W polu „adresy URL” muszą znajdować się poprawne adresy URL – w przeciwnym razie zasada będzie ignorowana. + + Jeśli zasada pozostanie nieskonfigurowana, dla wszystkich witryn będzie stosowana globalna wartość domyślna pochodząca z zasady „DefaultWebUsbGuardSetting”, o ile ta jest skonfigurowana, a w przeciwnym razie z osobistej konfiguracji użytkownika. + + Wzorce adresów URL w tej zasadzie nie powinny być w konflikcie z wzorcami w zasadzie WebUsbBlockedForUrls. W przypadku konfliktu ta zasada ma pierwszeństwo nad WebUsbBlockedForUrls i WebUsbAskForUrls. + + Wartości tej zasady oraz zasady DeviceWebUsbAllowDevicesForUrls są scalone.</translation> <translation id="5228316810085661003">Opóźnienie automatycznego logowania na lokalne konto na urządzeniu. Jeśli zasada |DeviceLocalAccountAutoLoginId| jest nieskonfigurowana, ta zasada nie ma żadnych skutków. W przeciwnym razie: @@ -2921,6 +2941,20 @@ Jeśli ta zasada ma wartość „Nie zezwalaj użytkownikom na zarządzanie certyfikatami”, użytkownicy nie mogą zarządzać certyfikatami, a jedynie je wyświetlać.</translation> <translation id="6573305661369899995">Pozwala na ustawianie zewnętrznego źródła ograniczeń URL</translation> +<translation id="6583851521569686409">Konfiguruje listę drukarek. + + Ta zasada umożliwia administratorom przekazanie konfiguracji drukarek użytkownikom. + + <ph name="PRINTER_DISPLAY_NAME" /> i <ph name="PRINTER_DESCRIPTION" /> to dowolny tekst, który ma ułatwić wybranie drukarki. <ph name="PRINTER_MANUFACTURER" /> i <ph name="PRINTER_MODEL" /> ułatwiają użytkownikom identyfikację drukarki. Oznaczają producenta i model drukarki. <ph name="PRINTER_URI" /> to adres, który powinien być dostępny z komputera klienckiego. Zawiera te składniki: <ph name="URI_SCHEME" />, <ph name="URI_PORT" /> i <ph name="URI_QUEUE" />. Opcjonalny składnik to <ph name="PRINTER_UUID" />. Jeśli jest podany, umożliwia usunięcie duplikatów drukarek <ph name="ZEROCONF_DISCOVERY" />. + + Musi zostać spełniony jeden z dwóch warunków: <ph name="PRINTER_EFFECTIVE_MODEL" /> musi zawierać nazwę drukarki lub ustawienie <ph name="PRINTER_AUTOCONF" /> musi mieć wartość Prawda. Drukarki spełniające oba te warunki lub niespełniające żadnego będą ignorowane. + + Konfiguracja drukarki jest wykonywana podczas jej pierwszego użycia. Pliki PPD nie są pobierane przed użyciem drukarki. Później często używane pliki PPD są przechowywane w pamięci podręcznej. + + Zasada nie ma wpływu na to, czy użytkownicy mogą konfigurować drukarki na poszczególnych urządzeniach. Uzupełnia ona konfigurację drukarek wykonywaną przez poszczególnych użytkowników. + + W przypadku urządzeń zarządzanych przez Active Directory zasada ta obsługuje rozwijanie nazwy <ph name="MACHINE_NAME_VARIABLE" /> do nazwy komputera w Active Directory lub jej podłańcucha. Jeśli na przykład nazwa komputera to <ph name="MACHINE_NAME_EXAMPLE" />, ciąg <ph name="MACHINE_NAME_VARIABLE_EXAMPLE" /> zastępowany jest czterema znakami, zaczynając po szóstej pozycji, np. <ph name="MACHINE_NAME_PART_EXAMPLE" />. Pozycja jest liczona od zera. + </translation> <translation id="6598235178374410284">Obraz awatara użytkownika</translation> <translation id="6603004149426829878">Zawsze przesyłaj wszelkie dostępne sygnały o lokalizacji do serwera podczas określania strefy czasowej</translation> <translation id="6628120204569232711">Raportuje stan pamięci</translation> @@ -3350,7 +3384,6 @@ Jeśli ma wartość „RemoveLRUIfDormant”, automatyczne czyszczenie usuwa użytkowników, którzy nie logowali się od co najmniej 3 miesięcy (począwszy od najdawniej zalogowanych), aż do uzyskania odpowiedniej ilości wolnego miejsca. Jeśli nie ustawisz tej zasady, funkcja automatycznego czyszczenia korzysta z domyślnej wbudowanej strategii. Obecnie to „RemoveLRUIfDormant”.</translation> -<translation id="7334274148831027933">Włącz lupę zadokowaną</translation> <translation id="7336785017449297672">Kontroluje ustawienia zegara i strefy czasowej.</translation> <translation id="7336878834592315572">Zachowaj pliki cookie na czas trwania sesji</translation> <translation id="7339315111520512972">Wymuś działanie kodu obsługi sieci wewnątrz procesu przeglądarki</translation> @@ -4233,6 +4266,8 @@ <translation id="915194831143859291">Jeśli wyłączysz tę zasadę lub jej nie skonfigurujesz, <ph name="PRODUCT_OS_NAME" /> pozwoli użytkownikowi wyłączyć urządzenie. Jeśli zasada będzie włączona, <ph name="PRODUCT_OS_NAME" /> wymusi ponowne uruchomienie urządzenia, gdy użytkownik spróbuje je wyłączyć. <ph name="PRODUCT_OS_NAME" /> zastąpi wszystkie wystąpienia przycisku wyłączania w interfejsie użytkownika przyciskami ponownego uruchomienia. Urządzenie nie uruchomi się ponownie niezależnie od ustawienia tej zasady, jeśli użytkownik wyłączy je za pomocą przycisku zasilania.</translation> <translation id="9152473318295429890">Włącz kontekstowe proponowanie powiązanych stron</translation> +<translation id="9153446010242995516">Przywrócenie i pozostawienie docelowej wersji systemu operacyjnego, jeśli zainstalowana jest wersja nowsza niż docelowa. Jeśli to możliwe, konfiguracja na poziomie urządzenia (w tym dane logowania do sieci) zostanie zachowana, ale jeśli nie jest to możliwe (ponieważ wersja docelowa nie umożliwia przywrócenia danych lub z powodu niezgodnej wstecznie zmiany), wykonane zostanie przywrócenie z pełną procedurą Powerwash. + Obsługiwane w <ph name="PRODUCT_OS_NAME" /> w wersji 75 lub nowszej. W przypadku starszych klientów ta wartość wyłącza możliwość przywrócenia wersji.</translation> <translation id="9158929520101169054">Zezwól na wielokrotne logowanie w przeglądarce</translation> <translation id="9159126470527871268">Powiadamiaj użytkowników, że konieczne jest ponowne uruchomienie <ph name="PRODUCT_NAME" /> lub urządzenia z <ph name="PRODUCT_OS_NAME" /> w celu zainstalowania oczekującej aktualizacji.
diff --git a/components/policy/resources/policy_templates_pt-BR.xtb b/components/policy/resources/policy_templates_pt-BR.xtb index 991f4d52..40b17d9 100644 --- a/components/policy/resources/policy_templates_pt-BR.xtb +++ b/components/policy/resources/policy_templates_pt-BR.xtb
@@ -137,15 +137,6 @@ Se a política for definida como "False", o estado da chave dev não será informado.</translation> <translation id="1160479894929412407">Permitir protocolo QUIC</translation> <translation id="1160939557934457296">Desativa a continuação na página de aviso de "Navegação segura"</translation> -<translation id="1171342272070128466">Ativar o recurso de acessibilidade da lupa ancorada. - - Se esta política for definida como verdadeira, a lupa ancorada estará sempre ativada. - - Se esta política for definida como falsa, a lupa ancorada estará sempre desativada. - - Se você definir esta política, os usuários não poderão alterá-la ou substituí-la. - - Se esta política não for definida, a lupa ancorada estará desativada inicialmente, mas poderá ser ativada pelo usuário a qualquer momento.</translation> <translation id="1189817621108632689">Permite que você defina uma lista de padrões de URL que especifica sites que têm permissão para exibir imagens. Se esta política não for definida, o valor global padrão será usado para todos os sites da política "DefaultImagesSetting", caso ela tenha sido definida, ou a partir das configurações pessoais do usuário, caso não tenha sido definida. @@ -1532,11 +1523,6 @@ Se a política for definida como "false", as informações da sessão de quiosque não serão comunicadas. Se definida como "true" ou não configurada, as informações da sessão de quiosque serão comunicadas.</translation> -<translation id="3852924591079583104"> - Quando definida como "ArcSession", esta política forçará a reinicialização do dispositivo depois que o usuário sair se o Android tiver sido iniciado. - Quando definida como "Sempre", a política força a reinicialização do dispositivo sempre que o usuário sai. - Se não for definida, a política não terá efeito, e a reinicialização não será forçada quando o usuário sair. O mesmo acontece quando a política é definida como "Nunca". - </translation> <translation id="3858658082795336534">Modo duplex de impressão padrão</translation> <translation id="3859780406608282662">Adicionar um parâmetro para a busca do termo-semente "Variações" no <ph name="PRODUCT_OS_NAME" />. @@ -3340,7 +3326,6 @@ Se esta política for configurada como "RemoveLRUIfDormant", a limpeza automática continuará removendo os usuários que não fizeram login há pelo menos três meses, na ordem dos usuários que fizeram login há mais tempo, até que haja espaço livre suficiente. Se esta política não for configurada, a limpeza automática usa a estratégia integrada padrão, que atualmente é a estratégia "RemoveLRUIfDormant".</translation> -<translation id="7334274148831027933">Ativar lupa ancorada</translation> <translation id="7336785017449297672">Controla configurações do relógio e de fuso horário.</translation> <translation id="7336878834592315572">Manter cookies enquanto durar a sessão</translation> <translation id="7339315111520512972">Força a execução do código de rede no processo do navegador</translation>
diff --git a/components/policy/resources/policy_templates_pt-PT.xtb b/components/policy/resources/policy_templates_pt-PT.xtb index 1e76f153..53dae63 100644 --- a/components/policy/resources/policy_templates_pt-PT.xtb +++ b/components/policy/resources/policy_templates_pt-PT.xtb
@@ -145,15 +145,6 @@ Se a política estiver definida como "false", o estado do comutador dev não será comunicado.</translation> <translation id="1160479894929412407">Autorizar o protocolo QUIC</translation> <translation id="1160939557934457296">Desativar procedimento da página de aviso de Navegação Segura</translation> -<translation id="1171342272070128466">Ative a funcionalidade de acessibilidade da lupa ancorada. - - Se esta política for definida como verdadeira, a lupa ancorada estará sempre ativada. - - Se esta política for definida como falsa, a lupa ancorada estará sempre desativada. - - Se definir esta política, os utilizadores não a poderão alterar nem substituir. - - Se esta política não for definida, a lupa ancorada estará inicialmente desativada, mas poderá ser ativada pelo utilizador em qualquer altura.</translation> <translation id="1189817621108632689">Permite definir uma lista de padrões de URL que especificam os sites não autorizados a apresentar imagens. Se esta política não for definida, é utilizado o valor global predefinido para todos os sites, seja a partir da política "DefaultImagesSetting", caso esteja definida, ou a partir da configuração pessoal do utilizador. @@ -1125,6 +1116,15 @@ Se esta política não for definida, o comportamento das políticas mais específicas permanece intacto.</translation> <translation id="2987155890997901449">Ativar ARC</translation> <translation id="2987227569419001736">Controlar a utilização da API Web Bluetooth</translation> +<translation id="2990018289267778247">Se esta política for definida como Verdadeira, as opções de Acessibilidade aparecem sempre no menu do tabuleiro do sistema. + + Se esta política for definida como Falsa, as opções de Acessibilidade nunca aparecem no menu do tabuleiro do sistema. + + Se definir esta política, os utilizadores não a podem alterar nem substituir. + + Se esta política não for definida, as opções de Acessibilidade não aparecem no menu do tabuleiro do sistema, mas o utilizador pode fazer com que as mesmas apareçam através da página Definições. + + Quando as funcionalidades de acessibilidade são ativadas (por outros meios, por exemplo, através de uma combinação de teclas), as opções de Acessibilidade aparecem sempre no menu do tabuleiro do sistema.</translation> <translation id="3011301228198307065">Configura o URL da página inicial predefinida no <ph name="PRODUCT_NAME" /> e impede os utilizadores de o alterarem. A página inicial é a página aberta com o botão página inicial. As páginas abertas no arranque são controladas pelas políticas RestoreOnStartup. @@ -1442,6 +1442,7 @@ Esta política é utilizada pela inscrição de políticas de nuvem num âmbito automático em computadores e pode ser definida pela Base de dados de registo ou GPO no Windows, pelo plist no Mac e pelo ficheiro da política JSON no Linux.</translation> <translation id="3660562134618097814">Transferir cookies SAML IdP durante o início de sessão</translation> <translation id="3701121231485832347">Controla definições específicas para dispositivos <ph name="PRODUCT_OS_NAME" /> geridos por <ph name="MS_AD_NAME" />.</translation> +<translation id="3702518095257671450">Atestação remota</translation> <translation id="3702647575225525306"><ph name="POLICY_NAME" /> (O campo de uma única linha foi descontinuado e será removido no futuro. Comece a utilizar a caixa de texto multilinha abaixo.)</translation> <translation id="3709266154059827597">Configurar lista negra de instalação de extensões</translation> <translation id="3711895659073496551">Suspenso</translation> @@ -1552,11 +1553,6 @@ Se a política for definida como falsa, as informações da sessão do quiosque não são comunicadas. Se for definida como verdadeira ou deixada por definir, as informações da sessão do quiosque são comunicadas.</translation> -<translation id="3852924591079583104"> - Quando definida como ArcSession, esta política força o reinício do dispositivo após o fim de sessão do utilizador, se o Android tiver sido iniciado. - Quando definida como Sempre, força o reinício do dispositivo aquando de todos os fins de sessão do utilizador. - Se não for definida, não tem qualquer efeito e não é forçado nenhum reinício aquando do fim de sessão do utilizador. O mesmo se aplica se for definida como Nunca. - </translation> <translation id="3858658082795336534">Modo duplex de impressão padrão</translation> <translation id="3859780406608282662">Adiciona um parâmetro para a obtenção da semente Variações no <ph name="PRODUCT_OS_NAME" />. @@ -1840,6 +1836,15 @@ Esta política só será seguida se a política "DefaultSearchProviderEnabled" estiver ativada.</translation> <translation id="4285674129118156176">Permitir que os utilizadores não afiliados utilizem o ARC</translation> +<translation id="4289903996435140853">Permite-lhe definir uma lista de URLs que especificam os sites aos quais será concedida automaticamente autorização para aceder a um dispositivo USB com os IDs de fornecedor e do produto indicados. Todos os itens na lista devem conter dispositivos e URLs para que a política seja válida. Todos os itens nos dispositivos podem conter um campo de ID de fornecedor e de ID do produto. Os IDs omitidos são tratados como carateres universais, com a exceção de que não é possível especificar um ID do produto sem que o ID de fornecedor também seja especificado. Caso contrário, a política não é válida e será ignorada. + + O modelo de autorização de USB utiliza o URL do site requerente ("URL requerente") e o URL do site de nível superior ("URL incorporante") para autorizar o URL requerente a aceder ao dispositivo USB. O URL requerente pode ser diferente do URL incorporante se o site requerente for carregado num iFrame. Assim, o campo "URLs" pode conter até duas strings de URL separadas por vírgula para especificar o URL requerente e o URL incorporante, respetivamente. Se apenas for especificado um URL, é concedido acesso aos dispositivos USB correspondentes quando o URL do site requerente corresponder a este URL, independentemente do estado de incorporação. Os URLs no campo "URLs" têm de ser URLs válidos; caso contrário, a política será ignorada. + + Se esta política não estiver definida, o valor predefinido global é utilizado para todos os sites a partir da política "DefaultWebUsbGuardSetting", se estiver definida, ou, caso contrário, a partir da configuração pessoal do utilizador. + + Os padrões de URL nesta política não devem entrar em conflito com os configurados através de WebUsbBlockedForUrls. Se existir conflito, esta política prevalece em relação a WebUsbBlockedForUrls e WebUsbAskForUrls. + + Os valores desta política e da política WebUsbAllowDevicesForUrls policy são unidos.</translation> <translation id="4298509794364745131">Especifica a lista de aplicações que podem ser ativadas como aplicações para tirar notas no ecrã de bloqueio do <ph name="PRODUCT_OS_NAME" />. Se a aplicação para tirar notas preferida estiver ativada no ecrã de bloqueio, este irá conter um elemento de IU para a iniciar. @@ -1983,6 +1988,7 @@ <translation id="4639407427807680016">Nomes dos anfitriões de mensagens nativas a isentar da lista negra</translation> <translation id="4650759511838826572">Desativar os esquemas de protocolo de URL</translation> <translation id="465099050592230505">URL da Web store da empresa (descontinuado)</translation> +<translation id="4661889655253181651">As definições de conteúdo permitem-lhe especificar como são processados os conteúdos de um determinado tipo (por exemplo, cookies, imagens ou JavaScript).</translation> <translation id="4665897631924472251">Definições de gestão de extensões</translation> <translation id="4668325077104657568">Definição de imagens predefinidas</translation> <translation id="4670865688564083639">Mínimo:</translation> @@ -2027,6 +2033,11 @@ Essas sugestões são obtidas remotamente a partir dos servidores da Google. Se esta definição estiver definida como falsa, as sugestões não serão obtidas nem apresentadas.</translation> +<translation id="4759650396863318477">Permite-lhe definir o período de tempo, em milissegundos, ao longo do qual os utilizadores são notificados de que o <ph name="PRODUCT_NAME" /> tem de ser reiniciado ou que um dispositivo<ph name="PRODUCT_OS_NAME" /> tem de ser reiniciado para aplicar uma atualização pendente. + + Ao longo deste período de tempo, o utilizador é informado, repetidamente, de que é necessária uma atualização. Relativamente aos dispositivos <ph name="PRODUCT_OS_NAME" />, é apresentada uma notificação de reinício no tabuleiro do sistema de acordo com a política <ph name="RELAUNCH_HEADS_UP_PERIOD_POLICY_NAME" />. Quanto aos navegadores <ph name="PRODUCT_NAME" />, o menu da aplicação muda e passa a indicar que é necessário reiniciar assim que for ultrapassado um terço do período de notificação. A cor da notificação muda quando forem ultrapassados dois terços do período de notificação e volta a mudar quando o período terminar. As outras notificações que a política <ph name="RELAUNCH_NOTIFICATION_POLICY_NAME" /> ativa seguem este mesmo horário. + + Se não for definida, é utilizado o período predefinido de 345 600 000 milissegundos (quatro dias) para os dispositivos <ph name="PRODUCT_OS_NAME" /> e de 604 800 000 milissegundos (uma semana) para o <ph name="PRODUCT_NAME" />.</translation> <translation id="4788252609789586009">Ativa a funcionalidade de Preenchimento automático do <ph name="PRODUCT_NAME" /> e permite que os utilizadores preencham automaticamente as informações de cartões de crédito em formulários Web ao utilizar informações armazenadas anteriormente. Se esta definição estiver desativada, o Preenchimento automático nunca sugere nem preenche formulários com informações de cartões de crédito e também não guarda informações adicionais de cartões de crédito que o utilizador possa enviar enquanto navega na Web. @@ -2221,6 +2232,15 @@ <translation id="5208240613060747912">Permite definir uma lista de padrões de URL que especificam os Web sites não autorizados a apresentar notificações. Se esta política não for definida, será utilizado o valor global predefinido para todos os Web sites, seja a partir da política "DefaultNotificationsSetting", caso esteja definida, ou a partir da configuração pessoal do utilizador.</translation> <translation id="5213038356678567351">Websites que nunca devem acionar uma mudança de navegador.</translation> <translation id="5219844027738217407">Para aplicações para Android, esta política afeta apenas o microfone. Se esta política estiver definida como verdadeira, o som do microfone é desativado para todas as aplicações para Android, sem exceções.</translation> +<translation id="5221394278852982313">Permite-lhe definir uma lista de URLs que especificam os sites aos quais será concedida automaticamente autorização para aceder a um dispositivo USB com os IDs de fornecedor e do produto indicados. Todos os itens na lista devem conter dispositivos e URLs para que a política seja válida. Todos os itens nos dispositivos podem conter um campo de ID de fornecedor e de ID do produto. Os IDs omitidos são tratados como carateres universais, com a exceção de que não é possível especificar um ID do produto sem que o ID de fornecedor também seja especificado. Caso contrário, a política não é válida e será ignorada. + + O modelo de autorização de USB utiliza o URL do site requerente ("URL requerente") e o URL do site de nível superior ("URL incorporante") para autorizar o URL requerente a aceder ao dispositivo USB. O URL requerente pode ser diferente do URL incorporante se o site requerente for carregado num iFrame. Assim, o campo "URLs" pode conter até duas strings de URL separadas por vírgula para especificar o URL requerente e o URL incorporante, respetivamente. Se apenas for especificado um URL, é concedido acesso aos dispositivos USB correspondentes quando o URL do site requerente corresponder a este URL, independentemente do estado de incorporação. Os URLs no campo "URLs" têm de ser URLs válidos; caso contrário, a política será ignorada. + + Se esta política não estiver definida, o valor predefinido global é utilizado para todos os sites a partir da política "DefaultWebUsbGuardSetting", se estiver definida, ou, caso contrário, a partir da configuração pessoal do utilizador. + + Os padrões de URL nesta política não devem entrar em conflito com os configurados através de WebUsbBlockedForUrls. Se existir conflito, esta política prevalece em relação a WebUsbBlockedForUrls e WebUsbAskForUrls. + + Os valores desta política e da política DeviceWebUsbAllowDevicesForUrls são unidos.</translation> <translation id="5228316810085661003">Atraso no início de sessão automático na conta local do dispositivo. Se a política |DeviceLocalAccountAutoLoginId| não estiver definida, a mesma não produz efeitos. Caso contrário: @@ -2942,6 +2962,21 @@ Se esta política estiver definida como "Não permitir que os utilizadores efetuem a gestão dos certificados", os utilizadores não poderão gerir os certificados, só os podem ver.</translation> <translation id="6573305661369899995">Definir uma fonte externa de restrições de URL</translation> +<translation id="6583851521569686409">Configura uma lista de impressoras. + + Esta política permite aos administradores fornecer configurações de impressora para + os respetivos utilizadores. + + <ph name="PRINTER_DISPLAY_NAME" /> e <ph name="PRINTER_DESCRIPTION" /> são strings de forma livre que podem ser personalizadas para facilitar a seleção da impressora. <ph name="PRINTER_MANUFACTURER" /> e <ph name="PRINTER_MODEL" /> servem para facilitar a identificação da impressora por parte dos utilizadores finais. Representam o fabricante e o modelo da impressora. <ph name="PRINTER_URI" /> deve ser um endereço acessível a partir de um computador de cliente, incluindo <ph name="URI_SCHEME" />, <ph name="URI_PORT" /> e <ph name="URI_QUEUE" />. <ph name="PRINTER_UUID" /> é opcional. Se fornecido, é utilizado para ajudar a remover duplicados de impressoras <ph name="ZEROCONF_DISCOVERY" />. + + <ph name="PRINTER_EFFECTIVE_MODEL" /> deve conter o nome da impressora ou <ph name="PRINTER_AUTOCONF" /> deve ser definida como verdadeira. As impressoras com as duas propriedades ou sem nenhuma delas serão ignoradas. + + A configuração de uma impressora fica concluída com a primeira utilização da mesma. Os PPDs não são transferidos enquanto a impressora não for utilizada. Posteriormente, os PPDs utilizados com frequência são colocados em cache. + + Esta política não influencia a possibilidade de os utilizadores configurarem impressoras em dispositivos individuais. Destina-se a complementar a configuração de impressoras por utilizadores individuais. + + Em dispositivos geridos pelo Active Directory, esta política suporta a expansão de <ph name="MACHINE_NAME_VARIABLE" /> para o nome do computador do Active Directory ou uma substring do mesmo. Por exemplo, se o nome do computador for <ph name="MACHINE_NAME_EXAMPLE" />, então <ph name="MACHINE_NAME_VARIABLE_EXAMPLE" /> será substituído pelos 4 carateres a partir da 6.ª posição, ou seja, <ph name="MACHINE_NAME_PART_EXAMPLE" />. Tenha em atenção que a posição baseia-se em zero. + </translation> <translation id="6598235178374410284">Imagem do avatar do utilizador</translation> <translation id="6603004149426829878">Enviar sempre quaisquer sinais de localização disponíveis para o servidor durante a resolução do fuso horário</translation> <translation id="6628120204569232711">Comunicar o estado do armazenamento</translation> @@ -3378,7 +3413,6 @@ Se esta política estiver definida para "RemoveLRUIfDormant", a limpeza automática continuará a remover utilizadores que não iniciam sessão há, pelo menos, 3 meses, pela ordem de início de sessão menos recente até existir espaço livre suficiente. Se esta política não estiver definida, a limpeza automática utiliza a estratégia integrada predefinida. Atualmente, é a estratégia "RemoveLRUIfDormant".</translation> -<translation id="7334274148831027933">Ativar lupa ancorada</translation> <translation id="7336785017449297672">Controla as definições do relógio e do fuso horário.</translation> <translation id="7336878834592315572">Manter cookies durante toda a sessão</translation> <translation id="7339315111520512972">Forçar a execução do código de rede no processo do navegador</translation> @@ -4264,6 +4298,8 @@ <translation id="915194831143859291">Se esta política estiver definida como falsa ou não estiver configurada, o <ph name="PRODUCT_OS_NAME" /> permite ao utilizador encerrar o dispositivo. Se esta política estiver definida como verdadeira, o <ph name="PRODUCT_OS_NAME" /> aciona um reinício quando o utilizador encerrar o dispositivo. O <ph name="PRODUCT_OS_NAME" /> substitui todas as ocorrências de botões de encerramento na IU por botões de reinício. Se o utilizador encerrar o dispositivo através do botão ligar/desligar, este não reinicia automaticamente, mesmo que a política esteja ativada.</translation> <translation id="9152473318295429890">Ativar sugestões contextuais de páginas Web relacionadas</translation> +<translation id="9153446010242995516">Reverta e continue com a versão de destino se a versão do SO for mais recente do que a do destino. Tente transferir a configuração ao nível do dispositivo (incluindo as credenciais da rede) através do processo de reversão, se possível, mas efetue a reversão com Powerwash completo, mesmo que não seja possível restaurar os dados (por a versão do destino não ser compatível com o restauro de dados ou devido a uma alteração incompatível com anterior). + Compatível com a versão 75 e superior do <ph name="PRODUCT_OS_NAME" />. Para clientes mais antigos, este valor significa que a reversão está desativada.</translation> <translation id="9158929520101169054">Permitir o início de sessão integrado no navegador</translation> <translation id="9159126470527871268">Notifique os utilizadores de que o <ph name="PRODUCT_NAME" /> tem de ser reiniciado ou que o <ph name="PRODUCT_OS_NAME" /> tem de ser reiniciado para aplicar uma atualização pendente.
diff --git a/components/policy/resources/policy_templates_ro.xtb b/components/policy/resources/policy_templates_ro.xtb index 44b0be1..449e364 100644 --- a/components/policy/resources/policy_templates_ro.xtb +++ b/components/policy/resources/policy_templates_ro.xtb
@@ -131,15 +131,6 @@ Dacă politica este dezactivată, starea comutatorului modului pentru dezvoltatori nu va fi raportată.</translation> <translation id="1160479894929412407">Permite protocolul QUIC</translation> <translation id="1160939557934457296">Dezactivați continuarea navigării de pe pagina de avertisment Navigare sigură</translation> -<translation id="1171342272070128466">Activează sau dezactivează funcția de accesibilitate de lupă andocată. - - Dacă politica este activată, lupa andocată va fi activată întotdeauna. - - Dacă politica este dezactivată, lupa andocată va fi dezactivată întotdeauna. - - Dacă setezi această politică, utilizatorii nu pot să o modifice sau să o anuleze. - - Dacă această politică nu este configurată, lupa andocată este inițial dezactivată, dar poate fi activată oricând de utilizator.</translation> <translation id="1189817621108632689">Îți permite să setezi o listă de șabloane de adrese URL care specifică site-urile care nu au permisiunea să afișeze imagini. Dacă această politică nu este setată, valoarea prestabilită la nivel global va fi folosită pentru toate site-urile, fie din politica „DefaultImagesSetting” dacă este setată, fie din configurația personală a utilizatorului, în caz contrar. @@ -1112,6 +1103,15 @@ Comportamentul politicilor specifice nu va fi afectat dacă setarea acestei politici este anulată.</translation> <translation id="2987155890997901449">Activează ARC</translation> <translation id="2987227569419001736">Controlează folosirea API-ului Web Bluetooth</translation> +<translation id="2990018289267778247">Dacă politica este activată, opțiunile de accesibilitate se afișează întotdeauna în meniul barei de sistem. + + Dacă politica este dezactivată, opțiunile de accesibilitate nu se afișează niciodată în meniul barei de sistem. + + Dacă setezi această politică, utilizatorii nu pot să o modifice sau să o anuleze. + + Dacă această politică nu este configurată, opțiunile de accesibilitate nu vor apărea în meniul barei de sistem, dar utilizatorul poate afișa opțiunile de accesibilitate prin intermediul paginii Setări. + + Când funcțiile de accesibilitate sunt activate (prin alte mijloace, de exemplu printr-o combinație de taste), opțiunile de accesibilitate vor fi afișate întotdeauna în meniul barei de sistem.</translation> <translation id="3011301228198307065">Configurează adresa URL a paginii principale prestabilite în <ph name="PRODUCT_NAME" /> și nu le permite utilizatorilor să o schimbe. Pagina principală este cea care se deschide apăsând pe butonul Pagină principală. Paginile care se deschid la pornire sunt controlate de politicile RestoreOnStartup. @@ -1429,6 +1429,7 @@ Această politică este folosită de înregistrarea în politica de cloud a domeniului dispozitivului pe desktop și poate fi setată de fișierul de politică Registry sau GPO în Windows, plist în Mac și JSON în Linux.</translation> <translation id="3660562134618097814">Transferă cookie-urile unui furnizor de identitate SAML în timpul conectării</translation> <translation id="3701121231485832347">Controlează setările specifice dispozitivelor <ph name="PRODUCT_OS_NAME" /> gestionate de <ph name="MS_AD_NAME" />.</translation> +<translation id="3702518095257671450">Atestare la distanță</translation> <translation id="3702647575225525306"><ph name="POLICY_NAME" /> (Câmpul cu un singur rând este învechit și va fi eliminat în viitor. Începe să folosești caseta text cu mai multe rânduri de mai jos.)</translation> <translation id="3709266154059827597">Configurează lista neagră pentru instalarea extensiilor</translation> <translation id="3711895659073496551">Suspendați</translation> @@ -1539,11 +1540,6 @@ Dacă politica este dezactivată, informațiile privind sesiunea chioșc nu vor fi raportate. Dacă politica este activată sau nu este configurată, informațiile privind sesiunea chioșc vor fi raportate.</translation> -<translation id="3852924591079583104"> - Când politica este setată la ArcSession, forțează dispozitivul să repornească la deconectarea utilizatorului dacă Android a pornit. - Când este setată la Întotdeauna, forțează dispozitivul să repornească de fiecare dată când utilizatorul se deconectează. - Dacă nu este setată, nu are niciun efect și nu este forțată repornirea la deconectarea utilizatorului. Același lucru este valabil dacă politica este setată la Niciodată. - </translation> <translation id="3858658082795336534">Modul de printare duplex prestabilit</translation> <translation id="3859780406608282662">Adăugați un parametru la preluarea valorii inițiale Variante din <ph name="PRODUCT_OS_NAME" />. @@ -1827,6 +1823,15 @@ Această politică este urmată numai dacă este activată politica „DefaultSearchProviderEnabled”.</translation> <translation id="4285674129118156176">Permite utilizatorilor neafiliați să folosească ARC</translation> +<translation id="4289903996435140853">Îți permite să setezi o listă de adrese URL ce indică site-urile care vor primi automat permisiunea să acceseze un dispozitiv USB cu ID-ul de furnizor și de produs oferit. Fiecare articol din listă trebuie să conțină atât dispozitivele, cât și adresele URL pentru ca politica să fie validă. Fiecare articol din dispozitive poate conține un câmp pentru ID-ul furnizorului și ID-ul produsului. Orice ID omis este considerat un metacaracter, cu o excepție: un ID de produs nu poate fi specificat fără să fie specificat și un ID de furnizor. În caz contrar, politica nu va fi validă și va fi ignorată. + + Modelul permisiunii USB folosește adresa URL a site-ului care face solicitarea („adresa URL solicitantă”) și adresa URL a site-ului cadru de nivel superior („adresa URL încorporantă”) pentru a acorda permisiunea adresei URL solicitante de a accesa dispozitivul USB. Adresa URL solicitantă poate fi diferită de adresa URL încorporantă când site-ul solicitant este încărcat într-un iframe. De aceea, câmpul „urls” poate conține până la două șiruri separate cu o virgulă pentru a specifica adresa URL încorporantă și, respectiv, solicitantă. Dacă este specificată o singură adresă URL, accesul la dispozitivele USB corespunzătoare va fi acordat când adresa URL a site-ului solicitant este aceeași cu această adresă URL, indiferent de starea încorporării. Adresele URL din „urls” trebuie să fie adrese URL valide; în caz contrar, politica va fi ignorată. + + Dacă această politică nu este setată, valoarea globală prestabilită va fi folosită pentru toate site-urile, fie din politica „DefaultWebUsbGuardSetting”, dacă este setată, fie din configurația personală a utilizatorului, în caz contrar. + + Șabloanele de adrese URL din această politică nu trebuie să fie în contradicție cu cele configurate prin WebUsbBlockedForUrls. Dacă există o contradicție, această politică va avea întâietate în fața WebUsbBlockedForUrls și WebUsbAskForUrls. + + Valorile pentru această politică și politica WebUsbAllowDevicesForUrls sunt îmbinate.</translation> <translation id="4298509794364745131">Specifică lista de aplicații care pot fi activate ca aplicație pentru creat note pe ecranul de blocare din <ph name="PRODUCT_OS_NAME" />. Dacă aplicația preferată pentru creat note este activată pe ecranul de blocare, acesta va include un element al interfeței de utilizare pentru lansarea aplicației preferate pentru creat note. @@ -1970,6 +1975,7 @@ <translation id="4639407427807680016">Numele gazdelor de mesagerie nativă de exclus din lista neagră.</translation> <translation id="4650759511838826572">Dezactivează schemele pentru protocolul adresei URL</translation> <translation id="465099050592230505">Adresa URL a magazinului web pentru întreprinderi (politică învechită)</translation> +<translation id="4661889655253181651">Folosind Setările privind conținutul, poți să specifici modul în care este gestionat conținutul de un anumit tip (de exemplu: cookie-uri, imagini sau JavaScript)</translation> <translation id="4665897631924472251">Setările de gestionare a extensiilor</translation> <translation id="4668325077104657568">Setare pentru imagini prestabilite</translation> <translation id="4670865688564083639">Minimum:</translation> @@ -2014,6 +2020,11 @@ Aceste sugestii vor fi preluate de la distanță de pe serverele Google. Dacă setarea este dezactivată, nu se vor prelua și nu se vor afișa sugestii.</translation> +<translation id="4759650396863318477">Îți permite să setezi perioada, în milisecunde, în care utilizatorii sunt informați că <ph name="PRODUCT_NAME" /> trebuie relansat sau că un dispozitiv <ph name="PRODUCT_OS_NAME" /> trebuie repornit pentru a aplica o actualizare în așteptare. + + În această perioadă, utilizatorul va fi informat în mod repetat despre necesitatea unei actualizări. Pentru dispozitivele <ph name="PRODUCT_OS_NAME" />, notificarea privind repornirea apare în bara de sistem, conform politicii <ph name="RELAUNCH_HEADS_UP_PERIOD_POLICY_NAME" />. Pentru browserele <ph name="PRODUCT_NAME" />, meniul aplicației se modifică, indicând faptul că este necesară o relansare după expirarea unei treimi din perioada de notificare. Această notificare își schimbă culoarea după expirarea a două treimi din perioada de notificare și încă o dată, după încheierea întregii perioade de notificare. Notificările suplimentare activate de politica <ph name="RELAUNCH_NOTIFICATION_POLICY_NAME" /> urmează același program. + + Dacă nu este configurată, se aplică o perioadă prestabilită de 345.600.000 de milisecunde (patru zile) pentru dispozitivele <ph name="PRODUCT_OS_NAME" /> și 604.800.000 de milisecunde (o săptămână) pentru <ph name="PRODUCT_NAME" />.</translation> <translation id="4788252609789586009">Activează funcția de completare automată din <ph name="PRODUCT_NAME" /> și permite utilizatorilor să completeze automat informațiile despre carduri de credit în formularele web folosind informațiile stocate anterior. Dacă această setare este dezactivată, completarea automată nu va sugera și nu va completa niciodată informațiile despre carduri de credit, nici nu va salva informații suplimentare despre carduri de credit pe care utilizatorul le-ar putea trimite când navighează pe web. @@ -2212,6 +2223,15 @@ <translation id="5208240613060747912">Vă permite să setați o listă de modele pentru adresele URL ce specifică site-urile care nu au permisiunea să afișeze notificări. Dacă această politică nu este setată, valoarea prestabilită la nivel global va fi folosită pentru toate site-urile, fie din politica „DefaultNotificationsSetting”, în cazul în care aceasta este setată, fie din configurația personală a utilizatorului, în caz contrar.</translation> <translation id="5213038356678567351">Site-uri care nu trebuie să declanșeze niciodată comutarea browserului.</translation> <translation id="5219844027738217407">În cazul aplicațiilor Android, această politică afectează numai microfonul. Când politica este activată, microfonul este dezactivat pentru toate aplicațiile Android, fără excepții.</translation> +<translation id="5221394278852982313">Îți permite să setezi o listă de adrese URL ce indică site-urile care vor primi automat permisiunea să acceseze un dispozitiv USB cu ID-ul de furnizor și de produs oferit. Fiecare articol din listă trebuie să conțină atât dispozitivele, cât și adresele URL pentru ca politica să fie validă. Fiecare articol din dispozitive poate conține un câmp pentru ID-ul furnizorului și ID-ul produsului. Orice ID omis este considerat un metacaracter, cu o excepție: un ID de produs nu poate fi specificat fără să fie specificat și un ID de furnizor. În caz contrar, politica nu va fi validă și va fi ignorată. + + Modelul permisiunii USB folosește adresa URL a site-ului care face solicitarea („adresa URL solicitantă”) și adresa URL a site-ului cadru de nivel superior („adresa URL încorporantă”) pentru a acorda permisiunea adresei URL solicitante de a accesa dispozitivul USB. Adresa URL solicitantă poate fi diferită de adresa URL încorporantă când site-ul solicitant este încărcat într-un iframe. De aceea, câmpul „urls” poate conține până la două șiruri separate cu o virgulă pentru a specifica adresa URL încorporantă și, respectiv, solicitantă. Dacă este specificată o singură adresă URL, accesul la dispozitivele USB corespunzătoare va fi acordat când adresa URL a site-ului solicitant este aceeași cu această adresă URL, indiferent de starea încorporării. Adresele URL din „urls” trebuie să fie adrese URL valide; în caz contrar, politica va fi ignorată. + + Dacă această politică nu este setată, valoarea globală prestabilită va fi folosită pentru toate site-urile, fie din politica „DefaultWebUsbGuardSetting”, dacă este setată, fie din configurația personală a utilizatorului, în caz contrar. + + Șabloanele de adrese URL din această politică nu trebuie să fie în contradicție cu cele configurate prin WebUsbBlockedForUrls. Dacă există o contradicție, această politică va avea întâietate în fața WebUsbBlockedForUrls și WebUsbAskForUrls. + + Valorile pentru această politică și politica DeviceWebUsbAllowDevicesForUrls sunt îmbinate.</translation> <translation id="5228316810085661003">Întârzierea până la conectarea automată la contul local de pe dispozitiv. Dacă politica |DeviceLocalAccountAutoLoginId| nu este setată, această politică nu are niciun efect. În caz contrar: @@ -2937,6 +2957,21 @@ Dacă politica este setată la „Nu permite utilizatorilor să gestioneze certificate”, utilizatorii nu vor putea să gestioneze certificate, ci doar să le vizualizeze.</translation> <translation id="6573305661369899995">Setează o sursă externă a restricțiilor privind adresele URL</translation> +<translation id="6583851521569686409">Configurează o listă de imprimante. + + Această politică permite administratorilor să ofere utilizatorilor configurații ale + imprimantelor. + + <ph name="PRINTER_DISPLAY_NAME" /> și <ph name="PRINTER_DESCRIPTION" /> sunt șiruri cu formă liberă care pot fi personalizate pentru a selecta mai ușor o imprimantă. <ph name="PRINTER_MANUFACTURER" /> și <ph name="PRINTER_MODEL" /> sunt folosite pentru a simplifica identificarea imprimantei de utilizatorii finali. Acestea reprezintă producătorul și modelul imprimantei. <ph name="PRINTER_URI" /> trebuie să fie o adresă care poate fi accesată de pe un computer client, inclusiv <ph name="URI_SCHEME" />, <ph name="URI_PORT" /> și <ph name="URI_QUEUE" />. <ph name="PRINTER_UUID" /> este opțional. Dacă este specificat, este folosit pentru a deduplica imprimantele <ph name="ZEROCONF_DISCOVERY" />. + + <ph name="PRINTER_EFFECTIVE_MODEL" /> trebuie să conțină numele imprimantei sau <ph name="PRINTER_AUTOCONF" /> trebuie să fie activat. Imprimantele cu ambele proprietăți sau fără niciuna vor fi ignorate. + + Configurarea imprimantei este finalizată la prima folosire a acesteia. Fișierele PPD nu sunt descărcate înainte de folosirea imprimantei. După aceea, PPD-urile folosite frecvent sunt stocate în memoria cache. + + Această politică nu afectează opțiunea utilizatorilor de a configura imprimantele pe dispozitive individuale. Este creată ca o politică suplimentară pentru configurarea imprimantelor de utilizatori individuali. + + Pentru dispozitivele gestionate cu Active Directory, această politică acceptă extinderea <ph name="MACHINE_NAME_VARIABLE" /> la numele computerului din Active Directory sau la un subșir al acestuia. De exemplu, dacă numele computerului este <ph name="MACHINE_NAME_EXAMPLE" />, <ph name="MACHINE_NAME_VARIABLE_EXAMPLE" /> va fi înlocuit de cele patru caractere care urmează după cea de-a șasea poziție, adică <ph name="MACHINE_NAME_PART_EXAMPLE" />. Reține că poziția începe de la zero. + </translation> <translation id="6598235178374410284">Imagine cu avatarul de utilizator</translation> <translation id="6603004149426829878">Trimite întotdeauna semnalele disponibile privind locația către server în timp ce se stabilește fusul orar</translation> <translation id="6628120204569232711">Raportează starea spațiului de stocare</translation> @@ -3377,7 +3412,6 @@ Dacă politica este setată la „RemoveLRUIfDormant”, curățarea automată va continua să elimine utilizatorii care nu s-au conectat în ultimele 3 luni, începând cu cei care s-au conectat de cele mai puține ori recent, până când există suficient spațiu liber. Dacă politica nu este setată, curățarea automată utilizează strategia încorporată în mod prestabilit. În prezent, aceasta este strategia „RemoveLRUIfDormant”.</translation> -<translation id="7334274148831027933">Activează lupa andocată</translation> <translation id="7336785017449297672">Controlează setările de ceas și fus orar.</translation> <translation id="7336878834592315572">Păstrați cookie-urile pe durata sesiunii</translation> <translation id="7339315111520512972">Forțează codul de rețea să ruleze în procesul browserului</translation> @@ -4244,6 +4278,8 @@ <translation id="915194831143859291">Dacă această politică este dezactivată sau nu este configurată, <ph name="PRODUCT_OS_NAME" /> îi va permite utilizatorului să oprească dispozitivul. Dacă această politică este activată, <ph name="PRODUCT_OS_NAME" /> va declanșa o repornire când utilizatorul închide dispozitivul. <ph name="PRODUCT_OS_NAME" /> înlocuiește toate aparițiile butoanelor de închidere din interfața de utilizare cu butoane de repornire. Dacă utilizatorul închide dispozitivul folosind butonul de pornire, acesta nu va reporni automat, chiar dacă politica este activată.</translation> <translation id="9152473318295429890">Activează sugestiile contextuale ale paginilor web asociate</translation> +<translation id="9153446010242995516">Revino la starea anterioară și rămâi la versiunea țintă dacă versiunea sistemului de operare este mai nouă decât ținta. Încearcă să preiei configurația la nivel de dispozitiv (inclusiv acreditările de rețea) prin procesul de revenire, dacă este posibil, dar fă revenirea cu un Powerwash complet, chiar dacă restabilirea datelor nu este posibilă (deoarece versiunea țintă nu acceptă restabilirea datelor sau din cauza unei schimbări care nu acceptă revenirea la starea anterioară). + Se acceptă în versiunea 75 și versiunile ulterioare de <ph name="PRODUCT_OS_NAME" />. Pentru clienții mai vechi, această valoare înseamnă că revenirea este dezactivată.</translation> <translation id="9158929520101169054">Permite conectarea multiplă în browser</translation> <translation id="9159126470527871268">Notifică utilizatorul că <ph name="PRODUCT_NAME" /> trebuie relansat sau <ph name="PRODUCT_OS_NAME" /> trebuie repornit pentru aplicarea unei actualizări în așteptare.
diff --git a/components/policy/resources/policy_templates_ru.xtb b/components/policy/resources/policy_templates_ru.xtb index f337ff90..2ce4acc 100644 --- a/components/policy/resources/policy_templates_ru.xtb +++ b/components/policy/resources/policy_templates_ru.xtb
@@ -143,15 +143,6 @@ Если для политики задано значение false, состояние переключателя dev показываться не будет.</translation> <translation id="1160479894929412407">Разрешить использование протокола QUIC</translation> <translation id="1160939557934457296">Запрет перехода со страницы предупреждения Безопасного просмотра</translation> -<translation id="1171342272070128466">Позволяет включить специальную функцию "Закрепленная лупа". - - Если задано значение True, закрепленная лупа всегда будет активна. - - Если задано значение False, функция будет отключена. - - Если правило настроено, пользователи не могут изменить или перезаписать его. - - Если правило не настроено, лупа будет изначально отключена, но пользователи смогут ее включить.</translation> <translation id="1189817621108632689">Правило позволяет задать список шаблонов URL для сайтов, которым запрещено показывать изображения. Если это правило не настроено, для всех сайтов используется глобальное значение по умолчанию на основе правила DefaultImagesSetting (если оно настроено, в противном случае – на основе пользовательской конфигурации). @@ -1536,11 +1527,6 @@ Если вы укажете значение False, информация о сеансе передаваться не будет. Если вы укажете значение True или оставите поле пустым, информация будет передаваться.</translation> -<translation id="3852924591079583104"> - Когда для этого правила установлено значение ArcSession, устройство будет перезагружаться после выхода пользователя, если запущена система Android. - Когда выбрано значение Always, устройство будет перезагружаться после каждого выхода пользователя из системы. - Если правило не настроено или установлено значение Never, устройство не будет перезагружаться после выхода пользователя. - </translation> <translation id="3858658082795336534">Двусторонняя печать по умолчанию</translation> <translation id="3859780406608282662">Добавляет параметр при загрузке данных о модификации <ph name="PRODUCT_OS_NAME" />. @@ -3357,7 +3343,6 @@ Если задано значение RemoveLRUIfDormant, при автоматической очистке будут удаляться профили пользователей, вход в которые не выполнялся в течение 3 месяцев и более, начиная с самого раннего времени последнего входа, пока не освободится достаточно места. Если значение не задано, будет использоваться режим очистки по умолчанию. В настоящий момент это RemoveLRUIfDormant.</translation> -<translation id="7334274148831027933">Включить закрепленную лупу</translation> <translation id="7336785017449297672">Регулирует настройки часов и часового пояса.</translation> <translation id="7336878834592315572">Хранить файлы cookie до конца сеанса</translation> <translation id="7339315111520512972">Принудительно запускать сетевой код в процессе браузера</translation>
diff --git a/components/policy/resources/policy_templates_sk.xtb b/components/policy/resources/policy_templates_sk.xtb index 90027a0..62c74ad 100644 --- a/components/policy/resources/policy_templates_sk.xtb +++ b/components/policy/resources/policy_templates_sk.xtb
@@ -130,15 +130,6 @@ Ak je toto pravidlo nastavené na hodnotu False, stav prepínača režimu pre vývojárov sa nebude nahlasovať.</translation> <translation id="1160479894929412407">Povoliť protokol QUIC</translation> <translation id="1160939557934457296">Zakázať pokračovanie zo stránky s upozornením Bezpečného prehliadania</translation> -<translation id="1171342272070128466">Umožňuje povoliť funkciu dostupnosti, ktorou je ukotvená lupa. - - Ak toto pravidlo nastavíte na hodnotu true, ukotvená lupa bude vždy povolená. - - Ak ho nastavíte na hodnotu false, ukotvená lupa bude vždy zakázaná. - - Ak toto pravidlo nastavíte, používatelia ho nebudú môcť zmeniť ani prepísať. - - Ak ho ponecháte nenastavené, ukotvená lupa bude počiatočne zakázaná, ale používateľ ju bude môcť kedykoľvek povoliť.</translation> <translation id="1189817621108632689">Umožňuje nastaviť zoznam vzorov webových adries určujúcich weby, ktoré nemôžu zobrazovať obrázky. Ak toto pravidlo ponecháte nenastavené, použije sa v prípade všetkých webov globálna predvolená hodnota buď z pravidla „DefaultImagesSetting“ (ak je nastavené), alebo z osobnej konfigurácie používateľa. @@ -1121,6 +1112,15 @@ Ak toto pravidlo nie je nastavené, správanie konkrétnejších pravidiel nebude ovplyvnené.</translation> <translation id="2987155890997901449">Povoliť funkciu ARC</translation> <translation id="2987227569419001736">Ovládať používanie rozhrania Web Bluetooth API</translation> +<translation id="2990018289267778247">Ak je toto pravidlo nastavené na hodnotu true, v ponuke oblasti oznámení sa vždy zobrazia možnosti dostupnosti. + + Ak je nastavené na hodnotu false, možnosti dostupnosti sa v ponuke oblasti oznámení nikdy nezobrazia. + + Ak toto pravidlo nastavíte, používatelia ho nebudú môcť zmeniť ani prepísať. + + Ak nie je nastavené, možnosti dostupnosti sa v ponuke oblasti oznámení nezobrazia, ale používatelia môžu ich zobrazenie aktivovať na stránke Nastavenia. + + Keď povolíte funkcie dostupnosti (iným spôsobom, napríklad kombináciou klávesov), v ponuke oblasti oznámení sa vždy zobrazia možnosti dostupnosti.</translation> <translation id="3011301228198307065">Konfiguruje predvolenú webovú adresu domovskej stránky prehliadača <ph name="PRODUCT_NAME" /> a zabraňuje používateľom ju zmeniť. Domovská stránka je stránka, ktorá sa otvára tlačidlom Domovská stránka. Stránky, ktoré sa otvoria po spustení, sú ovládané pravidlami RestoreOnStartup. @@ -1443,6 +1443,7 @@ Toto pravidlo využíva registrácia pravidla rozsahu používania cloudu v počítači a je ho možné nastaviť pomocou databázy Registry alebo objektu skupinovej politiky (GPO) v systéme Windows, súboru plist v počítači Mac a súboru s pravidlami JSON v systéme Linux.</translation> <translation id="3660562134618097814">Preniesť súbory cookie poskytovateľa identity SAML počas prihlásenia</translation> <translation id="3701121231485832347">Umožňuje ovládať nastavenia špecifické pre zariadenia <ph name="PRODUCT_OS_NAME" />, ktoré spravuje <ph name="MS_AD_NAME" />.</translation> +<translation id="3702518095257671450">Vzdialená atestácia</translation> <translation id="3702647575225525306"><ph name="POLICY_NAME" /> (Podpora poľa s jedným riadkom bola ukončená a v budúcnosti bude odstránené. Začnite používať textové pole s viacerými riadkami nižšie.)</translation> <translation id="3709266154059827597">Konfigurovať zoznam rozšírení, ktorých inštalácia je zakázaná</translation> <translation id="3711895659073496551">Režim spánku</translation> @@ -1555,11 +1556,6 @@ Ak pravidlo nastavíte na možnosť False, informácie o relácii sa nebudú nahlasovať. Ak ho nastavíte na možnosť True alebo ho nenastavíte, informácie o relácii sa budú nahlasovať.</translation> -<translation id="3852924591079583104"> - Keď toto pravidlo nastavíte na hodnotu ArcSession a je spustený Android, zariadenie sa po odhlásení používateľa reštartuje. - Keď ho nastavíte na hodnotu Vždy, zariadenie sa reštartuje po odhlásení každého používateľa. - Ak pravidlo nenastavíte, nebude platiť a po odhlásení používateľa sa zariadenie nereštartuje. To isté platí aj v prípade nastavenia hodnoty Nikdy. - </translation> <translation id="3858658082795336534">Predvolený režim obojstrannej tlače</translation> <translation id="3859780406608282662">Pridá parameter k načítavaniu kanála Variácie systému <ph name="PRODUCT_OS_NAME" />. @@ -1838,6 +1834,15 @@ Toto pravidlo sa rešpektuje iba v prípade, ak je povolené pravidlo DefaultSearchProviderEnabled.</translation> <translation id="4285674129118156176">Povoliť používať funkciu ARC používateľom, ktorí nie sú partneri</translation> +<translation id="4289903996435140853">Umožňuje nastaviť zoznam webových adries určujúcich weby, ktorým je automaticky udelené povolenie na prístup k zariadeniu USB s príslušnými identifikátormi dodávateľa a výrobku. Pravidlo je platné, keď každá položka v zozname obsahuje zariadenia aj webové adresy. Každá položka v zariadeniach môže obsahovať polia pre identifikátory dodávateľa a výrobku. Každý vynechaný identifikátor sa považuje za zástupný znak s jednou výnimkou, totiž že identifikátor výrobku sa nedá špecifikovať bez toho, aby ste zároveň neuviedli aj identifikátor dodávateľa. Ak to neurobíte, pravidlo bude neplatné a ignorované. + + Model povolení USB udeľuje pomocou adresy webu odosielajúceho žiadosť (žiadajúcej webovej adresy) a adresy rámcového webu najvyššej úrovne (webová adresa vkladania) povolenie žiadajúcej webovej adrese na prístup k zariadeniu USB. Žiadajúca webová adresa sa môže od webovej adresy vkladania líšiť, keď je načítaná v prvku iframe. Pole pre webové adresy môže preto obsahovať až dva reťazce webovej adresy oddelené čiarkou, ktoré špecifikujú žiadajúcu webovú adresu a webovú adresu vkladania. Ak určíte iba jednu webovú adresu, prístup k príslušným zariadeniam USB bude udelený iba vtedy, keď sa adresa webu odosielajúceho žiadosť zhoduje s touto webovou adresu bez ohľadu na stav vloženia. V poli pre webové adresy musíte zadať platné webové adresy, inak bude pravidlo ignorované. + + Ak toto pravidlo nenastavíte, globálna predvolená hodnota sa použije pre všetky weby buď z pravidla DefaultWebUsbGuardSetting (ak je nastavené), alebo osobnou konfiguráciou používateľa. + + Vzory webových adries v tomto pravidle by nemali byť v konflikte s tými, ktoré boli nakonfigurované prostredníctvom pravidla WebUsbBlockedForUrls. Ak sú v konflikte, toto pravidlo bude mať prednosť pred pravidlami WebUsbBlockedForUrls a WebUsbAskForUrls. + + Hodnoty tohto pravidla a pravidla WebUsbAllowDevicesForUrls sa zlúčia.</translation> <translation id="4298509794364745131">Špecifikuje zoznam aplikácií, ktoré môžu byť na uzamknutej obrazovke systému <ph name="PRODUCT_OS_NAME" /> povolené ako aplikácie na písanie poznámok. Ak je na uzamknutej obrazovke povolená preferovaná aplikácia na písanie poznámok, na uzamknutej obrazovke bude prvok používateľského rozhrania na spustenie preferovanej aplikácie na písanie poznámok. @@ -1989,6 +1994,7 @@ <translation id="4639407427807680016">Názvy hostiteľov pre odosielanie natívnych správ, ktorí budú vynechaní zo zoznamu zakázaných položiek</translation> <translation id="4650759511838826572">Zakázať schémy protokolu webovej adresy</translation> <translation id="465099050592230505">Webová adresa Internetového obchodu pre podniky (podpora je ukončená)</translation> +<translation id="4661889655253181651">Nastavenia obsahu umožňujú určiť, akým spôsobom bude spracovávaný obsah určitého typu (napríklad súbory cookie, obrázky alebo JavaScript).</translation> <translation id="4665897631924472251">Nastavenia správy rozšírení</translation> <translation id="4668325077104657568">Predvolené nastavenie obrázkov</translation> <translation id="4670865688564083639">Minimum:</translation> @@ -2033,6 +2039,11 @@ Tieto návrhy sa načítajú vzdialene zo serverov Googlu. Ak toto pravidlo nastavíte na hodnotu false, návrhy sa nenačítajú ani zobrazia.</translation> +<translation id="4759650396863318477">Umožňuje nastaviť časové obdobie v milisekundách, po uplynutí ktorého budú používatelia upozornení, že <ph name="PRODUCT_NAME" /> sa musí znova spustiť alebo že zariadenie so systémom <ph name="PRODUCT_OS_NAME" /> musí byť reštartované, aby sa použila čakajúca aktualizácia. + + V priebehu tohto časového obdobia bude používateľ opakovane informovaný o potrebe aktualizácie. V zariadeniach so systémom<ph name="PRODUCT_OS_NAME" /> sa zobrazí v oblasti oznámení upozornenie na reštartovanie v súlade s pravidlom <ph name="RELAUNCH_HEADS_UP_PERIOD_POLICY_NAME" />. V prípade prehliadačov <ph name="PRODUCT_NAME" /> sa po uplynutí jednej tretiny časového obdobia upozornenia zmení ponuka aplikácie tak, aby oznamovala potrebu opätovného spustenia. Farba upozornenia sa zmení po uplynutí dvoch tretín obdobia a znova po uplynutí celého obdobia. Ďalšie upozornenia povolené pravidlom <ph name="RELAUNCH_NOTIFICATION_POLICY_NAME" /> pre prehliadače dodržiavajú rovnaký rozpis. + + Ak pravidlo nenastavíte, použije sa predvolené obdobie 345 600 000 milisekúnd (štyri dni) pre zariadenia so systémom <ph name="PRODUCT_OS_NAME" /> a 604 800 000 milisekúnd (jeden týždeň) pre prehliadače <ph name="PRODUCT_NAME" />.</translation> <translation id="4788252609789586009">Povolí v prehliadači <ph name="PRODUCT_NAME" /> funkciu Automatické dopĺňanie, ktorá používateľom umožňuje automaticky dopĺňať údaje kreditných kariet do webových formulárov na základe predtým uložených informácií. Ak toto nastavenie deaktivujete, Automatické dopĺňanie nebude nikdy navrhovať ani vyplňovať údaje kreditných kariet ani ukladať informácie o ďalších kartách, ktoré môže používateľ odoslať počas prehliadania webu. @@ -2236,6 +2247,15 @@ Ak toto pravidlo ponecháte nenastavené, použije sa v prípade všetkých webových stránok globálna predvolená hodnota buď z pravidla „DefaultNotificationsSetting“ (ak je nastavené), alebo z osobnej konfigurácie používateľa.</translation> <translation id="5213038356678567351">Weby, ktoré nemajú nikdy spustiť prepnutie prehliadačov</translation> <translation id="5219844027738217407">V prípade aplikácii pre Android toto pravidlo ovplyvňuje iba mikrofón. Keď je toto pravidlo nastavené na hodnotu True, mikrofón je stlmený pre všetky aplikácie pre Android (bez výnimiek).</translation> +<translation id="5221394278852982313">Umožňuje nastaviť zoznam webových adries určujúcich weby, ktorým je automaticky udelené povolenie na prístup k zariadeniu USB s príslušnými identifikátormi dodávateľa a výrobku. Pravidlo je platné, keď každá položka v zozname obsahuje zariadenia aj webové adresy. Každá položka v zariadeniach môže obsahovať polia pre identifikátory dodávateľa a výrobku. Každý vynechaný identifikátor sa považuje za zástupný znak s jednou výnimkou, totiž že identifikátor výrobku sa nedá špecifikovať bez toho, aby ste zároveň neuviedli aj identifikátor dodávateľa. Ak to neurobíte, pravidlo bude neplatné a ignorované. + + Model povolení USB udeľuje pomocou adresy webu odosielajúceho žiadosť (žiadajúcej webovej adresy) a adresy rámcového webu najvyššej úrovne (webová adresa vkladania) povolenie žiadajúcej webovej adrese na prístup k zariadeniu USB. Žiadajúca webová adresa sa môže od webovej adresy vkladania líšiť, keď je načítaná v prvku iframe. Pole pre webové adresy môže preto obsahovať až dva reťazce webovej adresy oddelené čiarkou, ktoré špecifikujú žiadajúcu webovú adresu a webovú adresu vkladania. Ak určíte iba jednu webovú adresu, prístup k príslušným zariadeniam USB bude udelený iba vtedy, keď sa adresa webu odosielajúceho žiadosť zhoduje s touto webovou adresu bez ohľadu na stav vloženia. V poli pre webové adresy musíte zadať platné webové adresy, inak bude pravidlo ignorované. + + Ak toto pravidlo nenastavíte, globálna predvolená hodnota sa použije pre všetky weby buď z pravidla DefaultWebUsbGuardSetting (ak je nastavené), alebo osobnou konfiguráciou používateľa. + + Vzory webových adries v tomto pravidle by nemali byť v konflikte s tými, ktoré boli nakonfigurované prostredníctvom pravidla WebUsbBlockedForUrls. Ak sú v konflikte, toto pravidlo bude mať prednosť pred pravidlami WebUsbBlockedForUrls a WebUsbAskForUrls. + + Hodnoty tohto pravidla a pravidla DeviceWebUsbAllowDevicesForUrls sa zlúčia.</translation> <translation id="5228316810085661003">Oddialenie automatického prihlásenia do miestneho účtu zariadenia. Ak nenastavíte pravidlo |DeviceLocalAccountAutoLoginId|, toto pravidlo bude neúčinné. Inak platí nasledovné: @@ -2964,6 +2984,21 @@ Ak ho nastavíte na možnosť Zakázať používateľom spravovať certifikáty, používatelia nebudú môcť spravovať certifikáty, ale budú si ich môcť zobraziť.</translation> <translation id="6573305661369899995">Nastavenie externého zdroja na obmedzenie webových adries</translation> +<translation id="6583851521569686409">Umožňuje nakonfigurovať zoznam tlačiarní. + + Toto pravidlo umožňuje správcom poskytnúť používateľom konfigurácie + tlačiarní. + + <ph name="PRINTER_DISPLAY_NAME" /> a <ph name="PRINTER_DESCRIPTION" /> sú prispôsobiteľné textové reťazce, pomocou ktorých môžete zjednodušiť výber tlačiarne. Hodnoty <ph name="PRINTER_MANUFACTURER" /> a <ph name="PRINTER_MODEL" /> slúžia na zjednodušenie identifikácie tlačiarní koncovými používateľmi. Predstavujú výrobcu a model tlačiarne. Hodnota <ph name="PRINTER_URI" /> by mala byť adresa dostupná v klientskom počítači vrátane údajov <ph name="URI_SCHEME" />, <ph name="URI_PORT" /> a <ph name="URI_QUEUE" />. Hodnota <ph name="PRINTER_UUID" /> je nepovinná. Ak je zadaná, používa sa na odstraňovanie duplicitných tlačiarní <ph name="ZEROCONF_DISCOVERY" />. + + Hodnota <ph name="PRINTER_EFFECTIVE_MODEL" /> by mala obsahovať názov tlačiarne alebo pravidlo <ph name="PRINTER_AUTOCONF" /> by malo byť nastavené na hodnotu true. Tlačiarne s nastavenými vlastnosťami aj bez nich budú ignorované. + + Nastavenie tlačiarne sa dokončí pri prvom použití. Súbory PPD sa stiahnu až pri použití tlačiarne. Často používané súbory PPD sa následne uložia do vyrovnávacej pamäte. + + Toto pravidlo nemá vplyv na to, či používatelia môžu konfigurovať tlačiarne v jednotlivých zariadeniach. Je určené ako doplnok konfigurácie tlačiarní jednotlivými používateľmi. + + V prípade spravovaných zariadení Active Directory toto pravidlo podporuje rozšírenie premennej <ph name="MACHINE_NAME_VARIABLE" /> na názov zariadenia Active Directory alebo jeho podradený reťazec. Ak je napríklad názov zariadenia <ph name="MACHINE_NAME_EXAMPLE" />, potom bude premenná <ph name="MACHINE_NAME_VARIABLE_EXAMPLE" /> nahradená štyrmi znakmi nasledujúcimi po šiestom mieste, t. j. <ph name="MACHINE_NAME_PART_EXAMPLE" />. Pozície sa počítajú od nuly. + </translation> <translation id="6598235178374410284">Obrázok avatara používateľa</translation> <translation id="6603004149426829878">Počas rozpoznávania časového pásma vždy odosielať všetky dostupné signály polohy na server</translation> <translation id="6628120204569232711">Nahlasovať stav úložiska</translation> @@ -3419,7 +3454,6 @@ Ak sa toto pravidlo nastaví na hodnotu RemoveLRUIfDormant, automatické čistenie bude odstraňovať používateľov, ktorí sa neprihlásili aspoň tri mesiace v poradí od najdlhšie neprihláseného používateľa dovtedy, kým sa neuvoľní dostatok voľného miesta. Ak sa toto pravidlo nenastaví, automatické čistenie použije predvolenú vstavanú stratégiu, ktorá v súčasnosti predstavuje stratégiu RemoveLRUIfDormant.</translation> -<translation id="7334274148831027933">Zapnúť ukotvenú lupu</translation> <translation id="7336785017449297672">Umožňuje ovládať nastavenia hodín a časového pásma.</translation> <translation id="7336878834592315572">Uchovať súbory cookie počas trvania relácie</translation> <translation id="7339315111520512972">Vynútiť spúšťanie kódu siete v procese prehliadača</translation> @@ -4313,6 +4347,8 @@ <translation id="915194831143859291">Ak toto pravidlo nastavíte na možnosť False alebo ho nenakonfigurujete, systém <ph name="PRODUCT_OS_NAME" /> umožní používateľovi vypnúť zariadenie. Ak toto pravidlo nastavíte na možnosť True, systém <ph name="PRODUCT_OS_NAME" /> spustí reštart, keď používateľ vypne zariadenie. <ph name="PRODUCT_OS_NAME" /> nahradí v používateľskom rozhraní všetky výskyty tlačidiel na vypnutie tlačidlami na reštartovanie. Ak teda používateľ vypne zariadenie pomocou vypínača, automaticky sa nereštartuje, a to ani vtedy, keď je toto pravidlo povolené.</translation> <translation id="9152473318295429890">Povoliť kontextové návrhy súvisiacich webových stránok</translation> +<translation id="9153446010242995516">Ak je verzia operačného systému novšia ako cieľová, vráťte sa na cieľovú verziu. Ak je to možné, vyskúšajte v rámci prechodu na nižšiu verziu preniesť konfiguráciu na úrovni zariadenia (vrátane prihlasovacích údajov do siete). Prejdite na nižšiu verziu a vykonajte úplné obnovenie Powerwash, aj keď sa údaje nedajú obnoviť (pretože cieľová verzia nepodporuje obnovu údajov alebo ste vykonali zmenu, ktorá neumožňuje prechod na nižšiu verziu). + Podporované v prehliadači <ph name="PRODUCT_OS_NAME" /> verzie 75 a novšej. V prípade starších klientov táto hodnota znamená, že prechod na nižšiu verziu je zakázaný.</translation> <translation id="9158929520101169054">Povoliť viacnásobné prihlásenie v rámci prehliadača</translation> <translation id="9159126470527871268">Umožňuje používateľov upozorniť, že <ph name="PRODUCT_NAME" /> musia znova spustiť alebo <ph name="PRODUCT_OS_NAME" /> reštartovať, aby sa použila čakajúca aktualizácia.
diff --git a/components/policy/resources/policy_templates_sl.xtb b/components/policy/resources/policy_templates_sl.xtb index 57fa8ee..768d51fc 100644 --- a/components/policy/resources/policy_templates_sl.xtb +++ b/components/policy/resources/policy_templates_sl.xtb
@@ -144,15 +144,6 @@ Če je pravilnik nastavljen na »False«, se o stanju stikala za razvijalce ne poroča.</translation> <translation id="1160479894929412407">Dovoli protokol QUIC</translation> <translation id="1160939557934457296">Onemogoči nadaljevanje z opozorilne strani varnega brskanja</translation> -<translation id="1171342272070128466">Omogočanje funkcije zasidrane lupe za ljudi s posebnimi potrebami. - - Če je ta pravilnik omogočen, je zasidrana lupa vedno omogočena. - - Če je pravilnik onemogočen, je zasidrana lupa vedno onemogočena. - - Če nastavite ta pravilnik, ga uporabniki ne morejo spremeniti ali preglasiti. - - Če tega pravilnika ne nastavite, je zasidrana lupa prvotno onemogočena, vendar jo lahko uporabnik kadar koli omogoči.</translation> <translation id="1189817621108632689">Omogoča nastavitev seznama vzorcev URL-jev, s katerim so določena spletna mesta, ki jim ni dovoljeno prikazovati slik. Če ta pravilnik ni nastavljen, bo za vsa spletna mesta uporabljena globalna privzeta vrednost iz pravilnika »DefaultImagesSetting«, kadar je ta pravilnik nastavljen, sicer pa iz osebnih nastavitev uporabnika. @@ -1147,6 +1138,15 @@ Če ta pravilnik ni nastavljen, to ne vpliva na delovanje podrobnejših pravilnikov.</translation> <translation id="2987155890997901449">Omogočanje ARC-ja</translation> <translation id="2987227569419001736">Nadzor uporabe API-ja za Web Bluetooth</translation> +<translation id="2990018289267778247">Če je pravilnik nastavljen na »true«, so možnosti funkcij za ljudi s posebnimi potrebami vedno prikazane v meniju sistemske vrstice. + + Če je pravilnik nastavljen na »false«, možnosti funkcij za ljudi s posebnimi potrebami niso prikazane v meniju sistemske vrstice. + + Če nastavite ta pravilnik, ga uporabniki ne morejo spremeniti ali preglasiti. + + Če ta pravilnik ni nastavljen, možnosti funkcij za ljudi s posebnimi potrebami niso prikazane v meniju sistemske vrstice, vendar lahko uporabniki nastavijo, da so možnosti funkcij za ljudi s posebnimi potrebami prikazane prek strani z nastavitvami. + + Če so omogočene funkcije za ljudi s posebnimi potrebami (na druge načine, na primer s kombinacijo tipk), so možnosti funkcij za ljudi s posebnimi potrebami vedno prikazane v meniju sistemske vrstice.</translation> <translation id="3011301228198307065">Konfigurira privzeti URL domače strani za brskalnik <ph name="PRODUCT_NAME" /> in uporabnikom prepreči, da bi ga spreminjali. Domača stran je stran, ki se odpre ob kliku gumba »Domača stran«. Strani, ki se odprejo ob zagonu, določajo pravilniki RestoreOnStartup. @@ -1470,6 +1470,7 @@ Ta pravilnik uporablja včlanitev v pravilnik oblaka v obsegu naprave v namiznem računalniku in ga je mogoče nastaviti prek registra ali pravilnika skupine v sistemu Windows, prek datoteke plist v sistemu macOS in datoteke pravilnika v obliki zapisa JSON v Linuxu.</translation> <translation id="3660562134618097814">Prenesi piškotke SAML IdP pri prijavi</translation> <translation id="3701121231485832347">Nadzira nastavitve za naprave s sistemom <ph name="PRODUCT_OS_NAME" />, ki jih upravlja <ph name="MS_AD_NAME" />.</translation> +<translation id="3702518095257671450">Potrditev na daljavo</translation> <translation id="3702647575225525306"><ph name="POLICY_NAME" /> (Enovrstično polje je zastarelo in bo v prihodnje odstranjeno. Začnite uporabljati večvrstično besedilno polje spodaj.)</translation> <translation id="3709266154059827597">Nastavi seznam razširitev, katerih namestitev je prepovedana</translation> <translation id="3711895659073496551">Prekinitev</translation> @@ -1582,11 +1583,6 @@ Če je pravilnik onemogočen, se podatki o seji kioska ne poročajo. Če je omogočen ali ni nastavljen, se podatki o seji kioska poročajo.</translation> -<translation id="3852924591079583104"> - Če je ta pravilnik nastavljen na ArcSession, napravo prisili, da se znova zažene ob odjavi uporabnika, če se je zagnal Android. - Če je ta pravilnik nastavljen na »Vedno«, napravo prisili, da se znova zažene ob vsaki odjavi uporabnika. - Če pravilnik ni nastavljen, nima učinka in ob odjavi uporabnika ni vsiljen vnovični zagon. Isto velja, če je nastavljen na »Nikoli«. - </translation> <translation id="3858658082795336534">Privzeto obojestransko tiskanje</translation> <translation id="3859780406608282662">Dodajanje parametra prejemanju semen različic v izdelku <ph name="PRODUCT_OS_NAME" />. @@ -1872,6 +1868,15 @@ Ta pravilnik se upošteva samo, če je omogočen pravilnik »DefaultSearchProviderEnabled«.</translation> <translation id="4285674129118156176">Omogočanje uporabe ARC-ja nepovezanim uporabnikom</translation> +<translation id="4289903996435140853">Omogoča nastavitev seznama URL-jev, ki določajo, katerim spletnim mestom bo samodejno podeljeno dovoljenje za dostop do naprave USB z danim ID-jem izdelka in dobavitelja. Pravilnik je veljaven samo, če vsak element na seznamu vsebuje tako naprave kot tudi URL-je. Vsak element v napravah lahko vsebuje polje z ID-jem dobavitelja in ID-jem izdelka. Vsak izpuščen ID se obravnava kot nadomestni znak z eno izjemo, in sicer, da ID izdelka ne more biti naveden, ne da bi bil naveden tudi ID dobavitelja. Pravilnik sicer ne bo veljaven in bo prezrt. + + Model dovoljenj za USB uporablja URL spletnega mesta, ki pošlje zahtevo (»URL z zahtevo«), in URL spletnega mesta z vrhnjim okvirjem (»URL za vdelavo«), da URL-ju z zahtevo podeli dovoljenje za dostop do naprave USB. URL z zahtevo se lahko razlikuje od URL-ja za vdelavo, če je stran, ki pošilja zahtevo, naložena v okviru iframe. Polje »urls« lahko tako vsebuje do dva niza z URL-jem, ločena z vejico, ki določata URL z zahtevo oziroma URL za vdelavo. Če je naveden samo en URL, bo dostop do ustreznih naprav USB podeljen, ko se URL spletnega mesta, ki pošilja zahtevo, ujema s tem URL-jem, ne glede na stanje vdelave. URL-ji v polju »urls« morajo biti veljavni URL-ji, sicer se pravilnik prezre. + + Če ta pravilnik ni nastavljen, se za vsa spletna mesta uporabi globalna privzeta vrednost iz pravilnika »DefaultWebUsbGuardSetting«, če je nastavljen, sicer pa iz uporabnikove osebne konfiguracije. + + Vzorci URL-jev v tem pravilniku ne smejo biti v navzkrižju s tistimi, ki so konfigurirani prek pravilnika WebUsbBlockedForUrls. V primeru navzkrižja ima ta pravilnik prednost pred pravilnikoma WebUsbBlockedForUrls in WebUsbAskForUrls. + + Vrednosti za ta pravilnik in pravilnik WebUsbAllowDevicesForUrls so združene.</translation> <translation id="4298509794364745131">Določa seznam aplikacij, ki jih je mogoče omogočiti kot aplikacije za zapiske na zaklenjenem zaslonu sistema <ph name="PRODUCT_OS_NAME" />. Če je prednostna aplikacija za zapiske omogočena na zaklenjenem zaslonu, je na njem element uporabniškega vmesnika za zagon te aplikacije. @@ -2023,6 +2028,7 @@ <translation id="4639407427807680016">Imena gostiteljev izvornega pošiljanja sporočil, ki se ne vključijo na seznam blokiranih</translation> <translation id="4650759511838826572">Onemogoči protokolne sheme URL-ja</translation> <translation id="465099050592230505">URL spletne trgovine podjetja (zastarelo)</translation> +<translation id="4661889655253181651">Z nastavitvami vsebine lahko določite, kako se obravnava vsebina različnih vrst (npr. piškotki, slike ali JavaScript).</translation> <translation id="4665897631924472251">Nastavitve upravljanja razširitev</translation> <translation id="4668325077104657568">Nastavitev privzetih slik</translation> <translation id="4670865688564083639">Najmanj:</translation> @@ -2067,6 +2073,11 @@ Ti predlogi se prenesejo oddaljeno iz Googlovih strežnikov. Če je ta nastavitev onemogočena, se predlogi ne bodo prenesli ali prikazali.</translation> +<translation id="4759650396863318477">Omogoči nastavitev časovnega obdobja v milisekundah, v katerem so uporabniki obveščeni, da mora biti brskalnik <ph name="PRODUCT_NAME" /> znova zagnan ali da mora biti naprava <ph name="PRODUCT_OS_NAME" /> znova zagnana za uveljavitev čakajoče posodobitve. + + V tem časovnem obdobju je uporabnik večkrat obveščen glede potrebe po posodobitvi. V skladu s pravilnikom <ph name="RELAUNCH_HEADS_UP_PERIOD_POLICY_NAME" /> se za naprave <ph name="PRODUCT_OS_NAME" /> v sistemski vrstici pojavi obvestilo o vnovičnem zagonu. Za brskalnike <ph name="PRODUCT_NAME" /> se meni aplikacije spremeni, da ponazori, da je potreben vnovični zagon, ko mine ena tretjina obdobja za obveščanje. Barva tega obvestila se spremeni, ko mineta dve tretjini obdobja za obveščanje, in znova, ko mine celotno obdobje za obveščanje. Za dodatna obvestila, ki jih je omogočil pravilnik <ph name="RELAUNCH_NOTIFICATION_POLICY_NAME" />, prav tako velja ta pravilnik. + + Če pravilnik ni nastavljen, se za naprave <ph name="PRODUCT_OS_NAME" /> kot privzeto časovno obdobje uporabi 345.600.000 milisekund (štirje dnevi), za brskalnike <ph name="PRODUCT_NAME" /> pa 604.800.000 milisekund (en teden).</translation> <translation id="4788252609789586009">Omogoči funkcijo za samodejno izpolnjevanje v brskalniku <ph name="PRODUCT_NAME" /> in uporabnikom omogoča samodejno izpolnjevanje podatkov o kreditni kartici v spletnih obrazcih s predhodno shranjenimi podatki. Če je ta nastavitev onemogočena, samodejno izpolnjevanje ne bo nikoli predlagalo ali vneslo podatkov o kreditni kartici in prav tako ne bo shranilo dodatnih podatkov o kreditni kartici, ki jih uporabnik lahko pošlje med brskanjem v spletu. @@ -2277,6 +2288,15 @@ Če ta pravilnik ni nastavljen, bo za vsa spletna mesta uporabljena splošna privzeta vrednost iz pravilnika »DefaultNotificationsSetting«, kadar je ta nastavljen, ali iz uporabnikove osebne konfiguracije, kadar pravilnik »DefaultImagesSetting« ni nastavljen.</translation> <translation id="5213038356678567351">Spletna mesta, ki naj nikoli ne sprožijo preklopa brskalnika.</translation> <translation id="5219844027738217407">Pri aplikacijah za Android ta pravilnik vpliva samo na mikrofon. Če je ta pravilnik omogočen, ima mikrofon brez izjem izklopljen zvok pri vseh aplikacijah za Android.</translation> +<translation id="5221394278852982313">Omogoča nastavitev seznama URL-jev, ki določajo, katerim spletnim mestom bo samodejno podeljeno dovoljenje za dostop do naprave USB z danim ID-jem izdelka in dobavitelja. Pravilnik je veljaven samo, če vsak element na seznamu vsebuje tako naprave kot tudi URL-je. Vsak element v napravah lahko vsebuje polje z ID-jem dobavitelja in ID-jem izdelka. Vsak izpuščen ID se obravnava kot nadomestni znak z eno izjemo, in sicer, da ID izdelka ne more biti naveden, ne da bi bil naveden tudi ID dobavitelja. Pravilnik sicer ne bo veljaven in bo prezrt. + + Model dovoljenj za USB uporablja URL spletnega mesta, ki pošlje zahtevo (»URL z zahtevo«), in URL spletnega mesta z vrhnjim okvirjem (»URL za vdelavo«), da URL-ju z zahtevo podeli dovoljenje za dostop do naprave USB. URL z zahtevo se lahko razlikuje od URL-ja za vdelavo, če je stran, ki pošilja zahtevo, naložena v okviru iframe. Polje »urls« lahko tako vsebuje do dva niza z URL-jem, ločena z vejico, ki določata URL z zahtevo oziroma URL za vdelavo. Če je naveden samo en URL, bo dostop do ustreznih naprav USB podeljen, ko se URL spletnega mesta, ki pošilja zahtevo, ujema s tem URL-jem, ne glede na stanje vdelave. URL-ji v polju »urls« morajo biti veljavni URL-ji, sicer se pravilnik prezre. + + Če ta pravilnik ni nastavljen, se za vsa spletna mesta uporabi globalna privzeta vrednost iz pravilnika »DefaultWebUsbGuardSetting«, če je nastavljen, sicer pa iz uporabnikove osebne konfiguracije. + + Vzorci URL-jev v tem pravilniku ne smejo biti v navzkrižju s tistimi, ki so konfigurirani prek pravilnika WebUsbBlockedForUrls. V primeru navzkrižja ima ta pravilnik prednost pred pravilnikoma WebUsbBlockedForUrls in WebUsbAskForUrls. + + Vrednosti za ta pravilnik in pravilnik DeviceWebUsbAllowDevicesForUrls so združene.</translation> <translation id="5228316810085661003">Zamik samodejne prijave v lokalni račun v napravi. Če pravilnik |DeviceLocalAccountAutoLoginId| ni nastavljen, ta pravilnik nima vpliva. V nasprotnem primeru: @@ -3021,6 +3041,21 @@ Če je ta pravilnik nastavljen na »Uporabnikom ne dovoli upravljanja potrdil«, uporabniki ne bodo mogli upravljati potrdil, temveč si jih bodo lahko samo ogledali.</translation> <translation id="6573305661369899995">Nastavitev zunanjega vira omejitev za URL-je</translation> +<translation id="6583851521569686409">Konfigurira seznam tiskalnikov. + + Ta pravilnik skrbnikom omogoča navajanje konfiguracij tiskalnikov + za uporabnike. + + <ph name="PRINTER_DISPLAY_NAME" /> in <ph name="PRINTER_DESCRIPTION" /> sta poljubno oblikovana niza, ki ju je mogoče prilagoditi za preprostejše izbiranje tiskalnika. <ph name="PRINTER_MANUFACTURER" /> in <ph name="PRINTER_MODEL" /> končnim uporabnikom olajšata prepoznavo tiskalnika, saj predstavljata proizvajalca in model tiskalnika. <ph name="PRINTER_URI" /> mora biti naslov, do katerega je mogoče dostopati iz odjemalskega računalnika, vključno s temi podatki: <ph name="URI_SCHEME" />, <ph name="URI_PORT" /> in <ph name="URI_QUEUE" />. Identifikator <ph name="PRINTER_UUID" /> ni obvezen. Če je naveden, se uporablja za odstranjevanje podvojenih tiskalnikov <ph name="ZEROCONF_DISCOVERY" />. + + <ph name="PRINTER_EFFECTIVE_MODEL" /> mora vsebovati ime tiskalnika ali mora biti <ph name="PRINTER_AUTOCONF" /> omogočen. Tiskalniki z obema lastnostma ali brez lastnosti bodo prezrti. + + Nastavitev tiskalnika je dokončana ob prvi uporabi tiskalnika. Datoteke PPD se ne prenesejo, dokler se tiskalnik ne uporablja. Po tem se pogosto uporabljene datoteke PPD predpomnijo. + + Ta pravilnik ne vpliva na to, ali lahko uporabniki konfigurirajo tiskalnike v posameznih napravah. Namenjen je kot dodatek konfiguracijam tiskalnikov, ki jih opravijo posamezni uporabniki. + + Za naprave, ki jih upravlja Active Directory, ta pravilnik podpira razširitev <ph name="MACHINE_NAME_VARIABLE" /> na ime naprave za Active Directory ali njegov podniz. Če je ime naprave na primer <ph name="MACHINE_NAME_EXAMPLE" />, potem <ph name="MACHINE_NAME_VARIABLE_EXAMPLE" /> zamenjajo 4 znaki po 6. mestu, tj. <ph name="MACHINE_NAME_PART_EXAMPLE" />. Položaj temelji na ničli. + </translation> <translation id="6598235178374410284">Slika za avatar uporabnika</translation> <translation id="6603004149426829878">Vedno pošlji vse razpoložljive signale lokacije v strežnik pri določanju časovnega pasu</translation> <translation id="6628120204569232711">Poročanje o stanju shrambe</translation> @@ -3477,7 +3512,6 @@ Če je ta pravilnik nastavljen na »RemoveLRUIfDormant«, bo samodejno čiščenje odstranjevalo uporabnike, ki se niso prijavili vsaj tri mesece. Nato bodo odstranjeni uporabniki z naslednjim najdaljšim časom od zadnje prijave. Odstranjevanje se bo končalo takoj, ko bo na voljo dovolj prostora. Če ta pravilnik ni nastavljen, samodejno čiščenje uporablja privzeto vgrajeno strategijo. Trenutno je to strategija »RemoveLRUIfDormant«.</translation> -<translation id="7334274148831027933">Omogoči zasidrano lupo</translation> <translation id="7336785017449297672">Nadzira nastavitve ure in časovnega pasu.</translation> <translation id="7336878834592315572">Ohrani piškotke za obdobje trajanja seje</translation> <translation id="7339315111520512972">Vsili izvajanje omrežne kode v procesu brskalnika</translation> @@ -4387,6 +4421,8 @@ <translation id="915194831143859291">Če je ta pravilnik onemogočen ali ni nastavljen, bo <ph name="PRODUCT_OS_NAME" /> uporabniku dovolil zaustaviti napravo. Če je ta pravilnik omogočen, bo <ph name="PRODUCT_OS_NAME" /> sprožil vnovični zagon, ko uporabnik zaustavi napravo. <ph name="PRODUCT_OS_NAME" /> nadomesti vse gumbe za zaustavitev v uporabniškem vmesniku z gumbi za vnovični zagon. Če uporabnik zaustavi napravo z gumbom za vklop, se naprava ne bo samodejno zagnala znova, tudi če je pravilnik omogočen.</translation> <translation id="9152473318295429890">Omogočeni kontekstni predlogi sorodnih spletnih strani</translation> +<translation id="9153446010242995516">Povrnite na ciljno različico in ostanite na njej, če je različica operacijskega sistema novejša kot ciljna. S povrnitvijo poskusite prenesti konfiguracijo na ravni naprave (vključno z omrežnimi poverilnicami), če je to mogoče, vendar ne izvedite povrnitve s popolnim Powerwashem, tudi če obnovitev podatkov ni mogoča (ker ciljna različica ne podpira obnovitve podatkov ali zaradi spremembe, ki ni združljiva s prejšnjo različico). + Podprto v brskalniku <ph name="PRODUCT_OS_NAME" /> različice 75 in novejših. Pri starejših odjemalcih ta vrednost pomeni, da je povrnitev onemogočena.</translation> <translation id="9158929520101169054">Omogočanje prijave z več računi v brskalniku</translation> <translation id="9159126470527871268">Obvesti uporabnike, da je treba zaradi uveljavitve posodobitve na čakanju znova zagnati brskalnik <ph name="PRODUCT_NAME" /> ali napravo <ph name="PRODUCT_OS_NAME" />.
diff --git a/components/policy/resources/policy_templates_sr.xtb b/components/policy/resources/policy_templates_sr.xtb index 1f51f05..3f5ac5de 100644 --- a/components/policy/resources/policy_templates_sr.xtb +++ b/components/policy/resources/policy_templates_sr.xtb
@@ -141,15 +141,6 @@ Ако се ова смерница подеси на false, неће се пријављивати стање програмерског прекидача.</translation> <translation id="1160479894929412407">Дозвољавају QUIC протокол</translation> <translation id="1160939557934457296">Онемогућавање наставка са странице са упозорењем Безбедног прегледања</translation> -<translation id="1171342272070128466">Омогућавају функцију приступачности монтиране лупе екрана. - - Ако ове смернице подесите на Тачно, монтирана лупа екрана ће увек бити омогућена. - - Ако ове смернице подесите на Нетачно, монтирана лупа екрана ће увек бити онемогућена. - - Ако подесите ове смернице, корисници не могу да их измене нити замене. - - Ако не подесите ове смернице, монтирана лупа екрана ће на почетку бити онемогућена, али корисници ће моћи да је омогуће у било ком тренутку.</translation> <translation id="1189817621108632689">Омогућавају вам да подесите листу URL образаца који наводе сајтове којима није дозвољено да приказују слике. Ако не подесите ове смернице, за све сајтове се користи глобална подразумевана вредност из смерница „DefaultImagesSetting“, ако су подешене, а ако нису, користи се она из личне конфигурације корисника. @@ -1121,6 +1112,15 @@ Ако не подесите ове смернице, понашање конкретнијих смерница остаје непромењено.</translation> <translation id="2987155890997901449">Омогући ARC</translation> <translation id="2987227569419001736">Контролиши коришћење API-ја Bluetooth за веб</translation> +<translation id="2990018289267778247">Ако подесите ове смернице на Тачно, опције приступачности ће се увек приказивати у менију системске палете. + + Ако подесите ове смернице на Нетачно, опције приступачности се никада неће приказивати у менију системске палете. + + Ако подесите ове смернице, корисници не могу да их промене нити замене. + + Ако не подесите ове смернице, опције приступачности се неће приказивати у менију системске палете, али корисник може да подеси да се опције приступачности приказују преко странице Подешавања. + + Када су омогућене функције приступачности (на неки други начин, на пример, помоћу комбинације тастера), опције приступачности ће се увек приказивати у менију системске палете.</translation> <translation id="3011301228198307065">Конфигуришу URL подразумеване почетне странице у <ph name="PRODUCT_NAME" />-у и спречавају кориснике да га промене. Почетна страница је страница која се отвара помоћу дугмета Почетна. Смернице RestoreOnStartup контролишу странице које се отварају при покретању. @@ -1437,6 +1437,7 @@ Те смернице се користе за регистрацију на клауд за опсег уређаја на рачунарима и у систему Windows могу да их подесе Регистар или Објекат смерница групе, plist u систему Mac и JSON датотека смерница у систему Linux.</translation> <translation id="3660562134618097814">Преноси SAML IdP колачиће током пријављивања</translation> <translation id="3701121231485832347">Контролишу подешавања за <ph name="PRODUCT_OS_NAME" /> уређаје којима управља <ph name="MS_AD_NAME" />.</translation> +<translation id="3702518095257671450">Даљинска потврда</translation> <translation id="3702647575225525306"><ph name="POLICY_NAME" /> (Поље са једном линијом је застарело и биће уклоњено. Почните да користите вишелинијски текстуални оквир у наставку.)</translation> <translation id="3709266154059827597">Конфигуриши црну листу за инсталацију додатака</translation> <translation id="3711895659073496551">Искључи</translation> @@ -1549,11 +1550,6 @@ Ако подесите смернице на Нетачно, информације о сесији се не шаљу. Ако подесите смернице на Тачно или их не подесите, информације о сесији се шаљу.</translation> -<translation id="3852924591079583104"> - Ове смернице, када су подешене на ArcSession, приморавају уређај да се рестартује када се корисник одјави ако је Android покренут. - Када су подешене на Увек, приморавају уређај да се рестартује после сваког одјављивања корисника. - Ако их не подесите, немају никакав утицај и неће бити принудног рестартовања после одјављивања корисника. Исто важи и ако их подесите на Никад. - </translation> <translation id="3858658082795336534">Подразумевани режим обостраног штампања</translation> <translation id="3859780406608282662">Додају параметар преузимању Почетне вредности варијација у производу <ph name="PRODUCT_OS_NAME" />. @@ -1838,6 +1834,15 @@ Производи се придржавају ових смерница само ако су омогућене смернице „DefaultSearchProviderEnabled“.</translation> <translation id="4285674129118156176">Дозвољавају неповезаним корисницима да користе ARC</translation> +<translation id="4289903996435140853">Омогућавају вам да подесите листу URL-ова који наводе сајтове којима ће се аутоматски дати дозвола за приступ USB уређају са наведеним ИД-ом добављача и ИД-ом производа. Свака ставка на листи мора да садржи и уређаје и URL-ове да би смернице биле важеће. Свака ставка за уређаје може да садржи поље за ИД добављача и ИД производа. Сваки изостављени ИД се сматра џокерским знаком са једним изузетком, а тај изузетак је да ИД производа не може да се наведе без навођења ИД-а добављача. У супротном ове смернице неће бити важеће и занемариће се. + + Модел дозволе за USB користи URL сајта који шаље захтев („URL који шаље захтев“) и URL сајта са оквиром највишег нивоа („URL који се уграђује“) да би дозволио да URL који шаље захтев приступа USB уређају. URL који шаље захтев може да се разликује од URL-а који се уграђује када се сајт који шаље захтев учитава у iframe-у. Због тога поље „URL-ови“ може да садржи највише два URL низа раздвојена зарезом да би се одредио URL који шаље захтев и URL који се уграђује. Ако се наведе само један URL, приступ одговарајућим USB уређајима ће се одобрити када се URL сајта који шаље захтев подудара са тим URL-ом, без обзира на статус уграђивања. URL-ови у пољу „URL-ови“ морају да буду важећи јер се, у супротном, смернице занемарују. + + Ако не подесите ове смернице, за све сајтове користиће се глобална подразумевана вредност из смерница „DefaultWebUsbGuardSetting“ ако су подешене или из личне корисничке конфигурације. + + URL обрасци у овим смерницама не треба да буду у сукобу са онима који су конфигурисани помоћу смерница WebUsbBlockedForUrls. Ако дође до сукоба, ове смернице ће имати приоритет у односу на смернице WebUsbBlockedForUrls и WebUsbAskForUrls. + + Вредности смерница WebUsbAllowDevicesForUrls и ових смерница су обједињене.</translation> <translation id="4298509794364745131">Наводе листу апликација које могу да се омогуће као апликације за прављење белешки на закључаном екрану за <ph name="PRODUCT_OS_NAME" />. Ако је жељена апликација за прављење белешки омогућена на закључаном екрану, он ће садржати елемент корисничког интерфејса за покретање те апликације. @@ -1989,6 +1994,7 @@ <translation id="4639407427807680016">Имена хостова за изворну размену порука које треба изузети са црне листе</translation> <translation id="4650759511838826572">Онемогући шеме URL протокола</translation> <translation id="465099050592230505">URL веб-продавнице предузећа (застарело је)</translation> +<translation id="4661889655253181651">Подешавања садржаја омогућавају вам да наведете како се поступа са садржајем одређеног типа (на пример, колачићима, сликама и JavaScript-ом).</translation> <translation id="4665897631924472251">Подешавања управљања додацима</translation> <translation id="4668325077104657568">Подразумевано подешавање слика</translation> <translation id="4670865688564083639">Најмање:</translation> @@ -2033,6 +2039,11 @@ Ови предлози се даљински преузимају са Google сервера. Ако се ово подешавање подеси на „нетачно“, предлози се не преузимају и не приказују.</translation> +<translation id="4759650396863318477">Омогућавају подешавање временског периода, у милисекундама, током ког корисници добијају обавештење да морају поново да покрену <ph name="PRODUCT_NAME" /> или да рестартују <ph name="PRODUCT_OS_NAME" /> уређај да би применили ажурирање на чекању. + + Током овог временског периода корисник редовно добија обавештења о потребном ажурирању. На <ph name="PRODUCT_OS_NAME" /> уређајима обавештење о рестартовању се појављује на системској палети у складу са смерницама за: <ph name="RELAUNCH_HEADS_UP_PERIOD_POLICY_NAME" />. У <ph name="PRODUCT_NAME" /> прегледачима се по истеку једне трећине периода за приказ обавештења мења мени апликације да би се указало на то да је потребно поновно покретање. Ово обавештење мења боју када прође половина периода за приказ обавештења и још једном када прође читав тај период. Исти распоред прате додатна обавештења која омогуће смернице за: <ph name="RELAUNCH_NOTIFICATION_POLICY_NAME" />. + + Ако смернице нису подешене, користи се подразумевани период од 345.600.000 милисекунди (четири дана) за <ph name="PRODUCT_OS_NAME" /> уређаје и 604.800.000 милисекунди (недељу дана) за прегледаче <ph name="PRODUCT_NAME" />.</translation> <translation id="4788252609789586009">Омогућавају функцију Аутоматско попуњавање у <ph name="PRODUCT_NAME" />-у и омогућавају корисницима да аутоматски довршавају податке о кредитној картици у веб-обрасцима помоћу раније сачуваних података. Ако је ово подешавање онемогућено, Аутоматско попуњавање никада неће предлагати или попуњавати податке о кредитној картици нити ће чувати додатне податке о кредитној картици које корисник може да пошаље док прегледа веб. @@ -2237,6 +2248,15 @@ Ако ове смернице нису подешене, глобална подразумевана вредност биће коришћена за све сајтове из смерница „DefaultNotificationsSetting“, уколико су оне подешене, а ако нису, из личне конфигурације корисника.</translation> <translation id="5213038356678567351">Веб-сајтови који никада не треба да покрећу промену прегледача.</translation> <translation id="5219844027738217407">У случају Android апликација, ове смернице утичу само на микрофон. Када се ове смернице подесе на „тачно“, искључен је звук микрофона за све Android апликације, без изузетака.</translation> +<translation id="5221394278852982313">Омогућавају вам да подесите листу URL-ова који наводе сајтове којима ће се аутоматски дати дозвола за приступ USB уређају са наведеним ИД-ом добављача и ИД-ом производа. Свака ставка на листи мора да садржи и уређаје и URL-ове да би смернице биле важеће. Свака ставка за уређаје може да садржи поље за ИД добављача и ИД производа. Сваки изостављени ИД се сматра џокерским знаком са једним изузетком, а тај изузетак је да ИД производа не може да се наведе без навођења ИД-а добављача. У супротном ове смернице неће бити важеће и занемариће се. + + Модел дозволе за USB користи URL сајта који шаље захтев („URL који шаље захтев“) и URL сајта са оквиром највишег нивоа („URL који се уграђује“) да би дозволио да URL који шаље захтев приступа USB уређају. URL који шаље захтев може да се разликује од URL-а који се уграђује када се сајт који шаље захтев учитава у iframe-у. Због тога поље „URL-ови“ може да садржи највише два URL низа раздвојена зарезом да би се одредио URL који шаље захтев и URL који се уграђује. Ако се наведе само један URL, приступ одговарајућим USB уређајима ће се одобрити када се URL сајта који шаље захтев подудара са тим URL-ом, без обзира на статус уграђивања. URL-ови у пољу „URL-ови“ морају да буду важећи јер се, у супротном, смернице занемарују. + + Ако не подесите ове смернице, за све сајтове користиће се глобална подразумевана вредност из смерница „DefaultWebUsbGuardSetting“ ако су подешене или из личне корисничке конфигурације. + + URL обрасци у овим смерницама не треба да буду у сукобу са онима који су конфигурисани помоћу смерница WebUsbBlockedForUrls. Ако дође до сукоба, ове смернице ће имати приоритет у односу на смернице WebUsbBlockedForUrls и WebUsbAskForUrls. + + Вредности смерница DeviceWebUsbAllowDevicesForUrls и ових смерница су обједињене.</translation> <translation id="5228316810085661003">Одлагање аутоматског пријављивања на локални налог на уређају. Ако не подесите смернице |DeviceLocalAccountAutoLoginId|, ове смернице немају никаквог утицаја. У супротном: @@ -2972,6 +2992,21 @@ Ако су смернице подешене на „Онемогући корисницима да управљају сертификатима“, корисници неће моћи да управљају сертификатима, већ ће само моћи да их прегледају.</translation> <translation id="6573305661369899995">Подешавају спољни извор ограничења за URL-ове</translation> +<translation id="6583851521569686409">Конфигуришу листу штампача. + + Ове смернице омогућавају администраторима да корисницима пруже + конфигурације штампача. + + <ph name="PRINTER_DISPLAY_NAME" /> и <ph name="PRINTER_DESCRIPTION" /> су стрингови слободног облика који могу да се прилагоде ради једноставног бирања штампача. <ph name="PRINTER_MANUFACTURER" /> и <ph name="PRINTER_MODEL" /> омогућавају крајњим корисницима да једноставније идентификују штампач. Представљају произвођача и модел штампача. <ph name="PRINTER_URI" /> треба да буде адреса која је доступна рачунару клијента, укључујући <ph name="URI_SCHEME" />, <ph name="URI_PORT" /> и <ph name="URI_QUEUE" />. Вредност <ph name="PRINTER_UUID" /> је опционална. Ако је наведена, користи се за поништавање дупликата штампача <ph name="ZEROCONF_DISCOVERY" />. + + Или <ph name="PRINTER_EFFECTIVE_MODEL" /> треба да садржи назив штампача или <ph name="PRINTER_AUTOCONF" /> треба да се подеси на Тачно. Штампачи са оба својства или без иједног својства се занемарују. + + Подешавање штампача се завршава при првом коришћењу штампача. PPD датотеке се не преузимају пре коришћења штампача. Често коришћене PPD датотеке се кеширају после тога. + + Ове смернице не утичу на могућност корисника да конфигуришу штампаче на појединачним уређајима. Служе као додатак конфигурацији штампача од стране појединачних корисника. + + Када су у питању уређаји којима управља домен Active Directory, ове смернице подржавају проширивање назива уређаја <ph name="MACHINE_NAME_VARIABLE" /> у Active Directory назив уређаја или његов подстринг. На пример, ако је назив уређаја <ph name="MACHINE_NAME_EXAMPLE" />, онда се назив <ph name="MACHINE_NAME_VARIABLE_EXAMPLE" /> мења са 4 знака која почињу после 6. места, тј.<ph name="MACHINE_NAME_PART_EXAMPLE" />. Имајте на уму да бројање места почиње од нуле. + </translation> <translation id="6598235178374410284">Корисничка слика за аватар</translation> <translation id="6603004149426829878">Увек шаљи све доступне сигнале о локацији на сервер при одређивању временске зоне</translation> <translation id="6628120204569232711">Шаљу извештај о статусу меморијског простора</translation> @@ -3423,7 +3458,6 @@ Ако подесите ове смернице на „RemoveLRUIfDormant“, аутоматско брисање ће наставити да уклања кориснике који се нису пријавили најмање 3 месеца почевши од оних који су се први пријавили док не буде довољно слободног простора. Ако не подесите ове смернице, аутоматско брисање користи подразумевану уграђену стратегију. За сада је та стратегија „RemoveLRUIfDormant“.</translation> -<translation id="7334274148831027933">Омогући монтирану лупу екрана</translation> <translation id="7336785017449297672">Контролишу подешавања сата и временске зоне.</translation> <translation id="7336878834592315572">Чувај колачиће током трајања сесије</translation> <translation id="7339315111520512972">Принудно покрени кôд за умрежавање у процесу прегледача.</translation> @@ -4345,6 +4379,8 @@ <translation id="915194831143859291">Ако подесите ове смернице на Нетачно или их не конфигуришете, <ph name="PRODUCT_OS_NAME" /> ће омогућити кориснику да искључи уређај. Ако подесите ове смернице на Тачно, <ph name="PRODUCT_OS_NAME" /> ће покретати рестартовање када корисник искључује уређај. <ph name="PRODUCT_OS_NAME" /> замењује сву дугмад за искључивање у корисничком интерфејсу дугмадима за рестартовање. Ако корисник искључује уређај помоћу дугмета за напајање, уређај се неће аутоматски рестартовати чак и ако су смернице омогућене.</translation> <translation id="9152473318295429890">Омогућавају контекстуалне предлоге сродних веб-страница</translation> +<translation id="9153446010242995516">Врати на циљану верзију и остани на њој ако је верзија ОС-а новија од циљане. Покушај пренос конфигурације на нивоу уређаја (укључујући акредитиве за мрежу) путем процеса враћања, ако је могуће, али обави враћање уз комплетан Powerwash чак и ако враћање података није могуће (зато што циљана верзија не подржава враћање података или због промене која није компатибилна са старијим верзијама). + Подржано у <ph name="PRODUCT_OS_NAME" />-у верзије 75 и новијим верзијама. За старије клијенте ова вредност значи да је враћање онемогућено.</translation> <translation id="9158929520101169054">Дозвољавају вишеструко пријављивање у оквиру прегледача</translation> <translation id="9159126470527871268">Обавештава корисника да <ph name="PRODUCT_NAME" /> мора да се поново покрене или да <ph name="PRODUCT_OS_NAME" /> мора да се рестартује да би се применило ажурирање на чекању.
diff --git a/components/policy/resources/policy_templates_sv.xtb b/components/policy/resources/policy_templates_sv.xtb index e1cfab9..93c1d37 100644 --- a/components/policy/resources/policy_templates_sv.xtb +++ b/components/policy/resources/policy_templates_sv.xtb
@@ -144,15 +144,6 @@ Om principen anges som False kommer utvecklarväxelns läge inte att redovisas.</translation> <translation id="1160479894929412407">Tillåt QUIC-protokoll</translation> <translation id="1160939557934457296">Inaktivera möjligheten att fortsätta från varningssidan Säker webbsökning</translation> -<translation id="1171342272070128466">Aktivera tillgänglighetsfunktionen med dockad skärmförstoring. - - Om principen är inställd på sant är dockad skärmförstoring alltid aktiverat. - - Om principen är inställd på falskt är dockad skärmförstoring alltid inaktiverat. - - Om principen har ställts in kan användarna inte ändra eller åsidosätta den. - - Om principen saknar inställning är dockad skärmförstoring inaktiverat från start, men funktionen kan aktiveras av användaren när som helst.</translation> <translation id="1189817621108632689">Låter dig ange en lista med webbadressmönster som styr vilka webbplatser som inte får visa bilder. Om principen lämnas utan inställning används det globala standardvärdet för alla webbplatser. Standardvärdet hämtas från principen DefaultImagesSetting om den har ställts in och från användarens egna inställningar i annat fall. @@ -1582,11 +1573,6 @@ Om principen är inställd på falskt rapporteras ingen information om kiosksessionen. Om principen är inställd på sant eller inte har angetts rapporteras information om kiosksessionen.</translation> -<translation id="3852924591079583104"> - När principen är inställd på ArcSession görs en tvingad omstart när användaren loggar ut om Android har startats. - Med inställningen Alltid görs en tvingad omstart varje gång användaren loggar ut. - Om principen saknar inställning händer ingenting: ingen tvingad omstart görs när användaren loggar ut. Detsamma gäller om principen har ställts in på Aldrig. - </translation> <translation id="3858658082795336534">Standardinställning för dubbelsidig utskrift</translation> <translation id="3859780406608282662">Lägg till en parameter för att hämta ett slumpfrö i <ph name="PRODUCT_OS_NAME" />. @@ -3467,7 +3453,6 @@ Om RemoveLRUIfDormant har angetts som policy tas användare som inte har loggat in på tre månader bort, via automatisk rensning, i en ordningsföljd utifrån vem som loggade in för längst tid sedan, tills tillräckligt med utrymme har frigjorts. Om policyn inte har angetts används den inbyggda strategin av den automatiska rensningen. För närvarande är det strategin RemoveLRUIfDormant.</translation> -<translation id="7334274148831027933">Aktivera dockad skärmförstoring</translation> <translation id="7336785017449297672">Styr inställningar för klocka och tidszon.</translation> <translation id="7336878834592315572">Behåll cookies under hela sessionen</translation> <translation id="7339315111520512972">Tvinga nätverkskod att köras i webbläsarprocessen</translation>
diff --git a/components/policy/resources/policy_templates_sw.xtb b/components/policy/resources/policy_templates_sw.xtb index e563d91e..430bbb5 100644 --- a/components/policy/resources/policy_templates_sw.xtb +++ b/components/policy/resources/policy_templates_sw.xtb
@@ -131,15 +131,6 @@ Ikiwa sera hii itawekwa kuwa uongo, hali ya ubadilishaji wa dev haitaripotiwa.</translation> <translation id="1160479894929412407">Ruhusu itifaki ya QUIC</translation> <translation id="1160939557934457296">Lemaza kuendelea kutoka kwenye ukurasa wa ilani ya Kuvinjari Salama</translation> -<translation id="1171342272070128466">Washa kipengele cha walio na matatizo ya kuona na kusikia cha kikuzaji kilichoambatishwa. - - Sera hii ikiwekwa kuwa 'ndivyo', kikuzaji kilichoambatishwa kitabaki kikiwa kimewaka kila wakati. - - Sera hii ikiwekwa kuwa 'sivyo', kikuzaji kilichoambatishwa kitabaki kikiwa kimezima kila wakati. - - Ukiweka sera hii, watumiaji hawawezi kuibadilisha au kuibatilisha. - - Ikiwa sera hii haijawekwa, kikuzaji kilichoambatishwa kinazima mwanzoni lakini kinaweza kuwashwa na mtumiaji wakati wowote.</translation> <translation id="1189817621108632689">Inakuruhusu kuweka orodha ya ruwaza za url zinazobainisha tovuti zisizoruhusiwa kuonyesha picha. Ikiwa sera hii itaachwa bila kuwekwa, thamani chaguomsingi itatumiwa kwa tovuti zote kutoka kwenye sera ya 'DefaultImagesSetting' endapo itawekwa, au mtumiaji akiweka mipangilio mwenyewe. Kumbuka kuwa hapo awali sera hii iliwashwa kimakosa kwenye Android, lakini kipengele hiki hakijawahi kutumika kikamilifu kwenye Android.</translation> @@ -1120,6 +1111,15 @@ Sera hii isipowekwa, sifa za sera mahususi zaidi haziathiriwi.</translation> <translation id="2987155890997901449">Washa kipengele cha ARC</translation> <translation id="2987227569419001736">Dhibiti matumizi ya API ya Bluetooth ya Wavuti</translation> +<translation id="2990018289267778247">Sera hii ikiwekwa kuwa ndivyo, chaguo za Zana za walio na matatizo ya kuona na kusikia zitaonekana kila wakati katika menyu ya ubao wa aikoni. + + Sera hii ikiwekwa kuwa sivyo, chaguo za Zana za walio na matatizo ya kuona na kusikia hazitawahi kuonekana katika menyu ya ubao wa aikoni. + + Ukiweka sera hii, watumiaji hawawezi kuibadilisha au kuibatilisha. + + Sera hii isipowekwa, chaguo za Zana za walio na matatizo ya kuona na kusikia hazitaonekana katika menyu ya ubao wa aikoni, lakini mtumiaji anaweza kufanya chaguo za Zana za walio na matatizo ya kuona na kusikia zionekane kupitia ukurasa wa Mipangilio. + + Wakati vipengele vya zana za walio na matatizo ya kuona au kusikia vimewashwa (kwa kutumia njia zingine k.m. kutumia mchanganyiko wa funguo), Chaguo za Zana za Walio na Matatizo ya Kuona au Kusikia zitaonekana kwenye menyu ya ubao wa aikoni kila wakati.</translation> <translation id="3011301228198307065">Huweka URL chaguomsingi ya ukurasa wa mwanzo katika <ph name="PRODUCT_NAME" /> na huzuia watumiaji kuibadilisha. Ukurasa wa mwanzo ni ukurasa unaofunguliwa na kitufe cha ukurasa wa Mwanzo. Kurasa zinazofunguka kifaa kinapowashwa zinadhibitiwa na sera za RestoreOnStartup. @@ -1443,6 +1443,7 @@ Sera hii inatumiwa na mpango wa ujumuishaji wa sera ya wingu katika upeo wa mashine kwenye kompyuta ya mezani na inaweza kuwekwa na Sajili au GPO kwenye Windows, faili ya plist kwenye Mac na faili ya sera ya JSON kwenye Linux.</translation> <translation id="3660562134618097814">Hamisha vidakuzi vya SAML IdP wakati wa kuingia katika akaunti</translation> <translation id="3701121231485832347">Hudhibiti mipangilio ya <ph name="MS_AD_NAME" /> inayodhibitiwa na vifaa vya <ph name="PRODUCT_OS_NAME" />.</translation> +<translation id="3702518095257671450">Uthibitishaji wa mbali</translation> <translation id="3702647575225525306"><ph name="POLICY_NAME" /> (Sehemu ya mstari mmoja iliacha kufanya kazi na itaondolewa katika siku zijazo. Tafadhali anza kutumia kisanduku cha maandishi cha mistari mingi kilicho hapa chini)</translation> <translation id="3709266154059827597">Sanidi orodha inayotiliwa shaka ya usakinishaji wa kiendelezi</translation> <translation id="3711895659073496551">Sitisha</translation> @@ -1556,11 +1557,6 @@ Sera ikiwekwa kuwa sivyo, maelezo ya kipindi cha skrini nzima hayataripotiwa. Ikiwekwa kuwa ndivyo au ikiachwa bila kuwekwa, maelezo ya kipindi cha skrini nzima yataripotiwa.</translation> -<translation id="3852924591079583104"> - Sera hii ikiwekwa kuwa ArcSession, hulazimisha kifaa kuwaka tena mtumiaji akiondoka kwenye akaunti ikiwa Android imefunguka. - Sera ikiwekwa kuwa 'Kila Wakati', hulazimisha kifaa kuwaka katika kila tukio la mtumiaji kuondoka kwenye akaunti. - Sera isipowekwa, haina athari na hakuna kulazimisha kifaa kuwaka tena mtumiaji akiondoka kwenye akaunti. Hali hii inatumika pia ikiwa sera imewekwa kuwa 'Isiwahi'. - </translation> <translation id="3858658082795336534">Hali chaguomsingi ya uchapishaji kwenye pande mbili</translation> <translation id="3859780406608282662">Ongeza kigezo kwenye uletaji wa mbegu Tofauti katika <ph name="PRODUCT_OS_NAME" />. @@ -1845,6 +1841,15 @@ Sera hii inatumika tu endapo sera ya 'DefaultSearchProviderEnabled' imewashwa.</translation> <translation id="4285674129118156176">Ruhusu watumiaji wasio washirika kutumia ARC</translation> +<translation id="4289903996435140853">Hukuruhusu kuweka orodha ya URL ambazo zinabainisha tovuti zitakazopewa kiotomatiki ruhusa ya kufikia kifaa cha USB chenye vitambulisho vya muuzaji na bidhaa husika. Lazima kila kipengee kwenye orodha kijumuishe vifaa na URL ili sera itumike. Kila kipengee kwenye vifaa kinaweza kujumuisha sehemu ya kitambulisho cha muuzaji na kitambulisho cha bidhaa. Kitambulisho chochote kisichowekwa kinachukuliwa kuwa herufi wakilishi isiyofuata kanuni moja na kanuni hii ni kwamba kitambulisho cha bidhaa hakiwezi kubainishwa bila kitambulisho cha muuzaji kubainishwa. Vinginevyo, sera haitakuwa sahihi na itapuuzwa. + + Muundo wa ruhusa za USB hutumia URL ya tovuti inayotuma ombi ("URL inayotuma ombi") na URL ya tovuti maarufu ya fremu ("URL ya kupachika") ili kuruhusu URL inayotuma ombi iweze kufikia kifaa cha USB. URL inayotuma ombi inaweza kuwa tofauti na URL ya kupachika wakati tovuti inayotuma ombi imepakiwa kwenye iframe. Kwa hivyo, sehemu ya "url" inaweza kujumuisha hadi mifuatano miwili ya URL inayotenganishwa kwa koma ili kubainisha URL ya kutuma ombi na URL ya kupachika mtawalia. Ikiwa URL moja tu imebainishwa, basi ufikiaji wa vifaa vinavyolingana vya USB utatolewa wakati URL ya tovuti inayotuma ombi italingana na URL hii bila kuzingatia hali ya upachikaji. Lazima URL kwenye "url" ziwe URL sahihi, vinginevyo sera hii itapuuzwa. + + Sera hii isipowekwa, thamani chaguomsingi ya jumla itatumiwa kwenye tovuti zote, katika sera ya 'DefaultWebUsbGuardSetting' ikiwa sera imewekwa au vinginevyo katika mipangilio ya binafsi ya mtumiaji. + + Miundo ya URL katika sera hii haipaswi kukinzana na ile ambayo mipangilio yake huwekwa kupitia WebUsbBlockedForUrls. Kama inakinzana, sera hii itatumika kwanza badala ya WebUsbBlockedForUrls na WebUsbAskForUrls. + + Thamani za sera hii na sera ya WebUsbAllowDevicesForUrls zinaunganishwa pamoja.</translation> <translation id="4298509794364745131">Huzibainisha programu zinazoweza kuwashwa kuwa programu za kuandika madokezo kwenye skrini iliyofungwa ya <ph name="PRODUCT_OS_NAME" />. Unapoitumia programu ya kuandika vidokezo unayoipendelea kwenye skrini iliyofungwa, kiolesura cha kufungua programu hiyo kitaonekana kwenye skrini iliyofungwa. @@ -1994,6 +1999,7 @@ <translation id="4639407427807680016">Majina ya wapangishi wa ujumbe wa asili ili usijumuishe kwenye orodha ya wasioidhinishwa</translation> <translation id="4650759511838826572">Lemaza mipango ya itifaki ya URL</translation> <translation id="465099050592230505">URL ya duka la wavuti la biashara (imeacha kuendesha huduma)</translation> +<translation id="4661889655253181651">Mipangilio ya maudhui inakuruhusu kubaini jinsi maudhui ya aina maalum (kwa mfano Vidakuzi, Picha au JavaScript) yanavyoshughulikiwa.</translation> <translation id="4665897631924472251">Mipangilio ya kudhibiti viendelezi</translation> <translation id="4668325077104657568">Mpangilio chaguomsingi wa picha</translation> <translation id="4670865688564083639">Kiwango cha chini zaidi:</translation> @@ -2038,6 +2044,11 @@ Mapendekezo haya yanatafutwa kwa mbali kutoka seva za Google. Ikiwa mipangilio hii imewekwa kuwa sivyo, haitatafuta wala kuonyesha mapendekezo.</translation> +<translation id="4759650396863318477">Hukuruhusu uweke kipindi katika milisekunde, ambapo watumiaji wataarifiwa kwamba ni lazima <ph name="PRODUCT_NAME" /> ifunguliwe upya au ni sharti kifaa cha <ph name="PRODUCT_OS_NAME" /> kizimwe kisha kiwashwe ili kukamilisha kuweka sasisho. + + Katika kipindi hiki, mtumiaji ataarifiwa mara kwa mara kuhusu umuhimu wa kusasisha. Kwa vifaa vya <ph name="PRODUCT_OS_NAME" />, arifa itakayokutaka uzime kisha uwashe kifaa itaonekana katika ubao wa aikoni kulingana na sera ya <ph name="RELAUNCH_HEADS_UP_PERIOD_POLICY_NAME" />. Kwa vivinjari vya <ph name="PRODUCT_NAME" />, mabadiliko kwenye menyu ya programu ya kuashiria kuwa unahitaji kufungua programu upya yanahitajika baada ya thuluthi ya kipindi cha arifa kuisha. Rangi ya arifa hizi itabadilika baada ya thuluthi mbili za kipindi cha kutoa arifa kuisha na itabadilika tena kipindi kamili cha arifa kitakapokwisha. Arifa za ziada zitakazowashwa na sera ya <ph name="RELAUNCH_NOTIFICATION_POLICY_NAME" /> zitafuata ratiba ii hii. + + Kama hujaweka kipindi, kipindi chaguomsingi cha milisekunde 345600000 (siku nne) kitatumika kwenye vifaa vya <ph name="PRODUCT_OS_NAME" /> na milisekunde 604800000 (wiki moja) kitatumika kwenye <ph name="PRODUCT_NAME" />.</translation> <translation id="4788252609789586009">Huwasha kipengele cha Kujaza Kiotomatiki cha <ph name="PRODUCT_NAME" /> na kuruhusu watumiaji wajaze kiotomatiki maelezo ya kadi ya mikopo katika fomu za wavuti wakitumia maelezo waliyohifadhi awali. Iwapo mipangilio hii imezimwa, kipengele cha Kujaza Kiotomatiki hakitawahi kupendekeza wala kujaza maelezo ya kadi ya mikopo. Pia hakitaweza kuhifadhi maelezo ya ziada ya kadi ya mikopo ambayo huenda mtumiaji atawasilisha atakapovinjari kwenye wavuti. @@ -2245,6 +2256,15 @@ Ikiwa sera hii itasalia kama haijawekwa thamani yote chaguomsingi itatumika kwa tovuti zote kutoka katika sera ya 'DefaultNotificationsSetting' ikiwa imewekwa, au vinginevyo usanidi binafsi wa mtumiaji.</translation> <translation id="5213038356678567351">Tovuti ambazo hazipaswi kusababisha kubadilishwa kwa kivinjari.</translation> <translation id="5219844027738217407">Kwa programu za Android, sera hii inaathiri maikrofoni pekee. Sera ikiwekwa kuwa ndivyo, maikrofoni huzimwa sauti kwa programu zote za Android, bila vighairi.</translation> +<translation id="5221394278852982313">Hukuruhusu kuweka orodha ya URL ambazo zinabainisha tovuti zitakazopewa kiotomatiki ruhusa ya kufikia kifaa cha USB chenye Vitambulisho vya muuzaji na bidhaa husika. Lazima kila kipengee kwenye orodha kijumuishe vifaa na URL ili sera itumike. Kila kipengee kwenye vifaa kinaweza kujumuisha sehemu ya kitambulisho cha muuzaji na kitambulisho cha bidhaa. Kitambulisho chochote kisichowekwa kitachukuliwa kuwa herufi wakilishi isiyofuata kanuni moja na kanuni hii ni kwamba kitambulisho cha bidhaa hakiwezi kubainishwa bila kitambulisho cha muuzaji kubainishwa. Vinginevyo, sera haitakuwa sahihi na itapuuzwa. + + Muundo wa ruhusa za USB hutumia URL ya tovuti inayotuma ombi ("URL inayotuma ombi") na URL ya tovuti maarufu ya fremu ("URL ya kupachika") ili kuruhusu URL inayotuma ombi ifikie kifaa cha USB. URL inayotuma ombi inaweza kuwa tofauti na URL ya kupachika wakati tovuti inayotuma ombi imepakiwa kwenye iframe. Kwa hivyo, sehemu ya "URL" inaweza kujumuisha hadi mifuatano miwili ya URL inayotenganishwa kwa koma ili kubainisha URL ya kutuma ombi na URL ya kupachika mtawalia. Ikiwa URL moja tu imebainishwa, basi ufikiaji wa vifaa vinavyolingana vya USB utatolewa wakati URL ya tovuti inayotuma ombi inalingana na URL hii bila kuzingatia hali ya kupachika. Lazima URL kwenye "url" ziwe URL sahihi, vinginevyo sera hii itapuuzwa. + + Sera hii isipowekwa, thamani chaguomsingi ya jumla itatumiwa kwenye tovuti zote, katika sera ya 'DefaultWebUsbGuardSetting' ikiwa sera imewekwa au vinginevyo katika mipangilio ya binafsi ya mtumiaji. + + Miundo ya URL katika sera hii haipaswi kukinzana na ile ambayo mipangilio yake huwekwa kupitia WebUsbBlockedForUrls. Kama inakinzana, sera hii itatumika kwanza badala ya WebUsbBlockedForUrls na WebUsbAskForUrls. + + Thamani za sera hii na sera ya DeviceWebUsbAllowDevicesForUrls zinaunganishwa pamoja.</translation> <translation id="5228316810085661003">Ucheleweshaji wa kuingia kiotomatiki katika akaunti ya kifaa. Ikiwa sera ya |DeviceLocalAccountAutoLoginId| haijawekwa, sera hii haina athari yoyote. Vinginevyo: @@ -2979,6 +2999,20 @@ Sera hii ikiwekwa kuwa ''Usiruhusu watumiaji kudhibiti vyeti'', watumiaji hawataweza kudhibiti vyeti, wataweza tu kuviangalia.</translation> <translation id="6573305661369899995">Weka chanzo cha nje cha vikwazo vya URL</translation> +<translation id="6583851521569686409">Huweka mipangilio ya orodha ya printa. + + Sera hii huruhusu wasimamizi kuweka mipangilio ya printa kwa ajili ya watumiaji wake. + + <ph name="PRINTER_DISPLAY_NAME" /> na <ph name="PRINTER_DESCRIPTION" /> ni mifuatano huru ambayo inaweza kuwekewa mapendeleo ili kurahisisha shughuli ya kuchagua printa. <ph name="PRINTER_MANUFACTURER" /> na <ph name="PRINTER_MODEL" /> hutumika kurahisisha shughuli ya kutambua printa kwa watumiaji wake wa mwisho. Huwakilisha mtengenezaji na muundo wa printa. <ph name="PRINTER_URI" /> inapaswa kuwa anwani ambayo inafikiwa na kompyuta teja, ikiwa ni pamoja na <ph name="URI_SCHEME" />, <ph name="URI_PORT" /> na <ph name="URI_QUEUE" />. si lazima uweke <ph name="PRINTER_UUID" />. Ikiwekwa, itasaidia kuondoa nakala za printa za <ph name="ZEROCONF_DISCOVERY" />. + + <ph name="PRINTER_EFFECTIVE_MODEL" /> inapaswa kuwa na jina la printa au <ph name="PRINTER_AUTOCONF" /> inapaswa kuwekwa kuwa ndivyo. Printa zenye sifa zote mbili au zisizo na sifa yoyote hazitatumika. + + Shughuli ya kuweka mipangilio ya printa hukamilika baada ya kutumia printa mara ya kwanza. PPD hazipakuliwi mpaka printa itumike. Baada ya hapo, PPD zinazotumiwa sana huwekwa katika akiba. + + Sera hii haiwezi kubaini iwapo watumiaji wanaweza kuweka mipangilio ya printa kwenye vifaa mahususi. Inakusudiwa kuwa mbinu ya ziada ya kuweka mipangilio ya printa na watumiaji mahususi. + + Kwa vifaa vinavyodhibitiwa na Saraka Inayotumika, sera hii inatumia upanuzi wa <ph name="MACHINE_NAME_VARIABLE" /> kwenye jina la mashine ya Saraka Inayotumika au kiambishi cha msimbo husika. Kwa mfano, ikiwa jina la mashine ni <ph name="MACHINE_NAME_EXAMPLE" />, inamaanisha kuwa nafasi ya <ph name="MACHINE_NAME_VARIABLE_EXAMPLE" /> itawekwa herufi 4 baada ya nafasi ya 6, yaani <ph name="MACHINE_NAME_PART_EXAMPLE" />. Kumbuka kwamba nafasi hii inaanza kwa sufuri. + </translation> <translation id="6598235178374410284">Picha ya ishara ya mtumiaji</translation> <translation id="6603004149426829878">Kila wakati, tuma kwenye seva mawimbi yoyote ya mahali yanayopatikana unaporekebisha saa za eneo</translation> <translation id="6628120204569232711">Ripoti hali ya hifadhi</translation> @@ -3431,7 +3465,6 @@ Ikiwa sera hii itawekwa kuwa 'RemoveLRUIfDormant', kufuta kiotomatiki kutaendelea kuwaondoa watumiaji ambao hawajaingia katika akaunti kwa angalau miezi 3 iliyopita katika agizo la hivi karibuni lililoingiwa mara chache zaidi hadi kuwe na nafasi ya kutosha. Ikiwa sera hii haitawekwa, kufuta kiotomatiki hutumia mkakati wa chaguomsingi uliojengwa ndani. Kwa sasa, ni mkakati wa 'RemoveLRUIfDormant'.</translation> -<translation id="7334274148831027933">Washa kikuzaji kilichofungwa</translation> <translation id="7336785017449297672">Hudhibiti mipangilio ya saa na saa za maeneo.</translation> <translation id="7336878834592315572">Weka vidakuzi katika muda wa kipindi</translation> <translation id="7339315111520512972">Lazimisha msimbo wa mtandao kutekelezwa katika mchakato wa kivinjari</translation> @@ -4308,6 +4341,8 @@ <translation id="915194831143859291">Sera hii ikiwekwa kuwa sivyo au isisanidiwe, <ph name="PRODUCT_OS_NAME" /> itamruhusu mtumiaji kuzima kifaa. Sera hii ikiwekwa kuwa ndivyo, <ph name="PRODUCT_OS_NAME" /> itaanzisha kuwasha tena mtumiaji anapozima kifaa. <ph name="PRODUCT_OS_NAME" /> huchukua nafasi ya matukio yote ya vitufe vya kuzima katika kiolesura kwa kutumia vitufe vya kuzima. Mtumiaji akizima kifaa akitumia kitufe cha kuwasha/kuzima, hakitawasha tena kiotomatiki, hata kama sera imewashwa.</translation> <translation id="9152473318295429890">Washa mapendekezo ya muktadha wa kurasa za wavuti husika</translation> +<translation id="9153446010242995516">Rejesha na uendelee kutumia toleo lengwa ikiwa toleo la mfumo wa uendeshaji ni jipya zaidi kuliko toleo lengwa. Jaribu kuleta mipangilio kwenye kiwango cha kifaa (ikiwa ni pamoja na kitambulisho cha mtandao) kupitia mchakato wa urejeshaji, ikiwezekana, lakini usirejeshe katika hali kamili ya Powerwash hata kama urejeshaji wa data hauwezekani (kwa sababu toleo lengwa haliwezi kurejesha data au kutokana na mabadiliko ya urejeshaji yasiyooana). + Inaweza kutumika kwenye toleo la <ph name="PRODUCT_OS_NAME" /> la 75 na mapya zaidi. Kwa viteja vya zamani zaidi, thamani hii ina maana kuwa urejeshaji umezimwa.</translation> <translation id="9158929520101169054">Ruhusu Kuingia katika Akaunt Nyingi katika Kivinjari</translation> <translation id="9159126470527871268">Iwaarifu watumiaji kwamba ni sharti <ph name="PRODUCT_NAME" /> ifunguliwe upya au ni sharti wazime kisha wawashe <ph name="PRODUCT_OS_NAME" /> ili wakamilishe kuweka sasisho.
diff --git a/components/policy/resources/policy_templates_ta.xtb b/components/policy/resources/policy_templates_ta.xtb index bf28224..e19401d 100644 --- a/components/policy/resources/policy_templates_ta.xtb +++ b/components/policy/resources/policy_templates_ta.xtb
@@ -129,15 +129,6 @@ கொள்கை தவறு என அமைக்கப்பட்டிருந்தால், சாதனத்தின் டெவெலப்பர் மாற்ற நிலை அறிக்கையிடப்படாது.</translation> <translation id="1160479894929412407">QUIC நெறிமுறையை அனுமதிக்கும்</translation> <translation id="1160939557934457296">பாதுகாப்பு உலாவல் எச்சரிக்கைப் பக்கத்திலிருந்து செல்வதை முடக்கு</translation> -<translation id="1171342272070128466">டாக் செய்த பெரிதாக்கியின் அணுகல்தன்மை அம்சத்தை இயக்குதல். - - இந்தக் கொள்கை 'சரி' என அமைக்கப்பட்டால் 'டாக் செய்த பெரிதாக்கி' எப்போதும் இயக்கப்பட்டிருக்கும். - - 'தவறு' என அமைக்கப்பட்டால் 'டாக் செய்த பெரிதாக்கி' எப்போதும் முடக்கப்பட்டிருக்கும். - - இந்தக் கொள்கையை நீங்கள் அமைத்தால் பயனர்களால் இதை மாற்றவோ மீறவோ முடியாது. - - இதை அமைக்கவில்லை எனில் 'டாக் செய்த பெரிதாக்கி' துவக்க நிலையில் முடக்கப்பட்டிருக்கும். அதை எப்போது வேண்டுமானாலும் பயனர் இயக்கலாம்.</translation> <translation id="1189817621108632689">படங்களை அமைக்க அனுமதிக்காத தளங்களைக் குறிக்கும் url பேட்டர்ன்களின் பட்டியலை அமைக்க, உங்களை அனுமதிக்கிறது. இந்தக் கொள்கையை அமைக்கவில்லை எனில், ஒட்டுமொத்த இயல்பு மதிப்பு எல்லாத் தளங்களுக்கும் பயன்படுத்தப்படும். அப்படி அமைக்கப்படும் மதிப்பு, 'DefaultImagesSetting' கொள்கையாகவோ (ஏற்கனவே அமைக்கப்பட்டிருந்தால்) அல்லது பயனரின் தனிப்பட்ட உள்ளமைவாகவோ இருக்கும். @@ -794,9 +785,9 @@ <translation id="2463034609187171371">TLSஸில் உள்ள DHE சைஃபர் சூட்களை இயக்கும்</translation> <translation id="2463365186486772703">ஆப்ஸின் மொழி</translation> <translation id="2466131534462628618">கேப்டிவ் போர்டல் அங்கீகாரம் ப்ராக்ஸியை நிராகரிக்கும்</translation> -<translation id="2471748297300970300">முடக்கினால் ஆபத்தாக இருக்கக்கூடிய கட்டளை வரி கொடியிடல்கள் மூலம் Chromeமைத் தொடங்கும்போது பாதுகாப்பு எச்சரிக்கைகள் காட்டப்படாமல் தடுக்கும். +<translation id="2471748297300970300">இந்தக் கொள்கையை முடக்கினால் ஆபத்தாக இருக்கக்கூடிய கட்டளை வரி கொடியிடல்கள் மூலம் Chromeமைத் தொடங்கும்போது பாதுகாப்பு எச்சரிக்கைகள் காட்டப்படாமல் தடுக்கும். - இயக்கினாலோ அமைக்காமல் விட்டாலோ சில கட்டளை வரி கொடியிடல்கள் மூலம் Chromeமைத் தொடங்கும்போது பாதுகாப்பு எச்சரிக்கைகள் காட்டப்படும். + இந்தக் கொள்கையை இயக்கினாலோ அமைக்காமல் விட்டாலோ சில கட்டளை வரி கொடியிடல்கள் மூலம் Chromeமைத் தொடங்கும்போது பாதுகாப்பு எச்சரிக்கைகள் காட்டப்படும். Windowsஸில் <ph name="MS_AD_NAME" /> டொமைனுடன் இணைக்கப்பட்ட நேர்வுகளின்போதும் சாதன நிர்வாகத்திற்காகப் பதிவுசெய்யப்பட்ட Windows 10 Pro அல்லது Enterprise நேர்வுகளின்போதும் மட்டுமே இந்தக் கொள்கை பயன்படுத்தப்படும்.</translation> <translation id="2482676533225429905">நேட்டிவ் செய்தியிடல்</translation> @@ -1525,11 +1516,6 @@ கொள்கையை "தவறு" என அமைத்தால், கியோஸ்க் அமர்வுத் தகவல் அறிவிக்கப்படாது. "சரி" என அமைத்தாலோ அல்லது அமைக்காமல் இருந்தாலோ, அமர்வுத் தகவல் அறிவிக்கப்படும்.</translation> -<translation id="3852924591079583104"> - இந்தக் கொள்கையை ‘ArcSession’ என அமைத்தால், Android தொடங்கப்பட்டிருக்கும் பட்சத்தில், பயனர் வெளியேறும்போது மறுபடி தொடங்க சாதனத்தை வலியுறுத்தும். - 'எப்போதும்' என அமைத்தால், ஒவ்வொரு முறை பயனர் வெளியேறும்போதும் மறுபடி தொடங்க இது சாதனத்தை வலியுறுத்தும். - அமைக்காமல் விட்டுவிட்டால், இது எந்த மாற்றத்தையும் ஏற்படுத்தாது. அத்துடன் பயனர் வெளியேறும்போது மறுபடி தொடங்க வலியுறுத்தாது. 'ஒருபோதும் வேண்டாம்' என அமைத்தாலும் இவ்வாறே செயல்படும். - </translation> <translation id="3858658082795336534">இயல்புநிலை அச்சிடல் டூப்ளெக்ஸ் பயன்முறையில் இயங்கும்</translation> <translation id="3859780406608282662"><ph name="PRODUCT_OS_NAME" /> இல் மாறுபாடுகள் ஸீடைப் பெறுவதில் அளவுருவைச் சேர். @@ -2312,7 +2298,7 @@ நீங்கள் அமைத்த கொள்கையைப் பயனர்கள் மாற்றவோ மீறவோ இயலாது. - கொள்கை அமைக்கப்படவில்லை எனில் உள்நுழைவதற்கான திரையில் தங்களைப் பிரதிநிதித்துவப்படுத்தும் படத்தைப் பயனரே தேர்ந்தெடுக்கலாம்.</translation> + கொள்கை அமைக்கப்படவில்லை எனில் உள்நுழைவதற்கான திரையில் தங்களைப் பிரதிநிதித்துவப்படுத்தும் படத்தை பயனரே தேர்ந்தெடுக்கலாம்.</translation> <translation id="5432219358069697932">பயனரின் டெஸ்க்டாப்பிலும் உள்நுழைவதற்கான திரையின் பின்னணியிலும் காட்டப்படும் வால்பேப்பரை உள்ளமைக்க இந்தக் கொள்கை அனுமதிக்கும். வால்பேப்பரையும் பதிவிறக்கத்தின் துல்லியத்தைச் சரிபார்ப்பதற்கான கிரிப்டோகிராஃபிக் ஹேஷையும் பதிவிறக்க <ph name="PRODUCT_OS_NAME" />க்கு உதவும் URLலைக் குறிப்பிடுவதன் மூலம் இந்தக் கொள்கை அமைக்கப்படும். படம் JPEG வடிவத்தில் இருக்க வேண்டும், அதிகபட்ச அளவு: 16 மெ.பை. அங்கீகாரம் இன்றிப் பயன்படுத்தும் வகையில் இந்த URL இருக்க வேண்டும். வால்பேப்பர் பதிவிறக்கப்பட்டு தற்காலிக நினைவகத்தில் சேமிக்கப்படும். URL அல்லது ஹேஷ் மாற்றங்களின்போது இது மீண்டும் பதிவிறக்கப்படும். @@ -2321,7 +2307,7 @@ நீங்கள் அமைத்த கொள்கையைப் பயனர்கள் மாற்றவோ மீறவோ இயலாது. - கொள்கை அமைக்கப்படவில்லை எனில் பயனரின் டெஸ்க்டாப்பிலும் உள்நுழைவதற்கான திரையின் பின்னணியிலும் காட்டப்படும் படத்தைப் பயனரால் தேர்ந்தெடுக்க முடியும்.</translation> + கொள்கை அமைக்கப்படவில்லை எனில் பயனரின் டெஸ்க்டாப்பிலும் உள்நுழைவதற்கான திரையின் பின்னணியிலும் காட்டப்படும் படத்தை பயனரால் தேர்ந்தெடுக்க முடியும்.</translation> <translation id="5437733496511628148">இந்த அமைப்பை இயக்கினால் உலாவியின் முகவரிப் பட்டியில் இல்லாத இணையப் பக்க உறுப்புகளால் அமைக்கப்படுவதில் இருந்து குக்கீகளைத் தடுக்கும். இந்த அமைப்பை முடக்கினால் உலாவியின் முகவரிப் பட்டியில் இல்லாத இணையப் பக்க உறுப்புகளால் அமைக்கப்படுவதற்கு குக்கீகளை அனுமதிக்கும், பயனர்கள் இந்த அமைப்பை மாற்றுவதைத் தடுக்கும். @@ -3328,7 +3314,6 @@ 'RemoveLRUIfDormant' என அமைக்கப்பட்டிருந்தால், இலவச இடத்தை ஏற்படுத்தும் வரை தன்னியக்க சுத்தப்படுத்தலானது மூன்று மாதங்களில், குறைவாக உள்நுழைந்த பயனர்களின் வரிசைப்படி சாதனத்திலிருந்து பயனர்களை அகற்றும். இந்தக் கொள்கை அமைக்கப்படவில்லை எனில், தன்னியக்க சுத்தப்படுத்தலானது இயல்புநிலையாக கட்டமைக்கப்பட்ட உத்தியைப் பயன்படுத்தும். தற்போது இதுவே இயல்புநிலை 'RemoveLRUIfDormant' நுட்பம் ஆகும்.</translation> -<translation id="7334274148831027933">டாக் செய்யப்பட்ட பெரிதாக்கியை இயக்கு</translation> <translation id="7336785017449297672">கடிகாரம் மற்றும் நேர மண்டல அமைப்புகளைக் கட்டுப்படுத்தும்.</translation> <translation id="7336878834592315572">அமர்வு காலத்திற்கான குக்கீகளை வைத்திரு</translation> <translation id="7339315111520512972">உலாவிச் செயலாக்கத்தில் இயங்க நெட்வொர்க்கிங் குறியீட்டை வலியுறுத்தும்.</translation> @@ -3901,7 +3886,7 @@ <translation id="8549772397068118889">உள்ளடக்கத் தொகுப்புகளுக்கு வெளியே உள்ள தளங்களைப் பார்வையிடும்போது எச்சரிக்கை செய்</translation> <translation id="8566729013138025202">ARC இயங்கும் நேரத்தில் பயன்படுத்தப்படும் கொள்கைகளின் தொகுப்பைக் குறிப்பிடும். மதிப்பு செல்லுபடியாகும் JSON ஆக இருக்க வேண்டும். - சாதனத்தில் எந்த Android ஆப்ஸ் தானாக நிறுவப்பட வேண்டுமென்பதை இந்த கொள்கை மூலம் உள்ளமைக்கலாம். + சாதனத்தில் எந்த Android ஆப்ஸ் தானாக நிறுவப்பட வேண்டுமென்பதை இந்தக் கொள்கை மூலம் உள்ளமைக்கலாம். தொடக்கியில் ஆப்ஸைப் பின் செய்ய PinnedLauncherAppsஸைப் பார்க்கவும்.</translation> <translation id="8566842294717252664">புதிய தாவல் பக்கம் மற்றும் பயன்பாட்டுத் துவக்கியில் இணைய அங்காடியை மறை</translation>
diff --git a/components/policy/resources/policy_templates_te.xtb b/components/policy/resources/policy_templates_te.xtb index 1a597325..039b96c 100644 --- a/components/policy/resources/policy_templates_te.xtb +++ b/components/policy/resources/policy_templates_te.xtb
@@ -143,15 +143,6 @@ విధానాన్ని 'తప్పు'గా సెట్ చేస్తే, డెవలపర్ మార్పు స్థితి నివేదించబడదు.</translation> <translation id="1160479894929412407">QUIC ప్రోటోకాల్ను అనుమతించు</translation> <translation id="1160939557934457296">సురక్షిత బ్రౌజింగ్ హెచ్చరిక పేజీ నుండి కొనసాగడాన్ని నిలిపివేస్తుంది</translation> -<translation id="1171342272070128466">డాక్ చేసిన మాగ్నిఫైయర్ యాక్సెస్ సౌలభ్య ఫీచర్ను ప్రారంభించండి. - - ఈ విధానాన్ని ఒప్పునకు సెట్ చేస్తే, డాక్ చేసిన మ్యాగ్నిఫైయర్ ఎల్లప్పుడూ ప్రారంభించబడుతుంది. - - ఈ విధానాన్ని తప్పునకు సెట్ చేస్తే, డాక్ చేసిన మ్యాగ్నిఫైయర్ ఎల్లప్పుడూ నిలిపివేయబడుతుంది. - - ఈ విధానాన్ని మీరు సెట్ చేస్తే, దీనిని వినియోగదారులు మార్చలేరు లేదా అధిగమించలేరు. - - ఈ విధానాన్ని సెట్ చేయకుండా వదిలేస్తే, డాక్ చేసిన మ్యాగ్నిఫైయర్ ప్రారంభంలో నిలిపివేయబడతుంది, కానీ వినియోగదారు దీన్ని ఎప్పుడైనా ప్రారంభించవచ్చు.</translation> <translation id="1189817621108632689">చిత్రాలను ప్రదర్శించడానికి అనుమతించబడని సైట్లను పేర్కొనే url నమూనాల జాబితాను సెట్ చేయడానికి మిమ్మల్ని అనుమతిస్తుంది. ఈ విధానాన్ని సెట్ చేయకుండా వదిలేస్తే 'DefaultImagesSetting' విధానం సెట్ చేయబడి ఉంటే దాని నుండి లేదంటే వినియోగదారు యొక్క వ్యక్తిగత కాన్ఫిగరేషన్ నుండి గ్లోబల్ డిఫాల్ట్ విలువ అన్ని సైట్ల కోసం ఉపయోగించబడుతుంది. @@ -1528,11 +1519,6 @@ విధానాన్ని 'తప్పు'గా సెట్ చేస్తే, కియోస్క్ సెషన్ సమాచారం నివేదించబడదు. 'ఒప్పు'గా సెట్ చేస్తే లేదా సెట్ చేయకుండా వదిలేస్తే, కియోస్క్ సెషన్ సమాచారం నివేదించబడుతుంది.</translation> -<translation id="3852924591079583104"> - ఈ విధానాన్ని ArcSessionకు సెట్ చేసినప్పుడు, Android ప్రారంభించబడితే గనుక, వినియోగదారు సైన్ అవుట్ చేసినప్పుడు పరికరం తప్పక రీబూట్ అయ్యేలా సెట్ చేస్తుంది. - ఎల్లప్పుడూ ఎంపికకు సెట్ చేసినప్పుడు, వినియోగదారు సైన్ అవుట్ చేసిన ప్రతిసారి పరికరం తప్పనిసరిగా రీబూట్ అయ్యేలా సెట్ చేస్తుంది. - ఒకవేళ సెట్ చేయకుండా వదిలేస్తే, దాని ప్రభావం ఉండదు, అలాగే వినియోగదారు సైన్ అవుట్ చేసినప్పుడు రీబూట్ తప్పనిసరి కాబోదు. ఎప్పుడూ వద్దుకు సెట్ చేసినప్పుడు కూడా ఇదే వర్తిస్తుంది. - </translation> <translation id="3858658082795336534">డిఫాల్ట్ ముద్రణ డూప్లెక్స్ మోడ్</translation> <translation id="3859780406608282662"><ph name="PRODUCT_OS_NAME" />లో వ్యత్యాసాల సీడ్ను పొందడానికి పారామీటర్ను జోడించండి. @@ -2826,7 +2812,7 @@ 'RestoreOnStartup' విధానాన్ని 'RestoreOnStartupIsURLs'కి సెట్ చేసినప్పుడు మాత్రమే ఈ విధానం పని చేస్తుంది. ఈ విధానం <ph name="MS_AD_NAME" /> డొమైన్తో అనుబంధితమైన Windows సందర్భాలు లేదా పరికర నిర్వహణ కోసం నమోదైన Windows 10 Pro లేదా Enterprise సందర్భాలలో మాత్రమే అందుబాటులో ఉంటుంది.</translation> -<translation id="6417265370957905582">Google సహాయకం</translation> +<translation id="6417265370957905582">Google అసిస్టెంట్</translation> <translation id="6426205278746959912">మీరు Android యాప్లను ప్రాక్సీ ఉపయోగించడానికి నిర్బంధించలేరు. ప్రాక్సీ సెట్టింగ్ల ఉపసమితి Android యాప్లకు అందుబాటులో ఉంచుతుంది, ప్రాధాన్యత ఇవ్వడానికి అవి దీన్ని స్వచ్ఛందంగా ఎంచుకోవచ్చు: మీరు ఎప్పటికీ ప్రాక్సీ సర్వర్ను ఉపయోగించవద్దని ఎంచుకుంటే, Android యాప్లకు ప్రాక్సీ ఏదీ కాన్ఫిగర్ చేయలేదని తెలియజేయబడుతుంది. @@ -3350,7 +3336,6 @@ ఈ విధానాన్ని 'RemoveLRUIfDormant'కు సెట్ చేస్తే, ఆటోమేటిక్ క్లీన్-అప్ తగినంత ఖాళీ స్థలం సమకూరే దాకా ఇటీవలి కాలంలో లాగిన్ చేయనివారి క్రమంలో కనీసం 3 నెలలుగా లాగిన్ చేయని వినియోగదారులను తీసివేస్తుంది. ఈ విధానం సెట్ చేయబడకపోతే, ఆటోమేటిక్ క్లీన్-అప్ డిఫాల్ట్ అంతర్గత వ్యూహాన్ని పాటిస్తుంది. ప్రస్తుతం, అలా 'RemoveLRUIfDormant' వ్యూహం ఉంది.</translation> -<translation id="7334274148831027933">డాక్ చేయబడిన మాగ్నిఫైయర్ను ప్రారంభించండి</translation> <translation id="7336785017449297672">గడియారం, సమయ మండలి సెట్టింగ్లను నియంత్రిస్తుంది.</translation> <translation id="7336878834592315572">సెషన్ వ్యవధి కోసం కుక్కీలను ఉంచడం</translation> <translation id="7339315111520512972">బ్రౌజర్ ప్రాసెస్లో అమలు చేయమని నెట్వర్కింగ్ కోడ్ను ఒత్తిడి చేయండి</translation>
diff --git a/components/policy/resources/policy_templates_th.xtb b/components/policy/resources/policy_templates_th.xtb index 6d4aa479..6b1c0d7 100644 --- a/components/policy/resources/policy_templates_th.xtb +++ b/components/policy/resources/policy_templates_th.xtb
@@ -141,15 +141,6 @@ หากตั้งค่านโยบายนี้เป็น False จะไม่มีการรายงานสถานะของสวิตช์นักพัฒนาซอฟต์แวร์</translation> <translation id="1160479894929412407">อนุญาตโปรโตคอล QUIC</translation> <translation id="1160939557934457296">ปิดใช้งานการดำเนินการต่อจากหน้าคำเตือน Safe Browsing</translation> -<translation id="1171342272070128466">เปิดใช้ฟีเจอร์การช่วยเหลือพิเศษ "แว่นขยายหน้าจอบางส่วน" - - หากตั้งค่านโยบายนี้เป็น "จริง" ระบบจะเปิดใช้แว่นขยายหน้าจอบางส่วนอยู่เสมอ - - หากตั้งค่านโยบายนี้เป็น "เท็จ" ระบบจะปิดใช้แว่นขยายหน้าจอบางส่วนอยู่เสมอ - - หากตั้งค่านโยบายนี้ ผู้ใช้จะเปลี่ยนหรือลบล้างไม่ได้ - - หากไม่มีการตั้งค่านโยบายนี้ ระบบจะปิดแว่นขยายหน้าจอบางส่วนในขั้นต้นแต่ผู้ใช้เปิดใช้ได้ทุกเมื่อ</translation> <translation id="1189817621108632689">ให้คุณกำหนดรายการรูปแบบ URL ที่ระบุเว็บไซต์ซึ่งไม่ได้รับอนุญาตให้แสดงรูปภาพ หากไม่ได้ตั้งค่านโยบายนี้ ระบบจะใช้ค่าเริ่มต้นทั่วไปกับเว็บไซต์ทั้งหมด ทั้งจากนโยบาย "DefaultImagesSetting" หากมีการตั้งค่า หรือจากการกำหนดค่าส่วนตัวของผู้ใช้ @@ -1112,6 +1103,15 @@ เมื่อไม่ได้ตั้งค่านโยบายนี้ ลักษณะการทำงานของนโยบายที่เจาะจงยิ่งขึ้นจะไม่ได้รับผลกระทบ</translation> <translation id="2987155890997901449">เปิดใช้ ARC</translation> <translation id="2987227569419001736">ควบคุมการใช้ Web Bluetooth API</translation> +<translation id="2990018289267778247">หากตั้งค่านโยบายนี้เป็น "จริง" ตัวเลือกการช่วยเหลือพิเศษจะแสดงในเมนูถาดระบบเสมอ + + หากตั้งค่านโยบายนี้เป็น "เท็จ" ตัวเลือกการช่วยเหลือพิเศษจะไม่แสดงในเมนูถาดระบบ + + หากตั้งค่านโยบายนี้ ผู้ใช้จะเปลี่ยนหรือลบล้างไม่ได้ + + หากไม่ได้ตั้งค่านโยบายนี้ ตัวเลือกการช่วยเหลือพิเศษจะไม่แสดงในเมนูถาดระบบ แต่ผู้ใช้ทำให้ตัวเลือกการช่วยเหลือพิเศษปรากฏได้จากหน้าการตั้งค่า + + เมื่อเปิดใช้ฟีเจอร์การช่วยเหลือพิเศษ (ด้วยวิธีการอื่นๆ เช่น การกดแป้นร่วมกัน) ตัวเลือกการช่วยเหลือพิเศษจะแสดงในเมนูถาดระบบเสมอ</translation> <translation id="3011301228198307065">กำหนดค่า URL ของหน้าแรกเริ่มต้นใน <ph name="PRODUCT_NAME" /> และป้องกันไม่ให้ผู้ใช้เปลี่ยนหน้าดังกล่าว หน้าแรกคือหน้าที่เปิดโดยปุ่ม "หน้าแรก" หน้าต่างๆ ที่เปิดขึ้นเมื่อเริ่มต้นจะควบคุมด้วยนโยบาย RestoreOnStartup @@ -1428,6 +1428,7 @@ มีการใช้นโยบายนี้ในการลงทะเบียนนโยบายระบบคลาวด์ตามขอบเขตของเครื่องในเดสก์ท็อปและตั้งค่าได้โดยรีจิสทรีหรือ GPO ใน Windows, ไฟล์ plist ใน Mac และไฟล์นโยบาย JSON ใน Linux</translation> <translation id="3660562134618097814">โอนคุกกี้ SAML IdP ขณะลงชื่อเข้าใช้</translation> <translation id="3701121231485832347">ควบคุมการตั้งค่าเฉพาะของอุปกรณ์ <ph name="PRODUCT_OS_NAME" /> ที่ <ph name="MS_AD_NAME" /> จัดการ</translation> +<translation id="3702518095257671450">เอกสารรับรองระยะไกล</translation> <translation id="3702647575225525306"><ph name="POLICY_NAME" /> (เราเลิกใช้งานช่องบรรทัดเดียวแล้วและจะนำออกในเร็วๆ นี้ โปรดเริ่มใช้กล่องข้อความหลายบรรทัดด้านล่างนี้)</translation> <translation id="3709266154059827597">กำหนดค่ารายการที่ไม่อนุญาตสำหรับการติดตั้งส่วนขยาย</translation> <translation id="3711895659073496551">ระงับการใช้งาน</translation> @@ -1537,11 +1538,6 @@ หากตั้งค่านโยบายเป็น False จะไม่มีการรายงานข้อมูลเซสชันคีออสก์ หากตั้งค่าเป็น True หรือไม่ได้ตั้งค่า จะมีการรายงานข้อมูล เซสชัน</translation> -<translation id="3852924591079583104"> - เมื่อตั้งค่าเป็น ArcSession นโยบายนี้จะบังคับให้อุปกรณ์รีบูตเมื่อผู้ใช้ออกจากระบบหาก Android เริ่มต้นแล้ว - การตั้งค่าเป็น "ทุกครั้ง" จะเป็นการบังคับให้อุปกรณ์รีบูตทุกครั้งที่ผู้ใช้ออกจากระบบ - หากไม่ได้ตั้งค่า จะไม่มีผลอะไรและไม่มีการบังคับให้อุปกรณ์รีบูตเมื่อผู้ใช้ออกจากระบบ เช่นเดียวกันกับการตั้งค่าเป็น "ไม่เลย" - </translation> <translation id="3858658082795336534">โหมดพิมพ์ 2 ด้านเริ่มต้น</translation> <translation id="3859780406608282662">เพิ่มพารามิเตอร์เพื่อเรียกข้อมูลเริ่มต้นของรูปแบบใน <ph name="PRODUCT_OS_NAME" /> @@ -1812,6 +1808,15 @@ นโยบายนี้เป็นที่ยอมรับเฉพาะในกรณีที่นโยบาย "DefaultSearchProviderEnabled" ถูกเปิดใช้</translation> <translation id="4285674129118156176">อนุญาตให้ผู้ใช้ที่ไม่ได้เป็นพาร์ทเนอร์ใช้ ARC</translation> +<translation id="4289903996435140853">อนุญาตให้คุณตั้งค่ารายการ URL ซึ่งระบุเว็บไซต์ที่จะได้รับสิทธิ์เข้าถึงอุปกรณ์ USB โดยอัตโนมัติ พร้อมรหัสผู้ให้บริการและรหัสผลิตภัณฑ์ที่กำหนด รายการย่อยในรายการจะต้องมีทั้งอุปกรณ์และ URL เพื่อให้นโยบายมีผล แต่ละรายการในอุปกรณ์อาจมีช่องรหัสผู้ให้บริการและรหัสผลิตภัณฑ์ รหัสที่ไม่รวมอยู่ในรายการจะถือว่าเป็นไวลด์การ์ดโดยมีข้อยกเว้นข้อเดียว นั่นคือคุณจะระบุรหัสผลิตภัณฑ์ได้เฉพาะเมื่อระบุรหัสผู้ให้บริการด้วยเท่านั้น มิเช่นนั้น ระบบจะถือว่านโยบายไม่มีผลและจะไม่สนใจนโยบาย + + รูปแบบสิทธิ์ USB ใช้ URL ของเว็บไซต์ที่ส่งคำขอ ("URL ที่ส่งคำขอ") และ URL ของเว็บไซต์กรอบระดับบนสุด ("URL ที่มีการฝัง") เพื่อให้สิทธิ์ URL ที่ส่งคำขอในการเข้าถึงอุปกรณ์ USB โดย URL ที่ส่งคำขออาจต่างจาก URL ที่มีการฝังเมื่อมีการโหลดเว็บไซต์ที่ส่งคำขอใน iframe ดังนั้นช่อง "urls" อาจมีสตริง URL ได้ถึง 2 สตริงโดยคั่นด้วยเครื่องหมายจุลภาคเพื่อระบุ URL ที่ส่งคำขอและ URL ที่มีการฝังตามลำดับ หากมีการระบุ URL เพียงรายการเดียว ระบบจะให้สิทธิ์เข้าถึงอุปกรณ์ USB ที่เกี่ยวข้องเมื่อ URL ของเว็บไซต์ที่ส่งคำขอตรงกับ URL นี้ไม่ว่าสถานะการฝังจะเป็นอย่างไร URL ในช่อง "urls" ต้องเป็น URL ที่ถูกต้อง มิเช่นนั้น ระบบจะไม่สนใจนโยบาย + + หากไม่ได้ตั้งค่านโยบายนี้ ระบบจะใช้ค่าเริ่มต้นส่วนกลางกับเว็บไซต์ทั้งหมด ไม่ว่าจะมาจากนโยบาย "DefaultWebUsbGuardSetting" (หากตั้งค่าไว้) หรือการกำหนดค่าส่วนตัวของผู้ใช้ (หากไม่ได้ตั้งค่าไว้) + + รูปแบบ URL ในนโยบายนี้ไม่ควรขัดแย้งกับรูปแบบที่กำหนดค่าผ่าน WebUsbBlockedForUrls หากขัดแย้งกัน ระบบจะใช้นโยบายนี้แทน WebUsbBlockedForUrls และ WebUsbAskForUrls + + ค่าของนโยบายนี้และนโยบาย WebUsbAllowDevicesForUrls จะรวมเข้าด้วยกัน</translation> <translation id="4298509794364745131">ระบุรายชื่อแอปที่เปิดใช้เป็นแอปสำหรับจดโน้ตในหน้าจอล็อกของ <ph name="PRODUCT_OS_NAME" /> ได้ ถ้าคุณเปิดใช้แอปสำหรับจดโน้ตที่ต้องการในหน้าจอล็อก หน้าจอล็อกจะมีองค์ประกอบ UI สำหรับเปิดแอปสำหรับจดโน้ตดังกล่าว @@ -1955,6 +1960,7 @@ <translation id="4639407427807680016">ชื่อของโฮสต์การรับส่งข้อความดั้งเดิมที่จะยกเว้นจากบัญชีดำ</translation> <translation id="4650759511838826572">ปิดใช้งานสกีมโปรโตคอล URL</translation> <translation id="465099050592230505">URL เว็บสโตร์ขององค์กร (เลิกใช้งาน)</translation> +<translation id="4661889655253181651">การตั้งค่าเนื้อหาช่วยให้คุณระบุวิธีจัดการเนื้อหาบางประเภท (เช่น คุกกี้ รูปภาพ หรือ JavaScript)</translation> <translation id="4665897631924472251">การตั้งค่าการจัดการส่วนขยาย</translation> <translation id="4668325077104657568">การตั้งค่าภาพเริ่มต้น</translation> <translation id="4670865688564083639">ต่ำสุด:</translation> @@ -1999,6 +2005,11 @@ รายการแนะนำเหล่านี้จะดึงข้อมูลแบบระยะไกลจากเซิร์ฟเวอร์ Google หากตั้งค่าเป็น "เท็จ" ระบบจะไม่ดึงข้อมูลหรือแสดงรายการแนะนำ</translation> +<translation id="4759650396863318477">อนุญาตให้คุณตั้งค่าระยะเวลา (หน่วยเป็นมิลลิวินาที) ที่จะแสดงการแจ้งเตือนให้ผู้ใช้ทราบว่าต้องเปิด <ph name="PRODUCT_NAME" /> ขึ้นมาใหม่หรือต้องรีสตาร์ทอุปกรณ์ <ph name="PRODUCT_OS_NAME" /> เพื่อนำอัปเดตที่รอดำเนินการไปใช้ + + ระหว่างช่วงเวลานี้ ผู้ใช้จะได้รับการแจ้งเตือนอยู่เรื่อยๆ ว่าต้องอัปเดต สำหรับอุปกรณ์ <ph name="PRODUCT_OS_NAME" /> การแจ้งเตือนให้รีสตาร์ทจะปรากฏในถาดระบบตามนโยบาย <ph name="RELAUNCH_HEADS_UP_PERIOD_POLICY_NAME" /> สำหรับเบราว์เซอร์ <ph name="PRODUCT_NAME" /> เมนูแอปจะเปลี่ยนไปเพื่อบ่งชี้ว่าผู้ใช้ต้องเปิดเบราว์เซอร์ขึ้นมาใหม่เมื่อระยะเวลาแจ้งเตือนผ่านไป 1 ใน 3 จากนั้นการแจ้งเตือนจะเปลี่ยนสีเมื่อระยะเวลาแจ้งเตือนผ่านไป 2 ใน 3 ของระยะเวลาทั้งหมด และเปลี่ยนสีอีกครั้งเมื่อการแจ้งเตือนครบกำหนด การแจ้งเตือนอื่นๆ ที่เปิดใช้โดยนโยบาย <ph name="RELAUNCH_NOTIFICATION_POLICY_NAME" /> จะเป็นไปตามกำหนดเวลานี้ + + หากไม่ได้ตั้งค่า ระบบจะใช้ระยะเวลาเริ่มต้นที่ 345,600,000 มิลลิวินาที (4 วัน) สำหรับอุปกรณ์ <ph name="PRODUCT_OS_NAME" /> และ 604,800,000 มิลลิวินาที (1 สัปดาห์) สำหรับ <ph name="PRODUCT_NAME" /></translation> <translation id="4788252609789586009">เปิดใช้ฟีเจอร์ข้อความป้อนอัตโนมัติของ <ph name="PRODUCT_NAME" /> และอนุญาตให้ผู้ใช้ป้อนข้อมูลบัตรเครดิตในเว็บฟอร์มโดยอัตโนมัติด้วยข้อมูลที่เก็บไว้ก่อนหน้านี้ หากคุณปิดใช้การตั้งค่านี้ ฟีเจอร์ป้อนข้อความอัตโนมัติจะไม่แนะนำหรือกรอกข้อมูลบัตรเครดิตให้โดยอัตโนมัติ และจะไม่บันทึกข้อมูลบัตรเครดิตที่ผู้ใช้อาจส่งมาขณะเรียกดูเว็บ @@ -2192,6 +2203,15 @@ <translation id="5208240613060747912">ช่วยให้คุณกำหนดรายการของรูปแบบ URL ที่ระบุไซต์ที่ไม่ได้รับอนุญาตให้แสดงการแจ้งเตือน หากนโยบายนี้ไม่มีการกำหนดไว้ จะใช้ค่าเริ่มต้นทั่วไปสำหรับไซต์ทั้งหมด ทั้งจากนโยบาย "DefaultNotificationsSetting" หากมีการตั้งค่าไว้หรือจากการกำหนดค่าส่วนบุคคลของผู้ใช้เอง</translation> <translation id="5213038356678567351">เว็บไซต์ที่ไม่ควรทริกเกอร์การเปลี่ยนเบราว์เซอร์</translation> <translation id="5219844027738217407">สำหรับแอป Android นโยบายนี้จะส่งผลต่อไมโครโฟนเท่านั้น เมื่อตั้งค่านโยบายเป็น True ไมโครโฟนจะปิดเสียงสำหรับแอป Android ทุกแอปโดยไม่มีข้อยกเว้น</translation> +<translation id="5221394278852982313">อนุญาตให้คุณตั้งค่ารายการ URL ซึ่งระบุเว็บไซต์ที่จะได้รับสิทธิ์เข้าถึงอุปกรณ์ USB โดยอัตโนมัติ พร้อมรหัสผู้ให้บริการและรหัสผลิตภัณฑ์ที่กำหนด รายการย่อยในรายการจะต้องมีทั้งอุปกรณ์และ URL เพื่อให้นโยบายมีผล แต่ละรายการในอุปกรณ์อาจมีช่องรหัสผู้ให้บริการและรหัสผลิตภัณฑ์ รหัสที่ไม่รวมอยู่ในรายการจะถือว่าเป็นไวลด์การ์ดโดยมีข้อยกเว้นข้อเดียว นั่นก็คือคุณจะระบุรหัสผลิตภัณฑ์ได้เฉพาะเมื่อระบุรหัสผู้ให้บริการด้วยเท่านั้น มิเช่นนั้น ระบบจะถือว่านโยบายไม่มีผลและจะไม่สนใจนโยบาย + + รูปแบบสิทธิ์ USB ใช้ URL ของเว็บไซต์ที่ส่งคำขอ ("URL ที่ส่งคำขอ") และ URL ของเว็บไซต์กรอบระดับบนสุด ("URL ที่มีการฝัง") เพื่อให้สิทธิ์ URL ที่ส่งคำขอในการเข้าถึงอุปกรณ์ USB โดย URL ที่ส่งคำขออาจต่างจาก URL ที่มีการฝังเมื่อมีการโหลดเว็บไซต์ที่ส่งคำขอใน iframe ดังนั้นช่อง "urls" อาจมีสตริง URL ได้ถึง 2 สตริงโดยคั่นด้วยเครื่องหมายจุลภาคเพื่อระบุ URL ที่ส่งคำขอและ URL ที่มีการฝังตามลำดับ หากมีการระบุ URL เพียงรายการเดียว ระบบจะให้สิทธิ์เข้าถึงอุปกรณ์ USB ที่เกี่ยวข้องเมื่อ URL ของเว็บไซต์ที่ส่งคำขอตรงกับ URL นี้ไม่ว่าสถานะการฝังจะเป็นอย่างไร URL ในช่อง "urls" ต้องเป็น URL ที่ถูกต้อง มิเช่นนั้น ระบบจะไม่สนใจนโยบาย + + หากไม่ได้ตั้งค่านโยบายนี้ ระบบจะใช้ค่าเริ่มต้นส่วนกลางกับเว็บไซต์ทั้งหมด ไม่ว่าจะมาจากนโยบาย "DefaultWebUsbGuardSetting" (หากตั้งค่าไว้) หรือการกำหนดค่าส่วนตัวของผู้ใช้ (หากไม่ได้ตั้งค่าไว้) + + รูปแบบ URL ในนโยบายนี้ไม่ควรขัดแย้งกับรูปแบบที่กำหนดค่าผ่าน WebUsbBlockedForUrls หากขัดแย้งกัน ระบบจะใช้นโยบายนี้แทน WebUsbBlockedForUrls และ WebUsbAskForUrls + + ค่าของนโยบายนี้และนโยบาย DeviceWebUsbAllowDevicesForUrls จะรวมเข้าด้วยกัน</translation> <translation id="5228316810085661003">การเข้าสู่ระบบอัตโนมัติไปยังบัญชีภายในอุปกรณ์ล่าช้า หากไม่ได้ตั้งค่านโยบาย |DeviceLocalAccountAutoLoginId| นโยบายนี้จะไม่มีผลใดๆ ยกเว้นกรณีดังต่อไปนี้ @@ -2909,6 +2929,20 @@ หากตั้งค่านโยบายนี้เป็น ''ไม่อนุญาตให้ผู้ใช้จัดการใบรับรอง'' ผู้ใช้จะจัดการใบรับรองไม่ได้และจะดูใบรับรองได้อย่างเดียว</translation> <translation id="6573305661369899995">ตั้งค่าแหล่งที่มาภายนอกของข้อจำกัด URL</translation> +<translation id="6583851521569686409">กำหนดค่ารายการเครื่องพิมพ์ + + นโยบายนี้ช่วยให้ผู้ดูแลระบบกำหนดค่าเครื่องพิมพ์ให้ผู้ใช้ของตนได้ + + <ph name="PRINTER_DISPLAY_NAME" /> และ <ph name="PRINTER_DESCRIPTION" /> เป็นสตริงรูปแบบอิสระที่ปรับแต่งได้เพื่อการเลือกเครื่องพิมพ์ที่ง่ายขึ้น <ph name="PRINTER_MANUFACTURER" /> และ <ph name="PRINTER_MODEL" /> ช่วยให้ผู้ใช้ปลายทางระบุเครื่องพิมพ์ได้โดยง่าย ด้วยการแสดงชื่อผู้ผลิตและรุ่นของเครื่องพิมพ์ <ph name="PRINTER_URI" /> ควรเป็นที่อยู่ที่เข้าถึงได้จากคอมพิวเตอร์ของลูกค้า รวมถึง <ph name="URI_SCHEME" />, <ph name="URI_PORT" /> และ <ph name="URI_QUEUE" /> คุณจะระบุ <ph name="PRINTER_UUID" /> หรือไม่ก็ได้ หากระบุ ข้อมูลนี้จะใช้เพื่อช่วยกรองเครื่องพิมพ์ <ph name="ZEROCONF_DISCOVERY" /> ที่ซ้ำกันออก + + <ph name="PRINTER_EFFECTIVE_MODEL" /> ควรมีชื่อเครื่องพิมพ์หรือ <ph name="PRINTER_AUTOCONF" /> ควรตั้งค่าเป็น "จริง" ระบบจะไม่สนใจเครื่องพิมพ์ที่มีพร็อพเพอร์ตี้ทั้ง 2 รายการหรือไม่มีเลย + + การตั้งค่าเครื่องพิมพ์จะเสร็จสมบูรณ์เมื่อใช้เครื่องพิมพ์เป็นครั้งแรก จะไม่มีการดาวน์โหลด PPD จนกว่าจะมีการใช้เครื่องพิมพ์ หลังจากนั้น ระบบจะเก็บ PPD ที่ใช้บ่อยไว้ในแคช + + นโยบายนี้ไม่มีผลต่อความสามารถของผู้ใช้ในการกำหนดค่าเครื่องพิมพ์ในอุปกรณ์ใดๆ แต่เป็นเพียงนโยบายเพิ่มเติมสำหรับการกำหนดค่าเครื่องพิมพ์ของผู้ใช้แต่ละราย + + สำหรับอุปกรณ์ที่จัดการโดย Active Directory นโยบายนี้รองรับการขยาย <ph name="MACHINE_NAME_VARIABLE" /> ในชื่อเครื่อง Active Directory หรือสตริงย่อย ตัวอย่างเช่น หากชื่อเครื่องคือ <ph name="MACHINE_NAME_EXAMPLE" /> ระบบก็จะแทนที่ <ph name="MACHINE_NAME_VARIABLE_EXAMPLE" /> ด้วยอักขระ 4 ตัวที่เริ่มหลังจากตำแหน่งที่ 6 นั่นคือ <ph name="MACHINE_NAME_PART_EXAMPLE" /> โปรดทราบว่าตำแหน่งจะเริ่มนับจากศูนย์ + </translation> <translation id="6598235178374410284">รูปโปรไฟล์ของผู้ใช้</translation> <translation id="6603004149426829878">ส่งสัญญาณแจ้งตำแหน่งใดก็ตามที่มีอยู่ไปยังเซิร์ฟเวอร์ทุกครั้งขณะค้นหาเขตเวลา</translation> <translation id="6628120204569232711">รายงานสถานะของพื้นที่เก็บข้อมูล</translation> @@ -3346,7 +3380,6 @@ หากกำหนดนโยบายนี้เป็น "RemoveLRUIfDormant" การล้างข้อมูลอัตโนมัติจะลบผู้ใช้ที่ไม่ได้เข้าสู่ระบบอย่างน้อย 3 เดือนไปเรื่อยๆ ตามลำดับการไม่เข้าสู่ระบบนานที่สุดจนกระทั่งมีพื้นที่ว่างเหลือพอ หากไม่ได้กำหนดค่านโยบายนี้ การล้างข้อมูลอัตโนมัติจะใช้กลยุทธ์เริ่มต้นที่มีในตัว ซึ่งปัจจุบันคือกลยุทธ์ "RemoveLRUIfDormant"</translation> -<translation id="7334274148831027933">เปิดใช้แว่นขยายหน้าจอบางส่วน</translation> <translation id="7336785017449297672">ควบคุมการตั้งค่านาฬิกาและเขตเวลา</translation> <translation id="7336878834592315572">เก็บคุกกี้ไว้ในระหว่างช่วงเวลาของเซสชัน</translation> <translation id="7339315111520512972">บังคับให้เรียกใช้โค้ดเครือข่ายในกระบวนการของเบราว์เซอร์</translation> @@ -4235,6 +4268,8 @@ หากนโยบายตั้งค่าเป็น True <ph name="PRODUCT_OS_NAME" /> จะทริกเกอร์การเริ่มอุปกรณ์ใหม่เมื่อผู้ใช้ปิดอุปกรณ์ <ph name="PRODUCT_OS_NAME" /> จะแทนรายการปุ่มปิดทั้งหมดใน UI ด้วยปุ่มเริ่มต้นใหม่ หากผู้ใช้ปิดอุปกรณ์ด้วยปุ่มเปิด/ปิด เครื่องจะไม่เริ่มต้นใหม่โดยอัตโนมัติ แม้ว่าจะเปิดใช้นโยบายก็ตาม</translation> <translation id="9152473318295429890">เปิดใช้คำแนะนำตามบริบทของหน้าเว็บที่เกี่ยวข้อง</translation> +<translation id="9153446010242995516">ย้อนกลับไปใช้เวอร์ชันเป้าหมายและใช้เวอร์ชันเป้าหมายเสมอหากใช้ระบบปฏิบัติการเวอร์ชันที่ใหม่กว่า พยายามใช้ค่ากำหนดระดับอุปกรณ์ต่อไป (รวมถึงข้อมูลเข้าสู่ระบบเครือข่าย) ผ่านขั้นตอนการย้อนกลับเวอร์ชัน หากเป็นไปได้ แต่อย่าทำ Powerwash เต็มรูปแบบถ้าคืนค่าข้อมูลไม่ได้ (เพราะเวอร์ชันเป้าหมายไม่รองรับการคืนค่าข้อมูลหรือเพราะมีการเปลี่ยนแปลงย้อนหลังที่เข้ากันไม่ได้) + รองรับใน <ph name="PRODUCT_OS_NAME" /> เวอร์ชัน 75 ขึ้นไป สำหรับไคลเอ็นต์เก่า ค่านี้หมายความว่าการย้อนกลับเวอร์ชันปิดอยู่</translation> <translation id="9158929520101169054">อนุญาตการลงชื่อเข้าสู่ระบบพร้อมกันหลายบัญชีในเบราว์เซอร์</translation> <translation id="9159126470527871268">แจ้งให้ผู้ใช้ทราบว่าต้องเปิด <ph name="PRODUCT_NAME" /> ขึ้นมาใหม่หรือต้องรีสตาร์ท <ph name="PRODUCT_OS_NAME" /> เพื่อนำอัปเดตที่รอดำเนินการไปใช้
diff --git a/components/policy/resources/policy_templates_tr.xtb b/components/policy/resources/policy_templates_tr.xtb index 20545489..6814796 100644 --- a/components/policy/resources/policy_templates_tr.xtb +++ b/components/policy/resources/policy_templates_tr.xtb
@@ -132,15 +132,6 @@ Politika yanlış değerine ayarlanmışsa geliştirici anahtarının durumu rapor edilmez.</translation> <translation id="1160479894929412407">QUIC protokolüne izin verin</translation> <translation id="1160939557934457296">Güvenli Tarama uyarı sayfasından ilerlemeyi devre dışı bırak</translation> -<translation id="1171342272070128466">Yuvaya yerleştirilmiş büyüteç erişilebilirlik özelliğini etkinleştirin. - - Bu politika true (doğru) değerine ayarlanırsa, yuvaya yerleştirilmiş büyüteç her zaman etkin olur. - - Bu politika false (yanlış) değerine ayarlanırsa, yuvaya yerleştirilmiş büyüteç her zaman devre dışı olur. - - Bu politikayı ayarlarsanız kullanıcılar değiştiremez veya geçersiz kılamazlar. - - Bu politika ayarlanmadan bırakılırsa, yuvaya yerleştirilmiş büyüteç başlangıçta devre dışıdır, ancak istenildiğinde kullanıcı tarafından etkinleştirilebilir.</translation> <translation id="1189817621108632689">Bildirim görüntülemelerine izin verilmeyen sitelerin belirtildiği bir URL kalıpları listesi ayarlamanıza olanak tanır. Bu politika ayarlanmadan bırakılırsa, "DefaultImagesSetting" politikası ayarlandıysa buradaki değer, aksi takdirde kullanıcının kişisel yapılandırması tüm siteler için genel varsayılan değer olarak kullanılır. @@ -1564,11 +1555,6 @@ <translation id="3851039766298741586">Uygulama kimliği ve sürümü gibi aktif kiosk oturumuyla ilgili bilgileri rapor edin. Bu politika yanlış seçeneğine ayarlanırsa kiosk oturum bilgileri rapor edilmez. Doğru seçeneğine ayarlanırsa veya ayarlanmadan bırakılırsa oturum bilgileri rapor edilir.</translation> -<translation id="3852924591079583104"> - Bu politika ArcSession değerine ayarlandığında, Android başlatılmışsa kullanıcı oturumu kapatıldığında cihazı yeniden başlamaya zorlar. - Always (Her zaman) değerine ayarlandığında, kullanıcı oturumu her kapatıldığında cihazı yeniden başlamaya zorlar. - Bu politika ayarlanmadan bırakılırsa hiçbir etkisi olmaz ve kullanıcı oturumu kapatıldığında cihaz yeniden başlamaya zorlanmaz. Never (Hiçbir zaman) değerine ayarlanırsa da aynısı geçerli olur. - </translation> <translation id="3858658082795336534">Varsayılan dupleks yazdırma modu</translation> <translation id="3859780406608282662"><ph name="PRODUCT_OS_NAME" /> içindeki Varyasyonlar çekirdeğini getirmek için bir parametre ekleyin. @@ -2385,7 +2371,7 @@ Bu politika etkinleştirilirse tarayıcı penceresi başlatılmaz. - Bu politika devre dışı bırakılır veya ayarlanmazsa tarayıcı penceresinin başlatılmasına izin verilir. Tarayıcı penceresinin başka politikalar veya komut satırı işaretleri nedeniyle başlamayabileceğini göz önünde bulundurun.</translation> + Bu politika devre dışı bırakılır veya ayarlanmazsa tarayıcı penceresinin başlatılmasına izin verilir. Tarayıcı penceresinin başka politikalar veya komut satırı işaretleri nedeniyle de başlamayabileceğini göz önünde bulundurun.</translation> <translation id="5427879482805712214">Bu politika, giriş ekranında kullanıcıyı temsil eden avatar resmini yapılandırmanıza olanak tanır. Politika, avatar resminin <ph name="PRODUCT_OS_NAME" /> tarafından indirilebileceği URL'nin belirtilmesi ve indirme işleminin bütünlüğünü doğrulamak için kullanılacak şifreleme karmasının tanımlanmasıyla ayarlanır. Resim JPEG biçiminde olmalı, boyutu 512 kB'tan fazla olmamalıdır. URL'ye kimlik doğrulaması yapmadan erişilebilmelidir. Avatar resmi indirilir ve önbelleğe alınır. URL veya karma her değiştiğinde resim tekrar indirilir. @@ -3438,7 +3424,6 @@ Bu politika "RemoveLRUIfDormant" olarak ayarlanırsa, otomatik temizleme yeterli disk alanı oluşuncaya kadar en eski oturum açan kullanıcıdan başlayarak en az 3 aydır oturum açmayan kullanıcıları sırayla kaldırır. Bu politika ayarlanmazsa, otomatik temizleme varsayılan yerleşik stratejiyi kullanır. Şu an bu "RemoveLRUIfDormant" stratejisidir.</translation> -<translation id="7334274148831027933">Yerleştirilmiş büyüteci etkinleştir</translation> <translation id="7336785017449297672">Saat ve saat dilimi ayarlarını kontrol eder.</translation> <translation id="7336878834592315572">Oturum süresince çerezleri tutma</translation> <translation id="7339315111520512972">Ağ iletişimi kodunu tarayıcı işleminde çalışmaya zorla</translation>
diff --git a/components/policy/resources/policy_templates_uk.xtb b/components/policy/resources/policy_templates_uk.xtb index 865c06a71..4ee60865 100644 --- a/components/policy/resources/policy_templates_uk.xtb +++ b/components/policy/resources/policy_templates_uk.xtb
@@ -147,15 +147,6 @@ Якщо це правило не налаштовано або має значення "false", звіт про стан перемикача "режим розробника" не надсилатиметься.</translation> <translation id="1160479894929412407">Вмикає протокол QUIC</translation> <translation id="1160939557934457296">Вимикати переходи зі сторінки застереження Безпечного перегляду</translation> -<translation id="1171342272070128466">Увімкніть функцію спеціальних можливостей "Закріплена лупа". - - Якщо для цього правила вибрано значення true, закріплену лупу завжди ввімкнено. - - Якщо для цього правила вибрано значення false, закріплену лупу завжди вимкнено. - - Якщо це правило налаштовано, користувачі не можуть змінювати або замінювати його. - - Якщо його не налаштовано, закріплену лупу спочатку вимкнено, але користувач може будь-коли ввімкнути її.</translation> <translation id="1189817621108632689">Дає змогу налаштовувати список шаблонів URL-адрес, що визначають сайти, яким заборонено показувати зображення. Якщо це правило не налаштовано, для всіх сайтів використовується загальне значення за умовчанням відповідно до правила DefaultImagesSetting (якщо його встановлено) чи особистих параметрів користувача. @@ -1554,11 +1545,6 @@ Якщо для цього правила вибрано значення "false", інформація про сеанс не надсилатиметься. Якщо правило не налаштовано або має значення "true", інформація про сеанс надсилатиметься.</translation> -<translation id="3852924591079583104"> - Це правило (коли встановлено значення ArcSession) ініціює перезапуск пристрою після виходу користувача з облікового запису, якщо запущено Android. - Якщо встановлено значення Always, пристрій перезапускається щоразу, коли користувач виходить з облікового запису. - Якщо це правило не налаштовано, воно не діє й перезапуск не ініціюється. Також нічого не відбувається, якщо встановлено значення Never. - </translation> <translation id="3858658082795336534">Стандартні параметри двостороннього друку</translation> <translation id="3859780406608282662">Додає параметр для отримання початкового числа Варіацій у <ph name="PRODUCT_OS_NAME" />. @@ -3386,7 +3372,6 @@ Якщо для цього правила встановлено значення "RemoveLRUIfDormant", під час автоматичного очищення з пристрою видалятимуться дані користувачів, які не входили в обліковий запис протягом останніх 3 місяців, починаючи з тих, які входили в обліковий запис найдавніше, доки не буде звільнено достатньо місця. Якщо це правило не встановлено, під час автоматичного очищення використовується правило за умовчанням. Зараз це правило "RemoveLRUIfDormant".</translation> -<translation id="7334274148831027933">Увімкнути закріплену лупу</translation> <translation id="7336785017449297672">Керує налаштуваннями годинника й часового поясу.</translation> <translation id="7336878834592315572">Зберігати файли cookie впродовж сеансу</translation> <translation id="7339315111520512972">Ініціювати виконання мережевого коду у веб-переглядачі</translation>
diff --git a/components/policy/resources/policy_templates_vi.xtb b/components/policy/resources/policy_templates_vi.xtb index 66c3ca5..219b78d 100644 --- a/components/policy/resources/policy_templates_vi.xtb +++ b/components/policy/resources/policy_templates_vi.xtb
@@ -144,15 +144,6 @@ Nếu chính sách được đặt thành sai, trạng thái của bộ chuyển đổi dành cho nhà phát triển sẽ không được báo cáo.</translation> <translation id="1160479894929412407">Cho phép giao thức kết nối Internet nhanh UDP (QUIC)</translation> <translation id="1160939557934457296">Vô hiệu hóa khả năng tiếp tục từ trang cảnh báo Duyệt web an toàn</translation> -<translation id="1171342272070128466">Bật tính năng hỗ trợ tiếp cận cho tùy chọn phóng to ở vị trí cố định. - - Nếu bạn đặt chính sách này thành true, thì tùy chọn phóng to ở vị trí cố định sẽ luôn bật. - - Nếu bạn đặt chính sách này thành false, thì tùy chọn phóng to ở vị trí cố định sẽ luôn tắt. - - Nếu bạn đặt chính sách này, thì người dùng sẽ không thể thay đổi hay ghi đè chính sách. - - Nếu bạn không đặt chính sách này, thì ban đầu, tùy chọn phóng to ở vị trí cố định sẽ tắt nhưng người dùng có thể bật bất cứ lúc nào.</translation> <translation id="1189817621108632689">Cho phép bạn đặt danh sách các mẫu url chỉ định những trang web không được phép hiển thị hình ảnh. Nếu không đặt chính sách này, thì giá trị mặc định chung sẽ được sử dụng cho tất cả các trang web từ chính sách 'DefaultImagesSetting', nếu chính sách đó được đặt, hoặc từ cấu hình cá nhân của người dùng. @@ -1574,11 +1565,6 @@ Nếu chính sách này được đặt thành false, thông tin về phiên kiosk sẽ không được báo cáo. Nếu chính sách này được đặt thành true hoặc không được đặt, thông tin về phiên kiosk sẽ được báo cáo.</translation> -<translation id="3852924591079583104"> - Khi bạn đặt chính sách này thành ArcSession, nếu Android đã khởi động, thì chính sách này sẽ buộc thiết bị khởi động lại khi đăng xuất người dùng. - Khi bạn đặt chính sách này thành Luôn khởi động lại, thì chính sách này sẽ buộc thiết bị khởi động lại mỗi khi đăng xuất người dùng. - Nếu bạn không đặt chính sách này, thì chính sách sẽ không có hiệu lực và thiết bị sẽ không bị buộc khởi động lại sau khi đăng xuất người dùng. Nếu bạn đặt chính sách này thành Không bao giờ, thì thiết bị cũng không bị buộc khởi động lại sau khi đăng xuất người dùng. - </translation> <translation id="3858658082795336534">Chế độ in hai mặt mặc định</translation> <translation id="3859780406608282662">Thêm thông số cho quá trình tìm nạp khởi đầu Biến thể trong <ph name="PRODUCT_OS_NAME" />. @@ -3460,7 +3446,6 @@ Nếu chính sách này được đặt thành 'RemoveLRUIfDormant', tính năng dọn sạch tự động sẽ tiếp tục xóa người dùng đã không đăng nhập trong ít nhất 3 tháng theo thứ tự gần đây ít đăng nhập nhất cho tới khi có đủ dung lượng trống. Nếu chính sách này không được đặt, tính năng dọn sạch tự động sẽ sử dụng chiến lược tích hợp sẵn mặc định. Hiện tại đó là chiến lược 'RemoveLRUIfDormant'.</translation> -<translation id="7334274148831027933">Bật tính năng phóng to ở vị trí cố định</translation> <translation id="7336785017449297672">Kiểm soát các tùy chọn cài đặt đồng hồ và múi giờ.</translation> <translation id="7336878834592315572">Lưu giữ cookie trong thời hạn phiên</translation> <translation id="7339315111520512972">Buộc mã nối mạng chạy trong quá trình chạy trình duyệt</translation>
diff --git a/components/policy/resources/policy_templates_zh-CN.xtb b/components/policy/resources/policy_templates_zh-CN.xtb index 6df4512c..4cfdad1 100644 --- a/components/policy/resources/policy_templates_zh-CN.xtb +++ b/components/policy/resources/policy_templates_zh-CN.xtb
@@ -130,15 +130,6 @@ 如果此政策设为False,则不报告dev开关的状态。</translation> <translation id="1160479894929412407">允许使用 QUIC 协议</translation> <translation id="1160939557934457296">禁止从安全浏览警告页面继续访问</translation> -<translation id="1171342272070128466">启用停靠的放大镜无障碍功能。 - - 如果将此政策设置为 true,停靠的放大镜将始终处于启用状态。 - - 如果将此政策设置为 false,停靠的放大镜将始终处于停用状态。 - - 如果您设置了此政策,用户将无法更改或覆盖它。 - - 如果未设置此政策,则停靠的放大镜最初会处于停用状态,但用户可以随时启用该功能。</translation> <translation id="1189817621108632689">让您能够设置一系列网址格式,以用于指定允许哪些网站显示图片。 如果未设置此政策,系统将会对所有网站使用“DefaultImagesSetting”政策中的全局默认值(倘若已设置“DefaultImagesSetting”政策),或使用用户个人配置中的全局默认值(倘若未设置“DefaultImagesSetting”政策)。 @@ -1489,11 +1480,6 @@ <translation id="3851039766298741586">报告有关当前自助服务终端会话的信息,例如应用 ID 和版本。 如果此政策设为 false,则系统不会报告自助服务终端会话信息。如果此政策设为 true 或未设置,则系统会报告自助服务终端会话信息。</translation> -<translation id="3852924591079583104"> - 如果将此政策设为 ArcSession,系统会在用户退出后强制相应设备重新启动(如果 Android 已启动)。 - 如果将此政策设为 Always,则系统会在每位用户退出后都强制相应设备重新启动。 - 如果未设置,此政策将不会产生任何效力,也不会在用户退出后强制相应设备重新启动。如果设为 Never,结果也一样。 - </translation> <translation id="3858658082795336534">默认使用双面打印模式</translation> <translation id="3859780406608282662">在提取 <ph name="PRODUCT_OS_NAME" /> 中的变体种子的方法中添加参数。 @@ -3275,7 +3261,6 @@ 如果此政策设为“RemoveLRUIfDormant”,自动清理将按最近最少登录顺序移除至少已有3个月未登录的用户,直至系统有足够的可用空间。 如果此政策未设置,自动清理将使用默认的内置策略(目前为“RemoveLRUIfDormant”策略)。</translation> -<translation id="7334274148831027933">启用停靠的放大镜</translation> <translation id="7336785017449297672">控制时钟和时区设置。</translation> <translation id="7336878834592315572">在会话期间保留 Cookie</translation> <translation id="7339315111520512972">强制网络代码在浏览器进程中运行</translation>
diff --git a/components/policy/resources/policy_templates_zh-TW.xtb b/components/policy/resources/policy_templates_zh-TW.xtb index 6a197bd..4520cea 100644 --- a/components/policy/resources/policy_templates_zh-TW.xtb +++ b/components/policy/resources/policy_templates_zh-TW.xtb
@@ -133,15 +133,6 @@ 如果這項政策設為 False,則不會回報開發人員模式切換設定的狀態。</translation> <translation id="1160479894929412407">允許 QUIC 通訊協定</translation> <translation id="1160939557934457296">停用略過安全瀏覽警告網頁繼續進行</translation> -<translation id="1171342272070128466">啟用停駐放大鏡無障礙功能。 - - 如果將這項政策設為 True,系統將一律啟用停駐放大鏡功能。 - - 如果將這項政策設為 False,系統將一律停用停駐放大鏡功能。 - - 設定這項政策後,使用者即無法變更或覆寫。 - - 如果未設定這項政策,系統預設會停用停駐放大鏡,但使用者可以隨時啟用這項功能。</translation> <translation id="1189817621108632689">讓你設定網址模式清單,指定不可顯示圖片的網站。 如果未設定這項政策,系統會根據「DefaultImagesSetting」政策 (如有設定) 或使用者的個人設定,將通用預設值套用至所有網站。 @@ -1529,11 +1520,6 @@ 如果將政策設為 false,系統將不會回報資訊站工作階段資訊。 如果設為 true 或不予設定,則會回報資訊站工作階段資訊。</translation> -<translation id="3852924591079583104"> - 如果將這項政策設為 ArcSession,系統會在 Android 已啟動的前提下,於使用者登出時強制裝置重新啟動。 - 如果將這項政策設為 Always,系統會在每位使用者登出時強制裝置重新啟動。 - 如果不設定這項政策,則不會有任何影響,系統不會在使用者登出時強制重新啟動。如果設為 Never,結果也一樣。 - </translation> <translation id="3858658082795336534">預設使用雙面列印模式</translation> <translation id="3859780406608282662">在 <ph name="PRODUCT_OS_NAME" /> 中擷取變異版本種子時新增參數。 @@ -3016,6 +3002,17 @@ </translation> <translation id="6922884955650325312">封鎖 <ph name="FLASH_PLUGIN_NAME" /> 外掛程式</translation> <translation id="6923366716660828830">指定預設搜尋引擎名稱。如果名稱欄位留空或未設定,系統會使用搜尋網址指定的主機名稱。只有在啟用「DefaultSearchProviderEnabled」政策時,系統才會遵循這項政策。</translation> +<translation id="6924223708804692571">這項政策會強制停用指定語言的拼字檢查功能。系統會忽略該清單中無法辨識的語言。 + + 如果啟用這項政策,系統會為指定的語言停用拼字檢查功能。針對不在清單上的語言,使用者仍可以啟用或停用拼字檢查功能。 + + 如果停用或不設定這項政策,則使用者的拼字檢查偏好設定不會受到任何影響。 + + 如果將 <ph name="SPELLCHECK_ENABLED_POLICY_NAME" /> 政策設為 False,這項政策就不會有任何作用。 + + 如果某個語言同時列在這項政策和 <ph name="SPELLCHECK_LANGUAGE_POLICY_NAME" /> 政策中,系統會優先執行後者,為該語言啟用拼字檢查功能。 + + 拼字檢查功能目前支援的語言如下:af、bg、ca、cs、da、de、el、en-AU、en-CA、en-GB、en-US、es、es-419、es-AR、es-ES、es-MX、es-US、et、fa、fo、fr、he、hi、hr、hu、id、it、ko、lt、lv、nb、nl、pl、pt-BR、pt-PT、ro、ru、sh、sk、sl、sq、sr、sv、ta、tg、tr、uk、vi。</translation> <translation id="6926703471186170050">啟用長邊雙面列印</translation> <translation id="6931242315485576290">停用 Google 資料同步處理功能</translation> <translation id="6936894225179401731">指定 Proxy 伺服器的同時連線數量上限。 @@ -3151,7 +3148,7 @@ 系統套用這個 XML 檔案中所含規則的方式與 <ph name="GREYLIST_POLICY_NAME" /> 相同。也就是說,這些規則會禁止 <ph name="PRODUCT_NAME" /> 開啟替代瀏覽器,並禁止替代瀏覽器開啟 <ph name="PRODUCT_NAME" />。 - 如果未設定這項政策,或是將此政策設為無效的網址,<ph name="PRODUCT_NAME" /> 不會將其當做「不觸發瀏覽器切換」的規則來源。 + 如果未設定這項政策,或是設為無效網址,<ph name="PRODUCT_NAME" /> 就不會將政策當做「不觸發瀏覽器切換」的規則來源。 如果將這項政策設為有效的網址,<ph name="PRODUCT_NAME" /> 會從該網址下載網站清單,然後按照 <ph name="SITELIST_POLICY_NAME" /> 政策中的設定套用規則。 @@ -3300,7 +3297,6 @@ 如果這項政策設為「RemoveLRUIfDormant」,自動清理作業將會根據使用者的近期登入次數,從次數最少的使用者開始,依序把至少 3 個月未登入的使用者從裝置上移除,直到有足夠的可用空間為止。 如果未設定這項政策,自動清理作業將會採用目前的預設內建策略:「RemoveLRUIfDormant」。</translation> -<translation id="7334274148831027933">啟用停駐放大鏡</translation> <translation id="7336785017449297672">控管時鐘和時區設定。</translation> <translation id="7336878834592315572">在工作階段期間保留 Cookie</translation> <translation id="7339315111520512972">強制網路程式碼在瀏覽器程序中執行</translation> @@ -3818,7 +3814,7 @@ <translation id="8465065632133292531">使用 POST 的互動智慧搜尋網址參數</translation> <translation id="8465746466645315861">如果不設定這項政策,使用者可以在語言設定中啟用或停用拼字檢查功能。 - 如果將這項政策設為 True,系統會啟用拼字檢查功能,且使用者無法停用。在 <ph name="MS_WIN_NAME" />、<ph name="PRODUCT_OS_NAME" />和 <ph name="LINUX_OS_NAME" /> 中,使用者可以開啟或關閉各語言的拼字檢查功能,因此仍然可以透過關閉每個語言的拼字檢查來停用這項功能。如要避免這種情況,可以使用 <ph name="SPELLCHECK_LANGUAGE_POLICY_NAME" /> 政策強制啟用特定語言的拼字檢查功能。 + 如果將這項政策設為 True,系統會啟用拼字檢查功能,且使用者無法停用。在 <ph name="MS_WIN_NAME" />、<ph name="PRODUCT_OS_NAME" />和 <ph name="LINUX_OS_NAME" /> 中,使用者可以開啟或關閉個別語言的拼字檢查功能,因此只要關閉所有語言的拼字檢查,即可停用這項功能。如要避免這種情況,可以使用 <ph name="SPELLCHECK_LANGUAGE_POLICY_NAME" /> 政策強制啟用特定語言的拼字檢查功能。 如果將這項政策設為 False,系統會停用拼字檢查功能,且使用者無法啟用。如果將這項政策設為 False,<ph name="SPELLCHECK_LANGUAGE_POLICY_NAME" /> 和 <ph name="SPELLCHECK_LANGUAGE_BLACKLIST_POLICY_NAME" /> 政策將不會有任何作用。 </translation>
diff --git a/components/prefs/pref_registry.cc b/components/prefs/pref_registry.cc index 9f36c2fa..6c6aab7 100644 --- a/components/prefs/pref_registry.cc +++ b/components/prefs/pref_registry.cc
@@ -64,7 +64,7 @@ "invalid preference type: " << orig_type; DCHECK(!defaults_->GetValue(path, nullptr)) << "Trying to register a previously registered pref: " << path; - DCHECK(!base::ContainsKey(registration_flags_, path)) + DCHECK(!base::Contains(registration_flags_, path)) << "Trying to register a previously registered pref: " << path; defaults_->SetDefaultValue(path, std::move(default_value));
diff --git a/components/previews/content/previews_decider_impl.cc b/components/previews/content/previews_decider_impl.cc index 05f0b1c..d21753c 100644 --- a/components/previews/content/previews_decider_impl.cc +++ b/components/previews/content/previews_decider_impl.cc
@@ -55,12 +55,12 @@ // These types do not have server optimization hints. case PreviewsType::OFFLINE: case PreviewsType::LITE_PAGE: - case PreviewsType::LOFI: case PreviewsType::DEFER_ALL_SCRIPT: return false; case PreviewsType::NONE: case PreviewsType::UNSPECIFIED: case PreviewsType::DEPRECATED_AMP_REDIRECTION: + case PreviewsType::DEPRECATED_LOFI: case PreviewsType::LAST: break; } @@ -76,7 +76,6 @@ case PreviewsType::RESOURCE_LOADING_HINTS: case PreviewsType::DEFER_ALL_SCRIPT: return true; - case PreviewsType::LOFI: case PreviewsType::LITE_PAGE_REDIRECT: case PreviewsType::OFFLINE: case PreviewsType::LITE_PAGE: @@ -84,6 +83,7 @@ case PreviewsType::NONE: case PreviewsType::UNSPECIFIED: case PreviewsType::DEPRECATED_AMP_REDIRECTION: + case PreviewsType::DEPRECATED_LOFI: case PreviewsType::LAST: break; }
diff --git a/components/previews/content/previews_decider_impl_unittest.cc b/components/previews/content/previews_decider_impl_unittest.cc index 84b1e69..9efe547 100644 --- a/components/previews/content/previews_decider_impl_unittest.cc +++ b/components/previews/content/previews_decider_impl_unittest.cc
@@ -82,9 +82,8 @@ const uint64_t kDefaultPageId = 123456; // This method simulates the actual behavior of the passed in callback, which is -// validated in other tests. For simplicity, offline, lite page, and server LoFi -// use the offline previews check. Client LoFi uses a seperate check to verify -// that types are treated differently. +// validated in other tests. For simplicity, offline, and lite page use the +// offline previews check. bool IsPreviewFieldTrialEnabled(PreviewsType type) { switch (type) { case PreviewsType::OFFLINE: @@ -92,8 +91,8 @@ return params::IsOfflinePreviewsEnabled(); case PreviewsType::DEPRECATED_AMP_REDIRECTION: return false; - case PreviewsType::LOFI: - return params::IsClientLoFiEnabled(); + case PreviewsType::DEPRECATED_LOFI: + return false; case PreviewsType::NOSCRIPT: return params::IsNoScriptPreviewsEnabled(); case PreviewsType::RESOURCE_LOADING_HINTS: @@ -422,7 +421,6 @@ void InitializeUIServiceWithoutWaitingForBlackList() { blacklist::BlacklistData::AllowedTypesAndVersions allowed_types; allowed_types[static_cast<int>(PreviewsType::OFFLINE)] = 0; - allowed_types[static_cast<int>(PreviewsType::LOFI)] = 0; allowed_types[static_cast<int>(PreviewsType::LITE_PAGE)] = 0; allowed_types[static_cast<int>(PreviewsType::LITE_PAGE_REDIRECT)] = 0; allowed_types[static_cast<int>(PreviewsType::NOSCRIPT)] = 0; @@ -491,13 +489,11 @@ TEST_F(PreviewsDeciderImplTest, AllPreviewsDisabledByFeature) { base::test::ScopedFeatureList scoped_feature_list; scoped_feature_list.InitWithFeatures( - {features::kClientLoFi, features::kNoScriptPreviews}, + {features::kNoScriptPreviews}, {features::kPreviews} /* disable_features */); InitializeUIService(); PreviewsUserData user_data(kDefaultPageId); - EXPECT_FALSE(previews_decider_impl()->ShouldAllowPreviewAtNavigationStart( - &user_data, GURL("https://www.google.com"), false, PreviewsType::LOFI)); PreviewsUserData user_data2(kDefaultPageId); EXPECT_FALSE(previews_decider_impl()->ShouldAllowPreviewAtNavigationStart( @@ -508,7 +504,7 @@ TEST_F(PreviewsDeciderImplTest, TestDisallowBasicAuthentication) { base::test::ScopedFeatureList scoped_feature_list; scoped_feature_list.InitWithFeatures( - {features::kPreviews, features::kClientLoFi}, {}); + {features::kPreviews, features::kOfflinePreviews}, {}); InitializeUIService(); ReportEffectiveConnectionType(net::EFFECTIVE_CONNECTION_TYPE_2G); @@ -516,12 +512,12 @@ PreviewsUserData user_data(kDefaultPageId); EXPECT_FALSE(previews_decider_impl()->ShouldAllowPreviewAtNavigationStart( &user_data, GURL("https://user:pass@www.google.com"), false, - PreviewsType::LOFI)); + PreviewsType::OFFLINE)); histogram_tester.ExpectBucketCount( "Previews.EligibilityReason", static_cast<int>(PreviewsEligibilityReason::URL_HAS_BASIC_AUTH), 1); histogram_tester.ExpectBucketCount( - "Previews.EligibilityReason.LoFi", + "Previews.EligibilityReason.Offline", static_cast<int>(PreviewsEligibilityReason::URL_HAS_BASIC_AUTH), 1); } @@ -625,7 +621,7 @@ InitializeUIService(); PreviewsUserData user_data(kDefaultPageId); - // LoFi and LitePage check NQE on their own. + // LitePage check NQE on its own. ReportEffectiveConnectionType(net::EFFECTIVE_CONNECTION_TYPE_4G); base::HistogramTester histogram_tester; @@ -691,10 +687,10 @@ static_cast<int>(PreviewsEligibilityReason::RELOAD_DISALLOWED), 1); } -TEST_F(PreviewsDeciderImplTest, TestDisallowLoFiOnReloadWithExperiment) { +TEST_F(PreviewsDeciderImplTest, TestDisallowOfflineOnReloadWithExperiment) { base::test::ScopedFeatureList scoped_feature_list; scoped_feature_list.InitWithFeatures( - {features::kPreviews, features::kClientLoFi}, {}); + {features::kPreviews, features::kOfflinePreviews}, {}); InitializeUIService(); ReportEffectiveConnectionType(net::EFFECTIVE_CONNECTION_TYPE_2G); @@ -703,12 +699,12 @@ base::HistogramTester histogram_tester; EXPECT_FALSE(previews_decider_impl()->ShouldAllowPreviewAtNavigationStart( - &user_data, GURL("https://www.google.com"), true, PreviewsType::LOFI)); + &user_data, GURL("https://www.google.com"), true, PreviewsType::OFFLINE)); histogram_tester.ExpectUniqueSample( "Previews.EligibilityReason", static_cast<int>(PreviewsEligibilityReason::RELOAD_DISALLOWED), 1); histogram_tester.ExpectUniqueSample( - "Previews.EligibilityReason.LoFi", + "Previews.EligibilityReason.Offline", static_cast<int>(PreviewsEligibilityReason::RELOAD_DISALLOWED), 1); } @@ -749,28 +745,29 @@ } } -TEST_F(PreviewsDeciderImplTest, ClientLoFiDisallowedWhenFeatureDisabled) { +TEST_F(PreviewsDeciderImplTest, OfflineDisallowedWhenFeatureDisabled) { base::test::ScopedFeatureList scoped_feature_list; scoped_feature_list.InitWithFeatures({features::kPreviews}, - {features::kClientLoFi}); + {features::kOfflinePreviews}); InitializeUIService(); EXPECT_EQ(net::EFFECTIVE_CONNECTION_TYPE_2G, - params::GetECTThresholdForPreview(PreviewsType::LOFI)); + params::GetECTThresholdForPreview(PreviewsType::OFFLINE)); ReportEffectiveConnectionType(net::EFFECTIVE_CONNECTION_TYPE_2G); PreviewsUserData user_data(kDefaultPageId); base::HistogramTester histogram_tester; EXPECT_FALSE(previews_decider_impl()->ShouldAllowPreviewAtNavigationStart( - &user_data, GURL("https://www.google.com"), false, PreviewsType::LOFI)); - histogram_tester.ExpectTotalCount("Previews.EligibilityReason.LoFi", 0); + &user_data, GURL("https://www.google.com"), false, + PreviewsType::OFFLINE)); + histogram_tester.ExpectTotalCount("Previews.EligibilityReason.Offline", 0); } TEST_F(PreviewsDeciderImplTest, - ClientLoFiDisallowedWhenNetworkQualityUnavailable) { + OfflineDisallowedWhenNetworkQualityUnavailable) { base::test::ScopedFeatureList scoped_feature_list; scoped_feature_list.InitWithFeatures( - {features::kPreviews, features::kClientLoFi}, {}); + {features::kPreviews, features::kOfflinePreviews}, {}); InitializeUIService(); ReportEffectiveConnectionType(net::EFFECTIVE_CONNECTION_TYPE_UNKNOWN); @@ -778,113 +775,66 @@ PreviewsUserData user_data(kDefaultPageId); base::HistogramTester histogram_tester; EXPECT_FALSE(previews_decider_impl()->ShouldAllowPreviewAtNavigationStart( - &user_data, GURL("https://www.google.com"), false, PreviewsType::LOFI)); + &user_data, GURL("https://www.google.com"), false, + PreviewsType::OFFLINE)); histogram_tester.ExpectUniqueSample( - "Previews.EligibilityReason.LoFi", + "Previews.EligibilityReason.Offline", static_cast<int>(PreviewsEligibilityReason::NETWORK_QUALITY_UNAVAILABLE), 1); } -TEST_F(PreviewsDeciderImplTest, ClientLoFiDisallowedWhenNetworkFast) { +TEST_F(PreviewsDeciderImplTest, OfflineDisallowedWhenNetworkFast) { base::test::ScopedFeatureList scoped_feature_list; scoped_feature_list.InitWithFeatures( - {features::kPreviews, features::kClientLoFi}, {}); + {features::kPreviews, features::kOfflinePreviews}, {}); InitializeUIService(); EXPECT_EQ(net::EFFECTIVE_CONNECTION_TYPE_2G, - params::GetECTThresholdForPreview(PreviewsType::LOFI)); + params::GetECTThresholdForPreview(PreviewsType::OFFLINE)); ReportEffectiveConnectionType(net::EFFECTIVE_CONNECTION_TYPE_3G); base::HistogramTester histogram_tester; PreviewsUserData user_data(kDefaultPageId); EXPECT_FALSE(previews_decider_impl()->ShouldAllowPreviewAtNavigationStart( - &user_data, GURL("https://www.google.com"), false, PreviewsType::LOFI)); + &user_data, GURL("https://www.google.com"), false, + PreviewsType::OFFLINE)); histogram_tester.ExpectUniqueSample( - "Previews.EligibilityReason.LoFi", + "Previews.EligibilityReason.Offline", static_cast<int>(PreviewsEligibilityReason::NETWORK_NOT_SLOW), 1); } -TEST_F(PreviewsDeciderImplTest, ClientLoFiAllowed) { - base::test::ScopedFeatureList scoped_feature_list; - scoped_feature_list.InitWithFeatures( - {features::kPreviews, features::kClientLoFi}, {}); - InitializeUIService(); - - // Verify basic check. - PreviewsUserData user_data(kDefaultPageId); - EXPECT_TRUE(previews_decider_impl()->ShouldAllowPreviewAtNavigationStart( - &user_data, GURL("https://www.google.com"), false, PreviewsType::LOFI)); - - // Verify ECT check cases below. - - EXPECT_EQ(net::EFFECTIVE_CONNECTION_TYPE_2G, - params::GetECTThresholdForPreview(PreviewsType::LOFI)); - - const struct { - net::EffectiveConnectionType effective_connection_type; - bool expected_client_lofi_allowed; - } tests[] = { - {net::EFFECTIVE_CONNECTION_TYPE_UNKNOWN, false}, - {net::EFFECTIVE_CONNECTION_TYPE_OFFLINE, false}, - {net::EFFECTIVE_CONNECTION_TYPE_SLOW_2G, true}, - {net::EFFECTIVE_CONNECTION_TYPE_2G, true}, - {net::EFFECTIVE_CONNECTION_TYPE_3G, false}, - }; - - for (const auto& test : tests) { - ReportEffectiveConnectionType(test.effective_connection_type); - - base::HistogramTester histogram_tester; - PreviewsUserData user_data(kDefaultPageId); - EXPECT_EQ(test.expected_client_lofi_allowed, - previews_decider_impl()->ShouldAllowPreviewAtNavigationStart( - &user_data, GURL("https://www.google.com"), false, - PreviewsType::LOFI)) - << " effective_connection_type=" << test.effective_connection_type; - if (test.expected_client_lofi_allowed) { - histogram_tester.ExpectUniqueSample( - "Previews.EligibilityReason.LoFi", - static_cast<int>(PreviewsEligibilityReason::ALLOWED), 1); - } else { - histogram_tester.ExpectBucketCount( - "Previews.EligibilityReason.LoFi", - static_cast<int>(PreviewsEligibilityReason::ALLOWED), 0); - } - } -} - TEST_F(PreviewsDeciderImplTest, MissingHostDisallowed) { base::test::ScopedFeatureList scoped_feature_list; scoped_feature_list.InitWithFeatures( - {features::kPreviews, features::kClientLoFi}, {}); + {features::kPreviews, features::kOfflinePreviews}, {}); InitializeUIService(); EXPECT_EQ(net::EFFECTIVE_CONNECTION_TYPE_2G, - params::GetECTThresholdForPreview(PreviewsType::LOFI)); + params::GetECTThresholdForPreview(PreviewsType::OFFLINE)); ReportEffectiveConnectionType(net::EFFECTIVE_CONNECTION_TYPE_2G); PreviewsUserData user_data(kDefaultPageId); EXPECT_FALSE(previews_decider_impl()->ShouldAllowPreviewAtNavigationStart( - &user_data, GURL("file:///sdcard"), false, PreviewsType::LOFI)); + &user_data, GURL("file:///sdcard"), false, PreviewsType::OFFLINE)); } -TEST_F(PreviewsDeciderImplTest, ClientLoFiDisallowedOnReload) { +TEST_F(PreviewsDeciderImplTest, OfflineDisallowedOnReload) { base::test::ScopedFeatureList scoped_feature_list; scoped_feature_list.InitWithFeatures( - {features::kPreviews, features::kClientLoFi}, {}); + {features::kPreviews, features::kOfflinePreviews}, {}); InitializeUIService(); EXPECT_EQ(net::EFFECTIVE_CONNECTION_TYPE_2G, - params::GetECTThresholdForPreview(PreviewsType::LOFI)); + params::GetECTThresholdForPreview(PreviewsType::OFFLINE)); ReportEffectiveConnectionType(net::EFFECTIVE_CONNECTION_TYPE_2G); PreviewsUserData user_data(kDefaultPageId); base::HistogramTester histogram_tester; EXPECT_FALSE(previews_decider_impl()->ShouldAllowPreviewAtNavigationStart( - &user_data, GURL("https://www.google.com"), true, PreviewsType::LOFI)); + &user_data, GURL("https://www.google.com"), true, PreviewsType::OFFLINE)); histogram_tester.ExpectUniqueSample( - "Previews.EligibilityReason.LoFi", + "Previews.EligibilityReason.Offline", static_cast<int>(PreviewsEligibilityReason::RELOAD_DISALLOWED), 1); } @@ -1526,11 +1476,11 @@ TEST_F(PreviewsDeciderImplTest, LogDecisionMadeBlacklistNotAvailable) { base::test::ScopedFeatureList scoped_feature_list; scoped_feature_list.InitWithFeatures( - {features::kPreviews, features::kClientLoFi}, {}); + {features::kPreviews, features::kOfflinePreviews}, {}); InitializeUIService(); auto expected_reason = PreviewsEligibilityReason::BLACKLIST_UNAVAILABLE; - auto expected_type = PreviewsType::LOFI; + auto expected_type = PreviewsType::OFFLINE; previews_decider_impl()->InjectTestBlacklist(nullptr /* blacklist */); PreviewsUserData user_data(kDefaultPageId); @@ -1547,7 +1497,7 @@ TEST_F(PreviewsDeciderImplTest, LogDecisionMadeBlacklistStatusesDefault) { base::test::ScopedFeatureList scoped_feature_list; scoped_feature_list.InitWithFeatures( - {features::kPreviews, features::kClientLoFi}, {}); + {features::kPreviews, features::kOfflinePreviews}, {}); InitializeUIService(); PreviewsEligibilityReason expected_reasons[] = { @@ -1557,7 +1507,7 @@ PreviewsEligibilityReason::HOST_BLACKLISTED, }; - auto expected_type = PreviewsType::LOFI; + auto expected_type = PreviewsType::OFFLINE; const size_t reasons_size = 4; for (size_t i = 0; i < reasons_size; i++) { @@ -1629,10 +1579,10 @@ TEST_F(PreviewsDeciderImplTest, LogDecisionMadeBlacklistStatusesIgnore) { base::test::ScopedFeatureList scoped_feature_list; scoped_feature_list.InitWithFeatures( - {features::kPreviews, features::kClientLoFi}, {}); + {features::kPreviews, features::kOfflinePreviews}, {}); InitializeUIService(); auto expected_reason = PreviewsEligibilityReason::ALLOWED; - auto expected_type = PreviewsType::LOFI; + auto expected_type = PreviewsType::OFFLINE; PreviewsEligibilityReason blacklist_decisions[] = { PreviewsEligibilityReason::BLACKLIST_DATA_NOT_LOADED, @@ -1698,7 +1648,7 @@ TEST_F(PreviewsDeciderImplTest, IgnoreFlagDoesNotCheckBlacklist) { base::test::ScopedFeatureList scoped_feature_list; scoped_feature_list.InitWithFeatures( - {features::kPreviews, features::kClientLoFi}, {}); + {features::kPreviews, features::kOfflinePreviews}, {}); InitializeUIService(); ReportEffectiveConnectionType(net::EFFECTIVE_CONNECTION_TYPE_2G); @@ -1706,89 +1656,50 @@ true /* ignored */); PreviewsUserData user_data(kDefaultPageId); EXPECT_TRUE(previews_decider_impl()->ShouldAllowPreviewAtNavigationStart( - &user_data, GURL("https://www.google.com"), false, PreviewsType::LOFI)); + &user_data, GURL("https://www.google.com"), false, + PreviewsType::OFFLINE)); previews_decider_impl()->AddPreviewReload(); EXPECT_TRUE(previews_decider_impl()->ShouldAllowPreviewAtNavigationStart( - &user_data, GURL("https://www.google.com"), false, PreviewsType::LOFI)); + &user_data, GURL("https://www.google.com"), false, + PreviewsType::OFFLINE)); } TEST_F(PreviewsDeciderImplTest, ReloadsTriggerFiveMinuteRule) { base::test::ScopedFeatureList scoped_feature_list; scoped_feature_list.InitWithFeatures( - {features::kPreviews, features::kClientLoFi}, {}); + {features::kPreviews, features::kOfflinePreviews}, {}); InitializeUIService(); ReportEffectiveConnectionType(net::EFFECTIVE_CONNECTION_TYPE_2G); PreviewsUserData user_data(kDefaultPageId); EXPECT_TRUE(previews_decider_impl()->ShouldAllowPreviewAtNavigationStart( - &user_data, GURL("https://www.google.com"), false, PreviewsType::LOFI)); + &user_data, GURL("https://www.google.com"), false, + PreviewsType::OFFLINE)); previews_decider_impl()->AddPreviewNavigation( - GURL("http://wwww.somedomain.com"), false, PreviewsType::LOFI, 1); + GURL("http://wwww.somedomain.com"), false, PreviewsType::OFFLINE, 1); previews_decider_impl()->AddPreviewReload(); EXPECT_FALSE(previews_decider_impl()->ShouldAllowPreviewAtNavigationStart( - &user_data, GURL("https://www.google.com"), false, PreviewsType::LOFI)); + &user_data, GURL("https://www.google.com"), false, + PreviewsType::OFFLINE)); EXPECT_EQ(PreviewsEligibilityReason::USER_RECENTLY_OPTED_OUT, ui_service()->decision_reasons().back()); clock_.Advance(base::TimeDelta::FromMinutes(6)); EXPECT_TRUE(previews_decider_impl()->ShouldAllowPreviewAtNavigationStart( - &user_data, GURL("https://www.google.com"), false, PreviewsType::LOFI)); + &user_data, GURL("https://www.google.com"), false, + PreviewsType::OFFLINE)); EXPECT_THAT( ui_service()->decision_passed_reasons().back(), ::testing::Contains(PreviewsEligibilityReason::USER_RECENTLY_OPTED_OUT)); } TEST_F(PreviewsDeciderImplTest, - LoFi_LogDecisionMadeNetworkQualityNotAvailable) { - base::test::ScopedFeatureList scoped_feature_list; - scoped_feature_list.InitWithFeatures( - {features::kPreviews, features::kClientLoFi}, {}); - InitializeUIService(); - std::unique_ptr<TestPreviewsBlackList> blacklist = - std::make_unique<TestPreviewsBlackList>( - PreviewsEligibilityReason::ALLOWED, previews_decider_impl()); - previews_decider_impl()->InjectTestBlacklist(std::move(blacklist)); - - auto expected_reason = PreviewsEligibilityReason::NETWORK_QUALITY_UNAVAILABLE; - auto expected_type = PreviewsType::LOFI; - - std::vector<PreviewsEligibilityReason> checked_decisions = { - PreviewsEligibilityReason::URL_HAS_BASIC_AUTH, - PreviewsEligibilityReason::EXCLUDED_BY_MEDIA_SUFFIX, - PreviewsEligibilityReason::BLACKLIST_UNAVAILABLE, - PreviewsEligibilityReason::BLACKLIST_DATA_NOT_LOADED, - PreviewsEligibilityReason::USER_RECENTLY_OPTED_OUT, - PreviewsEligibilityReason::USER_BLACKLISTED, - PreviewsEligibilityReason::HOST_BLACKLISTED, - }; - - ReportEffectiveConnectionType(net::EFFECTIVE_CONNECTION_TYPE_UNKNOWN); - PreviewsUserData user_data(kDefaultPageId); - previews_decider_impl()->ShouldAllowPreviewAtNavigationStart( - &user_data, GURL("http://www.google.com"), false, expected_type); - - base::RunLoop().RunUntilIdle(); - // Testing correct log method is called. - EXPECT_THAT(ui_service()->decision_reasons(), - ::testing::Contains(expected_reason)); - EXPECT_THAT(ui_service()->decision_types(), - ::testing::Contains(expected_type)); - - EXPECT_EQ(1UL, ui_service()->decision_passed_reasons().size()); - auto actual_passed_reasons = ui_service()->decision_passed_reasons()[0]; - EXPECT_EQ(checked_decisions.size(), actual_passed_reasons.size()); - for (size_t i = 0; i < actual_passed_reasons.size(); i++) { - EXPECT_EQ(checked_decisions[i], actual_passed_reasons[i]); - } -} - -TEST_F(PreviewsDeciderImplTest, ResourceLoadingHints_LogDecisionMadeNetworkQualityNotAvailable) { base::test::ScopedFeatureList scoped_feature_list; scoped_feature_list.InitWithFeatures( @@ -1841,7 +1752,7 @@ TEST_F(PreviewsDeciderImplTest, LogDecisionMadeNetworkNotSlow) { base::test::ScopedFeatureList scoped_feature_list; scoped_feature_list.InitWithFeatures( - {features::kPreviews, features::kClientLoFi}, {}); + {features::kPreviews, features::kOfflinePreviews}, {}); InitializeUIService(); std::unique_ptr<TestPreviewsBlackList> blacklist = std::make_unique<TestPreviewsBlackList>( @@ -1851,7 +1762,7 @@ ReportEffectiveConnectionType(net::EFFECTIVE_CONNECTION_TYPE_4G); auto expected_reason = PreviewsEligibilityReason::NETWORK_NOT_SLOW; - auto expected_type = PreviewsType::LOFI; + auto expected_type = PreviewsType::OFFLINE; std::vector<PreviewsEligibilityReason> checked_decisions = { PreviewsEligibilityReason::URL_HAS_BASIC_AUTH, @@ -1931,7 +1842,7 @@ TEST_F(PreviewsDeciderImplTest, IgnoreBlacklistEnabledViaFlag) { base::test::ScopedFeatureList scoped_feature_list; scoped_feature_list.InitWithFeatures( - {features::kPreviews, features::kClientLoFi}, {}); + {features::kPreviews, features::kOfflinePreviews}, {}); base::test::ScopedCommandLine scoped_command_line; base::CommandLine* command_line = scoped_command_line.GetProcessCommandLine(); command_line->AppendSwitch(switches::kIgnorePreviewsBlacklist); @@ -1947,7 +1858,8 @@ PreviewsUserData user_data(kDefaultPageId); auto expected_reason = PreviewsEligibilityReason::ALLOWED; EXPECT_TRUE(previews_decider_impl()->ShouldAllowPreviewAtNavigationStart( - &user_data, GURL("https://www.google.com"), false, PreviewsType::LOFI)); + &user_data, GURL("https://www.google.com"), false, + PreviewsType::OFFLINE)); base::RunLoop().RunUntilIdle(); EXPECT_THAT(ui_service()->decision_reasons(), @@ -1957,7 +1869,7 @@ TEST_F(PreviewsDeciderImplTest, LogDecisionMadeAllowClientPreviewsWithECT) { base::test::ScopedFeatureList scoped_feature_list; scoped_feature_list.InitWithFeatures( - {features::kPreviews, features::kClientLoFi}, {}); + {features::kPreviews, features::kOfflinePreviews}, {}); InitializeUIService(); std::unique_ptr<TestPreviewsBlackList> blacklist = @@ -1969,7 +1881,7 @@ ReportEffectiveConnectionType(net::EFFECTIVE_CONNECTION_TYPE_2G); auto expected_reason = PreviewsEligibilityReason::ALLOWED; - auto expected_type = PreviewsType::LOFI; + auto expected_type = PreviewsType::OFFLINE; std::vector<PreviewsEligibilityReason> checked_decisions = { PreviewsEligibilityReason::URL_HAS_BASIC_AUTH,
diff --git a/components/previews/content/previews_hints_unittest.cc b/components/previews/content/previews_hints_unittest.cc index cd91a15c..83b54ddd 100644 --- a/components/previews/content/previews_hints_unittest.cc +++ b/components/previews/content/previews_hints_unittest.cc
@@ -276,7 +276,7 @@ EXPECT_FALSE(HasLitePageRedirectBlacklist()); EXPECT_FALSE(previews_hints()->IsBlacklisted(GURL("https://black.com/path"), - PreviewsType::LOFI)); + PreviewsType::OFFLINE)); EXPECT_TRUE(previews_hints()->IsBlacklisted( GURL("https://black.com/path"), PreviewsType::LITE_PAGE_REDIRECT)); @@ -302,7 +302,7 @@ EXPECT_TRUE(HasLitePageRedirectBlacklist()); EXPECT_FALSE(previews_hints()->IsBlacklisted(GURL("https://black.com/path"), - PreviewsType::LOFI)); + PreviewsType::OFFLINE)); EXPECT_TRUE(previews_hints()->IsBlacklisted( GURL("https://black.com/path"), PreviewsType::LITE_PAGE_REDIRECT)); EXPECT_TRUE(previews_hints()->IsBlacklisted(
diff --git a/components/previews/content/previews_ui_service_unittest.cc b/components/previews/content/previews_ui_service_unittest.cc index 5c327e4..eede77b 100644 --- a/components/previews/content/previews_ui_service_unittest.cc +++ b/components/previews/content/previews_ui_service_unittest.cc
@@ -233,7 +233,7 @@ TEST_F(PreviewsUIServiceTest, TestLogPreviewNavigationPassInCorrectParams) { const GURL url_a = GURL("http://www.url_a.com/url_a"); - const PreviewsType type_a = PreviewsType::LOFI; + const PreviewsType type_a = PreviewsType::LITE_PAGE; const bool opt_out_a = true; const base::Time time_a = base::Time::Now(); const uint64_t page_id_a = 1234; @@ -298,7 +298,7 @@ PreviewsEligibilityReason::NETWORK_NOT_SLOW; const GURL url_b("http://www.url_b.com/url_b"); const base::Time time_b = base::Time::Now(); - PreviewsType type_b = PreviewsType::LOFI; + PreviewsType type_b = PreviewsType::OFFLINE; std::vector<PreviewsEligibilityReason> passed_reasons_b = { PreviewsEligibilityReason::HOST_NOT_WHITELISTED_BY_SERVER, PreviewsEligibilityReason::NETWORK_QUALITY_UNAVAILABLE,
diff --git a/components/previews/core/previews_experiments.cc b/components/previews/core/previews_experiments.cc index 87f6589..440a523d 100644 --- a/components/previews/core/previews_experiments.cc +++ b/components/previews/core/previews_experiments.cc
@@ -277,10 +277,6 @@ return GetParamValueAsECT(kClientSidePreviewsFieldTrial, kEffectiveConnectionTypeThreshold, net::EFFECTIVE_CONNECTION_TYPE_2G); - case PreviewsType::LOFI: - return GetParamValueAsECTByFeature(features::kClientLoFi, - kEffectiveConnectionTypeThreshold, - net::EFFECTIVE_CONNECTION_TYPE_2G); case PreviewsType::LITE_PAGE: NOTREACHED(); break; @@ -295,6 +291,7 @@ kEffectiveConnectionTypeThreshold, net::EFFECTIVE_CONNECTION_TYPE_2G); case PreviewsType::DEPRECATED_AMP_REDIRECTION: + case PreviewsType::DEPRECATED_LOFI: case PreviewsType::LAST: break; } @@ -316,10 +313,6 @@ return base::FeatureList::IsEnabled(features::kOfflinePreviews); } -bool IsClientLoFiEnabled() { - return base::FeatureList::IsEnabled(features::kClientLoFi); -} - bool IsNoScriptPreviewsEnabled() { return base::FeatureList::IsEnabled(features::kNoScriptPreviews); } @@ -340,11 +333,6 @@ return GetParamValueAsInt(kClientSidePreviewsFieldTrial, kVersion, 0); } -int ClientLoFiVersion() { - return base::GetFieldTrialParamByFeatureAsInt(features::kClientLoFi, kVersion, - 0); -} - int LitePageServerPreviewsVersion() { return base::GetFieldTrialParamByFeatureAsInt( features::kLitePageServerPreviews, kVersion, 0); @@ -453,8 +441,6 @@ return "None"; case PreviewsType::OFFLINE: return "Offline"; - case PreviewsType::LOFI: - return "LoFi"; case PreviewsType::LITE_PAGE: return "LitePage"; case PreviewsType::LITE_PAGE_REDIRECT: @@ -468,6 +454,7 @@ case PreviewsType::DEFER_ALL_SCRIPT: return "DeferAllScript"; case PreviewsType::DEPRECATED_AMP_REDIRECTION: + case PreviewsType::DEPRECATED_LOFI: case PreviewsType::LAST: break; }
diff --git a/components/previews/core/previews_experiments.h b/components/previews/core/previews_experiments.h index 9dc31ae..a7a0b3ca6 100644 --- a/components/previews/core/previews_experiments.h +++ b/components/previews/core/previews_experiments.h
@@ -22,8 +22,8 @@ // The user is shown an offline page as a preview. OFFLINE = 1, - // Replace images with placeholders. - LOFI = 2, + // Replace images with placeholders. Deprecated, and should not be used. + DEPRECATED_LOFI = 2, // The user is shown a server lite page. LITE_PAGE = 3, @@ -170,7 +170,6 @@ // Whether the preview type is enabled. bool IsOfflinePreviewsEnabled(); -bool IsClientLoFiEnabled(); bool IsNoScriptPreviewsEnabled(); bool IsResourceLoadingHintsEnabled(); bool IsLitePageServerPreviewsEnabled(); @@ -178,7 +177,6 @@ // The blacklist version for each preview type. int OfflinePreviewsVersion(); -int ClientLoFiVersion(); int LitePageServerPreviewsVersion(); int NoScriptPreviewsVersion(); int ResourceLoadingHintsVersion();
diff --git a/components/previews/core/previews_experiments_unittest.cc b/components/previews/core/previews_experiments_unittest.cc index c10af9a..3bccade 100644 --- a/components/previews/core/previews_experiments_unittest.cc +++ b/components/previews/core/previews_experiments_unittest.cc
@@ -87,44 +87,6 @@ variations::testing::ClearAllVariationParams(); } -TEST(PreviewsExperimentsTest, TestClientLoFiDisabledByDefault) { - EXPECT_FALSE(params::IsClientLoFiEnabled()); -} - -TEST(PreviewsExperimentsTest, TestClientLoFiExplicitlyDisabled) { - base::test::ScopedFeatureList scoped_feature_list; - scoped_feature_list.InitAndDisableFeature(features::kClientLoFi); - EXPECT_FALSE(params::IsClientLoFiEnabled()); -} - -TEST(PreviewsExperimentsTest, TestClientLoFiExplicitlyEnabled) { - base::test::ScopedFeatureList scoped_feature_list; - scoped_feature_list.InitAndEnableFeature(features::kClientLoFi); - EXPECT_TRUE(params::IsClientLoFiEnabled()); -} - -TEST(PreviewsExperimentsTest, TestEnableClientLoFiWithDefaultParams) { - base::test::ScopedFeatureList scoped_feature_list; - scoped_feature_list.InitAndEnableFeature(features::kClientLoFi); - - EXPECT_TRUE(params::IsClientLoFiEnabled()); - EXPECT_EQ(0, params::ClientLoFiVersion()); - EXPECT_EQ(net::EFFECTIVE_CONNECTION_TYPE_2G, - params::GetECTThresholdForPreview(PreviewsType::LOFI)); -} - -TEST(PreviewsExperimentsTest, TestEnableClientLoFiWithCustomParams) { - base::test::ScopedFeatureList scoped_feature_list; - scoped_feature_list.InitAndEnableFeatureWithParameters( - features::kClientLoFi, - {{"version", "10"}, {"max_allowed_effective_connection_type", "3G"}}); - - EXPECT_TRUE(params::IsClientLoFiEnabled()); - EXPECT_EQ(10, params::ClientLoFiVersion()); - EXPECT_EQ(net::EFFECTIVE_CONNECTION_TYPE_3G, - params::GetECTThresholdForPreview(PreviewsType::LOFI)); -} - TEST(PreviewsExperimentsTest, TestDefaultShouldExcludeMediaSuffix) { base::test::ScopedFeatureList scoped_feature_list; scoped_feature_list.InitAndEnableFeature(features::kExcludedMediaSuffixes);
diff --git a/components/previews/core/previews_features.cc b/components/previews/core/previews_features.cc index 47bf083..cf04b26 100644 --- a/components/previews/core/previews_features.cc +++ b/components/previews/core/previews_features.cc
@@ -26,10 +26,6 @@ const base::Feature kOfflinePreviews{"OfflinePreviews", base::FEATURE_ENABLED_BY_DEFAULT}; -// Enables the Client Lo-Fi previews. -const base::Feature kClientLoFi{"ClientLoFi", - base::FEATURE_DISABLED_BY_DEFAULT}; - // Enables the NoScript previews for Android. const base::Feature kNoScriptPreviews { "NoScriptPreviews",
diff --git a/components/previews/core/previews_features.h b/components/previews/core/previews_features.h index 68e7ab24..9ff5622e 100644 --- a/components/previews/core/previews_features.h +++ b/components/previews/core/previews_features.h
@@ -12,7 +12,6 @@ extern const base::Feature kPreviews; extern const base::Feature kOfflinePreviews; -extern const base::Feature kClientLoFi; extern const base::Feature kNoScriptPreviews; extern const base::Feature kStalePreviewsTimestamp; extern const base::Feature kOptimizationHints;
diff --git a/components/previews/core/previews_logger_unittest.cc b/components/previews/core/previews_logger_unittest.cc index 18d322d..aa318113 100644 --- a/components/previews/core/previews_logger_unittest.cc +++ b/components/previews/core/previews_logger_unittest.cc
@@ -158,7 +158,7 @@ const base::Time time = base::Time::Now(); PreviewsType type_a = PreviewsType::OFFLINE; - PreviewsType type_b = PreviewsType::LOFI; + PreviewsType type_b = PreviewsType::LITE_PAGE; PreviewsEligibilityReason reason_a = PreviewsEligibilityReason::BLACKLIST_UNAVAILABLE; std::vector<PreviewsEligibilityReason> passed_reasons_a = {}; @@ -193,21 +193,22 @@ EXPECT_EQ(time, actual[0].time); EXPECT_EQ(page_id_a, actual[0].page_id); - std::string expected_passed_0 = "LoFi preview - Network quality available"; + std::string expected_passed_0 = + "LitePage preview - Network quality available"; EXPECT_EQ(kPreviewsDecisionMadeEventType, actual[1].event_type); EXPECT_EQ(expected_passed_0, actual[1].event_description); EXPECT_EQ(url_b, actual[1].url); EXPECT_EQ(time, actual[1].time); EXPECT_EQ(page_id_b, actual[1].page_id); - std::string expected_passed_1 = "LoFi preview - Page reloads allowed"; + std::string expected_passed_1 = "LitePage preview - Page reloads allowed"; EXPECT_EQ(kPreviewsDecisionMadeEventType, actual[2].event_type); EXPECT_EQ(expected_passed_1, actual[2].event_description); EXPECT_EQ(url_b, actual[2].url); EXPECT_EQ(time, actual[2].time); EXPECT_EQ(page_id_b, actual[2].page_id); - std::string expected_description_b = "LoFi preview - Network not slow"; + std::string expected_description_b = "LitePage preview - Network not slow"; EXPECT_EQ(kPreviewsDecisionMadeEventType, actual[3].event_type); EXPECT_EQ(expected_description_b, actual[3].event_description); EXPECT_EQ(url_b, actual[3].url); @@ -219,7 +220,7 @@ const base::Time time = base::Time::Now(); PreviewsType type_a = PreviewsType::OFFLINE; - PreviewsType type_b = PreviewsType::LOFI; + PreviewsType type_b = PreviewsType::LITE_PAGE; const GURL url_a("http://www.url_a.com/url_a"); const GURL url_b("http://www.url_b.com/url_b"); const uint64_t page_id_a = 1234; @@ -245,7 +246,7 @@ EXPECT_EQ(time, actual[0].time); EXPECT_EQ(page_id_a, actual[0].page_id); - std::string expected_description_b = "LoFi preview - user opt-out: False"; + std::string expected_description_b = "LitePage preview - user opt-out: False"; EXPECT_EQ(kPreviewsNavigationEventType, actual[1].event_type); EXPECT_EQ(expected_description_b, actual[1].event_description); EXPECT_EQ(url_b, actual[1].url); @@ -295,7 +296,7 @@ GURL("http://www.url_.com/url_"), base::Time::Now(), 1234 /* page_id */); - PreviewsType type = PreviewsType::LOFI; + PreviewsType type = PreviewsType::OFFLINE; PreviewsEligibilityReason final_reason = PreviewsEligibilityReason::BLACKLIST_UNAVAILABLE; std::vector<PreviewsEligibilityReason> passed_reasons = {
diff --git a/components/printing/browser/print_composite_client.cc b/components/printing/browser/print_composite_client.cc index e7abd8e..b77ea68 100644 --- a/components/printing/browser/print_composite_client.cc +++ b/components/printing/browser/print_composite_client.cc
@@ -146,14 +146,14 @@ auto subframe_iter = printed_subframes_.find(document_cookie); if (subframe_iter != printed_subframes_.end() && - base::ContainsKey(subframe_iter->second, frame_guid)) { + base::Contains(subframe_iter->second, frame_guid)) { // If this frame is already printed, no need to print again. return; } auto cookie_iter = pending_subframe_cookies_.find(frame_guid); if (cookie_iter != pending_subframe_cookies_.end() && - base::ContainsKey(cookie_iter->second, document_cookie)) { + base::Contains(cookie_iter->second, document_cookie)) { // If this frame is being printed, no need to print again. return; }
diff --git a/components/printing/browser/printer_capabilities.cc b/components/printing/browser/printer_capabilities.cc index d31931e..341e1413 100644 --- a/components/printing/browser/printer_capabilities.cc +++ b/components/printing/browser/printer_capabilities.cc
@@ -136,9 +136,8 @@ base::Value(basic_info.printer_description)); printer_info.SetKey( kCUPSEnterprisePrinter, - base::Value( - base::ContainsKey(basic_info.options, kCUPSEnterprisePrinter) && - basic_info.options.at(kCUPSEnterprisePrinter) == kValueTrue)); + base::Value(base::Contains(basic_info.options, kCUPSEnterprisePrinter) && + basic_info.options.at(kCUPSEnterprisePrinter) == kValueTrue)); base::Value printer_info_capabilities(base::Value::Type::DICTIONARY); printer_info_capabilities.SetKey(kPrinter, std::move(printer_info));
diff --git a/components/reading_list/core/reading_list_store.cc b/components/reading_list/core/reading_list_store.cc index 1cf99828..d26a57873 100644 --- a/components/reading_list/core/reading_list_store.cc +++ b/components/reading_list/core/reading_list_store.cc
@@ -95,7 +95,7 @@ std::unique_ptr<syncer::EntityData> entity_data(new syncer::EntityData()); *entity_data->specifics.mutable_reading_list() = *pb_entry_sync; - entity_data->non_unique_name = pb_entry_sync->entry_id(); + entity_data->name = pb_entry_sync->entry_id(); change_processor()->Put(entry.URL().spec(), std::move(entity_data), batch_->GetMetadataChangeList()); @@ -245,7 +245,7 @@ DCHECK(CompareEntriesForSync(specifics, *entry_sync_pb)); auto entity_data = std::make_unique<syncer::EntityData>(); *(entity_data->specifics.mutable_reading_list()) = *entry_sync_pb; - entity_data->non_unique_name = entry_sync_pb->entry_id(); + entity_data->name = entry_sync_pb->entry_id(); // TODO(crbug.com/666232): Investigate if there is a risk of sync // ping-pong. @@ -268,7 +268,7 @@ auto entity_data = std::make_unique<syncer::EntityData>(); *(entity_data->specifics.mutable_reading_list()) = *entry_pb; - entity_data->non_unique_name = entry_pb->entry_id(); + entity_data->name = entry_pb->entry_id(); change_processor()->Put(entry_pb->entry_id(), std::move(entity_data), metadata_change_list.get()); @@ -332,7 +332,7 @@ DCHECK(CompareEntriesForSync(specifics, *entry_sync_pb)); auto entity_data = std::make_unique<syncer::EntityData>(); *(entity_data->specifics.mutable_reading_list()) = *entry_sync_pb; - entity_data->non_unique_name = entry_sync_pb->entry_id(); + entity_data->name = entry_sync_pb->entry_id(); // TODO(crbug.com/666232): Investigate if there is a risk of sync // ping-pong. @@ -381,7 +381,7 @@ std::unique_ptr<syncer::EntityData> entity_data(new syncer::EntityData()); *(entity_data->specifics.mutable_reading_list()) = *entry_pb; - entity_data->non_unique_name = entry_pb->entry_id(); + entity_data->name = entry_pb->entry_id(); batch->Put(entry_pb->entry_id(), std::move(entity_data)); }
diff --git a/components/safe_browsing/android/safe_browsing_api_handler_bridge.cc b/components/safe_browsing/android/safe_browsing_api_handler_bridge.cc index 922ca09b..be3da44 100644 --- a/components/safe_browsing/android/safe_browsing_api_handler_bridge.cc +++ b/components/safe_browsing/android/safe_browsing_api_handler_bridge.cc
@@ -123,7 +123,7 @@ << " status: " << result_status << " metadata: [" << metadata << "]"; PendingCallbacksMap* pending_callbacks = GetPendingCallbacksMapOnIOThread(); - bool found = base::ContainsKey(*pending_callbacks, callback_id); + bool found = base::Contains(*pending_callbacks, callback_id); DCHECK(found) << "Not found in pending_callbacks: " << callback_id; if (!found) return;
diff --git a/components/safe_browsing/browser/threat_details.cc b/components/safe_browsing/browser/threat_details.cc index 09fa042..3a9b8d943 100644 --- a/components/safe_browsing/browser/threat_details.cc +++ b/components/safe_browsing/browser/threat_details.cc
@@ -242,7 +242,7 @@ // Otherwise, insert the parent ID into the list of ids to keep. This will // capture the parent and siblings of the target element, as well as each of // their children. - if (!base::ContainsValue(element_ids_to_keep, parent_id)) { + if (!base::Contains(element_ids_to_keep, parent_id)) { element_ids_to_keep.push_back(parent_id); // Check if this element has a resource. If so, remember to also keep the @@ -285,12 +285,12 @@ const HTMLElement& element = *element_iter->second; // Delete any elements that we do not want to keep. - if (!base::ContainsValue(element_ids_to_keep, element.id())) { + if (!base::Contains(element_ids_to_keep, element.id())) { // If this element has a resource then maybe delete the resouce too. Some // resources may be shared between kept and trimmed elements, and those // ones should not be deleted. if (element.has_resource_id() && - !base::ContainsValue(kept_resource_ids, element.resource_id())) { + !base::Contains(kept_resource_ids, element.resource_id())) { const std::string& resource_url = resource_id_to_url[element.resource_id()]; resources->erase(resource_url); @@ -531,7 +531,7 @@ // of our current frame. We can easily lookup our parent. const std::string& parent_key = GetElementKey(frame_tree_node_id, parent_element_node_id); - if (base::ContainsKey(elements_, parent_key)) { + if (base::Contains(elements_, parent_key)) { parent_element = elements_[parent_key].get(); } } @@ -739,7 +739,7 @@ for (auto& element_pair : elements_) { const std::string& element_key = element_pair.first; HTMLElement* element = element_pair.second.get(); - if (base::ContainsKey(iframe_key_to_frame_tree_id_map_, element_key)) { + if (base::Contains(iframe_key_to_frame_tree_id_map_, element_key)) { int frame_tree_id_of_iframe_renderer = iframe_key_to_frame_tree_id_map_[element_key]; const std::unordered_set<int>& child_ids =
diff --git a/components/safe_browsing/db/v4_get_hash_protocol_manager.cc b/components/safe_browsing/db/v4_get_hash_protocol_manager.cc index 6f614ae5..88a4020e 100644 --- a/components/safe_browsing/db/v4_get_hash_protocol_manager.cc +++ b/components/safe_browsing/db/v4_get_hash_protocol_manager.cc
@@ -531,7 +531,7 @@ ThreatMetadata md; for (const FullHashInfo& full_hash_info : full_hash_infos) { DCHECK_EQ(GetChromeUrlApiId(), full_hash_info.list_id); - DCHECK(base::ContainsValue(full_hashes, full_hash_info.full_hash)); + DCHECK(base::Contains(full_hashes, full_hash_info.full_hash)); md.api_permissions.insert(full_hash_info.metadata.api_permissions.begin(), full_hash_info.metadata.api_permissions.end()); } @@ -585,10 +585,9 @@ ListIdentifier list_id(match.platform_type(), match.threat_entry_type(), match.threat_type()); - if (!base::ContainsValue(platform_types_, list_id.platform_type()) || - !base::ContainsValue(threat_entry_types_, - list_id.threat_entry_type()) || - !base::ContainsValue(threat_types_, list_id.threat_type())) { + if (!base::Contains(platform_types_, list_id.platform_type()) || + !base::Contains(threat_entry_types_, list_id.threat_entry_type()) || + !base::Contains(threat_types_, list_id.threat_type())) { // The server may send a ThreatMatch response for lists that we didn't ask // for so ignore those ThreatMatch responses. continue;
diff --git a/components/safe_browsing/db/v4_protocol_manager_util_unittest.cc b/components/safe_browsing/db/v4_protocol_manager_util_unittest.cc index 33464c11..a69357c 100644 --- a/components/safe_browsing/db/v4_protocol_manager_util_unittest.cc +++ b/components/safe_browsing/db/v4_protocol_manager_util_unittest.cc
@@ -125,10 +125,10 @@ EXPECT_EQ(hosts[0], "b.c"); EXPECT_EQ(hosts[1], "a.b.c"); - EXPECT_TRUE(base::ContainsValue(paths, "/1/2.html?param=1")); - EXPECT_TRUE(base::ContainsValue(paths, "/1/2.html")); - EXPECT_TRUE(base::ContainsValue(paths, "/1/")); - EXPECT_TRUE(base::ContainsValue(paths, "/")); + EXPECT_TRUE(base::Contains(paths, "/1/2.html?param=1")); + EXPECT_TRUE(base::Contains(paths, "/1/2.html")); + EXPECT_TRUE(base::Contains(paths, "/1/")); + EXPECT_TRUE(base::Contains(paths, "/")); url = GURL("http://a.b.c.d.e.f.g/1.html"); V4ProtocolManagerUtil::GenerateHostsToCheck(url, &hosts); @@ -140,15 +140,15 @@ EXPECT_EQ(hosts[2], "d.e.f.g"); EXPECT_EQ(hosts[3], "c.d.e.f.g"); EXPECT_EQ(hosts[4], "a.b.c.d.e.f.g"); - EXPECT_TRUE(base::ContainsValue(paths, "/1.html")); - EXPECT_TRUE(base::ContainsValue(paths, "/")); + EXPECT_TRUE(base::Contains(paths, "/1.html")); + EXPECT_TRUE(base::Contains(paths, "/")); url = GURL("http://a.b/saw-cgi/eBayISAPI.dll/"); V4ProtocolManagerUtil::GeneratePathsToCheck(url, &paths); EXPECT_EQ(paths.size(), static_cast<size_t>(3)); - EXPECT_TRUE(base::ContainsValue(paths, "/saw-cgi/eBayISAPI.dll/")); - EXPECT_TRUE(base::ContainsValue(paths, "/saw-cgi/")); - EXPECT_TRUE(base::ContainsValue(paths, "/")); + EXPECT_TRUE(base::Contains(paths, "/saw-cgi/eBayISAPI.dll/")); + EXPECT_TRUE(base::Contains(paths, "/saw-cgi/")); + EXPECT_TRUE(base::Contains(paths, "/")); } // Tests the url canonicalization according to the Safe Browsing spec.
diff --git a/components/safe_browsing/password_protection/password_protection_request.h b/components/safe_browsing/password_protection/password_protection_request.h index 8f25cd0..09a6a65 100644 --- a/components/safe_browsing/password_protection/password_protection_request.h +++ b/components/safe_browsing/password_protection/password_protection_request.h
@@ -91,7 +91,7 @@ return trigger_type_; } - const std::string& username() const { return username_; } + const std::string username() const { return username_; } ReusedPasswordType reused_password_type() const { return reused_password_type_; @@ -181,7 +181,7 @@ // The username of the reused password hash. The username can be an email or // a username for a non-GAIA or saved-password reuse. No validation has been // done on it. - const std::string& username_; + const std::string username_; // Type of the reused password. const ReusedPasswordType reused_password_type_;
diff --git a/components/safe_browsing/password_protection/password_protection_service.cc b/components/safe_browsing/password_protection/password_protection_service.cc index 866d9a7..b84eaf47 100644 --- a/components/safe_browsing/password_protection/password_protection_service.cc +++ b/components/safe_browsing/password_protection/password_protection_service.cc
@@ -733,7 +733,7 @@ bool PasswordProtectionService::PathVariantsMatchCacheExpression( const std::vector<std::string>& generated_paths, const std::string& cache_expression_path) { - return base::ContainsValue(generated_paths, cache_expression_path); + return base::Contains(generated_paths, cache_expression_path); } bool PasswordProtectionService::IsCacheExpired(int cache_creation_time,
diff --git a/components/safe_browsing/triggers/trigger_manager.cc b/components/safe_browsing/triggers/trigger_manager.cc index 071ebcf..ee7457a 100644 --- a/components/safe_browsing/triggers/trigger_manager.cc +++ b/components/safe_browsing/triggers/trigger_manager.cc
@@ -178,7 +178,7 @@ const SBErrorOptions& error_display_options) { DCHECK_CURRENTLY_ON(content::BrowserThread::UI); // Make sure there's a ThreatDetails collector running on this tab. - if (!base::ContainsKey(data_collectors_map_, web_contents)) + if (!base::Contains(data_collectors_map_, web_contents)) return false; DataCollectorsContainer* collectors = &data_collectors_map_[web_contents]; if (collectors->threat_details == nullptr) @@ -212,7 +212,7 @@ void TriggerManager::ThreatDetailsDone(content::WebContents* web_contents) { DCHECK_CURRENTLY_ON(content::BrowserThread::UI); // Clean up the ThreatDetailsdata collector on the specified tab. - if (!base::ContainsKey(data_collectors_map_, web_contents)) + if (!base::Contains(data_collectors_map_, web_contents)) return; DataCollectorsContainer* collectors = &data_collectors_map_[web_contents]; @@ -221,7 +221,7 @@ void TriggerManager::WebContentsDestroyed(content::WebContents* web_contents) { DCHECK_CURRENTLY_ON(content::BrowserThread::UI); - if (!base::ContainsKey(data_collectors_map_, web_contents)) + if (!base::Contains(data_collectors_map_, web_contents)) return; data_collectors_map_.erase(web_contents); }
diff --git a/components/safe_browsing/triggers/trigger_throttler.cc b/components/safe_browsing/triggers/trigger_throttler.cc index c80d3eab..13777d7c 100644 --- a/components/safe_browsing/triggers/trigger_throttler.cc +++ b/components/safe_browsing/triggers/trigger_throttler.cc
@@ -133,7 +133,7 @@ // Other triggers are capped, see how many times this trigger has already // fired. - if (!base::ContainsKey(trigger_events_, trigger_type)) + if (!base::Contains(trigger_events_, trigger_type)) return true; const std::vector<base::Time>& timestamps = trigger_events_.at(trigger_type);
diff --git a/components/search_engines/template_url.cc b/components/search_engines/template_url.cc index 1895362..2bb6ed0a 100644 --- a/components/search_engines/template_url.cc +++ b/components/search_engines/template_url.cc
@@ -1469,7 +1469,7 @@ base::string16* encoded_original_query) const { std::vector<std::string> encodings(input_encodings()); - if (!base::ContainsValue(encodings, "UTF-8")) + if (!base::Contains(encodings, "UTF-8")) encodings.push_back("UTF-8"); for (auto i = encodings.begin(); i != encodings.end(); ++i) { if (TryEncoding(search_terms_args.search_terms,
diff --git a/components/search_engines/template_url_prepopulate_data_unittest.cc b/components/search_engines/template_url_prepopulate_data_unittest.cc index bc5eacd..7e775fb 100644 --- a/components/search_engines/template_url_prepopulate_data_unittest.cc +++ b/components/search_engines/template_url_prepopulate_data_unittest.cc
@@ -408,7 +408,7 @@ for (const PrepopulatedEngine* engine : all_engines) { std::unique_ptr<TemplateURLData> data = TemplateURLDataFromPrepopulatedEngine(*engine); - if (base::ContainsKey(exceptions, data->prepopulate_id)) + if (base::Contains(exceptions, data->prepopulate_id)) continue; GURL logo_url = data->logo_url;
diff --git a/components/search_engines/template_url_service.cc b/components/search_engines/template_url_service.cc index 88732aca..b521df5 100644 --- a/components/search_engines/template_url_service.cc +++ b/components/search_engines/template_url_service.cc
@@ -108,7 +108,7 @@ // Sync and TemplateURLs that were initially local, assuming |sync_data| is the // |initial_sync_data| parameter. bool IsFromSync(const TemplateURL* turl, const SyncDataMap& sync_data) { - return base::ContainsKey(sync_data, turl->sync_guid()); + return base::Contains(sync_data, turl->sync_guid()); } // Log the number of instances of a keyword that exist, with zero or more
diff --git a/components/send_tab_to_self/send_tab_to_self_bridge.cc b/components/send_tab_to_self/send_tab_to_self_bridge.cc index 654bdc3..f296796 100644 --- a/components/send_tab_to_self/send_tab_to_self_bridge.cc +++ b/components/send_tab_to_self/send_tab_to_self_bridge.cc
@@ -64,7 +64,7 @@ const sync_pb::SendTabToSelfSpecifics& specifics) { auto entity_data = std::make_unique<syncer::EntityData>(); *entity_data->specifics.mutable_send_tab_to_self() = specifics; - entity_data->non_unique_name = specifics.url(); + entity_data->name = specifics.url(); entity_data->creation_time = ProtoTimeToTime(specifics.shared_time_usec()); return entity_data; }
diff --git a/components/send_tab_to_self/send_tab_to_self_bridge_unittest.cc b/components/send_tab_to_self/send_tab_to_self_bridge_unittest.cc index cacd462..38d69e213 100644 --- a/components/send_tab_to_self/send_tab_to_self_bridge_unittest.cc +++ b/components/send_tab_to_self/send_tab_to_self_bridge_unittest.cc
@@ -180,7 +180,7 @@ *(entity_data->specifics.mutable_send_tab_to_self()) = specifics.specifics(); - entity_data->non_unique_name = entry.GetURL().spec(); + entity_data->name = entry.GetURL().spec(); return entity_data; } @@ -194,7 +194,7 @@ auto entity_data = std::make_unique<syncer::EntityData>(); *(entity_data->specifics.mutable_send_tab_to_self()) = specifics; - entity_data->non_unique_name = specifics.url(); + entity_data->name = specifics.url(); changes.push_back(syncer::EntityChange::CreateAdd( specifics.guid(), std::move(entity_data)));
diff --git a/components/services/pdf_compositor/pdf_compositor_impl.cc b/components/services/pdf_compositor/pdf_compositor_impl.cc index b6dbd07a..db27ccb 100644 --- a/components/services/pdf_compositor/pdf_compositor_impl.cc +++ b/components/services/pdf_compositor/pdf_compositor_impl.cc
@@ -30,7 +30,7 @@ void PdfCompositorImpl::NotifyUnavailableSubframe(uint64_t frame_guid) { // Add this frame into the map. - DCHECK(!base::ContainsKey(frame_info_map_, frame_guid)); + DCHECK(!base::Contains(frame_info_map_, frame_guid)); auto& frame_info = frame_info_map_.emplace(frame_guid, std::make_unique<FrameInfo>()) .first->second; @@ -54,7 +54,7 @@ } // Add this frame and its serialized content. - DCHECK(!base::ContainsKey(frame_info_map_, frame_guid)); + DCHECK(!base::Contains(frame_info_map_, frame_guid)); auto& frame_info = frame_info_map_.emplace(frame_guid, std::make_unique<FrameInfo>()) .first->second; @@ -74,7 +74,7 @@ std::vector<uint64_t> pending_subframes; for (auto& subframe_content : subframe_content_map) { auto subframe_guid = subframe_content.second; - if (!base::ContainsKey(frame_info_map_, subframe_guid)) + if (!base::Contains(frame_info_map_, subframe_guid)) pending_subframes.push_back(subframe_guid); }
diff --git a/components/signin/core/browser/about_signin_internals.cc b/components/signin/core/browser/about_signin_internals.cc index 6b5716b..496e6c1d 100644 --- a/components/signin/core/browser/about_signin_internals.cc +++ b/components/signin/core/browser/about_signin_internals.cc
@@ -11,10 +11,9 @@ #include "base/command_line.h" #include "base/hash/hash.h" -#include "base/i18n/time_formatting.h" #include "base/logging.h" #include "base/strings/stringprintf.h" -#include "base/strings/utf_string_conversions.h" +#include "base/time/time_to_iso8601.h" #include "base/trace_event/trace_event.h" #include "build/build_config.h" #include "components/prefs/pref_registry_simple.h" @@ -62,11 +61,6 @@ } } -std::string GetTimeStr(base::Time time) { - return base::UTF16ToUTF8( - base::TimeFormatWithPattern(time, "yyyy-MM-dd HH:mm:ss X")); -} - base::ListValue* AddSection(base::ListValue* parent_list, const std::string& title) { auto section = std::make_unique<base::DictionaryValue>(); @@ -274,7 +268,7 @@ field_index < signin_status_.timed_signin_fields.size()); base::Time now = base::Time::NowFromSystemTime(); - std::string time_as_str = GetTimeStr(now); + std::string time_as_str = base::TimeToISO8601(now); TimedSigninStatusValue timed_value(value, time_as_str); signin_status_.timed_signin_fields[field_index] = timed_value; @@ -526,14 +520,14 @@ scopes_str += *it + "<br/>"; } token_info->SetString("scopes", scopes_str); - token_info->SetString("request_time", GetTimeStr(request_time)); + token_info->SetString("request_time", base::TimeToISO8601(request_time)); if (removed_) { token_info->SetString("status", "Token was revoked."); } else if (!receive_time.is_null()) { if (error == GoogleServiceAuthError::AuthErrorNone()) { bool token_expired = expiration_time < base::Time::Now(); - std::string expiration_time_string = GetTimeStr(expiration_time); + std::string expiration_time_string = base::TimeToISO8601(expiration_time); if (expiration_time.is_null()) { token_expired = false; expiration_time_string = "Expiration time not available"; @@ -542,7 +536,7 @@ if (token_expired) status_str = "<p style=\"color: #ffffff; background-color: #ff0000\">"; base::StringAppendF(&status_str, "Received token at %s. Expire at %s", - GetTimeStr(receive_time).c_str(), + base::TimeToISO8601(receive_time).c_str(), expiration_time_string.c_str()); if (token_expired) base::StringAppendF(&status_str, "</p>"); @@ -687,7 +681,7 @@ base::Time next_retry_time = base::Time::NowFromSystemTime() + cookie_requests_delay; AddSectionEntry(detailed_info, "Cookie Manager Next Retry", - GetTimeStr(next_retry_time), ""); + base::TimeToISO8601(next_retry_time), ""); } base::TimeDelta token_requests_delay = @@ -698,7 +692,7 @@ base::Time next_retry_time = base::Time::NowFromSystemTime() + token_requests_delay; AddSectionEntry(detailed_info, "Token Service Next Retry", - GetTimeStr(next_retry_time), ""); + base::TimeToISO8601(next_retry_time), ""); } #endif // !defined(OS_CHROMEOS) @@ -744,7 +738,7 @@ for (const auto& event : refresh_token_events) { auto entry = std::make_unique<base::DictionaryValue>(); entry->SetString("accountId", event.account_id); - entry->SetString("timestamp", GetTimeStr(event.timestamp)); + entry->SetString("timestamp", base::TimeToISO8601(event.timestamp)); entry->SetString("type", event.GetTypeAsString()); entry->SetString("source", event.source); refresh_token_events_value->Append(std::move(entry));
diff --git a/components/signin/core/browser/account_reconcilor.cc b/components/signin/core/browser/account_reconcilor.cc index a2f98a11..32fa9709 100644 --- a/components/signin/core/browser/account_reconcilor.cc +++ b/components/signin/core/browser/account_reconcilor.cc
@@ -607,7 +607,7 @@ LoadValidAccountsFromTokenService(); if (delegate_->ShouldAbortReconcileIfPrimaryHasError() && - !base::ContainsValue(chrome_accounts, primary_account)) { + !base::Contains(chrome_accounts, primary_account)) { VLOG(1) << "Primary account has error, abort."; DCHECK(is_reconcile_started_); AbortReconcile(); @@ -699,7 +699,7 @@ int removed_from_cookie = 0; for (size_t i = 0; i < number_gaia_accounts; ++i) { if (gaia_accounts[i].valid && - !base::ContainsValue(chrome_accounts, gaia_accounts[i].id)) { + !base::Contains(chrome_accounts, gaia_accounts[i].id)) { ++removed_from_cookie; } } @@ -731,7 +731,7 @@ kAccountReconcilor_Reconcile); } else { // Create a list of accounts that need to be added to the Gaia cookie. - if (base::ContainsValue(chrome_accounts, first_account)) { + if (base::Contains(chrome_accounts, first_account)) { add_to_cookie_.push_back(first_account); } else { // If the first account is not empty and not in chrome_accounts, it is
diff --git a/components/signin/core/browser/account_reconcilor_delegate.cc b/components/signin/core/browser/account_reconcilor_delegate.cc index 1b5d13c..e347544e 100644 --- a/components/signin/core/browser/account_reconcilor_delegate.cc +++ b/components/signin/core/browser/account_reconcilor_delegate.cc
@@ -68,7 +68,7 @@ // which go above this count will fail. const int kMaxGaiaAccounts = 10; DCHECK(!first_account.empty()); - DCHECK(base::ContainsValue(chrome_accounts, first_account)); + DCHECK(base::Contains(chrome_accounts, first_account)); // Ordered list of accounts, this is the result of this function. std::vector<std::string> ordered_accounts;
diff --git a/components/signin/core/browser/account_reconcilor_delegate_unittest.cc b/components/signin/core/browser/account_reconcilor_delegate_unittest.cc index c8bdedf..a5f86d5 100644 --- a/components/signin/core/browser/account_reconcilor_delegate_unittest.cc +++ b/components/signin/core/browser/account_reconcilor_delegate_unittest.cc
@@ -120,7 +120,7 @@ std::vector<std::string> chrome_accounts; for (int i = 0; GetParam().chrome_accounts[i] != '\0'; ++i) chrome_accounts.push_back(std::string(1, GetParam().chrome_accounts[i])); - ASSERT_TRUE(base::ContainsValue(chrome_accounts, first_account)) + ASSERT_TRUE(base::Contains(chrome_accounts, first_account)) << "Invalid test parameter."; std::vector<gaia::ListedAccount> gaia_accounts = GaiaAccountsFromString(GetParam().gaia_accounts);
diff --git a/components/signin/core/browser/account_tracker_service.cc b/components/signin/core/browser/account_tracker_service.cc index 7e6d2e4..bef465a4 100644 --- a/components/signin/core/browser/account_tracker_service.cc +++ b/components/signin/core/browser/account_tracker_service.cc
@@ -222,7 +222,7 @@ void AccountTrackerService::StartTrackingAccount( const CoreAccountId& account_id) { - if (!base::ContainsKey(accounts_, account_id)) { + if (!base::Contains(accounts_, account_id)) { DVLOG(1) << "StartTracking " << account_id; AccountInfo account_info; account_info.account_id = account_id; @@ -234,7 +234,7 @@ void AccountTrackerService::StopTrackingAccount( const CoreAccountId& account_id) { DVLOG(1) << "StopTracking " << account_id; - if (base::ContainsKey(accounts_, account_id)) { + if (base::Contains(accounts_, account_id)) { AccountInfo account_info = std::move(accounts_[account_id]); RemoveFromPrefs(account_info); RemoveAccountImageFromDisk(account_id); @@ -248,7 +248,7 @@ void AccountTrackerService::SetAccountInfoFromUserInfo( const CoreAccountId& account_id, const base::DictionaryValue* user_info) { - DCHECK(base::ContainsKey(accounts_, account_id)); + DCHECK(base::Contains(accounts_, account_id)); AccountInfo& account_info = accounts_[account_id]; base::Optional<AccountInfo> maybe_account_info = @@ -271,7 +271,7 @@ void AccountTrackerService::SetAccountImage(const CoreAccountId& account_id, const gfx::Image& image) { - if (!base::ContainsKey(accounts_, account_id)) + if (!base::Contains(accounts_, account_id)) return; AccountInfo& account_info = accounts_[account_id]; account_info.account_image = image; @@ -281,7 +281,7 @@ void AccountTrackerService::SetIsChildAccount(const CoreAccountId& account_id, bool is_child_account) { - DCHECK(base::ContainsKey(accounts_, account_id)); + DCHECK(base::Contains(accounts_, account_id)); AccountInfo& account_info = accounts_[account_id]; if (account_info.is_child_account == is_child_account) return; @@ -294,7 +294,7 @@ void AccountTrackerService::SetIsAdvancedProtectionAccount( const CoreAccountId& account_id, bool is_under_advanced_protection) { - DCHECK(base::ContainsKey(accounts_, account_id)); + DCHECK(base::Contains(accounts_, account_id)); AccountInfo& account_info = accounts_[account_id]; if (account_info.is_under_advanced_protection == is_under_advanced_protection) return; @@ -319,7 +319,7 @@ // If there is already an account keyed to the current account's gaia id, // assume this is the result of a partial migration and skip the account // that is currently inspected. - if (base::ContainsKey(accounts_, new_account_id)) + if (base::Contains(accounts_, new_account_id)) continue; AccountInfo new_account_info = pair.second; @@ -340,7 +340,7 @@ // Remove any obsolete account. for (const auto& account_id : to_remove) { - DCHECK(base::ContainsKey(accounts_, account_id)); + DCHECK(base::Contains(accounts_, account_id)); AccountInfo& account_info = accounts_[account_id]; RemoveAccountImageFromDisk(account_id); RemoveFromPrefs(account_info); @@ -402,7 +402,7 @@ void AccountTrackerService::OnAccountImageLoaded( const CoreAccountId& account_id, gfx::Image image) { - if (base::ContainsKey(accounts_, account_id) && + if (base::Contains(accounts_, account_id) && accounts_[account_id].account_image.IsEmpty()) { AccountInfo& account_info = accounts_[account_id]; account_info.account_image = image; @@ -626,7 +626,7 @@ CoreAccountId AccountTrackerService::SeedAccountInfo(AccountInfo info) { info.account_id = PickAccountIdForAccount(info.gaia, info.email); - const bool already_exists = base::ContainsKey(accounts_, info.account_id); + const bool already_exists = base::Contains(accounts_, info.account_id); StartTrackingAccount(info.account_id); AccountInfo& account_info = accounts_[info.account_id]; DCHECK(!already_exists || account_info.gaia.empty() ||
diff --git a/components/signin/core/browser/dice_account_reconcilor_delegate.cc b/components/signin/core/browser/dice_account_reconcilor_delegate.cc index ddb4f9e3d..fdbad07 100644 --- a/components/signin/core/browser/dice_account_reconcilor_delegate.cc +++ b/components/signin/core/browser/dice_account_reconcilor_delegate.cc
@@ -54,7 +54,7 @@ bool will_logout) const { bool primary_account_has_token = !primary_account.empty() && - base::ContainsValue(chrome_accounts, primary_account); + base::Contains(chrome_accounts, primary_account); if (gaia_accounts.empty()) { if (primary_account_has_token) @@ -62,7 +62,7 @@ // Try the last known account. This happens when the cookies are cleared // while Sync is disabled. - if (base::ContainsValue(chrome_accounts, last_known_first_account_)) + if (base::Contains(chrome_accounts, last_known_first_account_)) return last_known_first_account_; // As a last resort, use the first Chrome account. @@ -71,7 +71,7 @@ const std::string& first_gaia_account = gaia_accounts[0].id; bool first_gaia_account_has_token = - base::ContainsValue(chrome_accounts, first_gaia_account); + base::Contains(chrome_accounts, first_gaia_account); if (!first_gaia_account_has_token && (primary_account == first_gaia_account) && gaia_accounts[0].valid) { @@ -136,7 +136,7 @@ gaia_accounts); } if (gaia_accounts.empty() && - base::ContainsValue(chrome_accounts, last_known_first_account_)) { + base::Contains(chrome_accounts, last_known_first_account_)) { // In PRESERVE mode in case accounts in cookies are accidentally lost we // should put cached first account first since Gaia has no information about // it.
diff --git a/components/signin/core/browser/mice_account_reconcilor_delegate.cc b/components/signin/core/browser/mice_account_reconcilor_delegate.cc index 86bcfa41..723b57c 100644 --- a/components/signin/core/browser/mice_account_reconcilor_delegate.cc +++ b/components/signin/core/browser/mice_account_reconcilor_delegate.cc
@@ -52,9 +52,8 @@ // Warning: As a result, the reconciliation may change the default Gaia // account. It should be ensured that this is not surprising for the user. std::string new_first_account = - base::ContainsValue(chrome_accounts, primary_account) - ? primary_account - : chrome_accounts[0]; + base::Contains(chrome_accounts, primary_account) ? primary_account + : chrome_accounts[0]; // Minimize account shuffling and ensure that the number of accounts does not // exceed the limit.
diff --git a/components/signin/core/browser/mirror_account_reconcilor_delegate.cc b/components/signin/core/browser/mirror_account_reconcilor_delegate.cc index dec9591..5040e049 100644 --- a/components/signin/core/browser/mirror_account_reconcilor_delegate.cc +++ b/components/signin/core/browser/mirror_account_reconcilor_delegate.cc
@@ -45,7 +45,7 @@ bool will_logout) const { // Mirror only uses the primary account, and it is never empty. DCHECK(!primary_account.empty()); - DCHECK(base::ContainsValue(chrome_accounts, primary_account)); + DCHECK(base::Contains(chrome_accounts, primary_account)); return primary_account; }
diff --git a/components/signin/core/browser/oauth2_token_service_delegate_android.cc b/components/signin/core/browser/oauth2_token_service_delegate_android.cc index c5da1175..5281817b 100644 --- a/components/signin/core/browser/oauth2_token_service_delegate_android.cc +++ b/components/signin/core/browser/oauth2_token_service_delegate_android.cc
@@ -351,7 +351,7 @@ std::vector<AccountInfo> accounts_info = account_tracker_service_->GetAccounts(); for (const AccountInfo& info : accounts_info) { - if (!base::ContainsValue(curr_ids, info.account_id)) + if (!base::Contains(curr_ids, info.account_id)) account_tracker_service_->RemoveAccount(info.account_id); } @@ -376,13 +376,13 @@ std::vector<CoreAccountId>* refreshed_ids, std::vector<CoreAccountId>* revoked_ids) { bool keep_accounts = base::FeatureList::IsEnabled(signin::kMiceFeature) || - base::ContainsValue(curr_ids, signed_in_id); + base::Contains(curr_ids, signed_in_id); if (keep_accounts) { // Revoke token for ids that have been removed from the device. for (const CoreAccountId& prev_id : prev_ids) { if (prev_id == signed_in_id) continue; - if (!base::ContainsValue(curr_ids, prev_id)) { + if (!base::Contains(curr_ids, prev_id)) { DVLOG(1) << "OAuth2TokenServiceDelegateAndroid::UpdateAccountList:" << "revoked=" << prev_id; revoked_ids->push_back(prev_id); @@ -404,7 +404,7 @@ } } else { // Revoke all ids. - if (base::ContainsValue(prev_ids, signed_in_id)) { + if (base::Contains(prev_ids, signed_in_id)) { DVLOG(1) << "OAuth2TokenServiceDelegateAndroid::UpdateAccountList:" << "revoked=" << signed_in_id; revoked_ids->push_back(signed_in_id);
diff --git a/components/signin/core/browser/profile_oauth2_token_service_delegate_chromeos.cc b/components/signin/core/browser/profile_oauth2_token_service_delegate_chromeos.cc index 00d05e5f..f7bad5a 100644 --- a/components/signin/core/browser/profile_oauth2_token_service_delegate_chromeos.cc +++ b/components/signin/core/browser/profile_oauth2_token_service_delegate_chromeos.cc
@@ -139,9 +139,9 @@ // We intentionally do NOT check if the refresh token associated with // |account_id| is valid or not. See crbug.com/919793 for details. - return base::ContainsValue(GetOAuthAccountIdsFromAccountKeys( - account_keys_, account_tracker_service_), - account_id); + return base::Contains(GetOAuthAccountIdsFromAccountKeys( + account_keys_, account_tracker_service_), + account_id); } void ProfileOAuth2TokenServiceDelegateChromeOS::UpdateAuthError(
diff --git a/components/signin/core/browser/profile_oauth2_token_service_delegate_chromeos_unittest.cc b/components/signin/core/browser/profile_oauth2_token_service_delegate_chromeos_unittest.cc index 408fee9..8b83f53b 100644 --- a/components/signin/core/browser/profile_oauth2_token_service_delegate_chromeos_unittest.cc +++ b/components/signin/core/browser/profile_oauth2_token_service_delegate_chromeos_unittest.cc
@@ -248,13 +248,13 @@ EXPECT_FALSE(delegate_->RefreshTokenIsAvailable(account_info_.account_id)); EXPECT_FALSE( - base::ContainsValue(delegate_->GetAccounts(), account_info_.account_id)); + base::Contains(delegate_->GetAccounts(), account_info_.account_id)); account_manager_.UpsertAccount(gaia_account_key_, kUserEmail, kGaiaToken); EXPECT_TRUE(delegate_->RefreshTokenIsAvailable(account_info_.account_id)); EXPECT_TRUE( - base::ContainsValue(delegate_->GetAccounts(), account_info_.account_id)); + base::Contains(delegate_->GetAccounts(), account_info_.account_id)); } TEST_F(CrOSOAuthDelegateTest, @@ -265,14 +265,14 @@ EXPECT_FALSE(delegate_->RefreshTokenIsAvailable(account_info_.account_id)); EXPECT_FALSE( - base::ContainsValue(delegate_->GetAccounts(), account_info_.account_id)); + base::Contains(delegate_->GetAccounts(), account_info_.account_id)); account_manager_.UpsertAccount(gaia_account_key_, kUserEmail, chromeos::AccountManager::kInvalidToken); EXPECT_TRUE(delegate_->RefreshTokenIsAvailable(account_info_.account_id)); EXPECT_TRUE( - base::ContainsValue(delegate_->GetAccounts(), account_info_.account_id)); + base::Contains(delegate_->GetAccounts(), account_info_.account_id)); } TEST_F(CrOSOAuthDelegateTest, ObserversAreNotifiedOnAuthErrorChange) { @@ -411,8 +411,8 @@ const std::vector<std::string>& first_batch = observer.batch_change_records_[0]; EXPECT_EQ(2UL, first_batch.size()); - EXPECT_TRUE(base::ContainsValue(first_batch, account1.account_id)); - EXPECT_TRUE(base::ContainsValue(first_batch, account2.account_id)); + EXPECT_TRUE(base::Contains(first_batch, account1.account_id)); + EXPECT_TRUE(base::Contains(first_batch, account2.account_id)); } TEST_F(CrOSOAuthDelegateTest, GetAccountsShouldNotReturnAdAccounts) {
diff --git a/components/signin/core/browser/signin_metrics_unittest.cc b/components/signin/core/browser/signin_metrics_unittest.cc index ec4cb74..ab16ec15 100644 --- a/components/signin/core/browser/signin_metrics_unittest.cc +++ b/components/signin/core/browser/signin_metrics_unittest.cc
@@ -129,8 +129,8 @@ } static bool AccessPointSupportsPersonalizedPromo(AccessPoint access_point) { - return base::ContainsValue(kAccessPointsThatSupportPersonalizedPromos, - access_point); + return base::Contains(kAccessPointsThatSupportPersonalizedPromos, + access_point); } };
diff --git a/components/signin/ios/browser/profile_oauth2_token_service_ios_delegate_unittest.mm b/components/signin/ios/browser/profile_oauth2_token_service_ios_delegate_unittest.mm index 4d91ebe..b9627c1 100644 --- a/components/signin/ios/browser/profile_oauth2_token_service_ios_delegate_unittest.mm +++ b/components/signin/ios/browser/profile_oauth2_token_service_ios_delegate_unittest.mm
@@ -5,8 +5,8 @@ #include "components/signin/ios/browser/profile_oauth2_token_service_ios_delegate.h" #include "base/memory/ptr_util.h" -#include "base/message_loop/message_loop.h" #include "base/run_loop.h" +#include "base/test/scoped_task_environment.h" #include "components/prefs/pref_registry_simple.h" #include "components/prefs/testing_pref_service.h" #include "components/signin/core/browser/account_tracker_service.h" @@ -103,7 +103,7 @@ } protected: - base::MessageLoop message_loop_; + base::test::ScopedTaskEnvironment scoped_task_environment_; net::FakeURLFetcherFactory factory_; TestingPrefServiceSimple prefs_; TestSigninClient client_;
diff --git a/components/spellcheck/renderer/spellcheck.cc b/components/spellcheck/renderer/spellcheck.cc index f0b2bf9..821f1c9 100644 --- a/components/spellcheck/renderer/spellcheck.cc +++ b/components/spellcheck/renderer/spellcheck.cc
@@ -190,7 +190,7 @@ const base::string16& suggestion = suggestions_list[language][index]; // Only add the suggestion if it's unique. - if (!base::ContainsValue(*optional_suggestions, suggestion)) { + if (!base::Contains(*optional_suggestions, suggestion)) { optional_suggestions->push_back(suggestion); } if (optional_suggestions->size() >= spellcheck::kMaxSuggestions) {
diff --git a/components/spellcheck/renderer/spellcheck_unittest.cc b/components/spellcheck/renderer/spellcheck_unittest.cc index 5e11c30e..9160d9b 100644 --- a/components/spellcheck/renderer/spellcheck_unittest.cc +++ b/components/spellcheck/renderer/spellcheck_unittest.cc
@@ -467,7 +467,7 @@ EXPECT_EQ(test_case.expected_result, result); // Check if the suggested words occur. - bool suggested_word_is_present = base::ContainsValue( + bool suggested_word_is_present = base::Contains( suggestions, base::WideToUTF16(test_case.suggested_word)); EXPECT_TRUE(suggested_word_is_present); }
diff --git a/components/storage_monitor/mtp_manager_client_chromeos.cc b/components/storage_monitor/mtp_manager_client_chromeos.cc index a52b3eb..9ac419e 100644 --- a/components/storage_monitor/mtp_manager_client_chromeos.cc +++ b/components/storage_monitor/mtp_manager_client_chromeos.cc
@@ -88,7 +88,7 @@ if (device_id.empty() || storage_label.empty()) return; - DCHECK(!base::ContainsKey(storage_map_, location)); + DCHECK(!base::Contains(storage_map_, location)); StorageInfo storage_info(device_id, location, storage_label, vendor_name, product_name, 0);
diff --git a/components/storage_monitor/portable_device_watcher_win.cc b/components/storage_monitor/portable_device_watcher_win.cc index 96756d68..2d3b9b0 100644 --- a/components/storage_monitor/portable_device_watcher_win.cc +++ b/components/storage_monitor/portable_device_watcher_win.cc
@@ -632,11 +632,11 @@ const StorageObjects& storage_objects = device_details->storage_objects; const base::string16& name = device_details->name; const base::string16& location = device_details->location; - DCHECK(!base::ContainsKey(device_map_, location)); + DCHECK(!base::Contains(device_map_, location)); for (StorageObjects::const_iterator storage_iter = storage_objects.begin(); storage_iter != storage_objects.end(); ++storage_iter) { const std::string& storage_id = storage_iter->object_persistent_id; - DCHECK(!base::ContainsKey(storage_map_, storage_id)); + DCHECK(!base::Contains(storage_map_, storage_id)); if (storage_id.empty() || name.empty()) return;
diff --git a/components/storage_monitor/storage_monitor.cc b/components/storage_monitor/storage_monitor.cc index 5b58360..c7b2798 100644 --- a/components/storage_monitor/storage_monitor.cc +++ b/components/storage_monitor/storage_monitor.cc
@@ -167,7 +167,7 @@ void StorageMonitor::ProcessAttach(const StorageInfo& info) { { base::AutoLock lock(storage_lock_); - if (base::ContainsKey(storage_map_, info.device_id())) { + if (base::Contains(storage_map_, info.device_id())) { // This can happen if our unique id scheme fails. Ignore the incoming // non-unique attachment. return;
diff --git a/components/storage_monitor/storage_monitor_chromeos.cc b/components/storage_monitor/storage_monitor_chromeos.cc index 9bcee56..a7705cb 100644 --- a/components/storage_monitor/storage_monitor_chromeos.cc +++ b/components/storage_monitor/storage_monitor_chromeos.cc
@@ -211,7 +211,7 @@ switch (event) { case DiskMountManager::MOUNTING: { - if (base::ContainsKey(mount_map_, mount_info.mount_path)) { + if (base::Contains(mount_map_, mount_info.mount_path)) { return; } @@ -253,7 +253,7 @@ return false; base::FilePath current = path; - while (!base::ContainsKey(mount_map_, current.value()) && + while (!base::Contains(mount_map_, current.value()) && current != current.DirName()) { current = current.DirName(); } @@ -323,7 +323,7 @@ bool has_dcim) { DCHECK_CURRENTLY_ON(content::BrowserThread::UI); - if (base::ContainsKey(mount_map_, mount_info.mount_path)) { + if (base::Contains(mount_map_, mount_info.mount_path)) { // CheckExistingMountPoints() added the mount point information in the map // before the device attached handler is called. Therefore, an entry for // the device already exists in the map. @@ -351,7 +351,7 @@ if (!GetFixedStorageInfo(disk, &info)) return; - if (base::ContainsKey(mount_map_, disk.mount_path())) + if (base::Contains(mount_map_, disk.mount_path())) return; mount_map_.insert(std::make_pair(disk.mount_path(), info));
diff --git a/components/storage_monitor/storage_monitor_linux.cc b/components/storage_monitor/storage_monitor_linux.cc index bc5fe10..fc8d1ce 100644 --- a/components/storage_monitor/storage_monitor_linux.cc +++ b/components/storage_monitor/storage_monitor_linux.cc
@@ -278,7 +278,7 @@ return false; base::FilePath current = path; - while (!base::ContainsKey(mount_info_map_, current) && + while (!base::Contains(mount_info_map_, current) && current != current.DirName()) current = current.DirName(); @@ -439,7 +439,7 @@ bool StorageMonitorLinux::IsDeviceAlreadyMounted( const base::FilePath& mount_device) const { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - return base::ContainsKey(mount_priority_map_, mount_device); + return base::Contains(mount_priority_map_, mount_device); } void StorageMonitorLinux::HandleDeviceMountedMultipleTimes(
diff --git a/components/storage_monitor/transient_device_ids.cc b/components/storage_monitor/transient_device_ids.cc index e65b60a..27e9d8b 100644 --- a/components/storage_monitor/transient_device_ids.cc +++ b/components/storage_monitor/transient_device_ids.cc
@@ -21,11 +21,11 @@ const std::string& device_id) { DCHECK(thread_checker_.CalledOnValidThread()); - if (!base::ContainsKey(device_id_map_, device_id)) { + if (!base::Contains(device_id_map_, device_id)) { std::string transient_id; do { transient_id = base::GenerateGUID(); - } while (base::ContainsKey(transient_id_map_, transient_id)); + } while (base::Contains(transient_id_map_, transient_id)); device_id_map_[device_id] = transient_id; transient_id_map_[transient_id] = device_id;
diff --git a/components/storage_monitor/volume_mount_watcher_win.cc b/components/storage_monitor/volume_mount_watcher_win.cc index 8d4f3b1..50919ff5 100644 --- a/components/storage_monitor/volume_mount_watcher_win.cc +++ b/components/storage_monitor/volume_mount_watcher_win.cc
@@ -358,7 +358,7 @@ DCHECK_CURRENTLY_ON(BrowserThread::UI); for (size_t i = 0; i < removable_devices.size(); i++) { - if (base::ContainsKey(pending_device_checks_, removable_devices[i])) + if (base::Contains(pending_device_checks_, removable_devices[i])) continue; pending_device_checks_.insert(removable_devices[i]); device_info_task_runner_->PostTask(
diff --git a/components/strings/components_strings_am.xtb b/components/strings/components_strings_am.xtb index 53a043c..0d88430 100644 --- a/components/strings/components_strings_am.xtb +++ b/components/strings/components_strings_am.xtb
@@ -1,7 +1,6 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="am"> -<translation id="1001338328714563407">የእርስዎ መሣሪያ እና መለያ አስተዳዳሪ እንደመሆንዎ መጠን <ph name="ENROLLMENT_DOMAIN" />፦</translation> <translation id="1008557486741366299">አሁን አይደለም</translation> <translation id="1010200102790553230">በኋላ ላይ ገጽ ጫን</translation> <translation id="1015730422737071372">ተጨማሪ ዝርዝሮችን ያቅርቡ</translation> @@ -41,6 +40,7 @@ <translation id="1161325031994447685">ከWi-Fi ጋር ዳግም በማገናኘት</translation> <translation id="1165039591588034296">ስህተት</translation> <translation id="1175364870820465910">&አትም…</translation> +<translation id="1178581264944972037">ለአፍታ አቁም</translation> <translation id="1181037720776840403">አስወግድ</translation> <translation id="1197088940767939838">ብርቱካናማ</translation> <translation id="1201402288615127009">ቀጣይ</translation> @@ -100,7 +100,6 @@ <translation id="1405567553485452995">ፈካ ያለ አረንጓዴ</translation> <translation id="1407135791313364759">ሁሉንም ክፈት</translation> <translation id="1413809658975081374">የግላዊነት ስህተት</translation> -<translation id="14171126816530869">የ<ph name="ORGANIZATION" /> በ<ph name="LOCALITY" /> ማንነቱ የተረጋገጠው በ<ph name="ISSUER" /> ነው።</translation> <translation id="1426410128494586442">አዎ</translation> <translation id="1430915738399379752">አትም</translation> <translation id="1455413310270022028">ማጥፊያ</translation> @@ -253,6 +252,7 @@ <translation id="2262243747453050782">የኤች ቲ ቲ ፒ ስህተት</translation> <translation id="2263079731045660823">በChrome ቅንብሮች ውስጥ የክሬዲት ካርድ ራስ-ሙላ መረጃን ያዘምኑ</translation> <translation id="2270484714375784793">ስልክ ቁጥር</translation> +<translation id="2277103315734023688">ወደ ፊት ፈልግ</translation> <translation id="2283340219607151381">አድራሻዎችን አስቀምጥ እና ሙላ</translation> <translation id="2292556288342944218">የእርስዎ የበየነመረብ መዳረሻ ታግዷል</translation> <translation id="2297722699537546652">B5 (የደብዳቤ ፖስታ)</translation> @@ -377,7 +377,6 @@ <translation id="295526156371527179">ማስጠንቀቂያ፦ ይህ መመሪያ መዝገበ-ቃላት ስላልሆነ እንደ መዝገበ-ቃላት አልተዋሃደም።</translation> <translation id="2955913368246107853">አግኝ አሞሌን ዝጋ</translation> <translation id="2969319727213777354">ደህንነቱ የተጠበቀ ግንኙነት ለመመስረት የእርስዎ ሰዓት በትክክል መዋቀር አለበት። ይሄ የሆነበት ምክንያት ድር ጣቢያዎች ራሳቸውን ለማሳወቅ የሚጠቀሙባቸው የእውቅና ማረጋገጫዎች የሚሰሩት ለተወሰኑ ጊዜዎች ብቻ ስለሆነ ነው። የእርስዎ መሣሪያ ሰዓት ትክክል እንዳለመሆኑ መጠን Google Chrome እነዚህን የእውቅና ማረጋገጫዎች ሊያረጋግጥ አይችልም።</translation> -<translation id="2970515157925768593">የእርስዎን መሣሪያ እና የመለያ ውቅረት በርቀት መቀየር ይችላሉ።</translation> <translation id="2972581237482394796">&ድገም</translation> <translation id="2977665033722899841"><ph name="ROW_NAME" />፣ አሁን ላይ ተመርጧል። <ph name="ROW_CONTENT" /></translation> <translation id="2982481275546140226">ውሂብን አጽዳ</translation> @@ -389,7 +388,6 @@ <translation id="3005723025932146533">የተቀመጠ ቅጂ አሳይ</translation> <translation id="3008447029300691911">የ<ph name="CREDIT_CARD" /> ሲቪሲ ያስገቡ። አንዴ ካረጋገጡ በኋላ የካርድ ዝርዝሮችዎ ለዚህ ጣቢያ ይጋራሉ።</translation> <translation id="3010559122411665027">የዝርዝር ግቤት «<ph name="ENTRY_INDEX" />»፦ <ph name="ERROR" /></translation> -<translation id="3014389611820813634">የዚህ መሣሪያ አስተዳዳሪ እንደመሆንዎ መጠን <ph name="ENROLLMENT_DOMAIN" />፦</translation> <translation id="301521992641321250">በራስ-ሰር ታግዷል</translation> <translation id="3023071826883856138">You4 (የደብዳቤ ፖስታ)</translation> <translation id="3024663005179499861">የተሳሳተ የመምሪያ አይነት</translation> @@ -434,7 +432,6 @@ <translation id="3287510313208355388">መስመር ላይ ሲሆኑ ያውርዱ</translation> <translation id="3293642807462928945">ስለ<ph name="POLICY_NAME" /> መመሪያው ተጨማሪ ይወቁ</translation> <translation id="3303855915957856445">ምንም የፍለጋ ውጤቶች አልተገኙም</translation> -<translation id="3311730110465560799">የመሣሪያ ውቅረትዎን በርቀት ማዋቀር ይችላል።</translation> <translation id="3320021301628644560">የመክፈያ አድራሻ አክል</translation> <translation id="3324983252691184275">ክሪምሶን</translation> <translation id="3338095232262050444">ደህንነቱ የተጠበቀ ነው</translation> @@ -530,7 +527,6 @@ <translation id="3761718714832595332">ሁኔታን ደብቅ</translation> <translation id="3765032636089507299">የSafe Browsing ገጽ በግንባታ ላይ ነው።</translation> <translation id="3778403066972421603">ይህን ካርድ በእርስዎ የGoogle መለያ እና በዚህ መሣሪያ ላይ ማስቀመጥ ይፈልጋሉ?</translation> -<translation id="3779973883630527594">ይህን መለያ የሚያስተዳድረው ኩባንያ፣ ትምህርት ቤት ወይም ድርጅት፦</translation> <translation id="3781428340399460090">ደመቅ ያለ ሮዝ</translation> <translation id="3783418713923659662">Mastercard</translation> <translation id="3787705759683870569">በ<ph name="EXPIRATION_MONTH" />/<ph name="EXPIRATION_YEAR" /> ላይ የአገልግሎት ጊዜው ያበቃል</translation> @@ -554,6 +550,7 @@ <translation id="3949571496842715403">ይህ አገልጋይ <ph name="DOMAIN" /> መሆኑን ሊያረጋግጥ አልቻለም፤ የደህንነት ዕውቅና ማረጋገጫው የርዕሰ ጒዳይ አማራጭ ስሞችን አይጠቅስም። ይህ በተሳሳተ ውቅረት የተከሰተ ወይም አጥቂ የእርስዎን ግንኙነት አቋርጦ እየገባ ስለሆነ ሊሆን ይችላል።</translation> <translation id="3949601375789751990">የአሰሳ ታሪክዎ እዚህ ይመጣል</translation> <translation id="3950820424414687140">ይግቡ</translation> +<translation id="3962859241508114581">ቀዳሚ ትራክ</translation> <translation id="3963837677003247395">በእጅ ይቀጥል?</translation> <translation id="3964661563329879394">{COUNT,plural, =0{ምንም}=1{ከ1 ጣቢያ }one{ከ# ጣቢያዎች }other{ከ# ጣቢያዎች }}</translation> <translation id="397105322502079400">በማስላት ላይ...</translation> @@ -576,6 +573,7 @@ <translation id="410351446219883937">ራስ-አጫውት</translation> <translation id="4103763322291513355">የተከለከሉ የዩ አር ኤሎች ዝርዝር እና ሌሎች በስርዓት አስተዳዳሪዎ አስገዳጅነት የተሰጣቸው መመሪያዎችን ለማየት <strong>chrome://policy</strong>ን ይጎብኙ።</translation> <translation id="4110652170750985508">የእርስዎን ክፍያ ይገምግሙ</translation> +<translation id="4112140312785995938">ወደኋላ ፈልግ</translation> <translation id="4116663294526079822">ሁልጊዜ በዚህ ጣቢያ ላይ ፍቀድ</translation> <translation id="4117700440116928470">የመመሪያ ወሰን አይደገፍም።</translation> <translation id="4129401438321186435">{COUNT,plural, =1{1 ሌላ}one{# ሌሎች}other{# ሌሎች}}</translation> @@ -654,6 +652,7 @@ <translation id="443673843213245140">የተኪ መጠቀም ተሰናክሏል ግን ግልጽ የሆነ የተኪ ውቅር ተገልጿል።</translation> <translation id="445100540951337728">ተቀባይነት ያላቸው ዴቢት ካርዶች</translation> <translation id="4466881336512663640">የቅጽ ለውጦች ይጠፋሉ። እርግጠኛ ነዎት መቀጠል ይፈልጋሉ?</translation> +<translation id="4477350412780666475">ቀጣይ ትራክ</translation> <translation id="4482953324121162758">ይህ ጣቢያ አይተረጎምም።</translation> <translation id="4490717597759821841">A7</translation> <translation id="4493480324863638523">ልክ ያልሆነ ዩአርኤል። ደረጃውን የጠበቀ ቅርጸ አጻጻፍ ያለው ዩአርኤል መሆን አለበት፣ ለምሳሌ፦ http://example.com ወይም https://example.com.</translation> @@ -900,7 +899,6 @@ <translation id="5838278095973806738">በአጥቂዎች ሊሰረቅ ስለሚችል በዚህ ጣቢያ ላይ ማናቸውም አደጋን ሊያስከትል የሚችል መረጃ (ለምሳሌ፦ የይለፍ ቃሎች ወይም የክሬዲት ካርዶች) ማስገባት የለብዎትም።</translation> <translation id="5860033963881614850">አጥፋ</translation> <translation id="5863847714970149516">ከፊት ያለው ገጽ እርስዎን ገንዘብ ለማስከፈል ሊሞክር ይችላል</translation> -<translation id="5865951947699094510">የመለያዎን ውቅረት በርቀት መቀየር ይችላሉ።</translation> <translation id="5866257070973731571">ስልክ ቁጥር ያክሉ</translation> <translation id="5869405914158311789">ይህ ጣቢያ ሊደረስበት አይችልም</translation> <translation id="5869522115854928033">የተቀመጡ የይለፍ ቃሎች</translation> @@ -1053,6 +1051,7 @@ <translation id="6778737459546443941">የእርስዎ ወላጅ ገና አላጸደቁትም</translation> <translation id="67862343314499040">ወይን ጠጅ</translation> <translation id="6786747875388722282">ቅጥያዎች</translation> +<translation id="6790428901817661496">አጫውት</translation> <translation id="679355240208270552">ነባሪው ፍለጋ በመምሪያ ስላልነቃ ችላ ተብሏል።</translation> <translation id="681021252041861472">የሚያስፈልግ መስክ</translation> <translation id="6810899417690483278">የብጁነት መታወቂያ</translation> @@ -1097,6 +1096,7 @@ <translation id="7053983685419859001">አግድ</translation> <translation id="7062635574500127092">ውሃ አረንጓዴ ሰማያዊ</translation> <translation id="7064851114919012435">የእውቂያ መረጃ</translation> +<translation id="7075452647191940183">ጥያቄ ከልክ በላይ ግዙፍ ነው</translation> <translation id="7079718277001814089">ይህ ጣቢያ ተንኮል-አዘል ዌር ይዟል</translation> <translation id="7087282848513945231">ክፍለ ሀገር</translation> <translation id="7090678807593890770"><ph name="LINK" />ን በGoogle ላይ ይፈልጉ</translation> @@ -1153,6 +1153,7 @@ <translation id="7353601530677266744">የትእዛዝ መስመር</translation> <translation id="7372973238305370288">የፍለጋ ውጤት</translation> <translation id="7377249249140280793"><ph name="RELATIVE_DATE" /> - <ph name="FULL_DATE" /></translation> +<translation id="7378594059915113390">የሚዲያ መቆጣጠሪያዎች</translation> <translation id="7378627244592794276">አይ</translation> <translation id="7378810950367401542">/</translation> <translation id="7390545607259442187">ካርድ ያረጋግጡ</translation> @@ -1256,7 +1257,6 @@ <translation id="780301667611848630">አይ፣ አመሰግናለሁ</translation> <translation id="7805768142964895445">ሁኔታ</translation> <translation id="7806344367022510803">በChrome ውስጥ የፍለጋ ፕሮግራም ቅንብሮችን ይቀይሩ</translation> -<translation id="7810209002420871817">የመለያዎ <ph name="ACCOUNT_DOMAIN" /> አስተዳዳሪ እንደመሆንዎ መጠን፦</translation> <translation id="7812922009395017822">Mir</translation> <translation id="7813600968533626083">የአስተያየት ጥቆማ ከChrome ይወገድ?</translation> <translation id="7815407501681723534">ለ«<ph name="SEARCH_STRING" />» <ph name="NUMBER_OF_RESULTS" /> <ph name="SEARCH_RESULTS" /> ተገኝተዋል።</translation>
diff --git a/components/strings/components_strings_ar.xtb b/components/strings/components_strings_ar.xtb index 4846fcb..90cd4d09 100644 --- a/components/strings/components_strings_ar.xtb +++ b/components/strings/components_strings_ar.xtb
@@ -1,7 +1,6 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="ar"> -<translation id="1001338328714563407">يمكن لنطاق التسجيل <ph name="ENROLLMENT_DOMAIN" /> بصفته مدير هذا الجهاز والحساب:</translation> <translation id="1008557486741366299">ليس الآن</translation> <translation id="1010200102790553230">تحميل الصفحة لاحقًا</translation> <translation id="1015730422737071372">تقديم تفاصيل إضافية</translation> @@ -41,6 +40,7 @@ <translation id="1161325031994447685">إعادة الاتصال بـ Wi-Fi</translation> <translation id="1165039591588034296">خطأ</translation> <translation id="1175364870820465910">ط&باعة...</translation> +<translation id="1178581264944972037">الإيقاف مؤقتًا</translation> <translation id="1181037720776840403">إزالة</translation> <translation id="1197088940767939838">برتقالي</translation> <translation id="1201402288615127009">التالي</translation> @@ -100,7 +100,6 @@ <translation id="1405567553485452995">أخضر فاتح</translation> <translation id="1407135791313364759">فتح الكل</translation> <translation id="1413809658975081374">خطأ في الخصوصية</translation> -<translation id="14171126816530869">تمّ التحقق من هوية <ph name="ORGANIZATION" /> في <ph name="LOCALITY" /> من قِبل <ph name="ISSUER" />.</translation> <translation id="1426410128494586442">نعم</translation> <translation id="1430915738399379752">طباعة</translation> <translation id="1455413310270022028">ممحاة</translation> @@ -178,6 +177,7 @@ <translation id="1800473098294731951">B9</translation> <translation id="1803264062614276815">اسم حامل البطاقة</translation> <translation id="1821930232296380041">طلب غير صالح، أو معلمات طلب غير صالحة</translation> +<translation id="1822370876374026111">للدفع بشكلٍ أسرع في المرة القادمة، عليك إضافة تفاصيل البطاقة المصرفية وعنوان إرسال الفواتير في حسابك على Google وعلى هذا الجهاز.</translation> <translation id="1822540298136254167">مواقع الويب التي تزورها والوقت المُستغرق في تصفُّحها</translation> <translation id="1826516787628120939">حساب شيكات</translation> <translation id="1834321415901700177">يحتوي هذا الموقع على برامج ضارة</translation> @@ -255,6 +255,7 @@ <translation id="2262243747453050782">خطأ HTTP</translation> <translation id="2263079731045660823">تحديث معلومات الملء التلقائي لبطاقة الائتمان في إعدادات Chrome</translation> <translation id="2270484714375784793">رقم الهاتف</translation> +<translation id="2277103315734023688">الانتقال إلى الأمام</translation> <translation id="2283340219607151381">حفظ العناوين وملؤها</translation> <translation id="2292556288342944218">تم حظر دخولك إلى الإنترنت</translation> <translation id="2297722699537546652">B5 (مغلف)</translation> @@ -382,7 +383,6 @@ <translation id="295526156371527179">تحذير: لم يتم دمج هذه السياسة كمعجم كما هو موضح بموجب السياسة؛ لأنها ليست معجمًا.</translation> <translation id="2955913368246107853">إغلاق شريط البحث</translation> <translation id="2969319727213777354">لإنشاء اتصال آمن، فإنك بحاجة إلى ضبط ساعتك بشكل صحيح. وذلك لأن الشهادات التي تستخدمها مواقع الويب لتعريف نفسها تكون صالحة فقط لفترات محددة من الوقت. فإذا كانت ساعة جهازك غير صحيحة، فلن يتمكن Google Chrome من التحقق من هذه الشهادات.</translation> -<translation id="2970515157925768593">تغيير إعداد الجهاز والحساب عن بُعد.</translation> <translation id="2972581237482394796">إعا&دة</translation> <translation id="2977665033722899841"><ph name="ROW_NAME" />، تم تحديده حاليًا. <ph name="ROW_CONTENT" /></translation> <translation id="2982481275546140226">محو البيانات</translation> @@ -394,7 +394,6 @@ <translation id="3005723025932146533">عرض نسخة محفوظة</translation> <translation id="3008447029300691911">أدخل رمز التحقق من البطاقة (CVC) لـ <ph name="CREDIT_CARD" />. بعد تأكيدك، ستتم مشاركة تفاصيل بطاقتك مع هذا الموقع.</translation> <translation id="3010559122411665027">إدخال القائمة "<ph name="ENTRY_INDEX" />": <ph name="ERROR" /></translation> -<translation id="3014389611820813634">يمكن لنطاق التسجيل <ph name="ENROLLMENT_DOMAIN" /> بصفته مدير هذا الجهاز:</translation> <translation id="301521992641321250">تم الحظر تلقائيًا</translation> <translation id="3023071826883856138">You4 (مغلف)</translation> <translation id="3024663005179499861">نوع السياسة غير صحيح</translation> @@ -440,7 +439,6 @@ <translation id="3287510313208355388">التنزيل عند الاتصال بالإنترنت</translation> <translation id="3293642807462928945">مزيد من المعلومات عن سياسة <ph name="POLICY_NAME" /></translation> <translation id="3303855915957856445">لم يتم العثور على أي نتائج بحث</translation> -<translation id="3311730110465560799">تغيير إعداد الجهاز عن بُعد.</translation> <translation id="3320021301628644560">إضافة عنوان إرسال الفواتير</translation> <translation id="3324983252691184275">قرمزي</translation> <translation id="3338095232262050444">آمن</translation> @@ -536,7 +534,6 @@ <translation id="3761718714832595332">إخفاء الحالة</translation> <translation id="3765032636089507299">صفحة التصفح الآمن تحت الإنشاء.</translation> <translation id="3778403066972421603">هل تريد حفظ هذه البطاقة في حسابك في Google وعلى هذا الجهاز؟</translation> -<translation id="3779973883630527594">الشركة أو المؤسسة التعليمية أو المؤسسة التي تدير هذا الحساب:</translation> <translation id="3781428340399460090">وردي برّاق</translation> <translation id="3783418713923659662">Mastercard</translation> <translation id="3787705759683870569">تنتهي في <ph name="EXPIRATION_MONTH" />/<ph name="EXPIRATION_YEAR" /></translation> @@ -560,6 +557,7 @@ <translation id="3949571496842715403">لم يتمكن هذا الخادم من إثبات أنه <ph name="DOMAIN" />؛ بل إن شهادة الأمان التابعة له لا تُحدّد الأسماء البديلة للمضيفات. وربما يكون السبب في ذلك وجود خطأ في التهيئة أو اعتراض أحد المهاجمين للاتصال.</translation> <translation id="3949601375789751990">يظهر سجلّ التصفّح هنا</translation> <translation id="3950820424414687140">تسجيل الدخول</translation> +<translation id="3962859241508114581">المقطع الصوتي السابق</translation> <translation id="3963837677003247395">هل تريد المتابعة يدويًا؟</translation> <translation id="3964661563329879394">{COUNT,plural, =0{بدون}=1{من موقع واحد }two{من موقعين (#) }few{من # مواقع }many{من # موقعًا }other{من # موقع }}</translation> <translation id="397105322502079400">جارٍ الحساب...</translation> @@ -582,6 +580,7 @@ <translation id="410351446219883937">التشغيل التلقائي</translation> <translation id="4103763322291513355">انتقل إلى <strong>chrome://policy</strong> لمشاهدة قائمة بعناوين URL المضافة إلى القائمة السوداء والسياسات الأخرى التي فرضها مشرف النظام.</translation> <translation id="4110652170750985508">مراجعة الدفعة</translation> +<translation id="4112140312785995938">الانتقال إلى الخلف</translation> <translation id="4116663294526079822">إلغاء الحظر دومًا على هذا الموقع</translation> <translation id="4117700440116928470">نطاق السياسة غير متوافق.</translation> <translation id="4129401438321186435">{COUNT,plural, =1{عنصر واحد آخر}zero{# عنصر آخر}two{عنصران آخران (#)}few{# عناصر أخرى}many{# عنصرًا آخر}other{# عنصر آخر}}</translation> @@ -595,6 +594,7 @@ <translation id="4173315687471669144">Foolscap</translation> <translation id="4173827307318847180">{MORE_ITEMS,plural, =1{عنصر (<ph name="ITEM_COUNT" />) آخر}zero{<ph name="ITEM_COUNT" /> عنصر آخر}two{عنصران (<ph name="ITEM_COUNT" />) آخران}few{<ph name="ITEM_COUNT" /> عناصر أخرى}many{<ph name="ITEM_COUNT" /> عنصرًا آخر}other{<ph name="ITEM_COUNT" /> عنصر آخر}}</translation> <translation id="4179515394835346607"><ph name="ROW_NAME" /> <ph name="ROW_CONTENT" /></translation> +<translation id="4193750898749511769">للدفع بشكلٍ أسرع في المرة القادمة، عليك إضافة تفاصيل البطاقة المصرفية وعنوان إرسال الفواتير في حسابك على Google.</translation> <translation id="4196861286325780578">إ&عادة النقل</translation> <translation id="4203896806696719780"><ph name="BEGIN_LINK" />التحقق من عمليات تهيئة الجدار الناري وبرامج مكافحة الفيروسات<ph name="END_LINK" /></translation> <translation id="4215751373031079683">7x9 (مغلف)</translation> @@ -659,6 +659,7 @@ <translation id="443673843213245140">تم إيقاف استخدام الخادم الوكيل ولكن تم تحديد تهيئة صريحة للخادم الوكيل.</translation> <translation id="445100540951337728">بطاقات السحب الآلي المقبولة</translation> <translation id="4466881336512663640">سيتم فقدان تغييرات النموذج. هل تريد فعلاً المتابعة؟</translation> +<translation id="4477350412780666475">المقطع الصوتي التالي</translation> <translation id="4482953324121162758">لن تتم ترجمة هذا الموقع.</translation> <translation id="4490717597759821841">A7</translation> <translation id="4493480324863638523">عنوان URL غير صحيح. يجب أن يحتوي عنوان URL على نظام قياسي، مثل http://example.com أو https://example.com.</translation> @@ -905,7 +906,6 @@ <translation id="5838278095973806738">يجب عدم إدخال معلومات حسّاسة على هذا الموقع (مثل كلمات المرور أو بطاقات الائتمان) لأنه قد تتم سرقتها من قِبل المهاجمين.</translation> <translation id="5860033963881614850">غير مفعّل</translation> <translation id="5863847714970149516">قد تحاول الصفحة التالية تحصيل رسوم منك</translation> -<translation id="5865951947699094510">يمكن تغيير إعداد الحساب عن بُعد.</translation> <translation id="5866257070973731571">إضافة رقم الهاتف</translation> <translation id="5869405914158311789">لا يمكن الوصول إلى موقع الويب هذا</translation> <translation id="5869522115854928033">كلمات المرور المحفوظة</translation> @@ -1009,6 +1009,7 @@ <translation id="6451458296329894277">تأكيد إعادة إرسال النموذج</translation> <translation id="6465306955648956876">إدارة كلمات المرور...</translation> <translation id="647261751007945333">سياسات الأجهزة</translation> +<translation id="6476284679642588870">إدارة طرق الدفع</translation> <translation id="6477321094435799029">اكتشف Chrome وجود رمز غير عادي على هذه الصفحة وأجرى حظرًا لهذا الرمز لحماية معلوماتك الشخصية (على سبيل المثال، كلمات المرور، وأرقام الهواتف، وبطاقات الائتمان).</translation> <translation id="6489534406876378309">بدء تحميل الأعطال</translation> <translation id="6499038740797743453">هل تريد إعادة تعيين كلمة المرور؟</translation> @@ -1057,6 +1058,7 @@ <translation id="6778737459546443941">لم يوافق عليه والداك حتى الآن</translation> <translation id="67862343314499040">بنفسجي</translation> <translation id="6786747875388722282">الإضافات</translation> +<translation id="6790428901817661496">التشغيل</translation> <translation id="679355240208270552">تم التجاهل نظرًا لأنه لم يتم تفعيل البحث التلقائي بواسطة السياسة.</translation> <translation id="681021252041861472">الحقل مطلوب</translation> <translation id="6810899417690483278">رقم تعريف التخصيص</translation> @@ -1147,6 +1149,7 @@ <translation id="7298195798382681320">موصى بها</translation> <translation id="7300012071106347854">أزرق كوبالت</translation> <translation id="7302712225291570345">"<ph name="TEXT" />"</translation> +<translation id="7303701124147721189">للدفع بشكلٍ أسرع في المرة القادمة، عليك تخزين تفاصيل البطاقة المصرفية وعنوان إرسال الفواتير في حسابك على Google وعلى هذا الجهاز.</translation> <translation id="7309308571273880165">تقرير الأعطال الذي تم الحصول عليه في <ph name="CRASH_TIME" /> (التحميل مطلوب بواسطة المستخدم، لم يتم التحميل بعد)</translation> <translation id="7313965965371928911">تحذيرات <ph name="BEGIN_LINK" />التصفُّح الآمن<ph name="END_LINK" /></translation> <translation id="7319430975418800333">A3</translation> @@ -1159,6 +1162,7 @@ <translation id="7353601530677266744">سطر الأوامر</translation> <translation id="7372973238305370288">نتيجة البحث</translation> <translation id="7377249249140280793"><ph name="RELATIVE_DATE" /> - <ph name="FULL_DATE" /></translation> +<translation id="7378594059915113390">عناصر التحكم في الوسائط</translation> <translation id="7378627244592794276">لا</translation> <translation id="7378810950367401542">/</translation> <translation id="7390545607259442187">التأكد من البطاقة</translation> @@ -1262,7 +1266,6 @@ <translation id="780301667611848630">لا، شكرًا</translation> <translation id="7805768142964895445">الحالة</translation> <translation id="7806344367022510803">تغيير إعدادات محرّك البحث في Chrome</translation> -<translation id="7810209002420871817">يمكن لنطاق الحساب <ph name="ACCOUNT_DOMAIN" /> بصفته مدير الحساب:</translation> <translation id="7812922009395017822">Mir</translation> <translation id="7813600968533626083">هل تريد إزالة اقتراح النموذج من Chrome؟</translation> <translation id="7815407501681723534">تم العثور على <ph name="NUMBER_OF_RESULTS" /> <ph name="SEARCH_RESULTS" /> لـ "<ph name="SEARCH_STRING" />"</translation> @@ -1375,6 +1378,7 @@ <translation id="8428213095426709021">الإعدادات</translation> <translation id="8433057134996913067">سيؤدي هذا إلى خروجك من معظم مواقع الويب.</translation> <translation id="8437238597147034694">تراجع عن ال&نقل</translation> +<translation id="8440508849222143646">للدفع بشكلٍ أسرع في المرة القادمة، عليك تخزين تفاصيل البطاقة المصرفية وعنوان إرسال الفواتير في حسابك على Google.</translation> <translation id="8461694314515752532">تشفير البيانات المتزامنة باستخدام عبارة مرور المزامنة الخاصة بك</translation> <translation id="8466379296835108687">{COUNT,plural, =1{بطاقة ائتمان واحدة}zero{# بطاقة ائتمان}two{بطاقتا ائتمان (#)}few{# بطاقات ائتمان}many{# بطاقة ائتمان}other{# بطاقة ائتمان}}</translation> <translation id="8473863474539038330">العناوين والمزيد</translation> @@ -1481,6 +1485,7 @@ <translation id="9128870381267983090">الاتصال بالشبكة</translation> <translation id="9137013805542155359">إظهار الصفحة الأصلية</translation> <translation id="9137248913990643158">يُرجى البدء وتسجيل الدخول إلى Chrome قبل استخدام هذا التطبيق.</translation> +<translation id="9141013498910525015">إدارة العناوين الجغرافية</translation> <translation id="9148088599418889305">اختيار طريقة الشحن</translation> <translation id="9148507642005240123">تراجع عن ا&لتحرير</translation> <translation id="9154194610265714752">تم التحديث</translation>
diff --git a/components/strings/components_strings_bg.xtb b/components/strings/components_strings_bg.xtb index c070a80..6ebce39 100644 --- a/components/strings/components_strings_bg.xtb +++ b/components/strings/components_strings_bg.xtb
@@ -1,7 +1,6 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="bg"> -<translation id="1001338328714563407">Като мениджър на устройството и профила ви <ph name="ENROLLMENT_DOMAIN" />:</translation> <translation id="1008557486741366299">Не сега</translation> <translation id="1010200102790553230">Зареждане на страницата по-късно</translation> <translation id="1015730422737071372">Въвеждане на допълнителни подробности</translation> @@ -41,6 +40,7 @@ <translation id="1161325031994447685">Свържете се отново с Wi-Fi.</translation> <translation id="1165039591588034296">Грешка</translation> <translation id="1175364870820465910">&Печат...</translation> +<translation id="1178581264944972037">Пауза</translation> <translation id="1181037720776840403">Премахване</translation> <translation id="1197088940767939838">оранжево</translation> <translation id="1201402288615127009">Напред</translation> @@ -100,7 +100,6 @@ <translation id="1405567553485452995">светлозелено</translation> <translation id="1407135791313364759">Отваряне на всички</translation> <translation id="1413809658975081374">Грешка, свързана в поверителността</translation> -<translation id="14171126816530869">Самоличността на <ph name="ORGANIZATION" /> от <ph name="LOCALITY" /> е проверена от <ph name="ISSUER" />.</translation> <translation id="1426410128494586442">Да</translation> <translation id="1430915738399379752">Печат</translation> <translation id="1455413310270022028">Гума</translation> @@ -256,6 +255,7 @@ <translation id="2262243747453050782">HTTP грешка</translation> <translation id="2263079731045660823">Актуализирайте данните за автоматично попълване на кредитни карти от настройките на Chrome</translation> <translation id="2270484714375784793">Телефонен номер</translation> +<translation id="2277103315734023688">Придвижване напред</translation> <translation id="2283340219607151381">Запазване и попълване на адреси</translation> <translation id="2292556288342944218">Достъпът ви до интернет е блокиран</translation> <translation id="2297722699537546652">B5 (плик)</translation> @@ -383,7 +383,6 @@ <translation id="295526156371527179">Предупреждение: Това правило не бе обединено като речник според посоченото в правилото, тъй като не е речник.</translation> <translation id="2955913368246107853">Затваряне на лентата за търсене</translation> <translation id="2969319727213777354">За установяване на сигурна връзка е необходимо часовникът ви да е верен. Това е така, защото сертификатите, с които уебсайтовете се идентифицират, са валидни само за конкретни периоди от време. Тъй като часовникът на устройството ви не е верен, Google Chrome не може да потвърди тези сертификати.</translation> -<translation id="2970515157925768593">Може отдалечено да променя настройките на устройството и профила ви.</translation> <translation id="2972581237482394796">&Възстановяване</translation> <translation id="2977665033722899841">Понастоящем сте избрали реда „<ph name="ROW_NAME" />“. <ph name="ROW_CONTENT" /></translation> <translation id="2982481275546140226">Изчистване на данните</translation> @@ -395,7 +394,6 @@ <translation id="3005723025932146533">Показване на запазено копие</translation> <translation id="3008447029300691911">Въведете кода за проверка за <ph name="CREDIT_CARD" />. След като потвърдите картата си, данните за нея ще бъдат споделени с този сайт.</translation> <translation id="3010559122411665027">Списъчен запис „<ph name="ENTRY_INDEX" />“: <ph name="ERROR" /></translation> -<translation id="3014389611820813634">Като мениджър на това устройство <ph name="ENROLLMENT_DOMAIN" />:</translation> <translation id="301521992641321250">Автоматично блокирано</translation> <translation id="3023071826883856138">You4 (плик)</translation> <translation id="3024663005179499861">Грешен тип на правилото</translation> @@ -441,7 +439,6 @@ <translation id="3287510313208355388">Изтегляне, когато съм онлайн</translation> <translation id="3293642807462928945">Научете повече за правилото <ph name="POLICY_NAME" /></translation> <translation id="3303855915957856445">Няма намерени резултати от търсенето</translation> -<translation id="3311730110465560799">Може отдалечено да променя настройките на устройството ви.</translation> <translation id="3320021301628644560">Добавяне на адреса за фактуриране</translation> <translation id="3324983252691184275">пурпурно</translation> <translation id="3338095232262050444">Има защита</translation> @@ -537,7 +534,6 @@ <translation id="3761718714832595332">Скриване на състоянието</translation> <translation id="3765032636089507299">Страницата на Безопасно сърфиране е в процес на разработка.</translation> <translation id="3778403066972421603">Искате ли тази карта да се запази на устройството и в профила ви в Google?</translation> -<translation id="3779973883630527594">Фирмата, учебното заведение или организацията, които управляват този профил:</translation> <translation id="3781428340399460090">ярко розово</translation> <translation id="3783418713923659662">Mastercard</translation> <translation id="3787705759683870569">Изтича на <ph name="EXPIRATION_MONTH" />/<ph name="EXPIRATION_YEAR" /></translation> @@ -561,6 +557,7 @@ <translation id="3949571496842715403">Сървърът не можа да докаже, че е <ph name="DOMAIN" />. В сертификата му за сигурност не са посочени алтернативни имена на обекта. Това може да се дължи на неправилно конфигуриране или на прихващане на връзката ви от извършител на атака.</translation> <translation id="3949601375789751990">Тук се показва историята ви на сърфиране</translation> <translation id="3950820424414687140">Вход</translation> +<translation id="3962859241508114581">Предишен запис</translation> <translation id="3963837677003247395">Искате ли да продължите ръчно?</translation> <translation id="3964661563329879394">{COUNT,plural, =0{Няма}=1{От 1 сайт }other{От # сайта }}</translation> <translation id="397105322502079400">Изчислява се...</translation> @@ -583,6 +580,7 @@ <translation id="410351446219883937">Автоматично възпроизвеждане</translation> <translation id="4103763322291513355">Посетете <strong>chrome://policy</strong>, за да видите изброени URL адресите в черния списък и другите правила, наложени от системния ви администратор.</translation> <translation id="4110652170750985508">Преглед на плащането ви</translation> +<translation id="4112140312785995938">Придвижване назад</translation> <translation id="4116663294526079822">Разрешаване винаги на този сайт</translation> <translation id="4117700440116928470">Обхватът на правилата не се поддържа.</translation> <translation id="4129401438321186435">{COUNT,plural, =1{още 1 елемент}other{още # елемента}}</translation> @@ -661,6 +659,7 @@ <translation id="443673843213245140">Използването на прокси сървър е деактивирано, но е посочена изрична негова конфигурация.</translation> <translation id="445100540951337728">Приемани дебитни карти</translation> <translation id="4466881336512663640">Промените във формуляра ще бъдат заличени. Наистина ли искате да продължите?</translation> +<translation id="4477350412780666475">Следващ запис</translation> <translation id="4482953324121162758">Този сайт няма да се превежда.</translation> <translation id="4490717597759821841">A7</translation> <translation id="4493480324863638523">Невалиден URL адрес. Трябва да е URL адрес със стандартна схема, напр. http://example.com или https://example.com.</translation> @@ -907,7 +906,6 @@ <translation id="5838278095973806738">Не ви препоръчваме да въвеждате поверителна информация в този сайт (например пароли или номера на кредитни карти), тъй като може да бъде открадната от извършители на атаки.</translation> <translation id="5860033963881614850">Изключено</translation> <translation id="5863847714970149516">На страницата, която искате да посетите, е възможно да ви бъдат удържани средства</translation> -<translation id="5865951947699094510">Може отдалечено да променя настройките на профила ви.</translation> <translation id="5866257070973731571">Добавяне на телефонен номер</translation> <translation id="5869405914158311789">Няма достъп до този сайт</translation> <translation id="5869522115854928033">Запазени пароли</translation> @@ -1060,6 +1058,7 @@ <translation id="6778737459546443941">Родителят ви все още не е одобрил заявката</translation> <translation id="67862343314499040">виолетово</translation> <translation id="6786747875388722282">Разширения</translation> +<translation id="6790428901817661496">Пускане</translation> <translation id="679355240208270552">Бе пренебрегнато, защото основното търсене не е активирано чрез правило.</translation> <translation id="681021252041861472">Задължително поле</translation> <translation id="6810899417690483278">Идент. № на персонализирането</translation> @@ -1104,6 +1103,7 @@ <translation id="7053983685419859001">Блокиране</translation> <translation id="7062635574500127092">синьо-зелено</translation> <translation id="7064851114919012435">Информация за връзка</translation> +<translation id="7075452647191940183">Заявката е прекалено голяма</translation> <translation id="7079718277001814089">Този сайт съдържа злонамерен софтуер</translation> <translation id="7087282848513945231">Област</translation> <translation id="7090678807593890770">Потърсете „<ph name="LINK" />“ с Google</translation> @@ -1163,6 +1163,7 @@ <translation id="7353601530677266744">Команден ред</translation> <translation id="7372973238305370288">резултат от търсенето</translation> <translation id="7377249249140280793"><ph name="RELATIVE_DATE" /> - <ph name="FULL_DATE" /></translation> +<translation id="7378594059915113390">Контроли за мултимедия</translation> <translation id="7378627244592794276">Не</translation> <translation id="7378810950367401542">/</translation> <translation id="7390545607259442187">Потвърждаване на картата</translation> @@ -1266,7 +1267,6 @@ <translation id="780301667611848630">Не, благодаря</translation> <translation id="7805768142964895445">Състояние</translation> <translation id="7806344367022510803">Променете настройките за търсещата машина в Chrome</translation> -<translation id="7810209002420871817">Като мениджър на профила ви <ph name="ACCOUNT_DOMAIN" />:</translation> <translation id="7812922009395017822">Mir</translation> <translation id="7813600968533626083">Предложението за формуляри да се премахне ли от Chrome?</translation> <translation id="7815407501681723534"><ph name="NUMBER_OF_RESULTS" /> <ph name="SEARCH_RESULTS" /> за „<ph name="SEARCH_STRING" />“</translation>
diff --git a/components/strings/components_strings_bn.xtb b/components/strings/components_strings_bn.xtb index 96ef3f2..21fe5810 100644 --- a/components/strings/components_strings_bn.xtb +++ b/components/strings/components_strings_bn.xtb
@@ -1,7 +1,6 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="bn"> -<translation id="1001338328714563407">আপনার ডিভাইস ও অ্যাকাউন্টের ম্যানেজার হিসেবে, <ph name="ENROLLMENT_DOMAIN" />:</translation> <translation id="1008557486741366299">এখনই নয়</translation> <translation id="1010200102790553230">পৃষ্ঠা পরে দেখার জন্য লোড করে রাখুন</translation> <translation id="1015730422737071372">অতিরিক্ত বিবরণ দিন</translation> @@ -41,6 +40,7 @@ <translation id="1161325031994447685">ওয়াই-ফাই এ আবার সংযুক্ত করে দেখুন</translation> <translation id="1165039591588034296">ত্রুটি</translation> <translation id="1175364870820465910">&প্রিন্ট...</translation> +<translation id="1178581264944972037">বিরতি</translation> <translation id="1181037720776840403">সরান</translation> <translation id="1197088940767939838">কমলা</translation> <translation id="1201402288615127009">পরবর্তী</translation> @@ -100,7 +100,6 @@ <translation id="1405567553485452995">হালকা সবুজ</translation> <translation id="1407135791313364759">সব খুলুন</translation> <translation id="1413809658975081374">গোপনীয়তা ত্রুটি</translation> -<translation id="14171126816530869"><ph name="LOCALITY" />-তে <ph name="ORGANIZATION" />-এর পরিচয় <ph name="ISSUER" /> যাচাই করেছে৷</translation> <translation id="1426410128494586442">হ্যাঁ</translation> <translation id="1430915738399379752">প্রিন্ট</translation> <translation id="1455413310270022028">ইরেজার</translation> @@ -257,6 +256,7 @@ <translation id="2262243747453050782">HTTP ত্রুটি</translation> <translation id="2263079731045660823">Chrome সেটিংসে ক্রেডিট কার্ডের অটোমেটিক পূরণের তথ্য আপডেট করুন</translation> <translation id="2270484714375784793">ফোন নম্বর</translation> +<translation id="2277103315734023688">এগিয়ে যান</translation> <translation id="2283340219607151381">অ্যাড্রেস পূরণ করে সেভ করুন</translation> <translation id="2292556288342944218">আপনার ইন্টারনেট অ্যাক্সেস অবরুদ্ধ করা হয়েছে</translation> <translation id="2297722699537546652">B5 (Envelope)</translation> @@ -384,7 +384,6 @@ <translation id="295526156371527179">সতর্কতা: এই নীতি ডিকশনারি নয় বলে এটিকে নীতি অনুযায়ী ডিকশনারি হিসেবে মার্জ করা হয়নি।</translation> <translation id="2955913368246107853">খোঁজ দণ্ড বন্ধ করুন</translation> <translation id="2969319727213777354">নিরাপদ নেটওয়ার্ক সংযোগ স্থাপন করতে আপনার ঘড়িকে সঠিকভাবে সেট করতে হবে। এমন হওয়ার কারণ হলো, নিরাপদ সংযোগ স্থাপন করার জন্য নিজেদের শনাক্ত করার জন্য ওয়েবসাইটগুলি যে শংসাপত্রগুলি ব্যবহার করে, সেগুলি শুধুমাত্র নির্দিষ্ট সময়ের জন্য বৈধ থাকে। যেহেতু আপনার ডিভাইসের ঘড়িটি ভুল, সেই জন্য Google Chrome সঠিকভাবে শংসাপত্রগুলি পরীক্ষা করতে পারছে না।</translation> -<translation id="2970515157925768593">অন্য জায়গা থেকে আপনার ডিভাইস ও অ্যাকাউন্টের সেট-আপ পরিবর্তন করতে পারে।</translation> <translation id="2972581237482394796">&পুনরায় করুন</translation> <translation id="2977665033722899841">এখন <ph name="ROW_NAME" /> বেছে নিয়েছেন। <ph name="ROW_CONTENT" /></translation> <translation id="2982481275546140226">ডেটা মুছুন</translation> @@ -396,7 +395,6 @@ <translation id="3005723025932146533">সেভ করা কপি দেখুন</translation> <translation id="3008447029300691911"><ph name="CREDIT_CARD" />-এর CVC লিখুন। আপনি নিশ্চিত করলে, আপনার কার্ডের বিবরণ এই সাইটের সাথে শেয়ার করা হবে।</translation> <translation id="3010559122411665027">তালিকার এন্ট্রি " <ph name="ENTRY_INDEX" /> ": <ph name="ERROR" /></translation> -<translation id="3014389611820813634">এই ডিভাইসের ম্যানেজার হিসেবে, <ph name="ENROLLMENT_DOMAIN" />:</translation> <translation id="301521992641321250">স্বয়ংক্রিয়ভাবে ব্লক করা হয়েছে</translation> <translation id="3023071826883856138">You4 (Envelope)</translation> <translation id="3024663005179499861">নীতির ভুল প্রকার</translation> @@ -442,7 +440,6 @@ <translation id="3287510313208355388">অনলাইন হয়ে ডাউনলোড করবেন</translation> <translation id="3293642807462928945"><ph name="POLICY_NAME" /> নীতি সম্পর্কে আরও জানুন</translation> <translation id="3303855915957856445">কোনো সার্চ ফলাফল পাওয়া যায়নি</translation> -<translation id="3311730110465560799">অন্য জায়গা থেকে আপনার ডিভাইসের সেট-আপ পরিবর্তন করতে পারে।</translation> <translation id="3320021301628644560">বিলিংয়ের ঠিকানা যোগ করুন</translation> <translation id="3324983252691184275">টকটকে লাল</translation> <translation id="3338095232262050444">সুরক্ষিত</translation> @@ -538,7 +535,6 @@ <translation id="3761718714832595332">স্ট্যাটাসটি লুকান</translation> <translation id="3765032636089507299">নিরাপদ ব্রাউজিং পৃষ্ঠা তৈরি করা হচ্ছে।</translation> <translation id="3778403066972421603">আপনি কি এই কার্ডটি আপনার Google অ্যাকাউন্টে ও এই ডিভাইসে সেভ করতে চান?</translation> -<translation id="3779973883630527594">যে কোম্পানি, স্কুল বা সংস্থা এই অ্যাকাউন্ট ম্যানেজ করে:</translation> <translation id="3781428340399460090">হট গোলাপী</translation> <translation id="3783418713923659662">Mastercard</translation> <translation id="3787705759683870569"><ph name="EXPIRATION_MONTH" />/<ph name="EXPIRATION_YEAR" /> এ মেয়াদ শেষ হবে</translation> @@ -562,6 +558,7 @@ <translation id="3949571496842715403">এই সার্ভারটিকে <ph name="DOMAIN" /> হিসাবে প্রমাণ করা যায়নি; এটির নিরাপত্তা সার্টিফিকেটে সাবজেক্ট অল্টারনেটিভ নেম্স নির্দিষ্ট করা নেই। কনফিগারেশনের কোনও সমস্যা অথবা আপনার সংযোগে কোনও আক্রমণকারী আড়ি পাতার কারণে এটি হয়ে থাকতে পারে।</translation> <translation id="3949601375789751990">আপনার ব্রাউজিং এর ইতিহাস এখানে দেখা যায়</translation> <translation id="3950820424414687140">সাইন-ইন করুন</translation> +<translation id="3962859241508114581">আগের ট্র্যাক চালান</translation> <translation id="3963837677003247395">ম্যানুয়ালি চালিয়ে যেতে চান?</translation> <translation id="3964661563329879394">{COUNT,plural, =0{কিছুই নয়}=1{১টি সাইট থেকে }one{#টি সাইট থেকে }other{#টি সাইট থেকে }}</translation> <translation id="397105322502079400">গণনা করা হচ্ছে...</translation> @@ -584,6 +581,7 @@ <translation id="410351446219883937">স্বতঃচালানো</translation> <translation id="4103763322291513355">কালো তালিকাভুক্ত ইউআরএলগুলির তালিকা এবং আপনার সিস্টেম অ্যাডমিনিস্ট্রেটরের প্রয়োগ করা অন্যান্য নীতিগুলি দেখার জন্য <strong>chrome://policy</strong>-এ যান৷</translation> <translation id="4110652170750985508">আপনার পেমেন্টের রিভিউ</translation> +<translation id="4112140312785995938">পিছিয়ে যান</translation> <translation id="4116663294526079822">এই সাইটে সর্বদা অনুমতি দিন</translation> <translation id="4117700440116928470">নীতির সুযোগটি সমর্থিত নয়৷</translation> <translation id="4129401438321186435">{COUNT,plural, =1{আরও ১টি}one{অন্যান্য #টি}other{অন্যান্য #টি}}</translation> @@ -662,6 +660,7 @@ <translation id="443673843213245140">প্রক্সির ব্যবহার অক্ষম করা হয়েছে কিন্তু কোনো স্পষ্ট প্রক্সি কনফিগারেশান নির্দিষ্ট করা হয়েছে৷</translation> <translation id="445100540951337728">ডেবিট কার্ড গ্রহণ করা হয়</translation> <translation id="4466881336512663640">ফর্মে করা পরিবর্তনগুলি সেভ হবে না। আপনি কি চালিয়ে যেতে চান?</translation> +<translation id="4477350412780666475">পরের ট্র্যাক চালান</translation> <translation id="4482953324121162758">এই সাইটটি অনুবাদ করা হবে না।</translation> <translation id="4490717597759821841">A7</translation> <translation id="4493480324863638523">ইউআরএলটি সঠিক নয়। অবশ্যই স্ট্যান্ডার্ড স্কিম সহ ইউআরএল হতে হবে, যেমন http://example.com বা https://example.com.</translation> @@ -908,7 +907,6 @@ <translation id="5838278095973806738">এই সাইটে আপনার কোনো সংবেদনশীল তথ্য দেওয়া উচিত হবে না (উদাহরণস্বরূপ, পাসওয়ার্ড বা ক্রেডিট কার্ড) কারণ আক্রমণকারীরা এগুলি চুরি করতে পারে।</translation> <translation id="5860033963881614850">বন্ধ করুন</translation> <translation id="5863847714970149516">পরের পৃষ্ঠাতে আপনাকে চার্জ করা হতে পারে</translation> -<translation id="5865951947699094510">অন্য জায়গা থেকে আপনার অ্যাকাউন্টের সেট-আপ পরিবর্তন করতে পারে।</translation> <translation id="5866257070973731571">ফোন নম্বর যোগ করুন</translation> <translation id="5869405914158311789">এই সাইটটিতে পৌছানো যাচ্ছে না</translation> <translation id="5869522115854928033">সংরক্ষিত পাসওয়ার্ড</translation> @@ -1060,6 +1058,7 @@ <translation id="6778737459546443941">আপনার পিতামাতা এখনও এটি অনুমোদন করেন নি</translation> <translation id="67862343314499040">বেগুনি</translation> <translation id="6786747875388722282">এক্সটেনশানসমূহ</translation> +<translation id="6790428901817661496">চালু করুন</translation> <translation id="679355240208270552">নীতি অনুযায়ী ডিফল্ট সার্চ সক্ষম করা হয়নি তাই উপেক্ষা করা হয়েছে৷</translation> <translation id="681021252041861472">এই ফিল্ডটি ফাঁকা রাখা যাবে না</translation> <translation id="6810899417690483278">কাস্টমাইজেশন আইডি</translation> @@ -1104,6 +1103,7 @@ <translation id="7053983685419859001">ব্লক করুন</translation> <translation id="7062635574500127092">নীলচে সবুজ</translation> <translation id="7064851114919012435">পরিচিতি তথ্য</translation> +<translation id="7075452647191940183">অনুরোধ অত্যন্ত বড়</translation> <translation id="7079718277001814089">এই সাইটটিতে ম্যালওয়্যার আছে</translation> <translation id="7087282848513945231">দেশ</translation> <translation id="7090678807593890770">Google এ <ph name="LINK" /> এর খুঁজুন</translation> @@ -1163,6 +1163,7 @@ <translation id="7353601530677266744">কম্যান্ড লাইন</translation> <translation id="7372973238305370288">ফলাফল খুঁজুন</translation> <translation id="7377249249140280793"><ph name="RELATIVE_DATE" /> - <ph name="FULL_DATE" /></translation> +<translation id="7378594059915113390">মিডিয়ার নিয়ন্ত্রণ</translation> <translation id="7378627244592794276">না</translation> <translation id="7378810950367401542">/</translation> <translation id="7390545607259442187">কার্ড নিশ্চিত করুন</translation> @@ -1266,7 +1267,6 @@ <translation id="780301667611848630">না থাক</translation> <translation id="7805768142964895445">স্থিতি</translation> <translation id="7806344367022510803">Chrome-এ সার্চ ইঞ্জিন সেটিংস পরিবর্তন করুন</translation> -<translation id="7810209002420871817">আপনার অ্যাকাউন্টের ম্যানেজার হিসেবে, <ph name="ACCOUNT_DOMAIN" />:</translation> <translation id="7812922009395017822">Mir</translation> <translation id="7813600968533626083">Chrome থেকে ফর্ম প্রস্তাবনা সরাবেন?</translation> <translation id="7815407501681723534">'<ph name="SEARCH_STRING" />' এর জন্য <ph name="NUMBER_OF_RESULTS" />টি <ph name="SEARCH_RESULTS" /> খুঁজে পাওয়া গেছে</translation>
diff --git a/components/strings/components_strings_ca.xtb b/components/strings/components_strings_ca.xtb index 633846f..2b0833c8 100644 --- a/components/strings/components_strings_ca.xtb +++ b/components/strings/components_strings_ca.xtb
@@ -1,7 +1,6 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="ca"> -<translation id="1001338328714563407">Com a gestor del dispositiu i del compte, <ph name="ENROLLMENT_DOMAIN" />:</translation> <translation id="1008557486741366299">Ara no</translation> <translation id="1010200102790553230">Carrega la pàgina més tard</translation> <translation id="1015730422737071372">Proporcioneu més informació</translation> @@ -41,6 +40,7 @@ <translation id="1161325031994447685">Torna't a connectar a la xarxa Wi-Fi.</translation> <translation id="1165039591588034296">Error</translation> <translation id="1175364870820465910">&Imprimeix...</translation> +<translation id="1178581264944972037">Posa en pausa</translation> <translation id="1181037720776840403">Suprimeix</translation> <translation id="1197088940767939838">Taronja</translation> <translation id="1201402288615127009">Següent</translation> @@ -98,7 +98,6 @@ <translation id="1405567553485452995">Verd clar</translation> <translation id="1407135791313364759">Obre-les totes</translation> <translation id="1413809658975081374">Error de privadesa</translation> -<translation id="14171126816530869">La identitat de <ph name="ORGANIZATION" /> a <ph name="LOCALITY" /> ha estat verificada per <ph name="ISSUER" />.</translation> <translation id="1426410128494586442">Sí</translation> <translation id="1430915738399379752">Imprimeix</translation> <translation id="1455413310270022028">Goma d'esborrar</translation> @@ -251,6 +250,7 @@ <translation id="2262243747453050782">Error d'HTTP</translation> <translation id="2263079731045660823">Actualitza la informació de targetes de crèdit d'Emplenament automàtic a la configuració de Chrome</translation> <translation id="2270484714375784793">Número de telèfon</translation> +<translation id="2277103315734023688">Avança</translation> <translation id="2283340219607151381">Desa i emplena les adreces</translation> <translation id="2292556288342944218">El vostre accés a Internet està bloquejat</translation> <translation id="2297722699537546652">B5 (sobre)</translation> @@ -375,7 +375,6 @@ <translation id="295526156371527179">Advertiment: aquesta política no s'ha combinat com a diccionari segons el que s'especifica a la política perquè no és un diccionari.</translation> <translation id="2955913368246107853">Tanca la barra de cerca</translation> <translation id="2969319727213777354">Per establir una connexió segura, heu de tenir el rellotge ben configurat, ja que els certificats que els llocs web fan servir per identificar-se només són vàlids durant períodes de temps concrets. Com que el rellotge del dispositiu no està ben configurat, Google Chrome no pot verificar aquests certificats.</translation> -<translation id="2970515157925768593">Pot canviar de manera remota la configuració del dispositiu i del compte.</translation> <translation id="2972581237482394796">&Refés</translation> <translation id="2977665033722899841">S'ha seleccionat <ph name="ROW_NAME" />. <ph name="ROW_CONTENT" /></translation> <translation id="2982481275546140226">Esborra les dades</translation> @@ -387,7 +386,6 @@ <translation id="3005723025932146533">Mostra la còpia desada</translation> <translation id="3008447029300691911">Introdueix el CVC de la targeta <ph name="CREDIT_CARD" />. Un cop confirmada, els detalls de la targeta es compartiran amb aquest lloc.</translation> <translation id="3010559122411665027">Entrada de llista "<ph name="ENTRY_INDEX" />": <ph name="ERROR" /></translation> -<translation id="3014389611820813634">Com a gestor d'aquest dispostiu, <ph name="ENROLLMENT_DOMAIN" />:</translation> <translation id="301521992641321250">Bloquejada automàticament</translation> <translation id="3023071826883856138">You4 (sobre)</translation> <translation id="3024663005179499861">Tipus de política incorrecte</translation> @@ -433,7 +431,6 @@ <translation id="3287510313208355388">Baixa quan estigui en línia</translation> <translation id="3293642807462928945">Més informació sobre la política <ph name="POLICY_NAME" /></translation> <translation id="3303855915957856445">No s'ha trobat cap resultat de la cerca</translation> -<translation id="3311730110465560799">Pot canviar la configuració del dispositiu de manera remota.</translation> <translation id="3320021301628644560">Afegeix una adreça de facturació</translation> <translation id="3324983252691184275">Carmesí</translation> <translation id="3338095232262050444">Segur</translation> @@ -529,7 +526,6 @@ <translation id="3761718714832595332">Amaga l'estat</translation> <translation id="3765032636089507299">La pàgina Navegació segura està en construcció.</translation> <translation id="3778403066972421603">Vols desar aquesta targeta al teu compte de Google i en aquest dispositiu?</translation> -<translation id="3779973883630527594">L'empresa, el centre educatiu o l'organització que gestiona aquest compte:</translation> <translation id="3781428340399460090">Rosa fúcsia</translation> <translation id="3783418713923659662">Mastercard</translation> <translation id="3787705759683870569">Data de caducitat: <ph name="EXPIRATION_MONTH" />/<ph name="EXPIRATION_YEAR" /></translation> @@ -553,6 +549,7 @@ <translation id="3949571496842715403">Aquest servidor no ha pogut demostrar que sigui <ph name="DOMAIN" />, perquè el seu certificat de seguretat no especifica noms alternatius per a l'assumpte. Això pot ser a causa d'una configuració incorrecta o d'un atacant que intercepta la connexió.</translation> <translation id="3949601375789751990">Aquí es mostra l'historial de navegació</translation> <translation id="3950820424414687140">Inicia la sessió</translation> +<translation id="3962859241508114581">Pista anterior</translation> <translation id="3963837677003247395">Vols continuar manualment?</translation> <translation id="3964661563329879394">{COUNT,plural, =0{Cap}=1{D'1 lloc }other{De # llocs }}</translation> <translation id="397105322502079400">S’està calculant...</translation> @@ -575,6 +572,7 @@ <translation id="410351446219883937">Reproducció automàtica</translation> <translation id="4103763322291513355">Visiteu <strong>chrome://policy</strong> per veure la llista d'URL inclosos a la llista negra i altres polítiques aplicades per l'administrador del sistema.</translation> <translation id="4110652170750985508">Revisa el pagament</translation> +<translation id="4112140312785995938">Retrocedeix</translation> <translation id="4116663294526079822">Permet sempre en aquest lloc web</translation> <translation id="4117700440116928470">L'àmbit de la política no s'admet.</translation> <translation id="4129401438321186435">{COUNT,plural, =1{1 element més}other{# elements més}}</translation> @@ -653,6 +651,7 @@ <translation id="443673843213245140">L'ús d'un servidor intermediari no està activat, però s'ha especificat una configuració explícita d'un servidor intermediari.</translation> <translation id="445100540951337728">Targetes de dèbit acceptades</translation> <translation id="4466881336512663640">Es perdran els canvis fets al formulari. Confirmes que vols continuar?</translation> +<translation id="4477350412780666475">Pista següent</translation> <translation id="4482953324121162758">Aquest lloc web no es traduirà.</translation> <translation id="4490717597759821841">A7</translation> <translation id="4493480324863638523">L'URL no és vàlid. Ha de tenir un esquema estàndard, com ara "http://example.com" o "https://example.com".</translation> @@ -899,7 +898,6 @@ <translation id="5838278095973806738">No introdueixis informació sensible en aquest lloc web (com ara contrasenyes o targetes de crèdit), ja que alguns atacants podrien robar-la.</translation> <translation id="5860033963881614850">Desactivat</translation> <translation id="5863847714970149516">És possible que aquesta pàgina provi de fer-te algun càrrec</translation> -<translation id="5865951947699094510">Pot canviar de manera remota la configuració del compte.</translation> <translation id="5866257070973731571">Afegeix un número de telèfon</translation> <translation id="5869405914158311789">No es pot accedir a aquest lloc web</translation> <translation id="5869522115854928033">Contrasenyes desades</translation> @@ -1052,6 +1050,7 @@ <translation id="6778737459546443941">El teu pare o la teva mare encara no ho han aprovat</translation> <translation id="67862343314499040">Violeta</translation> <translation id="6786747875388722282">Extensions</translation> +<translation id="6790428901817661496">Reprodueix</translation> <translation id="679355240208270552">S'ha ignorat perquè la política no ha activat la cerca predeterminada.</translation> <translation id="681021252041861472">Camp obligatori</translation> <translation id="6810899417690483278">Identificador de personalització</translation> @@ -1096,6 +1095,7 @@ <translation id="7053983685419859001">Bloqueja</translation> <translation id="7062635574500127092">Verd blavós</translation> <translation id="7064851114919012435">Informació de contacte</translation> +<translation id="7075452647191940183">La sol·licitud és massa llarga</translation> <translation id="7079718277001814089">Aquest lloc conté programari maliciós</translation> <translation id="7087282848513945231">Comtat</translation> <translation id="7090678807593890770">Cerqueu <ph name="LINK" /> a Google</translation> @@ -1152,6 +1152,7 @@ <translation id="7353601530677266744">Línia d'ordres</translation> <translation id="7372973238305370288">resultat de la cerca</translation> <translation id="7377249249140280793"><ph name="RELATIVE_DATE" /> - <ph name="FULL_DATE" /></translation> +<translation id="7378594059915113390">Controls multimèdia</translation> <translation id="7378627244592794276">No</translation> <translation id="7378810950367401542">/</translation> <translation id="7390545607259442187">Confirma la targeta</translation> @@ -1255,7 +1256,6 @@ <translation id="780301667611848630">No, gràcies</translation> <translation id="7805768142964895445">Estat</translation> <translation id="7806344367022510803">Canvia la configuració del motor de cerca a Chrome</translation> -<translation id="7810209002420871817">Com a gestor del compte, <ph name="ACCOUNT_DOMAIN" />:</translation> <translation id="7812922009395017822">Mir</translation> <translation id="7813600968533626083">Voleu suprimir el suggeriment de formulari de Chrome?</translation> <translation id="7815407501681723534">S'han trobat <ph name="NUMBER_OF_RESULTS" /> <ph name="SEARCH_RESULTS" /> per a "<ph name="SEARCH_STRING" />"</translation>
diff --git a/components/strings/components_strings_cs.xtb b/components/strings/components_strings_cs.xtb index a67cca1..3b40eb9 100644 --- a/components/strings/components_strings_cs.xtb +++ b/components/strings/components_strings_cs.xtb
@@ -1,7 +1,6 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="cs"> -<translation id="1001338328714563407">Organizace <ph name="ENROLLMENT_DOMAIN" /> jako správce vašeho zařízení a účtu:</translation> <translation id="1008557486741366299">Teď ne</translation> <translation id="1010200102790553230">Načíst stránku později</translation> <translation id="1015730422737071372">Zadejte další podrobnosti</translation> @@ -41,6 +40,7 @@ <translation id="1161325031994447685">Obnovit připojení k síti Wi-Fi</translation> <translation id="1165039591588034296">Chyba</translation> <translation id="1175364870820465910">Tisk...</translation> +<translation id="1178581264944972037">Pozastavit</translation> <translation id="1181037720776840403">Odebrat</translation> <translation id="1197088940767939838">Oranžová</translation> <translation id="1201402288615127009">Další</translation> @@ -98,7 +98,6 @@ <translation id="1405567553485452995">Světle zelená</translation> <translation id="1407135791313364759">Otevřít vše</translation> <translation id="1413809658975081374">Chyba ochrany soukromí</translation> -<translation id="14171126816530869">Identitu <ph name="ORGANIZATION" />v <ph name="LOCALITY" /> ověřil/a <ph name="ISSUER" />.</translation> <translation id="1426410128494586442">Ano</translation> <translation id="1430915738399379752">Tisk</translation> <translation id="1455413310270022028">Guma</translation> @@ -251,6 +250,7 @@ <translation id="2262243747453050782">Chyba protokolu HTTP</translation> <translation id="2263079731045660823">Údaje k automatickému vyplňování platebních karet můžete aktualizovat v nastavení Chromu</translation> <translation id="2270484714375784793">Telefonní číslo</translation> +<translation id="2277103315734023688">Přetočit dopředu</translation> <translation id="2283340219607151381">Ukládat a vyplňovat adresy</translation> <translation id="2292556288342944218">Vaše připojení k internetu je blokováno</translation> <translation id="2297722699537546652">B5 (obálka)</translation> @@ -375,7 +375,6 @@ <translation id="295526156371527179">Upozornění: Tato zásada nebyla podle zásady sloučena jako slovník, protože se nejedná o slovník.</translation> <translation id="2955913368246107853">Zavřít vyhledávací lištu</translation> <translation id="2969319727213777354">Aby bylo možné navázat zabezpečené spojení, musejí být správně nastaveny hodiny. Důvodem je, že certifikáty, pomocí kterých se weby identifikují, platí pouze pro konkrétní období. Jelikož hodiny v zařízení nejsou nastaveny správně, Google Chrome tyto certifikáty nemůže ověřit.</translation> -<translation id="2970515157925768593">Může vzdáleně měnit nastavení vašeho zařízení a účtu.</translation> <translation id="2972581237482394796">&Opakovat</translation> <translation id="2977665033722899841">Aktuálně je vybrán řádek <ph name="ROW_NAME" />. <ph name="ROW_CONTENT" /></translation> <translation id="2982481275546140226">Vymazat data</translation> @@ -387,7 +386,6 @@ <translation id="3005723025932146533">Zobrazit uloženou kopii</translation> <translation id="3008447029300691911">Zadejte kód CVC karty <ph name="CREDIT_CARD" />. Po ověření budou údaje o kartě sdíleny s tímto webem.</translation> <translation id="3010559122411665027">Položka seznamu „<ph name="ENTRY_INDEX" />“: <ph name="ERROR" /></translation> -<translation id="3014389611820813634">Organizace <ph name="ENROLLMENT_DOMAIN" /> jako správce tohoto zařízení:</translation> <translation id="301521992641321250">Automaticky blokováno</translation> <translation id="3023071826883856138">You4 (obálka)</translation> <translation id="3024663005179499861">Chybný typ zásady</translation> @@ -430,7 +428,6 @@ <translation id="3287510313208355388">Stáhnout, až bude zařízení online</translation> <translation id="3293642807462928945">Další informace o zásadě <ph name="POLICY_NAME" /></translation> <translation id="3303855915957856445">Nebyly nalezeny žádné výsledky</translation> -<translation id="3311730110465560799">Může vzdáleně změnit nastavení zařízení.</translation> <translation id="3320021301628644560">Přidání fakturační adresy</translation> <translation id="3324983252691184275">Karmínová</translation> <translation id="3338095232262050444">Zabezpečeno</translation> @@ -525,7 +522,6 @@ <translation id="3761718714832595332">Skrýt stav</translation> <translation id="3765032636089507299">Stránka Bezpečného procházení je ve výstavbě.</translation> <translation id="3778403066972421603">Chcete tuto kartu uložit do svého účtu Google a do tohoto zařízení?</translation> -<translation id="3779973883630527594">Společnost, škola nebo organizace, která spravuje tento účet:</translation> <translation id="3781428340399460090">Jasně růžová</translation> <translation id="3783418713923659662">Mastercard</translation> <translation id="3787705759683870569">Platnost do: <ph name="EXPIRATION_MONTH" />/<ph name="EXPIRATION_YEAR" /></translation> @@ -549,6 +545,7 @@ <translation id="3949571496842715403">Server nedokázal prokázat, že patří doméně <ph name="DOMAIN" />. V jeho bezpečnostním certifikátu nejsou uvedeny alternativní názvy subjektu. Může to být způsobeno nesprávnou konfigurací nebo tím, že vaše připojení zachytává útočník.</translation> <translation id="3949601375789751990">Zde se zobrazuje vaše historie prohlížení</translation> <translation id="3950820424414687140">Přihlaste se</translation> +<translation id="3962859241508114581">Předchozí skladba</translation> <translation id="3963837677003247395">Pokračovat ručně?</translation> <translation id="3964661563329879394">{COUNT,plural, =0{Žádné}=1{Z 1 webu }few{Z # webů }many{Z # webu }other{Z # webů }}</translation> <translation id="397105322502079400">Probíhá výpočet…</translation> @@ -571,6 +568,7 @@ <translation id="410351446219883937">Automatické přehrávání</translation> <translation id="4103763322291513355">Na stránce <strong>chrome://policy</strong> naleznete seznam zakázaných adres URL a další zásady vynucené vaším správcem systému.</translation> <translation id="4110652170750985508">Kontrola platby</translation> +<translation id="4112140312785995938">Přetočit dozadu</translation> <translation id="4116663294526079822">Povolit vždy na tomto webu</translation> <translation id="4117700440116928470">Rozsah zásady není podporován.</translation> <translation id="4129401438321186435">{COUNT,plural, =1{1 další}few{# další}many{# další}other{# dalších}}</translation> @@ -649,6 +647,7 @@ <translation id="443673843213245140">Využití proxy serveru je zakázáno, je však určena explicitní konfigurace proxy serveru.</translation> <translation id="445100540951337728">Přijímané debetní karty</translation> <translation id="4466881336512663640">Změny ve formuláři budou ztraceny. Opravdu chcete pokračovat?</translation> +<translation id="4477350412780666475">Další skladba</translation> <translation id="4482953324121162758">Tento web se nebude překládat.</translation> <translation id="4490717597759821841">A7</translation> <translation id="4493480324863638523">Neplatná adresa URL. Je třeba použít adresu URL se standardním schématem, např. http://example.com nebo https://example.com.</translation> @@ -895,7 +894,6 @@ <translation id="5838278095973806738">Na tento web byste neměli zadávat citlivé údaje (například hesla nebo čísla platebních karet), protože by je mohli odcizit útočníci.</translation> <translation id="5860033963881614850">Vypnuto</translation> <translation id="5863847714970149516">Následující stránka se vám může pokusit naúčtovat poplatky</translation> -<translation id="5865951947699094510">Může vzdáleně změnit nastavení vašeho účtu.</translation> <translation id="5866257070973731571">Přidání telefonního čísla</translation> <translation id="5869405914158311789">Tento web není dostupný</translation> <translation id="5869522115854928033">Uložená hesla</translation> @@ -1047,6 +1045,7 @@ <translation id="6778737459546443941">Rodič ti přístup na web dosud neschválil.</translation> <translation id="67862343314499040">Fialová</translation> <translation id="6786747875388722282">Rozšíření</translation> +<translation id="6790428901817661496">Přehrát</translation> <translation id="679355240208270552">Ignorováno, protože v zásadách výchozí vyhledávání není aktivováno.</translation> <translation id="681021252041861472">Povinné pole</translation> <translation id="6810899417690483278">ID přizpůsobení</translation> @@ -1091,6 +1090,7 @@ <translation id="7053983685419859001">Blokovat</translation> <translation id="7062635574500127092">Šedozelená</translation> <translation id="7064851114919012435">Kontaktní údaje</translation> +<translation id="7075452647191940183">Požadavek je příliš velký</translation> <translation id="7079718277001814089">Tento web obsahuje malware</translation> <translation id="7087282848513945231">Okres</translation> <translation id="7090678807593890770">Vyhledejte na Googlu <ph name="LINK" /></translation> @@ -1146,6 +1146,7 @@ <translation id="7353601530677266744">Příkazový řádek</translation> <translation id="7372973238305370288">výsledek vyhledávání</translation> <translation id="7377249249140280793"><ph name="RELATIVE_DATE" /> - <ph name="FULL_DATE" /></translation> +<translation id="7378594059915113390">Ovládání médií</translation> <translation id="7378627244592794276">Ne</translation> <translation id="7378810950367401542"> / </translation> <translation id="7390545607259442187">Ověření karty</translation> @@ -1249,7 +1250,6 @@ <translation id="780301667611848630">Ne, děkuji</translation> <translation id="7805768142964895445">Stav</translation> <translation id="7806344367022510803">Změnit nastavení vyhledávače v Chromu</translation> -<translation id="7810209002420871817">Doména <ph name="ACCOUNT_DOMAIN" /> jako správce vašeho účtu:</translation> <translation id="7812922009395017822">Mir</translation> <translation id="7813600968533626083">Odstranit návrh položky formuláře z Chromu?</translation> <translation id="7815407501681723534">Nalezené <ph name="SEARCH_RESULTS" /> pro dotaz „<ph name="SEARCH_STRING" />“: <ph name="NUMBER_OF_RESULTS" /></translation>
diff --git a/components/strings/components_strings_da.xtb b/components/strings/components_strings_da.xtb index 37dcc28..905cdfc 100644 --- a/components/strings/components_strings_da.xtb +++ b/components/strings/components_strings_da.xtb
@@ -1,7 +1,6 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="da"> -<translation id="1001338328714563407">Som administrator for din enhed og konto <ph name="ENROLLMENT_DOMAIN" />:</translation> <translation id="1008557486741366299">Ikke nu</translation> <translation id="1010200102790553230">Indlæs side senere</translation> <translation id="1015730422737071372">Angiv yderligere oplysninger</translation> @@ -41,6 +40,7 @@ <translation id="1161325031994447685">Genoprette forbindelse til Wi-Fi</translation> <translation id="1165039591588034296">Fejl</translation> <translation id="1175364870820465910">&Udskriv...</translation> +<translation id="1178581264944972037">Pause</translation> <translation id="1181037720776840403">Fjern</translation> <translation id="1197088940767939838">Orange</translation> <translation id="1201402288615127009">Næste</translation> @@ -100,7 +100,6 @@ <translation id="1405567553485452995">Lysegrøn</translation> <translation id="1407135791313364759">Åbn alle</translation> <translation id="1413809658975081374">Fejl i forbindelse med beskyttelse af personlige oplysninger</translation> -<translation id="14171126816530869">Identiteten for <ph name="ORGANIZATION" /> på <ph name="LOCALITY" /> er bekræftet af <ph name="ISSUER" />.</translation> <translation id="1426410128494586442">Ja</translation> <translation id="1430915738399379752">Udskriv</translation> <translation id="1455413310270022028">Viskelæder</translation> @@ -256,6 +255,7 @@ <translation id="2262243747453050782">HTTP-fejl</translation> <translation id="2263079731045660823">Opdater AutoFyld-oplysninger for betalingskort i indstillingerne for Chrome</translation> <translation id="2270484714375784793">Telefonnummer</translation> +<translation id="2277103315734023688">Spol frem</translation> <translation id="2283340219607151381">Gem og udfyld adresser</translation> <translation id="2292556288342944218">Din internetadgang er blokeret</translation> <translation id="2297722699537546652">B5 (Envelope)</translation> @@ -383,7 +383,6 @@ <translation id="295526156371527179">Advarsel! Denne politik blev ikke flettet som en ordbog som angivet af politikken, da den ikke er en ordbog.</translation> <translation id="2955913368246107853">Luk søgefeltet</translation> <translation id="2969319727213777354">Uret på din enhed skal være indstillet korrekt, før du kan oprette en sikker forbindelse. Dette er vigtigt, da de certifikater, websites bruger til at identificere sig selv, kun er gyldige i bestemte perioder. Da uret på din enhed er indstillet forkert, kan Chrome ikke bekræfte disse certifikater.</translation> -<translation id="2970515157925768593">Din enheds- og kontokonfiguration kan ændres eksternt.</translation> <translation id="2972581237482394796">&Annuller fortryd</translation> <translation id="2977665033722899841"><ph name="ROW_NAME" /> er i øjeblikket valgt. <ph name="ROW_CONTENT" /></translation> <translation id="2982481275546140226">Ryd data</translation> @@ -395,7 +394,6 @@ <translation id="3005723025932146533">Vis gemt kopi</translation> <translation id="3008447029300691911">Angiv kontrolkoden for <ph name="CREDIT_CARD" />. Når du bekræfter, deles dine kortoplysninger med dette website.</translation> <translation id="3010559122411665027">Angiv posten "<ph name="ENTRY_INDEX" />": <ph name="ERROR" /></translation> -<translation id="3014389611820813634">Som administrator for denne enhed <ph name="ENROLLMENT_DOMAIN" />:</translation> <translation id="301521992641321250">Automatisk blokering</translation> <translation id="3023071826883856138">You4 (Envelope)</translation> <translation id="3024663005179499861">Forkert politiktype</translation> @@ -441,7 +439,6 @@ <translation id="3287510313208355388">Download, når du er online</translation> <translation id="3293642807462928945">Få flere oplysninger om politikken <ph name="POLICY_NAME" /></translation> <translation id="3303855915957856445">Der blev ikke fundet nogen søgeresultater</translation> -<translation id="3311730110465560799">Din enhedskonfiguration kan ændres eksternt.</translation> <translation id="3320021301628644560">Tilføj faktureringsadresse</translation> <translation id="3324983252691184275">Højrød</translation> <translation id="3338095232262050444">Sikker</translation> @@ -537,7 +534,6 @@ <translation id="3761718714832595332">Skjul status</translation> <translation id="3765032636089507299">Siden Beskyttet browsing er under opførelse.</translation> <translation id="3778403066972421603">Vil du gemme dette kort på din Google-konto og på denne enhed?</translation> -<translation id="3779973883630527594">Det selskab, den skole eller den organisation, som administrerer denne konto:</translation> <translation id="3781428340399460090">Varm lyserød</translation> <translation id="3783418713923659662">Mastercard</translation> <translation id="3787705759683870569">Udløber <ph name="EXPIRATION_MONTH" />/<ph name="EXPIRATION_YEAR" /></translation> @@ -561,6 +557,7 @@ <translation id="3949571496842715403">Denne server kunne ikke bevise, at den er <ph name="DOMAIN" />, da sikkerhedscertifikatet ikke angiver alternative navne på emner. Dette kan skyldes en fejlkonfiguration, eller at en hacker har opfanget din forbindelse.</translation> <translation id="3949601375789751990">Din browserhistorik vises her</translation> <translation id="3950820424414687140">Log ind</translation> +<translation id="3962859241508114581">Forrige nummer</translation> <translation id="3963837677003247395">Vil du fortsætte manuelt?</translation> <translation id="3964661563329879394">{COUNT,plural, =0{Ingen}=1{1 website }one{# website }other{# websites }}</translation> <translation id="397105322502079400">Beregner...</translation> @@ -583,6 +580,7 @@ <translation id="410351446219883937">Autoplay</translation> <translation id="4103763322291513355">Gå til <strong>chrome://policy</strong> for at se listen over sortlistede webadresser og andre politikker, din systemadministrator har igangsat.</translation> <translation id="4110652170750985508">Gennemgå din betaling</translation> +<translation id="4112140312785995938">Spol tilbage</translation> <translation id="4116663294526079822">Tillad altid på dette website</translation> <translation id="4117700440116928470">Politikkens omfang understøttes ikke.</translation> <translation id="4129401438321186435">{COUNT,plural, =1{1 anden/andet}one{# anden/andet}other{# andre}}</translation> @@ -661,6 +659,7 @@ <translation id="443673843213245140">Brug af en proxy er deaktiveret, men en eksplicit proxykonfiguration er angivet.</translation> <translation id="445100540951337728">Accepterede debetkort</translation> <translation id="4466881336512663640">Du mister eventuelle formularændringer. Er du sikker på, at du vil fortsætte?</translation> +<translation id="4477350412780666475">Næste nummer</translation> <translation id="4482953324121162758">Dette website kan ikke oversættes.</translation> <translation id="4490717597759821841">A7</translation> <translation id="4493480324863638523">Webadressen er ugyldig. Webadressen skal indeholde et standardskema, f.eks. http://eksempel.dk eller https://eksempel.dk.</translation> @@ -907,7 +906,6 @@ <translation id="5838278095973806738">Du bør ikke indtaste følsomme oplysninger på dette website (f.eks. adgangskoder eller kreditkortoplysninger), da de kan blive stjålet af hackere.</translation> <translation id="5860033963881614850">Fra</translation> <translation id="5863847714970149516">Siden forude kan forsøge at opkræve dig penge</translation> -<translation id="5865951947699094510">Din kontokonfiguration kan ændres eksternt.</translation> <translation id="5866257070973731571">Tilføj telefonnummer</translation> <translation id="5869405914158311789">Der kan ikke oprettes forbindelse til dette website</translation> <translation id="5869522115854928033">Gemte adgangskoder</translation> @@ -1060,6 +1058,7 @@ <translation id="6778737459546443941">Din forælder har ikke godkendt det endnu</translation> <translation id="67862343314499040">Violet</translation> <translation id="6786747875388722282">Udvidelser</translation> +<translation id="6790428901817661496">Afspil</translation> <translation id="679355240208270552">Ignoreret, fordi en standardsøgemaskine ikke er aktiveret af politikken.</translation> <translation id="681021252041861472">Skal udfyldes</translation> <translation id="6810899417690483278">Tilpasnings-id</translation> @@ -1163,6 +1162,7 @@ <translation id="7353601530677266744">Kommandolinje</translation> <translation id="7372973238305370288">søgeresultat</translation> <translation id="7377249249140280793"><ph name="RELATIVE_DATE" /> - <ph name="FULL_DATE" /></translation> +<translation id="7378594059915113390">Mediestyring</translation> <translation id="7378627244592794276">Nej</translation> <translation id="7378810950367401542">/</translation> <translation id="7390545607259442187">Bekræft kort</translation> @@ -1266,7 +1266,6 @@ <translation id="780301667611848630">Nej tak</translation> <translation id="7805768142964895445">Status</translation> <translation id="7806344367022510803">Skift søgemaskineindstillinger i Chrome</translation> -<translation id="7810209002420871817">Som administrator for din konto <ph name="ACCOUNT_DOMAIN" />:</translation> <translation id="7812922009395017822">Mir</translation> <translation id="7813600968533626083">Vil du fjerne formularforslaget fra Chrome?</translation> <translation id="7815407501681723534">Der blev fundet <ph name="NUMBER_OF_RESULTS" /> <ph name="SEARCH_RESULTS" /> for "<ph name="SEARCH_STRING" />"</translation>
diff --git a/components/strings/components_strings_de.xtb b/components/strings/components_strings_de.xtb index 1d00ef2..3c1199f 100644 --- a/components/strings/components_strings_de.xtb +++ b/components/strings/components_strings_de.xtb
@@ -1,7 +1,6 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="de"> -<translation id="1001338328714563407">Als Manager Ihres Geräts und Kontos kann <ph name="ENROLLMENT_DOMAIN" /> Folgendes tun:</translation> <translation id="1008557486741366299">Jetzt nicht</translation> <translation id="1010200102790553230">Seite später laden</translation> <translation id="1015730422737071372">Weitere Details angeben</translation> @@ -41,6 +40,7 @@ <translation id="1161325031994447685">WLAN-Verbindung erneut herstellen</translation> <translation id="1165039591588034296">Fehler</translation> <translation id="1175364870820465910">&Drucken...</translation> +<translation id="1178581264944972037">Anhalten</translation> <translation id="1181037720776840403">Entfernen</translation> <translation id="1197088940767939838">Orange</translation> <translation id="1201402288615127009">Weiter</translation> @@ -98,7 +98,6 @@ <translation id="1405567553485452995">Hellgrün</translation> <translation id="1407135791313364759">Alle öffnen</translation> <translation id="1413809658975081374">Datenschutzfehler</translation> -<translation id="14171126816530869">Die Identität von <ph name="ORGANIZATION" /> bei <ph name="LOCALITY" /> wurde von <ph name="ISSUER" /> verifiziert.</translation> <translation id="1426410128494586442">Ja</translation> <translation id="1430915738399379752">Drucken</translation> <translation id="1455413310270022028">Radierer</translation> @@ -251,6 +250,7 @@ <translation id="2262243747453050782">HTTP-Fehler</translation> <translation id="2263079731045660823">AutoFill für Kreditkarten in den Chrome-Einstellungen aktualisieren</translation> <translation id="2270484714375784793">Telefonnummer</translation> +<translation id="2277103315734023688">Vorwärts springen</translation> <translation id="2283340219607151381">Adressen speichern und ausfüllen</translation> <translation id="2292556288342944218">Ihre Internetverbindung ist gesperrt</translation> <translation id="2297722699537546652">B5 (Umschlag)</translation> @@ -375,7 +375,6 @@ <translation id="295526156371527179">Warnung: Diese Richtlinie wurde nicht gemäß Richtlinie in einem Wörterbuch zusammengeführt, weil sie kein Wörterbuch ist.</translation> <translation id="2955913368246107853">Suchleiste schließen</translation> <translation id="2969319727213777354">Zum Herstellen einer sicheren Verbindung muss die Uhrzeit richtig eingestellt sein. Der Grund hierfür ist, dass Websites sich mithilfe von Zertifikaten identifizieren, die nur für einen bestimmten Zeitraum gelten. Da die Uhrzeit Ihres Geräts falsch ist, kann Google Chrome diese Zertifikate nicht bestätigen.</translation> -<translation id="2970515157925768593">Ihre Geräte- und Kontoeinrichtung remote ändern.</translation> <translation id="2972581237482394796">&Wiederholen</translation> <translation id="2977665033722899841"><ph name="ROW_NAME" />, aktuell ausgewählt. <ph name="ROW_CONTENT" /></translation> <translation id="2982481275546140226">Daten löschen</translation> @@ -387,7 +386,6 @@ <translation id="3005723025932146533">Gespeicherte Kopie anzeigen</translation> <translation id="3008447029300691911">Geben Sie den CVC für <ph name="CREDIT_CARD" /> ein. Nach erfolgter Bestätigung werden die Kartendetails an diese Website weitergegeben.</translation> <translation id="3010559122411665027">Listeneintrag "<ph name="ENTRY_INDEX" />": <ph name="ERROR" /></translation> -<translation id="3014389611820813634">Als Manager dieses Geräts kann <ph name="ENROLLMENT_DOMAIN" /> Folgendes tun:</translation> <translation id="301521992641321250">Automatisch blockiert</translation> <translation id="3023071826883856138">You4 (Umschlag)</translation> <translation id="3024663005179499861">Falscher Richtlinientyp</translation> @@ -433,7 +431,6 @@ <translation id="3287510313208355388">Herunterladen, sobald eine Internetverbindung besteht</translation> <translation id="3293642807462928945">Weitere Informationen zur "<ph name="POLICY_NAME" />"-Richtlinie</translation> <translation id="3303855915957856445">Keine Suchergebnisse gefunden</translation> -<translation id="3311730110465560799">Ihre Geräteeinrichtung remote ändern.</translation> <translation id="3320021301628644560">Rechnungsadresse hinzufügen</translation> <translation id="3324983252691184275">Purpur</translation> <translation id="3338095232262050444">Sicher</translation> @@ -527,7 +524,6 @@ <translation id="3761718714832595332">Status ausblenden</translation> <translation id="3765032636089507299">Die Seite "Safe Browsing" wird überarbeitet.</translation> <translation id="3778403066972421603">Möchten Sie diese Karte in Ihrem Google-Konto und auf diesem Gerät speichern?</translation> -<translation id="3779973883630527594">Das Unternehmen, die Bildungseinrichtung oder Organisation, von der dieses Konto verwaltet wird, kann Folgendes tun:</translation> <translation id="3781428340399460090">Dunkelrosa</translation> <translation id="3783418713923659662">Mastercard</translation> <translation id="3787705759683870569">Ablaufdatum: <ph name="EXPIRATION_MONTH" />/<ph name="EXPIRATION_YEAR" /></translation> @@ -551,6 +547,7 @@ <translation id="3949571496842715403">Dieser Server konnte nicht beweisen, dass er <ph name="DOMAIN" /> ist. Sein Sicherheitszertifikat gibt keine alternativen Namen an. Mögliche Gründe sind eine fehlerhafte Konfiguration oder ein Angreifer, der Ihre Verbindung abfängt.</translation> <translation id="3949601375789751990">Hier wird Ihr Browserverlauf angezeigt</translation> <translation id="3950820424414687140">Anmelden</translation> +<translation id="3962859241508114581">Vorheriger Titel</translation> <translation id="3963837677003247395">Manuell fortfahren?</translation> <translation id="3964661563329879394">{COUNT,plural, =0{Keine}=1{Von 1 Website }other{Von # Websites }}</translation> <translation id="397105322502079400">Wird berechnet...</translation> @@ -573,6 +570,7 @@ <translation id="410351446219883937">Autoplay</translation> <translation id="4103763322291513355">Unter <strong>chrome://policy</strong> finden Sie eine Liste der blockierten URLs und andere Richtlinien, die durch Ihren Systemadministrator erzwungen werden.</translation> <translation id="4110652170750985508">Zahlung überprüfen</translation> +<translation id="4112140312785995938">Zurück springen</translation> <translation id="4116663294526079822">Auf dieser Website immer zulassen</translation> <translation id="4117700440116928470">Richtlinienbereich wird nicht unterstützt.</translation> <translation id="4129401438321186435">{COUNT,plural, =1{1 weiterer}other{# weitere}}</translation> @@ -651,6 +649,7 @@ <translation id="443673843213245140">Die Proxy-Nutzung ist deaktiviert, es ist jedoch eine explizite Proxy-Konfiguration festgelegt.</translation> <translation id="445100540951337728">Akzeptierte Debitkarten</translation> <translation id="4466881336512663640">Änderungen im Formular gehen verloren. Möchten Sie den Vorgang wirklich fortsetzen?</translation> +<translation id="4477350412780666475">Nächster Titel</translation> <translation id="4482953324121162758">Diese Website wird nicht übersetzt.</translation> <translation id="4490717597759821841">A7</translation> <translation id="4493480324863638523">Ungültige URL. Dies muss eine URL mit einem Standardschema sein, z. B. "http://example.com" oder "https://example.com".</translation> @@ -897,7 +896,6 @@ <translation id="5838278095973806738">Sie sollten keine vertraulichen Informationen wie Passwörter oder Kreditkartennummern auf dieser Website eingeben, da sie von Angreifern gestohlen werden könnten.</translation> <translation id="5860033963881614850">Aus</translation> <translation id="5863847714970149516">Auf der nächsten Seite wird möglicherweise versucht, Ihnen etwas in Rechnung zu stellen</translation> -<translation id="5865951947699094510">Ihre Kontoeinrichtung remote ändern.</translation> <translation id="5866257070973731571">Telefonnummer hinzufügen</translation> <translation id="5869405914158311789">Die Website ist nicht erreichbar</translation> <translation id="5869522115854928033">Gespeicherte Passwörter</translation> @@ -1050,6 +1048,7 @@ <translation id="6778737459546443941">Dein Elternteil hat die Berechtigung noch nicht erteilt</translation> <translation id="67862343314499040">Violett</translation> <translation id="6786747875388722282">Erweiterungen</translation> +<translation id="6790428901817661496">Wiedergabe</translation> <translation id="679355240208270552">Ignoriert, da die Standardsuchmaschine durch die Richtlinie deaktiviert ist.</translation> <translation id="681021252041861472">Pflichtfeld</translation> <translation id="6810899417690483278">Personalisierungs-ID</translation> @@ -1137,7 +1136,7 @@ <translation id="7298195798382681320">Empfohlen</translation> <translation id="7300012071106347854">Kobaltblau</translation> <translation id="7302712225291570345">"<ph name="TEXT" />"</translation> -<translation id="7303701124147721189">Damit Zahlungen zukünftig schneller abgewickelt werden können, speichern Sie Ihre Kreditkartendaten und Ihre Rechnungsadresse in Ihrem Google-Konto.</translation> +<translation id="7303701124147721189">Damit Zahlungen zukünftig schneller abgewickelt werden können, speichern Sie Ihre Kreditkartendaten und Ihre Rechnungsadresse in Ihrem Google-Konto und auf diesem Gerät.</translation> <translation id="7309308571273880165">Absturzbericht erfasst: <ph name="CRASH_TIME" /> (Upload wurde vom Nutzer angefordert, aber noch nicht abgeschlossen)</translation> <translation id="7313965965371928911"><ph name="BEGIN_LINK" />Safe Browsing<ph name="END_LINK" />-Warnmeldungen</translation> <translation id="7319430975418800333">A3</translation> @@ -1150,6 +1149,7 @@ <translation id="7353601530677266744">Befehlszeile</translation> <translation id="7372973238305370288">Suchergebnis</translation> <translation id="7377249249140280793"><ph name="RELATIVE_DATE" /> - <ph name="FULL_DATE" /></translation> +<translation id="7378594059915113390">Mediensteuerelemente</translation> <translation id="7378627244592794276">Nein</translation> <translation id="7378810950367401542">/</translation> <translation id="7390545607259442187">Karte bestätigen</translation> @@ -1253,7 +1253,6 @@ <translation id="780301667611848630">Kein Interesse</translation> <translation id="7805768142964895445">Status</translation> <translation id="7806344367022510803">Suchmaschinen-Einstellungen in Chrome ändern</translation> -<translation id="7810209002420871817">Als Manager Ihres Kontos kann <ph name="ACCOUNT_DOMAIN" /> Folgendes tun:</translation> <translation id="7812922009395017822">Mir</translation> <translation id="7813600968533626083">Vorschlag für das Formular aus Chrome entfernen?</translation> <translation id="7815407501681723534"><ph name="NUMBER_OF_RESULTS" /> <ph name="SEARCH_RESULTS" /> für "<ph name="SEARCH_STRING" />" gefunden</translation>
diff --git a/components/strings/components_strings_el.xtb b/components/strings/components_strings_el.xtb index 12cb985..6c3d3f1 100644 --- a/components/strings/components_strings_el.xtb +++ b/components/strings/components_strings_el.xtb
@@ -1,7 +1,6 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="el"> -<translation id="1001338328714563407">Ως διαχειριστής της συσκευής και του λογαριασμού σας από τον τομέα <ph name="ENROLLMENT_DOMAIN" />:</translation> <translation id="1008557486741366299">Όχι τώρα</translation> <translation id="1010200102790553230">Φόρτωση σελίδας αργότερα</translation> <translation id="1015730422737071372">Καταχωρίστε επιπλέον λεπτομέρειες</translation> @@ -41,6 +40,7 @@ <translation id="1161325031994447685">Επανασυνδεθείτε στο Wi-Fi</translation> <translation id="1165039591588034296">Σφάλμα</translation> <translation id="1175364870820465910">&Εκτύπωση...</translation> +<translation id="1178581264944972037">Παύση</translation> <translation id="1181037720776840403">Κατάργηση</translation> <translation id="1197088940767939838">Πορτοκαλί</translation> <translation id="1201402288615127009">Επόμενο</translation> @@ -100,7 +100,6 @@ <translation id="1405567553485452995">Ανοιχτό πράσινο</translation> <translation id="1407135791313364759">Άνοιγμα όλων</translation> <translation id="1413809658975081374">Σφάλμα απορρήτου</translation> -<translation id="14171126816530869">Η ταυτότητα του <ph name="ORGANIZATION" /> στο <ph name="LOCALITY" /> επαληθεύτηκε από <ph name="ISSUER" />.</translation> <translation id="1426410128494586442">Ναι</translation> <translation id="1430915738399379752">Εκτύπωση</translation> <translation id="1455413310270022028">Γόμα</translation> @@ -256,6 +255,7 @@ <translation id="2262243747453050782">Σφάλμα HTTP</translation> <translation id="2263079731045660823">Ενημερώστε τις πληροφορίες αυτόματης συμπλήρωσης πιστωτικής κάρτας στις ρυθμίσεις του Chrome</translation> <translation id="2270484714375784793">Αριθμός τηλεφώνου</translation> +<translation id="2277103315734023688">Αναζήτηση προς τα εμπρός</translation> <translation id="2283340219607151381">Αποθήκευση και συμπλήρωση διευθύνσεων</translation> <translation id="2292556288342944218">Η πρόσβασή σας στο διαδίκτυο είναι αποκλεισμένη</translation> <translation id="2297722699537546652">B5 (Φάκελος)</translation> @@ -383,7 +383,6 @@ <translation id="295526156371527179">Προειδοποίηση: Αυτή η πολιτική δεν συγχωνεύτηκε ως λεξικό όπως ορίζεται από την πολιτική, επειδή δεν είναι λεξικό.</translation> <translation id="2955913368246107853">Κλείσιμο γραμμής εύρεσης</translation> <translation id="2969319727213777354">Για την επίτευξη μιας ασφαλούς σύνδεσης, θα πρέπει να γίνει σωστή ρύθμιση του ρολογιού σας. Αυτό οφείλεται στο γεγονός ότι τα πιστοποιητικά που χρησιμοποιούν οι ιστότοποι για την ταυτοποίησή τους είναι έγκυρα μόνο για συγκεκριμένες χρονικές περιόδους. Εφόσον το ρολόι της συσκευής σας δεν είναι σωστά ρυθμισμένο, το Google Chrome δεν μπορεί να επαληθεύσει αυτά τα πιστοποιητικά.</translation> -<translation id="2970515157925768593">Μπορεί να αλλάξει από απόσταση τη ρύθμιση της συσκευής και του λογαριασμού σας.</translation> <translation id="2972581237482394796">&Επανάληψη ενέργειας</translation> <translation id="2977665033722899841">Έχει επιλεγεί ο λογαριασμός <ph name="ROW_NAME" />. <ph name="ROW_CONTENT" /></translation> <translation id="2982481275546140226">Διαγραφή δεδομένων</translation> @@ -395,7 +394,6 @@ <translation id="3005723025932146533">Εμφάνιση αποθηκευμένου αντιγράφου</translation> <translation id="3008447029300691911">Εισαγάγετε τον κωδικό CVC για την πιστωτική κάρτα <ph name="CREDIT_CARD" />. Μετά την επιβεβαίωση, θα κοινοποιηθούν τα στοιχεία της κάρτας σας με αυτόν τον ιστότοπο.</translation> <translation id="3010559122411665027">Καταχώριση λίστας "<ph name="ENTRY_INDEX" />": <ph name="ERROR" /></translation> -<translation id="3014389611820813634">Ως διαχειριστής αυτής της συσκευής από τον τομέα <ph name="ENROLLMENT_DOMAIN" />:</translation> <translation id="301521992641321250">Αποκλείστηκε αυτόματα</translation> <translation id="3023071826883856138">You4 (Φάκελος)</translation> <translation id="3024663005179499861">Λανθασμένος τύπος πολιτικής</translation> @@ -441,7 +439,6 @@ <translation id="3287510313208355388">Να γίνει λήψη όταν πραγματοποιηθεί σύνδεση</translation> <translation id="3293642807462928945">Μάθετε περισσότερα σχετικά με την πολιτική <ph name="POLICY_NAME" /></translation> <translation id="3303855915957856445">Δεν βρέθηκαν αποτελέσματα αναζήτησης</translation> -<translation id="3311730110465560799">Μπορεί να αλλάξει από απόσταση τη ρύθμιση της συσκευής σας.</translation> <translation id="3320021301628644560">Προσθήκη διεύθυνσης χρέωσης</translation> <translation id="3324983252691184275">Βαθύ κόκκινο</translation> <translation id="3338095232262050444">Ασφαλές</translation> @@ -537,7 +534,6 @@ <translation id="3761718714832595332">Απόκρυψη κατάστασης</translation> <translation id="3765032636089507299">Η σελίδα Ασφαλούς περιήγησης είναι υπό κατασκευή.</translation> <translation id="3778403066972421603">Θέλετε να αποθηκεύσετε αυτήν την κάρτα στον Λογαριασμό σας Google και σε αυτήν τη συσκευή;</translation> -<translation id="3779973883630527594">Η εταιρεία, το εκπαιδευτικό ίδρυμα ή ο οργανισμός που διαχειρίζεται αυτόν τον λογαριασμό:</translation> <translation id="3781428340399460090">Έντονο ροζ</translation> <translation id="3783418713923659662">Mastercard</translation> <translation id="3787705759683870569">Λήγει <ph name="EXPIRATION_MONTH" />/<ph name="EXPIRATION_YEAR" /></translation> @@ -561,6 +557,7 @@ <translation id="3949571496842715403">Αυτός ο διακομιστής δεν μπορεί να αποδείξει ότι είναι ο τομέας <ph name="DOMAIN" />. Το πιστοποιητικό ασφαλείας δεν προσδιορίζει Εναλλακτικά ονόματα θέματος. Αυτό μπορεί να οφείλεται σε εσφαλμένη διαμόρφωση ή σε κάποιον τρίτο που επιτίθεται στη σύνδεσή σας.</translation> <translation id="3949601375789751990">Το ιστορικό περιήγησής σας εμφανίζεται εδώ</translation> <translation id="3950820424414687140">Σύνδεση</translation> +<translation id="3962859241508114581">Προηγούμενο κομμάτι</translation> <translation id="3963837677003247395">Συνέχεια με μη αυτόματο τρόπο;</translation> <translation id="3964661563329879394">{COUNT,plural, =0{Κανένα}=1{Από 1 ιστότοπο }other{Από # ιστοτόπους }}</translation> <translation id="397105322502079400">Υπολογισμός…</translation> @@ -583,6 +580,7 @@ <translation id="410351446219883937">Αυτ. αναπαραγωγή</translation> <translation id="4103763322291513355">Επισκεφτείτε την <strong>chrome://policy</strong> για να δείτε τη λίστα των ανεπιθύμητων διευθύνσεων URL και άλλες πολιτικές που έχουν τεθεί σε εφαρμογή από το διαχειριστή του συστήματός σας.</translation> <translation id="4110652170750985508">Έλεγχος πληρωμής</translation> +<translation id="4112140312785995938">Αναζήτηση προς τα πίσω</translation> <translation id="4116663294526079822">Να επιτρέπεται πάντα σε αυτόν τον ιστότοπο</translation> <translation id="4117700440116928470">Το εύρος της πολιτικής δεν υποστηρίζεται.</translation> <translation id="4129401438321186435">{COUNT,plural, =1{1 ακόμα}other{# ακόμα}}</translation> @@ -662,6 +660,7 @@ <translation id="443673843213245140">Η χρήση ενός διακομιστή μεσολάβησης είναι απενεργοποιημένη, αλλά έχει καθοριστεί μια ρητή διαμόρφωση διακομιστή μεσολάβησης.</translation> <translation id="445100540951337728">Αποδεκτές χρεωστικές κάρτες</translation> <translation id="4466881336512663640">Οι αλλαγές που πραγματοποιήθηκαν στη φόρμα θα χαθούν. Είστε βέβαιοι ότι θέλετε να συνεχίσετε;</translation> +<translation id="4477350412780666475">Επόμενο κομμάτι</translation> <translation id="4482953324121162758">Αυτός ο ιστότοπος δεν θα μεταφραστεί.</translation> <translation id="4490717597759821841">A7</translation> <translation id="4493480324863638523">Μη έγκυρο URL. Πρέπει να είναι ένα URL με βασική μορφή, π.χ. http://example.com ή https://example.com.</translation> @@ -908,7 +907,6 @@ <translation id="5838278095973806738">Δεν θα πρέπει να εισαγάγετε ευαίσθητες πληροφορίες σε αυτόν τον ιστότοπο (για παράδειγμα, κωδικούς πρόσβασης ή πιστωτικές κάρτες), επειδή ενδέχεται να υποκλαπούν από εισβολείς.</translation> <translation id="5860033963881614850">Απενεργοποιημένη</translation> <translation id="5863847714970149516">Η σελίδα που ακολουθεί μπορεί να προσπαθήσει να σας χρεώσει</translation> -<translation id="5865951947699094510">Μπορεί να αλλάξει από απόσταση τη ρύθμιση του λογαριασμού σας.</translation> <translation id="5866257070973731571">Προσθήκη αριθμού τηλεφώνου</translation> <translation id="5869405914158311789">Δεν είναι δυνατή η πρόσβαση σε αυτόν τον ιστότοπο</translation> <translation id="5869522115854928033">Αποθηκευμένοι κωδικοί πρόσβασης</translation> @@ -1061,6 +1059,7 @@ <translation id="6778737459546443941">Ο γονέας σου δεν τον έχει εγκρίνει ακόμα</translation> <translation id="67862343314499040">Βιολετί</translation> <translation id="6786747875388722282">Επεκτάσεις</translation> +<translation id="6790428901817661496">Αναπαραγωγή</translation> <translation id="679355240208270552">Έγινε παράβλεψη επειδή η προεπιλεγμένη αναζήτηση δεν έχει ενεργοποιηθεί από την πολιτική.</translation> <translation id="681021252041861472">Υποχρεωτικό πεδίο</translation> <translation id="6810899417690483278">Αναγνωριστικό προσαρμογής</translation> @@ -1105,6 +1104,7 @@ <translation id="7053983685419859001">Αποκλεισμός</translation> <translation id="7062635574500127092">Γαλαζοπράσινο</translation> <translation id="7064851114919012435">Στοιχεία επικοινωνίας</translation> +<translation id="7075452647191940183">Το αίτημα είναι πολύ μεγάλο</translation> <translation id="7079718277001814089">Ο ιστότοπος περιέχει κακόβουλο πρόγραμμα</translation> <translation id="7087282848513945231">Κομητεία</translation> <translation id="7090678807593890770">Αναζητήστε στο Google για <ph name="LINK" /></translation> @@ -1164,6 +1164,7 @@ <translation id="7353601530677266744">Γραμμή εντολών</translation> <translation id="7372973238305370288">αποτέλεσμα αναζήτησης</translation> <translation id="7377249249140280793"><ph name="RELATIVE_DATE" /> - <ph name="FULL_DATE" /></translation> +<translation id="7378594059915113390">Στοιχεία ελέγχου μέσων</translation> <translation id="7378627244592794276">Όχι</translation> <translation id="7378810950367401542">/</translation> <translation id="7390545607259442187">Επιβεβαίωση κάρτας</translation> @@ -1267,7 +1268,6 @@ <translation id="780301667611848630">Όχι, ευχαριστώ</translation> <translation id="7805768142964895445">Κατάσταση</translation> <translation id="7806344367022510803">Αλλάξτε τις ρυθμίσεις της μηχανής αναζήτησης στο Chrome</translation> -<translation id="7810209002420871817">Ως διαχειριστής του λογαριασμού σας από τον τομέα, <ph name="ACCOUNT_DOMAIN" />:</translation> <translation id="7812922009395017822">Mir</translation> <translation id="7813600968533626083">Κατάργηση πρότασης φόρμας από το Chrome;</translation> <translation id="7815407501681723534">Βρέθηκαν <ph name="NUMBER_OF_RESULTS" /> <ph name="SEARCH_RESULTS" /> για τον όρο αναζήτησης "<ph name="SEARCH_STRING" />"</translation>
diff --git a/components/strings/components_strings_en-GB.xtb b/components/strings/components_strings_en-GB.xtb index a9249de..6cfa8b9b 100644 --- a/components/strings/components_strings_en-GB.xtb +++ b/components/strings/components_strings_en-GB.xtb
@@ -1,7 +1,6 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="en-GB"> -<translation id="1001338328714563407">As the manager of your device and account, <ph name="ENROLLMENT_DOMAIN" />:</translation> <translation id="1008557486741366299">Not Now</translation> <translation id="1010200102790553230">Load page later</translation> <translation id="1015730422737071372">Provide additional details.</translation> @@ -41,6 +40,7 @@ <translation id="1161325031994447685">Reconnecting to Wi-Fi</translation> <translation id="1165039591588034296">Error</translation> <translation id="1175364870820465910">&Print...</translation> +<translation id="1178581264944972037">Pause</translation> <translation id="1181037720776840403">Remove</translation> <translation id="1197088940767939838">Orange</translation> <translation id="1201402288615127009">Next</translation> @@ -98,7 +98,6 @@ <translation id="1405567553485452995">Light green</translation> <translation id="1407135791313364759">Open all</translation> <translation id="1413809658975081374">Privacy error</translation> -<translation id="14171126816530869">The identity of <ph name="ORGANIZATION" /> at <ph name="LOCALITY" /> has been verified by <ph name="ISSUER" />.</translation> <translation id="1426410128494586442">Yes</translation> <translation id="1430915738399379752">Print</translation> <translation id="1455413310270022028">Eraser</translation> @@ -251,6 +250,7 @@ <translation id="2262243747453050782">HTTP error</translation> <translation id="2263079731045660823">Update credit card auto-fill info in Chrome settings</translation> <translation id="2270484714375784793">Phone number</translation> +<translation id="2277103315734023688">Seek forwards</translation> <translation id="2283340219607151381">Save and fill addresses</translation> <translation id="2292556288342944218">Your Internet access is blocked</translation> <translation id="2297722699537546652">B5 (Envelope)</translation> @@ -375,7 +375,6 @@ <translation id="295526156371527179">Warning: This policy was not merged as a dictionary as specified by policy because it is not a dictionary.</translation> <translation id="2955913368246107853">Close find bar</translation> <translation id="2969319727213777354">To establish a secure connection, your clock needs to be set correctly. This is because the certificates that websites use to identify themselves are only valid for specific periods of time. Since your device's clock is incorrect, Google Chrome cannot verify these certificates.</translation> -<translation id="2970515157925768593">Can remotely change your device and account setup.</translation> <translation id="2972581237482394796">&Redo</translation> <translation id="2977665033722899841"><ph name="ROW_NAME" />, currently selected. <ph name="ROW_CONTENT" /></translation> <translation id="2982481275546140226">Clear Data</translation> @@ -387,7 +386,6 @@ <translation id="3005723025932146533">Show saved copy</translation> <translation id="3008447029300691911">Enter the CVC for <ph name="CREDIT_CARD" />. Once you confirm, your card details will be shared with this site.</translation> <translation id="3010559122411665027">List entry "<ph name="ENTRY_INDEX" />": <ph name="ERROR" /></translation> -<translation id="3014389611820813634">As the manager of this device, <ph name="ENROLLMENT_DOMAIN" />:</translation> <translation id="301521992641321250">Automatically blocked</translation> <translation id="3023071826883856138">You4 (Envelope)</translation> <translation id="3024663005179499861">Wrong policy type</translation> @@ -433,7 +431,6 @@ <translation id="3287510313208355388">Download when online</translation> <translation id="3293642807462928945">Learn more about <ph name="POLICY_NAME" /> policy</translation> <translation id="3303855915957856445">No search results found</translation> -<translation id="3311730110465560799">Can remotely change your device setup.</translation> <translation id="3320021301628644560">Add billing address</translation> <translation id="3324983252691184275">Crimson</translation> <translation id="3338095232262050444">Secure</translation> @@ -529,7 +526,6 @@ <translation id="3761718714832595332">Hide status</translation> <translation id="3765032636089507299">The Safe Browsing page is under construction.</translation> <translation id="3778403066972421603">Do you want to save this card to your Google Account and on this device?</translation> -<translation id="3779973883630527594">The company, school or organisation that manages this account:</translation> <translation id="3781428340399460090">Hot pink</translation> <translation id="3783418713923659662">Mastercard</translation> <translation id="3787705759683870569">Expires <ph name="EXPIRATION_MONTH" />/<ph name="EXPIRATION_YEAR" /></translation> @@ -553,6 +549,7 @@ <translation id="3949571496842715403">This server could not prove that it is <ph name="DOMAIN" />; its security certificate does not specify Subject Alternative Names. This may be caused by a misconfiguration or an attacker intercepting your connection.</translation> <translation id="3949601375789751990">Your browsing history appears here</translation> <translation id="3950820424414687140">Sign in</translation> +<translation id="3962859241508114581">Previous track</translation> <translation id="3963837677003247395">Continue manually?</translation> <translation id="3964661563329879394">{COUNT,plural, =0{None}=1{From 1 site }other{From # sites }}</translation> <translation id="397105322502079400">Calculating...</translation> @@ -575,6 +572,7 @@ <translation id="410351446219883937">Auto-play</translation> <translation id="4103763322291513355">Visit <strong>chrome://policy</strong> to see the list of blacklisted URLs and other policies enforced by your system administrator.</translation> <translation id="4110652170750985508">Review your payment</translation> +<translation id="4112140312785995938">Seek backwards</translation> <translation id="4116663294526079822">Always allow on this site</translation> <translation id="4117700440116928470">Policy scope is not supported.</translation> <translation id="4129401438321186435">{COUNT,plural, =1{1 other}other{# others}}</translation> @@ -653,6 +651,7 @@ <translation id="443673843213245140">Use of a proxy is disabled but an explicit proxy configuration is specified.</translation> <translation id="445100540951337728">Accepted debit cards</translation> <translation id="4466881336512663640">Form changes will be lost. Are you sure that you want to continue?</translation> +<translation id="4477350412780666475">Next track</translation> <translation id="4482953324121162758">This site will not be translated.</translation> <translation id="4490717597759821841">A7</translation> <translation id="4493480324863638523">Invalid URL. Must be a URL with a standard scheme, e.g. http://example.com or https://example.com.</translation> @@ -899,7 +898,6 @@ <translation id="5838278095973806738">You should not enter any sensitive information on this site (for example, passwords or credit cards) because it could be stolen by attackers.</translation> <translation id="5860033963881614850">Off</translation> <translation id="5863847714970149516">The page ahead may try to charge you money</translation> -<translation id="5865951947699094510">Can remotely change your account setup.</translation> <translation id="5866257070973731571">Add Phone Number</translation> <translation id="5869405914158311789">This site can’t be reached</translation> <translation id="5869522115854928033">Saved passwords</translation> @@ -1052,6 +1050,7 @@ <translation id="6778737459546443941">Your parent hasn't approved it yet</translation> <translation id="67862343314499040">Violet</translation> <translation id="6786747875388722282">Extensions</translation> +<translation id="6790428901817661496">Play</translation> <translation id="679355240208270552">Ignored because default search is not enabled by policy.</translation> <translation id="681021252041861472">Required Field</translation> <translation id="6810899417690483278">Customisation ID</translation> @@ -1096,6 +1095,7 @@ <translation id="7053983685419859001">Block</translation> <translation id="7062635574500127092">Teal</translation> <translation id="7064851114919012435">Contact info</translation> +<translation id="7075452647191940183">Request is too large</translation> <translation id="7079718277001814089">This site contains malware</translation> <translation id="7087282848513945231">County</translation> <translation id="7090678807593890770">Search Google for <ph name="LINK" /></translation> @@ -1152,6 +1152,7 @@ <translation id="7353601530677266744">Command Line</translation> <translation id="7372973238305370288">search result</translation> <translation id="7377249249140280793"><ph name="RELATIVE_DATE" /> - <ph name="FULL_DATE" /></translation> +<translation id="7378594059915113390">Media controls</translation> <translation id="7378627244592794276">Nope</translation> <translation id="7378810950367401542">/</translation> <translation id="7390545607259442187">Confirm Card</translation> @@ -1255,7 +1256,6 @@ <translation id="780301667611848630">No, thanks</translation> <translation id="7805768142964895445">Status</translation> <translation id="7806344367022510803">Change search engine settings in Chrome</translation> -<translation id="7810209002420871817">As the manager of your account, <ph name="ACCOUNT_DOMAIN" />:</translation> <translation id="7812922009395017822">Mir</translation> <translation id="7813600968533626083">Remove form suggestion from Chrome?</translation> <translation id="7815407501681723534">Found <ph name="NUMBER_OF_RESULTS" /> <ph name="SEARCH_RESULTS" /> for '<ph name="SEARCH_STRING" />'</translation>
diff --git a/components/strings/components_strings_es-419.xtb b/components/strings/components_strings_es-419.xtb index 2bf49b7..b869009 100644 --- a/components/strings/components_strings_es-419.xtb +++ b/components/strings/components_strings_es-419.xtb
@@ -1,7 +1,6 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="es-419"> -<translation id="1001338328714563407">Como administrador de tu cuenta y dispositivo, <ph name="ENROLLMENT_DOMAIN" />:</translation> <translation id="1008557486741366299">Ahora no</translation> <translation id="1010200102790553230">Cargar la página más tarde</translation> <translation id="1015730422737071372">Proporciona más detalles</translation> @@ -41,6 +40,7 @@ <translation id="1161325031994447685">Volver a conectarte a Wi-Fi</translation> <translation id="1165039591588034296">Error</translation> <translation id="1175364870820465910">Im&primir...</translation> +<translation id="1178581264944972037">Detener</translation> <translation id="1181037720776840403">Quitar</translation> <translation id="1197088940767939838">Naranja</translation> <translation id="1201402288615127009">Siguiente</translation> @@ -100,7 +100,6 @@ <translation id="1405567553485452995">Verde claro</translation> <translation id="1407135791313364759">Abrir todas</translation> <translation id="1413809658975081374">Error de privacidad</translation> -<translation id="14171126816530869">La identidad de <ph name="ORGANIZATION" /> en <ph name="LOCALITY" /> ha sido verificada por <ph name="ISSUER" />.</translation> <translation id="1426410128494586442">Sí</translation> <translation id="1430915738399379752">Imprimir</translation> <translation id="1455413310270022028">Borrador</translation> @@ -256,6 +255,7 @@ <translation id="2262243747453050782">Error de HTTP</translation> <translation id="2263079731045660823">Actualiza la información de "Autocompletar" para la tarjeta de crédito en la configuración de Chrome</translation> <translation id="2270484714375784793">Número de teléfono</translation> +<translation id="2277103315734023688">Buscar más adelante</translation> <translation id="2283340219607151381">Guardar y completar direcciones</translation> <translation id="2292556288342944218">Se bloqueó tu acceso a Internet</translation> <translation id="2297722699537546652">B5 (Envelope)</translation> @@ -383,7 +383,6 @@ <translation id="295526156371527179">Advertencia: Esta política no se combinó como diccionario según la política porque no es un diccionario.</translation> <translation id="2955913368246107853">Cerrar la barra de búsqueda</translation> <translation id="2969319727213777354">Para establecer una conexión segura, el reloj se debe configurar correctamente. Esto se debe a que los certificados que usan los sitios web para su identificación solo son válidos por períodos de tiempo específicos. Debido a que la configuración del reloj del dispositivo es incorrecta, Google Chrome no puede verificar estos certificados.</translation> -<translation id="2970515157925768593">Puedes cambiar la configuración de tu cuenta y dispositivo de forma remota.</translation> <translation id="2972581237482394796">&Rehacer</translation> <translation id="2977665033722899841">Fila <ph name="ROW_NAME" /> seleccionada. <ph name="ROW_CONTENT" /></translation> <translation id="2982481275546140226">Borrar datos</translation> @@ -395,7 +394,6 @@ <translation id="3005723025932146533">Mostrar copia guardada</translation> <translation id="3008447029300691911">Ingresa el CVC de la tarjeta <ph name="CREDIT_CARD" />. Después de confirmarla, los datos de tu tarjeta se compartirán con este sitio.</translation> <translation id="3010559122411665027">Entrada de lista "<ph name="ENTRY_INDEX" />": <ph name="ERROR" /></translation> -<translation id="3014389611820813634">Como administrador de este dispositivo, <ph name="ENROLLMENT_DOMAIN" />:</translation> <translation id="301521992641321250">Bloqueado de forma automática</translation> <translation id="3023071826883856138">You4 (Envelope)</translation> <translation id="3024663005179499861">Tipo de política incorrecto</translation> @@ -442,7 +440,6 @@ <translation id="3287510313208355388">Descargar cuando haya conexión</translation> <translation id="3293642807462928945">Más información sobre la política <ph name="POLICY_NAME" /></translation> <translation id="3303855915957856445">No se encontraron resultados en la búsqueda</translation> -<translation id="3311730110465560799">Puedes cambiar la configuración de tu dispositivo de forma remota.</translation> <translation id="3320021301628644560">Agregar dirección de facturación</translation> <translation id="3324983252691184275">Carmesí</translation> <translation id="3338095232262050444">Seguro</translation> @@ -538,7 +535,6 @@ <translation id="3761718714832595332">Ocultar estado</translation> <translation id="3765032636089507299">La página de Navegación segura está en construcción.</translation> <translation id="3778403066972421603">¿Deseas guardar esta tarjeta en tu cuenta de Google y en este dispositivo?</translation> -<translation id="3779973883630527594">La empresa, organización o institución educativa que administra esta cuenta:</translation> <translation id="3781428340399460090">Fucsia</translation> <translation id="3783418713923659662">Mastercard</translation> <translation id="3787705759683870569">Vencimiento: <ph name="EXPIRATION_MONTH" />/<ph name="EXPIRATION_YEAR" /></translation> @@ -562,6 +558,7 @@ <translation id="3949571496842715403">Este servidor no pudo probar que su dominio es <ph name="DOMAIN" />; su certificado de seguridad no especifica la extensión Nombres alternativos del asunto. Es posible que se deba a un error en la configuración o a que haya un atacante que está interceptando tu conexión.</translation> <translation id="3949601375789751990">Tu historial de navegación aparece aquí</translation> <translation id="3950820424414687140">Acceder</translation> +<translation id="3962859241508114581">Pista anterior</translation> <translation id="3963837677003247395">¿Quieres continuar de forma manual?</translation> <translation id="3964661563329879394">{COUNT,plural, =0{Ninguno}=1{De 1 sitio }other{De # sitios }}</translation> <translation id="397105322502079400">Calculando...</translation> @@ -584,6 +581,7 @@ <translation id="410351446219883937">Reproducción automática</translation> <translation id="4103763322291513355">Visita <strong>chrome://policy</strong> para ver las URL en lista negra y otras políticas que estableció el administrador del sistema.</translation> <translation id="4110652170750985508">Revisar el pago</translation> +<translation id="4112140312785995938">Buscar más atrás</translation> <translation id="4116663294526079822">Permitir siempre en este sitio</translation> <translation id="4117700440116928470">No se admite el alcance de la política.</translation> <translation id="4129401438321186435">{COUNT,plural, =1{1 más}other{# más}}</translation> @@ -662,6 +660,7 @@ <translation id="443673843213245140">Se inhabilitó el uso de un proxy, pero se especificó una configuración explícita de proxy.</translation> <translation id="445100540951337728">Tarjetas de débito aceptadas</translation> <translation id="4466881336512663640">Se perderán los cambios del formulario. ¿Confirmas que deseas continuar?</translation> +<translation id="4477350412780666475">Siguiente pista</translation> <translation id="4482953324121162758">Este sitio no se traducirá.</translation> <translation id="4490717597759821841">A7</translation> <translation id="4493480324863638523">La URL no es válida. Debe ser una URL con un esquema estándar, p. ej., http://ejemplo.com o https://ejemplo.com.</translation> @@ -908,7 +907,6 @@ <translation id="5838278095973806738">No debes ingresar información confidencial en este sitio (p. ej., contraseñas o tarjetas de crédito), ya que los atacantes podrían robarla.</translation> <translation id="5860033963881614850">No</translation> <translation id="5863847714970149516">Es posible que la página siguiente intente cobrarte dinero</translation> -<translation id="5865951947699094510">Puedes cambiar la configuración de tu cuenta de forma remota.</translation> <translation id="5866257070973731571">Agregar número de teléfono</translation> <translation id="5869405914158311789">No se puede acceder a este sitio</translation> <translation id="5869522115854928033">Contraseñas almacenadas</translation> @@ -1061,6 +1059,7 @@ <translation id="6778737459546443941">Uno de tus padres aún no lo aprobó</translation> <translation id="67862343314499040">Violeta</translation> <translation id="6786747875388722282">Extensiones</translation> +<translation id="6790428901817661496">Reproducir</translation> <translation id="679355240208270552">Se ignora porque la búsqueda predeterminada no está habilitada según la política.</translation> <translation id="681021252041861472">Campo obligatorio</translation> <translation id="6810899417690483278">ID de personalización</translation> @@ -1164,6 +1163,7 @@ <translation id="7353601530677266744">Línea de comandos</translation> <translation id="7372973238305370288">resultado de búsqueda</translation> <translation id="7377249249140280793"><ph name="RELATIVE_DATE" /> - <ph name="FULL_DATE" /></translation> +<translation id="7378594059915113390">Controles de contenido multimedia</translation> <translation id="7378627244592794276">No</translation> <translation id="7378810950367401542">/</translation> <translation id="7390545607259442187">Confirmar tarjeta</translation> @@ -1267,7 +1267,6 @@ <translation id="780301667611848630">No, gracias</translation> <translation id="7805768142964895445">Estado</translation> <translation id="7806344367022510803">Cambia la configuración del motor de búsqueda en Chrome</translation> -<translation id="7810209002420871817">Como administrador de tu cuenta, <ph name="ACCOUNT_DOMAIN" />:</translation> <translation id="7812922009395017822">Mir</translation> <translation id="7813600968533626083">¿Confirmas que quieres quitar la sugerencia de formulario de Chrome?</translation> <translation id="7815407501681723534">Se encontraron <ph name="NUMBER_OF_RESULTS" /> <ph name="SEARCH_RESULTS" /> para "<ph name="SEARCH_STRING" />"</translation>
diff --git a/components/strings/components_strings_es.xtb b/components/strings/components_strings_es.xtb index 701f136..5347b8d 100644 --- a/components/strings/components_strings_es.xtb +++ b/components/strings/components_strings_es.xtb
@@ -1,7 +1,6 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="es"> -<translation id="1001338328714563407">Como administrador de tu dispositivo y de tu cuenta, <ph name="ENROLLMENT_DOMAIN" />:</translation> <translation id="1008557486741366299">Ahora no</translation> <translation id="1010200102790553230">Cargar la página más tarde</translation> <translation id="1015730422737071372">Proporciónanos más detalles</translation> @@ -41,6 +40,7 @@ <translation id="1161325031994447685">Volver a conectarte a una red Wi-Fi</translation> <translation id="1165039591588034296">Error</translation> <translation id="1175364870820465910">Im&primir...</translation> +<translation id="1178581264944972037">Pausar</translation> <translation id="1181037720776840403">Quitar</translation> <translation id="1197088940767939838">Naranja</translation> <translation id="1201402288615127009">Siguiente</translation> @@ -98,7 +98,6 @@ <translation id="1405567553485452995">Verde claro</translation> <translation id="1407135791313364759">Abrir todas</translation> <translation id="1413809658975081374">Error de privacidad</translation> -<translation id="14171126816530869">La identidad de <ph name="ORGANIZATION" /> en <ph name="LOCALITY" /> ha sido verificada por <ph name="ISSUER" />.</translation> <translation id="1426410128494586442">Sí</translation> <translation id="1430915738399379752">Imprimir</translation> <translation id="1455413310270022028">Borrador</translation> @@ -251,6 +250,7 @@ <translation id="2262243747453050782">Error de HTTP</translation> <translation id="2263079731045660823">Actualiza la información de autocompletar tarjetas de crédito en la configuración de Chrome</translation> <translation id="2270484714375784793">Número de teléfono</translation> +<translation id="2277103315734023688">Ir hacia delante</translation> <translation id="2283340219607151381">Guardar y autocompletar direcciones</translation> <translation id="2292556288342944218">Tu acceso a Internet está bloqueado</translation> <translation id="2297722699537546652">B5 (sobre)</translation> @@ -375,7 +375,6 @@ <translation id="295526156371527179">Advertencia: Esta política no se ha combinado como un diccionario tal como se especifica en la política porque no es un diccionario.</translation> <translation id="2955913368246107853">Cerrar la barra de búsqueda</translation> <translation id="2969319727213777354">Para establecer una conexión segura, el reloj debe estar configurado correctamente. Esto se debe a que los certificados que utilizan los sitios web para identificarse solo son válidos para períodos de tiempo específicos. Como el reloj de tu dispositivo no está configurado correctamente, Google Chrome no puede verificar estos certificados.</translation> -<translation id="2970515157925768593">Puede cambiar la configuración de tu dispositivo y de tu cuenta de forma remota.</translation> <translation id="2972581237482394796">&Rehacer</translation> <translation id="2977665033722899841"><ph name="ROW_NAME" />, opción seleccionada actualmente. <ph name="ROW_CONTENT" /></translation> <translation id="2982481275546140226">Borrar datos</translation> @@ -387,7 +386,6 @@ <translation id="3005723025932146533">Mostrar copia guardada</translation> <translation id="3008447029300691911">Introduce el código CVC de la tarjeta <ph name="CREDIT_CARD" />. Cuando la confirmes, su información se compartirá con este sitio web.</translation> <translation id="3010559122411665027">Entrada de lista "<ph name="ENTRY_INDEX" />": <ph name="ERROR" /></translation> -<translation id="3014389611820813634">Como administrador de este dispositivo, <ph name="ENROLLMENT_DOMAIN" />:</translation> <translation id="301521992641321250">Bloqueado automáticamente</translation> <translation id="3023071826883856138">You4 (sobre)</translation> <translation id="3024663005179499861">Tipo de política incorrecto</translation> @@ -433,7 +431,6 @@ <translation id="3287510313208355388">Descargar cuando haya conexión</translation> <translation id="3293642807462928945">Más información sobre la política <ph name="POLICY_NAME" /></translation> <translation id="3303855915957856445">No se han encontrado resultados de búsqueda</translation> -<translation id="3311730110465560799">Puede cambiar la configuración de tu dispositivo de forma remota.</translation> <translation id="3320021301628644560">Añadir dirección de facturación</translation> <translation id="3324983252691184275">Carmesí</translation> <translation id="3338095232262050444">Es seguro</translation> @@ -529,7 +526,6 @@ <translation id="3761718714832595332">Ocultar estado</translation> <translation id="3765032636089507299">La página Navegación Segura está en construcción.</translation> <translation id="3778403066972421603">¿Quieres guardar esta tarjeta en tu cuenta de Google y en este dispositivo?</translation> -<translation id="3779973883630527594">La empresa, el centro educativo o la organización que gestiona esta cuenta:</translation> <translation id="3781428340399460090">Rosa fucsia</translation> <translation id="3783418713923659662">Mastercard</translation> <translation id="3787705759683870569">Vencimiento: <ph name="EXPIRATION_MONTH" />/<ph name="EXPIRATION_YEAR" /></translation> @@ -553,6 +549,7 @@ <translation id="3949571496842715403">Este servidor no ha podido demostrar que es <ph name="DOMAIN" />; su certificado de seguridad no especifica nombres alternativos del sujeto. Este problema puede deberse a una configuración incorrecta o a que un atacante ha interceptado la conexión.</translation> <translation id="3949601375789751990">Tu historial de navegación aparece aquí</translation> <translation id="3950820424414687140">Iniciar sesión</translation> +<translation id="3962859241508114581">Pista anterior</translation> <translation id="3963837677003247395">¿Quieres continuar de forma manual?</translation> <translation id="3964661563329879394">{COUNT,plural, =0{Ninguno}=1{De 1 sitio web }other{De # sitios web }}</translation> <translation id="397105322502079400">Calculando...</translation> @@ -575,6 +572,7 @@ <translation id="410351446219883937">Reproducción automática</translation> <translation id="4103763322291513355">Accede a la página <strong>chrome://policy</strong> para ver la lista de URLs no admitidas y otras políticas establecidas por el administrador del sistema.</translation> <translation id="4110652170750985508">Revisa tu pago</translation> +<translation id="4112140312785995938">Ir hacia atrás</translation> <translation id="4116663294526079822">Permitir siempre en este sitio</translation> <translation id="4117700440116928470">No se admite el alcance de la política.</translation> <translation id="4129401438321186435">{COUNT,plural, =1{Uno más}other{# más}}</translation> @@ -653,6 +651,7 @@ <translation id="443673843213245140">Se ha inhabilitado el uso de un servidor proxy, pero se han especificado ajustes de proxy explícitos.</translation> <translation id="445100540951337728">Tarjetas de débito aceptadas</translation> <translation id="4466881336512663640">Se perderán los cambios realizados en el formulario. ¿Seguro que quieres continuar?</translation> +<translation id="4477350412780666475">Pista siguiente</translation> <translation id="4482953324121162758">Este sitio web no se traducirá.</translation> <translation id="4490717597759821841">A7</translation> <translation id="4493480324863638523">La URL no es válida. Debe ser una URL con una estructura estándar, como "http://example.com" o "https://example.com".</translation> @@ -899,7 +898,6 @@ <translation id="5838278095973806738">No deberías introducir información confidencial en este sitio web (por ejemplo, contraseñas o tarjetas de crédito) porque los atacantes podrían robarla.</translation> <translation id="5860033963881614850">No</translation> <translation id="5863847714970149516">Es posible que la página a la que vas a acceder intente aplicar algún cargo</translation> -<translation id="5865951947699094510">Puede cambiar la configuración de tu cuenta de forma remota.</translation> <translation id="5866257070973731571">Añade un número de teléfono</translation> <translation id="5869405914158311789">No se puede acceder a este sitio web</translation> <translation id="5869522115854928033">Contraseñas guardadas</translation> @@ -1052,6 +1050,7 @@ <translation id="6778737459546443941">Uno de tus padres aún no lo ha aprobado</translation> <translation id="67862343314499040">Violeta</translation> <translation id="6786747875388722282">Extensiones</translation> +<translation id="6790428901817661496">Reproducir</translation> <translation id="679355240208270552">Se ha ignorado el valor porque se ha establecido una política que inhabilita la búsqueda predeterminada.</translation> <translation id="681021252041861472">Campo obligatorio</translation> <translation id="6810899417690483278">ID de personalización</translation> @@ -1152,6 +1151,7 @@ <translation id="7353601530677266744">Línea de comandos</translation> <translation id="7372973238305370288">resultado de búsqueda</translation> <translation id="7377249249140280793"><ph name="RELATIVE_DATE" /> - <ph name="FULL_DATE" /></translation> +<translation id="7378594059915113390">Controles multimedia</translation> <translation id="7378627244592794276">No</translation> <translation id="7378810950367401542">/</translation> <translation id="7390545607259442187">Confirmar tarjeta</translation> @@ -1255,7 +1255,6 @@ <translation id="780301667611848630">No, gracias</translation> <translation id="7805768142964895445">Estado</translation> <translation id="7806344367022510803">Cambia la configuración del motor de búsqueda en Chrome</translation> -<translation id="7810209002420871817">Como administrador de tu cuenta, <ph name="ACCOUNT_DOMAIN" />:</translation> <translation id="7812922009395017822">Mir</translation> <translation id="7813600968533626083">¿Eliminar sugerencia de formulario de Chrome?</translation> <translation id="7815407501681723534">Se han encontrado <ph name="NUMBER_OF_RESULTS" /> <ph name="SEARCH_RESULTS" /> de <ph name="SEARCH_STRING" /></translation>
diff --git a/components/strings/components_strings_et.xtb b/components/strings/components_strings_et.xtb index 9e46233..ff6e452 100644 --- a/components/strings/components_strings_et.xtb +++ b/components/strings/components_strings_et.xtb
@@ -1,7 +1,6 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="et"> -<translation id="1001338328714563407">Teie seadme ja konto haldurina, <ph name="ENROLLMENT_DOMAIN" />:</translation> <translation id="1008557486741366299">Mitte praegu</translation> <translation id="1010200102790553230">Laadi leht hiljem</translation> <translation id="1015730422737071372">Esitage lisateavet</translation> @@ -41,6 +40,7 @@ <translation id="1161325031994447685">Ühendage uuesti WiFi-ga</translation> <translation id="1165039591588034296">Viga</translation> <translation id="1175364870820465910">&Prindi...</translation> +<translation id="1178581264944972037">Peata</translation> <translation id="1181037720776840403">Eemalda</translation> <translation id="1197088940767939838">Oranž</translation> <translation id="1201402288615127009">Edasi</translation> @@ -100,7 +100,6 @@ <translation id="1405567553485452995">Heleroheline</translation> <translation id="1407135791313364759">Ava kõik</translation> <translation id="1413809658975081374">Privaatsuse viga</translation> -<translation id="14171126816530869"><ph name="ORGANIZATION" /> identiteeti leheküljel <ph name="LOCALITY" /> kinnitas <ph name="ISSUER" />.</translation> <translation id="1426410128494586442">Jah</translation> <translation id="1430915738399379752">Printimine</translation> <translation id="1455413310270022028">Kustutuskumm</translation> @@ -256,6 +255,7 @@ <translation id="2262243747453050782">HTTP viga</translation> <translation id="2263079731045660823">Värskendage krediitkaartide automaatse täitmise andmeid Chrome'i seadetes</translation> <translation id="2270484714375784793">Telefoninumber</translation> +<translation id="2277103315734023688">Keri edasi</translation> <translation id="2283340219607151381">Salvesta ja sisesta aadressid</translation> <translation id="2292556288342944218">Teie juurdepääs Internetile on blokeeritud</translation> <translation id="2297722699537546652">B5 (ümbrik)</translation> @@ -383,7 +383,6 @@ <translation id="295526156371527179">Hoiatus! Seda reeglit ei liidetud reeglis määratud sõnastikuna, kuna see ei ole sõnastik.</translation> <translation id="2955913368246107853">Sule leiuriba</translation> <translation id="2969319727213777354">Turvalise ühenduse loomiseks peab kell olema õigesti seadistatud, kuna sertifikaadid, mida veebisaidid kasutavad enda tuvastamiseks, kehtivad ainult teatud perioodi jooksul. Kuna teie seadme kell on vale, ei saa Chrome neid sertifikaate kinnitada.</translation> -<translation id="2970515157925768593">Saab kaugühenduse kaudu teie seadme ja konto seadistust muuta.</translation> <translation id="2972581237482394796">&Tee uuesti</translation> <translation id="2977665033722899841"><ph name="ROW_NAME" />, praegu valitud. <ph name="ROW_CONTENT" /></translation> <translation id="2982481275546140226">Kustuta andmed</translation> @@ -395,7 +394,6 @@ <translation id="3005723025932146533">Kuva salvestatud koopia</translation> <translation id="3008447029300691911">Sisestage krediitkaardi <ph name="CREDIT_CARD" /> CVC. Kui selle kinnitate, jagatakse teie kaardi üksikasju selle saidiga.</translation> <translation id="3010559122411665027">Loendi kirje „<ph name="ENTRY_INDEX" />”: <ph name="ERROR" /></translation> -<translation id="3014389611820813634">Selle seadme haldurina, <ph name="ENROLLMENT_DOMAIN" />:</translation> <translation id="301521992641321250">Automaatselt blokeeritud</translation> <translation id="3023071826883856138">You4 (ümbrik)</translation> <translation id="3024663005179499861">Reegli tüüp on vale</translation> @@ -441,7 +439,6 @@ <translation id="3287510313208355388">Laadi alla, kui ühendus on saadaval</translation> <translation id="3293642807462928945">Lisateave reegli <ph name="POLICY_NAME" /> kohta</translation> <translation id="3303855915957856445">Otsingutulemusi ei leitud</translation> -<translation id="3311730110465560799">Saab teie seadme seadistust kaugühenduse kaudu muuta.</translation> <translation id="3320021301628644560">Arveldusaadressi lisamine</translation> <translation id="3324983252691184275">Tulipunane</translation> <translation id="3338095232262050444">Turvaline</translation> @@ -537,7 +534,6 @@ <translation id="3761718714832595332">Peida olek</translation> <translation id="3765032636089507299">Google'i ohutu sirvimise leht on loomisel.</translation> <translation id="3778403066972421603">Kas soovite selle kaardi salvestada oma Google'i kontole ja sellesse seadmesse?</translation> -<translation id="3779973883630527594">Seda kontot haldav ettevõte, kool või organisatsioon:</translation> <translation id="3781428340399460090">Erkroosa</translation> <translation id="3783418713923659662">Mastercard</translation> <translation id="3787705759683870569">Aegub: <ph name="EXPIRATION_MONTH" />/<ph name="EXPIRATION_YEAR" /></translation> @@ -561,6 +557,7 @@ <translation id="3949571496842715403">Server ei suutnud tõestada, et see on domeen <ph name="DOMAIN" />; selle turvasertifikaat ei määra laiendust Subject Alternative Names. Selle põhjuseks võib olla vale seadistus või ründaja, kes on sekkunud teie ühendusse.</translation> <translation id="3949601375789751990">Siin kuvatakse teie sirvimisajalugu</translation> <translation id="3950820424414687140">Sisselogimine</translation> +<translation id="3962859241508114581">Eelmine lugu</translation> <translation id="3963837677003247395">Kas jätkata käsitsi?</translation> <translation id="3964661563329879394">{COUNT,plural, =0{Ükski}=1{1 saidilt }other{# saidilt }}</translation> <translation id="397105322502079400">Arvutamine ...</translation> @@ -583,6 +580,7 @@ <translation id="410351446219883937">Automaatesitus</translation> <translation id="4103763322291513355">Külastage saiti <strong>chrome://policy</strong>, et näha mustas nimekirjas olevate URL-ide loendit ja teisi reegleid, mille on jõustanud teie süsteemiadministraator.</translation> <translation id="4110652170750985508">Vaadake makse üle</translation> +<translation id="4112140312785995938">Keri tagasi</translation> <translation id="4116663294526079822">Luba sellel saidil alati</translation> <translation id="4117700440116928470">Reegli ulatust ei toetata.</translation> <translation id="4129401438321186435">{COUNT,plural, =1{veel 1}other{veel #}}</translation> @@ -661,6 +659,7 @@ <translation id="443673843213245140">Puhverserveri kasutamine on keelatud, kuid määratud on ka konkreetne puhverserveri konfigureerimine.</translation> <translation id="445100540951337728">Aktsepteeritavad deebetkaardid</translation> <translation id="4466881336512663640">Vormil tehtud muudatused lähevad kaotsi. Kas soovite kindlasti jätkata?</translation> +<translation id="4477350412780666475">Järgmine lugu</translation> <translation id="4482953324121162758">Seda saiti ei tõlgita.</translation> <translation id="4490717597759821841">A7</translation> <translation id="4493480324863638523">Sobimatu URL. Peab olema standardskeemiga URL, nt http://example.com või https://example.com.</translation> @@ -907,7 +906,6 @@ <translation id="5838278095973806738">Te ei tohiks sellele saidile sisestada tundlikku teavet (nt paroolid või krediitkaardid), kuna ründajad võivad selle varastada.</translation> <translation id="5860033963881614850">Väljas</translation> <translation id="5863847714970149516">Järgmisel lehel võidakse teilt üritada tasu võtta</translation> -<translation id="5865951947699094510">Saab teie konto seadistust kaugühenduse kaudu muuta.</translation> <translation id="5866257070973731571">Telefoninumbri lisamine</translation> <translation id="5869405914158311789">Selle saidiga ei saa ühendust</translation> <translation id="5869522115854928033">Salvestatud paroolid</translation> @@ -1060,6 +1058,7 @@ <translation id="6778737459546443941">Vanem ei ole seda veel kinnitanud</translation> <translation id="67862343314499040">Violetne</translation> <translation id="6786747875388722282">Laiendused</translation> +<translation id="6790428901817661496">Esita</translation> <translation id="679355240208270552">Seda eiratakse, kuna vaikeotsing ei ole reegliga lubatud.</translation> <translation id="681021252041861472">Kohustuslik väli</translation> <translation id="6810899417690483278">Kohandamise ID</translation> @@ -1104,6 +1103,7 @@ <translation id="7053983685419859001">Blokeeri</translation> <translation id="7062635574500127092">Sinakasroheline</translation> <translation id="7064851114919012435">Kontaktteave</translation> +<translation id="7075452647191940183">Taotlus on liiga suur</translation> <translation id="7079718277001814089">See sait sisaldab pahavara</translation> <translation id="7087282848513945231">Maakond</translation> <translation id="7090678807593890770">Sisestage Google'isse otsing <ph name="LINK" /></translation> @@ -1163,6 +1163,7 @@ <translation id="7353601530677266744">Käsurida</translation> <translation id="7372973238305370288">otsingutulemus</translation> <translation id="7377249249140280793"><ph name="RELATIVE_DATE" /> - <ph name="FULL_DATE" /></translation> +<translation id="7378594059915113390">Meedia juhtnupud</translation> <translation id="7378627244592794276">Ei</translation> <translation id="7378810950367401542">/</translation> <translation id="7390545607259442187">Kaardi kinnitamine</translation> @@ -1266,7 +1267,6 @@ <translation id="780301667611848630">Ei, aitäh</translation> <translation id="7805768142964895445">Olek</translation> <translation id="7806344367022510803">Muutke otsingumootori seadeid Chrome'is</translation> -<translation id="7810209002420871817">Teie konto <ph name="ACCOUNT_DOMAIN" /> haldurina:</translation> <translation id="7812922009395017822">Mir</translation> <translation id="7813600968533626083">Kas eemaldada Chrome'ist vormi soovitus?</translation> <translation id="7815407501681723534">Otsingule „<ph name="SEARCH_STRING" />” leiti <ph name="NUMBER_OF_RESULTS" /> <ph name="SEARCH_RESULTS" />.</translation>
diff --git a/components/strings/components_strings_fa.xtb b/components/strings/components_strings_fa.xtb index 605cc9f..11677af 100644 --- a/components/strings/components_strings_fa.xtb +++ b/components/strings/components_strings_fa.xtb
@@ -1,7 +1,6 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="fa"> -<translation id="1001338328714563407">بهعنوان مدیر دستگاه و حسابتان، <ph name="ENROLLMENT_DOMAIN" />:</translation> <translation id="1008557486741366299">اکنون نه</translation> <translation id="1010200102790553230">بار کردن صفحه در فرصتی دیگر</translation> <translation id="1015730422737071372">جزئیات بیشتری ارائه دهید</translation> @@ -41,6 +40,7 @@ <translation id="1161325031994447685">اتصال مجدد به Wi-Fi</translation> <translation id="1165039591588034296">خطا</translation> <translation id="1175364870820465910">&چاپ...</translation> +<translation id="1178581264944972037">مکث</translation> <translation id="1181037720776840403">حذف</translation> <translation id="1197088940767939838">نارنجی</translation> <translation id="1201402288615127009">بعدی</translation> @@ -100,7 +100,6 @@ <translation id="1405567553485452995">سبز روشن</translation> <translation id="1407135791313364759">باز کردن همه</translation> <translation id="1413809658975081374">خطای حریم خصوصی</translation> -<translation id="14171126816530869">هویت <ph name="ORGANIZATION" /> در <ph name="LOCALITY" /> توسط <ph name="ISSUER" /> تأیید شده است.</translation> <translation id="1426410128494586442">بله</translation> <translation id="1430915738399379752">چاپ</translation> <translation id="1455413310270022028">پاککن</translation> @@ -256,6 +255,7 @@ <translation id="2262243747453050782">خطای HTTP</translation> <translation id="2263079731045660823">اطلاعات تکمیل خودکار کارت اعتباری را در تنظیمات Chrome بهروزرسانی کنید</translation> <translation id="2270484714375784793">شماره تلفن</translation> +<translation id="2277103315734023688">رفتن به جلو</translation> <translation id="2283340219607151381">ذخیره و تکمیل نشانی</translation> <translation id="2292556288342944218">دسترسی شما به اینترنت مسدود است</translation> <translation id="2297722699537546652">B5 (Envelope)</translation> @@ -383,7 +383,6 @@ <translation id="295526156371527179">هشدار: این خطمشی طبق آنچه در خطمشی مشخص شده است بهعنوان فهرست ادغام نشد، زیرا فهرست نیست.</translation> <translation id="2955913368246107853">بستن نوار یافتن</translation> <translation id="2969319727213777354">برای برقراری یک اتصال امن، لازم است ساعت شما درست تنظیم شده باشد. زیرا گواهیهایی که وبسایتها برای شناسایی خودشان استفاده میکنند، تنها برای دورههای زمانی خاصی معتبرند. از آنجا که ساعت دستگاه شما نادرست است، Google Chrome نمیتواند این گواهیها را تأیید کند.</translation> -<translation id="2970515157925768593">میتواند تنظیم دستگاه و حسابتان را ازراهدور تغییر دهد.</translation> <translation id="2972581237482394796">انجام مجدد</translation> <translation id="2977665033722899841"><ph name="ROW_NAME" />، درحالحاضر انتخاب شده است. <ph name="ROW_CONTENT" /></translation> <translation id="2982481275546140226">پاک کردن دادهها</translation> @@ -395,7 +394,6 @@ <translation id="3005723025932146533">نمایش کپی ذخیره شده</translation> <translation id="3008447029300691911">CVC کارت <ph name="CREDIT_CARD" /> را وارد کنید. بعد از تأیید، جزئیات کارت شما با این سایت به اشتراک گذاشته میشود.</translation> <translation id="3010559122411665027">ورودی فهرست "<ph name="ENTRY_INDEX" />": <ph name="ERROR" /></translation> -<translation id="3014389611820813634">بهعنوان مدیر این دستگاه، <ph name="ENROLLMENT_DOMAIN" />:</translation> <translation id="301521992641321250">مسدودشده بهطور خودکار</translation> <translation id="3023071826883856138">You4 (Envelope)</translation> <translation id="3024663005179499861">نوع خطمشی اشتباه است</translation> @@ -441,7 +439,6 @@ <translation id="3287510313208355388">بارگیری بعد از آنلاین شدن</translation> <translation id="3293642807462928945">درباره خطمشی <ph name="POLICY_NAME" /> بیشتر بدانید</translation> <translation id="3303855915957856445">هیچ نتیجهای برای جستجو یافت نشد</translation> -<translation id="3311730110465560799">میتواند تنظیم دستگاهتان را ازراهدور تغییر دهد.</translation> <translation id="3320021301628644560">افزودن نشانی صورتحساب</translation> <translation id="3324983252691184275">زرشکی</translation> <translation id="3338095232262050444">ایمن</translation> @@ -537,7 +534,6 @@ <translation id="3761718714832595332">پنهان کردن وضعیت</translation> <translation id="3765032636089507299">صفحه «مرور ایمن» در دست ساخت است.</translation> <translation id="3778403066972421603">آیا میخواهید این کارت در حساب Google شما و این دستگاه ذخیره شود؟</translation> -<translation id="3779973883630527594">شرکت، مدرسه، یا سازمانی که این حساب را مدیریت میکند:</translation> <translation id="3781428340399460090">صورتی پررنگ</translation> <translation id="3783418713923659662">مسترکارت</translation> <translation id="3787705759683870569">تاریخ انقضا <ph name="EXPIRATION_MONTH" />/<ph name="EXPIRATION_YEAR" /></translation> @@ -561,6 +557,7 @@ <translation id="3949571496842715403">این سرور نتوانست ثابت کند که <ph name="DOMAIN" /> است؛ در گواهی امنیتی آن، Subject Alternative Names مشخص نشده است. ممکن است این مشکل به دلیل پیکربندی نادرست یا قطع اتصال شما توسط مهاجم ایجاد شده باشد.</translation> <translation id="3949601375789751990">سابقه مرورتان در اینجا نشان داده میشود</translation> <translation id="3950820424414687140">ورود به سیستم</translation> +<translation id="3962859241508114581">آهنگ قبلی</translation> <translation id="3963837677003247395">بهصورت دستی ادامه میدهید؟</translation> <translation id="3964661563329879394">{COUNT,plural, =0{هیچکدام}=1{از ۱ سایت }one{از # سایت }other{از # سایت }}</translation> <translation id="397105322502079400">در حال محاسبه…</translation> @@ -583,6 +580,7 @@ <translation id="410351446219883937">پخش خودکار</translation> <translation id="4103763322291513355">برای مشاهده فهرست نشانیهای وب ممنوع و سایر خطمشیهای اجباری براساس تصمیم سرپرست سیستم خود از <strong>chrome://policy</strong> بازدید نمایید.</translation> <translation id="4110652170750985508">مرور پرداخت</translation> +<translation id="4112140312785995938">رفتن به عقب</translation> <translation id="4116663294526079822">همیشه مجاز در این سایت</translation> <translation id="4117700440116928470">محدوده خطمشی پشتیبانی نمیشود.</translation> <translation id="4129401438321186435">{COUNT,plural, =1{۱ مورد دیگر}one{# مورد دیگر}other{# مورد دیگر}}</translation> @@ -661,6 +659,7 @@ <translation id="443673843213245140">استفاده از پروکسی غیرفعال است اما یک پیکربندی خاص برای پروکسی تعیین شده است.</translation> <translation id="445100540951337728">کارتهای نقدی قابلقبول</translation> <translation id="4466881336512663640">تغییرات فرم از بین میرود. مطمئن هستید میخواهید ادامه دهید؟</translation> +<translation id="4477350412780666475">آهنگ بعدی</translation> <translation id="4482953324121162758">این سایت ترجمه نخواهد شد.</translation> <translation id="4490717597759821841">A7</translation> <translation id="4493480324863638523">نشانی وب نامعتبر است. باید نشانی وبی با طرحی استاندارد مانند http://example.com یا https://example.com باشد.</translation> @@ -907,7 +906,6 @@ <translation id="5838278095973806738">نباید هیچ اطلاعات حساسی (مثل گذرواژه یا کارت اعتباری) را در این سایت وارد کنید، زیرا ممکن است مهاجمین آنها را سرقت کنند.</translation> <translation id="5860033963881614850">خاموش</translation> <translation id="5863847714970149516">صفحه پیشرو ممکن است تلاش کند از شما پول دریافت کند</translation> -<translation id="5865951947699094510">میتواند تنظیم حسابتان را ازراهدور تغییر دهد.</translation> <translation id="5866257070973731571">افزودن شماره تلفن</translation> <translation id="5869405914158311789">دسترسی به این سایت امکانپذیر نیست</translation> <translation id="5869522115854928033">گذرواژههای ذخیرهشده</translation> @@ -1060,6 +1058,7 @@ <translation id="6778737459546443941">والدینتان هنوز این سایت را تأیید نکردهاند</translation> <translation id="67862343314499040">بنفش</translation> <translation id="6786747875388722282">افزونهها</translation> +<translation id="6790428901817661496">پخش</translation> <translation id="679355240208270552">نادیده گرفته شد، زیرا جستجوی پیشفرض توسط خطمشی فعال نشده است.</translation> <translation id="681021252041861472">فیلد ضروری</translation> <translation id="6810899417690483278">شناسه سفارشیسازی</translation> @@ -1163,6 +1162,7 @@ <translation id="7353601530677266744">خط فرمان</translation> <translation id="7372973238305370288">نتیجه جستجو</translation> <translation id="7377249249140280793"><ph name="RELATIVE_DATE" /> - <ph name="FULL_DATE" /></translation> +<translation id="7378594059915113390">کنترلهای رسانه</translation> <translation id="7378627244592794276">نه</translation> <translation id="7378810950367401542">/</translation> <translation id="7390545607259442187">تأیید کارت</translation> @@ -1266,7 +1266,6 @@ <translation id="780301667611848630">نه متشکرم</translation> <translation id="7805768142964895445">وضعیت</translation> <translation id="7806344367022510803">تنظیمات «موتور جستجو» را در Chrome تغییر دهید</translation> -<translation id="7810209002420871817">بهعنوان مدیر حسابتان، <ph name="ACCOUNT_DOMAIN" />:</translation> <translation id="7812922009395017822">Mir</translation> <translation id="7813600968533626083">پیشنهاد فرم از Chrome پاک شود؟</translation> <translation id="7815407501681723534"><ph name="NUMBER_OF_RESULTS" /><ph name="SEARCH_RESULTS" /> برای «<ph name="SEARCH_STRING" />» پیدا شد</translation>
diff --git a/components/strings/components_strings_fi.xtb b/components/strings/components_strings_fi.xtb index 8d78477..3b4cd06 100644 --- a/components/strings/components_strings_fi.xtb +++ b/components/strings/components_strings_fi.xtb
@@ -1,7 +1,6 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="fi"> -<translation id="1001338328714563407">Laitteesi ja tilisi ylläpitäjänä <ph name="ENROLLMENT_DOMAIN" />:</translation> <translation id="1008557486741366299">Ei nyt</translation> <translation id="1010200102790553230">Lataa sivu myöhemmin</translation> <translation id="1015730422737071372">Lisätietoja</translation> @@ -41,6 +40,7 @@ <translation id="1161325031994447685">Muodosta yhteys Wi-Fi-verkkoon uudelleen.</translation> <translation id="1165039591588034296">Virhe</translation> <translation id="1175364870820465910">Tulo&sta...</translation> +<translation id="1178581264944972037">Tauko</translation> <translation id="1181037720776840403">Poista</translation> <translation id="1197088940767939838">Oranssi</translation> <translation id="1201402288615127009">Seuraava</translation> @@ -100,7 +100,6 @@ <translation id="1405567553485452995">Vaaleanvihreä</translation> <translation id="1407135791313364759">Avaa kaikki</translation> <translation id="1413809658975081374">Tietosuojavirhe</translation> -<translation id="14171126816530869">Organisaation <ph name="ORGANIZATION" /> identiteetin sijainnissa <ph name="LOCALITY" /> on vahvistanut <ph name="ISSUER" />.</translation> <translation id="1426410128494586442">Kyllä</translation> <translation id="1430915738399379752">Tulosta</translation> <translation id="1455413310270022028">Pyyhekumi</translation> @@ -256,6 +255,7 @@ <translation id="2262243747453050782">HTTP-virhe</translation> <translation id="2263079731045660823">Päivitä luottokorttien automaattiset täyttötiedot Chrome-asetuksissa</translation> <translation id="2270484714375784793">Puhelinnumero</translation> +<translation id="2277103315734023688">Kelaa eteenpäin</translation> <translation id="2283340219607151381">Tallenna ja täytä osoitteet</translation> <translation id="2292556288342944218">Internetyhteytesi on estetty</translation> <translation id="2297722699537546652">B5 (kirjekuori)</translation> @@ -383,7 +383,6 @@ <translation id="295526156371527179">Varoitus: tätä käytäntöä ei yhdistetty käytännössä kuvatulla tavalla sanakirjana, sillä se ei ole sanakirja.</translation> <translation id="2955913368246107853">Sulje hakupalkki</translation> <translation id="2969319727213777354">Kellosi täytyy asettaa oikeaan aikaan, jotta salattu yhteys voidaan muodostaa. Tämä johtuu siitä, että verkkosivustojen tunnistamisessa käytettävät varmenteet ovat voimassa vain tiettyinä aikoina. Chrome ei voi vahvistaa varmenteita, koska laitteesi kello on väärässä ajassa.</translation> -<translation id="2970515157925768593">Voi muuttaa laitteesi ja tilisi kokoonpanoa etänä.</translation> <translation id="2972581237482394796">&Tee uudelleen</translation> <translation id="2977665033722899841"><ph name="ROW_NAME" />, tällä hetkellä valittuna. <ph name="ROW_CONTENT" /></translation> <translation id="2982481275546140226">Tyhjennä tiedot</translation> @@ -395,7 +394,6 @@ <translation id="3005723025932146533">Näytä tallennettu kopio</translation> <translation id="3008447029300691911">Anna kortin <ph name="CREDIT_CARD" /> CVC. Vahvistamisen jälkeen korttisi tiedot jaetaan sivuston kanssa.</translation> <translation id="3010559122411665027">Luettelokohde "<ph name="ENTRY_INDEX" />": <ph name="ERROR" /></translation> -<translation id="3014389611820813634">Tämän laitteen ylläpitäjänä <ph name="ENROLLMENT_DOMAIN" />:</translation> <translation id="301521992641321250">Estetty automaattisesti</translation> <translation id="3023071826883856138">You4 (kirjekuori)</translation> <translation id="3024663005179499861">Väärä käytäntötyyppi</translation> @@ -442,7 +440,6 @@ <translation id="3287510313208355388">Lataa, kun verkkoyhteys on muodostettu</translation> <translation id="3293642807462928945">Lisätietoja käytännöstä: <ph name="POLICY_NAME" /></translation> <translation id="3303855915957856445">Ei hakutuloksia</translation> -<translation id="3311730110465560799">Voi muuttaa laitteesi määrityksiä etänä.</translation> <translation id="3320021301628644560">Lisää laskutusosoite</translation> <translation id="3324983252691184275">Karmiininpunainen</translation> <translation id="3338095232262050444">Turvallinen</translation> @@ -538,7 +535,6 @@ <translation id="3761718714832595332">Piilota tila</translation> <translation id="3765032636089507299">Selaussuojasivu on työn alla.</translation> <translation id="3778403066972421603">Haluatko tallentaa tämän kortin Google-tilille ja tälle laitteelle?</translation> -<translation id="3779973883630527594">Tätä tiliä ylläpitävä yritys, oppilaitos tai organisaatio:</translation> <translation id="3781428340399460090">Pinkki</translation> <translation id="3783418713923659662">Mastercard</translation> <translation id="3787705759683870569">Vanhenee <ph name="EXPIRATION_MONTH" />/<ph name="EXPIRATION_YEAR" /></translation> @@ -562,6 +558,7 @@ <translation id="3949571496842715403">Palvelin ei voinut todistaa olevansa <ph name="DOMAIN" />; sen suojausvarmenteessa ei määritetä kohteen vaihtoehtoisia nimiä. Tämä voi johtua määritysvirheestä tai verkkoyhteytesi siepanneesta hyökkääjästä.</translation> <translation id="3949601375789751990">Selaushistoriasi näkyy tässä.</translation> <translation id="3950820424414687140">Kirjaudu sisään</translation> +<translation id="3962859241508114581">Edellinen kappale</translation> <translation id="3963837677003247395">Jatketaanko manuaalisesti?</translation> <translation id="3964661563329879394">{COUNT,plural, =0{Ei mitään}=1{1 sivustolta }other{# sivustolta }}</translation> <translation id="397105322502079400">Lasketaan...</translation> @@ -584,6 +581,7 @@ <translation id="410351446219883937">Automaattinen toisto</translation> <translation id="4103763322291513355">Voit lukea listan kielletyistä URL-osoitteista ja muut järjestelmänvalvojasi määräämät käytännöt osoitteessa <strong>chrome://policy</strong>.</translation> <translation id="4110652170750985508">Tarkasta maksu</translation> +<translation id="4112140312785995938">Kelaa taaksepäin</translation> <translation id="4116663294526079822">Salli aina tässä sivustossa</translation> <translation id="4117700440116928470">Käytännön laajuutta ei tueta.</translation> <translation id="4129401438321186435">{COUNT,plural, =1{1 muu}other{# muuta}}</translation> @@ -662,6 +660,7 @@ <translation id="443673843213245140">Välityspalvelinta ei saa käyttää, mutta erilliset välityspalvelimen asetukset on määritetty.</translation> <translation id="445100540951337728">Hyväksytyt maksukortit</translation> <translation id="4466881336512663640">Lomakkeen muutokset menetetään. Haluatko varmasti jatkaa?</translation> +<translation id="4477350412780666475">Seuraava kappale</translation> <translation id="4482953324121162758">Tätä sivustoa ei käännetä.</translation> <translation id="4490717597759821841">A7</translation> <translation id="4493480324863638523">Virheellinen URL-osoite URL-osoitteen on oltava vakiomallien mukainen, esimerkiksi "http://example.com" tai "https://example.com".</translation> @@ -908,7 +907,6 @@ <translation id="5838278095973806738">Älä anna tälle sivustolle salasanoja, luottokorttinumeroita tai muita arkaluonteisia tietoja, sillä hyökkääjät saattavat varastaa ne.</translation> <translation id="5860033963881614850">Pois käytöstä</translation> <translation id="5863847714970149516">Avaamasi sivu voi yrittää veloittaa sinulta rahaa</translation> -<translation id="5865951947699094510">Voi muuttaa tilisi kokoonpanoa etänä.</translation> <translation id="5866257070973731571">Lisää puhelinnumero</translation> <translation id="5869405914158311789">Sivustoon ei saada yhteyttä</translation> <translation id="5869522115854928033">Tallennetut salasanat</translation> @@ -1061,6 +1059,7 @@ <translation id="6778737459546443941">Vanhempasi ei ole hyväksynyt sitä vielä.</translation> <translation id="67862343314499040">Lila</translation> <translation id="6786747875388722282">Laajennukset</translation> +<translation id="6790428901817661496">Toista</translation> <translation id="679355240208270552">Ohitettu, koska oletushaku on poistettu käytöstä käytännön johdosta</translation> <translation id="681021252041861472">Pakollinen kenttä</translation> <translation id="6810899417690483278">Muokkaustunnus</translation> @@ -1105,6 +1104,7 @@ <translation id="7053983685419859001">Estä</translation> <translation id="7062635574500127092">Turkoosi</translation> <translation id="7064851114919012435">Yhteystiedot</translation> +<translation id="7075452647191940183">Pyyntö on liian suuri</translation> <translation id="7079718277001814089">Tämä sivusto sisältää haittaohjelmia</translation> <translation id="7087282848513945231">Piirikunta</translation> <translation id="7090678807593890770">Tee Google-haku: <ph name="LINK" /></translation> @@ -1164,6 +1164,7 @@ <translation id="7353601530677266744">Komentorivi</translation> <translation id="7372973238305370288">hakutulos</translation> <translation id="7377249249140280793"><ph name="RELATIVE_DATE" /> - <ph name="FULL_DATE" /></translation> +<translation id="7378594059915113390">Mediaohjaimet</translation> <translation id="7378627244592794276">Ei</translation> <translation id="7378810950367401542">/</translation> <translation id="7390545607259442187">Vahvista kortti</translation> @@ -1267,7 +1268,6 @@ <translation id="780301667611848630">Ei kiitos</translation> <translation id="7805768142964895445">Tila</translation> <translation id="7806344367022510803">Muuta hakukoneasetuksia Chromessa</translation> -<translation id="7810209002420871817">Tilisi ylläpitäjänä <ph name="ACCOUNT_DOMAIN" />:</translation> <translation id="7812922009395017822">Mir</translation> <translation id="7813600968533626083">Poistetaanko lomake-ehdotus Chromen tiedoista?</translation> <translation id="7815407501681723534">Haku <ph name="SEARCH_STRING" /> tuotti <ph name="NUMBER_OF_RESULTS" /> <ph name="SEARCH_RESULTS" />.</translation>
diff --git a/components/strings/components_strings_fil.xtb b/components/strings/components_strings_fil.xtb index 90014fdf..8d70d57 100644 --- a/components/strings/components_strings_fil.xtb +++ b/components/strings/components_strings_fil.xtb
@@ -1,7 +1,6 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="fil"> -<translation id="1001338328714563407">Bilang manager ng iyong device at account, <ph name="ENROLLMENT_DOMAIN" />:</translation> <translation id="1008557486741366299">Hindi Ngayon</translation> <translation id="1010200102790553230">I-load ang page sa ibang pagkakataon</translation> <translation id="1015730422737071372">Magbigay ng mga karagdagang detalye</translation> @@ -41,6 +40,7 @@ <translation id="1161325031994447685">Muling kumonekta sa Wi-Fi</translation> <translation id="1165039591588034296">Error</translation> <translation id="1175364870820465910">&I-print...</translation> +<translation id="1178581264944972037">I-pause</translation> <translation id="1181037720776840403">Alisin</translation> <translation id="1197088940767939838">Orange</translation> <translation id="1201402288615127009">Susunod</translation> @@ -100,7 +100,6 @@ <translation id="1405567553485452995">Light Green</translation> <translation id="1407135791313364759">Buksan lahat</translation> <translation id="1413809658975081374">Error sa privacy</translation> -<translation id="14171126816530869">Ang pagkilanlan ng <ph name="ORGANIZATION" /> sa <ph name="LOCALITY" /> ay napatotohanan ng <ph name="ISSUER" />.</translation> <translation id="1426410128494586442">Oo</translation> <translation id="1430915738399379752">I-print</translation> <translation id="1455413310270022028">Pambura</translation> @@ -256,6 +255,7 @@ <translation id="2262243747453050782">Error sa HTTP</translation> <translation id="2263079731045660823">I-update ang autofill ng credit card sa mga setting ng Chrome</translation> <translation id="2270484714375784793">Numero ng telepono</translation> +<translation id="2277103315734023688">Mag-seek Pasulong</translation> <translation id="2283340219607151381">I-save at punan ang mga address</translation> <translation id="2292556288342944218">Naka-block ang iyong access sa Internet</translation> <translation id="2297722699537546652">B5 (Envelope)</translation> @@ -383,7 +383,6 @@ <translation id="295526156371527179">Babala: Hindi na-merge ang patakarang ito bilang isang diksyunaryo gaya ng tinukoy ng patakaran dahil hindi ito isang diksyunaryo.</translation> <translation id="2955913368246107853">Isara ang bar sa paghahanap</translation> <translation id="2969319727213777354">Upang makapagtatag ng secure na koneksyon, kailangang itakda nang tama ang iyong orasan. Ito ay dahil sa may-bisa lang ang mga certificate na ginagamit ng mga website upang tukuyin ang mga sarili ng mga ito sa loob ng mga partikular na tagal ng panahon. Dahil mali ang orasan ng iyong device, hindi ma-verify ng Google Chrome ang mga certificate na ito.</translation> -<translation id="2970515157925768593">Puwedeng baguhin ang pag-set up ng iyong device at account nang malayuan.</translation> <translation id="2972581237482394796">&I-redo</translation> <translation id="2977665033722899841">Kasalukuyang napili ang <ph name="ROW_NAME" />. <ph name="ROW_CONTENT" /></translation> <translation id="2982481275546140226">I-clear ang Data</translation> @@ -395,7 +394,6 @@ <translation id="3005723025932146533">Ipakita ang naka-save na kopya</translation> <translation id="3008447029300691911">Ilagay ang CVC para sa <ph name="CREDIT_CARD" />. Kapag nagkumpirma ka na, ibabahagi ang mga detalye ng iyong card sa site na ito.</translation> <translation id="3010559122411665027">Listahan ng entry na "<ph name="ENTRY_INDEX" />": <ph name="ERROR" /></translation> -<translation id="3014389611820813634">Bilang manager ng device na ito, <ph name="ENROLLMENT_DOMAIN" />:</translation> <translation id="301521992641321250">Awtomatikong na-block</translation> <translation id="3023071826883856138">You4 (Envelope)</translation> <translation id="3024663005179499861">Maling uri ng patakaran</translation> @@ -441,7 +439,6 @@ <translation id="3287510313208355388">I-download kapag online</translation> <translation id="3293642807462928945">Matuto pa tungkol sa patakarang <ph name="POLICY_NAME" /></translation> <translation id="3303855915957856445">Walang nakitang resulta ng paghahanap</translation> -<translation id="3311730110465560799">Puwedeng malayuang baguhin ang pag-set up ng iyong device.</translation> <translation id="3320021301628644560">Magdagdag ng billing address</translation> <translation id="3324983252691184275">Crimson</translation> <translation id="3338095232262050444">Secure</translation> @@ -537,7 +534,6 @@ <translation id="3761718714832595332">Itago ang status</translation> <translation id="3765032636089507299">Kasalukuyang ginagawa ang Ligtas na Pag-browse.</translation> <translation id="3778403066972421603">Gusto mo bang i-save ang card na ito sa iyong Google Account at sa device na ito?</translation> -<translation id="3779973883630527594">Ang kumpanya, paaralan, o organisasyong namamahala sa account na ito:</translation> <translation id="3781428340399460090">Hot Pink</translation> <translation id="3783418713923659662">Mastercard</translation> <translation id="3787705759683870569">Mag-e-expire sa <ph name="EXPIRATION_MONTH" />/<ph name="EXPIRATION_YEAR" /></translation> @@ -561,6 +557,7 @@ <translation id="3949571496842715403">Hindi mapatunayan ng server na ito na <ph name="DOMAIN" /> ito; hindi tinutukoy ng certificate ng seguridad nito ang Mga Alternatibong Pangalan ng Subject. Maaaring dahil ito sa isang maling configuration o sa isang umaatake na humahadlang sa iyong koneksyon.</translation> <translation id="3949601375789751990">Lalabas dito ang iyong history ng pag-browse</translation> <translation id="3950820424414687140">Mag-sign in</translation> +<translation id="3962859241508114581">Nakaraang Track</translation> <translation id="3963837677003247395">Manual na magpatuloy?</translation> <translation id="3964661563329879394">{COUNT,plural, =0{Wala}=1{Mula sa 1 site }one{Mula sa # site }other{Mula sa # na site }}</translation> <translation id="397105322502079400">Kinakalkula...</translation> @@ -583,6 +580,7 @@ <translation id="410351446219883937">I-autoplay</translation> <translation id="4103763322291513355">Bisitahin ang <strong>chrome://policy</strong> upang makita ang listahan ng mga naka-blacklist na URL at iba pang mga patakaran na ipinapatupad ng iyong system administrator.</translation> <translation id="4110652170750985508">Suriin ang iyong pagbabayad</translation> +<translation id="4112140312785995938">Mag-seek Pabalik</translation> <translation id="4116663294526079822">Palaging payagan sa site na ito</translation> <translation id="4117700440116928470">Hindi sinusuportahan ang saklaw ng patakaran.</translation> <translation id="4129401438321186435">{COUNT,plural, =1{1 pa}one{# pa}other{# pa}}</translation> @@ -661,6 +659,7 @@ <translation id="443673843213245140">Hindi pinagana ang paggamit ng isang proxy ngunit tinutukoy ang isang tahasang configuration ng proxy.</translation> <translation id="445100540951337728">Mga tinatanggap na debit card</translation> <translation id="4466881336512663640">Mawawala ang mga pagbabago sa form. Sigurado ka bang gusto mong magpatuloy?</translation> +<translation id="4477350412780666475">Susunod na Track</translation> <translation id="4482953324121162758">Hindi ita-translate ang site na ito.</translation> <translation id="4490717597759821841">A7</translation> <translation id="4493480324863638523">Di-wastong URL. Dapat ay isang URL na may karaniwang scheme, hal. http://example.com o https://example.com.</translation> @@ -907,7 +906,6 @@ <translation id="5838278095973806738">Hindi ka dapat maglagay ng anumang sensitibong impormasyon sa site na ito (halimbawa, mga password o credit card), dahil maaari itong nakawin ng mga umaatake.</translation> <translation id="5860033963881614850">Naka-off</translation> <translation id="5863847714970149516">Maaari kang singilin sa susunod na page</translation> -<translation id="5865951947699094510">Puwedeng baguhin nang malayuan ang pag-set up ng iyong account.</translation> <translation id="5866257070973731571">Magdagdag ng Numero ng Telepono</translation> <translation id="5869405914158311789">Hindi makakonekta sa site na ito</translation> <translation id="5869522115854928033">Mga naka-save na password</translation> @@ -1060,6 +1058,7 @@ <translation id="6778737459546443941">Hindi pa ito inaaprubahan ng iyong magulang</translation> <translation id="67862343314499040">Violet</translation> <translation id="6786747875388722282">Mga Extension</translation> +<translation id="6790428901817661496">I-play</translation> <translation id="679355240208270552">Binalewala dahil hindi na-enable ng patakaran ang default na paghahanap.</translation> <translation id="681021252041861472">Kinakailangang Field</translation> <translation id="6810899417690483278">Customization ID</translation> @@ -1163,6 +1162,7 @@ <translation id="7353601530677266744">Command Line</translation> <translation id="7372973238305370288">resulta ng paghahanap</translation> <translation id="7377249249140280793"><ph name="RELATIVE_DATE" /> - <ph name="FULL_DATE" /></translation> +<translation id="7378594059915113390">Mga Kontrol ng Media</translation> <translation id="7378627244592794276">Hindi</translation> <translation id="7378810950367401542">/</translation> <translation id="7390545607259442187">Kumpirmahin ang Card</translation> @@ -1266,7 +1266,6 @@ <translation id="780301667611848630">Hindi salamat</translation> <translation id="7805768142964895445">Katayuan</translation> <translation id="7806344367022510803">Baguhin ang mga setting ng Search Engine sa Chrome</translation> -<translation id="7810209002420871817">Bilang manager ng iyong account, <ph name="ACCOUNT_DOMAIN" />:</translation> <translation id="7812922009395017822">Mir</translation> <translation id="7813600968533626083">Alisin ang suhestyon sa Chrome?</translation> <translation id="7815407501681723534">Nakakita ng <ph name="NUMBER_OF_RESULTS" /> <ph name="SEARCH_RESULTS" /> para sa '<ph name="SEARCH_STRING" />'</translation>
diff --git a/components/strings/components_strings_fr.xtb b/components/strings/components_strings_fr.xtb index bafe205..76f19c14 100644 --- a/components/strings/components_strings_fr.xtb +++ b/components/strings/components_strings_fr.xtb
@@ -1,7 +1,6 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="fr"> -<translation id="1001338328714563407">En tant que responsable de votre appareil et de votre compte, <ph name="ENROLLMENT_DOMAIN" /> :</translation> <translation id="1008557486741366299">Pas maintenant</translation> <translation id="1010200102790553230">Charger la page plus tard</translation> <translation id="1015730422737071372">Fournir des informations supplémentaires</translation> @@ -41,6 +40,7 @@ <translation id="1161325031994447685">Reconnectez-vous au réseau Wi-Fi</translation> <translation id="1165039591588034296">Erreur</translation> <translation id="1175364870820465910">Im&primer...</translation> +<translation id="1178581264944972037">Suspendre</translation> <translation id="1181037720776840403">Supprimer</translation> <translation id="1197088940767939838">Orange</translation> <translation id="1201402288615127009">Suivant</translation> @@ -98,7 +98,6 @@ <translation id="1405567553485452995">Vert clair</translation> <translation id="1407135791313364759">Tout ouvrir</translation> <translation id="1413809658975081374">Erreur liée à la confidentialité</translation> -<translation id="14171126816530869">L'identité de <ph name="ORGANIZATION" /> situé à <ph name="LOCALITY" /> a été vérifiée par <ph name="ISSUER" />.</translation> <translation id="1426410128494586442">Oui</translation> <translation id="1430915738399379752">Imprimer</translation> <translation id="1455413310270022028">Gomme</translation> @@ -251,6 +250,7 @@ <translation id="2262243747453050782">Erreur HTTP.</translation> <translation id="2263079731045660823">Mettre à jour la saisie automatique des informations de paiement dans les paramètres de Chrome</translation> <translation id="2270484714375784793">N° de téléphone</translation> +<translation id="2277103315734023688">Avance rapide</translation> <translation id="2283340219607151381">Enregistrer et renseigner les adresses</translation> <translation id="2292556288342944218">Votre accès à Internet est bloqué</translation> <translation id="2297722699537546652">B5 (enveloppe)</translation> @@ -375,7 +375,6 @@ <translation id="295526156371527179">Avertissement : Cette règle n'a pas été fusionnée en tant que dictionnaire comme indiqué par la règle, car ce n'est pas un dictionnaire.</translation> <translation id="2955913368246107853">Fermer la barre de recherche</translation> <translation id="2969319727213777354">Afin d'établir une connexion sécurisée, votre horloge doit être réglée correctement. Les certificats permettant aux sites Web de s'identifier sont en effet valides pendant une période précise. Comme l'horloge de votre appareil est incorrecte, Google Chrome n'est pas en mesure de vérifier la validité des certificats.</translation> -<translation id="2970515157925768593">Peut modifier à distance la configuration de votre appareil et de votre compte.</translation> <translation id="2972581237482394796">&Rétablir</translation> <translation id="2977665033722899841">La ligne "<ph name="ROW_NAME" />" est sélectionnée. <ph name="ROW_CONTENT" /></translation> <translation id="2982481275546140226">Effacer les données</translation> @@ -387,7 +386,6 @@ <translation id="3005723025932146533">Afficher la copie enregistrée</translation> <translation id="3008447029300691911">Saisissez le code CVC de la carte <ph name="CREDIT_CARD" />. Une fois la validation terminée, les informations relatives à la carte seront partagées avec ce site.</translation> <translation id="3010559122411665027">Entrée de la liste "<ph name="ENTRY_INDEX" />" : <ph name="ERROR" /></translation> -<translation id="3014389611820813634">En tant que responsable de cet appareil, <ph name="ENROLLMENT_DOMAIN" /> :</translation> <translation id="301521992641321250">Bloquée automatiquement</translation> <translation id="3023071826883856138">You4 (enveloppe)</translation> <translation id="3024663005179499861">Type de règle incorrect.</translation> @@ -433,7 +431,6 @@ <translation id="3287510313208355388">Télécharger une fois connecté</translation> <translation id="3293642807462928945">En savoir plus sur les règles <ph name="POLICY_NAME" />.</translation> <translation id="3303855915957856445">Aucun résultat de recherche n'a été trouvé.</translation> -<translation id="3311730110465560799">Peut modifier à distance la configuration de votre appareil.</translation> <translation id="3320021301628644560">Ajouter une adresse de facturation</translation> <translation id="3324983252691184275">Pourpre</translation> <translation id="3338095232262050444">Sécurisé</translation> @@ -529,7 +526,6 @@ <translation id="3761718714832595332">Masquer l'état</translation> <translation id="3765032636089507299">La page de navigation sécurisée est en cours de création.</translation> <translation id="3778403066972421603">Voulez-vous enregistrer cette carte dans votre compte Google et sur cet appareil ?</translation> -<translation id="3779973883630527594">L'entreprise, l'établissement ou l'organisation qui gère ce compte :</translation> <translation id="3781428340399460090">Rose foncé</translation> <translation id="3783418713923659662">Mastercard</translation> <translation id="3787705759683870569">Expire en <ph name="EXPIRATION_MONTH" />/<ph name="EXPIRATION_YEAR" /></translation> @@ -553,6 +549,7 @@ <translation id="3949571496842715403">Impossible de vérifier que ce serveur est bien <ph name="DOMAIN" />, car son certificat de sécurité ne contient pas l'extension "Subject Alternative Names" (Autres noms de l'objet). Cela peut être dû à une mauvaise configuration ou à l'interception de votre connexion par un pirate informatique.</translation> <translation id="3949601375789751990">Votre historique de navigation s'affiche ici</translation> <translation id="3950820424414687140">Ouvrir une session</translation> +<translation id="3962859241508114581">Titre précédent</translation> <translation id="3963837677003247395">Continuer manuellement ?</translation> <translation id="3964661563329879394">{COUNT,plural, =0{Aucun}=1{De 1 site }one{De # site }other{De # sites }}</translation> <translation id="397105322502079400">Calcul en cours…</translation> @@ -575,6 +572,7 @@ <translation id="410351446219883937">Lecture automatique</translation> <translation id="4103763322291513355">Accédez à <strong>chrome://policy</strong> pour consulter une liste des URL ajoutées à la liste noire et des autres règles définies par votre administrateur système.</translation> <translation id="4110652170750985508">Vérifier votre paiement</translation> +<translation id="4112140312785995938">Retour rapide</translation> <translation id="4116663294526079822">Toujours autoriser sur ce site</translation> <translation id="4117700440116928470">La portée de la règle n'est pas compatible.</translation> <translation id="4129401438321186435">{COUNT,plural, =1{1 autre}one{# autre}other{# autres}}</translation> @@ -653,6 +651,7 @@ <translation id="443673843213245140">L'utilisation d'un proxy est désactivée, mais une configuration de proxy explicite est spécifiée.</translation> <translation id="445100540951337728">Cartes de débit acceptées</translation> <translation id="4466881336512663640">Les modifications apportées au formulaire seront perdues. Voulez-vous vraiment continuer ?</translation> +<translation id="4477350412780666475">Titre suivant</translation> <translation id="4482953324121162758">Ce site ne sera pas traduit.</translation> <translation id="4490717597759821841">A7</translation> <translation id="4493480324863638523">URL non valide : vous devez saisir une URL avec un schéma standard, comme http://example.com ou https://example.com.</translation> @@ -899,7 +898,6 @@ <translation id="5838278095973806738">Vous ne devriez pas saisir d'informations sensibles sur ce site (par exemple, vos mots de passe ou les informations de votre carte de paiement), car elles risquent d'être dérobées par des pirates informatiques.</translation> <translation id="5860033963881614850">Désactivé</translation> <translation id="5863847714970149516">Il se peut que l'accès à la page suivante engendre des frais</translation> -<translation id="5865951947699094510">Peut modifier à distance la configuration de votre compte.</translation> <translation id="5866257070973731571">Ajouter un numéro de téléphone</translation> <translation id="5869405914158311789">Ce site est inaccessible</translation> <translation id="5869522115854928033">Mots de passe enregistrés</translation> @@ -1052,6 +1050,7 @@ <translation id="6778737459546443941">Tes parents ne l'ont pas encore autorisé</translation> <translation id="67862343314499040">Mauve</translation> <translation id="6786747875388722282">Extensions</translation> +<translation id="6790428901817661496">Lire</translation> <translation id="679355240208270552">Règle ignorée, car le moteur de recherche par défaut n'est pas activé par une règle.</translation> <translation id="681021252041861472">Champ obligatoire</translation> <translation id="6810899417690483278">ID de la personnalisation</translation> @@ -1096,6 +1095,7 @@ <translation id="7053983685419859001">Bloquer</translation> <translation id="7062635574500127092">Turquoise</translation> <translation id="7064851114919012435">Coordonnées</translation> +<translation id="7075452647191940183">Requête trop volumineuse</translation> <translation id="7079718277001814089">Ce site contient des logiciels malveillants</translation> <translation id="7087282848513945231">Comté</translation> <translation id="7090678807593890770">Effectuez une recherche Google sur <ph name="LINK" />.</translation> @@ -1152,6 +1152,7 @@ <translation id="7353601530677266744">Ligne de commande</translation> <translation id="7372973238305370288">résultat de recherche</translation> <translation id="7377249249140280793"><ph name="RELATIVE_DATE" /> - <ph name="FULL_DATE" /></translation> +<translation id="7378594059915113390">Commandes multimédias</translation> <translation id="7378627244592794276">Non</translation> <translation id="7378810950367401542">/</translation> <translation id="7390545607259442187">Valider la carte</translation> @@ -1255,7 +1256,6 @@ <translation id="780301667611848630">Non merci</translation> <translation id="7805768142964895445">État</translation> <translation id="7806344367022510803">Modifier les paramètres de moteur de recherche dans Chrome</translation> -<translation id="7810209002420871817">En tant que responsable de votre compte, <ph name="ACCOUNT_DOMAIN" /> :</translation> <translation id="7812922009395017822">Mir</translation> <translation id="7813600968533626083">Supprimer la suggestion de saisie de formulaire de Chrome ?</translation> <translation id="7815407501681723534"><ph name="NUMBER_OF_RESULTS" /> <ph name="SEARCH_RESULTS" /> trouvé(s) pour "<ph name="SEARCH_STRING" />"</translation>
diff --git a/components/strings/components_strings_gu.xtb b/components/strings/components_strings_gu.xtb index 637ce21d..8880ac34 100644 --- a/components/strings/components_strings_gu.xtb +++ b/components/strings/components_strings_gu.xtb
@@ -1,7 +1,6 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="gu"> -<translation id="1001338328714563407">તમારા ડિવાઇસ અને એકાઉન્ટના મેનેજર તરીકે, <ph name="ENROLLMENT_DOMAIN" />:</translation> <translation id="1008557486741366299">હમણાં નહીં</translation> <translation id="1010200102790553230">પેજ પછીથી લોડ કરો</translation> <translation id="1015730422737071372">અતિરિક્ત વિગતો પ્રદાન કરો</translation> @@ -41,6 +40,7 @@ <translation id="1161325031994447685">વાઇ-ફાઇ સાથે ફરીથી કનેક્ટ કરીને</translation> <translation id="1165039591588034296">ભૂલ</translation> <translation id="1175364870820465910">&છાપો...</translation> +<translation id="1178581264944972037">થોભો</translation> <translation id="1181037720776840403">કાઢી નાખો</translation> <translation id="1197088940767939838">નારંગી</translation> <translation id="1201402288615127009">આગલું</translation> @@ -100,7 +100,6 @@ <translation id="1405567553485452995">આછો લીલો</translation> <translation id="1407135791313364759">બધું ખોલો</translation> <translation id="1413809658975081374">ગોપનીયતા ભૂલ</translation> -<translation id="14171126816530869"><ph name="LOCALITY" /> માં <ph name="ORGANIZATION" /> ની ઓળખાણ <ph name="ISSUER" /> દ્વારા ચકાસવામાં આવી છે.</translation> <translation id="1426410128494586442">હા</translation> <translation id="1430915738399379752">પ્રિન્ટ</translation> <translation id="1455413310270022028">ઇરેઝર</translation> @@ -256,6 +255,7 @@ <translation id="2262243747453050782">HTTP ભૂલ</translation> <translation id="2263079731045660823">Chrome સેટિંગમાં ક્રેડિટ કાર્ડ ઑટોમેટિક રીતે ભરવાની માહિતીને અપડેટ કરો</translation> <translation id="2270484714375784793">ફોન નંબર</translation> +<translation id="2277103315734023688">આગળ લઈ જાઓ</translation> <translation id="2283340219607151381">સરનામાં સાચવો અને ભરો</translation> <translation id="2292556288342944218">તમારી ઇન્ટરનેટ ઍક્સેસ અવરોધિત છે</translation> <translation id="2297722699537546652">B5 (એન્વલપ)</translation> @@ -383,7 +383,6 @@ <translation id="295526156371527179">ચેતવણી: નીતિમાં ઉલ્લેખ કર્યા મુજબ આ નીતિને શબ્દકોશ તરીકે મર્જ કરવામાં આવી ન હતી, કારણ કે તે શબ્દકોશ નથી.</translation> <translation id="2955913368246107853">શોધ બાર બંધ કરો</translation> <translation id="2969319727213777354">એક સુરક્ષિત કનેક્શન સ્થાપિત કરવા માટે, તમારી ઘડિયાળ યોગ્ય રીતે સેટ હોવી જરૂરી છે. આનું કારણ એ કે વેબસાઇટ્સ તેઓને ઓળખવા માટે જે પ્રમાણપત્રોનો ઉપયોગ કરે છે તે ચોક્કસ સમય અવધિ માટે જ માન્ય હોય છે. તમારા ઉપકરણની ઘડિયાળ ખોટી હોવાને લીધે, Google Chrome આ પ્રમાણપત્રોને ચકાસી શકતું નથી.</translation> -<translation id="2970515157925768593">તમારા ડિવાઇસનું અને એકાઉન્ટનું સેટઅપ રિમોટલી બદલી શકે છે.</translation> <translation id="2972581237482394796">&ફરી કરો</translation> <translation id="2977665033722899841"><ph name="ROW_NAME" />, વર્તમાનમાં પસંદ કરેલ. <ph name="ROW_CONTENT" /></translation> <translation id="2982481275546140226">ડેટા સાફ કરો</translation> @@ -395,7 +394,6 @@ <translation id="3005723025932146533">સાચવેલી કૉપિ બતાવો</translation> <translation id="3008447029300691911"><ph name="CREDIT_CARD" /> માટે CVC દાખલ કરો. એકવાર તમે ખાતરી કરી લો, તે પછી આ સાઇટ સાથે તમારા કાર્ડની વિગતો શેર કરવામાં આવશે.</translation> <translation id="3010559122411665027">"<ph name="ENTRY_INDEX" />" એન્ટ્રીને સૂચિબદ્ધ કરો: <ph name="ERROR" /></translation> -<translation id="3014389611820813634">આ ડિવાઇસના મેનેજર તરીકે, <ph name="ENROLLMENT_DOMAIN" />:</translation> <translation id="301521992641321250">આપમેળે અવરોધિત</translation> <translation id="3023071826883856138">You4 (એન્વલપ)</translation> <translation id="3024663005179499861">ખોટો નીતિ પ્રકાર</translation> @@ -441,7 +439,6 @@ <translation id="3287510313208355388">ઑનલાઇન હોય ત્યારે ડાઉનલોડ કરો</translation> <translation id="3293642807462928945"><ph name="POLICY_NAME" /> નીતિ વિશે વધુ જાણો</translation> <translation id="3303855915957856445">કોઈ શોધ પરિણામો મળ્યાં નથી</translation> -<translation id="3311730110465560799">તમારા ડિવાઇસનું સેટઅપ રિમોટલી બદલી શકે છે.</translation> <translation id="3320021301628644560">બિલિંગ સરનામું ઉમેરો</translation> <translation id="3324983252691184275">કિરમજી</translation> <translation id="3338095232262050444">સુરક્ષિત</translation> @@ -536,7 +533,6 @@ <translation id="3761718714832595332">સ્ટેટસ છુપાવો</translation> <translation id="3765032636089507299">Safe Browsing પેજ રચના હેઠળ છે.</translation> <translation id="3778403066972421603">શું તમે આ કાર્ડને તમારા Google એકાઉન્ટ અને આ ડિવાઇસ પર સાચવવા માગો છો?</translation> -<translation id="3779973883630527594">આ એકાઉન્ટને મેનેજ કરનાર કંપની, શાળા અથવા સંસ્થા:</translation> <translation id="3781428340399460090">ચળકતો ગુલાબી</translation> <translation id="3783418713923659662">Mastercard</translation> <translation id="3787705759683870569"><ph name="EXPIRATION_MONTH" />/<ph name="EXPIRATION_YEAR" /> માં સમાપ્ત થાય છે</translation> @@ -560,6 +556,7 @@ <translation id="3949571496842715403">આ સર્વર સાબિત કરી શક્યું નથી કે તે <ph name="DOMAIN" /> છે; તેનું સુરક્ષા પ્રમાણપત્ર વિષય વૈકલ્પિક નામનો ઉલ્લેખ કરતું નથી. આ કોઈ ખોટી ગોઠવણીને કારણે અથવા કોઈ હુમલાખોર તમારા કનેક્શનને અટકાવતો હોવાને કારણે બન્યું હોઈ શકે.</translation> <translation id="3949601375789751990">તમારો બ્રાઉઝિંગ ઇતિહાસ અહીં દેખાય છે</translation> <translation id="3950820424414687140">સાઇન ઇન</translation> +<translation id="3962859241508114581">પાછલું ટ્રૅક</translation> <translation id="3963837677003247395">મેન્યુઅલી ચાલુ રાખીએ?</translation> <translation id="3964661563329879394">{COUNT,plural, =0{કોઈ નહીં}=1{1 સાઇટમાંથી }one{# સાઇટમાંથી }other{# સાઇટમાંથી }}</translation> <translation id="397105322502079400">ગણના કરી રહ્યું છે...</translation> @@ -582,6 +579,7 @@ <translation id="410351446219883937">ઑટોપ્લે</translation> <translation id="4103763322291513355">બ્લેકલિસ્ટ કરેલા URL ની સૂચિ અને તમારા સિસ્ટમ વ્યવસ્થાપક દ્વારા લાગુ અન્ય નીતિઓ જોવા માટે <strong>chrome://policy</strong> ની મુલાકાત લો.</translation> <translation id="4110652170750985508">તમારી ચુકવણીને રિવ્યૂ કરો</translation> +<translation id="4112140312785995938">પાછળ કરો</translation> <translation id="4116663294526079822">હંમેશા આ સાઇટ પર મંજૂરી આપો</translation> <translation id="4117700440116928470">નીતિ મર્યાદા સમર્થિત નથી.</translation> <translation id="4129401438321186435">{COUNT,plural, =1{1 અન્ય}one{# અન્ય}other{# અન્ય}}</translation> @@ -660,6 +658,7 @@ <translation id="443673843213245140">પ્રૉક્સીનો ઉપયોગ બંધ કરેલો છે પણ એક સ્પષ્ટ પ્રૉક્સી ગોઠવણીનો ઉલ્લેખ કરેલો છે.</translation> <translation id="445100540951337728">સ્વીકૃત ડેબિટ કાર્ડ</translation> <translation id="4466881336512663640">ફોર્મના ફેરફારો ગુમાવશો. શું તમે ખરેખર ચાલુ રાખવા માગો છો?</translation> +<translation id="4477350412780666475">આગલો ટ્રૅક</translation> <translation id="4482953324121162758">આ સાઇટનો અનુવાદ થશે નહીં.</translation> <translation id="4490717597759821841">A7</translation> <translation id="4493480324863638523">અમાન્ય URL. કોઈ માનક સ્કીમ ધરાવતું URL હોવું આવશ્યક છે, દા.ત. http://example.com અથવા https://example.com.</translation> @@ -906,7 +905,6 @@ <translation id="5838278095973806738">તમારે આ સાઇટ પર કોઈપણ સંવેદનશીલ માહિતી (ઉદાહરણ તરીકે, પાસવર્ડ્સ અથવા ક્રેડિટ કાર્ડ્સ) દાખલ કરવી જોઈએ નહીં, કારણ કે તે હુમલાખોર દ્વારા ચોરવામાં આવી શકે છે.</translation> <translation id="5860033963881614850">બંધ</translation> <translation id="5863847714970149516">આગળનું પેજ તમને શુલ્ક લાગુ કરી શકે છે</translation> -<translation id="5865951947699094510">તમારા એકાઉન્ટનું સેટઅપ રિમોટલી બદલી શકે છે.</translation> <translation id="5866257070973731571">ફોન નંબર ઉમેરો</translation> <translation id="5869405914158311789">આ સાઇટ પર પહોંચી શકાતું નથી</translation> <translation id="5869522115854928033">સાચવેલા પાસવર્ડ્સ</translation> @@ -1059,6 +1057,7 @@ <translation id="6778737459546443941">તમારા માતાપિતાએ હજી સુધી તેને મંજૂર કરેલ નથી</translation> <translation id="67862343314499040">જાંબુડિયો</translation> <translation id="6786747875388722282">એક્સ્ટેન્શન્સ</translation> +<translation id="6790428901817661496">ચલાવો</translation> <translation id="679355240208270552">અવગણના કરી, કારણ કે નીતિએ ડિફૉલ્ટ શોધ બંધ કરેલ છે.</translation> <translation id="681021252041861472">ફરજિયાત</translation> <translation id="6810899417690483278">કસ્ટમાઇઝેશન ID</translation> @@ -1162,6 +1161,7 @@ <translation id="7353601530677266744">આદેશ પંક્તિ</translation> <translation id="7372973238305370288">શોધ પરિણામ</translation> <translation id="7377249249140280793"><ph name="RELATIVE_DATE" /> - <ph name="FULL_DATE" /></translation> +<translation id="7378594059915113390">મીડિયા નિયંત્રણો</translation> <translation id="7378627244592794276">ના</translation> <translation id="7378810950367401542">/</translation> <translation id="7390545607259442187">કાર્ડની પુષ્ટિ કરો</translation> @@ -1265,7 +1265,6 @@ <translation id="780301667611848630">નહીં, આભાર</translation> <translation id="7805768142964895445">સ્થિતિ</translation> <translation id="7806344367022510803">Chromeમાં સર્ચ એંજિનની સેટિંગ બદલો</translation> -<translation id="7810209002420871817">તમારા <ph name="ACCOUNT_DOMAIN" /> એકાઉન્ટના મેનેજર તરીકે:</translation> <translation id="7812922009395017822">Mir</translation> <translation id="7813600968533626083">Chrome માંથી ફોર્મ સૂચનો દૂર કરીએ?</translation> <translation id="7815407501681723534">'<ph name="SEARCH_STRING" />' માટે <ph name="NUMBER_OF_RESULTS" /> <ph name="SEARCH_RESULTS" /> મળ્યાં</translation>
diff --git a/components/strings/components_strings_hi.xtb b/components/strings/components_strings_hi.xtb index 5ba3f964..2a90f46 100644 --- a/components/strings/components_strings_hi.xtb +++ b/components/strings/components_strings_hi.xtb
@@ -1,7 +1,6 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="hi"> -<translation id="1001338328714563407">आपके डिवाइस और खाते का प्रबंधक होने के नाते, <ph name="ENROLLMENT_DOMAIN" />:</translation> <translation id="1008557486741366299">अभी नहीं</translation> <translation id="1010200102790553230">पेज को बाद में लोड करें</translation> <translation id="1015730422737071372">अतिरिक्त विवरण प्रदान करें</translation> @@ -41,6 +40,7 @@ <translation id="1161325031994447685">वाई-फ़ाई से फिर से कनेक्ट करें</translation> <translation id="1165039591588034296">गड़बड़ी</translation> <translation id="1175364870820465910">&प्रिंट करें...</translation> +<translation id="1178581264944972037">रोकें</translation> <translation id="1181037720776840403">हटाएं</translation> <translation id="1197088940767939838">नारंगी</translation> <translation id="1201402288615127009">अगला</translation> @@ -99,7 +99,6 @@ <translation id="1405567553485452995">हल्का हरा</translation> <translation id="1407135791313364759">सभी बुकमार्क खोलें</translation> <translation id="1413809658975081374">निजता गड़बड़ी</translation> -<translation id="14171126816530869"><ph name="ORGANIZATION" /> की पहचान <ph name="LOCALITY" /> में <ph name="ISSUER" /> द्वारा सत्यापित की गई है.</translation> <translation id="1426410128494586442">हां</translation> <translation id="1430915738399379752">प्रिंट करें</translation> <translation id="1455413310270022028">इरेज़र</translation> @@ -177,7 +176,7 @@ <translation id="1800473098294731951">बी9</translation> <translation id="1803264062614276815">कार्ड के मालिक का नाम</translation> <translation id="1821930232296380041">अमान्य अनुरोध या अनुरोध पैरामीटर</translation> -<translation id="1822370876374026111">अगली बार तेज़ी से भुगतान करने के लिए, अपने कार्ड और बिलिंग के पते को अपने Google खाते में और इस डिवाइस में जोड़ें.</translation> +<translation id="1822370876374026111">अगली बार तेज़ी से भुगतान करने के लिए, अपने कार्ड और बिलिंग के पते को अपने Google खाते और इस डिवाइस में जोड़ें.</translation> <translation id="1822540298136254167">आप किन वेबसाइटों पर जाते हैं और उन पर कितना समय देते हैं</translation> <translation id="1826516787628120939">जाँच की जा रही है</translation> <translation id="1834321415901700177">इस साइट में हानिकारक प्रोग्राम हैं</translation> @@ -255,6 +254,7 @@ <translation id="2262243747453050782">HTTP गड़बड़ी</translation> <translation id="2263079731045660823">Chrome सेटिंग में जाकर क्रेडिट कार्ड जानकारी अपने आप भरने की सुविधा अपडेट करें</translation> <translation id="2270484714375784793">फ़ोन नंबर</translation> +<translation id="2277103315734023688">आगे बढ़ाएं</translation> <translation id="2283340219607151381">पतों की जानकारी सेव करें और फ़ॉर्म में भरें</translation> <translation id="2292556288342944218">आपका इंटरनेट कनेक्शन ब्लॉक कर दिया गया है</translation> <translation id="2297722699537546652">बी5 (एन्वेलप)</translation> @@ -382,7 +382,6 @@ <translation id="295526156371527179">चेतावनी: इस नीति को शब्दकोश के तौर पर नीति के बताए अनुसार मिलाया नहीं जा सकता, क्योंकि यह शब्दकोश नहीं है.</translation> <translation id="2955913368246107853">खोज बार बंद करें</translation> <translation id="2969319727213777354">सुरक्षित कनेक्शन स्थापित करने के लिए, आपकी घड़ी को सही तरीके से सेट किए जाने की आवश्यकता है. ऐसा इसलिए क्योंकि वेबसाइटों द्वारा स्वयं की पहचान करने के लिए उपयोग किए जाने वाले प्रमाणपत्र केवल विशिष्ट समयावधियों के लिए ही मान्य होते हैं. चूंकि आपके डिवाइस की घड़ी गलत है, इसलिए Google Chrome इन प्रमाणपत्रों का सत्यापन नहीं कर सकता.</translation> -<translation id="2970515157925768593">आपके डिवाइस और खाता सेटअप में दूर से बदलाव कर सकती है.</translation> <translation id="2972581237482394796">&फिर से करें</translation> <translation id="2977665033722899841"><ph name="ROW_NAME" />, इस समय चुना गया है. <ph name="ROW_CONTENT" /></translation> <translation id="2982481275546140226">डेटा हटाएं</translation> @@ -394,7 +393,6 @@ <translation id="3005723025932146533">सहेजी गई कॉपी दिखाएं</translation> <translation id="3008447029300691911"><ph name="CREDIT_CARD" /> का CVC डालें. आपकी तरफ से पुष्टि हो जाने पर, आपके कार्ड के विवरण इस साइट के साथ शेयर किए जाएंगे.</translation> <translation id="3010559122411665027">सूची प्रविष्टि "<ph name="ENTRY_INDEX" />": <ph name="ERROR" /></translation> -<translation id="3014389611820813634">इस डिवाइस का प्रबंधक होने के नाते, <ph name="ENROLLMENT_DOMAIN" />:</translation> <translation id="301521992641321250">ऑटोमैटिक रूप से ब्लॉक है</translation> <translation id="3023071826883856138">यू4 (एन्वेलप)</translation> <translation id="3024663005179499861">गलत नीति प्रकार</translation> @@ -439,7 +437,6 @@ <translation id="3287510313208355388">ऑनलाइन होने पर डाउनलोड करें</translation> <translation id="3293642807462928945"><ph name="POLICY_NAME" /> नीति के बारे में ज़्यादा जानें</translation> <translation id="3303855915957856445">कोई खोज नतीजे नहीं मिले</translation> -<translation id="3311730110465560799">आपके डिवाइस का सेटअप दूर से बदल सकती है.</translation> <translation id="3320021301628644560">बिलिंग पता जोड़ें</translation> <translation id="3324983252691184275">गहरा लाल</translation> <translation id="3338095232262050444">सुरक्षित</translation> @@ -535,7 +532,6 @@ <translation id="3761718714832595332">स्थिति छिपाएं</translation> <translation id="3765032636089507299">सुरक्षित ब्राउज़िंग पेज अभी बन रहा है.</translation> <translation id="3778403066972421603">क्या आप इस कार्ड को अपने Google खाते में और इस डिवाइस में सेव करना चाहते हैं?</translation> -<translation id="3779973883630527594">वह कंपनी, स्कूल या संगठन जो इस खाते का प्रबंधन करता है:</translation> <translation id="3781428340399460090">चमकीला गुलाबी</translation> <translation id="3783418713923659662">Mastercard</translation> <translation id="3787705759683870569"><ph name="EXPIRATION_MONTH" />/<ph name="EXPIRATION_YEAR" /> में खत्म होगा</translation> @@ -559,6 +555,7 @@ <translation id="3949571496842715403">यह सर्वर प्रमाणित नहीं कर सका कि यह <ph name="DOMAIN" /> है; इसके सुरक्षा प्रमाणपत्र में विषय के वैकल्पिक नाम नहीं बताए गए हैं. ऐसा गलत कॉन्फ़िगरेशन के कारण या किसी आक्रमणकर्ता की ओर से आपके कनेक्शन में अवरोध डालने के कारण हो सकता है.</translation> <translation id="3949601375789751990">आपका ब्राउज़िंग इतिहास यहां दिखाई देता है</translation> <translation id="3950820424414687140">साइन इन करें</translation> +<translation id="3962859241508114581">पिछला ट्रैक</translation> <translation id="3963837677003247395">क्या आप मैन्युअल तरीके से जारी रखना चाहते हैं?</translation> <translation id="3964661563329879394">{COUNT,plural, =0{कुछ नहीं}=1{1 साइट से }one{# साइटों से }other{# साइटों से }}</translation> <translation id="397105322502079400">गणना की जा रही है...</translation> @@ -581,6 +578,7 @@ <translation id="410351446219883937">अपने आप चलाएं</translation> <translation id="4103763322291513355">प्रतिबंधित किए गए यूआरएल और आपके सिस्टम ए़़डमिन ने जिन अन्य नीतियों को लागू किया है, उन्हें देखने के लिए <strong>chrome://policy</strong> पर जाएं.</translation> <translation id="4110652170750985508">अपना भुगतान देखें</translation> +<translation id="4112140312785995938">पीछे जाएं</translation> <translation id="4116663294526079822">इस साइट पर हमेशा अनुमति दें</translation> <translation id="4117700440116928470">नीति क्षेत्र समर्थित नहीं है.</translation> <translation id="4129401438321186435">{COUNT,plural, =1{1 अन्य}one{# अन्य}other{# अन्य}}</translation> @@ -659,6 +657,7 @@ <translation id="443673843213245140">प्रॉक्सी का उपयोग अक्षम है लेकिन कोई स्पष्ट प्रॉक्सी कॉन्फ़िगरेशन निर्दिष्ट किया गया है.</translation> <translation id="445100540951337728">स्वीकृत डेबिट कार्ड</translation> <translation id="4466881336512663640">फ़ॉर्म में किए गए बदलाव हटा दिए जाएँगे. क्या आप वाकई जारी रखना चाहते हैं?</translation> +<translation id="4477350412780666475">अगला ट्रैक</translation> <translation id="4482953324121162758">इस साइट का अनुवाद नहीं किया जाएगा.</translation> <translation id="4490717597759821841">ए7</translation> <translation id="4493480324863638523">यूआरएल गलत है. यूआरएल में सामान्य स्कीम, जैसे कि, http://example.com या https://example.com.ज़रूर होनी चाहिए.</translation> @@ -905,7 +904,6 @@ <translation id="5838278095973806738">आपको इस साइट पर कोई भी संवेदनशील जानकारी (उदाहरण के लिए, पासवर्ड या क्रेडिट कार्ड) नहीं डालनी चाहिए, क्योंकि उसे हमलावर चुरा सकते हैं.</translation> <translation id="5860033963881614850">बंद</translation> <translation id="5863847714970149516">आगे आने वाला पेज आपसे शुल्क लेने की कोशिश कर सकता है</translation> -<translation id="5865951947699094510">आपके खाता सेटअप में दूर से बदलाव कर सकती है.</translation> <translation id="5866257070973731571">फ़ोन नंबर जोड़ें</translation> <translation id="5869405914158311789">इस साइट तक नहीं पहुंचा जा सकता</translation> <translation id="5869522115854928033">सेव किए गए पासवर्ड</translation> @@ -1036,7 +1034,7 @@ <translation id="6626291197371920147">मान्य कार्ड नंबर जोड़ें</translation> <translation id="6628463337424475685"><ph name="ENGINE" /> सर्च</translation> <translation id="6630809736994426279">इस समय <ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" /> पर मौजूद हमलावर आपके Mac पर ऐसे खतरनाक प्रोग्राम इंस्टॉल करने की कोशिश कर सकते हैं जो आपकी जानकारी (उदाहरण के लिए, फ़ोटो, पासवर्ड, संदेश और क्रेडिट कार्ड) चुराते हैं या उसे मिटा देते हैं. <ph name="BEGIN_LEARN_MORE_LINK" />ज़्यादा जानें<ph name="END_LEARN_MORE_LINK" /></translation> -<translation id="6631202559048444592">इस नीति के लिए, एक से ज़्यादा स्रोत मौजूद हैं, लेकिन इनके मान एक जैसे हैं.</translation> +<translation id="6631202559048444592">इस नीति के लिए एक से ज़्यादा स्रोत मौजूद हैं, लेकिन इनके मान एक जैसे हैं.</translation> <translation id="6643016212128521049">साफ़ करें</translation> <translation id="6644283850729428850">यह नीति हटा दी गई है.</translation> <translation id="6646269444027925224">{COUNT,plural, =0{कोई नहीं}=1{1 साइट से (आप अपने Google खाते से साइन आउट नहीं होंगे)}one{# साइटों से (आप अपने Google खाते से साइन आउट नहीं होंगे)}other{# साइटों से (आप अपने Google खाते से साइन आउट नहीं होंगे)}}</translation> @@ -1058,6 +1056,7 @@ <translation id="6778737459546443941">आपके अभिभावक ने अभी तक इसकी अनुमति नहीं दी है</translation> <translation id="67862343314499040">बैंगनी</translation> <translation id="6786747875388722282">एक्सटेंशन</translation> +<translation id="6790428901817661496">चलाएं</translation> <translation id="679355240208270552">अनदेखा किया गया क्योंकि नीति ने डिफ़ॉल्ट सर्च चालू नहीं किया है.</translation> <translation id="681021252041861472">ज़रूरी फ़ील्ड</translation> <translation id="6810899417690483278">कस्टमाइज़ेशन आईडी</translation> @@ -1161,6 +1160,7 @@ <translation id="7353601530677266744">कमांड लाइन</translation> <translation id="7372973238305370288">खोज नतीजे</translation> <translation id="7377249249140280793"><ph name="RELATIVE_DATE" /> - <ph name="FULL_DATE" /></translation> +<translation id="7378594059915113390">मीडिया नियंत्रण</translation> <translation id="7378627244592794276">नहीं</translation> <translation id="7378810950367401542">/</translation> <translation id="7390545607259442187">कार्ड की पुष्टि करें</translation> @@ -1264,7 +1264,6 @@ <translation id="780301667611848630">नहीं, रहने दें</translation> <translation id="7805768142964895445">स्थिति</translation> <translation id="7806344367022510803">Chrome में जाकर 'सर्च इंजन' सेटिंग बदलें</translation> -<translation id="7810209002420871817">अपने खाते <ph name="ACCOUNT_DOMAIN" /> का प्रबंधक होने के नाते:</translation> <translation id="7812922009395017822">Mir</translation> <translation id="7813600968533626083">Chrome से फ़ॉर्म सुझाव को निकालें?</translation> <translation id="7815407501681723534">'<ph name="SEARCH_STRING" />' के लिए <ph name="NUMBER_OF_RESULTS" /> <ph name="SEARCH_RESULTS" /> मिले</translation>
diff --git a/components/strings/components_strings_hr.xtb b/components/strings/components_strings_hr.xtb index 898b26a..457c983d 100644 --- a/components/strings/components_strings_hr.xtb +++ b/components/strings/components_strings_hr.xtb
@@ -1,7 +1,6 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="hr"> -<translation id="1001338328714563407">Kao upravitelj vašeg uređaja i računa <ph name="ENROLLMENT_DOMAIN" />:</translation> <translation id="1008557486741366299">Ne sada</translation> <translation id="1010200102790553230">Učitaj stranicu kasnije</translation> <translation id="1015730422737071372">Navedite dodatne pojedinosti</translation> @@ -41,6 +40,7 @@ <translation id="1161325031994447685">Ponovo se povežite s Wi-Fi mrežom</translation> <translation id="1165039591588034296">Pogreška</translation> <translation id="1175364870820465910">&Ispis...</translation> +<translation id="1178581264944972037">Pauziraj</translation> <translation id="1181037720776840403">Ukloni</translation> <translation id="1197088940767939838">Narančasta</translation> <translation id="1201402288615127009">Dalje</translation> @@ -100,7 +100,6 @@ <translation id="1405567553485452995">Svijetlozelena</translation> <translation id="1407135791313364759">Otvori sve</translation> <translation id="1413809658975081374">Pogreška privatnosti</translation> -<translation id="14171126816530869">Identitet za <ph name="ORGANIZATION" />na <ph name="LOCALITY" /> ovjerio je <ph name="ISSUER" />.</translation> <translation id="1426410128494586442">Da</translation> <translation id="1430915738399379752">Ispis</translation> <translation id="1455413310270022028">Gumica</translation> @@ -256,6 +255,7 @@ <translation id="2262243747453050782">HTTP pogreška</translation> <translation id="2263079731045660823">Ažurirajte podatke za automatsko popunjavanje kreditne kartice u postavkama Chromea</translation> <translation id="2270484714375784793">Telefonski broj</translation> +<translation id="2277103315734023688">Traži prema naprijed</translation> <translation id="2283340219607151381">Spremi i popuni adrese</translation> <translation id="2292556288342944218">Internetski je pristup blokiran</translation> <translation id="2297722699537546652">B5 (omotnica)</translation> @@ -383,7 +383,6 @@ <translation id="295526156371527179">Upozorenje: pravilo nije spojeno kao rječnik prema uputama u pravilu jer se ne radi o rječniku.</translation> <translation id="2955913368246107853">Zatvori traku za traženje</translation> <translation id="2969319727213777354">Za uspostavu sigurne veze sat mora biti točno postavljen jer certifikati pomoću kojih se web-lokacije međusobno identificiraju vrijede samo određeno vrijeme. Budući da vaš sat nije točan, Chrome ne može potvrditi te certifikate.</translation> -<translation id="2970515157925768593">može daljinski promijeniti postavke uređaja i računa.</translation> <translation id="2972581237482394796">&Vrati poništeno</translation> <translation id="2977665033722899841"><ph name="ROW_NAME" />, trenutačno odabrano. <ph name="ROW_CONTENT" /></translation> <translation id="2982481275546140226">Izbriši podatke</translation> @@ -395,7 +394,6 @@ <translation id="3005723025932146533">Prikaži spremljenu kopiju</translation> <translation id="3008447029300691911">Unesite CVC za karticu <ph name="CREDIT_CARD" />. Nakon što ih potvrdite, podaci o kartici dijelit će se s ovom web-lokacijom.</translation> <translation id="3010559122411665027">Unos popisa "<ph name="ENTRY_INDEX" />": <ph name="ERROR" /></translation> -<translation id="3014389611820813634">Kao upravitelj ovog uređaja <ph name="ENROLLMENT_DOMAIN" />:</translation> <translation id="301521992641321250">Automatski blokirano</translation> <translation id="3023071826883856138">You4 (omotnica)</translation> <translation id="3024663005179499861">Pogrešna vrsta pravila</translation> @@ -441,7 +439,6 @@ <translation id="3287510313208355388">Preuzmi online</translation> <translation id="3293642807462928945">Saznajte više o pravilu <ph name="POLICY_NAME" /></translation> <translation id="3303855915957856445">Nisu pronađeni rezultati pretraživanja</translation> -<translation id="3311730110465560799">može daljinski promijeniti postavke uređaja.</translation> <translation id="3320021301628644560">Dodajte adresu za naplatu</translation> <translation id="3324983252691184275">Grimizna</translation> <translation id="3338095232262050444">Sigurno</translation> @@ -536,7 +533,6 @@ <translation id="3761718714832595332">Sakrij status</translation> <translation id="3765032636089507299">Stranica Sigurno pregledavanje trenutačno je u izradi.</translation> <translation id="3778403066972421603">Želite li spremiti ovu karticu na svoj Google račun i na ovaj uređaj?</translation> -<translation id="3779973883630527594">Tvrtka, škola ili organizacija koja upravlja tim računom:</translation> <translation id="3781428340399460090">Jarko ružičasta</translation> <translation id="3783418713923659662">Mastercard</translation> <translation id="3787705759683870569">Istječe <ph name="EXPIRATION_MONTH" />/<ph name="EXPIRATION_YEAR" /></translation> @@ -560,6 +556,7 @@ <translation id="3949571496842715403">Poslužitelj nije mogao dokazati da je <ph name="DOMAIN" />; njegov sigurnosni certifikat ne navodi alternativne nazive predmeta. To može biti uzrokovano pogrešnom konfiguracijom ili napadom na vašu vezu.</translation> <translation id="3949601375789751990">Ovdje se prikazuje vaša povijest pregledavanja</translation> <translation id="3950820424414687140">Prijava</translation> +<translation id="3962859241508114581">Prethodna pjesma</translation> <translation id="3963837677003247395">Želite li nastaviti ručno?</translation> <translation id="3964661563329879394">{COUNT,plural, =0{Nijedna}=1{S 1 web-lokacije }one{S/sa # web-lokacije }few{S/sa # web-lokacije }other{S/sa # web-lokacija }}</translation> <translation id="397105322502079400">Izračun u tijeku…</translation> @@ -582,6 +579,7 @@ <translation id="410351446219883937">Automatska reprodukcija</translation> <translation id="4103763322291513355">Posjetite <strong>chrome://policy</strong> da biste vidjeli popis nedopuštenih URL-ova i druga pravila koja je nametnuo vaš administrator sustava.</translation> <translation id="4110652170750985508">Pregledajte uplatu</translation> +<translation id="4112140312785995938">Traži unatrag</translation> <translation id="4116663294526079822">Uvijek dopusti na ovoj web-lokaciji</translation> <translation id="4117700440116928470">Opseg pravila nije podržan.</translation> <translation id="4129401438321186435">{COUNT,plural, =1{1 druga stavka}one{# druga stavka}few{# druge stavke}other{# drugih stavki}}</translation> @@ -660,6 +658,7 @@ <translation id="443673843213245140">Upotreba proxy poslužitelja onemogućena je, ali određena je izričita konfiguracija proxy poslužitelja.</translation> <translation id="445100540951337728">Prihvaćene debitne kartice</translation> <translation id="4466881336512663640">Izgubit će se promjene koje ste unijeli u obrazac. Jeste li sigurni da želite nastaviti?</translation> +<translation id="4477350412780666475">Sljedeća pjesma</translation> <translation id="4482953324121162758">Ova web-lokacija neće biti prevedena.</translation> <translation id="4490717597759821841">A7</translation> <translation id="4493480324863638523">URL nije važeći. URL mora imati standardnu shemu, na primjer http://example.com ili https://example.com.</translation> @@ -906,7 +905,6 @@ <translation id="5838278095973806738">Na ovu web-lokaciju nemojte unositi osjetljive podatke (na primjer, zaporke ili kreditne kartice) jer su je možda ukrali napadači.</translation> <translation id="5860033963881614850">Isključeno</translation> <translation id="5863847714970149516">Stranica koja će se otvoriti može vam pokušati nešto naplatiti</translation> -<translation id="5865951947699094510">može daljinski promijeniti postavke računa.</translation> <translation id="5866257070973731571">Dodajte telefonski broj</translation> <translation id="5869405914158311789">Web-lokacija ne može se dohvatiti</translation> <translation id="5869522115854928033">Spremljene zaporke</translation> @@ -1059,6 +1057,7 @@ <translation id="6778737459546443941">Roditelj je još nije odobrio</translation> <translation id="67862343314499040">Ljubičasta</translation> <translation id="6786747875388722282">Proširenja</translation> +<translation id="6790428901817661496">Reproduciraj</translation> <translation id="679355240208270552">Zanemareno jer zadano pretraživanje nije omogućeno pravilom.</translation> <translation id="681021252041861472">Obavezno polje</translation> <translation id="6810899417690483278">ID prilagođavanja</translation> @@ -1103,6 +1102,7 @@ <translation id="7053983685419859001">Blokiraj</translation> <translation id="7062635574500127092">Tirkiznoplava</translation> <translation id="7064851114919012435">Podaci za kontakt</translation> +<translation id="7075452647191940183">Zahtjev je prevelik</translation> <translation id="7079718277001814089">Ova web-lokacija sadrži zlonamjerni softver</translation> <translation id="7087282848513945231">Država</translation> <translation id="7090678807593890770">Potražite upit <ph name="LINK" /> na Googleu</translation> @@ -1162,6 +1162,7 @@ <translation id="7353601530677266744">Naredbeni redak</translation> <translation id="7372973238305370288">rezultat pretraživanja</translation> <translation id="7377249249140280793"><ph name="RELATIVE_DATE" /> - <ph name="FULL_DATE" /></translation> +<translation id="7378594059915113390">Medijske kontrole</translation> <translation id="7378627244592794276">Ne</translation> <translation id="7378810950367401542">/</translation> <translation id="7390545607259442187">Potvrda kartice</translation> @@ -1265,7 +1266,6 @@ <translation id="780301667611848630">Ne, hvala</translation> <translation id="7805768142964895445">Status</translation> <translation id="7806344367022510803">Promijenite postavke tražilice u Chromeu</translation> -<translation id="7810209002420871817">Kao upravitelj vašeg računa <ph name="ACCOUNT_DOMAIN" />:</translation> <translation id="7812922009395017822">Mir</translation> <translation id="7813600968533626083">Želite li s Chromea ukloniti prijedlog za obrasce?</translation> <translation id="7815407501681723534">Pronađeno <ph name="NUMBER_OF_RESULTS" /> <ph name="SEARCH_RESULTS" /> za "<ph name="SEARCH_STRING" />"</translation>
diff --git a/components/strings/components_strings_hu.xtb b/components/strings/components_strings_hu.xtb index 516bf7e..b948a12f 100644 --- a/components/strings/components_strings_hu.xtb +++ b/components/strings/components_strings_hu.xtb
@@ -1,7 +1,6 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="hu"> -<translation id="1001338328714563407">Eszköze és fiókja kezelőjeként a(z) <ph name="ENROLLMENT_DOMAIN" />:</translation> <translation id="1008557486741366299">Ne most</translation> <translation id="1010200102790553230">Oldal betöltése később</translation> <translation id="1015730422737071372">További részletek megadása</translation> @@ -41,6 +40,7 @@ <translation id="1161325031994447685">Újracsatlakozás Wi-Fi-hálózathoz</translation> <translation id="1165039591588034296">Hiba</translation> <translation id="1175364870820465910">&Nyomtatás...</translation> +<translation id="1178581264944972037">Szünet</translation> <translation id="1181037720776840403">Eltávolítás</translation> <translation id="1197088940767939838">Narancssárga</translation> <translation id="1201402288615127009">Tovább</translation> @@ -100,7 +100,6 @@ <translation id="1405567553485452995">Világoszöld</translation> <translation id="1407135791313364759">Összes megnyitása</translation> <translation id="1413809658975081374">Adatvédelmi hiba</translation> -<translation id="14171126816530869"><ph name="ORGANIZATION" /> identitását <ph name="LOCALITY" /> régióban <ph name="ISSUER" /> ellenőrizte.</translation> <translation id="1426410128494586442">Igen</translation> <translation id="1430915738399379752">Nyomtatás</translation> <translation id="1455413310270022028">Radír</translation> @@ -256,6 +255,7 @@ <translation id="2262243747453050782">HTTP hiba</translation> <translation id="2263079731045660823">Hitelkártyával kapcsolatos automatikus kitöltési adatok frissítése a Chrome beállításaiban</translation> <translation id="2270484714375784793">Telefonszám</translation> +<translation id="2277103315734023688">Ugrás előre</translation> <translation id="2283340219607151381">Címek mentése és betöltése</translation> <translation id="2292556288342944218">Az internethez való hozzáférést a rendszer letiltotta</translation> <translation id="2297722699537546652">B5 (boríték)</translation> @@ -383,7 +383,6 @@ <translation id="295526156371527179">Figyelem: Ezt a házirendet nem egyesítette a rendszer szótárként a házirend előírásainak megfelelően, mert nem szótár.</translation> <translation id="2955913368246107853">Keresősáv bezárása</translation> <translation id="2969319727213777354">Biztonságos kapcsolat létrehozásához az órát pontosan be kell állítani. Ez azért szükséges, mert a webhelyek által az azonosításukra használt tanúsítványok csak adott ideig érvényesek. Mivel az eszköz órája nem pontos, a Google Chrome nem tudja ellenőrizni ezeket a tanúsítványokat.</translation> -<translation id="2970515157925768593">Módosíthatja távolról az eszköz és a fiók beállítását.</translation> <translation id="2972581237482394796">&Újra</translation> <translation id="2977665033722899841"><ph name="ROW_NAME" /> van jelenleg kiválasztva. <ph name="ROW_CONTENT" /></translation> <translation id="2982481275546140226">Adatok törlése</translation> @@ -395,7 +394,6 @@ <translation id="3005723025932146533">Mentett másolat megjelenítése</translation> <translation id="3008447029300691911">Adja meg a(z) <ph name="CREDIT_CARD" /> kártya CVC-kódját. Az ellenőrzést követően a böngésző megosztja kártyaadatait ezzel a webhellyel.</translation> <translation id="3010559122411665027">"<ph name="ENTRY_INDEX" />." listabejegyzés: <ph name="ERROR" /></translation> -<translation id="3014389611820813634">Eszköze kezelőjeként a(z) <ph name="ENROLLMENT_DOMAIN" />:</translation> <translation id="301521992641321250">Automatikusan letiltva</translation> <translation id="3023071826883856138">You4 (boríték)</translation> <translation id="3024663005179499861">Nem megfelelő irányelvtípus</translation> @@ -439,7 +437,6 @@ <translation id="3287510313208355388">Letöltés online állapotban</translation> <translation id="3293642807462928945">További információ a(z) <ph name="POLICY_NAME" /> házirendről</translation> <translation id="3303855915957856445">Nincs találat</translation> -<translation id="3311730110465560799">Módosíthatja távolról az eszköz beállítását.</translation> <translation id="3320021301628644560">Számlázási cím hozzáadása</translation> <translation id="3324983252691184275">Karmazsinvörös</translation> <translation id="3338095232262050444">Biztonságos</translation> @@ -535,7 +532,6 @@ <translation id="3761718714832595332">Állapot elrejtése</translation> <translation id="3765032636089507299">A Biztonságos Böngészés oldal fejlesztés alatt áll</translation> <translation id="3778403066972421603">Szeretné menteni a kártyát Google-fiókjába és az eszközre?</translation> -<translation id="3779973883630527594">Az ezt a fiókot kezelő cég, iskola vagy szervezet:</translation> <translation id="3781428340399460090">Élénk rózsaszín</translation> <translation id="3783418713923659662">Mastercard</translation> <translation id="3787705759683870569">Lejárat dátuma: <ph name="EXPIRATION_MONTH" />/<ph name="EXPIRATION_YEAR" /></translation> @@ -559,6 +555,7 @@ <translation id="3949571496842715403">A szerver nem tudta bizonyítani, hogy valóban a(z) <ph name="DOMAIN" /> domainbe tartozik; biztonsági tanúsítványában nincs meghatározva a „Subject Alternative Names” mező. Ezt okozhatja konfigurációs hiba, vagy az, hogy egy támadó eltérítette az Ön kapcsolatát.</translation> <translation id="3949601375789751990">A böngészési előzmények itt jelennek meg</translation> <translation id="3950820424414687140">Bejelentkezés</translation> +<translation id="3962859241508114581">Előző szám</translation> <translation id="3963837677003247395">Folytatja manuálisan?</translation> <translation id="3964661563329879394">{COUNT,plural, =0{Nincs}=1{ 1 webhelytől }other{# webhelytől }}</translation> <translation id="397105322502079400">Számítás…</translation> @@ -581,6 +578,7 @@ <translation id="410351446219883937">Automatikus lejátszás</translation> <translation id="4103763322291513355">Látogasson el a <strong>chrome://policy</strong> oldalra a feketelistán lévő URL-ek és egyéb, a rendszergazda által előírt szabályok megtekintéséhez.</translation> <translation id="4110652170750985508">Befizetés áttekintése</translation> +<translation id="4112140312785995938">Ugrás visszafelé</translation> <translation id="4116663294526079822">Mindig engedélyezze ezen az oldalon</translation> <translation id="4117700440116928470">Az irányelv hatásköre nem támogatott.</translation> <translation id="4129401438321186435">{COUNT,plural, =1{1 egyéb}other{# egyéb}}</translation> @@ -659,6 +657,7 @@ <translation id="443673843213245140">A proxy használata le van tiltva, de kifejezett proxykonfiguráció van megadva.</translation> <translation id="445100540951337728">Elfogadott bankkártyák</translation> <translation id="4466881336512663640">Az űrlapon végzett módosítások elvesznek. Biztosan folytatni szeretné?</translation> +<translation id="4477350412780666475">Következő szám</translation> <translation id="4482953324121162758">Nem fordítjuk le ezt a webhelyet.</translation> <translation id="4490717597759821841">A7</translation> <translation id="4493480324863638523">Érvénytelen URL. Az URL-nek szabványos sémával kell rendelkeznie, például http://example.com vagy https://example.com.</translation> @@ -905,7 +904,6 @@ <translation id="5838278095973806738">Ne írjon be semmilyen bizalmas adatot (például jelszót vagy hitelkártyaadatot) a webhelyen, mivel a támadók ellophatják.</translation> <translation id="5860033963881614850">Kikapcsolva</translation> <translation id="5863847714970149516">Előfordulhat, hogy a következő oldal megpróbál pénzt felszámolni Önnek</translation> -<translation id="5865951947699094510">Módosíthatja távolról a fiók beállítását.</translation> <translation id="5866257070973731571">Telefonszám hozzáadása</translation> <translation id="5869405914158311789">A webhely nem érhető el</translation> <translation id="5869522115854928033">Mentett jelszavak</translation> @@ -1058,6 +1056,7 @@ <translation id="6778737459546443941">A szülő még nem hagyta jóvá</translation> <translation id="67862343314499040">Ibolyaszín</translation> <translation id="6786747875388722282">Bővítmények</translation> +<translation id="6790428901817661496">Játék</translation> <translation id="679355240208270552">Figyelmen kívül hagyva, mert az alapértelmezett keresőmotort nem engedélyezi a házirend.</translation> <translation id="681021252041861472">Kötelező mező</translation> <translation id="6810899417690483278">Testreszabás-azonosító</translation> @@ -1102,6 +1101,7 @@ <translation id="7053983685419859001">Letiltás</translation> <translation id="7062635574500127092">Pávakék</translation> <translation id="7064851114919012435">Kapcsolatfelvételi adatok</translation> +<translation id="7075452647191940183">A kérés túl nagy</translation> <translation id="7079718277001814089">A webhely rosszindulatú programokat tartalmaz</translation> <translation id="7087282848513945231">Megye</translation> <translation id="7090678807593890770">Keresés a Google-on a következőre: <ph name="LINK" /></translation> @@ -1161,6 +1161,7 @@ <translation id="7353601530677266744">Parancssor</translation> <translation id="7372973238305370288">keresési találat</translation> <translation id="7377249249140280793"><ph name="RELATIVE_DATE" /> - <ph name="FULL_DATE" /></translation> +<translation id="7378594059915113390">Médiatartalmak vezérlői</translation> <translation id="7378627244592794276">Nem</translation> <translation id="7378810950367401542">/</translation> <translation id="7390545607259442187">Kártya igazolása</translation> @@ -1264,7 +1265,6 @@ <translation id="780301667611848630">Köszönöm, nem</translation> <translation id="7805768142964895445">Állapot</translation> <translation id="7806344367022510803">A keresőmotor beállításainak módosítása a Chrome-ban</translation> -<translation id="7810209002420871817">Fiókja kezelőjeként a(z) <ph name="ACCOUNT_DOMAIN" />:</translation> <translation id="7812922009395017822">Mir</translation> <translation id="7813600968533626083">Eltávolítja a javaslatot a Chrome-ból?</translation> <translation id="7815407501681723534"><ph name="NUMBER_OF_RESULTS" /> <ph name="SEARCH_RESULTS" /> található a(z) „<ph name="SEARCH_STRING" />” kifejezésre</translation>
diff --git a/components/strings/components_strings_id.xtb b/components/strings/components_strings_id.xtb index f24198d..2fae4991 100644 --- a/components/strings/components_strings_id.xtb +++ b/components/strings/components_strings_id.xtb
@@ -1,7 +1,6 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="id"> -<translation id="1001338328714563407">Sebagai pengelola perangkat dan akun Anda, <ph name="ENROLLMENT_DOMAIN" />:</translation> <translation id="1008557486741366299">Jangan Sekarang</translation> <translation id="1010200102790553230">Muat halaman nanti</translation> <translation id="1015730422737071372">Berikan detail tambahan</translation> @@ -41,6 +40,7 @@ <translation id="1161325031994447685">Menyambungkan ulang ke Wi-Fi</translation> <translation id="1165039591588034296">Kesalahan</translation> <translation id="1175364870820465910">&Cetak...</translation> +<translation id="1178581264944972037">Jeda</translation> <translation id="1181037720776840403">Hapus</translation> <translation id="1197088940767939838">Oranye</translation> <translation id="1201402288615127009">Berikutnya</translation> @@ -100,7 +100,6 @@ <translation id="1405567553485452995">Hijau Muda</translation> <translation id="1407135791313364759">Buka semua</translation> <translation id="1413809658975081374">Kesalahan privasi</translation> -<translation id="14171126816530869">Identitas <ph name="ORGANIZATION" /> di <ph name="LOCALITY" /> telah diverifikasi oleh <ph name="ISSUER" />.</translation> <translation id="1426410128494586442">Ya</translation> <translation id="1430915738399379752">Cetak</translation> <translation id="1455413310270022028">Penghapus</translation> @@ -256,6 +255,7 @@ <translation id="2262243747453050782">Kesalahan HTTP</translation> <translation id="2263079731045660823">Perbarui info IsiOtomatis kartu kredit di setelan Chrome</translation> <translation id="2270484714375784793">Nomor telepon</translation> +<translation id="2277103315734023688">Cari Maju</translation> <translation id="2283340219607151381">Simpan dan isi alamat</translation> <translation id="2292556288342944218">Akses Internet Anda diblokir</translation> <translation id="2297722699537546652">B5 (Envelope)</translation> @@ -383,7 +383,6 @@ <translation id="295526156371527179">Perhatian: Kebijakan ini tidak digabung sebagai kamus sebagaimana yang ditetapkan oleh kebijakan karena bukan merupakan kamus.</translation> <translation id="2955913368246107853">Tutup bilah cari</translation> <translation id="2969319727213777354">Untuk membuat sambungan aman, jam perlu disetel dengan benar. Itu karena sertifikat yang digunakan situs web untuk mengidentifikasi situs web tersebut hanya valid untuk jangka waktu tertentu. Karena jam perangkat tidak benar, Google Chrome tidak dapat memverifikasi sertifikat ini.</translation> -<translation id="2970515157925768593">Dapat mengubah penyiapan perangkat dan akun dari jauh.</translation> <translation id="2972581237482394796">&Ulang</translation> <translation id="2977665033722899841"><ph name="ROW_NAME" />, saat ini yang dipilih. <ph name="ROW_CONTENT" /></translation> <translation id="2982481275546140226">Hapus Data</translation> @@ -395,7 +394,6 @@ <translation id="3005723025932146533">Tampilkan salinan yang disimpan</translation> <translation id="3008447029300691911">Masukkan CVC untuk <ph name="CREDIT_CARD" />. Setelah mengonfirmasi, detail kartu Anda akan dibagikan dengan situs ini.</translation> <translation id="3010559122411665027">Entri daftar "<ph name="ENTRY_INDEX" />": <ph name="ERROR" /></translation> -<translation id="3014389611820813634">Sebagai pengelola perangkat ini, <ph name="ENROLLMENT_DOMAIN" />:</translation> <translation id="301521992641321250">Diblokir secara otomatis</translation> <translation id="3023071826883856138">You4 (Envelope)</translation> <translation id="3024663005179499861">Jenis kebijakan salah</translation> @@ -441,7 +439,6 @@ <translation id="3287510313208355388">Download saat online</translation> <translation id="3293642807462928945">Pelajari lebih lanjut tentang kebijakan <ph name="POLICY_NAME" /></translation> <translation id="3303855915957856445">Hasil penelusuran tidak ditemukan</translation> -<translation id="3311730110465560799">Dapat mengubah penyiapan perangkat dari jauh.</translation> <translation id="3320021301628644560">Tambahkan alamat penagihan</translation> <translation id="3324983252691184275">Merah Lembayung</translation> <translation id="3338095232262050444">Aman</translation> @@ -536,7 +533,6 @@ <translation id="3761718714832595332">Sembunyikan status</translation> <translation id="3765032636089507299">Halaman Safe Browsing sedang diperbaiki.</translation> <translation id="3778403066972421603">Ingin menyimpan kartu ini di Akun Google dan perangkat ini?</translation> -<translation id="3779973883630527594">Perusahaan, sekolah, atau organisasi yang mengelola akun ini:</translation> <translation id="3781428340399460090">Merah Muda Terang</translation> <translation id="3783418713923659662">Mastercard</translation> <translation id="3787705759683870569">Masa berlaku <ph name="EXPIRATION_MONTH" />/<ph name="EXPIRATION_YEAR" /></translation> @@ -560,6 +556,7 @@ <translation id="3949571496842715403">Server ini tidak dapat membuktikan bahwa ini adalah <ph name="DOMAIN" />; sertifikat keamanannya tidak menyebutkan Nama Alternatif Subjek. Hal ini dapat disebabkan oleh kesalahan konfigurasi atau penyerang memotong sambungan Anda.</translation> <translation id="3949601375789751990">Histori browsing Anda muncul di sini</translation> <translation id="3950820424414687140">Login</translation> +<translation id="3962859241508114581">Lagu Sebelumnya</translation> <translation id="3963837677003247395">Lanjutkan secara manual?</translation> <translation id="3964661563329879394">{COUNT,plural, =0{Tidak ada}=1{Dari 1 situs }other{Dari # situs }}</translation> <translation id="397105322502079400">Menghitung...</translation> @@ -582,6 +579,7 @@ <translation id="410351446219883937">Putar otomatis</translation> <translation id="4103763322291513355">Kunjungi <strong>chrome://policy</strong> untuk melihat daftar URL yang masuk daftar hitam dan kebijakan lain yang diterapkan oleh administrator sistem Anda.</translation> <translation id="4110652170750985508">Tinjau pembayaran</translation> +<translation id="4112140312785995938">Cari Mundur</translation> <translation id="4116663294526079822">Selalu izinkan di situs ini</translation> <translation id="4117700440116928470">Lingkup kebijakan tidak didukung.</translation> <translation id="4129401438321186435">{COUNT,plural, =1{1 lainnya}other{# lainnya}}</translation> @@ -660,6 +658,7 @@ <translation id="443673843213245140">Penggunaan proxy dinonaktifkan tetapi konfigurasi proxy yang eksplisit ditentukan.</translation> <translation id="445100540951337728">Kartu kredit yang diterima</translation> <translation id="4466881336512663640">Perubahan pada formulir akan hilang. Yakin ingin melanjutkan?</translation> +<translation id="4477350412780666475">Lagu Berikutnya</translation> <translation id="4482953324121162758">Situs ini tidak akan diterjemahkan.</translation> <translation id="4490717597759821841">A7</translation> <translation id="4493480324863638523">URL tidak valid. Harus berupa URL dengan skema standar, misalnya http://example.com atau https://example.com.</translation> @@ -906,7 +905,6 @@ <translation id="5838278095973806738">Jangan masukkan informasi sensitif apa pun di situs ini (misalnya, sandi atau kartu kredit), karena penyerang dapat mencurinya.</translation> <translation id="5860033963881614850">Nonaktif</translation> <translation id="5863847714970149516">Halaman berikutnya mungkin mencoba menagih Anda.</translation> -<translation id="5865951947699094510">Dapat mengubah penyiapan akun Anda dari jauh.</translation> <translation id="5866257070973731571">Tambahkan Nomor Telepon</translation> <translation id="5869405914158311789">Situs ini tidak dapat dijangkau</translation> <translation id="5869522115854928033">Sandi tersimpan</translation> @@ -1059,6 +1057,7 @@ <translation id="6778737459546443941">Orang tuamu belum menyetujuinya</translation> <translation id="67862343314499040">Violet</translation> <translation id="6786747875388722282">Ekstensi</translation> +<translation id="6790428901817661496">Putar</translation> <translation id="679355240208270552">Diabaikan karena penelusuran default tidak diaktifkan menurut kebijakan.</translation> <translation id="681021252041861472">Kolom Wajib Diisi</translation> <translation id="6810899417690483278">ID Penyesuaian</translation> @@ -1160,6 +1159,7 @@ <translation id="7353601530677266744">Baris Perintah</translation> <translation id="7372973238305370288">hasil penelusuran</translation> <translation id="7377249249140280793"><ph name="RELATIVE_DATE" /> - <ph name="FULL_DATE" /></translation> +<translation id="7378594059915113390">Kontrol Media</translation> <translation id="7378627244592794276">Tidak</translation> <translation id="7378810950367401542">/</translation> <translation id="7390545607259442187">Konfirmasi Kartu</translation> @@ -1263,7 +1263,6 @@ <translation id="780301667611848630">Lain kali</translation> <translation id="7805768142964895445">Status</translation> <translation id="7806344367022510803">Ubah setelan Mesin Telusur di Chrome</translation> -<translation id="7810209002420871817">Sebagai pengelola akun Anda, <ph name="ACCOUNT_DOMAIN" />:</translation> <translation id="7812922009395017822">Mir</translation> <translation id="7813600968533626083">Hapus sebagai saran dari Chrome?</translation> <translation id="7815407501681723534">Ditemukan <ph name="NUMBER_OF_RESULTS" /> <ph name="SEARCH_RESULTS" /> hasil untuk '<ph name="SEARCH_STRING" />'</translation>
diff --git a/components/strings/components_strings_it.xtb b/components/strings/components_strings_it.xtb index 53e2b99..b53c36cf 100644 --- a/components/strings/components_strings_it.xtb +++ b/components/strings/components_strings_it.xtb
@@ -1,7 +1,6 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="it"> -<translation id="1001338328714563407">In qualità di gestore del tuo dispositivo e del tuo account, <ph name="ENROLLMENT_DOMAIN" />:</translation> <translation id="1008557486741366299">Non adesso</translation> <translation id="1010200102790553230">Carica la pagina più tardi</translation> <translation id="1015730422737071372">Fornisci ulteriori dettagli</translation> @@ -41,6 +40,7 @@ <translation id="1161325031994447685">Riconnessione alla rete Wi-Fi</translation> <translation id="1165039591588034296">Errore</translation> <translation id="1175364870820465910">&Stampa...</translation> +<translation id="1178581264944972037">Pausa</translation> <translation id="1181037720776840403">Rimuovi</translation> <translation id="1197088940767939838">Arancione</translation> <translation id="1201402288615127009">Avanti</translation> @@ -100,7 +100,6 @@ <translation id="1405567553485452995">Verde chiaro</translation> <translation id="1407135791313364759">Apri tutte</translation> <translation id="1413809658975081374">Errore di privacy</translation> -<translation id="14171126816530869">L'identità di <ph name="ORGANIZATION" /> con sede a <ph name="LOCALITY" /> è stata verifica da <ph name="ISSUER" />.</translation> <translation id="1426410128494586442">Sì</translation> <translation id="1430915738399379752">Stampa</translation> <translation id="1455413310270022028">Gomma</translation> @@ -256,6 +255,7 @@ <translation id="2262243747453050782">Errore HTTP</translation> <translation id="2263079731045660823">Aggiorna i dati della compilazione automatica delle carte di credito nelle impostazioni di Chrome</translation> <translation id="2270484714375784793">Numero di telefono</translation> +<translation id="2277103315734023688">Vai avanti</translation> <translation id="2283340219607151381">Salva e compila gli indirizzi</translation> <translation id="2292556288342944218">L'accesso a Internet è bloccato</translation> <translation id="2297722699537546652">B5 (Envelope)</translation> @@ -383,7 +383,6 @@ <translation id="295526156371527179">Avviso: questo criterio non è stato unito come dizionario come specificato dal criterio perché non è un dizionario.</translation> <translation id="2955913368246107853">Chiudi la barra di ricerca</translation> <translation id="2969319727213777354">Per poter stabilire una connessione protetta, l'orologio deve essere impostato correttamente perché i certificati utilizzati dai siti web per identificarsi sono validi soltanto per determinati periodi di tempo. L'orologio del dispositivo non è impostato sull'orario corretto, pertanto Chrome non può verificare i certificati.</translation> -<translation id="2970515157925768593">Può modificare da remoto la configurazione del tuo dispositivo e del tuo account.</translation> <translation id="2972581237482394796">&Ripeti</translation> <translation id="2977665033722899841"><ph name="ROW_NAME" />, attualmente selezionata. <ph name="ROW_CONTENT" /></translation> <translation id="2982481275546140226">Cancella dati</translation> @@ -395,7 +394,6 @@ <translation id="3005723025932146533">Mostra copia salvata</translation> <translation id="3008447029300691911">Inserisci il codice CVC della carta <ph name="CREDIT_CARD" />. Dopo essere stati confermati, i dettagli della carta saranno condivisi con questo sito.</translation> <translation id="3010559122411665027">Voce "<ph name="ENTRY_INDEX" />": <ph name="ERROR" /></translation> -<translation id="3014389611820813634">In qualità di gestore di questo dispositivo, <ph name="ENROLLMENT_DOMAIN" />:</translation> <translation id="301521992641321250">Bloccata automaticamente</translation> <translation id="3023071826883856138">You4 (Envelope)</translation> <translation id="3024663005179499861">Tipo di criterio errato</translation> @@ -438,7 +436,6 @@ <translation id="3287510313208355388">Scarica quando è online</translation> <translation id="3293642807462928945">Scopri di più sulla norma <ph name="POLICY_NAME" /></translation> <translation id="3303855915957856445">Nessun risultato di ricerca trovato</translation> -<translation id="3311730110465560799">Può modificare da remoto la configurazione del tuo dispositivo.</translation> <translation id="3320021301628644560">Aggiungi l'indirizzo di fatturazione</translation> <translation id="3324983252691184275">Cremisi</translation> <translation id="3338095232262050444">Sicuro</translation> @@ -534,7 +531,6 @@ <translation id="3761718714832595332">Nascondi stato</translation> <translation id="3765032636089507299">La pagina Navigazione sicura è in fase di realizzazione.</translation> <translation id="3778403066972421603">Vuoi salvare questa carta nel tuo Account Google e su questo dispositivo?</translation> -<translation id="3779973883630527594">La società, scuola o organizzazione che gestisce questo account:</translation> <translation id="3781428340399460090">Fucsia</translation> <translation id="3783418713923659662">Mastercard</translation> <translation id="3787705759683870569">Data di scadenza: <ph name="EXPIRATION_MONTH" />/<ph name="EXPIRATION_YEAR" /></translation> @@ -558,6 +554,7 @@ <translation id="3949571496842715403">Questo server non è riuscito a dimostrare che si tratta di <ph name="DOMAIN" />; il relativo certificato di sicurezza non contiene nomi alternativi del soggetto. Il problema potrebbe essere dovuto a un'errata configurazione o a un malintenzionato che intercetta la connessione.</translation> <translation id="3949601375789751990">La cronologia di navigazione viene mostrata qui</translation> <translation id="3950820424414687140">Accedi</translation> +<translation id="3962859241508114581">Traccia precedente</translation> <translation id="3963837677003247395">Continuare manualmente?</translation> <translation id="3964661563329879394">{COUNT,plural, =0{Nessuno}=1{Di 1 sito }other{Di # siti }}</translation> <translation id="397105322502079400">Calcolo in corso...</translation> @@ -580,6 +577,7 @@ <translation id="410351446219883937">Riproduzione automatica</translation> <translation id="4103763322291513355">Visita <strong>chrome://policy</strong> per visualizzare l'elenco di URL inseriti nella blacklist e altre norme applicate dall'amministratore di sistema.</translation> <translation id="4110652170750985508">Verifica il pagamento</translation> +<translation id="4112140312785995938">Vai indietro</translation> <translation id="4116663294526079822">Consenti sempre su questo sito</translation> <translation id="4117700440116928470">L'ambito della norma non è supportato.</translation> <translation id="4129401438321186435">{COUNT,plural, =1{1 altro}other{# altri}}</translation> @@ -658,6 +656,7 @@ <translation id="443673843213245140">L'utilizzo di un proxy è stato disattivato ma è stata specificata una configurazione proxy esplicita.</translation> <translation id="445100540951337728">Carte di debito accettate</translation> <translation id="4466881336512663640">Le modifiche apportate al modulo andranno perse. Vuoi continuare?</translation> +<translation id="4477350412780666475">Traccia successiva</translation> <translation id="4482953324121162758">Questo sito non verrà tradotto.</translation> <translation id="4490717597759821841">A7</translation> <translation id="4493480324863638523">URL non valido. Deve essere un URL con schema standard, ad esempio http://example.com o https://example.com.</translation> @@ -904,7 +903,6 @@ <translation id="5838278095973806738">Non dovresti inserire dati sensibili in questo sito (ad esempio password o carte di credito) perché potrebbero essere intercettati da utenti malintenzionati.</translation> <translation id="5860033963881614850">Off</translation> <translation id="5863847714970149516">La pagina che segue potrebbe tentare di addebitarti dei costi</translation> -<translation id="5865951947699094510">Può modificare da remoto la configurazione del tuo account.</translation> <translation id="5866257070973731571">Aggiungi numero di telefono</translation> <translation id="5869405914158311789">Impossibile raggiungere il sito</translation> <translation id="5869522115854928033">Password salvate</translation> @@ -1056,6 +1054,7 @@ <translation id="6778737459546443941">Il tuo genitore non ha ancora approvato la richiesta</translation> <translation id="67862343314499040">Lilla</translation> <translation id="6786747875388722282">Estensioni</translation> +<translation id="6790428901817661496">Play</translation> <translation id="679355240208270552">Ignorato perché la ricerca predefinita non è attiva secondo la norma.</translation> <translation id="681021252041861472">Campo obbligatorio</translation> <translation id="6810899417690483278">ID personalizzazione</translation> @@ -1100,6 +1099,7 @@ <translation id="7053983685419859001">Blocca</translation> <translation id="7062635574500127092">Verde petrolio</translation> <translation id="7064851114919012435">Informazioni di contatto</translation> +<translation id="7075452647191940183">La richiesta è troppo grande</translation> <translation id="7079718277001814089">Questo sito contiene malware</translation> <translation id="7087282848513945231">Contea</translation> <translation id="7090678807593890770">Cerca <ph name="LINK" /> con Google</translation> @@ -1159,6 +1159,7 @@ <translation id="7353601530677266744">Riga di comando</translation> <translation id="7372973238305370288">risultato della ricerca</translation> <translation id="7377249249140280793"><ph name="RELATIVE_DATE" /> - <ph name="FULL_DATE" /></translation> +<translation id="7378594059915113390">Controlli multimediali</translation> <translation id="7378627244592794276">No</translation> <translation id="7378810950367401542">/</translation> <translation id="7390545607259442187">Conferma della carta</translation> @@ -1262,7 +1263,6 @@ <translation id="780301667611848630">No grazie</translation> <translation id="7805768142964895445">Stato</translation> <translation id="7806344367022510803">Cambia le impostazioni del motore di ricerca in Chrome</translation> -<translation id="7810209002420871817">In qualità di gestore del tuo account, <ph name="ACCOUNT_DOMAIN" />:</translation> <translation id="7812922009395017822">Mir</translation> <translation id="7813600968533626083">Rimuovere il suggerimento per i moduli da Chrome?</translation> <translation id="7815407501681723534"><ph name="SEARCH_RESULTS" /> per "<ph name="SEARCH_STRING" />": <ph name="NUMBER_OF_RESULTS" /></translation>
diff --git a/components/strings/components_strings_iw.xtb b/components/strings/components_strings_iw.xtb index 6eca009..f05f7e28 100644 --- a/components/strings/components_strings_iw.xtb +++ b/components/strings/components_strings_iw.xtb
@@ -1,7 +1,6 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="iw"> -<translation id="1001338328714563407">בתור מנהל המכשיר והחשבון שלך, <ph name="ENROLLMENT_DOMAIN" />:</translation> <translation id="1008557486741366299">לא עכשיו</translation> <translation id="1010200102790553230">לטעינת הדף מאוחר יותר</translation> <translation id="1015730422737071372">ספק פרטים נוספים</translation> @@ -41,6 +40,7 @@ <translation id="1161325031994447685">להתחבר מחדש אל ה-Wi-Fi</translation> <translation id="1165039591588034296">שגיאה</translation> <translation id="1175364870820465910">הדפסה…</translation> +<translation id="1178581264944972037">השהה</translation> <translation id="1181037720776840403">הסרה</translation> <translation id="1197088940767939838">כתום</translation> <translation id="1201402288615127009">הבא</translation> @@ -98,7 +98,6 @@ <translation id="1405567553485452995">ירוק בהיר</translation> <translation id="1407135791313364759">פתח הכל</translation> <translation id="1413809658975081374">שגיאת פרטיות</translation> -<translation id="14171126816530869">זהות <ph name="ORGANIZATION" /> ב-<ph name="LOCALITY" /> אומתה על ידי <ph name="ISSUER" />.</translation> <translation id="1426410128494586442">כן</translation> <translation id="1430915738399379752">הדפסה</translation> <translation id="1455413310270022028">כלי מחיקה</translation> @@ -251,6 +250,7 @@ <translation id="2262243747453050782">שגיאת HTTP</translation> <translation id="2263079731045660823">עדכון המילוי האוטומטי של פרטי כרטיס אשראי בהגדרות Chrome</translation> <translation id="2270484714375784793">מספר טלפון</translation> +<translation id="2277103315734023688">הרצה קדימה</translation> <translation id="2283340219607151381">שמירה ומילוי של כתובות</translation> <translation id="2292556288342944218">הגישה לאינטרנט חסומה</translation> <translation id="2297722699537546652">B5 (Envelope)</translation> @@ -375,7 +375,6 @@ <translation id="295526156371527179">אזהרה: המדיניות הזו לא עברה מיזוג כמילון בהתאם למדיניות, מאחר שהיא אינה מילון.</translation> <translation id="2955913368246107853">סגור את חלונית החיפוש</translation> <translation id="2969319727213777354">כדי ליצור חיבור מאובטח, השעון צריך להיות מוגדר כהלכה. הסיבה לכך היא שהאישורים שבאמצעותם אתרים מזהים את עצמם תקפים רק למשך פרקי זמן מסוימים. מאחר שהשעון במכשיר שלך שגוי, Google Chrome לא יכול לאמת את האישורים האלה.</translation> -<translation id="2970515157925768593">יכול לשנות מרחוק את הגדרות המכשיר והחשבון שלך.</translation> <translation id="2972581237482394796">&בצע שנית</translation> <translation id="2977665033722899841"><ph name="ROW_NAME" />, בחירה נוכחית. <ph name="ROW_CONTENT" /></translation> <translation id="2982481275546140226">ניקוי נתונים</translation> @@ -387,7 +386,6 @@ <translation id="3005723025932146533">הצג עותק שמור</translation> <translation id="3008447029300691911">הזן את קוד האימות של הכרטיס <ph name="CREDIT_CARD" />. ברגע שתאשר, פרטי הכרטיס שלך ישותפו עם האתר הזה.</translation> <translation id="3010559122411665027">רשומה ברשימה "<ph name="ENTRY_INDEX" />": <ph name="ERROR" /></translation> -<translation id="3014389611820813634">בתור מנהל המכשיר, <ph name="ENROLLMENT_DOMAIN" />:</translation> <translation id="301521992641321250">נחסמה אוטומטית</translation> <translation id="3023071826883856138">You4 (Envelope)</translation> <translation id="3024663005179499861">סוג המדיניות שגוי</translation> @@ -433,7 +431,6 @@ <translation id="3287510313208355388">להורדה אחרי התחברות לרשת</translation> <translation id="3293642807462928945">מידע נוסף על המדיניות <ph name="POLICY_NAME" /></translation> <translation id="3303855915957856445">לא נמצאו תוצאות חיפוש</translation> -<translation id="3311730110465560799">יכול לשנות את הגדרות המכשיר שלך מרחוק.</translation> <translation id="3320021301628644560">הוספה של כתובת לחיוב</translation> <translation id="3324983252691184275">ארגמן</translation> <translation id="3338095232262050444">מאובטח</translation> @@ -529,7 +526,6 @@ <translation id="3761718714832595332">הסתרת הסטטוס</translation> <translation id="3765032636089507299">הדף 'גלישה בטוחה' נמצא כרגע בבנייה.</translation> <translation id="3778403066972421603">האם ברצונך לשמור את הכרטיס בחשבון Google שלך ובמכשיר הזה?</translation> -<translation id="3779973883630527594">החברה, בית הספר או הארגון שמנהלים את החשבון הזה:</translation> <translation id="3781428340399460090">ורוד בוהק</translation> <translation id="3783418713923659662">מאסטרקארד</translation> <translation id="3787705759683870569">תאריך תפוגה: <ph name="EXPIRATION_MONTH" />/<ph name="EXPIRATION_YEAR" /></translation> @@ -553,6 +549,7 @@ <translation id="3949571496842715403">השרת הזה לא הצליח להוכיח שהוא <ph name="DOMAIN" />; אישור האבטחה שלו לא מציין ערכי Subject Alternative Name. ייתכן שהסיבה לכך היא תצורה שגויה או תוקף המיירט את החיבור שלך.</translation> <translation id="3949601375789751990">היסטוריית הגלישה שלך מופיעה כאן</translation> <translation id="3950820424414687140">כניסה</translation> +<translation id="3962859241508114581">הטראק הקודם</translation> <translation id="3963837677003247395">להמשיך באופן ידני?</translation> <translation id="3964661563329879394">{COUNT,plural, =0{ללא}=1{מאתר אחד }two{משני אתרים }many{מ-# אתרים }other{מ-# אתרים }}</translation> <translation id="397105322502079400">מחשב...</translation> @@ -575,6 +572,7 @@ <translation id="410351446219883937">הפעלה אוטומטית</translation> <translation id="4103763322291513355">היכנס לכתובת <strong>chrome://policy</strong> כדי לראות רשימה של כתובות אתרים שנמנעה אליהם הגישה, כמו גם תקנונים אחרים שנאכפו על ידי מנהל המערכת שלך.</translation> <translation id="4110652170750985508">בדיקת התשלום</translation> +<translation id="4112140312785995938">הרצה לאחור</translation> <translation id="4116663294526079822">אפשר תמיד באתר זה</translation> <translation id="4117700440116928470">היקף המדיניות אינו נתמך.</translation> <translation id="4129401438321186435">{COUNT,plural, =1{אחד נוסף}two{שניים נוספים}many{# נוספים}other{# נוספים}}</translation> @@ -653,6 +651,7 @@ <translation id="443673843213245140">השימוש בשרת Proxy הושבת, אך צויינה תצורת שרת Proxy מפורשת.</translation> <translation id="445100540951337728">כרטיסי חיוב שהסוחר מקבל</translation> <translation id="4466881336512663640">השינויים בטופס יתבטלו. להמשיך?</translation> +<translation id="4477350412780666475">הטראק הבא</translation> <translation id="4482953324121162758">האתר הזה לא יתורגם.</translation> <translation id="4490717597759821841">A7</translation> <translation id="4493480324863638523">כתובת URL לא חוקית. הסכימה של כתובת ה-URL צריכה להיות רגילה, כלומר: http://example.com או https://example.com.</translation> @@ -904,7 +903,6 @@ <translation id="5838278095973806738">אין להזין מידע רגיש באתר הזה (כמו סיסמאות או מספרי כרטיסי אשראי), מאחר שתוקפים עלולים לקבל אליו גישה.</translation> <translation id="5860033963881614850">כבוי</translation> <translation id="5863847714970149516">בדף הבא עשויה להיות דרישה לתשלום</translation> -<translation id="5865951947699094510">יכול לשנות מרחוק את הגדרות החשבון.</translation> <translation id="5866257070973731571">הוספת מספר טלפון</translation> <translation id="5869405914158311789">לא ניתן לגשת לאתר הזה</translation> <translation id="5869522115854928033">סיסמאות שמורות</translation> @@ -1057,6 +1055,7 @@ <translation id="6778737459546443941">ההורה ששאלת עדיין לא אישר זאת</translation> <translation id="67862343314499040">סגול סיגלית</translation> <translation id="6786747875388722282">תוספים</translation> +<translation id="6790428901817661496">הפעל</translation> <translation id="679355240208270552">המערכת התעלמה מערך מדיניות זה, משום שלפי המדיניות חיפוש ברירת המחדל מושבת.</translation> <translation id="681021252041861472">שדה חובה</translation> <translation id="6810899417690483278">מזהה של התאמה אישית</translation> @@ -1157,6 +1156,7 @@ <translation id="7353601530677266744">שורת פקודה </translation> <translation id="7372973238305370288">תוצאת חיפוש</translation> <translation id="7377249249140280793"><ph name="RELATIVE_DATE" /> - <ph name="FULL_DATE" /></translation> +<translation id="7378594059915113390">פקדי מדיה</translation> <translation id="7378627244592794276">לא</translation> <translation id="7378810950367401542">/</translation> <translation id="7390545607259442187">אשר את הכרטיס</translation> @@ -1260,7 +1260,6 @@ <translation id="780301667611848630">לא תודה</translation> <translation id="7805768142964895445">סטטוס</translation> <translation id="7806344367022510803">שינוי הגדרות מנוע החיפוש ב-Chrome</translation> -<translation id="7810209002420871817">בתור המנהל של החשבון שלך, <ph name="ACCOUNT_DOMAIN" />:</translation> <translation id="7812922009395017822">Mir</translation> <translation id="7813600968533626083">האם להסיר מ-Chrome הצעות בשביל טפסים?</translation> <translation id="7815407501681723534">נמצאו <ph name="NUMBER_OF_RESULTS" /> <ph name="SEARCH_RESULTS" /> בנושא '<ph name="SEARCH_STRING" />'</translation>
diff --git a/components/strings/components_strings_ja.xtb b/components/strings/components_strings_ja.xtb index 4dfc84be..81c8285 100644 --- a/components/strings/components_strings_ja.xtb +++ b/components/strings/components_strings_ja.xtb
@@ -1,7 +1,6 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="ja"> -<translation id="1001338328714563407">デバイスおよびアカウントの管理者である <ph name="ENROLLMENT_DOMAIN" />:</translation> <translation id="1008557486741366299">後で</translation> <translation id="1010200102790553230">後でページを読み込む</translation> <translation id="1015730422737071372">詳細を報告する</translation> @@ -41,6 +40,7 @@ <translation id="1161325031994447685">Wi-Fi に再度接続する</translation> <translation id="1165039591588034296">エラー</translation> <translation id="1175364870820465910">印刷(&P)...</translation> +<translation id="1178581264944972037">一時停止</translation> <translation id="1181037720776840403">削除</translation> <translation id="1197088940767939838">オレンジ</translation> <translation id="1201402288615127009">次へ</translation> @@ -98,7 +98,6 @@ <translation id="1405567553485452995">ライトグリーン</translation> <translation id="1407135791313364759">すべて開く</translation> <translation id="1413809658975081374">プライバシー エラー</translation> -<translation id="14171126816530869"><ph name="LOCALITY" /> の <ph name="ORGANIZATION" /> の ID は、<ph name="ISSUER" /> によって確認済みです。</translation> <translation id="1426410128494586442">はい</translation> <translation id="1430915738399379752">印刷</translation> <translation id="1455413310270022028">消しゴム</translation> @@ -251,6 +250,7 @@ <translation id="2262243747453050782">HTTP エラーです</translation> <translation id="2263079731045660823">Chrome の設定で自動入力のクレジット カード情報を変更します</translation> <translation id="2270484714375784793">電話番号</translation> +<translation id="2277103315734023688">前方に移動</translation> <translation id="2283340219607151381">住所の保存と入力</translation> <translation id="2292556288342944218">インターネット アクセスがブロックされています</translation> <translation id="2297722699537546652">B5(封筒)</translation> @@ -375,7 +375,6 @@ <translation id="295526156371527179">警告: このポリシーは辞書でないため、ポリシーで指定されているとおりに辞書として統合されませんでした。</translation> <translation id="2955913368246107853">検索バーを閉じる</translation> <translation id="2969319727213777354">安全な接続を確立するには、時計が正しく設定されている必要があります。これは、ウェブサイトが自身を証明するために使用する証明書には有効期限があるためです。デバイスの時計が正しくないため、Google Chrome でこれらの証明書を確認することができません。</translation> -<translation id="2970515157925768593">デバイスとアカウントの設定をリモートで変更できます。</translation> <translation id="2972581237482394796">やり直し(&R)</translation> <translation id="2977665033722899841"><ph name="ROW_NAME" />が現在選択されています。<ph name="ROW_CONTENT" /></translation> <translation id="2982481275546140226">データを削除</translation> @@ -387,7 +386,6 @@ <translation id="3005723025932146533">保存済みのコピーを表示</translation> <translation id="3008447029300691911"><ph name="CREDIT_CARD" /> の CVC を入力します。確認を行うと、カードの詳細がこのサイトと共有されます。</translation> <translation id="3010559122411665027">リスト エントリ「<ph name="ENTRY_INDEX" />」: <ph name="ERROR" /></translation> -<translation id="3014389611820813634">このデバイスの管理者である <ph name="ENROLLMENT_DOMAIN" />:</translation> <translation id="301521992641321250">自動ブロックされました</translation> <translation id="3023071826883856138">洋4(封筒)</translation> <translation id="3024663005179499861">ポリシー タイプが間違っています</translation> @@ -433,7 +431,6 @@ <translation id="3287510313208355388">オンライン時にダウンロード</translation> <translation id="3293642807462928945"><ph name="POLICY_NAME" /> ポリシーの詳細</translation> <translation id="3303855915957856445">一致する結果は見つかりませんでした</translation> -<translation id="3311730110465560799">デバイスの設定をリモートで変更できます。</translation> <translation id="3320021301628644560">請求先住所を追加</translation> <translation id="3324983252691184275">クリムゾン</translation> <translation id="3338095232262050444">保護された通信</translation> @@ -529,7 +526,6 @@ <translation id="3761718714832595332">ステータスを表示しない</translation> <translation id="3765032636089507299">セーフ ブラウジング ページは準備中です。</translation> <translation id="3778403066972421603">このカードを Google アカウントとこのデバイスに保存しますか?</translation> -<translation id="3779973883630527594">このアカウントを管理する会社、学校、または組織:</translation> <translation id="3781428340399460090">ホットピンク</translation> <translation id="3783418713923659662">Mastercard</translation> <translation id="3787705759683870569">有効期限: <ph name="EXPIRATION_MONTH" /> / <ph name="EXPIRATION_YEAR" /></translation> @@ -553,6 +549,7 @@ <translation id="3949571496842715403">このサーバーが <ph name="DOMAIN" /> であることを確認できませんでした。このサーバーのセキュリティ証明書で SAN(サブジェクトの別名)が指定されていません。設定が不適切であるか、悪意のあるユーザーによって接続が妨害されている可能性があります。</translation> <translation id="3949601375789751990">閲覧履歴がここに表示されます</translation> <translation id="3950820424414687140">ログイン</translation> +<translation id="3962859241508114581">前の曲</translation> <translation id="3963837677003247395">手動で続行しますか?</translation> <translation id="3964661563329879394">{COUNT,plural, =0{なし}=1{1 件のサイトから}other{# 件のサイトから}}</translation> <translation id="397105322502079400">計算しています...</translation> @@ -575,6 +572,7 @@ <translation id="410351446219883937">自動再生</translation> <translation id="4103763322291513355"><strong>chrome://policy</strong> にアクセスして、ブラックリストに登録されている URL とシステム管理者が設定した他のポリシーを確認できます。</translation> <translation id="4110652170750985508">お支払いの確認</translation> +<translation id="4112140312785995938">後方に移動</translation> <translation id="4116663294526079822">このサイトでは常に許可</translation> <translation id="4117700440116928470">ポリシーの適用範囲がサポートされていません。</translation> <translation id="4129401438321186435">{COUNT,plural, =1{他 1 件}other{他 # 件}}</translation> @@ -653,6 +651,7 @@ <translation id="443673843213245140">プロキシの使用は無効ですが、プロキシの設定が明示的に指定されています。</translation> <translation id="445100540951337728">利用可能なデビットカード</translation> <translation id="4466881336512663640">フォームの変更内容は破棄されます。続行してもよろしいですか?</translation> +<translation id="4477350412780666475">次の曲</translation> <translation id="4482953324121162758">このサイトは翻訳されません。</translation> <translation id="4490717597759821841">A7</translation> <translation id="4493480324863638523">URL が無効です。標準のスキームを使用した URL を指定してください(例: http://example.com、https://example.com)。</translation> @@ -899,7 +898,6 @@ <translation id="5838278095973806738">このサイトでは機密情報(パスワード、クレジット カードなど)を入力しないでください。悪意のあるユーザーに情報が盗まれる恐れがあります。</translation> <translation id="5860033963881614850">オフ</translation> <translation id="5863847714970149516">表示しようとしているページでは課金される恐れがあります</translation> -<translation id="5865951947699094510">アカウントの設定をリモートで変更できます。</translation> <translation id="5866257070973731571">電話番号の追加</translation> <translation id="5869405914158311789">このサイトにアクセスできません</translation> <translation id="5869522115854928033">保存したパスワード</translation> @@ -1052,6 +1050,7 @@ <translation id="6778737459546443941">保護者がまだサイトを開くことを許可していません</translation> <translation id="67862343314499040">バイオレット</translation> <translation id="6786747875388722282">拡張機能</translation> +<translation id="6790428901817661496">再生</translation> <translation id="679355240208270552">ポリシーによって既定の検索エンジンが有効になっていないため、無視されました。</translation> <translation id="681021252041861472">必須項目</translation> <translation id="6810899417690483278">カスタム ID</translation> @@ -1152,6 +1151,7 @@ <translation id="7353601530677266744">コマンドライン</translation> <translation id="7372973238305370288">検索結果</translation> <translation id="7377249249140280793"><ph name="RELATIVE_DATE" /> - <ph name="FULL_DATE" /></translation> +<translation id="7378594059915113390">メディアの操作</translation> <translation id="7378627244592794276">いいえ</translation> <translation id="7378810950367401542">/</translation> <translation id="7390545607259442187">カードの確認</translation> @@ -1255,7 +1255,6 @@ <translation id="780301667611848630">いいえ</translation> <translation id="7805768142964895445">ステータス</translation> <translation id="7806344367022510803">Chrome で検索エンジンの設定を変更します</translation> -<translation id="7810209002420871817">アカウントの管理者である <ph name="ACCOUNT_DOMAIN" />:</translation> <translation id="7812922009395017822">Mir</translation> <translation id="7813600968533626083">Chrome から候補を削除してもよろしいですか?</translation> <translation id="7815407501681723534">「<ph name="SEARCH_STRING" />」に対し <ph name="NUMBER_OF_RESULTS" /> 件の <ph name="SEARCH_RESULTS" />が見つかりました</translation>
diff --git a/components/strings/components_strings_kn.xtb b/components/strings/components_strings_kn.xtb index 2c2cf6610..5f8cd23 100644 --- a/components/strings/components_strings_kn.xtb +++ b/components/strings/components_strings_kn.xtb
@@ -1,7 +1,6 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="kn"> -<translation id="1001338328714563407">ನಿಮ್ಮ ಸಾಧನ ಮತ್ತು ಖಾತೆಯ ನಿರ್ವಾಹಕರಾಗಿ, <ph name="ENROLLMENT_DOMAIN" />:</translation> <translation id="1008557486741366299">ಈಗಲೇ ಅಲ್ಲ</translation> <translation id="1010200102790553230">ಪುಟವನ್ನು ನಂತರ ಲೋಡ್ ಮಾಡಿ</translation> <translation id="1015730422737071372">ಹೆಚ್ಚುವರಿ ವಿವರಗಳನ್ನು ಒದಗಿಸಿ</translation> @@ -41,6 +40,7 @@ <translation id="1161325031994447685">ವೈ-ಫೈಗೆ ಮರುಸಂಪರ್ಕಿಸಲಾಗುತ್ತಿದೆ</translation> <translation id="1165039591588034296">ದೋಷ</translation> <translation id="1175364870820465910">&ಮುದ್ರಿಸಿ...</translation> +<translation id="1178581264944972037">ವಿರಾಮ</translation> <translation id="1181037720776840403">ತೆಗೆದುಹಾಕು</translation> <translation id="1197088940767939838">ಕಿತ್ತಳೆ</translation> <translation id="1201402288615127009">ಮುಂದೆ</translation> @@ -100,7 +100,6 @@ <translation id="1405567553485452995">ತಿಳಿ ಹಸಿರು</translation> <translation id="1407135791313364759">ಎಲ್ಲವನ್ನೂ ತೆರೆಯಿರಿ</translation> <translation id="1413809658975081374">ಗೌಪ್ಯತೆ ದೋಷ</translation> -<translation id="14171126816530869"><ph name="LOCALITY" /> ಯಲ್ಲಿರುವ <ph name="ORGANIZATION" /> ಗುರುತನ್ನು <ph name="ISSUER" /> ನಿಂದ ಪರಿಶೀಲಿಸಲಾಗಿದೆ.</translation> <translation id="1426410128494586442">ಹೌದು</translation> <translation id="1430915738399379752">ಮುದ್ರಿಸು</translation> <translation id="1455413310270022028">ಎರೇಸರ್</translation> @@ -255,6 +254,7 @@ <translation id="2262243747453050782">HTTP ದೋಷ</translation> <translation id="2263079731045660823">ಕ್ರೆಡಿಟ್ ಕಾರ್ಡ್ ಸ್ವಯಂ ಭರ್ತಿಯ ಮಾಹಿತಿಯನ್ನು Chrome ಸೆಟ್ಟಿಂಗ್ಗಳಲ್ಲಿ ಅಪ್ಡೇಟ್ ಮಾಡಿ</translation> <translation id="2270484714375784793">ಫೋನ್ ಸಂಖ್ಯೆ</translation> +<translation id="2277103315734023688">ಮುಂದಕ್ಕೆ ಸೀಕ್ ಮಾಡಿ</translation> <translation id="2283340219607151381">ವಿಳಾಸಗಳನ್ನು ಉಳಿಸಿ ಮತ್ತು ಭರ್ತಿ ಮಾಡಿ</translation> <translation id="2292556288342944218">ನಿಮ್ಮ ಇಂಟರ್ನೆಟ್ ಪ್ರವೇಶ ನಿರ್ಬಂಧಿಸಲಾಗಿದೆ</translation> <translation id="2297722699537546652">B5 (Envelope)</translation> @@ -381,7 +381,6 @@ <translation id="295526156371527179">ಎಚ್ಚರಿಕೆ: ಈ ಕಾರ್ಯನೀತಿಯು ನಿಘಂಟು ಆಗಿಲ್ಲದಿರುವ ಕಾರಣದಿಂದಾಗಿ, ಕಾರ್ಯನೀತಿಯ ಮೂಲಕ ನಿರ್ದಿಷ್ಟಪಡಿಸಿರುವಂತೆ ಅದನ್ನು ವಿಲೀನಗೊಳಿಸಲಾಗಿಲ್ಲ.</translation> <translation id="2955913368246107853">ಹುಡುಕಿ ಬಾರ್ ಅನ್ನು ಮುಚ್ಚಿ</translation> <translation id="2969319727213777354">ಸುರಕ್ಷಿತ ಸಂಪರ್ಕವನ್ನು ಸ್ಥಾಪಿಸಲು, ನಿಮ್ಮ ಗಡಿಯಾರವನ್ನು ಸರಿಯಾಗಿ ಹೊಂದಿಸಬೇಕಾದ ಅಗತ್ಯವಿದೆ. ವೆಬ್ಸೈಟ್ಗಳು ತಮ್ಮನ್ನು ಗುರುತಿಸಲು ಬಳಸುವ ಪ್ರಮಾಣಪತ್ರಗಳು ನಿರ್ದಿಷ್ಟ ಅವಧಿಗಳಲ್ಲಿ ಮಾತ್ರ ಮಾನ್ಯವಾಗಿರುವ ಕಾರಣ ಹೀಗಾಗುತ್ತದೆ. ನಿಮ್ಮ ಸಾಧನದ ಗಡಿಯಾರವು ತಪ್ಪಾಗಿರುವ ಕಾರಣ, Google Chrome ಗೆ ಈ ಪ್ರಮಾಣಪತ್ರಗಳನ್ನು ಪರಿಶೀಲಿಸಲು ಸಾಧ್ಯವಾಗುವುದಿಲ್ಲ.</translation> -<translation id="2970515157925768593">ನಿಮ್ಮ ಸಾಧನ ಮತ್ತು ಖಾತೆಯ ಸೆಟಪ್ ಅನ್ನು ದೂರದಿಂದಲೇ ಬದಲಾಯಿಸಬಹುದು.</translation> <translation id="2972581237482394796">&ಮತ್ತೆಮಾಡು</translation> <translation id="2977665033722899841"><ph name="ROW_NAME" />, ಪ್ರಸ್ತುತವಾಗಿ ಆಯ್ಕೆ ಮಾಡಿರುವುದು. <ph name="ROW_CONTENT" /></translation> <translation id="2982481275546140226">ಡೇಟಾ ತೆರವುಗೊಳಿಸಿ</translation> @@ -393,7 +392,6 @@ <translation id="3005723025932146533">ಉಳಿಸಲಾದ ನಕಲನ್ನು ತೋರಿಸು</translation> <translation id="3008447029300691911"><ph name="CREDIT_CARD" /> ಗೆ CVC ಅನ್ನು ನಮೂದಿಸಿ. ನೀವು ಒಮ್ಮೆ ಖಚಿತಪಡಿಸಿದರೆ, ನಿಮ್ಮ ಕಾರ್ಡ್ ವಿವರಗಳನ್ನು ಈ ಸೈಟ್ ಜೊತೆಗೆ ಹಂಚಿಕೊಳ್ಳಲಾಗುತ್ತದೆ.</translation> <translation id="3010559122411665027">ಪಟ್ಟಿ ನಮೂದು "<ph name="ENTRY_INDEX" />": <ph name="ERROR" /></translation> -<translation id="3014389611820813634">ಈ ಸಾಧನದ ನಿರ್ವಾಹಕರಾಗಿ, <ph name="ENROLLMENT_DOMAIN" />:</translation> <translation id="301521992641321250">ಸ್ವಯಂಚಾಲಿತವಾಗಿ ನಿರ್ಬಂಧಿಸಲಾಗಿದೆ</translation> <translation id="3023071826883856138">You4 (Envelope)</translation> <translation id="3024663005179499861">ತಪ್ಪಾದ ನೀತಿಯ ಪ್ರಕಾರ</translation> @@ -437,7 +435,6 @@ <translation id="3287510313208355388">ಆನ್ಲೈನ್ನಲ್ಲಿರುವಾಗ ಡೌನ್ಲೋಡ್ ಮಾಡಿ</translation> <translation id="3293642807462928945"><ph name="POLICY_NAME" /> ಕಾರ್ಯನೀತಿಯ ಕುರಿತು ಇನ್ನಷ್ಟು ತಿಳಿದುಕೊಳ್ಳಿ</translation> <translation id="3303855915957856445">ಯಾವುದೇ ಹುಡುಕಾಟ ಫಲಿತಾಂಶಗಳು ಕಂಡುಬಂದಿಲ್ಲ</translation> -<translation id="3311730110465560799">ನಿಮ್ಮ ಸಾಧನದ ಸೆಟಪ್ ಅನ್ನು ದೂರದಿಂದಲೇ ಬದಲಾಯಿಸಬಹುದು.</translation> <translation id="3320021301628644560">ಬಿಲ್ಲಿಂಗ್ ವಿಳಾಸವನ್ನು ಸೇರಿಸಿ</translation> <translation id="3324983252691184275">ಕಡುಗೆಂಪು</translation> <translation id="3338095232262050444">ಸುರಕ್ಷಿತ</translation> @@ -532,7 +529,6 @@ <translation id="3761718714832595332">ಸ್ಥಿತಿಯನ್ನು ಮರೆಮಾಡಿ</translation> <translation id="3765032636089507299">ಸುರಕ್ಷಿತ ಬ್ರೌಸಿಂಗ್ ಪುಟವು ನಿರ್ಮಾಣ ಹಂತದಲ್ಲಿದೆ.</translation> <translation id="3778403066972421603">ಈ ಕಾರ್ಡ್ ಅನ್ನು ನಿಮ್ಮ Google ಖಾತೆ ಮತ್ತು ಈ ಸಾಧನದಲ್ಲಿ ಉಳಿಸಲು ಬಯಸುವಿರಾ?</translation> -<translation id="3779973883630527594">ಈ ಖಾತೆಯನ್ನು ನಿರ್ವಹಿಸುವಂತಹ ಕಂಪನಿ, ಶಾಲೆ ಅಥವಾ ಸಂಸ್ಥೆ:</translation> <translation id="3781428340399460090">ಗಾಢ ಗುಲಾಬಿ</translation> <translation id="3783418713923659662">Mastercard</translation> <translation id="3787705759683870569">ಅವಧಿ-ಮುಕ್ತಾಯ <ph name="EXPIRATION_MONTH" />/<ph name="EXPIRATION_YEAR" /></translation> @@ -556,6 +552,7 @@ <translation id="3949571496842715403">ಈ ಸರ್ವರ್ <ph name="DOMAIN" /> ಆಗಿದೆ ಎಂಬುದನ್ನು ಸಾಬೀತುಪಡಿಸಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ; ಅದರ ಸುರಕ್ಷತಾ ಪ್ರಮಾಣ ಪತ್ರವು ವಿಷಯವಸ್ತು ಪರ್ಯಾಯ ಹೆಸರುಗಳನ್ನು ನಿರ್ದಿಷ್ಟಪಡಿಸಿಲ್ಲ. ಇದು ತಪ್ಪು ಕಾನ್ಫಿಗರೇಶನ್ನಿಂದ ಅಥವಾ ಆಕ್ರಮಣಕಾರರು ನಿಮ್ಮ ಸಂಪರ್ಕದಲ್ಲಿ ಒಳನುಸುಳಿರುವುದರಿಂದ ಆಗಿರಬಹುದು.</translation> <translation id="3949601375789751990">ನಿಮ್ಮ ಬ್ರೌಸಿಂಗ್ ಇತಿಹಾಸ ಇಲ್ಲಿ ಕಾಣಿಸಿಕೊಳ್ಳುತ್ತದೆ</translation> <translation id="3950820424414687140">ಸೈನ್ ಇನ್</translation> +<translation id="3962859241508114581">ಹಿಂದಿನ ಟ್ರ್ಯಾಕ್</translation> <translation id="3963837677003247395">ಹಸ್ತಚಾಲಿತವಾಗಿ ಮುಂದುವರಿಸಬೇಕೆ?</translation> <translation id="3964661563329879394">{COUNT,plural, =0{ಯಾವುದೂ ಇಲ್ಲ}=1{1 ಸೈಟ್ನಿಂದ }one{# ಸೈಟ್ಗಳಿಂದ }other{# ಸೈಟ್ಗಳಿಂದ }}</translation> <translation id="397105322502079400">ಎಣಿಸಲಾಗುತ್ತಿದೆ...</translation> @@ -578,6 +575,7 @@ <translation id="410351446219883937">ಆಟೋಪ್ಲೇ</translation> <translation id="4103763322291513355">ನಿಮ್ಮ ಸಿಸ್ಟಂ ನಿರ್ವಾಹಕರು ವಿಧಿಸಿರುವ ಕಪ್ಪುಪಟ್ಟಿಯ URLಗಳು ಮತ್ತು ಇತರ ನೀತಿಗಳನ್ನು ವೀಕ್ಷಿಸಲು <strong>chrome://policy</strong> ಗೆ ಭೇಟಿ ನೀಡಿ.</translation> <translation id="4110652170750985508">ನಿಮ್ಮ ಪಾವತಿಯನ್ನು ಪರಿಶೀಲಿಸಿ</translation> +<translation id="4112140312785995938">ಹಿಂದಕ್ಕೆ ಸೀಕ್ ಮಾಡಿ</translation> <translation id="4116663294526079822">ಈ ಸೈಟ್ನಲ್ಲಿ ಯಾವಾಗಲೂ ಅನುಮತಿಸಿ</translation> <translation id="4117700440116928470">ನೀತಿಯ ವ್ಯಾಪ್ತಿಯು ಬೆಂಬಲಿತವಾಗಿಲ್ಲ.</translation> <translation id="4129401438321186435">{COUNT,plural, =1{1 ಇತರೆ}one{# ಇತರೆ}other{# ಇತರೆ}}</translation> @@ -656,6 +654,7 @@ <translation id="443673843213245140">ಪ್ರಾಕ್ಸಿಯ ಬಳಕೆಯನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ ಆದರೆ ಬಹಿರಂಗ ಪ್ರಾಕ್ಸಿ ಕಾನ್ಫಿಗರೇಶನ್ ಅನ್ನು ನಿರ್ದಿಷ್ಟಪಡಿಸಲಾಗಿದೆ.</translation> <translation id="445100540951337728">ಸಮ್ಮತಿಸಲಾದ ಡೆಬಿಟ್ ಕಾರ್ಡ್ಗಳು</translation> <translation id="4466881336512663640">ಫಾರ್ಮ್ನಲ್ಲಿ ಮಾಡಿರುವ ಬದಲಾವಣೆಗಳು ಕಳೆದು ಹೋಗುತ್ತವೆ. ನೀವು ಖಂಡಿತವಾಗಿಯೂ ಮುಂದುವರಿಯಲು ಬಯಸುತ್ತೀರಾ?</translation> +<translation id="4477350412780666475">ಮುಂದಿನ ಟ್ರ್ಯಾಕ್</translation> <translation id="4482953324121162758">ಈ ಸೈಟ್ ಅನುವಾದಕ್ಕೆ ಒಳಪಡುವುದಿಲ್ಲ.</translation> <translation id="4490717597759821841">A7</translation> <translation id="4493480324863638523">ಅಮಾನ್ಯ URL. ಪ್ರಮಾಣಿತ ವ್ಯವಸ್ಥೆಯೊಂದಿಗಿನ URL ಆಗಿರಬೇಕು, ಉದಾ. http://example.com or https://example.com.</translation> @@ -902,7 +901,6 @@ <translation id="5838278095973806738">ಈ ಸೈಟ್ನಲ್ಲಿ ನೀವು ಯಾವುದೇ ಸೂಕ್ಷ್ಮ ಮಾಹಿತಿಯನ್ನು (ಉದಾಹರಣೆಗೆ, ಪಾಸ್ವರ್ಡ್ಗಳು ಅಥವಾ ಕ್ರೆಡಿಟ್ ಕಾರ್ಡ್ಗಳು) ನಮೂದಿಸಬಾರದು, ಏಕೆಂದರೆ ಅದು ದಾಳಿಕೋರರ ಮೂಲಕ ಕಳುವಾಗಬಹುದು.</translation> <translation id="5860033963881614850">ಆಫ್</translation> <translation id="5863847714970149516">ಮುಂದಿನ ಪುಟವು ನಿಮಗೆ ಶುಲ್ಕ ವಿಧಿಸಲು ಪ್ರಯತ್ನಿಸಬಹುದು</translation> -<translation id="5865951947699094510">ನಿಮ್ಮ ಖಾತೆಯ ಸೆಟಪ್ ಅನ್ನು ದೂರದಿಂದಲೇ ಬದಲಾಯಿಸಬಹುದು.</translation> <translation id="5866257070973731571">ಫೋನ್ ಸಂಖ್ಯೆಯನ್ನು ಸೇರಿಸಿ</translation> <translation id="5869405914158311789">ಈ ಸೈಟ್ ತಲುಪಲಾಗುವುದಿಲ್ಲ</translation> <translation id="5869522115854928033">ಉಳಿಸಲಾದ ಪಾಸ್ವರ್ಡ್ಗಳು</translation> @@ -1054,6 +1052,7 @@ <translation id="6778737459546443941">ನಿಮ್ಮ ಪೋಷಕರು ಇನ್ನೂ ಇದನ್ನು ಅಂಗೀಕರಿಸಿಲ್ಲ</translation> <translation id="67862343314499040">ನೇರಳೆ</translation> <translation id="6786747875388722282">ವಿಸ್ತರಣೆಗಳು</translation> +<translation id="6790428901817661496">ಪ್ಲೇ ಮಾಡು</translation> <translation id="679355240208270552">ಡೀಫಾಲ್ಟ್ ಹುಡುಕಾಟವನ್ನು ನೀತಿಯ ಮೂಲಕ ಸಕ್ರಿಯಗೊಳಿಸದ ಕಾರಣ ನಿರ್ಲಕ್ಷಿಸಲಾಗಿದೆ.</translation> <translation id="681021252041861472">ಅಗತ್ಯವಿರುವ ಕ್ಷೇತ್ರ</translation> <translation id="6810899417690483278">ಕಸ್ಟಮೈಸೇಶನ್ ಐಡಿ</translation> @@ -1157,6 +1156,7 @@ <translation id="7353601530677266744">ಕಮಾಂಡ್ ಸಾಲು</translation> <translation id="7372973238305370288">ಹುಡುಕಾಟ ಫಲಿತಾಂಶ</translation> <translation id="7377249249140280793"><ph name="RELATIVE_DATE" /> - <ph name="FULL_DATE" /></translation> +<translation id="7378594059915113390">ಮೀಡಿಯಾ ನಿಯಂತ್ರಣಗಳು</translation> <translation id="7378627244592794276">ಬೇಡ</translation> <translation id="7378810950367401542">/</translation> <translation id="7390545607259442187">ಕಾರ್ಡ್ ಅನ್ನು ದೃಢೀಕರಿಸಿ</translation> @@ -1259,7 +1259,6 @@ <translation id="780301667611848630">ಬೇಡ, ಧನ್ಯವಾದಗಳು</translation> <translation id="7805768142964895445">ಸ್ಥಿತಿ</translation> <translation id="7806344367022510803">ಹುಡುಕಾಟ ಎಂಜಿನ್ ಸೆಟ್ಟಿಂಗ್ಗಳನ್ನು Chrome ನಲ್ಲಿ ಬದಲಾಯಿಸಿ</translation> -<translation id="7810209002420871817">ನಿಮ್ಮ ಖಾತೆಯ ನಿರ್ವಾಹಕರಾಗಿ, <ph name="ACCOUNT_DOMAIN" />:</translation> <translation id="7812922009395017822">Mir</translation> <translation id="7813600968533626083">Chrome ನಿಂದ ಫಾರ್ಮ್ ಸಲಹೆಯನ್ನು ತೆಗೆದುಹಾಕುವುದೇ?</translation> <translation id="7815407501681723534"><ph name="NUMBER_OF_RESULTS" /> <ph name="SEARCH_RESULTS" /> ಗೆ '<ph name="SEARCH_STRING" />' ಕಂಡುಬಂದಿದೆ</translation>
diff --git a/components/strings/components_strings_ko.xtb b/components/strings/components_strings_ko.xtb index d37fa1de..eb4952d 100644 --- a/components/strings/components_strings_ko.xtb +++ b/components/strings/components_strings_ko.xtb
@@ -1,7 +1,6 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="ko"> -<translation id="1001338328714563407">기기 및 계정의 관리자로서 <ph name="ENROLLMENT_DOMAIN" />은(는) 다음을 할 수 있습니다.</translation> <translation id="1008557486741366299">나중에 하기</translation> <translation id="1010200102790553230">페이지 나중에 로드하기</translation> <translation id="1015730422737071372">추가 세부정보 제공</translation> @@ -41,6 +40,7 @@ <translation id="1161325031994447685">Wi-Fi에 다시 연결</translation> <translation id="1165039591588034296">오류</translation> <translation id="1175364870820465910">인쇄(&P)</translation> +<translation id="1178581264944972037">일시중지</translation> <translation id="1181037720776840403">삭제</translation> <translation id="1197088940767939838">오렌지색</translation> <translation id="1201402288615127009">다음</translation> @@ -100,7 +100,6 @@ <translation id="1405567553485452995">연한 녹색</translation> <translation id="1407135791313364759">모두 열기</translation> <translation id="1413809658975081374">개인정보 보호 오류</translation> -<translation id="14171126816530869"><ph name="LOCALITY" />에 위치한 <ph name="ORGANIZATION" />의 주소를 <ph name="ISSUER" />이(가) 확인했습니다.</translation> <translation id="1426410128494586442">예</translation> <translation id="1430915738399379752">인쇄</translation> <translation id="1455413310270022028">지우개</translation> @@ -256,6 +255,7 @@ <translation id="2262243747453050782">HTTP 오류</translation> <translation id="2263079731045660823">Chrome 설정에서 신용카드 자동 완성 정보를 업데이트하세요.</translation> <translation id="2270484714375784793">전화번호</translation> +<translation id="2277103315734023688">앞으로 탐색</translation> <translation id="2283340219607151381">주소 저장 및 자동 입력</translation> <translation id="2292556288342944218">인터넷 액세스가 차단됨</translation> <translation id="2297722699537546652">B5(봉투)</translation> @@ -383,7 +383,6 @@ <translation id="295526156371527179">경고: 이 정책은 사전이 아니므로 정책에 명시된 대로 사전으로 병합되지 않았습니다.</translation> <translation id="2955913368246107853">검색 바 닫기</translation> <translation id="2969319727213777354">보안 연결을 설정하려면 시계가 올바로 설정되어 있어야 합니다. 웹사이트가 자신을 식별하는 데 사용하는 인증서는 특정 기간에만 유효하기 때문입니다. 기기의 시계가 잘못 설정되어 Chrome에서 이 인증서를 확인할 수 없습니다.</translation> -<translation id="2970515157925768593">기기 및 계정 설정을 원격으로 변경할 수 있습니다.</translation> <translation id="2972581237482394796">다시 실행(&R)</translation> <translation id="2977665033722899841"><ph name="ROW_NAME" />이(가) 현재 선택되어 있습니다. <ph name="ROW_CONTENT" /></translation> <translation id="2982481275546140226">데이터 삭제</translation> @@ -395,7 +394,6 @@ <translation id="3005723025932146533">저장된 사본 표시</translation> <translation id="3008447029300691911"><ph name="CREDIT_CARD" /> 카드의 CVC를 입력하세요. 카드를 확인하면 카드 세부정보가 이 사이트와 공유됩니다.</translation> <translation id="3010559122411665027">목록 항목 '<ph name="ENTRY_INDEX" />': <ph name="ERROR" /></translation> -<translation id="3014389611820813634">기기의 관리자로서 <ph name="ENROLLMENT_DOMAIN" />은(는) 다음을 할 수 있습니다.</translation> <translation id="301521992641321250">자동으로 차단됨</translation> <translation id="3023071826883856138">You4(봉투)</translation> <translation id="3024663005179499861">잘못된 정책 유형</translation> @@ -441,7 +439,6 @@ <translation id="3287510313208355388">온라인 상태일 때 다운로드</translation> <translation id="3293642807462928945"><ph name="POLICY_NAME" /> 정책에 관해 자세히 알아보기</translation> <translation id="3303855915957856445">검색결과 없음</translation> -<translation id="3311730110465560799">기기 설정을 원격으로 변경할 수 있습니다.</translation> <translation id="3320021301628644560">청구지 주소 추가</translation> <translation id="3324983252691184275">진홍색</translation> <translation id="3338095232262050444">보안 연결</translation> @@ -537,7 +534,6 @@ <translation id="3761718714832595332">상태 숨기기</translation> <translation id="3765032636089507299">세이프 브라우징 페이지는 현재 준비 중입니다.</translation> <translation id="3778403066972421603">이 카드를 Google 계정과 이 기기에 저장하시겠습니까?</translation> -<translation id="3779973883630527594">이 계정을 관리하는 회사, 학교 또는 조직:</translation> <translation id="3781428340399460090">진한 분홍색</translation> <translation id="3783418713923659662">Mastercard</translation> <translation id="3787705759683870569">만료: <ph name="EXPIRATION_YEAR" />년 <ph name="EXPIRATION_MONTH" />월</translation> @@ -561,6 +557,7 @@ <translation id="3949571496842715403">보안 인증서에 주체 대체 이름(SAN)이 지정되어 있지 않아 이 서버가 <ph name="DOMAIN" />임을 입증할 수 없습니다. 서버를 잘못 설정했거나 공격자가 연결을 가로채고 있기 때문일 수도 있습니다.</translation> <translation id="3949601375789751990">인터넷 사용 기록이 여기에 표시됩니다.</translation> <translation id="3950820424414687140">로그인</translation> +<translation id="3962859241508114581">이전 트랙</translation> <translation id="3963837677003247395">직접 계속하시겠어요?</translation> <translation id="3964661563329879394">{COUNT,plural, =0{없음}=1{사이트 1개 }other{사이트 #개 }}</translation> <translation id="397105322502079400">계산 중...</translation> @@ -583,6 +580,7 @@ <translation id="410351446219883937">자동재생</translation> <translation id="4103763322291513355">차단된 URL 및 시스템 관리자가 설정한 기타 정책 목록을 확인하려면 <strong>chrome://policy</strong>를 방문하세요.</translation> <translation id="4110652170750985508">결제 검토</translation> +<translation id="4112140312785995938">뒤로 탐색</translation> <translation id="4116663294526079822">이 사이트에서 항상 허용</translation> <translation id="4117700440116928470">지원되지 않는 정책 범위입니다.</translation> <translation id="4129401438321186435">{COUNT,plural, =1{외 1개}other{외 #개}}</translation> @@ -661,6 +659,7 @@ <translation id="443673843213245140">프록시 사용은 중지되었지만 명시적 프록시 설정이 지정되어 있습니다.</translation> <translation id="445100540951337728">사용 가능한 직불카드</translation> <translation id="4466881336512663640">양식에서 변경한 사항이 삭제됩니다. 계속하시겠습니까?</translation> +<translation id="4477350412780666475">다음 트랙</translation> <translation id="4482953324121162758">이 사이트는 번역되지 않습니다.</translation> <translation id="4490717597759821841">A7</translation> <translation id="4493480324863638523">잘못된 URL입니다. URL에는 표준 스키마가 있어야 합니다(예: http://example.com 또는 https://example.com).</translation> @@ -907,7 +906,6 @@ <translation id="5838278095973806738">이 사이트에 입력하는 비밀번호나 신용카드 번호 등의 정보가 공격자에 의해 도용될 수 있습니다.</translation> <translation id="5860033963881614850">사용 안함</translation> <translation id="5863847714970149516">방문하려는 페이지에서 금액을 청구할 수 있습니다.</translation> -<translation id="5865951947699094510">계정 설정을 원격으로 변경할 수 있습니다.</translation> <translation id="5866257070973731571">전화번호 추가</translation> <translation id="5869405914158311789">사이트에 연결할 수 없음</translation> <translation id="5869522115854928033">저장된 비밀번호</translation> @@ -1060,6 +1058,7 @@ <translation id="6778737459546443941">부모님이 아직 승인하지 않았습니다.</translation> <translation id="67862343314499040">보라색</translation> <translation id="6786747875388722282">확장 프로그램</translation> +<translation id="6790428901817661496">재생</translation> <translation id="679355240208270552">정책에 의해 기본 검색이 사용 설정되지 않았기 때문에 무시되었습니다.</translation> <translation id="681021252041861472">필수 입력란</translation> <translation id="6810899417690483278">맞춤설정 ID</translation> @@ -1163,6 +1162,7 @@ <translation id="7353601530677266744">명령줄</translation> <translation id="7372973238305370288">검색결과</translation> <translation id="7377249249140280793"><ph name="RELATIVE_DATE" /> - <ph name="FULL_DATE" /></translation> +<translation id="7378594059915113390">미디어 컨트롤</translation> <translation id="7378627244592794276">안함</translation> <translation id="7378810950367401542">/</translation> <translation id="7390545607259442187">카드 확인</translation> @@ -1265,7 +1265,6 @@ <translation id="780301667611848630">아니요, 괜찮습니다.</translation> <translation id="7805768142964895445">상태</translation> <translation id="7806344367022510803">Chrome에서 검색엔진 설정을 변경하세요.</translation> -<translation id="7810209002420871817">계정의 관리자로서 <ph name="ACCOUNT_DOMAIN" />은(는) 다음을 할 수 있습니다.</translation> <translation id="7812922009395017822">Mir</translation> <translation id="7813600968533626083">Chrome에서 추천검색어를 삭제하시겠습니까?</translation> <translation id="7815407501681723534">'<ph name="SEARCH_STRING" />'에 대해 <ph name="SEARCH_RESULTS" /> <ph name="NUMBER_OF_RESULTS" />개의 검색 결과를 찾았습니다.</translation>
diff --git a/components/strings/components_strings_lt.xtb b/components/strings/components_strings_lt.xtb index 94d1595b..abc8bbb 100644 --- a/components/strings/components_strings_lt.xtb +++ b/components/strings/components_strings_lt.xtb
@@ -1,7 +1,6 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="lt"> -<translation id="1001338328714563407">Kaip jūsų įrenginio ir paskyros valdytojas (<ph name="ENROLLMENT_DOMAIN" />):</translation> <translation id="1008557486741366299">Ne dabar</translation> <translation id="1010200102790553230">Įkelti puslapį vėliau</translation> <translation id="1015730422737071372">Pateikti papildomos išsamios informacijos</translation> @@ -41,6 +40,7 @@ <translation id="1161325031994447685">Iš naujo prisijungti prie „Wi-Fi“</translation> <translation id="1165039591588034296">Klaida</translation> <translation id="1175364870820465910">&Spausdinti...</translation> +<translation id="1178581264944972037">Pristabdyti</translation> <translation id="1181037720776840403">Pašalinti</translation> <translation id="1197088940767939838">Oranžinė</translation> <translation id="1201402288615127009">Kitas</translation> @@ -100,7 +100,6 @@ <translation id="1405567553485452995">Šviesiai žalia</translation> <translation id="1407135791313364759">Atidaryti viską</translation> <translation id="1413809658975081374">Privatumo klaida</translation> -<translation id="14171126816530869"><ph name="ORGANIZATION" /> identiškumą <ph name="LOCALITY" /> patikrino <ph name="ISSUER" />.</translation> <translation id="1426410128494586442">Taip</translation> <translation id="1430915738399379752">Spausdinti</translation> <translation id="1455413310270022028">Trintukas</translation> @@ -256,6 +255,7 @@ <translation id="2262243747453050782">HTTP klaida</translation> <translation id="2263079731045660823">Atnaujinti kredito kortelės automatinio pildymo informaciją „Chrome“ nustatymuose</translation> <translation id="2270484714375784793">Telefono numeris</translation> +<translation id="2277103315734023688">Prasukti pirmyn</translation> <translation id="2283340219607151381">Išsaugoti ir užpildyti adresus</translation> <translation id="2292556288342944218">Interneto prieiga užblokuota</translation> <translation id="2297722699537546652">B5 (vokas)</translation> @@ -383,7 +383,6 @@ <translation id="295526156371527179">Įspėjimas: ši politika nebuvo sujungta kaip žodynas, kaip nurodyta politikoje, nes ji nėra žodynas.</translation> <translation id="2955913368246107853">Uždaryti paieškos juostą</translation> <translation id="2969319727213777354">Kad užmegztumėte saugų ryšį, turėsite tinkamai nustatyti laikrodį. To reikia, nes svetainių tapatybei įrodyti naudojami sertifikatai galioja tik tam tikru laikotarpiu. Įrenginio laikrodis nustatytas netinkamai, todėl „Google Chrome“ negali patvirtinti šių sertifikatų.</translation> -<translation id="2970515157925768593">Galima nuotoliniu būdu keisti įrenginio nustatymo ir paskyros kūrimo procesą.</translation> <translation id="2972581237482394796">&Atlikti iš naujo</translation> <translation id="2977665033722899841">„<ph name="ROW_NAME" />“, šiuo metu pasirinkta. <ph name="ROW_CONTENT" /></translation> <translation id="2982481275546140226">Išvalyti duomenis</translation> @@ -395,7 +394,6 @@ <translation id="3005723025932146533">Rodyti išsaugotą kopiją</translation> <translation id="3008447029300691911">Įveskite „<ph name="CREDIT_CARD" />“ kortelės saugos kodą (CVC). Kai patvirtinsite, išsami kortelės informacija bus bendrinama su šia svetaine.</translation> <translation id="3010559122411665027">Sąrašo įrašas „<ph name="ENTRY_INDEX" />“: <ph name="ERROR" /></translation> -<translation id="3014389611820813634">Kaip šio įrenginio valdytojas (<ph name="ENROLLMENT_DOMAIN" />):</translation> <translation id="301521992641321250">Automatiškai užblokuota</translation> <translation id="3023071826883856138">„You4“ (vokas)</translation> <translation id="3024663005179499861">Netinkamas politikos tipas</translation> @@ -442,7 +440,6 @@ <translation id="3287510313208355388">Atsisiųsti prisijungus</translation> <translation id="3293642807462928945">Sužinokite daugiau apie „<ph name="POLICY_NAME" />“ politiką</translation> <translation id="3303855915957856445">Nerasta jokių paieškos rezultatų</translation> -<translation id="3311730110465560799">Galima nuotoliniu būdu keisti įrenginio nustatymo procesą.</translation> <translation id="3320021301628644560">Atsiskaitymo adreso pridėjimas</translation> <translation id="3324983252691184275">Tamsiai raudona</translation> <translation id="3338095232262050444">Saugi</translation> @@ -538,7 +535,6 @@ <translation id="3761718714832595332">Slėpti būseną</translation> <translation id="3765032636089507299">Saugaus naršymo puslapis kuriamas.</translation> <translation id="3778403066972421603">Ar norite išsaugoti šią kortelę „Google“ paskyroje ir šiame įrenginyje?</translation> -<translation id="3779973883630527594">Šią paskyrą valdanti įmonė, mokykla arba organizacija:</translation> <translation id="3781428340399460090">Ryškiai rausva</translation> <translation id="3783418713923659662">Mastercard</translation> <translation id="3787705759683870569">Galiojimo laikas baigiasi <ph name="EXPIRATION_MONTH" /> / <ph name="EXPIRATION_YEAR" /></translation> @@ -562,6 +558,7 @@ <translation id="3949571496842715403">Šiam serveriui nepavyko patvirtinti, kad tai yra <ph name="DOMAIN" />; jo saugos sertifikate nenurodomi temos alternatyvūs pavadinimai. Tai gali būti dėl netinkamos konfigūracijos arba dėl ryšį pertraukusio užgrobėjo.</translation> <translation id="3949601375789751990">Naršymo istorija rodoma čia</translation> <translation id="3950820424414687140">Prisijungti</translation> +<translation id="3962859241508114581">Ankstesnis takelis</translation> <translation id="3963837677003247395">Tęsti patiems?</translation> <translation id="3964661563329879394">{COUNT,plural, =0{Nėra}=1{Iš 1 svetainės }one{Iš # svetainės }few{Iš # svetainių }many{Iš # svetainės }other{Iš # svetainių }}</translation> <translation id="397105322502079400">Skaičiuojama...</translation> @@ -584,6 +581,7 @@ <translation id="410351446219883937">Automatinis paleidimas</translation> <translation id="4103763322291513355">Apsilankykite <strong>chrome://policy</strong>, kad peržiūrėtumėte į juodąjį sąrašą įtrauktų URL sąrašą ir kitą politiką, kurią priverstinai paleido sistemos administratorius.</translation> <translation id="4110652170750985508">Mokėjimo peržiūra</translation> +<translation id="4112140312785995938">Prasukti atgal</translation> <translation id="4116663294526079822">Visada leisti šioje svetainėje</translation> <translation id="4117700440116928470">Politikos aprėptis nepalaikoma.</translation> <translation id="4129401438321186435">{COUNT,plural, =1{Dar 1}one{Dar #}few{Dar #}many{Dar #}other{Dar #}}</translation> @@ -662,6 +660,7 @@ <translation id="443673843213245140">Įgaliotojo serverio naudojimas neleidžiamas, bet nurodyta aiški įgaliotojo serverio konfigūracija.</translation> <translation id="445100540951337728">Tinkamos debeto kortelės</translation> <translation id="4466881336512663640">Formos pakeitimai bus prarasti. Ar tikrai norite tęsti?</translation> +<translation id="4477350412780666475">Kitas takelis</translation> <translation id="4482953324121162758">Ši svetainė nebus verčiama.</translation> <translation id="4490717597759821841">A7</translation> <translation id="4493480324863638523">Netinkamas URL. Tai turi būti įprastos schemos URL, pvz., http://example.com arba https://example.com.</translation> @@ -908,7 +907,6 @@ <translation id="5838278095973806738">Šioje svetainėje neturėtumėte pateikti neskelbtinos informacijos (pvz., slaptažodžių ar kredito kortelių numerių), nes ją gali pavogti užpuolikai.</translation> <translation id="5860033963881614850">Išjungta</translation> <translation id="5863847714970149516">Toliau pateiktame puslapyje gali būti bandoma jus apmokestinti</translation> -<translation id="5865951947699094510">Galima nuotoliniu būdu keisti paskyros kūrimo procesą.</translation> <translation id="5866257070973731571">Telefono numerio pridėjimas</translation> <translation id="5869405914158311789">Nepavyksta pasiekti šios svetainės</translation> <translation id="5869522115854928033">Išsaugoti slaptažodžiai</translation> @@ -1061,6 +1059,7 @@ <translation id="6778737459546443941">Jūsų tėtis ar mama dar jos nepatvirtino</translation> <translation id="67862343314499040">Violetinė</translation> <translation id="6786747875388722282">Plėtiniai</translation> +<translation id="6790428901817661496">Žaisti</translation> <translation id="679355240208270552">Nepaisoma, nes numatytoji paieška neįgalinta pagal politiką.</translation> <translation id="681021252041861472">Būtinas laukas</translation> <translation id="6810899417690483278">Tinkinimo ID</translation> @@ -1105,6 +1104,7 @@ <translation id="7053983685419859001">Blokuoti</translation> <translation id="7062635574500127092">Žalsvai mėlyna</translation> <translation id="7064851114919012435">Kontaktinė informacija</translation> +<translation id="7075452647191940183">Užklausa per didelė</translation> <translation id="7079718277001814089">Šioje svetainėje yra kenkėjiškų programų</translation> <translation id="7087282848513945231">Apskritis</translation> <translation id="7090678807593890770">Sistemoje „Google“ atlikite paiešką pagal užklausą „<ph name="LINK" />“</translation> @@ -1164,6 +1164,7 @@ <translation id="7353601530677266744">Komandos eilutė</translation> <translation id="7372973238305370288">paieškos rezultatas</translation> <translation id="7377249249140280793"><ph name="RELATIVE_DATE" /> - <ph name="FULL_DATE" /></translation> +<translation id="7378594059915113390">Medijos valdikliai</translation> <translation id="7378627244592794276">Ne</translation> <translation id="7378810950367401542">/</translation> <translation id="7390545607259442187">Kortelės patvirtinimas</translation> @@ -1267,7 +1268,6 @@ <translation id="780301667611848630">Ačiū, ne</translation> <translation id="7805768142964895445">Būsena</translation> <translation id="7806344367022510803">Keisti paieškos variklio nustatymus sistemoje „Chrome“</translation> -<translation id="7810209002420871817">Kaip jūsų paskyros valdytojas (<ph name="ACCOUNT_DOMAIN" />):</translation> <translation id="7812922009395017822">Mir</translation> <translation id="7813600968533626083">Pašalinti formos pasiūlymą iš „Chrome“?</translation> <translation id="7815407501681723534">Pagal terminą „<ph name="SEARCH_STRING" />“ surasta tiek <ph name="SEARCH_RESULTS" />: <ph name="NUMBER_OF_RESULTS" /></translation>
diff --git a/components/strings/components_strings_lv.xtb b/components/strings/components_strings_lv.xtb index 18c7fc3..d26b736 100644 --- a/components/strings/components_strings_lv.xtb +++ b/components/strings/components_strings_lv.xtb
@@ -1,7 +1,6 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="lv"> -<translation id="1001338328714563407">Jūsu ierīces un konta pārvaldnieks <ph name="ENROLLMENT_DOMAIN" /> var veikt tālāk norādītās darbības.</translation> <translation id="1008557486741366299">Vēlāk</translation> <translation id="1010200102790553230">Ielādēt lapu vēlāk</translation> <translation id="1015730422737071372">Sniegt papildu informāciju</translation> @@ -41,6 +40,7 @@ <translation id="1161325031994447685">Atkārtoti izveidojiet savienojumu ar Wi-Fi tīklu.</translation> <translation id="1165039591588034296">Kļūda</translation> <translation id="1175364870820465910">Drukāt...</translation> +<translation id="1178581264944972037">Pauzēt</translation> <translation id="1181037720776840403">Noņemt</translation> <translation id="1197088940767939838">Oranža</translation> <translation id="1201402288615127009">Tālāk</translation> @@ -99,7 +99,6 @@ <translation id="1405567553485452995">Gaiši zaļa</translation> <translation id="1407135791313364759">Atvērt visas</translation> <translation id="1413809658975081374">Konfidencialitātes kļūda</translation> -<translation id="14171126816530869"><ph name="ORGANIZATION" />identitāti<ph name="LOCALITY" />apstiprināja<ph name="ISSUER" /></translation> <translation id="1426410128494586442">Jā</translation> <translation id="1430915738399379752">Drukāt</translation> <translation id="1455413310270022028">Dzēšgumija</translation> @@ -252,6 +251,7 @@ <translation id="2262243747453050782">HTTP kļūda</translation> <translation id="2263079731045660823">Atjaunināt kredītkaršu automātisko aizpildi Chrome iestatījumos</translation> <translation id="2270484714375784793">Tālruņa numurs</translation> +<translation id="2277103315734023688">Pāriet uz priekšu</translation> <translation id="2283340219607151381">Saglabāt un aizpildīt adreses</translation> <translation id="2292556288342944218">Piekļuve internetam ir bloķēta</translation> <translation id="2297722699537546652">B5 (aploksne)</translation> @@ -376,7 +376,6 @@ <translation id="295526156371527179">Brīdinājums! Šī politika netika apvienota kā vārdnīca atbilstoši politikā noteiktajam, jo tā nav vārdnīca.</translation> <translation id="2955913368246107853">Aizvērt atrašanas joslu</translation> <translation id="2969319727213777354">Lai izveidotu drošu savienojumu, ir jāiestata pareizs pulksteņa laiks. Tas ir nepieciešams, jo sertifikāti, kurus vietnes izmanto, lai tiktu identificētas, ir derīgi tikai noteiktos laika periodos. Tā kā jūsu ierīces pulkstenis nav pareizs, Google Chrome nevar verificēt šos sertifikātus.</translation> -<translation id="2970515157925768593">Var attālināti mainīt jūsu ierīces un konta iestatījumus.</translation> <translation id="2972581237482394796">&Pāratsaukt</translation> <translation id="2977665033722899841">Pašlaik ir atlasīta rinda “<ph name="ROW_NAME" />”. <ph name="ROW_CONTENT" /></translation> <translation id="2982481275546140226">Notīrīt datus</translation> @@ -388,7 +387,6 @@ <translation id="3005723025932146533">Rādīt saglabāto versiju</translation> <translation id="3008447029300691911">Ievadiet kredītkartes <ph name="CREDIT_CARD" /> CVC. Pēc apstiprināšanas kartes informācija tiks kopīgota ar šo vietni.</translation> <translation id="3010559122411665027">Saraksta ieraksts “<ph name="ENTRY_INDEX" />”: <ph name="ERROR" /></translation> -<translation id="3014389611820813634">Šīs ierīces pārvaldnieks <ph name="ENROLLMENT_DOMAIN" /> var veikt tālāk norādītās darbības.</translation> <translation id="301521992641321250">Automātiski bloķēta</translation> <translation id="3023071826883856138">You4 (aploksne)</translation> <translation id="3024663005179499861">Politikas tips nav pareizs.</translation> @@ -434,7 +432,6 @@ <translation id="3287510313208355388">Lejupielādēt, kad pieejama tiešsaiste</translation> <translation id="3293642807462928945">Uzzināt vairāk par politiku <ph name="POLICY_NAME" /></translation> <translation id="3303855915957856445">Netika atrasts neviens meklēšanas rezultāts.</translation> -<translation id="3311730110465560799">Var attālināti mainīt jūsu ierīces iestatījumu.</translation> <translation id="3320021301628644560">Norēķinu adreses pievienošana</translation> <translation id="3324983252691184275">Tumši sarkana</translation> <translation id="3338095232262050444">Droši</translation> @@ -529,7 +526,6 @@ <translation id="3761718714832595332">Slēpt statusu</translation> <translation id="3765032636089507299">Drošās pārlūkošanas lapa pašlaik nav pieejama</translation> <translation id="3778403066972421603">Vai vēlaties saglabāt šo karti savā Google kontā un šajā ierīcē?</translation> -<translation id="3779973883630527594">Uzņēmums, mācību iestāde vai organizācija, kas pārvalda šo kontu:</translation> <translation id="3781428340399460090">Spilgti rozā</translation> <translation id="3783418713923659662">Mastercard</translation> <translation id="3787705759683870569">Derīguma termiņš: <ph name="EXPIRATION_MONTH" />/<ph name="EXPIRATION_YEAR" /></translation> @@ -553,6 +549,7 @@ <translation id="3949571496842715403">Šis serveris nevarēja pierādīt, ka šī ir vietne <ph name="DOMAIN" />; tā drošības sertifikātā nav norādīti temata citi nosaukumi. Iespējams, tas ir nepareizas konfigurācijas dēļ vai arī kāds ļaunprātīgi izmanto jūsu savienojumu.</translation> <translation id="3949601375789751990">Šeit ir redzama jūsu pārlūkošanas vēsture.</translation> <translation id="3950820424414687140">Pierakstīties</translation> +<translation id="3962859241508114581">Iepriekšējais ieraksts</translation> <translation id="3963837677003247395">Vai turpināt manuāli?</translation> <translation id="3964661563329879394">{COUNT,plural, =0{Nav}=1{No 1 vietnes }zero{No # vietnēm }one{No # vietnes }other{No # vietnēm }}</translation> <translation id="397105322502079400">Aprēķina...</translation> @@ -575,6 +572,7 @@ <translation id="410351446219883937">Automātiskā atskaņošana</translation> <translation id="4103763322291513355">Apmeklējiet vietni <strong>chrome://policy</strong>, lai skatītu melnajā sarakstā iekļautos vietrāžus URL, kā arī citas politikas, ko noteicis sistēmas administrators.</translation> <translation id="4110652170750985508">Maksājuma pārskatīšana</translation> +<translation id="4112140312785995938">Pārtīt atpakaļ</translation> <translation id="4116663294526079822">Vienmēr atļaut šajā vietnē</translation> <translation id="4117700440116928470">Politikas diapazons netiek atbalstīts.</translation> <translation id="4129401438321186435">{COUNT,plural, =1{vēl 1}zero{vēl #}one{vēl #}other{vēl #}}</translation> @@ -653,6 +651,7 @@ <translation id="443673843213245140">Starpniekservera lietošana ir atspējota, bet ir norādīta atklāta starpniekservera konfigurācija.</translation> <translation id="445100540951337728">Atbalstītās debetkartes</translation> <translation id="4466881336512663640">Veidlapas izmaiņas tiks zaudētas. Vai tiešām vēlaties turpināt?</translation> +<translation id="4477350412780666475">Nākamais ieraksts</translation> <translation id="4482953324121162758">Šī vietne netiks tulkota.</translation> <translation id="4490717597759821841">A7</translation> <translation id="4493480324863638523">Nederīgs URL. Vietrādim URL ir jābūt ar standarta shēmu, piemēram, “http://example.com” vai “https://example.com”.</translation> @@ -899,7 +898,6 @@ <translation id="5838278095973806738">Neievadiet šajā vietnē sensitīvu informāciju (piemēram, paroles vai kredītkartes), jo to var nozagt uzbrucēji.</translation> <translation id="5860033963881614850">Izsl.</translation> <translation id="5863847714970149516">Nākamajā lapā var tikt mēģināts pieprasīt naudu</translation> -<translation id="5865951947699094510">Var attālināti mainīt jūsu konta iestatījumus.</translation> <translation id="5866257070973731571">Tālruņa numura pievienošana</translation> <translation id="5869405914158311789">Šī vietne nav sasniedzama</translation> <translation id="5869522115854928033">Saglabātās paroles</translation> @@ -1052,6 +1050,7 @@ <translation id="6778737459546443941">Neviens no jūsu vecākiem vēl nav to apstiprinājis</translation> <translation id="67862343314499040">Violeta</translation> <translation id="6786747875388722282">Paplašinājumi</translation> +<translation id="6790428901817661496">Atskaņot</translation> <translation id="679355240208270552">Politika ignorēta, jo noklusējuma meklēšana nav iespējota politikā.</translation> <translation id="681021252041861472">Obligātais lauks</translation> <translation id="6810899417690483278">Pielāgošanas ID</translation> @@ -1096,6 +1095,7 @@ <translation id="7053983685419859001">Bloķēt</translation> <translation id="7062635574500127092">Zilganzaļa</translation> <translation id="7064851114919012435">Kontaktinformācija</translation> +<translation id="7075452647191940183">Pieprasījums ir pārāk liels</translation> <translation id="7079718277001814089">Šī vietne satur ļaunprātīgu programmatūru</translation> <translation id="7087282848513945231">Grāfiste</translation> <translation id="7090678807593890770">Veiciet Google meklēšanu, izmantojot vaicājumu “<ph name="LINK" />”</translation> @@ -1152,6 +1152,7 @@ <translation id="7353601530677266744">Komandrinda</translation> <translation id="7372973238305370288">meklēšanas rezultāts</translation> <translation id="7377249249140280793"><ph name="RELATIVE_DATE" /> - <ph name="FULL_DATE" /></translation> +<translation id="7378594059915113390">Multivides vadīklas</translation> <translation id="7378627244592794276">Nē</translation> <translation id="7378810950367401542">/</translation> <translation id="7390545607259442187">Kartes apstiprināšana</translation> @@ -1255,7 +1256,6 @@ <translation id="780301667611848630">Nē, paldies</translation> <translation id="7805768142964895445">Statuss</translation> <translation id="7806344367022510803">Mainīt meklētājprogrammas iestatījumus pārlūkā Chrome</translation> -<translation id="7810209002420871817">Kā jūsu konta <ph name="ACCOUNT_DOMAIN" />pārvaldnieks.</translation> <translation id="7812922009395017822">Mir</translation> <translation id="7813600968533626083">Vai noņemt veidlapas ieteikumu no pārlūka Chrome?</translation> <translation id="7815407501681723534">Meklējot pēc virknes “<ph name="SEARCH_STRING" />”, tika atrasti <ph name="NUMBER_OF_RESULTS" /> <ph name="SEARCH_RESULTS" /></translation>
diff --git a/components/strings/components_strings_ml.xtb b/components/strings/components_strings_ml.xtb index f50b3cb5..461a343 100644 --- a/components/strings/components_strings_ml.xtb +++ b/components/strings/components_strings_ml.xtb
@@ -1,7 +1,6 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="ml"> -<translation id="1001338328714563407">നിങ്ങളുടെ ഉപകരണത്തിൻ്റെയും അക്കൗണ്ടിൻ്റെയും മാനേജരെന്ന നിലയിൽ, <ph name="ENROLLMENT_DOMAIN" />:</translation> <translation id="1008557486741366299">ഇപ്പോഴല്ല</translation> <translation id="1010200102790553230">പേജ് പിന്നീട് ലോഡ് ചെയ്യുക</translation> <translation id="1015730422737071372">കൂടുതൽ വിശദാംശങ്ങൾ നൽകുക</translation> @@ -41,6 +40,7 @@ <translation id="1161325031994447685">Wi-Fi-ലേക്ക് വീണ്ടും കണക്റ്റുചെയ്യുന്നു</translation> <translation id="1165039591588034296">പിശക്</translation> <translation id="1175364870820465910">&അച്ചടിക്കൂ...</translation> +<translation id="1178581264944972037">അല്പംനിര്ത്തൂ</translation> <translation id="1181037720776840403">നീക്കംചെയ്യൂ</translation> <translation id="1197088940767939838">ഓറഞ്ച്</translation> <translation id="1201402288615127009">അടുത്തത്</translation> @@ -98,7 +98,6 @@ <translation id="1405567553485452995">ഇളം പച്ച</translation> <translation id="1407135791313364759">എല്ലാം തുറക്കുക</translation> <translation id="1413809658975081374">സ്വകാര്യ പിശക്</translation> -<translation id="14171126816530869"><ph name="LOCALITY" /> ലെ <ph name="ORGANIZATION" /> ന്റെ വ്യക്തിത്വം <ph name="ISSUER" /> പരിശോധിച്ചു.</translation> <translation id="1426410128494586442">അതെ</translation> <translation id="1430915738399379752">അച്ചടിക്കുക</translation> <translation id="1455413310270022028">ഇറേസർ</translation> @@ -251,6 +250,7 @@ <translation id="2262243747453050782">HTTP പിശക്</translation> <translation id="2263079731045660823">Chrome ക്രമീകരണത്തിൽ ക്രെഡിറ്റ് കാർഡിന്റെ സ്വമേധയാ പൂരിപ്പിക്കൽ വിവരം അപ്ഡേറ്റ് ചെയ്യുക</translation> <translation id="2270484714375784793">ഫോൺ നമ്പർ</translation> +<translation id="2277103315734023688">മുന്നോട്ട് നീക്കുക</translation> <translation id="2283340219607151381">വിലാസങ്ങൾ സംരക്ഷിച്ച് സ്വമേധയാ പൂരിപ്പിക്കുക</translation> <translation id="2292556288342944218">നിങ്ങളുടെ ഇന്റർനെറ്റ് ആക്സസ് തടഞ്ഞു</translation> <translation id="2297722699537546652">B5 (എൻവലപ്പ്)</translation> @@ -375,7 +375,6 @@ <translation id="295526156371527179">മുന്നറിയിപ്പ്: ഈ നയം ഒരു നിഘണ്ടു അല്ലാത്തതിനാലാണ് നയത്തിൽ വ്യക്തമാക്കിയിരിക്കുന്നത് പോലെ ഇത് ഒരു നിഘണ്ടുവായി ലയിപ്പിക്കാത്തത്.</translation> <translation id="2955913368246107853">ഫൈന്ഡ് ബാര് അടയ്ക്കുക</translation> <translation id="2969319727213777354">ഒരു സുരക്ഷിത കണക്ഷൻ സ്ഥാപിക്കുന്നതിന്, നിങ്ങളുടെ ക്ലോക്ക് ശരിയായി സജ്ജീകരിക്കേണ്ടതുണ്ട്. വെബ്സൈറ്റുകൾ സ്വയം തിരിച്ചറിയുന്നതിന് ഉപയോഗിക്കുന്ന സർട്ടിഫിക്കറ്റുകൾ, നിർദ്ദിഷ്ട സമയ പരിധിയിൽ മാത്രം സാധുതയുള്ളതിനാലാണിത്. നിങ്ങളുടെ ഉപകരണത്തിന്റെ ക്ലോക്ക് തെറ്റായിരിക്കുന്നതിനാൽ, Google Chrome-ന് ഈ സർട്ടിഫിക്കറ്റുകൾ പരിശോധിച്ചുറപ്പിക്കാനാവില്ല.</translation> -<translation id="2970515157925768593">നിങ്ങളുടെ ഉപകരണ, അക്കൗണ്ട് സജ്ജീകരണം റിമോട്ടായി മാറ്റാനാവും.</translation> <translation id="2972581237482394796">&വീണ്ടും ചെയ്യുക</translation> <translation id="2977665033722899841"><ph name="ROW_NAME" />, നിലവിൽ തിരഞ്ഞെടുത്തു. <ph name="ROW_CONTENT" /></translation> <translation id="2982481275546140226">ഡാറ്റ മായ്ക്കുക</translation> @@ -387,7 +386,6 @@ <translation id="3005723025932146533">സംരക്ഷിച്ച പകർപ്പ് കാണിക്കുക</translation> <translation id="3008447029300691911"><ph name="CREDIT_CARD" />-ന്റെ CVC നൽകുക. സ്ഥിരീകരിച്ച് കഴിഞ്ഞാൽ, നിങ്ങളുടെ കാർഡ് വിശദാംശങ്ങൾ ഈ സൈറ്റുമായി പങ്കിടും.</translation> <translation id="3010559122411665027">ലിസ്റ്റ് എൻട്രി "<ph name="ENTRY_INDEX" />": <ph name="ERROR" /></translation> -<translation id="3014389611820813634">ഈ ഉപകരണത്തിൻ്റെ മാനേജരെന്ന നിലയിൽ, <ph name="ENROLLMENT_DOMAIN" />:</translation> <translation id="301521992641321250">സ്വയമേവ ബ്ലോക്കുചെയ്തു</translation> <translation id="3023071826883856138">You4 (എൻവലപ്പ്)</translation> <translation id="3024663005179499861">തെറ്റായ നയ തരം</translation> @@ -432,7 +430,6 @@ <translation id="3287510313208355388">ഓൺലൈൻ ആയിരിക്കുന്ന സമയത്ത് ഡൗൺലോഡ് ചെയ്യുക</translation> <translation id="3293642807462928945"><ph name="POLICY_NAME" /> നയത്തെ കുറിച്ച് കൂടുതലറിയുക</translation> <translation id="3303855915957856445">തിരയൽ ഫലങ്ങളൊന്നും കണ്ടെത്തിയില്ല</translation> -<translation id="3311730110465560799">നിങ്ങളുടെ ഉപകരണ സജ്ജീകരണം റിമോട്ട് ആയി മാറ്റാം.</translation> <translation id="3320021301628644560">ബില്ലിംഗ് വിലാസം ചേർക്കുക</translation> <translation id="3324983252691184275">ക്രിംസൺ</translation> <translation id="3338095232262050444">സുരക്ഷിതം</translation> @@ -528,7 +525,6 @@ <translation id="3761718714832595332">സ്റ്റാറ്റസ് മറയ്ക്കുക</translation> <translation id="3765032636089507299">സുരക്ഷിത ബ്രൗസിംഗ് പേജ് നിർമ്മാണത്തിലാണ്.</translation> <translation id="3778403066972421603">ഈ കാർഡ് നിങ്ങളുടെ Google അക്കൗണ്ടിലും ഈ ഉപകരണത്തിലും സംരക്ഷിക്കണോ?</translation> -<translation id="3779973883630527594">ഈ അക്കൗണ്ട് മാനേജ് ചെയ്യുന്ന കമ്പനി, സ്കൂൾ അല്ലെങ്കിൽ സ്ഥാപനം:</translation> <translation id="3781428340399460090">ഹോട്ട് പിങ്ക്</translation> <translation id="3783418713923659662">Mastercard</translation> <translation id="3787705759683870569"><ph name="EXPIRATION_MONTH" />/<ph name="EXPIRATION_YEAR" />-ൽ അവസാനിക്കുന്നു</translation> @@ -552,6 +548,7 @@ <translation id="3949571496842715403">ഈ സെർവറിന് ഇത് <ph name="DOMAIN" /> ആണെന്ന് തെളിയിക്കാനായില്ല; അതിന്റെ സുരക്ഷാ സർട്ടിഫിക്കറ്റ് വിഷയേതര നാമങ്ങൾ വ്യക്തമാക്കുന്നില്ല. തെറ്റായ കോൺഫിഗറേഷൻ കാരണമോ ഒരു അക്രമി നിങ്ങളുടെ കണക്ഷനെ തടസ്സപ്പെടുത്തുന്നത് കൊണ്ടോ ആയിരിക്കാം ഇത് സംഭവിച്ചത്.</translation> <translation id="3949601375789751990">നിങ്ങളുടെ ബ്രൗസിംഗ് ചരിത്രം ഇവിടെ ദൃശ്യമാകും</translation> <translation id="3950820424414687140">സൈൻ ഇൻ</translation> +<translation id="3962859241508114581">മുമ്പത്തെ ട്രാക്ക്</translation> <translation id="3963837677003247395">നേരിട്ട് തുടരണോ?</translation> <translation id="3964661563329879394">{COUNT,plural, =0{ഒന്നുമില്ല}=1{ഒരു സൈറ്റിൽ നിന്ന് }other{# സൈറ്റുകളിൽ നിന്ന് }}</translation> <translation id="397105322502079400">കണക്കാക്കുന്നു...</translation> @@ -574,6 +571,7 @@ <translation id="410351446219883937">സ്വയം പ്ലേചെയ്യൽ</translation> <translation id="4103763322291513355">ബ്ലാക്ക്ലിസ്റ്റിൽപ്പെട്ട URL-കളുടെ ലിസ്റ്റും നിങ്ങളുടെ സിസ്റ്റം അഡ്മിനിസ്ട്രേറ്റർ നടപ്പിലാക്കിയ മറ്റ് നയങ്ങളും കാണുന്നതിന് <strong>chrome://policy</strong> സന്ദർശിക്കുക.</translation> <translation id="4110652170750985508">നിങ്ങളുടെ പേയ്മെന്റ് അവലോകനം ചെയ്യുക</translation> +<translation id="4112140312785995938">പുറകിലേക്ക് നീക്കുക</translation> <translation id="4116663294526079822">ഈ സൈറ്റിൽ എല്ലായ്പ്പോഴും അനുവദിക്കുക</translation> <translation id="4117700440116928470">നയ പരിധി പിന്തുണയ്ക്കുന്നില്ല.</translation> <translation id="4129401438321186435">{COUNT,plural, =1{മറ്റൊരെണ്ണം}other{മറ്റ് # എണ്ണം}}</translation> @@ -652,6 +650,7 @@ <translation id="443673843213245140">പ്രോക്സി ഉപയോഗം അപ്രാപ്തമാക്കി പക്ഷെ ഒരു വ്യക്തമായ പ്രോക്സി കോൺഫിഗറേഷൻ നിർദ്ദേശിച്ചു.</translation> <translation id="445100540951337728">ഡെബിറ്റ് കാർഡുകൾ സ്വീകരിക്കുന്നു</translation> <translation id="4466881336512663640">ഫോം മാറ്റങ്ങൾ നഷ്ടമാകും. തുടരണമെന്ന് നിങ്ങൾക്ക് തീർച്ചയാണോ?</translation> +<translation id="4477350412780666475">അടുത്ത ട്രാക്ക്</translation> <translation id="4482953324121162758">ഈ സൈറ്റ് വിവർത്തനം ചെയ്യപ്പെടില്ല.</translation> <translation id="4490717597759821841">A7</translation> <translation id="4493480324863638523">URL അസാധുവാണ്. സ്റ്റാൻഡേർഡ് സ്കീം ഉള്ള URL ആയിരിക്കണം, ഉദാ. http://example.com അല്ലെങ്കിൽ https://example.com.</translation> @@ -898,7 +897,6 @@ <translation id="5838278095973806738">അക്രമകാരികൾ മോഷ്ടിക്കാൻ സാധ്യതയുള്ളതിനാൽ ഈ സൈറ്റിൽ നിങ്ങളുടെ രഹസ്യ വിവരങ്ങളൊന്നും (ഉദാഹരണത്തിന്, പാസ്വേഡുകളോ ക്രെഡിറ്റ് കാർഡുകളോ പോലുള്ളവ) നൽകരുത്.</translation> <translation id="5860033963881614850">ഓഫാക്കുക</translation> <translation id="5863847714970149516">മുമ്പോട്ടുള്ള പേജ് നിങ്ങളിൽ നിന്ന് പണമീടാക്കാൻ ശ്രമിച്ചേക്കാം</translation> -<translation id="5865951947699094510">നിങ്ങളുടെ അക്കൗണ്ട് സജ്ജീകരണം റിമോട്ട് ആയി മാറ്റാം.</translation> <translation id="5866257070973731571">ഫോണ് നമ്പര് ചേര്ക്കുക</translation> <translation id="5869405914158311789">ഈ സൈറ്റ് ലഭ്യമാക്കാനാകുന്നില്ല</translation> <translation id="5869522115854928033">സംരക്ഷിച്ച പാസ്വേഡുകള്</translation> @@ -1051,6 +1049,7 @@ <translation id="6778737459546443941">നിങ്ങളുടെ രക്ഷിതാവ് ഇതുവരെ അംഗീകാരം നൽകിയിട്ടില്ല</translation> <translation id="67862343314499040">വയലറ്റ്</translation> <translation id="6786747875388722282">വിപുലീകരണങ്ങള്</translation> +<translation id="6790428901817661496">പ്ലേചെയ്യുക</translation> <translation id="679355240208270552">നയ പ്രകാരം, ഡിഫോൾട്ട് തിരയൽ പ്രവർത്തനക്ഷമമാക്കാത്തതിനാൽ അവഗണിച്ചു.</translation> <translation id="681021252041861472">ഇത് പൂരിപ്പിക്കേണ്ടതുണ്ട്</translation> <translation id="6810899417690483278">ഇഷ്ടാനുസൃതമാക്കൽ ഐഡി</translation> @@ -1151,6 +1150,7 @@ <translation id="7353601530677266744">കമാന്റ് ലൈന്</translation> <translation id="7372973238305370288">തിരയൽ ഫലം</translation> <translation id="7377249249140280793"><ph name="RELATIVE_DATE" /> - <ph name="FULL_DATE" /></translation> +<translation id="7378594059915113390">മീഡിയ നിയന്ത്രണങ്ങൾ</translation> <translation id="7378627244592794276">വേണ്ട</translation> <translation id="7378810950367401542">/</translation> <translation id="7390545607259442187">കാർഡ് സ്ഥിരീകരിക്കുക</translation> @@ -1252,7 +1252,6 @@ <translation id="780301667611848630">വേണ്ട നന്ദി</translation> <translation id="7805768142964895445">നില</translation> <translation id="7806344367022510803">Chrome-ൽ തിരയല് യന്ത്ര ക്രമീകരണം മാറ്റുക</translation> -<translation id="7810209002420871817">നിങ്ങളുടെ അക്കൗണ്ടിൻ്റെ മാനേജരെന്ന നിലയിൽ, <ph name="ACCOUNT_DOMAIN" />:</translation> <translation id="7812922009395017822">Mir</translation> <translation id="7813600968533626083">Chrome-ൽ നിന്നുള്ള നിർദ്ദേശം നീക്കംചെയ്യണോ?</translation> <translation id="7815407501681723534">'<ph name="SEARCH_STRING" />' എന്നതിന്റെ <ph name="NUMBER_OF_RESULTS" /> <ph name="SEARCH_RESULTS" /> കണ്ടു</translation>
diff --git a/components/strings/components_strings_mr.xtb b/components/strings/components_strings_mr.xtb index 94d12051..85cbad4 100644 --- a/components/strings/components_strings_mr.xtb +++ b/components/strings/components_strings_mr.xtb
@@ -1,7 +1,6 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="mr"> -<translation id="1001338328714563407">तुमच्या डिव्हाइस आणि खात्याचे, <ph name="ENROLLMENT_DOMAIN" /> व्यवस्थापक म्हणून:</translation> <translation id="1008557486741366299">सध्या नाही</translation> <translation id="1010200102790553230">पेज नंतर लोड करा</translation> <translation id="1015730422737071372">अतिरिक्त तपशील प्रदान करा</translation> @@ -41,6 +40,7 @@ <translation id="1161325031994447685">वाय-फाय शी पुन्हा कनेक्ट करत आहे</translation> <translation id="1165039591588034296">एरर</translation> <translation id="1175364870820465910">&मुद्रण...</translation> +<translation id="1178581264944972037">विराम द्या</translation> <translation id="1181037720776840403">काढून टाका</translation> <translation id="1197088940767939838">नारिंगी</translation> <translation id="1201402288615127009">पुढील</translation> @@ -100,7 +100,6 @@ <translation id="1405567553485452995">फिकट हिरवा</translation> <translation id="1407135791313364759">सर्व उघडा</translation> <translation id="1413809658975081374">गोपनीयता एरर</translation> -<translation id="14171126816530869"><ph name="ISSUER" /> द्वारे <ph name="LOCALITY" /> स्थित <ph name="ORGANIZATION" /> ची ओळख सत्यापित केली गेली आहे.</translation> <translation id="1426410128494586442">होय</translation> <translation id="1430915738399379752">प्रिंट</translation> <translation id="1455413310270022028">खोडरबर</translation> @@ -256,6 +255,7 @@ <translation id="2262243747453050782">HTTP एरर</translation> <translation id="2263079731045660823">Chrome सेटिंग्जमध्ये क्रेडिट कार्ड ऑटोफिल माहिती अपडेट करा</translation> <translation id="2270484714375784793">फोन नंबर</translation> +<translation id="2277103315734023688">पुढे जा</translation> <translation id="2283340219607151381">पत्ते भरा आणि सेव्ह करा</translation> <translation id="2292556288342944218">तुमचा इंटरनेट अॅक्सेस ब्लॉक केला आहे</translation> <translation id="2297722699537546652">B5 (Envelope)</translation> @@ -383,7 +383,6 @@ <translation id="295526156371527179">चेतावणी: धोरणामध्ये नमूद केल्याप्रमाणे हे धोरण शब्दकोश म्हणून विलीन केले नाही कारण तो एखादा शब्दकोश नाही.</translation> <translation id="2955913368246107853">शोध बार बंद करा</translation> <translation id="2969319727213777354">एक सुरक्षित कनेक्शन स्थापित करण्यापूर्वी, तुमचे घड्याळ योग्यरित्या सेट केले असणे आवश्यक आहे. वेबसाइट त्यांना स्वत:ला ओळखण्यासाठी वापरलेली ती सर्टिफिकेटे केवळ नमूद केलेल्या कालावधीसाठी वैध असल्याने हे असू शकते. तुमच्या डिव्हाइसचे घड्याळ चुकीचे असल्यामुळे, Google Chrome ला सर्टिफिकेट पडताळणी करता आली नाही.</translation> -<translation id="2970515157925768593">तुमच्या डिव्हाइसचे आणि खात्याचे सेटअप रिमोट पद्धतीने बदलू शकता.</translation> <translation id="2972581237482394796">&पुन्हा करा</translation> <translation id="2977665033722899841">सध्या निवडलेली <ph name="ROW_NAME" />. <ph name="ROW_CONTENT" /></translation> <translation id="2982481275546140226">डेटा साफ करा</translation> @@ -395,7 +394,6 @@ <translation id="3005723025932146533">सेव्ह केलेली प्रत दर्शवा</translation> <translation id="3008447029300691911"><ph name="CREDIT_CARD" /> साठी CVC प्रविष्ट करा. तुम्ही पुष्टी केल्यावर, तुमचे कार्ड तपशील या साइटसह शेअर केले जातील.</translation> <translation id="3010559122411665027">सूची प्रविष्टी "<ph name="ENTRY_INDEX" />": <ph name="ERROR" /></translation> -<translation id="3014389611820813634">डिव्हाइसचे व्यवस्थापक म्हणून <ph name="ENROLLMENT_DOMAIN" />:</translation> <translation id="301521992641321250">आपोआप ब्लॉक केलेले</translation> <translation id="3023071826883856138">You4 (Envelope)</translation> <translation id="3024663005179499861">चुकीचा धोरण प्रकार</translation> @@ -441,7 +439,6 @@ <translation id="3287510313208355388">ऑनलाइन असताना डाउनलोड करा</translation> <translation id="3293642807462928945"><ph name="POLICY_NAME" /> धोरणांबद्दल अधिक जाणून घ्या</translation> <translation id="3303855915957856445">कोणतेही शोध परिणाम आढळले नाहीत</translation> -<translation id="3311730110465560799">तुमच्या डिव्हाइसचे सेटअप रिमोट पद्धतीने बदलू शकता.</translation> <translation id="3320021301628644560">बिलिंग पत्ता जोडा</translation> <translation id="3324983252691184275">किरमिजी</translation> <translation id="3338095232262050444">सुरक्षित</translation> @@ -536,7 +533,6 @@ <translation id="3761718714832595332">स्थिती लपवा</translation> <translation id="3765032636089507299">सुरक्षित ब्राउझिंग पेज तयार होत आहे.</translation> <translation id="3778403066972421603">तुम्हाला हे कार्ड तुमच्या Google खात्यामध्ये आणि या डिव्हाइसवर सेव्ह करायचे आहे का?</translation> -<translation id="3779973883630527594">या खात्याचे व्यवस्थापन करणारी कंपनी, शाळा किंवा संस्था:</translation> <translation id="3781428340399460090">गडद गुलाबी</translation> <translation id="3783418713923659662">Mastercard</translation> <translation id="3787705759683870569">समाप्त होते: <ph name="EXPIRATION_MONTH" />/<ph name="EXPIRATION_YEAR" /></translation> @@ -560,6 +556,7 @@ <translation id="3949571496842715403">हा सर्व्हर <ph name="DOMAIN" /> असल्याचे सिद्ध करू शकला नाही; त्याचे सुरक्षा सर्टिफिकेट विषय पर्यायी नावांचा उल्लेख करत नाही. हे कदाचित चुकीच्या कॉंफिगरेशनमुळे होत आहे किंवा हल्लेखोर तुमच्या कनेक्शनमध्ये अडथळा आणत आहे.</translation> <translation id="3949601375789751990">तुमचा ब्राउझिंग इतिहास येथे दिसतो</translation> <translation id="3950820424414687140">साइन इन करा</translation> +<translation id="3962859241508114581">मागील ट्रॅक</translation> <translation id="3963837677003247395">मॅन्युअली सुरू ठेवायचे आहे का?</translation> <translation id="3964661563329879394">{COUNT,plural, =0{काहीही नाही}=1{1 साइटकडून }other{# साइटकडून }}</translation> <translation id="397105322502079400">गणना करत आहे...</translation> @@ -582,6 +579,7 @@ <translation id="410351446219883937">ऑटोप्ले</translation> <translation id="4103763322291513355">तुमच्या सिस्टीम अॅडमिनिस्ट्रेटराद्वारे प्रवर्तित ब्लॅक लिस्टमधील URLs आणि अन्य धोरणांची सूची पाहण्यासाठी <strong>chrome://policy</strong> ला भेट द्या.</translation> <translation id="4110652170750985508">तुमचे पेमेंट पुन्हा एकदा तपासा</translation> +<translation id="4112140312785995938">मागे शोधा</translation> <translation id="4116663294526079822">या साइटवर नेहमी अनुमती द्या</translation> <translation id="4117700440116928470">धोरण कक्षा समर्थित नाही.</translation> <translation id="4129401438321186435">{COUNT,plural, =1{अन्य 1}other{अन्य #}}</translation> @@ -660,6 +658,7 @@ <translation id="443673843213245140">प्रॉक्सीचा वापर अक्षम करण्यात आला आहे पण एक सुस्पष्ट प्रॉक्सी कॉन्फिगरेशन निर्दिष्ट करण्यात आले आहे.</translation> <translation id="445100540951337728">डेबिट कार्डे स्वीकारली जातात</translation> <translation id="4466881336512663640">फॉर्म बदल गमावतील. तुम्हाला नक्की पुढे सुरू ठेवायचे आहे?</translation> +<translation id="4477350412780666475">पुढील ट्रॅक</translation> <translation id="4482953324121162758">या साइटचे भाषांतर केले जाणार नाही.</translation> <translation id="4490717597759821841">A7</translation> <translation id="4493480324863638523">चुकीची URL. URL चा एक ठरावीक फॉरमॅट असणे आवश्यक आहे, उदा. http://example.com or https://example.com.</translation> @@ -906,7 +905,6 @@ <translation id="5838278095973806738">या साइटवर कोणतीही संवेदनशील माहिती (उदाहरणार्थ, पासवर्ड किंवा क्रेडिट कार्ड) एंटर करू नका, कारण आक्रमणकर्ते ती चोरू शकतात.</translation> <translation id="5860033963881614850">बंद</translation> <translation id="5863847714970149516">पुढील पेजवर तुमच्याकडून शुल्क आकारले जाऊ शकते</translation> -<translation id="5865951947699094510">तुमच्या खात्याचे सेटअप रिमोट पद्धतीने बदलू शकता.</translation> <translation id="5866257070973731571">फोन नंबर जोडा</translation> <translation id="5869405914158311789">या साइटवर पोहचणे शक्य नाही</translation> <translation id="5869522115854928033">सेव्ह केलेले पासवर्ड</translation> @@ -1060,6 +1058,7 @@ <translation id="6778737459546443941">आपल्या पालकाने अद्याप ती मंजूर केली नाही</translation> <translation id="67862343314499040">जांभळा</translation> <translation id="6786747875388722282">विस्तार</translation> +<translation id="6790428901817661496">प्ले करा</translation> <translation id="679355240208270552">दुर्लक्ष केले कारण डीफॉल्ट शोध धोरणाने सुरू केलेले नाही</translation> <translation id="681021252041861472">या जागा भरणे आवश्यक</translation> <translation id="6810899417690483278">सानुकूलीकरण आयडी</translation> @@ -1163,6 +1162,7 @@ <translation id="7353601530677266744">कमांड लाइन</translation> <translation id="7372973238305370288">शोध परिणाम</translation> <translation id="7377249249140280793"><ph name="RELATIVE_DATE" /> - <ph name="FULL_DATE" /></translation> +<translation id="7378594059915113390">मीडिया नियंत्रणे</translation> <translation id="7378627244592794276">नाही</translation> <translation id="7378810950367401542">/</translation> <translation id="7390545607259442187">कार्डची पुष्टी करा</translation> @@ -1266,7 +1266,6 @@ <translation id="780301667611848630">नाही, नको</translation> <translation id="7805768142964895445">स्थिती</translation> <translation id="7806344367022510803">Chrome मध्ये शोध इंजिन सेटिंग्ज बदला</translation> -<translation id="7810209002420871817">तुमचा <ph name="ACCOUNT_DOMAIN" />खाते व्यवस्थापक म्हणून:</translation> <translation id="7812922009395017822">Mir</translation> <translation id="7813600968533626083">Chrome मधून सूचना फॉर्म काढून टाकायचा?</translation> <translation id="7815407501681723534">'<ph name="SEARCH_STRING" />' साठी <ph name="NUMBER_OF_RESULTS" /> <ph name="SEARCH_RESULTS" /> सापडले</translation>
diff --git a/components/strings/components_strings_ms.xtb b/components/strings/components_strings_ms.xtb index 136d692c..0903063 100644 --- a/components/strings/components_strings_ms.xtb +++ b/components/strings/components_strings_ms.xtb
@@ -1,7 +1,6 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="ms"> -<translation id="1001338328714563407">Sebagai pengurus peranti dan akaun anda, <ph name="ENROLLMENT_DOMAIN" />:</translation> <translation id="1008557486741366299">Bukan Sekarang</translation> <translation id="1010200102790553230">Muatkan halaman kemudian</translation> <translation id="1015730422737071372">Berikan butiran tambahan</translation> @@ -41,6 +40,7 @@ <translation id="1161325031994447685">Menyambung semula kepada Wi-Fi</translation> <translation id="1165039591588034296">Ralat</translation> <translation id="1175364870820465910">&Cetak...</translation> +<translation id="1178581264944972037">Jeda</translation> <translation id="1181037720776840403">Alih keluar</translation> <translation id="1197088940767939838">Oren</translation> <translation id="1201402288615127009">Seterusnya</translation> @@ -98,7 +98,6 @@ <translation id="1405567553485452995">Hijau Cerah</translation> <translation id="1407135791313364759">Buka semua</translation> <translation id="1413809658975081374">Ralat privasi</translation> -<translation id="14171126816530869">Identiti <ph name="ORGANIZATION" /> di <ph name="LOCALITY" /> telah disahkan oleh <ph name="ISSUER" />.</translation> <translation id="1426410128494586442">Ya</translation> <translation id="1430915738399379752">Cetak</translation> <translation id="1455413310270022028">Pemadam</translation> @@ -251,6 +250,7 @@ <translation id="2262243747453050782">Ralat HTTP</translation> <translation id="2263079731045660823">Kemas kini maklumat autolengkap kad kredit dalam tetapan Chrome</translation> <translation id="2270484714375784793">Nombor telefon</translation> +<translation id="2277103315734023688">Cari Ke Hadapan</translation> <translation id="2283340219607151381">Simpan dan lengkapkan alamat</translation> <translation id="2292556288342944218">Akses Internet anda disekat</translation> <translation id="2297722699537546652">B5 (Sampul Surat)</translation> @@ -376,7 +376,6 @@ <translation id="295526156371527179">Amaran: Dasar ini tidak digabungkan sebagai kamus seperti yang dinyatakan oleh dasar kerana dasar ini bukan kamus.</translation> <translation id="2955913368246107853">Tutup bar cari</translation> <translation id="2969319727213777354">Untuk mewujudkan sambungan yang selamat, jam anda perlu ditetapkan dengan betul. Perkara ini perlu dilakukan kerana sijil yang digunakan laman web untuk mengenal pastinya hanya sah untuk tempoh masa yang tertentu. Memandangkan jam peranti anda tidak betul, Google Chrome tidak boleh mengesahkan sijil ini.</translation> -<translation id="2970515157925768593">Boleh menukar penyediaan peranti dan akaun anda dari jauh.</translation> <translation id="2972581237482394796">&Buat Semula</translation> <translation id="2977665033722899841"><ph name="ROW_NAME" />, dipilih pada masa ini. <ph name="ROW_CONTENT" /></translation> <translation id="2982481275546140226">Kosongkan Data</translation> @@ -388,7 +387,6 @@ <translation id="3005723025932146533">Paparkan salinan disimpan</translation> <translation id="3008447029300691911">Masukkan CVC untuk <ph name="CREDIT_CARD" />. Setelah anda mengesahkan, butiran kad anda akan dikongsi dengan tapak ini.</translation> <translation id="3010559122411665027">Masukan senarai "<ph name="ENTRY_INDEX" />": <ph name="ERROR" /></translation> -<translation id="3014389611820813634">Sebagai pengurus peranti ini, <ph name="ENROLLMENT_DOMAIN" />:</translation> <translation id="301521992641321250">Disekat secara automatik</translation> <translation id="3023071826883856138">You4 (Sampul Surat)</translation> <translation id="3024663005179499861">Jenis dasar salah</translation> @@ -434,7 +432,6 @@ <translation id="3287510313208355388">Muat turun semasa dalam talian</translation> <translation id="3293642807462928945">Ketahui lebih lanjut tentang dasar <ph name="POLICY_NAME" /></translation> <translation id="3303855915957856445">Tiada hasil carian ditemui</translation> -<translation id="3311730110465560799">Boleh menukar penyediaan peranti anda dari jauh.</translation> <translation id="3320021301628644560">Tambahkan alamat pengebilan</translation> <translation id="3324983252691184275">Merah lembayung</translation> <translation id="3338095232262050444">Selamat</translation> @@ -531,7 +528,6 @@ <translation id="3761718714832595332">Sembunyikan status</translation> <translation id="3765032636089507299">Halaman Penyemakan Imbas Selamat sedang dalam pembinaan.</translation> <translation id="3778403066972421603">Adakah anda ingin menyimpan maklumat kad ini ke Akaun Google anda dan pada peranti ini?</translation> -<translation id="3779973883630527594">Syarikat, institusi pengajian atau organisasi yang mengurus akaun ini:</translation> <translation id="3781428340399460090">Merah Jambu Hangat</translation> <translation id="3783418713923659662">Mastercard</translation> <translation id="3787705759683870569">Tamat tempoh pada <ph name="EXPIRATION_MONTH" />/<ph name="EXPIRATION_YEAR" /></translation> @@ -555,6 +551,7 @@ <translation id="3949571496842715403">Pelayan ini tidak dapat membuktikan bahawa domainnya ialah <ph name="DOMAIN" />; sijil keselamatannya tidak menyatakan Nama Alternatif Subjek. Ini mungkin disebabkan oleh kesilapan konfigurasi atau penyerang memintasi sambungan anda.</translation> <translation id="3949601375789751990">Sejarah penyemakan imbas anda dipaparkan di sini</translation> <translation id="3950820424414687140">Log masuk</translation> +<translation id="3962859241508114581">Lagu Sebelumnya</translation> <translation id="3963837677003247395">Teruskan secara manual?</translation> <translation id="3964661563329879394">{COUNT,plural, =0{Tiada}=1{Daripada 1 tapak }other{Daripada # tapak }}</translation> <translation id="397105322502079400">Mengira...</translation> @@ -577,6 +574,7 @@ <translation id="410351446219883937">Automain</translation> <translation id="4103763322291513355">Lawati <strong>chrome://policy</strong> untuk melihat senarai URL yang disenarai hitam dan dasar lain yang dikuatkuasakan oleh pentadbir sistem anda.</translation> <translation id="4110652170750985508">Semak pembayaran anda</translation> +<translation id="4112140312785995938">Cari Ke Belakang</translation> <translation id="4116663294526079822">Sentiasa benarkan di tapak ini</translation> <translation id="4117700440116928470">Skop dasar tidak disokong.</translation> <translation id="4129401438321186435">{COUNT,plural, =1{1 yang lain}other{# yang lain}}</translation> @@ -655,6 +653,7 @@ <translation id="443673843213245140">Penggunaan proksi dilumpuhkan tetapi konfigurasi proksi yang jelas dinyatakan.</translation> <translation id="445100540951337728">Kad debit yang diterima</translation> <translation id="4466881336512663640">Perubahan borang akan hilang. Adakah anda pasti mahu meneruskan?</translation> +<translation id="4477350412780666475">Lagu Seterusnya</translation> <translation id="4482953324121162758">Tapak ini tidak akan diterjemah.</translation> <translation id="4490717597759821841">A7</translation> <translation id="4493480324863638523">URL tidak sah. Mestilah URL dengan skema standard, mis http://example.com atau https://example.com.</translation> @@ -901,7 +900,6 @@ <translation id="5838278095973806738">Anda tidak seharusnya memasukkan sebarang maklumat sensitif pada tapak ini (contohnya, kata laluan atau maklumat kad kredit) kerana maklumat ini boleh dicuri oleh penyerang.</translation> <translation id="5860033963881614850">Dimatikan</translation> <translation id="5863847714970149516">Halaman yang seterusnya mungkin cuba mengenakan bayaran kepada anda</translation> -<translation id="5865951947699094510">Boleh menukar persediaan akaun anda dari jauh.</translation> <translation id="5866257070973731571">Tambahkan Nombor Telefon</translation> <translation id="5869405914158311789">Tapak ini tidak dapat dicapai</translation> <translation id="5869522115854928033">Kata laluan disimpan</translation> @@ -1054,6 +1052,7 @@ <translation id="6778737459546443941">Ibu bapa anda belum meluluskannya</translation> <translation id="67862343314499040">Ungu Lembayung</translation> <translation id="6786747875388722282">Pelanjutan</translation> +<translation id="6790428901817661496">Mainkan</translation> <translation id="679355240208270552">Diabaikan kerana carian lalai tidak didayakan oleh dasar.</translation> <translation id="681021252041861472">Medan Diperlukan</translation> <translation id="6810899417690483278">ID Penyesuaian</translation> @@ -1154,6 +1153,7 @@ <translation id="7353601530677266744">Baris Perintah</translation> <translation id="7372973238305370288">hasil carian</translation> <translation id="7377249249140280793"><ph name="RELATIVE_DATE" /> - <ph name="FULL_DATE" /></translation> +<translation id="7378594059915113390">Kawalan Media</translation> <translation id="7378627244592794276">Tidak</translation> <translation id="7378810950367401542">/</translation> <translation id="7390545607259442187">Sahkan Kad</translation> @@ -1257,7 +1257,6 @@ <translation id="780301667611848630">Tidak, terima kasih</translation> <translation id="7805768142964895445">Status</translation> <translation id="7806344367022510803">Tukar tetapan Enjin Carian dalam Chrome</translation> -<translation id="7810209002420871817">Sebagai pengurus akaun anda, <ph name="ACCOUNT_DOMAIN" />:</translation> <translation id="7812922009395017822">Mir</translation> <translation id="7813600968533626083">Alih keluar cadangan borang daripada Chrome?</translation> <translation id="7815407501681723534">Menemui <ph name="NUMBER_OF_RESULTS" /> <ph name="SEARCH_RESULTS" /> untuk '<ph name="SEARCH_STRING" />'</translation>
diff --git a/components/strings/components_strings_nl.xtb b/components/strings/components_strings_nl.xtb index b0c4b316..36ee137 100644 --- a/components/strings/components_strings_nl.xtb +++ b/components/strings/components_strings_nl.xtb
@@ -1,7 +1,6 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="nl"> -<translation id="1001338328714563407">Als beheerder van je apparaat en account kan <ph name="ENROLLMENT_DOMAIN" /> het volgende:</translation> <translation id="1008557486741366299">Niet nu</translation> <translation id="1010200102790553230">Pagina later laden</translation> <translation id="1015730422737071372">Aanvullende gegevens verzenden</translation> @@ -41,6 +40,7 @@ <translation id="1161325031994447685">Maak opnieuw verbinding met wifi</translation> <translation id="1165039591588034296">Fout</translation> <translation id="1175364870820465910">&Afdrukken...</translation> +<translation id="1178581264944972037">Onderbreken</translation> <translation id="1181037720776840403">Verwijderen</translation> <translation id="1197088940767939838">Oranje</translation> <translation id="1201402288615127009">Volgende</translation> @@ -98,7 +98,6 @@ <translation id="1405567553485452995">Lichtgroen</translation> <translation id="1407135791313364759">Alles openen</translation> <translation id="1413809658975081374">Privacyfout</translation> -<translation id="14171126816530869">De identiteit van <ph name="ORGANIZATION" /> op <ph name="LOCALITY" /> is geverifieerd door <ph name="ISSUER" />.</translation> <translation id="1426410128494586442">Ja</translation> <translation id="1430915738399379752">Afdrukken</translation> <translation id="1455413310270022028">Gum</translation> @@ -251,6 +250,7 @@ <translation id="2262243747453050782">HTTP-fout</translation> <translation id="2263079731045660823">De gegevens updaten voor het automatisch aanvullen van creditcardgegevens in de Chrome-instellingen</translation> <translation id="2270484714375784793">Telefoonnummer</translation> +<translation id="2277103315734023688">Vooruit zoeken</translation> <translation id="2283340219607151381">Adressen opslaan en invullen</translation> <translation id="2292556288342944218">Je toegang tot internet wordt geblokkeerd</translation> <translation id="2297722699537546652">B5 (envelop)</translation> @@ -375,7 +375,6 @@ <translation id="295526156371527179">Waarschuwing: Dit beleid is niet samengevoegd als woordenboek zoals gespecificeerd door het beleid, omdat het geen woordenboek is.</translation> <translation id="2955913368246107853">Zoekbalk sluiten</translation> <translation id="2969319727213777354">Als je een beveiligde verbinding tot stand wilt brengen, moet je klok correct zijn ingesteld. Dit moet omdat de certificaten die deze websites gebruiken om zichzelf te identificeren, slechts gedurende bepaalde perioden geldig zijn. Aangezien de klok van je apparaat niet goed is ingesteld, kan Chrome deze certificaten niet verifiëren.</translation> -<translation id="2970515157925768593">Op afstand je apparaat- en accountinstellingen wijzigen.</translation> <translation id="2972581237482394796">&Opnieuw</translation> <translation id="2977665033722899841"><ph name="ROW_NAME" />, momenteel geselecteerd. <ph name="ROW_CONTENT" /></translation> <translation id="2982481275546140226">Gegevens wissen</translation> @@ -387,7 +386,6 @@ <translation id="3005723025932146533">Opgeslagen kopie weergeven</translation> <translation id="3008447029300691911">Geef de CVC-code voor <ph name="CREDIT_CARD" /> op. Zodra je bevestigt, worden je creditcardgegevens gedeeld met deze site.</translation> <translation id="3010559122411665027">Lijstitem '<ph name="ENTRY_INDEX" />': <ph name="ERROR" /></translation> -<translation id="3014389611820813634">Als beheerder van dit apparaat kan <ph name="ENROLLMENT_DOMAIN" /> het volgende:</translation> <translation id="301521992641321250">Automatisch geblokkeerd</translation> <translation id="3023071826883856138">You4 (envelop)</translation> <translation id="3024663005179499861">Onjuist beleidstype</translation> @@ -430,7 +428,6 @@ <translation id="3287510313208355388">Downloaden wanneer online</translation> <translation id="3293642807462928945">Meer informatie over het beleid <ph name="POLICY_NAME" /></translation> <translation id="3303855915957856445">Geen zoekresultaten gevonden</translation> -<translation id="3311730110465560799">Op afstand je apparaatinstellingen wijzigen.</translation> <translation id="3320021301628644560">Factuuradres toevoegen</translation> <translation id="3324983252691184275">Karmozijnrood</translation> <translation id="3338095232262050444">Beveiligd</translation> @@ -524,7 +521,6 @@ <translation id="3761718714832595332">Status verbergen</translation> <translation id="3765032636089507299">De Safe Browsing-pagina is in aanbouw.</translation> <translation id="3778403066972421603">Wil je deze pas opslaan in je Google-account en op dit apparaat?</translation> -<translation id="3779973883630527594">Het bedrijf, de school of de organisatie waardoor dit account wordt beheerd, kan het volgende:</translation> <translation id="3781428340399460090">Felroze</translation> <translation id="3783418713923659662">Mastercard</translation> <translation id="3787705759683870569">Verloopt: <ph name="EXPIRATION_MONTH" />/<ph name="EXPIRATION_YEAR" /></translation> @@ -548,6 +544,7 @@ <translation id="3949571496842715403">Deze server kan niet bewijzen dat dit <ph name="DOMAIN" /> is. In het bijbehorende beveiligingscertificaat worden geen 'Subject Alternative Names' gespecificeerd. Dit kan worden veroorzaakt door een verkeerde configuratie of door een aanvaller die je verbinding heeft onderschept.</translation> <translation id="3949601375789751990">Je browsegeschiedenis wordt hier weergegeven</translation> <translation id="3950820424414687140">Inloggen</translation> +<translation id="3962859241508114581">Vorig nummer</translation> <translation id="3963837677003247395">Handmatig doorgaan?</translation> <translation id="3964661563329879394">{COUNT,plural, =0{Geen}=1{Van één site }other{Van # sites }}</translation> <translation id="397105322502079400">Berekenen...</translation> @@ -570,6 +567,7 @@ <translation id="410351446219883937">Automatisch afspelen</translation> <translation id="4103763322291513355">Ga naar <strong>chrome://policy</strong> om de lijst met URL's op de zwarte lijst en andere beleidsregels te bekijken die worden afgedwongen door je systeembeheerder.</translation> <translation id="4110652170750985508">Je betaling controleren</translation> +<translation id="4112140312785995938">Achteruit zoeken</translation> <translation id="4116663294526079822">Altijd toestaan op deze site</translation> <translation id="4117700440116928470">Beleidsbereik wordt niet ondersteund.</translation> <translation id="4129401438321186435">{COUNT,plural, =1{1 andere persoon}other{# andere mensen}}</translation> @@ -648,6 +646,7 @@ <translation id="443673843213245140">Het gebruik van een proxy is uitgeschakeld, maar er is wel een expliciete proxyconfiguratie opgegeven.</translation> <translation id="445100540951337728">Geaccepteerde betaalpassen</translation> <translation id="4466881336512663640">Hiermee gaan formulierwijzigingen verloren. Weet je zeker dat je wilt doorgaan?</translation> +<translation id="4477350412780666475">Volgend nummer</translation> <translation id="4482953324121162758">Deze site wordt niet vertaald.</translation> <translation id="4490717597759821841">A7</translation> <translation id="4493480324863638523">Ongeldige URL. Dit moet een URL met een standaardschema zijn, zoals http://example.com of https://example.com.</translation> @@ -894,7 +893,6 @@ <translation id="5838278095973806738">Geef geen gevoelige gegevens op op deze site (zoals wachtwoorden of creditcards), want deze kunnen worden gestolen door cybercriminelen.</translation> <translation id="5860033963881614850">Uit</translation> <translation id="5863847714970149516">De komende pagina probeert misschien kosten in rekening te brengen</translation> -<translation id="5865951947699094510">Op afstand je accountinstellingen wijzigen.</translation> <translation id="5866257070973731571">Telefoonnummer toevoegen</translation> <translation id="5869405914158311789">Deze site is niet bereikbaar</translation> <translation id="5869522115854928033">Opgeslagen wachtwoorden</translation> @@ -1046,6 +1044,7 @@ <translation id="6778737459546443941">Je ouder of voogd heeft dit nog niet goedgekeurd</translation> <translation id="67862343314499040">Violet</translation> <translation id="6786747875388722282">Extensies</translation> +<translation id="6790428901817661496">Spelen</translation> <translation id="679355240208270552">Genegeerd omdat de standaard zoekoptie door het beleid is uitgeschakeld.</translation> <translation id="681021252041861472">Verplicht veld</translation> <translation id="6810899417690483278">Aanpassings-ID</translation> @@ -1146,6 +1145,7 @@ <translation id="7353601530677266744">Opdrachtregel</translation> <translation id="7372973238305370288">zoekresultaat</translation> <translation id="7377249249140280793"><ph name="RELATIVE_DATE" /> - <ph name="FULL_DATE" /></translation> +<translation id="7378594059915113390">Mediabediening</translation> <translation id="7378627244592794276">Nee</translation> <translation id="7378810950367401542">/</translation> <translation id="7390545607259442187">Creditcard bevestigen</translation> @@ -1249,7 +1249,6 @@ <translation id="780301667611848630">Nee, bedankt</translation> <translation id="7805768142964895445">Status</translation> <translation id="7806344367022510803">De zoekmachine-instellingen wijzigen in Chrome</translation> -<translation id="7810209002420871817">Als beheerder van je account kan <ph name="ACCOUNT_DOMAIN" /> het volgende:</translation> <translation id="7812922009395017822">Mir</translation> <translation id="7813600968533626083">Formuliersuggestie verwijderen uit Chrome?</translation> <translation id="7815407501681723534"><ph name="NUMBER_OF_RESULTS" /> <ph name="SEARCH_RESULTS" /> gevonden voor '<ph name="SEARCH_STRING" />'</translation>
diff --git a/components/strings/components_strings_no.xtb b/components/strings/components_strings_no.xtb index 2b6a829..2bf660c 100644 --- a/components/strings/components_strings_no.xtb +++ b/components/strings/components_strings_no.xtb
@@ -1,7 +1,6 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="no"> -<translation id="1001338328714563407">Som administrator for enheten og kontoen din kan <ph name="ENROLLMENT_DOMAIN" /></translation> <translation id="1008557486741366299">Ikke nå</translation> <translation id="1010200102790553230">Last inn siden senere</translation> <translation id="1015730422737071372">Oppgi flere detaljer</translation> @@ -41,6 +40,7 @@ <translation id="1161325031994447685">Koble til Wi-Fi på nytt</translation> <translation id="1165039591588034296">Feil</translation> <translation id="1175364870820465910">&Skriv ut...</translation> +<translation id="1178581264944972037">Stans midlertidig</translation> <translation id="1181037720776840403">Fjern</translation> <translation id="1197088940767939838">Oransje</translation> <translation id="1201402288615127009">Neste</translation> @@ -100,7 +100,6 @@ <translation id="1405567553485452995">Lysegrønn</translation> <translation id="1407135791313364759">Åpne alle</translation> <translation id="1413809658975081374">Personvernfeil</translation> -<translation id="14171126816530869">Identiteten til <ph name="ORGANIZATION" /> på <ph name="LOCALITY" /> er verifisert av <ph name="ISSUER" />.</translation> <translation id="1426410128494586442">Ja</translation> <translation id="1430915738399379752">Skriv ut</translation> <translation id="1455413310270022028">Viskelær</translation> @@ -131,7 +130,7 @@ <p>Juster datoen og klokkeslettet under <strong>Generelt</strong> i <strong>Innstillinger</strong>-appen.</p></translation> <translation id="1569487616857761740">Oppgi utløpsdato</translation> <translation id="1581080074034554886">CVC</translation> -<translation id="1583429793053364125">Noe gikk galt under åpningen av denne nettsiden.</translation> +<translation id="1583429793053364125">Noe gikk galt da denne nettsiden skulle åpnes.</translation> <translation id="1592005682883173041">Tilgang til lokale data</translation> <translation id="1594030484168838125">Velg</translation> <translation id="161042844686301425">Cyan</translation> @@ -256,6 +255,7 @@ <translation id="2262243747453050782">HTTP-feil</translation> <translation id="2263079731045660823">Oppdater autofyll av kredittkortinformasjon i Chrome-innstillingene</translation> <translation id="2270484714375784793">Telefonnummer</translation> +<translation id="2277103315734023688">Spol fremover</translation> <translation id="2283340219607151381">Lagre og fyll inn adresser</translation> <translation id="2292556288342944218">Internett-tilgangen din er blokkert</translation> <translation id="2297722699537546652">B5 (konvolutt)</translation> @@ -383,7 +383,6 @@ <translation id="295526156371527179">Advarsel: Denne regelen ble ikke sammenslått som en regelspesifisert ordliste fordi den ikke er en ordliste.</translation> <translation id="2955913368246107853">Lukk søkefelt</translation> <translation id="2969319727213777354">Klokken må være riktig stilt før du kan opprette sikre tilkoblinger. Grunnen til dette er at sertifikatene nettsteder identifiserer seg med, bare er gyldige i visse tidsperioder. Ettersom klokken på enheten din er feil, kan ikke Google Chrome bekrefte disse sertifikatene.</translation> -<translation id="2970515157925768593">endre enhets- og kontooppsettet eksternt</translation> <translation id="2972581237482394796">Gjø&r om</translation> <translation id="2977665033722899841"><ph name="ROW_NAME" />, for øyeblikket valgt. <ph name="ROW_CONTENT" /></translation> <translation id="2982481275546140226">Fjern data</translation> @@ -395,7 +394,6 @@ <translation id="3005723025932146533">Vis lagret kopi</translation> <translation id="3008447029300691911">Skriv inn verifiseringskoden for <ph name="CREDIT_CARD" />. Når du bekrefter, deles kortinformasjonen din med dette nettstedet.</translation> <translation id="3010559122411665027">Listeoppføring «<ph name="ENTRY_INDEX" />»: <ph name="ERROR" /></translation> -<translation id="3014389611820813634">Som administrator for denne enheten kan <ph name="ENROLLMENT_DOMAIN" /></translation> <translation id="301521992641321250">Automatisk blokkert</translation> <translation id="3023071826883856138">You4 (konvolutt)</translation> <translation id="3024663005179499861">Feil type enhetsinnstillinger</translation> @@ -441,7 +439,6 @@ <translation id="3287510313208355388">Last ned når du er koblet til Internett</translation> <translation id="3293642807462928945">Finn ut mer om regelen <ph name="POLICY_NAME" /></translation> <translation id="3303855915957856445">Søket ga ingen treff</translation> -<translation id="3311730110465560799">endre enhetsoppsettet eksternt</translation> <translation id="3320021301628644560">Legg til faktureringsadresse</translation> <translation id="3324983252691184275">Karmosinrød</translation> <translation id="3338095232262050444">Sikker</translation> @@ -537,7 +534,6 @@ <translation id="3761718714832595332">Skjul statusen</translation> <translation id="3765032636089507299">Safe Browsing-siden er under utvikling.</translation> <translation id="3778403066972421603">Vil du lagre dette kortet i Google-kontoen din og på denne enheten?</translation> -<translation id="3779973883630527594">Selskapet, skolen eller organisasjonen som administrerer denne kontoen, kan</translation> <translation id="3781428340399460090">Knallrosa</translation> <translation id="3783418713923659662">Mastercard</translation> <translation id="3787705759683870569">Utløper <ph name="EXPIRATION_MONTH" />/<ph name="EXPIRATION_YEAR" /></translation> @@ -561,6 +557,7 @@ <translation id="3949571496842715403">Denne tjeneren kunne ikke bevise at den er <ph name="DOMAIN" />. Det er ikke angitt noen alternative emnenavn i tjenerens sikkerhetssertifikat. Dette kan være forårsaket av en feilkonfigurering eller en angriper som avskjærer tilkoblingen din.</translation> <translation id="3949601375789751990">Nettleserloggen din vises her</translation> <translation id="3950820424414687140">Logg på</translation> +<translation id="3962859241508114581">Forrige spor</translation> <translation id="3963837677003247395">Vil du fortsette manuelt?</translation> <translation id="3964661563329879394">{COUNT,plural, =0{Ingen}=1{Fra 1 nettsted }other{Fra # nettsteder }}</translation> <translation id="397105322502079400">Beregner …</translation> @@ -583,6 +580,7 @@ <translation id="410351446219883937">Autoavspilling</translation> <translation id="4103763322291513355">Gå til <strong>chrome://policy</strong> for å se listen over sperrede nettadresser og andre innstillinger aktivert av systemadministratoren din.</translation> <translation id="4110652170750985508">Gjennomgå betalingen</translation> +<translation id="4112140312785995938">Spol bakover</translation> <translation id="4116663294526079822">Tillat alltid på dette nettstedet</translation> <translation id="4117700440116928470">Omfanget for innstillingen støttes ikke.</translation> <translation id="4129401438321186435">{COUNT,plural, =1{1 til}other{# til}}</translation> @@ -661,6 +659,7 @@ <translation id="443673843213245140">Bruk av mellomtjener er deaktivert, men det er angitt en uttrykkelig mellomtjenerkonfigurasjon.</translation> <translation id="445100540951337728">Godkjente debetkort</translation> <translation id="4466881336512663640">Endringer i skjemaet går tapt. Er du sikker på at du vil fortsette?</translation> +<translation id="4477350412780666475">Neste spor</translation> <translation id="4482953324121162758">Dette nettstedet oversettes ikke.</translation> <translation id="4490717597759821841">A7</translation> <translation id="4493480324863638523">Ugyldig nettadresse. Dette må være en nettadresse på standardformat, f.eks. http://example.com eller https://example.com.</translation> @@ -907,7 +906,6 @@ <translation id="5838278095973806738">Du bør ikke oppgi sensitiv informasjon på dette nettstedet (for eksempel passord eller kredittkort) fordi den kan bli stjålet av angripere.</translation> <translation id="5860033963881614850">Av</translation> <translation id="5863847714970149516">Den neste siden kan prøve å belaste deg for penger</translation> -<translation id="5865951947699094510">endre kontooppsettet eksternt</translation> <translation id="5866257070973731571">Legg til telefonnummer</translation> <translation id="5869405914158311789">Dette nettstedet er ikke tilgjengelig</translation> <translation id="5869522115854928033">Lagrede passord</translation> @@ -1060,6 +1058,7 @@ <translation id="6778737459546443941">Forelderen din har ikke godkjent det ennå</translation> <translation id="67862343314499040">Fiolett</translation> <translation id="6786747875388722282">Utvidelser</translation> +<translation id="6790428901817661496">Spill av</translation> <translation id="679355240208270552">Ignorert fordi standardsøk ikke er aktivert av regel.</translation> <translation id="681021252041861472">Obligatorisk felt</translation> <translation id="6810899417690483278">Tilpasnings-ID</translation> @@ -1104,6 +1103,7 @@ <translation id="7053983685419859001">Blokkér</translation> <translation id="7062635574500127092">Blågrønn</translation> <translation id="7064851114919012435">Kontaktinformasjon</translation> +<translation id="7075452647191940183">Forespørselen er for stor</translation> <translation id="7079718277001814089">Dette nettstedet inneholder skadelig programvare</translation> <translation id="7087282848513945231">Fylke</translation> <translation id="7090678807593890770">Søk på Google etter <ph name="LINK" /></translation> @@ -1162,6 +1162,7 @@ <translation id="7353601530677266744">Kommandolinje </translation> <translation id="7372973238305370288">søkeresultat</translation> <translation id="7377249249140280793"><ph name="RELATIVE_DATE" /> – <ph name="FULL_DATE" /></translation> +<translation id="7378594059915113390">Mediekontroller</translation> <translation id="7378627244592794276">Nei takk</translation> <translation id="7378810950367401542">/</translation> <translation id="7390545607259442187">Bekreft kortet</translation> @@ -1265,7 +1266,6 @@ <translation id="780301667611848630">Nei takk</translation> <translation id="7805768142964895445">Status</translation> <translation id="7806344367022510803">Endre innstillingene for søkemotor i Chrome</translation> -<translation id="7810209002420871817">Som administrator for kontoen din kan <ph name="ACCOUNT_DOMAIN" /></translation> <translation id="7812922009395017822">Mir</translation> <translation id="7813600968533626083">Vil du fjerne skjemaforslaget fra Chrome?</translation> <translation id="7815407501681723534">Fant <ph name="NUMBER_OF_RESULTS" /> <ph name="SEARCH_RESULTS" /> for «<ph name="SEARCH_STRING" />»</translation>
diff --git a/components/strings/components_strings_pl.xtb b/components/strings/components_strings_pl.xtb index 5235339..89f2e58 100644 --- a/components/strings/components_strings_pl.xtb +++ b/components/strings/components_strings_pl.xtb
@@ -1,7 +1,6 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="pl"> -<translation id="1001338328714563407">Zarządzająca Twoim urządzeniem i kontem domena <ph name="ENROLLMENT_DOMAIN" />:</translation> <translation id="1008557486741366299">Nie teraz</translation> <translation id="1010200102790553230">Wczytaj stronę później</translation> <translation id="1015730422737071372">Podaj dodatkowe informacje</translation> @@ -41,6 +40,7 @@ <translation id="1161325031994447685">Ponownie połącz się z Wi-Fi</translation> <translation id="1165039591588034296">Błąd</translation> <translation id="1175364870820465910">&Drukuj...</translation> +<translation id="1178581264944972037">Wstrzymaj</translation> <translation id="1181037720776840403">Usuń</translation> <translation id="1197088940767939838">Pomarańczowy</translation> <translation id="1201402288615127009">Dalej</translation> @@ -100,7 +100,6 @@ <translation id="1405567553485452995">Jasnozielony</translation> <translation id="1407135791313364759">Otwórz wszystkie</translation> <translation id="1413809658975081374">Błąd dotyczący prywatności</translation> -<translation id="14171126816530869">Tożsamość organizacji <ph name="ORGANIZATION" /> (<ph name="LOCALITY" />) została zweryfikowana przed wystawcę <ph name="ISSUER" />.</translation> <translation id="1426410128494586442">Tak</translation> <translation id="1430915738399379752">Drukuj</translation> <translation id="1455413310270022028">Gumka</translation> @@ -256,6 +255,7 @@ <translation id="2262243747453050782">Błąd HTTP</translation> <translation id="2263079731045660823">Dane karty kredytowej używane do autouzupełniania możesz zmienić w ustawieniach Chrome</translation> <translation id="2270484714375784793">Numer telefonu</translation> +<translation id="2277103315734023688">Przewiń do przodu</translation> <translation id="2283340219607151381">Zapisuj i automatycznie uzupełniaj adresy</translation> <translation id="2292556288342944218">Masz zablokowany dostęp do internetu</translation> <translation id="2297722699537546652">B5 (koperta)</translation> @@ -383,7 +383,6 @@ <translation id="295526156371527179">Ostrzeżenie: ta zasada nie została scalona jako słownik na podstawie zasady, ponieważ nie jest słownikiem.</translation> <translation id="2955913368246107853">Zamknij pasek wyszukiwania</translation> <translation id="2969319727213777354">Aby urządzenie nawiązało bezpieczne połączenie, jego zegar musi wskazywać prawidłową godzinę. Jest to wymagane, bo certyfikaty używane do identyfikacji stron internetowych są ważne tylko przez określony czas. Zegar urządzenia jest ustawiony nieprawidłowo, więc Google Chrome nie może zweryfikować tych certyfikatów.</translation> -<translation id="2970515157925768593">Może zdalnie zmienić konfigurację Twojego urządzenia i konta.</translation> <translation id="2972581237482394796">&Ponów</translation> <translation id="2977665033722899841">Obecnie wybrany wiersz to <ph name="ROW_NAME" />. <ph name="ROW_CONTENT" /></translation> <translation id="2982481275546140226">Wyczyść dane</translation> @@ -395,7 +394,6 @@ <translation id="3005723025932146533">Pokaż zapisaną kopię</translation> <translation id="3008447029300691911">Wpisz kod CVC karty <ph name="CREDIT_CARD" />. Po potwierdzeniu szczegółowe dane karty zostaną udostępnione tej stronie.</translation> <translation id="3010559122411665027">Pozycja listy „<ph name="ENTRY_INDEX" />”: <ph name="ERROR" /></translation> -<translation id="3014389611820813634">Zarządzająca tym urządzeniem domena <ph name="ENROLLMENT_DOMAIN" />:</translation> <translation id="301521992641321250">Automatycznie zablokowane</translation> <translation id="3023071826883856138">You4 (koperta)</translation> <translation id="3024663005179499861">Nieprawidłowy typ zasady</translation> @@ -441,7 +439,6 @@ <translation id="3287510313208355388">Pobierz, gdy będę online</translation> <translation id="3293642807462928945">Więcej informacji o zasadzie <ph name="POLICY_NAME" /></translation> <translation id="3303855915957856445">Brak wyników wyszukiwania</translation> -<translation id="3311730110465560799">Może zdalnie zmieniać konfigurację urządzenia.</translation> <translation id="3320021301628644560">Dodaj adres rozliczeniowy</translation> <translation id="3324983252691184275">Karmazynowy</translation> <translation id="3338095232262050444">Bezpieczna</translation> @@ -537,7 +534,6 @@ <translation id="3761718714832595332">Ukryj stan</translation> <translation id="3765032636089507299">Strona funkcji Bezpieczne przeglądanie jest w budowie.</translation> <translation id="3778403066972421603">Czy chcesz zapisać tę kartę na swoim koncie Google i na tym urządzeniu?</translation> -<translation id="3779973883630527594">Firma, szkoła lub organizacja zarządzająca tym kontem:</translation> <translation id="3781428340399460090">Ciepłoróżowy</translation> <translation id="3783418713923659662">Mastercard</translation> <translation id="3787705759683870569">Wygasa: <ph name="EXPIRATION_MONTH" />/<ph name="EXPIRATION_YEAR" /></translation> @@ -561,6 +557,7 @@ <translation id="3949571496842715403">Serwer nie mógł udowodnić, że należy do <ph name="DOMAIN" />. Jego certyfikat bezpieczeństwa nie określa alternatywnych nazw podmiotu. Może to być spowodowane błędną konfiguracją lub przechwyceniem połączenia przez atakującego.</translation> <translation id="3949601375789751990">Tutaj wyświetla się Twoja historia przeglądania</translation> <translation id="3950820424414687140">Zaloguj się</translation> +<translation id="3962859241508114581">Poprzedni utwór</translation> <translation id="3963837677003247395">Czy chcesz kontynuować samodzielnie?</translation> <translation id="3964661563329879394">{COUNT,plural, =0{Brak}=1{Z 1 witryny }few{Z # witryn }many{Z # witryn }other{Z # witryny }}</translation> <translation id="397105322502079400">Obliczanie...</translation> @@ -583,6 +580,7 @@ <translation id="410351446219883937">Autoodtwarzanie</translation> <translation id="4103763322291513355">Wejdź na stronę <strong>chrome://policy</strong>, aby wyświetlić czarną listę URL-i oraz inne zasady egzekwowane przez administratora systemu.</translation> <translation id="4110652170750985508">Sprawdź szczegóły płatności</translation> +<translation id="4112140312785995938">Przewiń do tyłu</translation> <translation id="4116663294526079822">Zawsze zezwalaj w tej witrynie</translation> <translation id="4117700440116928470">Ten zakres zasad nie jest obsługiwany.</translation> <translation id="4129401438321186435">{COUNT,plural, =1{1 inny wpis}few{# inne wpisy}many{# innych wpisów}other{# innego wpisu}}</translation> @@ -661,6 +659,7 @@ <translation id="443673843213245140">Korzystanie z serwera proxy jest wyłączone, ale podano konfigurację proxy.</translation> <translation id="445100540951337728">Akceptowane karty debetowe</translation> <translation id="4466881336512663640">Zmiany w formularzu zostaną utracone. Na pewno chcesz kontynuować?</translation> +<translation id="4477350412780666475">Następny utwór</translation> <translation id="4482953324121162758">Ta strona nie będzie tłumaczona.</translation> <translation id="4490717597759821841">A7</translation> <translation id="4493480324863638523">Nieprawidłowy URL. URL musi być zgodny ze schematem standardowym, np. http://example.com lub https://example.com</translation> @@ -907,7 +906,6 @@ <translation id="5838278095973806738">Nie podawaj żadnych informacji poufnych (takich jak hasła czy dane kart kredytowych) w tej witrynie, bo osoby atakujące będą mogły je wykraść.</translation> <translation id="5860033963881614850">Wyłączone</translation> <translation id="5863847714970149516">Otwierana strona może próbować obciążyć Cię płatnością</translation> -<translation id="5865951947699094510">Może zdalnie zmienić konfigurację Twojego konta.</translation> <translation id="5866257070973731571">Dodaj numer telefonu</translation> <translation id="5869405914158311789">Ta witryna jest nieosiągalna</translation> <translation id="5869522115854928033">Zapisane hasła</translation> @@ -1060,6 +1058,7 @@ <translation id="6778737459546443941">Twój rodzic jeszcze na to nie zezwolił</translation> <translation id="67862343314499040">Fioletowy</translation> <translation id="6786747875388722282">Rozszerzenia</translation> +<translation id="6790428901817661496">Odtwórz</translation> <translation id="679355240208270552">Ignorowana, ponieważ wyszukiwarka domyślna nie jest dozwolona przez zasadę.</translation> <translation id="681021252041861472">Pole wymagane</translation> <translation id="6810899417690483278">Identyfikator dostosowania</translation> @@ -1104,6 +1103,7 @@ <translation id="7053983685419859001">Blokuj</translation> <translation id="7062635574500127092">Morski</translation> <translation id="7064851114919012435">Dane kontaktowe</translation> +<translation id="7075452647191940183">Żądanie jest za duże</translation> <translation id="7079718277001814089">Ta strona zawiera złośliwe oprogramowanie</translation> <translation id="7087282848513945231">Hrabstwo</translation> <translation id="7090678807593890770">Wyszukaj w Google: <ph name="LINK" /></translation> @@ -1163,6 +1163,7 @@ <translation id="7353601530677266744">Wiersz poleceń</translation> <translation id="7372973238305370288">wynik wyszukiwania</translation> <translation id="7377249249140280793"><ph name="RELATIVE_DATE" /> – <ph name="FULL_DATE" /></translation> +<translation id="7378594059915113390">Sterowanie multimediami</translation> <translation id="7378627244592794276">Nie</translation> <translation id="7378810950367401542">/</translation> <translation id="7390545607259442187">Potwierdź kartę</translation> @@ -1266,7 +1267,6 @@ <translation id="780301667611848630">Nie, dziękuję</translation> <translation id="7805768142964895445">Stan</translation> <translation id="7806344367022510803">Wyszukiwarkę możesz zmienić w ustawieniach Chrome</translation> -<translation id="7810209002420871817">Zarządzająca Twoim kontem domena <ph name="ACCOUNT_DOMAIN" />:</translation> <translation id="7812922009395017822">Mir</translation> <translation id="7813600968533626083">Usunąć tę podpowiedź do formularza z Chrome?</translation> <translation id="7815407501681723534">Znalezione <ph name="SEARCH_RESULTS" /> dla zapytania „<ph name="SEARCH_STRING" />”: <ph name="NUMBER_OF_RESULTS" /></translation>
diff --git a/components/strings/components_strings_pt-BR.xtb b/components/strings/components_strings_pt-BR.xtb index cea59a395..f8a2e63 100644 --- a/components/strings/components_strings_pt-BR.xtb +++ b/components/strings/components_strings_pt-BR.xtb
@@ -1,7 +1,6 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="pt-BR"> -<translation id="1001338328714563407">Como administrador do dispositivo e da conta, <ph name="ENROLLMENT_DOMAIN" />:</translation> <translation id="1008557486741366299">Não agora</translation> <translation id="1010200102790553230">Carregar página mais tarde</translation> <translation id="1015730422737071372">Forneça detalhes adicionais</translation> @@ -41,6 +40,7 @@ <translation id="1161325031994447685">Conectar à rede Wi-Fi novamente</translation> <translation id="1165039591588034296">Erro</translation> <translation id="1175364870820465910">&Imprimir...</translation> +<translation id="1178581264944972037">Pausar</translation> <translation id="1181037720776840403">Remover</translation> <translation id="1197088940767939838">Laranja</translation> <translation id="1201402288615127009">Próxima</translation> @@ -100,7 +100,6 @@ <translation id="1405567553485452995">Verde-claro</translation> <translation id="1407135791313364759">Abrir todas</translation> <translation id="1413809658975081374">Erro de privacidade</translation> -<translation id="14171126816530869">A identidade de <ph name="ORGANIZATION" /> em <ph name="LOCALITY" /> foi confirmada por <ph name="ISSUER" />.</translation> <translation id="1426410128494586442">Sim</translation> <translation id="1430915738399379752">Imprimir</translation> <translation id="1455413310270022028">Borracha</translation> @@ -256,6 +255,7 @@ <translation id="2262243747453050782">Erro HTTP</translation> <translation id="2263079731045660823">Atualize as informações de preenchimento automático de cartão de crédito nas configurações do Chrome</translation> <translation id="2270484714375784793">Número do telefone</translation> +<translation id="2277103315734023688">Avançar</translation> <translation id="2283340219607151381">Salvar e preencher endereços</translation> <translation id="2292556288342944218">O seu acesso à Internet está bloqueado</translation> <translation id="2297722699537546652">B5 (Envelope)</translation> @@ -383,7 +383,6 @@ <translation id="295526156371527179">Aviso: esta política não foi mesclada como um dicionário conforme especificado porque ela não é um dicionário.</translation> <translation id="2955913368246107853">Fechar barra de localização</translation> <translation id="2969319727213777354">Para estabelecer uma conexão segura, o relógio precisa estar configurado corretamente. Isso ocorre porque os certificados que os websites usam para se identificar são válidos apenas por períodos específicos. Como o relógio do seu dispositivo está incorreto, o Google Chrome não consegue verificar esses certificados.</translation> -<translation id="2970515157925768593">Pode alterar remotamente a configuração do dispositivo e da conta.</translation> <translation id="2972581237482394796">&Refazer</translation> <translation id="2977665033722899841">Selecionado no momento: <ph name="ROW_NAME" />. <ph name="ROW_CONTENT" /></translation> <translation id="2982481275546140226">Limpar dados</translation> @@ -395,7 +394,6 @@ <translation id="3005723025932146533">Mostrar cópia salva</translation> <translation id="3008447029300691911">Digite o CVC do <ph name="CREDIT_CARD" />. Depois da confirmação, os detalhes do seu cartão serão compartilhados com esse site.</translation> <translation id="3010559122411665027">Entrada de lista "<ph name="ENTRY_INDEX" />": <ph name="ERROR" /></translation> -<translation id="3014389611820813634">Como o administrador deste dispositivo, <ph name="ENROLLMENT_DOMAIN" />:</translation> <translation id="301521992641321250">Bloqueada automaticamente</translation> <translation id="3023071826883856138">You4 (Envelope)</translation> <translation id="3024663005179499861">Tipo de política incorreto</translation> @@ -441,7 +439,6 @@ <translation id="3287510313208355388">Download quando estiver on-line</translation> <translation id="3293642807462928945">Saiba mais sobre a política <ph name="POLICY_NAME" /></translation> <translation id="3303855915957856445">Nenhum resultado de pesquisa encontrado</translation> -<translation id="3311730110465560799">Pode alterar remotamente a configuração do seu dispositivo.</translation> <translation id="3320021301628644560">Adicionar endereço de faturamento</translation> <translation id="3324983252691184275">Carmim</translation> <translation id="3338095232262050444">Seguro</translation> @@ -537,7 +534,6 @@ <translation id="3761718714832595332">Ocultar status</translation> <translation id="3765032636089507299">A página de navegação segura está em construção.</translation> <translation id="3778403066972421603">Quer salvar este cartão na sua Conta do Google e neste dispositivo?</translation> -<translation id="3779973883630527594">A empresa, escola ou organização que gerencia esta conta:</translation> <translation id="3781428340399460090">Rosa-escuro</translation> <translation id="3783418713923659662">Mastercard</translation> <translation id="3787705759683870569">Validade: <ph name="EXPIRATION_MONTH" />/<ph name="EXPIRATION_YEAR" /></translation> @@ -561,6 +557,7 @@ <translation id="3949571496842715403">Este servidor não conseguiu provar que é <ph name="DOMAIN" />. O certificado de segurança dele não especifica a extensão Nomes alternativos do requerente. Isso pode ser causado por uma configuração incorreta ou pela interceptação da sua conexão por um invasor.</translation> <translation id="3949601375789751990">Seu histórico de navegação aparece aqui</translation> <translation id="3950820424414687140">Fazer login</translation> +<translation id="3962859241508114581">Faixa anterior</translation> <translation id="3963837677003247395">Continuar manualmente?</translation> <translation id="3964661563329879394">{COUNT,plural, =0{Nenhum}=1{1 site }one{# site }other{# sites }}</translation> <translation id="397105322502079400">Calculando...</translation> @@ -583,6 +580,7 @@ <translation id="410351446219883937">Reprodução automática</translation> <translation id="4103763322291513355">Visite <strong>chrome://policy</strong> para ver a lista de URLs adicionados à lista de proibições e outras políticas aplicadas pelo administrador do seu sistema.</translation> <translation id="4110652170750985508">Analisar seu pagamento</translation> +<translation id="4112140312785995938">Retroceder</translation> <translation id="4116663294526079822">Sempre permitir neste site</translation> <translation id="4117700440116928470">O escopo da política não é suportado.</translation> <translation id="4129401438321186435">{COUNT,plural, =1{mais 1}one{mais #}other{mais #}}</translation> @@ -661,6 +659,7 @@ <translation id="443673843213245140">O uso de um proxy está desativado, mas uma configuração explícita de proxy é especificada.</translation> <translation id="445100540951337728">Cartões de débito aceitos</translation> <translation id="4466881336512663640">As alterações no formulário serão perdidas. Tem certeza de que quer continuar?</translation> +<translation id="4477350412780666475">Próxima faixa</translation> <translation id="4482953324121162758">Este site não será traduzido.</translation> <translation id="4490717597759821841">A7</translation> <translation id="4493480324863638523">URL inválido. É necessário um URL com um esquema padrão, como http://example.com ou https://example.com.</translation> @@ -907,7 +906,6 @@ <translation id="5838278095973806738">É recomendado não fornecer informações confidencial a esse site (por exemplo, senhas ou cartões de crédito), porque elas podem ser roubadas por invasores.</translation> <translation id="5860033963881614850">Desativado</translation> <translation id="5863847714970149516">A página que você está prestes a acessar pode tentar cobrar pagamentos</translation> -<translation id="5865951947699094510">Pode alterar remotamente a configuração da sua conta.</translation> <translation id="5866257070973731571">Adicione um Número de Telefone</translation> <translation id="5869405914158311789">Não é possível acessar esse site</translation> <translation id="5869522115854928033">Senhas salvas</translation> @@ -1060,6 +1058,7 @@ <translation id="6778737459546443941">Seu responsável ainda não o aprovou</translation> <translation id="67862343314499040">Violeta</translation> <translation id="6786747875388722282">Extensões</translation> +<translation id="6790428901817661496">Reproduzir</translation> <translation id="679355240208270552">Ignorado porque a pesquisa padrão não foi ativada pela política.</translation> <translation id="681021252041861472">Campo obrigatório</translation> <translation id="6810899417690483278">Código de personalização</translation> @@ -1163,6 +1162,7 @@ <translation id="7353601530677266744">Linha de comando</translation> <translation id="7372973238305370288">resultado da pesquisa</translation> <translation id="7377249249140280793"><ph name="RELATIVE_DATE" /> - <ph name="FULL_DATE" /></translation> +<translation id="7378594059915113390">Controles de mídia</translation> <translation id="7378627244592794276">Não</translation> <translation id="7378810950367401542">/</translation> <translation id="7390545607259442187">Confirmar cartão</translation> @@ -1266,7 +1266,6 @@ <translation id="780301667611848630">Não</translation> <translation id="7805768142964895445">Status</translation> <translation id="7806344367022510803">Altere as configurações de mecanismo de pesquisa no Chrome</translation> -<translation id="7810209002420871817">Como administrador da sua conta, <ph name="ACCOUNT_DOMAIN" />:</translation> <translation id="7812922009395017822">Mir</translation> <translation id="7813600968533626083">Remover sugestão de formulário do Chrome?</translation> <translation id="7815407501681723534">Localizados <ph name="NUMBER_OF_RESULTS" /> <ph name="SEARCH_RESULTS" /> para "<ph name="SEARCH_STRING" />"</translation>
diff --git a/components/strings/components_strings_pt-PT.xtb b/components/strings/components_strings_pt-PT.xtb index 521d1a9..cffdee2e 100644 --- a/components/strings/components_strings_pt-PT.xtb +++ b/components/strings/components_strings_pt-PT.xtb
@@ -1,7 +1,6 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="pt-PT"> -<translation id="1001338328714563407">Enquanto gestor do seu dispositivo e da sua conta, <ph name="ENROLLMENT_DOMAIN" />:</translation> <translation id="1008557486741366299">Agora não</translation> <translation id="1010200102790553230">Carregar a página mais tarde</translation> <translation id="1015730422737071372">Forneça mais detalhes</translation> @@ -41,6 +40,7 @@ <translation id="1161325031994447685">Ligar novamente à rede Wi-Fi</translation> <translation id="1165039591588034296">Erro</translation> <translation id="1175364870820465910">Im&primir...</translation> +<translation id="1178581264944972037">Pausa</translation> <translation id="1181037720776840403">Remover</translation> <translation id="1197088940767939838">Laranja</translation> <translation id="1201402288615127009">Seguinte</translation> @@ -100,7 +100,6 @@ <translation id="1405567553485452995">Verde-claro</translation> <translation id="1407135791313364759">Abrir tudo</translation> <translation id="1413809658975081374">Erro de privacidade</translation> -<translation id="14171126816530869">A identidade de <ph name="ORGANIZATION" /> em <ph name="LOCALITY" /> foi verificada por <ph name="ISSUER" />.</translation> <translation id="1426410128494586442">Sim</translation> <translation id="1430915738399379752">Imprimir</translation> <translation id="1455413310270022028">Borracha</translation> @@ -256,6 +255,7 @@ <translation id="2262243747453050782">Erro HTTP</translation> <translation id="2263079731045660823">Atualizar as informações de preenchimento automático do cartão de crédito nas definições do Chrome</translation> <translation id="2270484714375784793">Número de telefone</translation> +<translation id="2277103315734023688">Procurar para a frente</translation> <translation id="2283340219607151381">Guardar e preencher endereços</translation> <translation id="2292556288342944218">O acesso à Internet está bloqueado</translation> <translation id="2297722699537546652">B5 (Envelope)</translation> @@ -383,7 +383,6 @@ <translation id="295526156371527179">Aviso: esta política não foi unida como dicionário, conforme especificado pela política, porque não é um dicionário.</translation> <translation id="2955913368246107853">Fechar barra de localização</translation> <translation id="2969319727213777354">Para estabelecer uma ligação segura, o relógio tem de ser definido corretamente. Isto deve-se ao facto de os certificados que os Sites utilizam para se identificarem serem apenas válidos para períodos de tempo específicos. Uma vez que o relógio do seu dispositivo está incorreto, o Google Chrome não consegue validar estes certificados.</translation> -<translation id="2970515157925768593">Pode alterar remotamente a configuração do seu dispositivo e da sua conta.</translation> <translation id="2972581237482394796">&Repetir</translation> <translation id="2977665033722899841"><ph name="ROW_NAME" /> selecionado atualmente. <ph name="ROW_CONTENT" /></translation> <translation id="2982481275546140226">Limpar dados</translation> @@ -395,7 +394,6 @@ <translation id="3005723025932146533">Mostrar cópia guardada</translation> <translation id="3008447029300691911">Introduza o Código de Segurança/CVC de <ph name="CREDIT_CARD" />. Ao confirmar, os detalhes do cartão são partilhados com este site.</translation> <translation id="3010559122411665027">Entrada da lista "<ph name="ENTRY_INDEX" />": <ph name="ERROR" /></translation> -<translation id="3014389611820813634">Enquanto gestor deste dispositivo, <ph name="ENROLLMENT_DOMAIN" />:</translation> <translation id="301521992641321250">Bloqueada automaticamente</translation> <translation id="3023071826883856138">You4 (Envelope)</translation> <translation id="3024663005179499861">Tipo de política incorreto</translation> @@ -441,7 +439,6 @@ <translation id="3287510313208355388">Transferir quando estiver online</translation> <translation id="3293642807462928945">Saiba mais acerca da política <ph name="POLICY_NAME" /></translation> <translation id="3303855915957856445">Não foram encontrados resultados da pesquisa</translation> -<translation id="3311730110465560799">Pode alterar remotamente a configuração do seu dispositivo.</translation> <translation id="3320021301628644560">Adicionar endereço de faturação</translation> <translation id="3324983252691184275">Carmesim</translation> <translation id="3338095232262050444">Seguro</translation> @@ -537,7 +534,6 @@ <translation id="3761718714832595332">Ocultar estado</translation> <translation id="3765032636089507299">A página de Navegação segura está em construção.</translation> <translation id="3778403066972421603">Pretende guardar este cartão na sua Conta Google e neste dispositivo?</translation> -<translation id="3779973883630527594">A empresa, escola ou organização que gere esta conta:</translation> <translation id="3781428340399460090">Rosa choque</translation> <translation id="3783418713923659662">Mastercard</translation> <translation id="3787705759683870569">Expira a <ph name="EXPIRATION_MONTH" />/<ph name="EXPIRATION_YEAR" /></translation> @@ -561,6 +557,7 @@ <translation id="3949571496842715403">Este servidor não conseguiu provar que é <ph name="DOMAIN" />. O respetivo certificado de segurança não especifica Nomes alternativos do requerente. Isto pode ser o resultado de uma configuração incorreta ou de um utilizador mal-intencionado que intercetou a sua ligação.</translation> <translation id="3949601375789751990">O histórico de navegação é apresentado aqui</translation> <translation id="3950820424414687140">Iniciar sessão</translation> +<translation id="3962859241508114581">Faixa anterior</translation> <translation id="3963837677003247395">Pretende continuar manualmente?</translation> <translation id="3964661563329879394">{COUNT,plural, =0{Nenhum}=1{De 1 site }other{De # sites }}</translation> <translation id="397105322502079400">A calcular...</translation> @@ -583,6 +580,7 @@ <translation id="410351446219883937">Reprodução automática</translation> <translation id="4103763322291513355">Visite <strong>chrome://policy</strong> para ver os URLs que foram colocados na lista negra e outras políticas aplicadas pelo gestor do sistema.</translation> <translation id="4110652170750985508">Rever o seu pagamento</translation> +<translation id="4112140312785995938">Procurar para trás</translation> <translation id="4116663294526079822">Permitir sempre neste Website</translation> <translation id="4117700440116928470">O âmbito da política não é suportado.</translation> <translation id="4129401438321186435">{COUNT,plural, =1{1 outro}other{# outros}}</translation> @@ -661,6 +659,7 @@ <translation id="443673843213245140">A utilização de um proxy está desativada, mas existe uma configuração de proxy explícita especificada.</translation> <translation id="445100540951337728">Cartões de débito admitidos</translation> <translation id="4466881336512663640">As alterações ao formulário serão perdidas. Tem a certeza de que pretende continuar?</translation> +<translation id="4477350412780666475">Faixa seguinte</translation> <translation id="4482953324121162758">Este site não será traduzido.</translation> <translation id="4490717597759821841">A7</translation> <translation id="4493480324863638523">URL inválido. Tem de ser um URL com um esquema padrão, por exemplo, http://example.com ou https://example.com.</translation> @@ -907,7 +906,6 @@ <translation id="5838278095973806738">Não deve introduzir informações confidenciais neste site (por exemplo, palavras-passe ou números de cartões de crédito), porque podem ser roubadas por atacantes.</translation> <translation id="5860033963881614850">Desativado</translation> <translation id="5863847714970149516">A próxima página pode tentar cobrar-lhe dinheiro</translation> -<translation id="5865951947699094510">Pode alterar remotamente a configuração da sua conta.</translation> <translation id="5866257070973731571">Adicionar número de telefone</translation> <translation id="5869405914158311789">Não é possível aceder a este site</translation> <translation id="5869522115854928033">Palavras-passe guardadas</translation> @@ -1060,6 +1058,7 @@ <translation id="6778737459546443941">O teu pai/a tua mãe ainda não o aprovou</translation> <translation id="67862343314499040">Violeta</translation> <translation id="6786747875388722282">Extensões</translation> +<translation id="6790428901817661496">Reproduzir</translation> <translation id="679355240208270552">Ignorado porque a pesquisa predefinida não está ativada pela política.</translation> <translation id="681021252041861472">Campo obrigatório</translation> <translation id="6810899417690483278">ID de personalização</translation> @@ -1104,6 +1103,7 @@ <translation id="7053983685419859001">Bloquear</translation> <translation id="7062635574500127092">Azul esverdeado</translation> <translation id="7064851114919012435">Informações de contacto</translation> +<translation id="7075452647191940183">O pedido é demasiado grande.</translation> <translation id="7079718277001814089">Este site contém um software malicioso</translation> <translation id="7087282848513945231">Município</translation> <translation id="7090678807593890770">Pesquisar <ph name="LINK" /> no Google</translation> @@ -1163,6 +1163,7 @@ <translation id="7353601530677266744">Linha de comandos</translation> <translation id="7372973238305370288">resultado da pesquisa</translation> <translation id="7377249249140280793"><ph name="RELATIVE_DATE" /> - <ph name="FULL_DATE" /></translation> +<translation id="7378594059915113390">Controlos de multimédia</translation> <translation id="7378627244592794276">Não</translation> <translation id="7378810950367401542">/</translation> <translation id="7390545607259442187">Confirmar cartão</translation> @@ -1265,7 +1266,6 @@ <translation id="780301667611848630">Não, obrigado</translation> <translation id="7805768142964895445">Estado</translation> <translation id="7806344367022510803">Alterar definições do motor de pesquisa no Chrome</translation> -<translation id="7810209002420871817">Enquanto gestor da sua conta, <ph name="ACCOUNT_DOMAIN" />:</translation> <translation id="7812922009395017822">Mir</translation> <translation id="7813600968533626083">Pretende remover a sugestão do formulário do Chrome?</translation> <translation id="7815407501681723534">Encontrados <ph name="NUMBER_OF_RESULTS" /> <ph name="SEARCH_RESULTS" /> para "<ph name="SEARCH_STRING" />"</translation>
diff --git a/components/strings/components_strings_ro.xtb b/components/strings/components_strings_ro.xtb index c8c08f162..08093f5f 100644 --- a/components/strings/components_strings_ro.xtb +++ b/components/strings/components_strings_ro.xtb
@@ -1,7 +1,6 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="ro"> -<translation id="1001338328714563407">Fiind managerul dispozitivului și contului, <ph name="ENROLLMENT_DOMAIN" />:</translation> <translation id="1008557486741366299">Nu acum</translation> <translation id="1010200102790553230">Încarcă pagina mai târziu</translation> <translation id="1015730422737071372">Specifică detalii suplimentare</translation> @@ -41,6 +40,7 @@ <translation id="1161325031994447685">să te reconectezi la Wi-Fi</translation> <translation id="1165039591588034296">Eroare</translation> <translation id="1175364870820465910">&Printează...</translation> +<translation id="1178581264944972037">Întrerupe</translation> <translation id="1181037720776840403">Elimină</translation> <translation id="1197088940767939838">Portocaliu</translation> <translation id="1201402288615127009">Înainte</translation> @@ -100,7 +100,6 @@ <translation id="1405567553485452995">Verde deschis</translation> <translation id="1407135791313364759">Deschideți-le pe toate</translation> <translation id="1413809658975081374">Eroare legată de confidențialitate</translation> -<translation id="14171126816530869">Identitatea <ph name="ORGANIZATION" /> din <ph name="LOCALITY" /> a fost verificată de către <ph name="ISSUER" />.</translation> <translation id="1426410128494586442">Da</translation> <translation id="1430915738399379752">Printează</translation> <translation id="1455413310270022028">Radieră</translation> @@ -256,6 +255,7 @@ <translation id="2262243747453050782">Eroare HTTP</translation> <translation id="2263079731045660823">Actualizează informațiile privind completarea automată a cardurilor de credit în setările Chrome</translation> <translation id="2270484714375784793">Număr telefon</translation> +<translation id="2277103315734023688">Derulează înainte</translation> <translation id="2283340219607151381">Salvează și completează adresele</translation> <translation id="2292556288342944218">Accesul la internet este blocat</translation> <translation id="2297722699537546652">B5 (Plic)</translation> @@ -383,7 +383,6 @@ <translation id="295526156371527179">Atenție: această politică nu a fost îmbinată ca dicționar așa cum este indicat de politică, deoarece nu este un dicționar.</translation> <translation id="2955913368246107853">Închide Bara de căutare</translation> <translation id="2969319727213777354">Pentru a stabili o conexiune securizată, ceasul trebuie să fie setat corect, deoarece certificatele pe care site-urile le folosesc pentru a se identifica sunt valabile numai pentru anumite intervale de timp. Din moment ce ora de pe dispozitiv este incorectă, Google Chrome nu poate verifica aceste certificate.</translation> -<translation id="2970515157925768593">Poate să modifice de la distanță configurarea dispozitivului și a contului.</translation> <translation id="2972581237482394796">&Repetă</translation> <translation id="2977665033722899841"><ph name="ROW_NAME" /> selectat(ă). <ph name="ROW_CONTENT" /></translation> <translation id="2982481275546140226">Șterge datele</translation> @@ -395,7 +394,6 @@ <translation id="3005723025932146533">Afișați o copie salvată</translation> <translation id="3008447029300691911">Introdu codul CVC pentru <ph name="CREDIT_CARD" />. După ce confirmi, acest site va avea acces la detaliile cardului tău.</translation> <translation id="3010559122411665027">Intrarea din listă „<ph name="ENTRY_INDEX" />”: <ph name="ERROR" /></translation> -<translation id="3014389611820813634">Fiind managerul dispozitivului, <ph name="ENROLLMENT_DOMAIN" />:</translation> <translation id="301521992641321250">Blocată automat</translation> <translation id="3023071826883856138">You4 (Plic)</translation> <translation id="3024663005179499861">Tip de politică greșit</translation> @@ -441,7 +439,6 @@ <translation id="3287510313208355388">Descarcă când ești online</translation> <translation id="3293642807462928945">Află mai multe despre politica <ph name="POLICY_NAME" /></translation> <translation id="3303855915957856445">Nu s-au găsit rezultate de căutare</translation> -<translation id="3311730110465560799">Poate modifica de la distanță configurarea dispozitivului.</translation> <translation id="3320021301628644560">Adaugă o adresă de facturare</translation> <translation id="3324983252691184275">Roșu aprins</translation> <translation id="3338095232262050444">Securizat</translation> @@ -537,7 +534,6 @@ <translation id="3761718714832595332">Ascunde starea</translation> <translation id="3765032636089507299">Pagina Navigare sigură este în construcție.</translation> <translation id="3778403066972421603">Dorești să salvezi acest card în Contul Google și pe acest dispozitiv?</translation> -<translation id="3779973883630527594">Compania, școala sau organizația care gestionează acest cont:</translation> <translation id="3781428340399460090">Roz aprins</translation> <translation id="3783418713923659662">Mastercard</translation> <translation id="3787705759683870569">Expiră în <ph name="EXPIRATION_MONTH" />/<ph name="EXPIRATION_YEAR" /></translation> @@ -561,6 +557,7 @@ <translation id="3949571496842715403">Acest server nu a putut dovedi că este <ph name="DOMAIN" />; în certificatul său de securitate nu este specificat câmpul Nume alternative subiect. Cauza poate fi o eroare de configurare sau interceptarea conexiunii de către un atacator.</translation> <translation id="3949601375789751990">Istoricul de navigare apare aici</translation> <translation id="3950820424414687140">Conectează-te</translation> +<translation id="3962859241508114581">Melodia anterioară</translation> <translation id="3963837677003247395">Continui manual?</translation> <translation id="3964661563329879394">{COUNT,plural, =0{Niciunul}=1{De la 1 site }few{De la # site-uri }other{De la # de site-uri }}</translation> <translation id="397105322502079400">Se calculează...</translation> @@ -583,6 +580,7 @@ <translation id="410351446219883937">Redare automată</translation> <translation id="4103763322291513355">Accesați <strong>chrome://policy</strong> pentru a vedea adresele URL introduse pe lista neagră și alte politici impuse de către administratorul de sistem.</translation> <translation id="4110652170750985508">Examinează plata</translation> +<translation id="4112140312785995938">Derulează înapoi</translation> <translation id="4116663294526079822">Permiteți întotdeauna pe acest site</translation> <translation id="4117700440116928470">Domeniul politicii nu este acceptat.</translation> <translation id="4129401438321186435">{COUNT,plural, =1{încă 1}few{încă #}other{încă #}}</translation> @@ -661,6 +659,7 @@ <translation id="443673843213245140">Utilizarea unui proxy este dezactivată, dar o configurare proxy este specificată în mod explicit.</translation> <translation id="445100540951337728">Carduri de debit acceptate</translation> <translation id="4466881336512663640">Modificările aduse formularului se vor pierde. Sigur dorești să continui?</translation> +<translation id="4477350412780666475">Melodia următoare</translation> <translation id="4482953324121162758">Acest site nu va fi tradus.</translation> <translation id="4490717597759821841">A7</translation> <translation id="4493480324863638523">Adresă URL nevalidă. Trebuie să fie o adresă URL cu schemă standard, de exemplu: http://example.com sau https://example.com.</translation> @@ -907,7 +906,6 @@ <translation id="5838278095973806738">Nu ar trebui să introduci informații sensibile pe acest site (de exemplu, parole sau carduri de credit), deoarece ar putea fi furate de atacatori.</translation> <translation id="5860033963881614850">Dezactivat</translation> <translation id="5863847714970149516">Următoarea pagină poate să genereze costuri</translation> -<translation id="5865951947699094510">Poate să modifice de la distanță crearea contului.</translation> <translation id="5866257070973731571">Adaugă un număr de telefon</translation> <translation id="5869405914158311789">Acest site nu poate fi accesat</translation> <translation id="5869522115854928033">Parole salvate</translation> @@ -1060,6 +1058,7 @@ <translation id="6778737459546443941">Părintele tău nu l-a aprobat încă</translation> <translation id="67862343314499040">Violet</translation> <translation id="6786747875388722282">Extensii</translation> +<translation id="6790428901817661496">Redă</translation> <translation id="679355240208270552">Valoare ignorată, deoarece politica nu a activat căutarea prestabilită.</translation> <translation id="681021252041861472">Câmp obligatoriu</translation> <translation id="6810899417690483278">ID-ul de personalizare</translation> @@ -1104,6 +1103,7 @@ <translation id="7053983685419859001">Blochează</translation> <translation id="7062635574500127092">Albastru verzui</translation> <translation id="7064851114919012435">Informații de contact</translation> +<translation id="7075452647191940183">Solicitarea este prea mare</translation> <translation id="7079718277001814089">Acest site conține programe malware</translation> <translation id="7087282848513945231">Comitat</translation> <translation id="7090678807593890770">Caută <ph name="LINK" /> pe Google</translation> @@ -1163,6 +1163,7 @@ <translation id="7353601530677266744">Linie de comandă</translation> <translation id="7372973238305370288">rezultat al căutării</translation> <translation id="7377249249140280793"><ph name="RELATIVE_DATE" /> - <ph name="FULL_DATE" /></translation> +<translation id="7378594059915113390">Comenzi media</translation> <translation id="7378627244592794276">Nu</translation> <translation id="7378810950367401542">/</translation> <translation id="7390545607259442187">Confirmă cardul</translation> @@ -1266,7 +1267,6 @@ <translation id="780301667611848630">Nu, mulțumesc</translation> <translation id="7805768142964895445">Stare</translation> <translation id="7806344367022510803">Modifică setările motorului de căutare în Chrome</translation> -<translation id="7810209002420871817">Fiind managerul contului tău, <ph name="ACCOUNT_DOMAIN" />:</translation> <translation id="7812922009395017822">Mir</translation> <translation id="7813600968533626083">Elimini sugestia pentru formular din Chrome?</translation> <translation id="7815407501681723534">S-au găsit <ph name="NUMBER_OF_RESULTS" /> <ph name="SEARCH_RESULTS" /> pentru „<ph name="SEARCH_STRING" />”</translation>
diff --git a/components/strings/components_strings_ru.xtb b/components/strings/components_strings_ru.xtb index 0f1d5c2..b63dc55 100644 --- a/components/strings/components_strings_ru.xtb +++ b/components/strings/components_strings_ru.xtb
@@ -1,7 +1,6 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="ru"> -<translation id="1001338328714563407">Как администратор вашего устройства и аккаунта домен <ph name="ENROLLMENT_DOMAIN" />:</translation> <translation id="1008557486741366299">Не сейчас</translation> <translation id="1010200102790553230">Загрузить страницу позже</translation> <translation id="1015730422737071372">Сообщить дополнительную информацию</translation> @@ -41,6 +40,7 @@ <translation id="1161325031994447685">Подключитесь к сети Wi-Fi ещё раз.</translation> <translation id="1165039591588034296">Ошибка</translation> <translation id="1175364870820465910">&Печать...</translation> +<translation id="1178581264944972037">Пауза</translation> <translation id="1181037720776840403">Удалить</translation> <translation id="1197088940767939838">Оранжевый</translation> <translation id="1201402288615127009">Далее</translation> @@ -98,7 +98,6 @@ <translation id="1405567553485452995">Светло-зеленый</translation> <translation id="1407135791313364759">Открыть все</translation> <translation id="1413809658975081374">Ошибка нарушения конфиденциальности</translation> -<translation id="14171126816530869">Идентификационные данные <ph name="ORGANIZATION" /> в <ph name="LOCALITY" /> проверены <ph name="ISSUER" />.</translation> <translation id="1426410128494586442">Да</translation> <translation id="1430915738399379752">Печать</translation> <translation id="1455413310270022028">Ластик</translation> @@ -251,6 +250,7 @@ <translation id="2262243747453050782">Ошибка HTTP</translation> <translation id="2263079731045660823">Обновить данные автозаполнения для кредитной карты в настройках Chrome</translation> <translation id="2270484714375784793">Номер телефона</translation> +<translation id="2277103315734023688">Перемотать вперед</translation> <translation id="2283340219607151381">Сохранять и автоматически подставлять адреса</translation> <translation id="2292556288342944218">Доступ в Интернет закрыт</translation> <translation id="2297722699537546652">B5 (конверт)</translation> @@ -375,7 +375,6 @@ <translation id="295526156371527179">Внимание! Это правило не объединено, так как оно не является словарем.</translation> <translation id="2955913368246107853">Закрыть панель поиска</translation> <translation id="2969319727213777354">Для создания безопасного подключения необходимо, чтобы показания системных часов были верны. Причина в том, что сертификаты для идентификации сайтов имеют ограниченный срок действия. Если часы на устройстве неточны, Chrome не может проверить актуальность этих сертификатов.</translation> -<translation id="2970515157925768593">может удаленно менять конфигурацию устройства и аккаунта;</translation> <translation id="2972581237482394796">&Повторить</translation> <translation id="2977665033722899841">Сейчас выбрано – <ph name="ROW_NAME" />. <ph name="ROW_CONTENT" />.</translation> <translation id="2982481275546140226">Удалить данные</translation> @@ -387,7 +386,6 @@ <translation id="3005723025932146533">Открыть сохраненную копию</translation> <translation id="3008447029300691911">Введите CVC-код карты <ph name="CREDIT_CARD" />. После этого ее данные будут переданы сайту.</translation> <translation id="3010559122411665027">Элемент списка "<ph name="ENTRY_INDEX" />": <ph name="ERROR" /></translation> -<translation id="3014389611820813634">Как администратор этого устройства домен <ph name="ENROLLMENT_DOMAIN" />:</translation> <translation id="301521992641321250">Заблокировано автоматически</translation> <translation id="3023071826883856138">You4 (конверт)</translation> <translation id="3024663005179499861">Неверный тип политики</translation> @@ -432,7 +430,6 @@ <translation id="3287510313208355388">Скачать при подключении к Интернету</translation> <translation id="3293642807462928945">Подробнее о политике <ph name="POLICY_NAME" />…</translation> <translation id="3303855915957856445">Ничего не найдено</translation> -<translation id="3311730110465560799">Может удаленно менять конфигурацию устройства.</translation> <translation id="3320021301628644560">Добавьте платежный адрес</translation> <translation id="3324983252691184275">Малиновый</translation> <translation id="3338095232262050444">Защищено</translation> @@ -528,7 +525,6 @@ <translation id="3761718714832595332">Скрыть статус</translation> <translation id="3765032636089507299">Страница безопасного просмотра находится в разработке.</translation> <translation id="3778403066972421603">Хотите сохранить карту в аккаунте Google и на этом устройстве?</translation> -<translation id="3779973883630527594">Компания, учебное заведение или другая организация, которая управляет этим аккаунтом:</translation> <translation id="3781428340399460090">Ярко-розовый</translation> <translation id="3783418713923659662">Mastercard</translation> <translation id="3787705759683870569">Срок действия: до <ph name="EXPIRATION_MONTH" />/<ph name="EXPIRATION_YEAR" /></translation> @@ -552,6 +548,7 @@ <translation id="3949571496842715403">Сервер не может подтвердить связь с доменом <ph name="DOMAIN" />. В его сертификате безопасности не указаны альтернативные варианты имен. Возможно, сервер настроен неправильно или кто-то пытается перехватить ваши данные.</translation> <translation id="3949601375789751990">История просмотров появится здесь</translation> <translation id="3950820424414687140">Вход</translation> +<translation id="3962859241508114581">Предыдущий трек</translation> <translation id="3963837677003247395">Продолжить вручную?</translation> <translation id="3964661563329879394">{COUNT,plural, =0{Нет}=1{С 1 сайта }one{С # сайта }few{С # сайтов }many{С # сайтов }other{С # сайта }}</translation> <translation id="397105322502079400">Вычисление…</translation> @@ -574,6 +571,7 @@ <translation id="410351446219883937">Автовоспроизведение</translation> <translation id="4103763322291513355">Чтобы просмотреть URL, внесенные в черный список, и другие правила, заданные системным администратором, перейдите по адресу: <strong>chrome://policy</strong>.</translation> <translation id="4110652170750985508">Просмотр платежа</translation> +<translation id="4112140312785995938">Перемотать назад</translation> <translation id="4116663294526079822">Всегда разрешать на этом сайте</translation> <translation id="4117700440116928470">Область действия правил не поддерживается.</translation> <translation id="4129401438321186435">{COUNT,plural, =1{ещё 1 вариант}one{ещё # вариант}few{ещё # варианта}many{ещё # вариантов}other{ещё # варианта}}</translation> @@ -652,6 +650,7 @@ <translation id="443673843213245140">Прокси-сервер отключен, но при этом его конфигурация задана явным образом.</translation> <translation id="445100540951337728">Дебетовые карты, которые принимаются к оплате</translation> <translation id="4466881336512663640">Внесенные в форму изменения не сохранятся. Продолжить?</translation> +<translation id="4477350412780666475">Следующий трек</translation> <translation id="4482953324121162758">Этот сайт не будет переводиться автоматически.</translation> <translation id="4490717597759821841">A7</translation> <translation id="4493480324863638523">Недопустимый URL. Укажите URL в стандартном виде, например http://example.com или https://example.com.</translation> @@ -898,7 +897,6 @@ <translation id="5838278095973806738">Не сообщайте этому сайту конфиденциальную информацию (например, пароли и номера банковских карт). К ней могут получить доступ злоумышленники.</translation> <translation id="5860033963881614850">ВЫКЛ</translation> <translation id="5863847714970149516">При открытии этой страницы с вашего счета могут быть списаны средства</translation> -<translation id="5865951947699094510">может удаленно менять конфигурацию вашего аккаунта;</translation> <translation id="5866257070973731571">Добавьте номер телефона</translation> <translation id="5869405914158311789">Не удается получить доступ к сайту</translation> <translation id="5869522115854928033">Сайты с сохраненными паролями</translation> @@ -1051,6 +1049,7 @@ <translation id="6778737459546443941">Ещё не одобрено родителем</translation> <translation id="67862343314499040">Фиолетовый</translation> <translation id="6786747875388722282">Расширения</translation> +<translation id="6790428901817661496">Воспроизвести</translation> <translation id="679355240208270552">Игнорируется, так как в правиле не задан поиск по умолчанию.</translation> <translation id="681021252041861472">Обязательное поле</translation> <translation id="6810899417690483278">Идентификатор персонализации</translation> @@ -1151,6 +1150,7 @@ <translation id="7353601530677266744">Командная строка</translation> <translation id="7372973238305370288">результат поиска</translation> <translation id="7377249249140280793"><ph name="RELATIVE_DATE" /> - <ph name="FULL_DATE" /></translation> +<translation id="7378594059915113390">Элементы управления медиафайлами</translation> <translation id="7378627244592794276">Нет</translation> <translation id="7378810950367401542">/</translation> <translation id="7390545607259442187">Подтвердите карту</translation> @@ -1254,7 +1254,6 @@ <translation id="780301667611848630">Спасибо, не надо</translation> <translation id="7805768142964895445">Состояние</translation> <translation id="7806344367022510803">Изменить настройки поисковой системы в Chrome</translation> -<translation id="7810209002420871817">Как администратор вашего аккаунта домен <ph name="ACCOUNT_DOMAIN" />:</translation> <translation id="7812922009395017822">Мир</translation> <translation id="7813600968533626083">Удалить подсказку из Chrome?</translation> <translation id="7815407501681723534"><ph name="SEARCH_RESULTS" /> по запросу "<ph name="SEARCH_STRING" />" (<ph name="NUMBER_OF_RESULTS" />)</translation>
diff --git a/components/strings/components_strings_sk.xtb b/components/strings/components_strings_sk.xtb index 7998cd1..e7f17cec 100644 --- a/components/strings/components_strings_sk.xtb +++ b/components/strings/components_strings_sk.xtb
@@ -1,7 +1,6 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="sk"> -<translation id="1001338328714563407">Ako správca zariadenia a účtu, <ph name="ENROLLMENT_DOMAIN" />:</translation> <translation id="1008557486741366299">Teraz nie</translation> <translation id="1010200102790553230">Načítať stránku neskôr</translation> <translation id="1015730422737071372">Poskytnite ďalšie podrobnosti</translation> @@ -41,6 +40,7 @@ <translation id="1161325031994447685">Znovu sa pripojiť k sieti Wi‑Fi</translation> <translation id="1165039591588034296">Chyba</translation> <translation id="1175364870820465910">&Tlačiť...</translation> +<translation id="1178581264944972037">Pozastaviť</translation> <translation id="1181037720776840403">Odstrániť</translation> <translation id="1197088940767939838">Oranžová</translation> <translation id="1201402288615127009">Ďalej</translation> @@ -98,7 +98,6 @@ <translation id="1405567553485452995">Svetlozelená</translation> <translation id="1407135791313364759">Otvoriť všetko</translation> <translation id="1413809658975081374">Chyba v ochrane osobných údajov</translation> -<translation id="14171126816530869">Identita spoločnosti <ph name="ORGANIZATION" /> so sídlom <ph name="LOCALITY" /> bola overená spoločnosťou <ph name="ISSUER" />.</translation> <translation id="1426410128494586442">Áno</translation> <translation id="1430915738399379752">Tlačiť</translation> <translation id="1455413310270022028">Guma</translation> @@ -251,6 +250,7 @@ <translation id="2262243747453050782">Chyba protokolu HTTP</translation> <translation id="2263079731045660823">Aktualizujte informácie automatického dopĺňania kreditných kariet v nastaveniach Chromu</translation> <translation id="2270484714375784793">Telefónne číslo</translation> +<translation id="2277103315734023688">Pretočiť dopredu</translation> <translation id="2283340219607151381">Ukladať a dopĺňať adresy</translation> <translation id="2292556288342944218">Váš prístup k internetu je blokovaný</translation> <translation id="2297722699537546652">B5 (obálka)</translation> @@ -375,7 +375,6 @@ <translation id="295526156371527179">Upozornenie: Toto pravidlo nebolo zlúčené ako slovník podľa špecifikácií pravidla, pretože to nie je slovník.</translation> <translation id="2955913368246107853">Zatvoriť panel pre vyhľadávanie</translation> <translation id="2969319727213777354">Ak chcete nadviazať zabezpečené pripojenie, vaše hodiny musia byť nastavené správne. Je to preto, že certifikáty, ktoré webové stránky používajú na vlastnú identifikáciu, sú platné iba určitý čas. Keďže nie sú hodiny vášho zariadenia nastavené správne, Chrome nemôže tieto certifikáty overiť.</translation> -<translation id="2970515157925768593">Môže vzdialene zmeniť nastavenie zariadenia a účtu.</translation> <translation id="2972581237482394796">&Dopredu</translation> <translation id="2977665033722899841"><ph name="ROW_NAME" />, aktuálne vybraté. <ph name="ROW_CONTENT" /></translation> <translation id="2982481275546140226">Vymazať dáta</translation> @@ -387,7 +386,6 @@ <translation id="3005723025932146533">Zobraziť uloženú kópiu</translation> <translation id="3008447029300691911">Zadajte kód CVC karty <ph name="CREDIT_CARD" />. Po potvrdení budú podrobnosti o karte zdieľané s týmto webom.</translation> <translation id="3010559122411665027">Položka zoznamu „<ph name="ENTRY_INDEX" />“: <ph name="ERROR" /></translation> -<translation id="3014389611820813634">Ako správca tohto zariadenia, <ph name="ENROLLMENT_DOMAIN" />:</translation> <translation id="301521992641321250">Automaticky blokované</translation> <translation id="3023071826883856138">You4 (obálka)</translation> <translation id="3024663005179499861">Chybný typ pravidla</translation> @@ -430,7 +428,6 @@ <translation id="3287510313208355388">Stiahnuť po obnovení pripojenia</translation> <translation id="3293642807462928945">Ďalšie informácie o pravidle <ph name="POLICY_NAME" /></translation> <translation id="3303855915957856445">Nič sa nenašlo</translation> -<translation id="3311730110465560799">Môže vzdialene zmeniť nastavenie zaradenia.</translation> <translation id="3320021301628644560">Pridanie fakturačnej adresy</translation> <translation id="3324983252691184275">Karmínová</translation> <translation id="3338095232262050444">Zabezpečené</translation> @@ -525,7 +522,6 @@ <translation id="3761718714832595332">Skryť stav</translation> <translation id="3765032636089507299">Stránka Bezpečného prehliadania sa pripravuje.</translation> <translation id="3778403066972421603">Chcete uložiť túto kartu do svojho účtu Google a tohto zariadenia?</translation> -<translation id="3779973883630527594">Spoločnosť, škola alebo organizácia, ktorá spravuje tento účet:</translation> <translation id="3781428340399460090">Jasnoružová</translation> <translation id="3783418713923659662">Mastercard</translation> <translation id="3787705759683870569">Platnosť vyprší <ph name="EXPIRATION_MONTH" />/<ph name="EXPIRATION_YEAR" /></translation> @@ -549,6 +545,7 @@ <translation id="3949571496842715403">Tento server nedokázal potvrdiť, či ide o doménu <ph name="DOMAIN" /> – príslušný bezpečnostný certifikát neuvádza alternatívne názvy predmetu. Môže to byť spôsobené nesprávnou konfiguráciou alebo tým, že vaše pripojenie napadol útočník.</translation> <translation id="3949601375789751990">Tu sa zobrazí vaša história prehliadania</translation> <translation id="3950820424414687140">Prihlásiť sa</translation> +<translation id="3962859241508114581">Predchádzajúca stopa</translation> <translation id="3963837677003247395">Pokračovať manuálne?</translation> <translation id="3964661563329879394">{COUNT,plural, =0{Žiadne}=1{Z 1 webu }few{Z # webov }many{Z # webu }other{Z # webov }}</translation> <translation id="397105322502079400">Prebieha výpočet...</translation> @@ -571,6 +568,7 @@ <translation id="410351446219883937">Automatické prehrávanie</translation> <translation id="4103763322291513355">Na stránke <strong>chrome://policy</strong> nájdete zoznam zakázaných webových adries a ďalšie pravidlá vynútené vaším správcom systému.</translation> <translation id="4110652170750985508">Kontrola platby</translation> +<translation id="4112140312785995938">Pretočiť dozadu</translation> <translation id="4116663294526079822">Vždy povoliť na tomto webe</translation> <translation id="4117700440116928470">Rozsah pravidla nie je podporovaný.</translation> <translation id="4129401438321186435">{COUNT,plural, =1{1 ďalšia}few{# ďalšie}many{# ďalšej}other{# ďalších}}</translation> @@ -649,6 +647,7 @@ <translation id="443673843213245140">Použitie servera proxy je zakázané, ale je určená explicitná konfigurácia servera proxy.</translation> <translation id="445100540951337728">Akceptované debetné karty</translation> <translation id="4466881336512663640">Zmeny formulára sa odstránia. Naozaj chcete pokračovať?</translation> +<translation id="4477350412780666475">Ďalšia stopa</translation> <translation id="4482953324121162758">Tento web nebude preložený.</translation> <translation id="4490717597759821841">A7</translation> <translation id="4493480324863638523">Neplatná webová adresa. Je nutné použiť webovú adresu so štandardnou schémou, napr. http://example.com alebo https://example.com.</translation> @@ -895,7 +894,6 @@ <translation id="5838278095973806738">Na tomto webe by ste nemali zadávať citlivé údaje, napríklad heslá alebo kreditné karty, pretože by ich mohli ukradnúť útočníci.</translation> <translation id="5860033963881614850">Vypnuté</translation> <translation id="5863847714970149516">Stránka, na ktorú sa chystáte prejsť, vám môže účtovať poplatky</translation> -<translation id="5865951947699094510">Môže vzdialene zmeniť nastavenie účtu.</translation> <translation id="5866257070973731571">Pridanie telefónneho čísla</translation> <translation id="5869405914158311789">Tento web je nedostupný</translation> <translation id="5869522115854928033">Uložené heslá</translation> @@ -1047,6 +1045,7 @@ <translation id="6778737459546443941">Váš rodič to zatiaľ neschválil</translation> <translation id="67862343314499040">Fialová</translation> <translation id="6786747875388722282">Rozšírenia</translation> +<translation id="6790428901817661496">Prehrať</translation> <translation id="679355240208270552">Ignorované, pretože predvolené vyhľadávanie je zakázané pravidlom.</translation> <translation id="681021252041861472">Povinné pole</translation> <translation id="6810899417690483278">Identifikátor prispôsobenia</translation> @@ -1091,6 +1090,7 @@ <translation id="7053983685419859001">Blokovať</translation> <translation id="7062635574500127092">Modrozelená</translation> <translation id="7064851114919012435">Kontaktné informácie</translation> +<translation id="7075452647191940183">Žiadosť je príliš veľká</translation> <translation id="7079718277001814089">Tento web obsahuje malvér</translation> <translation id="7087282848513945231">Okres</translation> <translation id="7090678807593890770">Vyhľadajte na Googli výraz <ph name="LINK" /></translation> @@ -1147,6 +1147,7 @@ <translation id="7353601530677266744">Príkazový riadok</translation> <translation id="7372973238305370288">výsledok vyhľadávania</translation> <translation id="7377249249140280793"><ph name="RELATIVE_DATE" /> – <ph name="FULL_DATE" /></translation> +<translation id="7378594059915113390">Ovládacie prvky médií</translation> <translation id="7378627244592794276">Nie</translation> <translation id="7378810950367401542">/</translation> <translation id="7390545607259442187">Overenie karty</translation> @@ -1250,7 +1251,6 @@ <translation id="780301667611848630">Nie, ďakujem</translation> <translation id="7805768142964895445">Stav</translation> <translation id="7806344367022510803">Zmeňte nastavenia vyhľadávača v Chrome</translation> -<translation id="7810209002420871817">Ako správca účtu <ph name="ACCOUNT_DOMAIN" />:</translation> <translation id="7812922009395017822">Mir</translation> <translation id="7813600968533626083">Chcete návrh odstrániť z prehliadača Chrome?</translation> <translation id="7815407501681723534">Nájdené výsledky (počet: <ph name="NUMBER_OF_RESULTS" />) pre dopyt „<ph name="SEARCH_STRING" />“: <ph name="SEARCH_RESULTS" /></translation>
diff --git a/components/strings/components_strings_sl.xtb b/components/strings/components_strings_sl.xtb index 02fad0ac..0aa46ed 100644 --- a/components/strings/components_strings_sl.xtb +++ b/components/strings/components_strings_sl.xtb
@@ -1,7 +1,6 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="sl"> -<translation id="1001338328714563407">Kot skrbnik naprave in računa, <ph name="ENROLLMENT_DOMAIN" />:</translation> <translation id="1008557486741366299">Ne zdaj</translation> <translation id="1010200102790553230">Naloži stran pozneje</translation> <translation id="1015730422737071372">Navedite dodatne podrobnosti</translation> @@ -41,6 +40,7 @@ <translation id="1161325031994447685">znova vzpostaviti povezavo z omrežjem Wi-Fi</translation> <translation id="1165039591588034296">Napaka</translation> <translation id="1175364870820465910">&Natisni ...</translation> +<translation id="1178581264944972037">Prekini</translation> <translation id="1181037720776840403">Odstrani</translation> <translation id="1197088940767939838">Oranžna</translation> <translation id="1201402288615127009">Naprej</translation> @@ -100,7 +100,6 @@ <translation id="1405567553485452995">Svetlo zelena</translation> <translation id="1407135791313364759">Odpri vse</translation> <translation id="1413809658975081374">Napaka zasebnosti</translation> -<translation id="14171126816530869">Identiteto organizacije <ph name="ORGANIZATION" /> v kraju <ph name="LOCALITY" /> je potrdil izdajatelj <ph name="ISSUER" />.</translation> <translation id="1426410128494586442">Da</translation> <translation id="1430915738399379752">Natisni</translation> <translation id="1455413310270022028">Radirka</translation> @@ -256,6 +255,7 @@ <translation id="2262243747453050782">Napaka HTTP</translation> <translation id="2263079731045660823">Posodobite podatke za samodejno izpolnjevanje za kreditne kartice v Chromovih nastavitvah</translation> <translation id="2270484714375784793">Telefonska številka</translation> +<translation id="2277103315734023688">Išči naprej</translation> <translation id="2283340219607151381">Shranjevanje in izpolnjevanje naslovov</translation> <translation id="2292556288342944218">Internetni dostop je blokiran</translation> <translation id="2297722699537546652">B5 (Envelope)</translation> @@ -383,7 +383,6 @@ <translation id="295526156371527179">Opozorilo: ta pravilnik ni bil združen kot slovar, kot je določeno v pravilniku, ker ni slovar.</translation> <translation id="2955913368246107853">Zapri vrstico za iskanje</translation> <translation id="2969319727213777354">Če želite vzpostaviti varno povezavo, mora biti ura pravilno nastavljena. Potrdila, ki jih uporabljajo spletna mesta za prepoznavanje, namreč veljajo samo določen čas. Ker je ura naprave nepravilna, Google Chrome teh potrdil ne more preveriti.</translation> -<translation id="2970515157925768593">Lahko na daljavo spremeni nastavitev naprave in računa.</translation> <translation id="2972581237482394796">&Uveljavi</translation> <translation id="2977665033722899841">Trenutno izbrano: <ph name="ROW_NAME" />. <ph name="ROW_CONTENT" /></translation> <translation id="2982481275546140226">Izbriši podatke</translation> @@ -395,7 +394,6 @@ <translation id="3005723025932146533">Pokaži shranjeno kopijo</translation> <translation id="3008447029300691911">Vnesite CVC za <ph name="CREDIT_CARD" />. Ko potrdite, bodo temu spletnemu mestu razkriti podatki o vaši kartici.</translation> <translation id="3010559122411665027">Vnos na sznamu »<ph name="ENTRY_INDEX" />«: <ph name="ERROR" /></translation> -<translation id="3014389611820813634">Kot skrbnik te naprave, <ph name="ENROLLMENT_DOMAIN" />:</translation> <translation id="301521992641321250">Samodejno blokirano</translation> <translation id="3023071826883856138">You4 (Envelope)</translation> <translation id="3024663005179499861">Napačna vrsta pravilnika</translation> @@ -441,7 +439,6 @@ <translation id="3287510313208355388">Prenesi, ko je povezava</translation> <translation id="3293642807462928945">Preberite več o pravilniku <ph name="POLICY_NAME" /></translation> <translation id="3303855915957856445">Ni rezultatov iskanja</translation> -<translation id="3311730110465560799">Lahko spremeni nastavitev naprave na daljavo.</translation> <translation id="3320021301628644560">Dodajanje naslova za izstavitev računa</translation> <translation id="3324983252691184275">Škrlatna</translation> <translation id="3338095232262050444">Varno</translation> @@ -537,7 +534,6 @@ <translation id="3761718714832595332">Skrivanje stanja</translation> <translation id="3765032636089507299">Stran varnega brskanja je v izdelavi.</translation> <translation id="3778403066972421603">Ali želite shraniti to kartico v Google Račun in v tej napravi?</translation> -<translation id="3779973883630527594">Podjetje, šola ali organizacija, ki upravlja ta račun:</translation> <translation id="3781428340399460090">Živo rožnata</translation> <translation id="3783418713923659662">Mastercard</translation> <translation id="3787705759683870569">Poteče: <ph name="EXPIRATION_MONTH" />/<ph name="EXPIRATION_YEAR" /></translation> @@ -561,6 +557,7 @@ <translation id="3949571496842715403">Strežniku ni uspelo dokazati, da je <ph name="DOMAIN" />; njegovo varnostno potrdilo ne določa nadomestnih imen SAN (Subject Alternative Name). Razlog za to je morda napačna konfiguracija ali napadalčevo prestrezanje povezave.</translation> <translation id="3949601375789751990">Tu je prikazana zgodovina brskanja</translation> <translation id="3950820424414687140">Prijava</translation> +<translation id="3962859241508114581">Prejšnja skladba</translation> <translation id="3963837677003247395">Želite nadaljevati ročno?</translation> <translation id="3964661563329879394">{COUNT,plural, =0{Brez}=1{1 spletno mesto }one{# spletno mesto }two{# spletni mesti }few{# spletna mesta }other{# spletnih mest }}</translation> <translation id="397105322502079400">Izračunavanje …</translation> @@ -583,6 +580,7 @@ <translation id="410351446219883937">Samodejno predvajanje</translation> <translation id="4103763322291513355">Na <strong>chrome://policy</strong> si lahko ogledate seznam blokiranih URL-jev in drugih pravilnikov, ki jih uveljavlja skrbnik sistema.</translation> <translation id="4110652170750985508">Pregled plačila</translation> +<translation id="4112140312785995938">Išči nazaj</translation> <translation id="4116663294526079822">Vedno dovoli na tem spletnem mestu</translation> <translation id="4117700440116928470">Obseg pravilnika ni podprt.</translation> <translation id="4129401438321186435">{COUNT,plural, =1{in še 1 drug}one{in še # drug}two{in še # druga}few{in še # drugi}other{in še # drugih}}</translation> @@ -661,6 +659,7 @@ <translation id="443673843213245140">Uporaba strežnika proxy je onemogočena, vendar je njegova konfiguracija izrecno določena.</translation> <translation id="445100540951337728">Sprejete debetne kartice</translation> <translation id="4466881336512663640">Spremembe obrazca bodo izgubljene. Ali ste prepričani, da želite nadaljevati?</translation> +<translation id="4477350412780666475">Naslednja skladba</translation> <translation id="4482953324121162758">To spletno mesto ne bo prevedeno.</translation> <translation id="4490717597759821841">A7</translation> <translation id="4493480324863638523">Neveljaven URL. Mora biti URL s standardno shemo, kot je http://primer.com ali https://primer.com.</translation> @@ -907,7 +906,6 @@ <translation id="5838278095973806738">Na tem spletnem mestu ne vnašajte občutljivih informacij (npr. gesel ali številk kreditnih kartic), ker jih lahko ukradejo napadalci.</translation> <translation id="5860033963881614850">Izklopljeno</translation> <translation id="5863847714970149516">Stran, ki se bo odprla, vam bo morda poskusila kaj zaračunati</translation> -<translation id="5865951947699094510">Lahko na daljavo spremeni nastavitev računa.</translation> <translation id="5866257070973731571">Dodajanje telefonske številke</translation> <translation id="5869405914158311789">Tega spletnega mesta ni mogoče doseči</translation> <translation id="5869522115854928033">Shranjena gesla</translation> @@ -1060,6 +1058,7 @@ <translation id="6778737459546443941">Starši še niso odobrili</translation> <translation id="67862343314499040">Vijoličnomodra</translation> <translation id="6786747875388722282">Razširitve</translation> +<translation id="6790428901817661496">Predvajanje</translation> <translation id="679355240208270552">Prezrto, ker pravilnik ne omogoča privzetega iskanja.</translation> <translation id="681021252041861472">Obvezno polje</translation> <translation id="6810899417690483278">ID za prilagajanje</translation> @@ -1104,6 +1103,7 @@ <translation id="7053983685419859001">Blokiraj</translation> <translation id="7062635574500127092">Zelenomodra</translation> <translation id="7064851114919012435">Podatki o stiku</translation> +<translation id="7075452647191940183">Zahteva je prevelika</translation> <translation id="7079718277001814089">To spletno mesto vsebuje zlonamerno programsko opremo</translation> <translation id="7087282848513945231">Okrožje</translation> <translation id="7090678807593890770">Iščite v Googlu s poizvedbo <ph name="LINK" /></translation> @@ -1163,6 +1163,7 @@ <translation id="7353601530677266744">Ukazna vrstica</translation> <translation id="7372973238305370288">rezultat iskanja</translation> <translation id="7377249249140280793"><ph name="RELATIVE_DATE" /> – <ph name="FULL_DATE" /></translation> +<translation id="7378594059915113390">Kontrolniki predstavnosti</translation> <translation id="7378627244592794276">Ne</translation> <translation id="7378810950367401542">/</translation> <translation id="7390545607259442187">Potrditev kartice</translation> @@ -1266,7 +1267,6 @@ <translation id="780301667611848630">Ne, hvala</translation> <translation id="7805768142964895445">Stanje</translation> <translation id="7806344367022510803">Spremenite nastavitve iskalnika v Chromu</translation> -<translation id="7810209002420871817">Kot skrbnik računa <ph name="ACCOUNT_DOMAIN" />:</translation> <translation id="7812922009395017822">Mir</translation> <translation id="7813600968533626083">Želite odstraniti predlog obrazca iz Chroma?</translation> <translation id="7815407501681723534">Za »<ph name="SEARCH_STRING" />« je bilo najdenih toliko <ph name="SEARCH_RESULTS" />: <ph name="NUMBER_OF_RESULTS" />.</translation>
diff --git a/components/strings/components_strings_sr.xtb b/components/strings/components_strings_sr.xtb index 595fc03..acde7cd 100644 --- a/components/strings/components_strings_sr.xtb +++ b/components/strings/components_strings_sr.xtb
@@ -1,7 +1,6 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="sr"> -<translation id="1001338328714563407">Као менаџер вашег уређаја и налога, <ph name="ENROLLMENT_DOMAIN" />:</translation> <translation id="1008557486741366299">Не сада</translation> <translation id="1010200102790553230">Касније учитај страницу</translation> <translation id="1015730422737071372">Наведите додатне детаље</translation> @@ -41,6 +40,7 @@ <translation id="1161325031994447685">поново да се повежете са Wi-Fi мрежом</translation> <translation id="1165039591588034296">Грешка</translation> <translation id="1175364870820465910">&Одштампај...</translation> +<translation id="1178581264944972037">Паузирај</translation> <translation id="1181037720776840403">Уклони</translation> <translation id="1197088940767939838">Наранџаста</translation> <translation id="1201402288615127009">Даље</translation> @@ -100,7 +100,6 @@ <translation id="1405567553485452995">Светлозелена</translation> <translation id="1407135791313364759">Отвори све</translation> <translation id="1413809658975081374">Грешка у вези са приватношћу</translation> -<translation id="14171126816530869">Идентитет организације <ph name="ORGANIZATION" /> на локалитету <ph name="LOCALITY" /> је верификовао издавач <ph name="ISSUER" />.</translation> <translation id="1426410128494586442">Да</translation> <translation id="1430915738399379752">Штампај</translation> <translation id="1455413310270022028">Брисач</translation> @@ -256,6 +255,7 @@ <translation id="2262243747453050782">HTTP грешка</translation> <translation id="2263079731045660823">Ажурирајте информације о кредитним картицама за аутоматско попуњавање у подешавањима Chrome-а</translation> <translation id="2270484714375784793">Број телефона</translation> +<translation id="2277103315734023688">Премотај унапред</translation> <translation id="2283340219607151381">Чувај и уноси адресе</translation> <translation id="2292556288342944218">Приступ интернету је блокиран</translation> <translation id="2297722699537546652">B5 (коверат)</translation> @@ -383,7 +383,6 @@ <translation id="295526156371527179">Упозорење: Ове смернице нису обједињене као речник како је наведено у смерницама јер нису речник.</translation> <translation id="2955913368246107853">Затворите траку за проналажење</translation> <translation id="2969319727213777354">Да бисте успоставили безбедну везу, сат на уређају мора да буде тачан. То је зато што сертификати које веб-сајтови користе за идентификацију важе само за одређене временске периоде. Пошто сат на вашем уређају није тачан, Google Chrome не може да верификује те сертификате.</translation> -<translation id="2970515157925768593">Може даљински да промени подешавање уређаја и налога.</translation> <translation id="2972581237482394796">&Понови радњу</translation> <translation id="2977665033722899841"><ph name="ROW_NAME" />, тренутно изабрано. <ph name="ROW_CONTENT" /></translation> <translation id="2982481275546140226">Обриши податке</translation> @@ -395,7 +394,6 @@ <translation id="3005723025932146533">Прикажи сачувану копију</translation> <translation id="3008447029300691911">Унесите CVC за картицу <ph name="CREDIT_CARD" />. Када будете потврдили, подаци о картици ће бити послати овом сајту.</translation> <translation id="3010559122411665027">Унос на листи „<ph name="ENTRY_INDEX" />“: <ph name="ERROR" /></translation> -<translation id="3014389611820813634">Као менаџер овог уређаја, <ph name="ENROLLMENT_DOMAIN" />:</translation> <translation id="301521992641321250">Аутоматски је блокирано</translation> <translation id="3023071826883856138">You4 (коверат)</translation> <translation id="3024663005179499861">Погрешан тип смерница</translation> @@ -441,7 +439,6 @@ <translation id="3287510313208355388">Преузми када сам онлајн</translation> <translation id="3293642807462928945">Сазнајте више о смерницама <ph name="POLICY_NAME" /></translation> <translation id="3303855915957856445">Нису пронађени резултати претраге</translation> -<translation id="3311730110465560799">Може даљински да мења подешавање уређаја.</translation> <translation id="3320021301628644560">Додајте адресу за обрачун</translation> <translation id="3324983252691184275">Јаркоцрвена</translation> <translation id="3338095232262050444">Безбедан</translation> @@ -537,7 +534,6 @@ <translation id="3761718714832595332">Сакриј статус</translation> <translation id="3765032636089507299">Радови на страници Безбедно прегледање су у току.</translation> <translation id="3778403066972421603">Да ли желите да сачувате ову картицу на Google налогу и на овом уређају?</translation> -<translation id="3779973883630527594">Компанија, школа или организација која управља овим налогом:</translation> <translation id="3781428340399460090">Јаркорозе</translation> <translation id="3783418713923659662">Mastercard</translation> <translation id="3787705759683870569">Истиче <ph name="EXPIRATION_MONTH" />/<ph name="EXPIRATION_YEAR" /></translation> @@ -561,6 +557,7 @@ <translation id="3949571496842715403">Овај сервер не може да докаже да је <ph name="DOMAIN" />; његов безбедносни сертификат не наводи Алтернативне називе субјекта. Узрок томе је можда погрешна конфигурација или нападач који је прекинуо везу.</translation> <translation id="3949601375789751990">Историја прегледања ће се појавити овде</translation> <translation id="3950820424414687140">Пријави ме</translation> +<translation id="3962859241508114581">Претходна песма</translation> <translation id="3963837677003247395">Желите ли да наставите ручно?</translation> <translation id="3964661563329879394">{COUNT,plural, =0{None}=1{Са 1 сајта }one{Са # сајта }few{Са # сајта }other{Са # сајтова }}</translation> <translation id="397105322502079400">Израчунавање...</translation> @@ -583,6 +580,7 @@ <translation id="410351446219883937">Аутоплеј</translation> <translation id="4103763322291513355">Посетите <strong>chrome://policy</strong> да бисте видели листу URL-ова стављених на црну листу и друге смернице које је наметнуо администратор система.</translation> <translation id="4110652170750985508">Прегледајте уплату</translation> +<translation id="4112140312785995938">Премотај уназад</translation> <translation id="4116663294526079822">Увек дозволи на овом сајту</translation> <translation id="4117700440116928470">Опсег смерница није подржан.</translation> <translation id="4129401438321186435">{COUNT,plural, =1{још 1}one{још #}few{још #}other{још #}}</translation> @@ -661,6 +659,7 @@ <translation id="443673843213245140">Коришћење проксија је онемогућено, али је наведена експлицитна конфигурација проксија.</translation> <translation id="445100540951337728">Дебитне картице које се прихватају</translation> <translation id="4466881336512663640">Промене обрасца се неће сачувати. Желите ли стварно да наставите?</translation> +<translation id="4477350412780666475">Следећа песма</translation> <translation id="4482953324121162758">Овај сајт неће бити преведен.</translation> <translation id="4490717597759821841">A7</translation> <translation id="4493480324863638523">URL је неважећи. URL мора да има стандардну шему, нпр. http://example.com или https://example.com.</translation> @@ -907,7 +906,6 @@ <translation id="5838278095973806738">Немојте да уносите осетљиве информације на овом сајту (на пример, лозинке или кредитне картице) јер нападачи могу да их украду.</translation> <translation id="5860033963881614850">Искључено</translation> <translation id="5863847714970149516">Следећа страница може да покуша да вам нешто наплати</translation> -<translation id="5865951947699094510">Може даљински да мења подешавање налога.</translation> <translation id="5866257070973731571">Додајте број телефона</translation> <translation id="5869405914158311789">Овај сајт није доступан</translation> <translation id="5869522115854928033">Сачуване лозинке</translation> @@ -1059,6 +1057,7 @@ <translation id="6778737459546443941">Родитељ га још увек није одобрио</translation> <translation id="67862343314499040">Љубичаста</translation> <translation id="6786747875388722282">Додаци</translation> +<translation id="6790428901817661496">Пусти</translation> <translation id="679355240208270552">Занемарује се зато што смернице нису омогућиле подразумевани претраживач.</translation> <translation id="681021252041861472">Обавезно поље</translation> <translation id="6810899417690483278">ИД за прилагођавање</translation> @@ -1103,6 +1102,7 @@ <translation id="7053983685419859001">Блокирај</translation> <translation id="7062635574500127092">Тиркизна</translation> <translation id="7064851114919012435">Контакт информације</translation> +<translation id="7075452647191940183">Захтев је превелик</translation> <translation id="7079718277001814089">Овај сајт садржи малвер</translation> <translation id="7087282848513945231">Округ</translation> <translation id="7090678807593890770">Потражите <ph name="LINK" /> на Google-у</translation> @@ -1162,6 +1162,7 @@ <translation id="7353601530677266744">Командна линија</translation> <translation id="7372973238305370288">резултат претраге</translation> <translation id="7377249249140280793"><ph name="RELATIVE_DATE" /> - <ph name="FULL_DATE" /></translation> +<translation id="7378594059915113390">Контроле за медије</translation> <translation id="7378627244592794276">Не</translation> <translation id="7378810950367401542">/</translation> <translation id="7390545607259442187">Потврдите картицу</translation> @@ -1265,7 +1266,6 @@ <translation id="780301667611848630">Не, хвала</translation> <translation id="7805768142964895445">Статус</translation> <translation id="7806344367022510803">Промените подешавања претраживача у Chrome-у</translation> -<translation id="7810209002420871817">Као менаџер вашег налога, <ph name="ACCOUNT_DOMAIN" />:</translation> <translation id="7812922009395017822">Mir</translation> <translation id="7813600968533626083">Желите ли да уклоните предлог из Chrome-а?</translation> <translation id="7815407501681723534">Пронашли смо <ph name="NUMBER_OF_RESULTS" /> <ph name="SEARCH_RESULTS" /> за „<ph name="SEARCH_STRING" />“</translation>
diff --git a/components/strings/components_strings_sv.xtb b/components/strings/components_strings_sv.xtb index b9b111b..67c9b1f 100644 --- a/components/strings/components_strings_sv.xtb +++ b/components/strings/components_strings_sv.xtb
@@ -1,7 +1,6 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="sv"> -<translation id="1001338328714563407">Som ansvarig för enheten och kontot, <ph name="ENROLLMENT_DOMAIN" />:</translation> <translation id="1008557486741366299">Inte nu</translation> <translation id="1010200102790553230">Läs in sidan senare</translation> <translation id="1015730422737071372">Ange ytterligare information</translation> @@ -41,6 +40,7 @@ <translation id="1161325031994447685">återansluta till Wi-Fi</translation> <translation id="1165039591588034296">Fel</translation> <translation id="1175364870820465910">Skriv &ut...</translation> +<translation id="1178581264944972037">Paus</translation> <translation id="1181037720776840403">Ta bort</translation> <translation id="1197088940767939838">Orange</translation> <translation id="1201402288615127009">Nästa</translation> @@ -100,7 +100,6 @@ <translation id="1405567553485452995">Ljusgrön</translation> <translation id="1407135791313364759">Öppna alla</translation> <translation id="1413809658975081374">Sekretessfel</translation> -<translation id="14171126816530869">Identiteten hos <ph name="ORGANIZATION" /> på <ph name="LOCALITY" /> har verifierats av <ph name="ISSUER" />.</translation> <translation id="1426410128494586442">Ja</translation> <translation id="1430915738399379752">Skriv ut</translation> <translation id="1455413310270022028">Suddgummi</translation> @@ -256,6 +255,7 @@ <translation id="2262243747453050782">HTTP-fel</translation> <translation id="2263079731045660823">Uppdatera kreditkortsuppgifter för Autofyll i Chrome-inställningarna</translation> <translation id="2270484714375784793">Telefonnummer</translation> +<translation id="2277103315734023688">Sök framåt</translation> <translation id="2283340219607151381">Spara och fyll i adresser</translation> <translation id="2292556288342944218">Internetanslutningen har blockerats</translation> <translation id="2297722699537546652">B5 (kuvert)</translation> @@ -383,7 +383,6 @@ <translation id="295526156371527179">Varning: Den här principen kombinerades inte som en ordbok enligt principen eftersom den inte är en ordbok.</translation> <translation id="2955913368246107853">Stäng sökfältet</translation> <translation id="2969319727213777354">Om du vill upprätta en säker anslutning måste klockan vara rätt inställd. Det beror på att certifikaten som webbplatserna använder för att identifiera sig har en bestämd giltighetstid. Google Chrome kan inte verifiera certifikaten eftersom klockan på enheten inte går rätt.</translation> -<translation id="2970515157925768593">Kan ändra enhets- och kontokonfigurationen via fjärranslutning.</translation> <translation id="2972581237482394796">&Upprepa</translation> <translation id="2977665033722899841"><ph name="ROW_NAME" /> är markerad just nu. <ph name="ROW_CONTENT" /></translation> <translation id="2982481275546140226">Rensa data</translation> @@ -395,7 +394,6 @@ <translation id="3005723025932146533">Visa sparad kopia</translation> <translation id="3008447029300691911">Ange CVC-koden för <ph name="CREDIT_CARD" />. När du bekräftar delas kortinformationen med den här webbplatsen.</translation> <translation id="3010559122411665027">Listposten <ph name="ENTRY_INDEX" />: <ph name="ERROR" /></translation> -<translation id="3014389611820813634">Som ansvarig för enheten, <ph name="ENROLLMENT_DOMAIN" />:</translation> <translation id="301521992641321250">Blockerades automatiskt</translation> <translation id="3023071826883856138">You4 (kuvert)</translation> <translation id="3024663005179499861">Felaktig policytyp</translation> @@ -441,7 +439,6 @@ <translation id="3287510313208355388">Ladda ned när du är online</translation> <translation id="3293642807462928945">Läs mer om principen <ph name="POLICY_NAME" /></translation> <translation id="3303855915957856445">Inga sökresultat hittades</translation> -<translation id="3311730110465560799">Kan ändra enhetskonfigureringen via fjärranslutning.</translation> <translation id="3320021301628644560">Lägg till faktureringsadress</translation> <translation id="3324983252691184275">Karmosinröd</translation> <translation id="3338095232262050444">Säker</translation> @@ -537,7 +534,6 @@ <translation id="3761718714832595332">Dölj status</translation> <translation id="3765032636089507299">Sidan Säker webbsökning är under utveckling</translation> <translation id="3778403066972421603">Vill du spara det här kortet i Google-kontot och på den här enheten?</translation> -<translation id="3779973883630527594">Företaget, skolan eller organisationen som hanterar kontot:</translation> <translation id="3781428340399460090">Cerise</translation> <translation id="3783418713923659662">Mastercard</translation> <translation id="3787705759683870569">Utgångsdatum: <ph name="EXPIRATION_MONTH" />/<ph name="EXPIRATION_YEAR" /></translation> @@ -561,6 +557,7 @@ <translation id="3949571496842715403">Servern kunde inte bevisa att den är <ph name="DOMAIN" /> eftersom inga alternativa namn på certifikatobjektet anges i säkerhetscertifikatet. Detta kan bero på en felaktig konfigurering eller att en angripare manipulerat anslutningen.</translation> <translation id="3949601375789751990">Webbhistoriken visas här</translation> <translation id="3950820424414687140">Logga in</translation> +<translation id="3962859241508114581">Föregående spår</translation> <translation id="3963837677003247395">Vill du fortsätta på egen hand?</translation> <translation id="3964661563329879394">{COUNT,plural, =0{Ingen}=1{Från 1 webbplats }other{Från # webbplatser }}</translation> <translation id="397105322502079400">Beräknar ...</translation> @@ -583,6 +580,7 @@ <translation id="410351446219883937">Automatisk uppspelning</translation> <translation id="4103763322291513355">Besök <strong>chrome://policy</strong> om du vill visa listan med webbadresser som inte är godkända och andra policyer som angetts av systemadministratören.</translation> <translation id="4110652170750985508">Granska betalningen</translation> +<translation id="4112140312785995938">Sök bakåt</translation> <translation id="4116663294526079822">Tillåt alltid på den här webbplatsen</translation> <translation id="4117700440116928470">Principens omfattning stöds inte.</translation> <translation id="4129401438321186435">{COUNT,plural, =1{1 till}other{# till}}</translation> @@ -661,6 +659,7 @@ <translation id="443673843213245140">Användning av proxy är inaktiverad men en explicit proxykonfiguration har angetts.</translation> <translation id="445100540951337728">Godkända betalkort</translation> <translation id="4466881336512663640">Ändringar i formuläret ändras inte. Vill du fortsätta?</translation> +<translation id="4477350412780666475">Nästa spår</translation> <translation id="4482953324121162758">Den här webbplatsen översätts inte.</translation> <translation id="4490717597759821841">A7</translation> <translation id="4493480324863638523">Ogiltig webbadress. Måste vara en webbadress med ett standardprotokoll, t.ex. http://example.com eller https://example.com.</translation> @@ -907,7 +906,6 @@ <translation id="5838278095973806738">Du bör inte ange några känsliga uppgifter på den här webbplatsen (till exempel lösenord eller kreditkortsuppgifter) eftersom hackare kan stjäla dem.</translation> <translation id="5860033963881614850">Av</translation> <translation id="5863847714970149516">Sidan du är på väg till kan försöka debitera dig</translation> -<translation id="5865951947699094510">Kan ändra kontokonfigureringen via fjärranslutning.</translation> <translation id="5866257070973731571">Ange telefonnummer</translation> <translation id="5869405914158311789">Webbplatsen kan inte nås</translation> <translation id="5869522115854928033">Sparade lösenord</translation> @@ -1060,6 +1058,7 @@ <translation id="6778737459546443941">Din förälder har inte godkänt den ännu</translation> <translation id="67862343314499040">Violett</translation> <translation id="6786747875388722282">Tillägg</translation> +<translation id="6790428901817661496">Spela</translation> <translation id="679355240208270552">Ignoreras eftersom standardsökmotorn inte har aktiverats av principen.</translation> <translation id="681021252041861472">Obligatoriskt fält</translation> <translation id="6810899417690483278">Anpassnings-id</translation> @@ -1163,6 +1162,7 @@ <translation id="7353601530677266744">Kommandorad</translation> <translation id="7372973238305370288">sökresultat</translation> <translation id="7377249249140280793"><ph name="RELATIVE_DATE" /> - <ph name="FULL_DATE" /></translation> +<translation id="7378594059915113390">Mediereglage</translation> <translation id="7378627244592794276">Nej</translation> <translation id="7378810950367401542">/</translation> <translation id="7390545607259442187">Bekräfta kort</translation> @@ -1266,7 +1266,6 @@ <translation id="780301667611848630">Nej tack</translation> <translation id="7805768142964895445">Status</translation> <translation id="7806344367022510803">Inställningar för att ändra sökmotor i Chrome</translation> -<translation id="7810209002420871817">Som ansvarig för kontot, <ph name="ACCOUNT_DOMAIN" />:</translation> <translation id="7812922009395017822">Mir</translation> <translation id="7813600968533626083">Vill du ta bort formulärförslaget från Chrome?</translation> <translation id="7815407501681723534">Hittade <ph name="NUMBER_OF_RESULTS" /> <ph name="SEARCH_RESULTS" /> för <ph name="SEARCH_STRING" /></translation>
diff --git a/components/strings/components_strings_sw.xtb b/components/strings/components_strings_sw.xtb index 369a0d6..1f9d803 100644 --- a/components/strings/components_strings_sw.xtb +++ b/components/strings/components_strings_sw.xtb
@@ -1,7 +1,6 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="sw"> -<translation id="1001338328714563407">Ukiwa msimamizi wa kifaa na akaunti yako, <ph name="ENROLLMENT_DOMAIN" />:</translation> <translation id="1008557486741366299">Sio Sasa</translation> <translation id="1010200102790553230">Pakia ukurasa baadaye</translation> <translation id="1015730422737071372">Toa maelezo ya ziada</translation> @@ -41,6 +40,7 @@ <translation id="1161325031994447685">Kuunganisha tena kwenye Wi-Fi</translation> <translation id="1165039591588034296">Hitilafu</translation> <translation id="1175364870820465910">&Chapisha...</translation> +<translation id="1178581264944972037">Sitisha</translation> <translation id="1181037720776840403">Ondoa</translation> <translation id="1197088940767939838">Rangi ya machungwa</translation> <translation id="1201402288615127009">Endelea</translation> @@ -100,7 +100,6 @@ <translation id="1405567553485452995">Kijani Isiyokolea</translation> <translation id="1407135791313364759">Fungua zote</translation> <translation id="1413809658975081374">Hitilafu ya faragha</translation> -<translation id="14171126816530869">Utambulisho wa <ph name="ORGANIZATION" /> iliyo <ph name="LOCALITY" /> umethibitishwa na <ph name="ISSUER" />.</translation> <translation id="1426410128494586442">Ndio</translation> <translation id="1430915738399379752">Chapisha</translation> <translation id="1455413310270022028">Kifutio</translation> @@ -256,6 +255,7 @@ <translation id="2262243747453050782">Hitilfau ya HTTP</translation> <translation id="2263079731045660823">Sasisha maelezo ya kujaza kiotomatiki kadi za mikopo katika mipangilio ya Chrome</translation> <translation id="2270484714375784793">Nambari ya simu</translation> +<translation id="2277103315734023688">Sogeza Mbele</translation> <translation id="2283340219607151381">Hifadhi na ujaze anwani</translation> <translation id="2292556288342944218">Ufikiaji wako wa intaneti umezuiwa</translation> <translation id="2297722699537546652">B5 (Bahasha)</translation> @@ -383,7 +383,6 @@ <translation id="295526156371527179">Onyo: Sera hii haikuunganishwa kama kamusi jinsi ilivyobainishwa katika sera kwa sababu si kamusi.</translation> <translation id="2955913368246107853">Funga upau wa kupata</translation> <translation id="2969319727213777354">Ili kutambua muunganisho salama, saa yako inahitaji kusahihishwa. Hii ni kwa sababu vyeti ambavyo tovuti hutumia kujitambua ni sahihi kwa vipindi mahususi pekee. Kwa kuwa saa ya kifaa chako si sahihi, Google Chrome haiwezi kuthibitisha vyeti hivi.</translation> -<translation id="2970515157925768593">Inaweza kubadilisha mipangilio ya akaunti na kifaa chako kwa mbali.</translation> <translation id="2972581237482394796">&Rudia</translation> <translation id="2977665033722899841">Umechagua <ph name="ROW_NAME" /> wakati huu. <ph name="ROW_CONTENT" /></translation> <translation id="2982481275546140226">Futa Data</translation> @@ -395,7 +394,6 @@ <translation id="3005723025932146533">Onyesha nakala iliyohifadhiwa</translation> <translation id="3008447029300691911">Weka CVC ya <ph name="CREDIT_CARD" />. Baada ya kuthibitisha, maelezo ya kadi yako yatashirikiwa na tovuti hii.</translation> <translation id="3010559122411665027">Ingizo orodha "<ph name="ENTRY_INDEX" />": <ph name="ERROR" /></translation> -<translation id="3014389611820813634">Ukiwa msimamizi wa kifaa hiki, <ph name="ENROLLMENT_DOMAIN" />:</translation> <translation id="301521992641321250">Imezuiwa kiotomatiki</translation> <translation id="3023071826883856138">You4 (Bahasha)</translation> <translation id="3024663005179499861">Aina mbaya ya sera</translation> @@ -441,7 +439,6 @@ <translation id="3287510313208355388">Pakua ukiwa mtandaoni</translation> <translation id="3293642807462928945">Pata maelezo zaidi kuhusu sera ya <ph name="POLICY_NAME" /></translation> <translation id="3303855915957856445">Hakuna matokeo ya utafutaji yaliyopatikana</translation> -<translation id="3311730110465560799">Inaweza kubadilisha mipangilio ya kifaa chako kutoka mbali.</translation> <translation id="3320021301628644560">Ongeza anwani ya kutuma bili</translation> <translation id="3324983252691184275">Nyekundu Iliyoiva</translation> <translation id="3338095232262050444">Salama</translation> @@ -537,7 +534,6 @@ <translation id="3761718714832595332">Ficha hali</translation> <translation id="3765032636089507299">Ukurasa wa Kuvinjari Salama unaboreshwa.</translation> <translation id="3778403066972421603">Je, ungependa kuhifadhi kadi hii kwenye Akaunti yako ya Google na kwenye kifaa hiki?</translation> -<translation id="3779973883630527594">Kampuni, shule au shirika ambalo linadhibiti akaunti hii:</translation> <translation id="3781428340399460090">Waridi Inayong'aa</translation> <translation id="3783418713923659662">Mastercard</translation> <translation id="3787705759683870569">Muda wa matumizi utakwisha <ph name="EXPIRATION_MONTH" />/<ph name="EXPIRATION_YEAR" /></translation> @@ -561,6 +557,7 @@ <translation id="3949571496842715403">Seva hii haikuweza kuthibitisha kuwa ni <ph name="DOMAIN" />; cheti chake cha usalama hakibainishi Majina Mbadala ya Mada. Hii inaweza kusababishwa na uwekaji mipangilio usiofaa au muunganisho wako kukatwa na mvamizi.</translation> <translation id="3949601375789751990">Historia yako ya kuvinjari itaonekana hapa</translation> <translation id="3950820424414687140">Ingia</translation> +<translation id="3962859241508114581">Wimbo Uliotangulia</translation> <translation id="3963837677003247395">Ungependa kuendelea kujaza mwenyewe?</translation> <translation id="3964661563329879394">{COUNT,plural, =0{Hamna}=1{Kutoka kwenye tovuti 1 }other{Kutoka kwenye tovuti # }}</translation> <translation id="397105322502079400">Inakokotoa...</translation> @@ -583,6 +580,7 @@ <translation id="410351446219883937">Kucheza kiotomatiki</translation> <translation id="4103763322291513355">Tembelea <strong>chrome://policy</strong> ili kuona orodha ya URL zilizoondolewa idhini na sera zingine zinazosimamiwa na msimamizi wako wa mfumo.</translation> <translation id="4110652170750985508">Kagua malipo yako</translation> +<translation id="4112140312785995938">Sogeza Nyuma</translation> <translation id="4116663294526079822">Ruhusu mara kwa mara kwenye tovuti hii</translation> <translation id="4117700440116928470">Upeo wa sera hauwezi kutumika.</translation> <translation id="4129401438321186435">{COUNT,plural, =1{Nyingine 1 }other{Nyingine #}}</translation> @@ -661,6 +659,7 @@ <translation id="443673843213245140">Matumizi ya proksi yamelemazwa lakini usanidi wa proksi wazi umebainishwa.</translation> <translation id="445100540951337728">Kadi za malipo zinazokubaliwa</translation> <translation id="4466881336512663640">Haitahifadhi mabadiliko uliyofanya kwenye fomu. Je, una uhakika unataka kuendelea?</translation> +<translation id="4477350412780666475">Wimbo Unaofuata</translation> <translation id="4482953324121162758">Haitatafsiri tovuti hii.</translation> <translation id="4490717597759821841">A7</translation> <translation id="4493480324863638523">URL si sahihi. Lazima iwe URL yenye mfumo wa kawaida, k.m. http://example.com or https://example.com.</translation> @@ -907,7 +906,6 @@ <translation id="5838278095973806738">Hupaswi kuweka maelezo nyeti kwenye tovuti hii (kwa mfano, manenosiri au kadi za mikopo), kwa sababu wavamizi wanaweza kuyaiba.</translation> <translation id="5860033963881614850">Kimezimwa</translation> <translation id="5863847714970149516">Huenda ukurasa unaofuata ukajaribu kukutoza pesa</translation> -<translation id="5865951947699094510">Inaweza kubadilisha mipangilio ya akaunti yako kutoka mbali.</translation> <translation id="5866257070973731571">Ongeza Nambari ya Simu</translation> <translation id="5869405914158311789">Imeshindwa kufungua tovuti hii</translation> <translation id="5869522115854928033">Manenosiri yaliyohifadhiwa</translation> @@ -1060,6 +1058,7 @@ <translation id="6778737459546443941">Mzazi wako bado hajaiidhinisha</translation> <translation id="67862343314499040">Zambarau iliyokolea</translation> <translation id="6786747875388722282">Viendelezi</translation> +<translation id="6790428901817661496">Cheza</translation> <translation id="679355240208270552">Imepuuzwa kwa sababu utafutaji chaguomsingi umezimwa na sera.</translation> <translation id="681021252041861472">Sehemu Hii Sharti Ijazwe</translation> <translation id="6810899417690483278">Kitambulisho cha kubadilisha ili kukufaa</translation> @@ -1104,6 +1103,7 @@ <translation id="7053983685419859001">Zuia</translation> <translation id="7062635574500127092">Samawati ya kijani</translation> <translation id="7064851114919012435">Maelezo ya mawasiliano</translation> +<translation id="7075452647191940183">Ombi ni kubwa mno</translation> <translation id="7079718277001814089">Tovuti hii ina programu hasidi</translation> <translation id="7087282848513945231">Jimbo</translation> <translation id="7090678807593890770">Tafuta <ph name="LINK" /> kwenye Google</translation> @@ -1161,6 +1161,7 @@ <translation id="7353601530677266744">Mbinu ya Amri</translation> <translation id="7372973238305370288">matokeo ya utafutaji</translation> <translation id="7377249249140280793"><ph name="RELATIVE_DATE" /> - <ph name="FULL_DATE" /></translation> +<translation id="7378594059915113390">Vidhibiti vya Maudhui</translation> <translation id="7378627244592794276">La</translation> <translation id="7378810950367401542">/</translation> <translation id="7390545607259442187">Thibitisha Kadi</translation> @@ -1264,7 +1265,6 @@ <translation id="780301667611848630">La, asante</translation> <translation id="7805768142964895445">Hali</translation> <translation id="7806344367022510803">Badilisha mipangilio ya Mtambo wa Kutafuta katika Chrome</translation> -<translation id="7810209002420871817">Ukiwa msimamizi wa akaunti yako, <ph name="ACCOUNT_DOMAIN" />:</translation> <translation id="7812922009395017822">Mir</translation> <translation id="7813600968533626083">Ungependa kuondoa pendekezo la fomu kutoka kwenye Chrome?</translation> <translation id="7815407501681723534">Imepata matokeo <ph name="NUMBER_OF_RESULTS" /> <ph name="SEARCH_RESULTS" /> ya '<ph name="SEARCH_STRING" />'</translation>
diff --git a/components/strings/components_strings_ta.xtb b/components/strings/components_strings_ta.xtb index ae177dc..3278807 100644 --- a/components/strings/components_strings_ta.xtb +++ b/components/strings/components_strings_ta.xtb
@@ -1,7 +1,6 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="ta"> -<translation id="1001338328714563407">உங்கள் சாதனம் மற்றும் கணக்கின் நிர்வாகியாக <ph name="ENROLLMENT_DOMAIN" /> இவற்றைச் செய்யலாம்:</translation> <translation id="1008557486741366299">இப்போது இல்லை </translation> <translation id="1010200102790553230">பக்கத்தைப் பின்னர் ஏற்று</translation> <translation id="1015730422737071372">கூடுதல் விவரங்களை வழங்கவும்</translation> @@ -41,6 +40,7 @@ <translation id="1161325031994447685">வைஃபையுடன் மீண்டும் இணைத்தல்</translation> <translation id="1165039591588034296">பிழை</translation> <translation id="1175364870820465910">&அச்சிடு...</translation> +<translation id="1178581264944972037">இடைநிறுத்து</translation> <translation id="1181037720776840403">அகற்று</translation> <translation id="1197088940767939838">ஆரஞ்சு</translation> <translation id="1201402288615127009">அடுத்து</translation> @@ -100,7 +100,6 @@ <translation id="1405567553485452995">வெளிர் பச்சை</translation> <translation id="1407135791313364759">எல்லாவற்றையும் திற</translation> <translation id="1413809658975081374">தனியுரிமைப் பிழை</translation> -<translation id="14171126816530869"><ph name="LOCALITY" /> இல் <ph name="ORGANIZATION" /> அடையாளம் <ph name="ISSUER" /> ஆல் பரிசோதிக்கப்பட்டது.</translation> <translation id="1426410128494586442">ஆம்</translation> <translation id="1430915738399379752">அச்சிடுக</translation> <translation id="1455413310270022028">எரேஸர்</translation> @@ -254,6 +253,7 @@ <translation id="2262243747453050782">HTTP பிழை</translation> <translation id="2263079731045660823">Chrome அமைப்புகளில் கிரெடிட் கார்டுத் தன்னிரப்பித் தகவலைப் புதுப்பிக்கவும்</translation> <translation id="2270484714375784793">தொலைபேசி எண்</translation> +<translation id="2277103315734023688">முன்செல்</translation> <translation id="2283340219607151381">முகவரிகளைச் சேமித்துத் தானாக நிரப்பு</translation> <translation id="2292556288342944218">உங்கள் இணைய அணுகல் தடுக்கப்பட்டது</translation> <translation id="2297722699537546652">B5 (என்வலப்)</translation> @@ -383,7 +383,6 @@ <translation id="295526156371527179">எச்சரிக்கை: இது டிக்ஷனரி இல்லை என்பதால் கொள்கையில் குறிப்பிட்டபடி ஒன்றிணைக்கப்படவில்லை.</translation> <translation id="2955913368246107853">தேடல் பெட்டியை மூடுக</translation> <translation id="2969319727213777354">பாதுகாப்பான இணைப்பை ஏற்படுத்த, கடிகாரம் சரியாக அமைக்கப்பட வேண்டும். இணையதளங்கள் தங்களைத் தாமே அடையாளப்படுத்தப் பயன்படுத்தப்படும் சான்றிதழ்கள் குறிப்பிட்ட காலத்திற்கு மட்டும் செல்லுபடியாவதால், இது செய்யப்பட வேண்டும். உங்கள் சாதனத்தின் கடிகாரம் தவறாக இருப்பதால், இந்தச் சான்றிதழ்களை Google Chrome ஆல் சரிபார்க்க முடியவில்லை.</translation> -<translation id="2970515157925768593">சாதன அமைவையும் கணக்கு அமைவையும் தொலைநிலையிலிருந்து மாற்ற முடியும்.</translation> <translation id="2972581237482394796">&மீண்டும் செய்</translation> <translation id="2977665033722899841"><ph name="ROW_NAME" />, தற்போது தேர்ந்தெடுக்கப்பட்டது. <ph name="ROW_CONTENT" /></translation> <translation id="2982481275546140226">தரவை அழி</translation> @@ -395,7 +394,6 @@ <translation id="3005723025932146533">சேமித்த நகலைக் காட்டு</translation> <translation id="3008447029300691911"><ph name="CREDIT_CARD" /> இன் CVC எண்ணை உள்ளிடவும். உறுதிசெய்த பின்னர், உங்கள் கார்டு விவரங்கள் இந்தத் தளத்திற்குப் பகிரப்படும்.</translation> <translation id="3010559122411665027">பட்டியல் உள்ளீடு "<ph name="ENTRY_INDEX" />": <ph name="ERROR" /></translation> -<translation id="3014389611820813634">இந்தச் சாதனத்தின் நிர்வாகியாக <ph name="ENROLLMENT_DOMAIN" /> இவற்றைச் செய்யலாம்:</translation> <translation id="301521992641321250">தானாகத் தடுக்கப்பட்டது</translation> <translation id="3023071826883856138">You4 (என்வலப்)</translation> <translation id="3024663005179499861">தவறான கொள்கை வகை</translation> @@ -438,7 +436,6 @@ <translation id="3287510313208355388">ஆன்லைனில் இருக்கும் போது பதிவிறக்கு</translation> <translation id="3293642807462928945"><ph name="POLICY_NAME" /> கொள்கை குறித்து மேலும் அறிக</translation> <translation id="3303855915957856445">தேடல் முடிவுகள் எதுவுமில்லை</translation> -<translation id="3311730110465560799">சாதன அமைவைத் தொலைநிலையிலிருந்து மாற்ற முடியும்.</translation> <translation id="3320021301628644560">பில்லிங் முகவரியைச் சேர்க்கவும்</translation> <translation id="3324983252691184275">அடர்சிவப்பு</translation> <translation id="3338095232262050444">பாதுகாப்பானது</translation> @@ -533,7 +530,6 @@ <translation id="3761718714832595332">நிலையை மறை</translation> <translation id="3765032636089507299">பாதுகாப்பு உலாவல் பக்கம் உருவாக்கப்படுகிறது.</translation> <translation id="3778403066972421603">கார்டை உங்கள் Google கணக்கிலும் இந்தச் சாதனத்திலும் சேமிக்க விரும்புகிறீர்களா?</translation> -<translation id="3779973883630527594">இந்தக் கணக்கை நிர்வகிக்கும் நிறுவனம், பள்ளி அல்லது பிற அமைப்புகள்:</translation> <translation id="3781428340399460090">ஹாட் பிங்க்</translation> <translation id="3783418713923659662">Mastercard</translation> <translation id="3787705759683870569">காலாவதி: <ph name="EXPIRATION_MONTH" />/<ph name="EXPIRATION_YEAR" /></translation> @@ -557,6 +553,7 @@ <translation id="3949571496842715403">இது <ph name="DOMAIN" /> தான் என்பதை, இந்தச் சேவையகத்தால் உறுதிப்படுத்த முடியவில்லை; பொருள் மாற்றுப் பெயர்களை அதன் பாதுகாப்புச் சான்றிதழ் குறிப்பிடவில்லை. இது தவறான உள்ளமைவினால் ஏற்பட்டிருக்கலாம் அல்லது தீங்கிழைப்பவர் உங்கள் இணைப்பில் குறுக்கிட்டிருக்கலாம்.</translation> <translation id="3949601375789751990">உலாவல் வரலாறு இங்கே தோன்றும்</translation> <translation id="3950820424414687140">உள்நுழைக</translation> +<translation id="3962859241508114581">முந்தைய டிராக்</translation> <translation id="3963837677003247395">நீங்களே செய்கிறீர்களா?</translation> <translation id="3964661563329879394">{COUNT,plural, =0{ஏதுமில்லை}=1{1 தளத்திலிருந்து }other{# தளங்களிலிருந்து }}</translation> <translation id="397105322502079400">கணக்கிடுகிறது...</translation> @@ -579,6 +576,7 @@ <translation id="410351446219883937">தானியங்கி</translation> <translation id="4103763322291513355">ஏற்கத்தகாத URLகளின் பட்டியலையும் உங்கள் கணினி நிர்வாகியால் செயற்படுத்தப்படும் பிற கொள்கைகளையும் காண <strong>chrome://policy</strong> ஐப் பார்வையிடவும்.</translation> <translation id="4110652170750985508">உங்கள் கட்டணத்தை மதிப்பாய்வு செய்யவும்</translation> +<translation id="4112140312785995938">பின்செல்</translation> <translation id="4116663294526079822">இந்தத் தளத்தில் எப்போதும் அனுமதி</translation> <translation id="4117700440116928470">கொள்கையின் நோக்கம் ஆதரிக்கப்படவில்லை.</translation> <translation id="4129401438321186435">{COUNT,plural, =1{மேலும் ஒன்று}other{மேலும் #}}</translation> @@ -656,6 +654,7 @@ <translation id="443673843213245140">ப்ராக்ஸி பயன்பாடு முடக்கப்பட்டுள்ளது. ஆனால் வெளிப்படையான ப்ராக்ஸி உள்ளமைவு குறிப்பிடப்பட்டுள்ளது.</translation> <translation id="445100540951337728">ஏற்கப்படும் டெபிட் கார்டுகள்</translation> <translation id="4466881336512663640">படிவத்தில் செய்த மாற்றங்கள் சேமிக்கப்படாது. நிச்சயமாகத் தொடர விரும்புகிறீர்களா?</translation> +<translation id="4477350412780666475">அடுத்த டிராக்</translation> <translation id="4482953324121162758">இந்தத் தளம் மொழிபெயர்க்கப்படாது.</translation> <translation id="4490717597759821841">A7</translation> <translation id="4493480324863638523">தவறான URL. URL ஒரு நிலையான வகையில் இருக்க வேண்டும், எ.கா http://example.com or https://example.com.</translation> @@ -902,7 +901,6 @@ <translation id="5838278095973806738">தீங்கிழைப்பவர்கள் திருடிவிடலாம் என்பதால், இந்தத் தளத்தில் முக்கியத் தகவலை (எடுத்துக்காட்டு: கடவுச்சொற்கள் அல்லது கிரெடிட் கார்டுகள்) உள்ளிட வேண்டாம்.</translation> <translation id="5860033963881614850">ஆஃப்</translation> <translation id="5863847714970149516">அடுத்த பக்கத்தில் உங்களிடமிருந்து கட்டணம் வசூலிக்கப்படலாம்</translation> -<translation id="5865951947699094510">உங்கள் கணக்கின் அமைவைத் தொலைநிலையிலிருந்து மாற்ற முடியும்.</translation> <translation id="5866257070973731571">மொபைல் எண்ணைச் சேர்க்கவும்</translation> <translation id="5869405914158311789">இந்தத் தளத்தை அணுக முடியவில்லை</translation> <translation id="5869522115854928033">சேமிக்கப்பட்ட கடவுச்சொற்கள்</translation> @@ -1053,6 +1051,7 @@ <translation id="6778737459546443941">இன்னும் உங்கள் பெற்றோர் அனுமதிக்கவில்லை</translation> <translation id="67862343314499040">ஊதா</translation> <translation id="6786747875388722282">நீட்டிப்புகள்</translation> +<translation id="6790428901817661496">இயக்கு</translation> <translation id="679355240208270552">கொள்கையின்படி இயல்புநிலைத் தேடல் முடக்கப்பட்டுள்ளதால் புறக்கணிக்கப்பட்டது.</translation> <translation id="681021252041861472">அவசியமானவை</translation> <translation id="6810899417690483278">தனிப்பயனாக்கல் ஐடி</translation> @@ -1155,6 +1154,7 @@ <translation id="7353601530677266744">கட்டளை வரி</translation> <translation id="7372973238305370288">தேடல் முடிவு</translation> <translation id="7377249249140280793"><ph name="RELATIVE_DATE" /> - <ph name="FULL_DATE" /></translation> +<translation id="7378594059915113390">மீடியா கட்டுப்பாடுகள்</translation> <translation id="7378627244592794276">வேண்டாம்</translation> <translation id="7378810950367401542">/</translation> <translation id="7390545607259442187">கார்டை உறுதிசெய்</translation> @@ -1258,7 +1258,6 @@ <translation id="780301667611848630">தேவையில்லை</translation> <translation id="7805768142964895445">நிலை</translation> <translation id="7806344367022510803">Chromeமில் தேடல் இன்ஜின் அமைப்புகளை மாற்றவும்</translation> -<translation id="7810209002420871817">உங்கள் கணக்கின் நிர்வாகியாக <ph name="ACCOUNT_DOMAIN" /> இவற்றைச் செய்யலாம்:</translation> <translation id="7812922009395017822">Mir</translation> <translation id="7813600968533626083">Chrome இலிருந்து படிவப் பரிந்துரையை அகற்றவா?</translation> <translation id="7815407501681723534">'<ph name="SEARCH_STRING" />'க்கு <ph name="NUMBER_OF_RESULTS" /> <ph name="SEARCH_RESULTS" /> உள்ளன</translation>
diff --git a/components/strings/components_strings_te.xtb b/components/strings/components_strings_te.xtb index c42f2f0..3e9108b 100644 --- a/components/strings/components_strings_te.xtb +++ b/components/strings/components_strings_te.xtb
@@ -1,7 +1,6 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="te"> -<translation id="1001338328714563407">మీ పరికరం మరియు ఖాతా మేనేజర్గా, <ph name="ENROLLMENT_DOMAIN" />:</translation> <translation id="1008557486741366299">ఇప్పుడు కాదు</translation> <translation id="1010200102790553230">పేజీని తర్వాత లోడ్ చేయి</translation> <translation id="1015730422737071372">అదనపు వివరాలను అందించండి</translation> @@ -41,6 +40,7 @@ <translation id="1161325031994447685">Wi-Fiకి మళ్లీ కనెక్ట్ చేయడం</translation> <translation id="1165039591588034296">ఎర్రర్</translation> <translation id="1175364870820465910">&ముద్రించు...</translation> +<translation id="1178581264944972037">పాజ్ చేయి</translation> <translation id="1181037720776840403">తీసివేయి</translation> <translation id="1197088940767939838">నారింజ రంగు</translation> <translation id="1201402288615127009">తరువాత</translation> @@ -100,7 +100,6 @@ <translation id="1405567553485452995">లేత ఆకుపచ్చ రంగు</translation> <translation id="1407135791313364759">అన్నీ తెరువు</translation> <translation id="1413809658975081374">గోప్యతా ఎర్రర్</translation> -<translation id="14171126816530869"><ph name="LOCALITY" /> వద్ద <ph name="ORGANIZATION" /> యొక్క గుర్తింపు <ph name="ISSUER" />చే ధ్రువీకరించబడింది.</translation> <translation id="1426410128494586442">అవును</translation> <translation id="1430915738399379752">ముద్రించు</translation> <translation id="1455413310270022028">ఎరేజర్</translation> @@ -253,6 +252,7 @@ <translation id="2262243747453050782">HTTP ఎర్రర్</translation> <translation id="2263079731045660823">Chrome సెట్టింగ్లలో క్రెడిట్ కార్డ్ స్వీయ పూరింపు సమాచారాన్ని అప్డేట్ చేయండి</translation> <translation id="2270484714375784793">ఫోన్ నంబర్</translation> +<translation id="2277103315734023688">ముందుకు జరుపు</translation> <translation id="2283340219607151381">చిరునామాలను సేవ్ చేసి, పూరించండి</translation> <translation id="2292556288342944218">మీ ఇంటర్నెట్ యాక్సెస్ బ్లాక్ చేయబడింది</translation> <translation id="2297722699537546652">B5 (ఎన్వలప్)</translation> @@ -377,7 +377,6 @@ <translation id="295526156371527179">హెచ్చరిక: ఈ విధానం ఒక నిఘంటువు కానందున, విధానంలో పేర్కొన్నట్లు నిఘంటువు లాగా విలీనం చేయబడలేదు.</translation> <translation id="2955913368246107853">కనుగొను పట్టీని మూసివేయి</translation> <translation id="2969319727213777354">సురక్షిత కనెక్షన్ను ఏర్పాటు చేయడానికి, మీ గడియారాన్ని సరైన సమయానికి సెట్ చేయాలి. ఎందుకంటే వెబ్సైట్లు వాటిని గుర్తించడానికి ఉపయోగించే సర్టిఫికెట్లు నిర్దిష్ట కాలవ్యవధుల్లో మాత్రమే చెల్లుబాటు అవుతాయి. మీ పరికరం గడియారం సమయం తప్పుగా ఉన్నందున, Google Chrome ఈ సర్టిఫికెట్లను ధృవీకరించలేదు.</translation> -<translation id="2970515157925768593">మీ పరికరం మరియు ఖాతా సెటప్ను రిమోట్లో మార్చవచ్చు.</translation> <translation id="2972581237482394796">&పునరావృతం</translation> <translation id="2977665033722899841"><ph name="ROW_NAME" />, ప్రస్తుతం ఎంచుకోబడింది. <ph name="ROW_CONTENT" /></translation> <translation id="2982481275546140226">డేటాను తీసివేయి</translation> @@ -389,7 +388,6 @@ <translation id="3005723025932146533">సేవ్ చేయబడిన కాపీని చూపు</translation> <translation id="3008447029300691911"><ph name="CREDIT_CARD" /> కార్డ్ CVCని నమోదు చేయండి. మీరు నిర్ధారించిన తర్వాత, మీ కార్డ్ వివరాలు ఈ సైట్తో షేర్ చేయబడతాయి.</translation> <translation id="3010559122411665027">జాబితా నమోదు "<ph name="ENTRY_INDEX" />": <ph name="ERROR" /></translation> -<translation id="3014389611820813634">ఈ పరికర మేనేజర్గా, <ph name="ENROLLMENT_DOMAIN" />:</translation> <translation id="301521992641321250">స్వయంచాలకంగా బ్లాక్ చేయబడింది</translation> <translation id="3023071826883856138">You4 (ఎన్వలప్)</translation> <translation id="3024663005179499861">చెల్లని విధాన రకం</translation> @@ -435,7 +433,6 @@ <translation id="3287510313208355388">ఆన్లైన్లో ఉన్నప్పుడు డౌన్లోడ్ చేయి</translation> <translation id="3293642807462928945"><ph name="POLICY_NAME" /> విధానం గురించి మరింత తెలుసుకోండి</translation> <translation id="3303855915957856445">శోధన ఫలితాలు ఏవీ కనుగొనబడలేదు</translation> -<translation id="3311730110465560799">మీ పరికర సెటప్ను రిమోట్లో మార్చవచ్చు.</translation> <translation id="3320021301628644560">బిల్లింగ్ చిరునామాను జోడించండి</translation> <translation id="3324983252691184275">ముదురు ఎరుపు రంగు</translation> <translation id="3338095232262050444">సురక్షితం</translation> @@ -531,7 +528,6 @@ <translation id="3761718714832595332">స్థితిని దాచు</translation> <translation id="3765032636089507299">సురక్షిత బ్రౌజింగ్ పేజీ నిర్మాణంలో ఉంది.</translation> <translation id="3778403066972421603">ఈ కార్డ్ను మీ Google ఖాతాకు మరియు ఈ పరికరంలో సేవ్ చేయాలని అనుకుంటున్నారా?</translation> -<translation id="3779973883630527594">ఈ ఖాతాను నిర్వహిస్తున్న కంపెనీ, పాఠశాల లేదా సంస్థ:</translation> <translation id="3781428340399460090">ముదురు గులాబి రంగు</translation> <translation id="3783418713923659662">Mastercard</translation> <translation id="3787705759683870569">గడువు ముగింపు <ph name="EXPIRATION_MONTH" />/<ph name="EXPIRATION_YEAR" /></translation> @@ -555,6 +551,7 @@ <translation id="3949571496842715403">ఈ సర్వర్ తను <ph name="DOMAIN" /> అని నిరూపించుకోలేకపోయింది; దీని భద్రతా ప్రమాణపత్రంలో విషయ ప్రత్యామ్నాయ పేర్లు పేర్కొనబడలేదు. తప్పుగా కాన్ఫిగర్ చేయడం వలన లేదా హ్యాకర్ మీ కనెక్షన్కు అంతరాయం కలిగించడం వలన ఇలా జరిగి ఉండవచ్చు.</translation> <translation id="3949601375789751990">మీ బ్రౌజింగ్ చరిత్ర ఇక్కడ కనిపిస్తుంది</translation> <translation id="3950820424414687140">సైన్ ఇన్</translation> +<translation id="3962859241508114581">మునుపటి ట్రాక్</translation> <translation id="3963837677003247395">మాన్యువల్గా కొనసాగించాలా?</translation> <translation id="3964661563329879394">{COUNT,plural, =0{ఏవీ కాదు}=1{1 సైట్ నుండి }other{# సైట్ల నుండి }}</translation> <translation id="397105322502079400">గణిస్తోంది...</translation> @@ -577,6 +574,7 @@ <translation id="410351446219883937">స్వీయ ప్లే</translation> <translation id="4103763322291513355">బ్లాక్లిస్ట్లో ఉన్న URLల జాబితాను మరియు మీ సిస్టమ్ నిర్వాహకుని ద్వారా అమలు చేయబడిన ఇతర విధానాలను చూడటానికి <strong>chrome://policy</strong>ని సందర్శించండి.</translation> <translation id="4110652170750985508">మీ చెల్లింపును సమీక్షించండి</translation> +<translation id="4112140312785995938">వెనుకకు జరుపు</translation> <translation id="4116663294526079822">ఈ సైట్లో ఎల్లప్పుడూ అనుమతించు</translation> <translation id="4117700440116928470">విధానం పరిధికి మద్దతు లేదు.</translation> <translation id="4129401438321186435">{COUNT,plural, =1{మరో 1}other{మరో #}}</translation> @@ -655,6 +653,7 @@ <translation id="443673843213245140">ప్రాక్సీని ఉపయోగించడం ఆపివేయబడింది కానీ స్పష్టమైన ప్రాక్సీ కాన్ఫిగరేషన్ పేర్కొనబడింది.</translation> <translation id="445100540951337728">ఆమోదించబడిన డెబిట్ కార్డ్లు</translation> <translation id="4466881336512663640">ఫారమ్లో చేసిన మార్పులను కోల్పోతారు. మీరు ఖచ్చితంగా కొనసాగాలనుకుంటున్నారా?</translation> +<translation id="4477350412780666475">తర్వాతి ట్రాక్</translation> <translation id="4482953324121162758">ఈ సైట్ అనువదించబడదు.</translation> <translation id="4490717597759821841">A7</translation> <translation id="4493480324863638523">చెల్లని URL. URL తప్పనిసరిగా ఒక ప్రామాణిక స్కీమ్ను కలిగి ఉండాలి, ఉదా http://example.com లేదా https://example.com.</translation> @@ -901,7 +900,6 @@ <translation id="5838278095973806738">మీరు ఈ సైట్లో ఎలాంటి గోప్యమైన సమాచారాన్ని నమోదు చేయకూడదు (ఉదాహరణకు, పాస్వర్డ్లు లేదా క్రెడిట్ కార్డ్లు), దాడికి పాల్పడేవారు ఆ సమాచారం దొంగిలించే అవకాశం ఉంటుంది.</translation> <translation id="5860033963881614850">ఆఫ్ అయ్యింది</translation> <translation id="5863847714970149516">మీరు చూడబోతున్న పేజీ మీకు డబ్బు ఛార్జ్ చేయడానికి ప్రయత్నించవచ్చు</translation> -<translation id="5865951947699094510">మీ ఖాతా సెటప్ను రిమోట్ విధానంలో మార్చవచ్చు.</translation> <translation id="5866257070973731571">ఫోన్ నంబర్ను జోడించండి</translation> <translation id="5869405914158311789">ఈ సైట్ను చేరుకోలేకపోయాము</translation> <translation id="5869522115854928033">సేవ్ చేసిన పాస్వర్డ్లు</translation> @@ -1054,6 +1052,7 @@ <translation id="6778737459546443941">మీ తల్లి/తండ్రి దీన్ని ఇంకా ఆమోదించలేదు</translation> <translation id="67862343314499040">నీలి ఊదా రంగు</translation> <translation id="6786747875388722282">ఎక్స్టెన్షన్లు</translation> +<translation id="6790428901817661496">ప్లే చేయి</translation> <translation id="679355240208270552">విధానం ప్రకారం డిఫాల్ట్ శోధన ప్రారంభించబడలేదు కాబట్టి, ఇది విస్మరించబడింది.</translation> <translation id="681021252041861472">అవసరమైన ఫీల్డ్</translation> <translation id="6810899417690483278">అనుకూలీకరణ ID</translation> @@ -1154,6 +1153,7 @@ <translation id="7353601530677266744">ఆదేశ పంక్తి</translation> <translation id="7372973238305370288">శోధన ఫలితం</translation> <translation id="7377249249140280793"><ph name="RELATIVE_DATE" /> - <ph name="FULL_DATE" /></translation> +<translation id="7378594059915113390">మీడియా నియంత్రణలు</translation> <translation id="7378627244592794276">వద్దు</translation> <translation id="7378810950367401542">/</translation> <translation id="7390545607259442187">కార్డ్ని నిర్ధారించండి</translation> @@ -1257,7 +1257,6 @@ <translation id="780301667611848630">వద్దు , ధన్యవాదాలు</translation> <translation id="7805768142964895445">స్థితి</translation> <translation id="7806344367022510803">Chromeలో శోధన ఇంజిన్ సెట్టింగ్లను మార్చండి</translation> -<translation id="7810209002420871817">మీ <ph name="ACCOUNT_DOMAIN" /> ఖాతా మేనేజర్గా, వీటిని చేయవచ్చు:</translation> <translation id="7812922009395017822">Mir</translation> <translation id="7813600968533626083">Chrome నుండి ఫారమ్ సూచనను తీసివేయాలా?</translation> <translation id="7815407501681723534">'<ph name="SEARCH_STRING" />' కోసం <ph name="NUMBER_OF_RESULTS" /> <ph name="SEARCH_RESULTS" /> కనుగొనబడ్డాయి</translation>
diff --git a/components/strings/components_strings_th.xtb b/components/strings/components_strings_th.xtb index 22791021..87ed50b 100644 --- a/components/strings/components_strings_th.xtb +++ b/components/strings/components_strings_th.xtb
@@ -1,7 +1,6 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="th"> -<translation id="1001338328714563407">ในฐานะผู้จัดการอุปกรณ์และบัญชีของคุณ <ph name="ENROLLMENT_DOMAIN" />:</translation> <translation id="1008557486741366299">ไม่ใช่ตอนนี้</translation> <translation id="1010200102790553230">โหลดหน้าภายหลัง</translation> <translation id="1015730422737071372">ให้รายละเอียดเพิ่มเติม</translation> @@ -41,6 +40,7 @@ <translation id="1161325031994447685">เชื่อมต่อ Wi-Fi ใหม่</translation> <translation id="1165039591588034296">ข้อผิดพลาด</translation> <translation id="1175364870820465910">&พิมพ์...</translation> +<translation id="1178581264944972037">หยุดชั่วคราว</translation> <translation id="1181037720776840403">นำออก</translation> <translation id="1197088940767939838">สีส้ม</translation> <translation id="1201402288615127009">ถัดไป</translation> @@ -100,7 +100,6 @@ <translation id="1405567553485452995">เขียวอ่อน</translation> <translation id="1407135791313364759">เปิดทั้งหมด</translation> <translation id="1413809658975081374">ข้อผิดพลาดเกี่ยวกับความเป็นส่วนตัว</translation> -<translation id="14171126816530869">ข้อมูลประจำตัวของ <ph name="ORGANIZATION" /> ใน <ph name="LOCALITY" /> ได้รับการยืนยันโดย <ph name="ISSUER" /></translation> <translation id="1426410128494586442">ยอมรับ</translation> <translation id="1430915738399379752">พิมพ์</translation> <translation id="1455413310270022028">ยางลบ</translation> @@ -256,6 +255,7 @@ <translation id="2262243747453050782">ข้อผิดพลาดของ HTTP</translation> <translation id="2263079731045660823">อัปเดตข้อมูลบัตรเครดิตสำหรับป้อนข้อความอัตโนมัติในการตั้งค่า Chrome</translation> <translation id="2270484714375784793">หมายเลขโทรศัพท์</translation> +<translation id="2277103315734023688">ไปข้างหน้า</translation> <translation id="2283340219607151381">บันทึกและกรอกที่อยู่</translation> <translation id="2292556288342944218">การเข้าถึงอินเทอร์เน็ตของคุณถูกบล็อก</translation> <translation id="2297722699537546652">B5 (ซองจดหมาย)</translation> @@ -383,7 +383,6 @@ <translation id="295526156371527179">คำเตือน: ระบบไม่ได้รวมนโยบายนี้เป็นพจนานุกรมตามที่นโยบายระบุเพราะไม่ใช่พจนานุกรม</translation> <translation id="2955913368246107853">ปิดแถบค้นหา</translation> <translation id="2969319727213777354">หากต้องการสร้างการเชื่อมต่อที่ปลอดภัย คุณต้องตั้งค่านาฬิกาให้ถูกต้องเนื่องจากใบรับรองที่เว็บไซต์ใช้เพื่อระบุตัวตนจะใช้ได้ในช่วงเวลาที่เจาะจงเท่านั้น แต่เนื่องจากนาฬิกาของอุปกรณ์ไม่ถูกต้อง Google Chrome จึงไม่สามารถยืนยันใบรับรองเหล่านี้</translation> -<translation id="2970515157925768593">เปลี่ยนการตั้งค่าอุปกรณ์และบัญชีจากระยะไกลได้</translation> <translation id="2972581237482394796">&ทำซ้ำ</translation> <translation id="2977665033722899841">เลือก <ph name="ROW_NAME" /> อยู่ตอนนี้ <ph name="ROW_CONTENT" /></translation> <translation id="2982481275546140226">ล้างข้อมูล</translation> @@ -395,7 +394,6 @@ <translation id="3005723025932146533">แสดงสำเนาที่บันทึกไว้</translation> <translation id="3008447029300691911">ป้อน CVC สำหรับ <ph name="CREDIT_CARD" /> เมื่อยืนยันแล้ว รายละเอียดบัตรของคุณจะแชร์กับเว็บไซต์นี้</translation> <translation id="3010559122411665027">รายการที่เข้ามา "<ph name="ENTRY_INDEX" />": <ph name="ERROR" /></translation> -<translation id="3014389611820813634">ในฐานะผู้จัดการของอุปกรณ์นี้ <ph name="ENROLLMENT_DOMAIN" />:</translation> <translation id="301521992641321250">ถูกบล็อกโดยอัตโนมัติ</translation> <translation id="3023071826883856138">You4 (ซองจดหมาย)</translation> <translation id="3024663005179499861">ประเภทนโยบายไม่ถูกต้อง</translation> @@ -441,7 +439,6 @@ <translation id="3287510313208355388">ดาวน์โหลดเมื่อออนไลน์</translation> <translation id="3293642807462928945">ดูข้อมูลเพิ่มเติมเกี่ยวกับนโยบาย <ph name="POLICY_NAME" /></translation> <translation id="3303855915957856445">ไม่พบผลการค้นหา</translation> -<translation id="3311730110465560799">เปลี่ยนการตั้งค่าอุปกรณ์จากระยะไกลได้</translation> <translation id="3320021301628644560">เพิ่มที่อยู่สำหรับการเรียกเก็บเงิน</translation> <translation id="3324983252691184275">แดงเข้ม</translation> <translation id="3338095232262050444">ปลอดภัย</translation> @@ -536,7 +533,6 @@ <translation id="3761718714832595332">ซ่อนสถานะ</translation> <translation id="3765032636089507299">หน้า Google Safe Browsing อยู่ในระหว่างการปรับปรุง</translation> <translation id="3778403066972421603">คุณต้องการบันทึกบัตรนี้ลงในบัญชี Google และในอุปกรณ์นี้ไหม</translation> -<translation id="3779973883630527594">บริษัท สถานศึกษา หรือองค์กรที่จัดการบัญชีนี้</translation> <translation id="3781428340399460090">ชมพูเจิดจ้า</translation> <translation id="3783418713923659662">Mastercard</translation> <translation id="3787705759683870569">หมดอายุ <ph name="EXPIRATION_MONTH" />/<ph name="EXPIRATION_YEAR" /></translation> @@ -560,6 +556,7 @@ <translation id="3949571496842715403">เซิร์ฟเวอร์นี้ไม่สามารถพิสูจน์ได้ว่าเป็น <ph name="DOMAIN" /> เพราะใบรับรองความปลอดภัยไม่ได้ระบุชื่อสำรองของหัวเรื่อง โดยอาจเกิดจากการกำหนดค่าผิดหรือผู้โจมตีที่ขัดขวางการเชื่อมต่อของคุณ</translation> <translation id="3949601375789751990">ประวัติการท่องเว็บของคุณจะปรากฏที่นี่</translation> <translation id="3950820424414687140">ลงชื่อเข้าใช้</translation> +<translation id="3962859241508114581">แทร็กก่อนหน้า</translation> <translation id="3963837677003247395">ดำเนินการต่อด้วยตนเองไหม</translation> <translation id="3964661563329879394">{COUNT,plural, =0{ไม่มี}=1{จากเว็บไซต์ 1 แห่ง }other{จากเว็บไซต์ # แห่ง }}</translation> <translation id="397105322502079400">กำลังคำนวณ...</translation> @@ -582,6 +579,7 @@ <translation id="410351446219883937">เล่นอัตโนมัติ</translation> <translation id="4103763322291513355">ไปที่ <strong>chrome://policy</strong> เพื่อดูรายการของ URL ที่ไม่ได้รับอนุญาต และนโยบายอื่นๆ ที่ผู้ดูแลระบบของคุณบังคับใช้</translation> <translation id="4110652170750985508">ตรวจสอบการชำระเงิน</translation> +<translation id="4112140312785995938">ย้อนกลับ</translation> <translation id="4116663294526079822">อนุญาตบนไซต์นี้เสมอ</translation> <translation id="4117700440116928470">ขอบข่ายนโยบายไม่ได้รับการสนับสนุน</translation> <translation id="4129401438321186435">{COUNT,plural, =1{อีก 1 รายการ}other{อีก # รายการ}}</translation> @@ -660,6 +658,7 @@ <translation id="443673843213245140">การใช้พร็อกซีถูกปิดใช้งาน แต่มีการระบุการกำหนดค่าพร็อกซีอย่างชัดเจน</translation> <translation id="445100540951337728">บัตรเดบิตที่ยอมรับ</translation> <translation id="4466881336512663640">การเปลี่ยนแปลงในฟอร์มจะหายไป คุณแน่ใจไหมว่าต้องการดำเนินการต่อ</translation> +<translation id="4477350412780666475">แทร็กถัดไป</translation> <translation id="4482953324121162758">ระบบจะไม่แปลเว็บไซต์นี้</translation> <translation id="4490717597759821841">A7</translation> <translation id="4493480324863638523">URL ไม่ถูกต้อง ต้องเป็น URL ที่มีรูปแบบมาตรฐาน เช่น http://example.com หรือ https://example.com</translation> @@ -906,7 +905,6 @@ <translation id="5838278095973806738">คุณไม่ควรป้อนข้อมูลที่ละเอียดอ่อนบนเว็บไซต์นี้ (ตัวอย่างเช่น รหัสผ่านหรือบัตรเครดิต) เนื่องจากผู้โจมตีอาจขโมยข้อมูลดังกล่าวไปได้</translation> <translation id="5860033963881614850">ปิด</translation> <translation id="5863847714970149516">ระบบอาจพยายามเรียกเก็บเงินจากคุณในหน้าถัดไป</translation> -<translation id="5865951947699094510">เปลี่ยนการตั้งค่าบัญชีจากระยะไกลได้</translation> <translation id="5866257070973731571">เพิ่มหมายเลขโทรศัพท์</translation> <translation id="5869405914158311789">ไม่สามารถเข้าถึงเว็บไซต์นี้</translation> <translation id="5869522115854928033">รหัสผ่านที่บันทึกไว้</translation> @@ -1059,6 +1057,7 @@ <translation id="6778737459546443941">ผู้ปกครองยังไม่ได้อนุมัติเว็บไซต์นี้</translation> <translation id="67862343314499040">ม่วงอมน้ำเงิน</translation> <translation id="6786747875388722282">ส่วนขยาย</translation> +<translation id="6790428901817661496">เล่น</translation> <translation id="679355240208270552">ไม่ใช้งานเนื่องจากมีการเปิดใช้การค้นหาเริ่มต้นตามนโยบาย</translation> <translation id="681021252041861472">ช่องที่ต้องกรอก</translation> <translation id="6810899417690483278">รหัสการปรับแต่ง</translation> @@ -1103,6 +1102,7 @@ <translation id="7053983685419859001">บล็อก</translation> <translation id="7062635574500127092">น้ำเงินอมเขียว</translation> <translation id="7064851114919012435">ข้อมูลติดต่อ</translation> +<translation id="7075452647191940183">คำขอมีขนาดใหญ่เกินไป</translation> <translation id="7079718277001814089">เว็บไซต์นี้มีมัลแวร์</translation> <translation id="7087282848513945231">ประเทศ</translation> <translation id="7090678807593890770">ค้นหา <ph name="LINK" /> จาก Google</translation> @@ -1162,6 +1162,7 @@ <translation id="7353601530677266744">บรรทัดคำสั่ง </translation> <translation id="7372973238305370288">ผลการค้นหา</translation> <translation id="7377249249140280793"><ph name="RELATIVE_DATE" /> - <ph name="FULL_DATE" /></translation> +<translation id="7378594059915113390">การควบคุมสื่อ</translation> <translation id="7378627244592794276">ไม่</translation> <translation id="7378810950367401542">/</translation> <translation id="7390545607259442187">ยืนยันบัตร</translation> @@ -1265,7 +1266,6 @@ <translation id="780301667611848630">ไม่ ขอบคุณ</translation> <translation id="7805768142964895445">สถานะ</translation> <translation id="7806344367022510803">เปลี่ยนการตั้งค่าเครื่องมือค้นหาใน Chrome</translation> -<translation id="7810209002420871817">ในฐานะผู้จัดการบัญชีของคุณ <ph name="ACCOUNT_DOMAIN" />:</translation> <translation id="7812922009395017822">Mir</translation> <translation id="7813600968533626083">นำคำแนะนำสำหรับแบบฟอร์มออกจาก Chrome ไหม</translation> <translation id="7815407501681723534">พบ<ph name="SEARCH_RESULTS" /> <ph name="NUMBER_OF_RESULTS" /> รายการสำหรับ "<ph name="SEARCH_STRING" />"</translation>
diff --git a/components/strings/components_strings_tr.xtb b/components/strings/components_strings_tr.xtb index 46dae03..2afd64f 100644 --- a/components/strings/components_strings_tr.xtb +++ b/components/strings/components_strings_tr.xtb
@@ -1,7 +1,6 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="tr"> -<translation id="1001338328714563407">Cihazınızın ve hesabınızın yöneticisi olarak, <ph name="ENROLLMENT_DOMAIN" />:</translation> <translation id="1008557486741366299">Şimdi Değil</translation> <translation id="1010200102790553230">Sayfayı daha sonra yükle</translation> <translation id="1015730422737071372">Diğer ayrıntıları sağlayın</translation> @@ -41,6 +40,7 @@ <translation id="1161325031994447685">Kablosuz ağa yeniden bağlanma</translation> <translation id="1165039591588034296">Hata</translation> <translation id="1175364870820465910">Ya&zdır...</translation> +<translation id="1178581264944972037">Duraklat</translation> <translation id="1181037720776840403">Kaldır</translation> <translation id="1197088940767939838">Turuncu</translation> <translation id="1201402288615127009">İleri</translation> @@ -100,7 +100,6 @@ <translation id="1405567553485452995">Açık Yeşil</translation> <translation id="1407135791313364759">Tümünü aç</translation> <translation id="1413809658975081374">Gizlilik hatası</translation> -<translation id="14171126816530869"><ph name="LOCALITY" /> konumundaki <ph name="ORGANIZATION" /> kuruluşunun kimliği <ph name="ISSUER" /> tarafından doğrulandı.</translation> <translation id="1426410128494586442">Evet</translation> <translation id="1430915738399379752">Yazdır</translation> <translation id="1455413310270022028">Silgi</translation> @@ -256,6 +255,7 @@ <translation id="2262243747453050782">HTTP hatası</translation> <translation id="2263079731045660823">Kredi kartı otomatik doldurma bilgilerini Chrome ayarlarından güncelleyin</translation> <translation id="2270484714375784793">Telefon numarası</translation> +<translation id="2277103315734023688">İleri Sar</translation> <translation id="2283340219607151381">Adresleri kaydet ve doldur</translation> <translation id="2292556288342944218">İnternet erişiminiz engellendi</translation> <translation id="2297722699537546652">B5 (Zarf)</translation> @@ -383,7 +383,6 @@ <translation id="295526156371527179">Uyarı: Bu politika, bir sözlük olmadığından politika tarafından belirtildiği gibi bir sözlük olarak birleştirilmedi.</translation> <translation id="2955913368246107853">Bulma çubuğunu kapat</translation> <translation id="2969319727213777354">Güvenli bir bağlantı kurmak için saatinizin doğru ayarlanmış olması gerekir. Bunun sebebi, web sitelerinin kendilerini tanımlamak için kullandıkları sertifikaların sadece belli süreler için geçerli olmasıdır. Cihazınızın saati yanlış olduğundan, Google Chrome bu sertifikaları doğrulayamıyor.</translation> -<translation id="2970515157925768593">Cihaz ve hesap kurulumunuzu uzaktan değiştirebilir.</translation> <translation id="2972581237482394796">&Yinele</translation> <translation id="2977665033722899841"><ph name="ROW_NAME" />, şu anda seçili. <ph name="ROW_CONTENT" /></translation> <translation id="2982481275546140226">Verileri Temizle</translation> @@ -395,7 +394,6 @@ <translation id="3005723025932146533">Kaydedilen kopyayı göster</translation> <translation id="3008447029300691911"><ph name="CREDIT_CARD" /> numaralı kartın CVC kodunu girin. Onayladığınızda kart ayrıntılarınız bu siteyle paylaşılacaktır.</translation> <translation id="3010559122411665027">Liste girişi "<ph name="ENTRY_INDEX" />": <ph name="ERROR" /></translation> -<translation id="3014389611820813634">Bu cihazın yöneticisi olarak, <ph name="ENROLLMENT_DOMAIN" />:</translation> <translation id="301521992641321250">Otomatik olarak engellendi</translation> <translation id="3023071826883856138">You4 (Zarf)</translation> <translation id="3024663005179499861">Yanlış politika türü</translation> @@ -441,7 +439,6 @@ <translation id="3287510313208355388">Çevrimiçi olduğunda indir</translation> <translation id="3293642807462928945"><ph name="POLICY_NAME" /> politikası ile ilgili daha fazla bilgi edinin</translation> <translation id="3303855915957856445">Arama sonucu bulunamadı</translation> -<translation id="3311730110465560799">Cihaz kurulumunuzu uzaktan değiştirebilir.</translation> <translation id="3320021301628644560">Fatura adresi ekle</translation> <translation id="3324983252691184275">Kızıl</translation> <translation id="3338095232262050444">Güvenli</translation> @@ -537,7 +534,6 @@ <translation id="3761718714832595332">Durumu gizle</translation> <translation id="3765032636089507299">Güvenli Tarama sayfası yapım aşamasında.</translation> <translation id="3778403066972421603">Bu kartı Google Hesabınıza ve bu cihaza kaydetmek istiyor musunuz?</translation> -<translation id="3779973883630527594">Bu hesabı yöneten şirket, okul veya kuruluş:</translation> <translation id="3781428340399460090">Canlı Pembe</translation> <translation id="3783418713923659662">Mastercard</translation> <translation id="3787705759683870569">Son kullanma tarihi: <ph name="EXPIRATION_MONTH" />/<ph name="EXPIRATION_YEAR" /></translation> @@ -561,6 +557,7 @@ <translation id="3949571496842715403">Bu sunucu <ph name="DOMAIN" /> olduğunu kanıtlayamadı. Güvenlik sertifikasında Konu Diğer Adları belirtilmiyor. Bu durum, bir yanlış yapılandırmadan veya bağlantınıza müdahale eden bir saldırgandan kaynaklanıyor olabilir.</translation> <translation id="3949601375789751990">Göz atma geçmişiniz burada görünür</translation> <translation id="3950820424414687140">Oturum açın</translation> +<translation id="3962859241508114581">Önceki Parça</translation> <translation id="3963837677003247395">Manuel olarak devam edilsin mi?</translation> <translation id="3964661563329879394">{COUNT,plural, =0{Yok}=1{1 siteden }other{# siteden }}</translation> <translation id="397105322502079400">Hesaplanııyor...</translation> @@ -583,6 +580,7 @@ <translation id="410351446219883937">Otomatik oynatma</translation> <translation id="4103763322291513355">Kara listeye alınmış URL'lerin ve sistem yöneticinizin zorunlu tuttuğu diğer politikaların listesini görmek için <strong>chrome://policy</strong> adresini ziyaret edin.</translation> <translation id="4110652170750985508">Ödemenizi inceleyin</translation> +<translation id="4112140312785995938">Geri Sar</translation> <translation id="4116663294526079822">Bu sitede her zaman izin ver</translation> <translation id="4117700440116928470">Politika kapsamı desteklenmiyor.</translation> <translation id="4129401438321186435">{COUNT,plural, =1{1 öğe daha}other{# öğe daha}}</translation> @@ -661,6 +659,7 @@ <translation id="443673843213245140">Proxy kullanımı devre dışı, ancak açık bir proxy yapılandırması belirtildi.</translation> <translation id="445100540951337728">Kabul edilen banka kartları</translation> <translation id="4466881336512663640">Formda yaptığınız değişiklikler kaybolacak. Devam etmek istediğinizden emin misiniz?</translation> +<translation id="4477350412780666475">Sonraki Parça</translation> <translation id="4482953324121162758">Bu site çevrilmeyecek.</translation> <translation id="4490717597759821841">A7</translation> <translation id="4493480324863638523">Geçersiz URL. Standart şemaya sahip bir URL olmalıdır. Ör. http://example.com veya https://example.com.</translation> @@ -907,7 +906,6 @@ <translation id="5838278095973806738">Bu sitede hiçbir hassas bilginizi (örneğin şifrelerinizi veya kredi kartı bilgilerinizi) girmemelisiniz. Aksi takdirde bu bilgiler saldırganlar tarafından çalınabilir.</translation> <translation id="5860033963881614850">Kapalı</translation> <translation id="5863847714970149516">Gireceğiniz sayfa sizden para almaya çalışabilir</translation> -<translation id="5865951947699094510">Hesap kurulumunuzu uzaktan değiştirebilir.</translation> <translation id="5866257070973731571">Telefon Numarası Ekleyin</translation> <translation id="5869405914158311789">Bu siteye ulaşılamıyor</translation> <translation id="5869522115854928033">Kayıtlı şifreler</translation> @@ -1011,7 +1009,7 @@ <translation id="6451458296329894277">Yeniden Form Gönderme İşlemini Onayla</translation> <translation id="6465306955648956876">Şifreleri yönet...</translation> <translation id="647261751007945333">Cihaz politikaları</translation> -<translation id="6476284679642588870">Ödeme yöntemlerini yönet</translation> +<translation id="6476284679642588870">Ödeme yöntemlerini yönetin</translation> <translation id="6477321094435799029">Chrome, bu sayfada olağan dışı kod tespit etti ve kişisel bilgilerinizi (örneğin, şifreler, telefon numaraları ve kredi kartları) korumak için sayfayı engelledi.</translation> <translation id="6489534406876378309">Kilitlenmeleri yüklemeye başla</translation> <translation id="6499038740797743453">Şifre sıfırlansın mı?</translation> @@ -1060,6 +1058,7 @@ <translation id="6778737459546443941">Ebeveyniniz henüz onaylamadı</translation> <translation id="67862343314499040">Mor</translation> <translation id="6786747875388722282">Uzantılar</translation> +<translation id="6790428901817661496">Oynat</translation> <translation id="679355240208270552">Varsayılan arama motoru politika tarafından etkinleştirilmediği için yoksayıldı.</translation> <translation id="681021252041861472">Gerekli Alan</translation> <translation id="6810899417690483278">Özelleştirme Kimliği</translation> @@ -1163,6 +1162,7 @@ <translation id="7353601530677266744">Komut Satırı</translation> <translation id="7372973238305370288">arama sonucu</translation> <translation id="7377249249140280793"><ph name="RELATIVE_DATE" /> - <ph name="FULL_DATE" /></translation> +<translation id="7378594059915113390">Medya Denetimleri</translation> <translation id="7378627244592794276">Hayır</translation> <translation id="7378810950367401542">/</translation> <translation id="7390545607259442187">Kartı Onayla</translation> @@ -1266,7 +1266,6 @@ <translation id="780301667611848630">Hayır, teşekkürler</translation> <translation id="7805768142964895445">Durum</translation> <translation id="7806344367022510803">Chrome'da Arama Motoru ayarlarını değiştirin</translation> -<translation id="7810209002420871817"><ph name="ACCOUNT_DOMAIN" /> hesabınızın yöneticisi olarak:</translation> <translation id="7812922009395017822">Mir</translation> <translation id="7813600968533626083">Form önerisi Chrome'dan kaldırılsın mı?</translation> <translation id="7815407501681723534">"<ph name="SEARCH_STRING" />" için <ph name="NUMBER_OF_RESULTS" /> <ph name="SEARCH_RESULTS" /> bulundu.</translation>
diff --git a/components/strings/components_strings_uk.xtb b/components/strings/components_strings_uk.xtb index 9049155..847bf2c 100644 --- a/components/strings/components_strings_uk.xtb +++ b/components/strings/components_strings_uk.xtb
@@ -1,7 +1,6 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="uk"> -<translation id="1001338328714563407">Як адміністратор пристрою й облікового запису, <ph name="ENROLLMENT_DOMAIN" />:</translation> <translation id="1008557486741366299">Не зараз</translation> <translation id="1010200102790553230">Завантажити сторінку пізніше</translation> <translation id="1015730422737071372">Надати додаткову інформацію</translation> @@ -41,6 +40,7 @@ <translation id="1161325031994447685">знову під’єднати пристрій до мережі Wi-Fi</translation> <translation id="1165039591588034296">Помилка</translation> <translation id="1175364870820465910">&Друк...</translation> +<translation id="1178581264944972037">Пауза</translation> <translation id="1181037720776840403">Видалити</translation> <translation id="1197088940767939838">Оранжевий</translation> <translation id="1201402288615127009">Далі</translation> @@ -100,7 +100,6 @@ <translation id="1405567553485452995">Світло-зелений</translation> <translation id="1407135791313364759">Відкрити все</translation> <translation id="1413809658975081374">Помилка через порушення конфіденційності</translation> -<translation id="14171126816530869">Ідентифікаційну інформацію <ph name="ORGANIZATION" /> із <ph name="LOCALITY" /> було перевірено <ph name="ISSUER" />.</translation> <translation id="1426410128494586442">Так</translation> <translation id="1430915738399379752">Друк</translation> <translation id="1455413310270022028">Гумка</translation> @@ -256,6 +255,7 @@ <translation id="2262243747453050782">Помилка HTTP</translation> <translation id="2263079731045660823">Оновіть дані для автозаповнення кредитної картки в налаштуваннях Chrome</translation> <translation id="2270484714375784793">Номер телефону</translation> +<translation id="2277103315734023688">Перейти вперед</translation> <translation id="2283340219607151381">Зберігати й заповнювати адреси</translation> <translation id="2292556288342944218">Ваш доступ до Інтернету заблоковано</translation> <translation id="2297722699537546652">B5 (конверт)</translation> @@ -383,7 +383,6 @@ <translation id="295526156371527179">Застереження: це правило не об'єднано в словник, як указано в правилі, оскільки це не словник.</translation> <translation id="2955913368246107853">Закрити панель пошуку</translation> <translation id="2969319727213777354">Щоб установити безпечне з’єднання, потрібно правильно налаштувати час, оскільки сертифікати, які підтверджують справжність веб-сайтів, дійсні лише протягом певного періоду. На вашому пристрої неправильно налаштовано час, тому Chrome не може перевірити сертифікати.</translation> -<translation id="2970515157925768593">може віддалено змінювати налаштування пристрою й облікового запису</translation> <translation id="2972581237482394796">&Повторити</translation> <translation id="2977665033722899841">Зараз вибрано: <ph name="ROW_NAME" /> (<ph name="ROW_CONTENT" />)</translation> <translation id="2982481275546140226">Очистити дані</translation> @@ -395,7 +394,6 @@ <translation id="3005723025932146533">Показати збережену копію</translation> <translation id="3008447029300691911">Введіть код CVC картки <ph name="CREDIT_CARD" />. Щойно ви підтвердите дані картки, цей сайт отримає доступ до них.</translation> <translation id="3010559122411665027">Елемент списку "<ph name="ENTRY_INDEX" />": <ph name="ERROR" /></translation> -<translation id="3014389611820813634">Як адміністратор цього пристрою, <ph name="ENROLLMENT_DOMAIN" />:</translation> <translation id="301521992641321250">Блокується автоматично</translation> <translation id="3023071826883856138">You4 (конверт)</translation> <translation id="3024663005179499861">Неправильний тип правила</translation> @@ -441,7 +439,6 @@ <translation id="3287510313208355388">Завантажити після відновлення інтернет-з’єднання</translation> <translation id="3293642807462928945">Докладніше про правило <ph name="POLICY_NAME" /></translation> <translation id="3303855915957856445">Немає результатів</translation> -<translation id="3311730110465560799">може віддалено змінювати налаштування пристрою.</translation> <translation id="3320021301628644560">Додати платіжну адресу</translation> <translation id="3324983252691184275">Малиновий</translation> <translation id="3338095232262050444">Надійне</translation> @@ -537,7 +534,6 @@ <translation id="3761718714832595332">Сховати статус</translation> <translation id="3765032636089507299">Сторінка "Безпечний перегляд" розробляється.</translation> <translation id="3778403066972421603">Зберегти дані картки у вашому обліковому записі Google і на цьому пристрої?</translation> -<translation id="3779973883630527594">Компанія, навчальний заклад або організація, що керує цим обліковим записом:</translation> <translation id="3781428340399460090">Яскраво-рожевий</translation> <translation id="3783418713923659662">Mastercard</translation> <translation id="3787705759683870569">Діє до <ph name="EXPIRATION_MONTH" />/<ph name="EXPIRATION_YEAR" /></translation> @@ -561,6 +557,7 @@ <translation id="3949571496842715403">Цей сервер не зміг довести, що він – домен <ph name="DOMAIN" />. У його сертифікаті безпеки не вказано альтернативні імена. Імовірні причини: неправильна конфігурація або хтось намагається перехопити ваше з’єднання.</translation> <translation id="3949601375789751990">Тут відображається ваша історія веб-перегляду</translation> <translation id="3950820424414687140">Увійти</translation> +<translation id="3962859241508114581">Попередня композиція</translation> <translation id="3963837677003247395">Продовжити вручну?</translation> <translation id="3964661563329879394">{COUNT,plural, =0{Немає}=1{З 1 сайту }one{З # сайту }few{З # сайтів }many{З # сайтів }other{З # сайту }}</translation> <translation id="397105322502079400">Обчислення...</translation> @@ -583,6 +580,7 @@ <translation id="410351446219883937">Автовідтворення</translation> <translation id="4103763322291513355">Перейдіть на сторінку <strong>chrome://policy</strong>, щоб переглянути список URL-адрес із "чорного" списку й інші правила, що примусово застосовується системним адміністратором.</translation> <translation id="4110652170750985508">Переглянути платіж</translation> +<translation id="4112140312785995938">Перейти назад</translation> <translation id="4116663294526079822">Завжди дозволяти на цьому сайті</translation> <translation id="4117700440116928470">Правило не підтримується.</translation> <translation id="4129401438321186435">{COUNT,plural, =1{і ще 1 елемент даних}one{і ще # елемент даних}few{і ще # елементи даних}many{і ще # елементів даних}other{і ще # елемента даних}}</translation> @@ -661,6 +659,7 @@ <translation id="443673843213245140">Використання проксі-сервера вимкнено, але чітко вказано налаштування проксі-сервера.</translation> <translation id="445100540951337728">Прийнятні дебетові картки</translation> <translation id="4466881336512663640">Зміни форми не буде збережено. Продовжити?</translation> +<translation id="4477350412780666475">Наступна композиція</translation> <translation id="4482953324121162758">Цей сайт не перекладатиметься.</translation> <translation id="4490717597759821841">A7</translation> <translation id="4493480324863638523">Недійсна URL-адреса. Потрібно вказати URL-адресу зі стандартною схемою, як-от http://example.com або https://example.com.</translation> @@ -907,7 +906,6 @@ <translation id="5838278095973806738">Не вводьте конфіденційну інформацію на цьому сайті (як-от паролі й дані кредитних карток). Зловмисники можуть викрасти її.</translation> <translation id="5860033963881614850">Вимк.</translation> <translation id="5863847714970149516">Наступна сторінка може спробувати стягнути плату</translation> -<translation id="5865951947699094510">може віддалено змінювати налаштування облікового запису</translation> <translation id="5866257070973731571">Додайте номер телефону</translation> <translation id="5869405914158311789">Немає зв’язку із сайтом</translation> <translation id="5869522115854928033">Збережені паролі</translation> @@ -1060,6 +1058,7 @@ <translation id="6778737459546443941">Батьки ще не схвалили його</translation> <translation id="67862343314499040">Фіолетовий</translation> <translation id="6786747875388722282">Розширення</translation> +<translation id="6790428901817661496">Відтворити</translation> <translation id="679355240208270552">Ігнорується, оскільки пошукову систему за умовчанням вимкнено правилом.</translation> <translation id="681021252041861472">Обов’язкове поле</translation> <translation id="6810899417690483278">Ідентифікатор налаштування</translation> @@ -1163,6 +1162,7 @@ <translation id="7353601530677266744">Командний рядок</translation> <translation id="7372973238305370288">результат пошуку</translation> <translation id="7377249249140280793"><ph name="RELATIVE_DATE" /> - <ph name="FULL_DATE" /></translation> +<translation id="7378594059915113390">Елементи керування медіа</translation> <translation id="7378627244592794276">Ні</translation> <translation id="7378810950367401542">/</translation> <translation id="7390545607259442187">Підтвердити дані картки</translation> @@ -1266,7 +1266,6 @@ <translation id="780301667611848630">Ні, дякую</translation> <translation id="7805768142964895445">Статус</translation> <translation id="7806344367022510803">Змініть налаштування пошукової системи в Chrome</translation> -<translation id="7810209002420871817">Як адміністратор облікового запису, <ph name="ACCOUNT_DOMAIN" />:</translation> <translation id="7812922009395017822">Mir</translation> <translation id="7813600968533626083">Видалити дані для автозаповнення форм із Chrome?</translation> <translation id="7815407501681723534">Знайдено результатів за запитом "<ph name="SEARCH_STRING" />": <ph name="NUMBER_OF_RESULTS" /> <ph name="SEARCH_RESULTS" /></translation>
diff --git a/components/strings/components_strings_vi.xtb b/components/strings/components_strings_vi.xtb index 90da3957..0cf0e29 100644 --- a/components/strings/components_strings_vi.xtb +++ b/components/strings/components_strings_vi.xtb
@@ -1,7 +1,6 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="vi"> -<translation id="1001338328714563407">Với tư cách là người quản lý thiết bị và tài khoản của bạn, <ph name="ENROLLMENT_DOMAIN" />:</translation> <translation id="1008557486741366299">Không phải Bây giờ</translation> <translation id="1010200102790553230">Tải trang vào lúc khác</translation> <translation id="1015730422737071372">Cung cấp chi tiết bổ sung</translation> @@ -41,6 +40,7 @@ <translation id="1161325031994447685">Kết nối lại với Wi-Fi</translation> <translation id="1165039591588034296">Lỗi</translation> <translation id="1175364870820465910">&In...</translation> +<translation id="1178581264944972037">Tạm dừng</translation> <translation id="1181037720776840403">Xóa</translation> <translation id="1197088940767939838">Màu cam</translation> <translation id="1201402288615127009">Tiếp theo</translation> @@ -100,7 +100,6 @@ <translation id="1405567553485452995">Xanh lục nhạt</translation> <translation id="1407135791313364759">Mở tất cả</translation> <translation id="1413809658975081374">Lỗi bảo mật</translation> -<translation id="14171126816530869">Nhận dạng <ph name="ORGANIZATION" /> tại <ph name="LOCALITY" /> đã được xác minh bởi <ph name="ISSUER" />.</translation> <translation id="1426410128494586442">Có</translation> <translation id="1430915738399379752">In</translation> <translation id="1455413310270022028">Tẩy</translation> @@ -256,6 +255,7 @@ <translation id="2262243747453050782">Lỗi HTTP</translation> <translation id="2263079731045660823">Cập nhật thông tin tự động điền thẻ tín dụng trong mục cài đặt của Chrome</translation> <translation id="2270484714375784793">Số điện thoại</translation> +<translation id="2277103315734023688">Tua tiến</translation> <translation id="2283340219607151381">Lưu và điền địa chỉ</translation> <translation id="2292556288342944218">Quyền truy cập Internet của bạn bị chặn</translation> <translation id="2297722699537546652">B5 (Phong bì)</translation> @@ -383,7 +383,6 @@ <translation id="295526156371527179">Cảnh báo: Chính sách này không phải là từ điển nên không được hợp nhất dưới dạng từ điển như chỉ định trong chính sách.</translation> <translation id="2955913368246107853">Đóng thanh tìm</translation> <translation id="2969319727213777354">Để thiết lập kết nối an toàn, bạn cần đặt thời gian đúng cho đồng hồ. Nguyên nhân là do chứng chỉ mà các trang web dùng để tự nhận dạng chỉ có hiệu lực trong khoảng thời gian cụ thể. Vì đồng hồ trên thiết bị của bạn không đúng nên Chrome không thể xác minh các chứng chỉ này.</translation> -<translation id="2970515157925768593">Có thể thay đổi từ xa quá trình thiết lập tài khoản và thiết bị của bạn.</translation> <translation id="2972581237482394796">&Làm lại</translation> <translation id="2977665033722899841"><ph name="ROW_NAME" />, hiện đã chọn. <ph name="ROW_CONTENT" /></translation> <translation id="2982481275546140226">Xóa dữ liệu</translation> @@ -395,7 +394,6 @@ <translation id="3005723025932146533">Hiển thị bản sao đã lưu</translation> <translation id="3008447029300691911">Nhập CVC cho <ph name="CREDIT_CARD" />. Sau khi bạn xác nhận, chi tiết thẻ của bạn sẽ được chia sẻ với trang web này.</translation> <translation id="3010559122411665027">Mục nhập danh sách "<ph name="ENTRY_INDEX" />": <ph name="ERROR" /></translation> -<translation id="3014389611820813634">Với tư cách là người quản lý thiết bị này, <ph name="ENROLLMENT_DOMAIN" />:</translation> <translation id="301521992641321250">Tự động bị chặn</translation> <translation id="3023071826883856138">You4 (Phong bì)</translation> <translation id="3024663005179499861">Loại chính sách sai</translation> @@ -441,7 +439,6 @@ <translation id="3287510313208355388">Tải xuống khi trực tuyến</translation> <translation id="3293642807462928945">Hãy tìm hiểu thêm về chính sách <ph name="POLICY_NAME" /></translation> <translation id="3303855915957856445">Không tìm thấy kết quả tìm kiếm nào</translation> -<translation id="3311730110465560799">Có thể thay đổi từ xa quá trình thiết lập thiết bị.</translation> <translation id="3320021301628644560">Thêm địa chỉ thanh toán</translation> <translation id="3324983252691184275">Đỏ thẫm</translation> <translation id="3338095232262050444">Bảo mật</translation> @@ -537,7 +534,6 @@ <translation id="3761718714832595332">Ẩn trạng thái</translation> <translation id="3765032636089507299">Trang Duyệt web an toàn đang được xây dựng.</translation> <translation id="3778403066972421603">Bạn có muốn lưu thẻ này vào Tài khoản Google của bạn và trên thiết bị này không?</translation> -<translation id="3779973883630527594">Công ty, trường học hoặc tổ chức quản lý tài khoản này:</translation> <translation id="3781428340399460090">Hồng đậm</translation> <translation id="3783418713923659662">Mastercard</translation> <translation id="3787705759683870569">Ngày hết hạn <ph name="EXPIRATION_MONTH" />/<ph name="EXPIRATION_YEAR" /></translation> @@ -561,6 +557,7 @@ <translation id="3949571496842715403">Máy chủ này không thể chứng minh được đó là <ph name="DOMAIN" />; chứng chỉ bảo mật của máy chủ không chỉ định Tên thay thế đối tượng. Điều này có thể do cấu hình sai hoặc có kẻ tấn công chặn kết nối của bạn.</translation> <translation id="3949601375789751990">Lịch sử duyệt web của bạn xuất hiện ở đây</translation> <translation id="3950820424414687140">Đăng nhập</translation> +<translation id="3962859241508114581">Bản nhạc trước</translation> <translation id="3963837677003247395">Bạn muốn tiếp tục theo cách thủ công?</translation> <translation id="3964661563329879394">{COUNT,plural, =0{Không có}=1{Của 1 trang web }other{Của # trang web }}</translation> <translation id="397105322502079400">Đang tính...</translation> @@ -583,6 +580,7 @@ <translation id="410351446219883937">Tự động phát</translation> <translation id="4103763322291513355">Truy cập <strong>chrome://policy</strong> để xem danh sách các URL bị chặn quyền truy cập và các chính sách khác bị quản trị viên hệ thống buộc phải thực thi.</translation> <translation id="4110652170750985508">Xem xét thanh toán của bạn</translation> +<translation id="4112140312785995938">Tua lùi</translation> <translation id="4116663294526079822">Luôn cho phép trên trang web này</translation> <translation id="4117700440116928470">Phạm vi chính sách không được hỗ trợ.</translation> <translation id="4129401438321186435">{COUNT,plural, =1{1 mục khác}other{# mục khác}}</translation> @@ -661,6 +659,7 @@ <translation id="443673843213245140">Đã tắt sử dụng proxy nhưng cấu hình proxy rõ ràng được chỉ định.</translation> <translation id="445100540951337728">Thẻ ghi nợ được chấp nhận</translation> <translation id="4466881336512663640">Các thay đổi đối với biểu mẫu sẽ bị mất. Bạn có chắc chắn muốn tiếp tục không?</translation> +<translation id="4477350412780666475">Bản nhạc tiếp theo</translation> <translation id="4482953324121162758">Trang web này sẽ không được dịch.</translation> <translation id="4490717597759821841">A7</translation> <translation id="4493480324863638523">URL không hợp lệ. Phải là URL chứa tên giao thức chuẩn, chẳng hạn như: http://example.com hoặc https://example.com.</translation> @@ -907,7 +906,6 @@ <translation id="5838278095973806738">Bạn không nên nhập bất kỳ thông tin nhạy cảm nào trên trang web này (ví dụ: mật khẩu hoặc thẻ tín dụng), vì những kẻ tấn công có thể đánh cắp thông tin đó.</translation> <translation id="5860033963881614850">Tắt</translation> <translation id="5863847714970149516">Trang phía trước có thể tìm cách tính phí bạn</translation> -<translation id="5865951947699094510">Có thể thay đổi từ xa quá trình thiết lập tài khoản của bạn.</translation> <translation id="5866257070973731571">Thêm số điện thoại</translation> <translation id="5869405914158311789">Không thể truy cập trang web này</translation> <translation id="5869522115854928033">Mật khẩu đã lưu</translation> @@ -1060,6 +1058,7 @@ <translation id="6778737459546443941">Cha mẹ của bạn chưa phê duyệt trang web</translation> <translation id="67862343314499040">Tím vi-ô-lét</translation> <translation id="6786747875388722282">Tiện ích</translation> +<translation id="6790428901817661496">Phát</translation> <translation id="679355240208270552">Đã bỏ qua vì chính sách đã tắt tìm kiếm mặc định.</translation> <translation id="681021252041861472">Trường bắt buộc</translation> <translation id="6810899417690483278">ID tùy chỉnh</translation> @@ -1163,6 +1162,7 @@ <translation id="7353601530677266744">Dòng Lệnh</translation> <translation id="7372973238305370288">kết quả tìm kiếm</translation> <translation id="7377249249140280793"><ph name="RELATIVE_DATE" /> - <ph name="FULL_DATE" /></translation> +<translation id="7378594059915113390">Các chức năng điều khiển nội dung đa phương tiện</translation> <translation id="7378627244592794276">Không</translation> <translation id="7378810950367401542">/</translation> <translation id="7390545607259442187">Xác nhận thẻ</translation> @@ -1266,7 +1266,6 @@ <translation id="780301667611848630">Không, cảm ơn</translation> <translation id="7805768142964895445">Trạng thái</translation> <translation id="7806344367022510803">Thay đổi tùy chọn cài đặt công cụ tìm kiếm trong Chrome</translation> -<translation id="7810209002420871817">Với tư cách là người quản lý tài khoản của bạn, <ph name="ACCOUNT_DOMAIN" />:</translation> <translation id="7812922009395017822">Mir</translation> <translation id="7813600968533626083">Xóa đề xuất biểu mẫu khỏi Chrome?</translation> <translation id="7815407501681723534">Đã tìm thấy <ph name="NUMBER_OF_RESULTS" /> <ph name="SEARCH_RESULTS" /> cho '<ph name="SEARCH_STRING" />'</translation>
diff --git a/components/strings/components_strings_zh-CN.xtb b/components/strings/components_strings_zh-CN.xtb index dc4ddc5..b3b6e709 100644 --- a/components/strings/components_strings_zh-CN.xtb +++ b/components/strings/components_strings_zh-CN.xtb
@@ -1,7 +1,6 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="zh-CN"> -<translation id="1001338328714563407">作为您的设备和帐号的管理器,<ph name="ENROLLMENT_DOMAIN" />:</translation> <translation id="1008557486741366299">以后再说</translation> <translation id="1010200102790553230">保存网页以供日后加载</translation> <translation id="1015730422737071372">提供其他详细信息</translation> @@ -41,6 +40,7 @@ <translation id="1161325031994447685">重新连接到 Wi-Fi 网络</translation> <translation id="1165039591588034296">错误</translation> <translation id="1175364870820465910">打印(&P)...</translation> +<translation id="1178581264944972037">暂停</translation> <translation id="1181037720776840403">删除</translation> <translation id="1197088940767939838">橙色</translation> <translation id="1201402288615127009">下一步</translation> @@ -98,7 +98,6 @@ <translation id="1405567553485452995">浅绿色</translation> <translation id="1407135791313364759">全部打开</translation> <translation id="1413809658975081374">隐私设置错误</translation> -<translation id="14171126816530869">位于<ph name="LOCALITY" />的<ph name="ORGANIZATION" />的身份已通过了<ph name="ISSUER" />的验证。</translation> <translation id="1426410128494586442">是</translation> <translation id="1430915738399379752">打印</translation> <translation id="1455413310270022028">橡皮擦</translation> @@ -251,6 +250,7 @@ <translation id="2262243747453050782">HTTP 错误</translation> <translation id="2263079731045660823">在 Chrome 设置中更新信用卡自动填充信息</translation> <translation id="2270484714375784793">电话号码</translation> +<translation id="2277103315734023688">快进</translation> <translation id="2283340219607151381">保存并填写地址</translation> <translation id="2292556288342944218">您被禁止访问互联网</translation> <translation id="2297722699537546652">B5 (Envelope)</translation> @@ -375,7 +375,6 @@ <translation id="295526156371527179">警告:系统未按照相关政策中指定的方式对此政策进行字典合并,因为此政策不是字典。</translation> <translation id="2955913368246107853">关闭查找栏</translation> <translation id="2969319727213777354">要建立安全连接,您的时钟设置必须正确。这是因为,网站用于证明身份的证书仅在特定时间段有效。由于您设备的时钟不正确,因此 Google Chrome 无法验证这些证书。</translation> -<translation id="2970515157925768593">可以远程更改您的设备和帐号设置。</translation> <translation id="2972581237482394796">重做(&R)</translation> <translation id="2977665033722899841">目前已选择“<ph name="ROW_NAME" />”。<ph name="ROW_CONTENT" /></translation> <translation id="2982481275546140226">清除数据</translation> @@ -387,7 +386,6 @@ <translation id="3005723025932146533">显示已保存的版本</translation> <translation id="3008447029300691911">输入“<ph name="CREDIT_CARD" />”的银行卡验证码 (CVC)。在您确认后,您的信用卡详情将与此网站共享。</translation> <translation id="3010559122411665027">列表条目“<ph name="ENTRY_INDEX" />”:<ph name="ERROR" /></translation> -<translation id="3014389611820813634">作为此设备的管理器,<ph name="ENROLLMENT_DOMAIN" />:</translation> <translation id="301521992641321250">已被自动禁止</translation> <translation id="3023071826883856138">You4 (Envelope)</translation> <translation id="3024663005179499861">策略类型有误</translation> @@ -431,7 +429,6 @@ <translation id="3287510313208355388">联网时下载</translation> <translation id="3293642807462928945">详细了解“<ph name="POLICY_NAME" />”政策</translation> <translation id="3303855915957856445">未找到任何搜索结果</translation> -<translation id="3311730110465560799">可以远程更改您的设备设置。</translation> <translation id="3320021301628644560">添加账单邮寄地址</translation> <translation id="3324983252691184275">深红色</translation> <translation id="3338095232262050444">安全</translation> @@ -525,7 +522,6 @@ <translation id="3761718714832595332">隐藏状态</translation> <translation id="3765032636089507299">安全浏览页面正在构建中。</translation> <translation id="3778403066972421603">要将此卡的信息保存到您的 Google 帐号中和此设备上吗?</translation> -<translation id="3779973883630527594">管理此帐号的公司、学校或组织:</translation> <translation id="3781428340399460090">艳粉色</translation> <translation id="3783418713923659662">Mastercard</translation> <translation id="3787705759683870569">失效日期:<ph name="EXPIRATION_YEAR" /> 年 <ph name="EXPIRATION_MONTH" /> 月</translation> @@ -549,6 +545,7 @@ <translation id="3949571496842715403">此服务器无法证实它就是 <ph name="DOMAIN" /> - 它的安全证书没有指定主题备用名称。这可能是因为某项配置有误或某个攻击者拦截了您的连接。</translation> <translation id="3949601375789751990">您的浏览记录会显示在此处</translation> <translation id="3950820424414687140">登录</translation> +<translation id="3962859241508114581">上一曲</translation> <translation id="3963837677003247395">以手动方式继续?</translation> <translation id="3964661563329879394">{COUNT,plural, =0{无}=1{来自 1 个网站}other{来自 # 个网站}}</translation> <translation id="397105322502079400">正在计算...</translation> @@ -571,6 +568,7 @@ <translation id="410351446219883937">自动播放</translation> <translation id="4103763322291513355">请访问 <strong>chrome:// 政策</strong>,查看列入黑名单的网址列表以及您的系统管理员强制要求执行的其他政策。</translation> <translation id="4110652170750985508">查看您的付款</translation> +<translation id="4112140312785995938">快退</translation> <translation id="4116663294526079822">在此网站上始终允许</translation> <translation id="4117700440116928470">政策范围不受支持。</translation> <translation id="4129401438321186435">{COUNT,plural, =1{1 项其他内容}other{# 项其他内容}}</translation> @@ -649,6 +647,7 @@ <translation id="443673843213245140">已停用代理,但是指定了明确的代理配置。</translation> <translation id="445100540951337728">接受的借记卡</translation> <translation id="4466881336512663640">对表单所做的更改将会丢失。确定要继续吗?</translation> +<translation id="4477350412780666475">下一曲</translation> <translation id="4482953324121162758">系统不会翻译此网站。</translation> <translation id="4490717597759821841">A7</translation> <translation id="4493480324863638523">网址无效。必须是采用标准架构的网址,例如“http://example.com”或“https://example.com”。</translation> @@ -895,7 +894,6 @@ <translation id="5838278095973806738">请勿在此网站上输入任何敏感信息(例如密码或信用卡信息),因为攻击者可能会盗取这些信息。</translation> <translation id="5860033963881614850">关闭</translation> <translation id="5863847714970149516">即将进入的页面可能会向您收取费用</translation> -<translation id="5865951947699094510">可以远程更改您的帐号设置。</translation> <translation id="5866257070973731571">添加电话号码</translation> <translation id="5869405914158311789">无法访问此网站</translation> <translation id="5869522115854928033">已保存的密码</translation> @@ -1047,6 +1045,7 @@ <translation id="6778737459546443941">您的父亲/母亲尚未批准此网站</translation> <translation id="67862343314499040">紫罗兰色</translation> <translation id="6786747875388722282">扩展程序</translation> +<translation id="6790428901817661496">播放</translation> <translation id="679355240208270552">由于政策未启用默认搜索引擎,因此政策值已被忽略。</translation> <translation id="681021252041861472">必填字段</translation> <translation id="6810899417690483278">自定义 ID</translation> @@ -1147,6 +1146,7 @@ <translation id="7353601530677266744">命令行</translation> <translation id="7372973238305370288">搜索结果</translation> <translation id="7377249249140280793"><ph name="RELATIVE_DATE" /> - <ph name="FULL_DATE" /></translation> +<translation id="7378594059915113390">媒体控件</translation> <translation id="7378627244592794276">否</translation> <translation id="7378810950367401542">/</translation> <translation id="7390545607259442187">确认信用卡</translation> @@ -1250,7 +1250,6 @@ <translation id="780301667611848630">不用了,谢谢</translation> <translation id="7805768142964895445">状态</translation> <translation id="7806344367022510803">在 Chrome 中更改搜索引擎设置</translation> -<translation id="7810209002420871817">作为您帐号的管理员,<ph name="ACCOUNT_DOMAIN" />:</translation> <translation id="7812922009395017822">Mir</translation> <translation id="7813600968533626083">从 Chrome 中移除表单建议?</translation> <translation id="7815407501681723534">找到了 <ph name="NUMBER_OF_RESULTS" /> 个与“<ph name="SEARCH_STRING" />”相符的<ph name="SEARCH_RESULTS" /></translation>
diff --git a/components/strings/components_strings_zh-TW.xtb b/components/strings/components_strings_zh-TW.xtb index 293744b3..3860e607 100644 --- a/components/strings/components_strings_zh-TW.xtb +++ b/components/strings/components_strings_zh-TW.xtb
@@ -1,7 +1,6 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="zh-TW"> -<translation id="1001338328714563407">你的裝置和帳戶管理員 <ph name="ENROLLMENT_DOMAIN" /> 可執行下列操作:</translation> <translation id="1008557486741366299">現在不要</translation> <translation id="1010200102790553230">稍後再載入頁面</translation> <translation id="1015730422737071372">提供其他詳細資訊</translation> @@ -41,6 +40,7 @@ <translation id="1161325031994447685">重新連線至 Wi-Fi 網路</translation> <translation id="1165039591588034296">錯誤</translation> <translation id="1175364870820465910">列印(&P)...</translation> +<translation id="1178581264944972037">暫停</translation> <translation id="1181037720776840403">移除</translation> <translation id="1197088940767939838">橘色</translation> <translation id="1201402288615127009">繼續</translation> @@ -100,7 +100,6 @@ <translation id="1405567553485452995">淺綠色</translation> <translation id="1407135791313364759">全部開啟</translation> <translation id="1413809658975081374">隱私權設定發生錯誤</translation> -<translation id="14171126816530869">位於 <ph name="LOCALITY" /> 的 <ph name="ORGANIZATION" />,已經過 <ph name="ISSUER" /> 驗證身分。</translation> <translation id="1426410128494586442">是</translation> <translation id="1430915738399379752">列印</translation> <translation id="1455413310270022028">橡皮擦</translation> @@ -256,6 +255,7 @@ <translation id="2262243747453050782">HTTP 錯誤</translation> <translation id="2263079731045660823">在 Chrome 設定中更新信用卡自動填入資訊</translation> <translation id="2270484714375784793">電話號碼</translation> +<translation id="2277103315734023688">快轉</translation> <translation id="2283340219607151381">儲存及填入地址</translation> <translation id="2292556288342944218">您的網際網路存取權遭到封鎖</translation> <translation id="2297722699537546652">B5 (信封)</translation> @@ -383,7 +383,6 @@ <translation id="295526156371527179">警告:這項政策並非字典,因此未依照政策中指定的方式合併為字典。</translation> <translation id="2955913368246107853">關閉搜尋列</translation> <translation id="2969319727213777354">您必須正確設定時鐘,才能建立安全連線。這是因為網站驗證身分時所使用的憑證僅於特定一段時間內有效。由於您裝置的時鐘不正確,因此 Google Chrome 無法驗證這些憑證。</translation> -<translation id="2970515157925768593">可以在遠端變更你的裝置和帳戶設定。</translation> <translation id="2972581237482394796">重做(&R)</translation> <translation id="2977665033722899841"><ph name="ROW_NAME" />,目前已選取。<ph name="ROW_CONTENT" /></translation> <translation id="2982481275546140226">清除資料</translation> @@ -395,7 +394,6 @@ <translation id="3005723025932146533">顯示儲存的複本</translation> <translation id="3008447029300691911">請輸入 <ph name="CREDIT_CARD" /> 的信用卡安全碼。完成驗證後,這個網站就會取得您的信用卡詳細資訊。</translation> <translation id="3010559122411665027">清單項目「<ph name="ENTRY_INDEX" />」:<ph name="ERROR" /></translation> -<translation id="3014389611820813634">這個裝置的管理員 <ph name="ENROLLMENT_DOMAIN" /> 可執行下列操作:</translation> <translation id="301521992641321250">已自動封鎖</translation> <translation id="3023071826883856138">You4 (信封)</translation> <translation id="3024663005179499861">政策類型有誤</translation> @@ -441,7 +439,6 @@ <translation id="3287510313208355388">等到可連線時再下載網頁內容</translation> <translation id="3293642807462928945">進一步瞭解 <ph name="POLICY_NAME" /> 政策</translation> <translation id="3303855915957856445">找不到相符的搜尋結果</translation> -<translation id="3311730110465560799">你可以遠端變更裝置設定。</translation> <translation id="3320021301628644560">新增帳單地址</translation> <translation id="3324983252691184275">深紅色</translation> <translation id="3338095232262050444">安全</translation> @@ -537,7 +534,6 @@ <translation id="3761718714832595332">隱藏狀態</translation> <translation id="3765032636089507299">安全瀏覽網頁正在建構中。</translation> <translation id="3778403066972421603">你要將這張信用卡的資訊儲存到你在這個裝置上的 Google 帳戶嗎?</translation> -<translation id="3779973883630527594">管理這個帳戶的公司、學校或機構:</translation> <translation id="3781428340399460090">亮粉色</translation> <translation id="3783418713923659662">Mastercard</translation> <translation id="3787705759683870569">到期日:<ph name="EXPIRATION_MONTH" />/<ph name="EXPIRATION_YEAR" /></translation> @@ -561,6 +557,7 @@ <translation id="3949571496842715403">這個伺服器無法證明所屬網域為 <ph name="DOMAIN" />;其安全性憑證未指定主體別名。這可能是因為設定錯誤,或是有攻擊者攔截你的連線所致。</translation> <translation id="3949601375789751990">你的瀏覽記錄會顯示在這裡</translation> <translation id="3950820424414687140">登入</translation> +<translation id="3962859241508114581">上一首曲目</translation> <translation id="3963837677003247395">要以手動方式繼續嗎?</translation> <translation id="3964661563329879394">{COUNT,plural, =0{無}=1{來自 1 個網站 }other{來自 # 個網站 }}</translation> <translation id="397105322502079400">計算中…</translation> @@ -583,6 +580,7 @@ <translation id="410351446219883937">自動播放</translation> <translation id="4103763322291513355">請前往 <strong>chrome://policy</strong> 查看列入黑名單的網址清單,以及其他系統管理員強制執行的政策。</translation> <translation id="4110652170750985508">查看您的付款</translation> +<translation id="4112140312785995938">倒轉</translation> <translation id="4116663294526079822">永遠允許在這個網站執行</translation> <translation id="4117700440116928470">系統不支援這項政策的範圍。</translation> <translation id="4129401438321186435">{COUNT,plural, =1{以及另外 1 項表單資料}other{以及另外 # 項表單資料}}</translation> @@ -661,6 +659,7 @@ <translation id="443673843213245140">雖然已停用 Proxy,不過已指定明確 Proxy 設定。</translation> <translation id="445100540951337728">接受的簽帳金融卡</translation> <translation id="4466881336512663640">你對表單所做變更將會遺失。確定要繼續嗎?</translation> +<translation id="4477350412780666475">下一首曲目</translation> <translation id="4482953324121162758">系統不會翻譯這個網站。</translation> <translation id="4490717597759821841">A7</translation> <translation id="4493480324863638523">網址無效。網址必須採用標準架構,例如 http://example.com 或 https://example.com。</translation> @@ -907,7 +906,6 @@ <translation id="5838278095973806738">請勿在這個網站上輸入任何機密資訊 (例如密碼或信用卡號碼),以免遭到攻擊者竊取。</translation> <translation id="5860033963881614850">關閉</translation> <translation id="5863847714970149516">你要瀏覽的網頁可能會向你收取費用</translation> -<translation id="5865951947699094510">可以在遠端變更你的帳戶設定。</translation> <translation id="5866257070973731571">新增電話號碼</translation> <translation id="5869405914158311789">無法連上這個網站</translation> <translation id="5869522115854928033">已儲存的密碼</translation> @@ -1060,6 +1058,7 @@ <translation id="6778737459546443941">你的家長尚未核准這個網站</translation> <translation id="67862343314499040">紫羅蘭色</translation> <translation id="6786747875388722282">擴充功能</translation> +<translation id="6790428901817661496">播放</translation> <translation id="679355240208270552">由於政策未啟用預設搜尋設定,因此遭到忽略。</translation> <translation id="681021252041861472">必填欄位</translation> <translation id="6810899417690483278">自訂 ID</translation> @@ -1163,6 +1162,7 @@ <translation id="7353601530677266744">命令列</translation> <translation id="7372973238305370288">搜尋結果</translation> <translation id="7377249249140280793"><ph name="RELATIVE_DATE" /> - <ph name="FULL_DATE" /></translation> +<translation id="7378594059915113390">媒體控制項</translation> <translation id="7378627244592794276">不需要</translation> <translation id="7378810950367401542">/</translation> <translation id="7390545607259442187">驗證信用卡</translation> @@ -1266,7 +1266,6 @@ <translation id="780301667611848630">不用了,謝謝</translation> <translation id="7805768142964895445">狀態</translation> <translation id="7806344367022510803">在 Chrome 中變更搜尋引擎設定</translation> -<translation id="7810209002420871817">你的帳戶管理員 <ph name="ACCOUNT_DOMAIN" /> 可進行下列動作:</translation> <translation id="7812922009395017822">Mir</translation> <translation id="7813600968533626083">要從 Chrome 中移除建議嗎?</translation> <translation id="7815407501681723534">找到 <ph name="NUMBER_OF_RESULTS" /> 個與「<ph name="SEARCH_STRING" />」相符的<ph name="SEARCH_RESULTS" /></translation>
diff --git a/components/subresource_filter/content/browser/content_subresource_filter_throttle_manager.cc b/components/subresource_filter/content/browser/content_subresource_filter_throttle_manager.cc index 6d95544a..4e0cb86 100644 --- a/components/subresource_filter/content/browser/content_subresource_filter_throttle_manager.cc +++ b/components/subresource_filter/content/browser/content_subresource_filter_throttle_manager.cc
@@ -121,10 +121,10 @@ navigation_handle->GetRenderFrameHost(); bool is_ad_subframe = - transferred_ad_frame || base::ContainsKey(ad_frames_, frame_host); + transferred_ad_frame || base::Contains(ad_frames_, frame_host); DCHECK(!is_ad_subframe || !navigation_handle->IsInMainFrame()); - bool parent_is_ad = base::ContainsKey(ad_frames_, frame_host->GetParent()); + bool parent_is_ad = base::Contains(ad_frames_, frame_host->GetParent()); blink::mojom::AdFrameType ad_frame_type = blink::mojom::AdFrameType::kNonAd; if (is_ad_subframe) @@ -255,7 +255,7 @@ throttles->push_back(std::move(filtering_throttle)); } - DCHECK(!base::ContainsKey(ongoing_activation_throttles_, navigation_handle)); + DCHECK(!base::Contains(ongoing_activation_throttles_, navigation_handle)); if (auto activation_throttle = MaybeCreateActivationStateComputingThrottle(navigation_handle)) { ongoing_activation_throttles_[navigation_handle] = @@ -272,13 +272,13 @@ DCHECK(parent_frame); return load_policy != LoadPolicy::ALLOW || - base::ContainsKey(ad_frames_, frame_host) || - base::ContainsKey(ad_frames_, parent_frame); + base::Contains(ad_frames_, frame_host) || + base::Contains(ad_frames_, parent_frame); } bool ContentSubresourceFilterThrottleManager::IsFrameTaggedAsAd( const content::RenderFrameHost* frame_host) const { - return base::ContainsKey(ad_frames_, frame_host); + return base::Contains(ad_frames_, frame_host); } std::unique_ptr<SubframeNavigationFilteringThrottle> @@ -419,7 +419,7 @@ content::RenderFrameHost* parent = navigation_handle->GetParentFrame(); DCHECK(parent); - if (base::ContainsKey(activated_frame_hosts_, parent)) + if (base::Contains(activated_frame_hosts_, parent)) activated_frame_hosts_[frame_host] = nullptr; }
diff --git a/components/subresource_filter/content/browser/navigation_console_logger_unittest.cc b/components/subresource_filter/content/browser/navigation_console_logger_unittest.cc index d2ec5992..a54ba6d 100644 --- a/components/subresource_filter/content/browser/navigation_console_logger_unittest.cc +++ b/components/subresource_filter/content/browser/navigation_console_logger_unittest.cc
@@ -80,7 +80,7 @@ EXPECT_TRUE(GetConsoleMessages(main_rfh()).empty()); navigation->Commit(); - EXPECT_TRUE(base::ContainsValue(GetConsoleMessages(main_rfh()), "foo")); + EXPECT_TRUE(base::Contains(GetConsoleMessages(main_rfh()), "foo")); } TEST_F(NavigationConsoleLoggerTest, NavigationAlreadyCommit_Logs) { @@ -90,7 +90,7 @@ }; NavigationFinishCaller caller(web_contents(), base::BindRepeating(on_finish)); NavigateAndCommit(GURL("http://example.test/")); - EXPECT_TRUE(base::ContainsValue(GetConsoleMessages(main_rfh()), "foo")); + EXPECT_TRUE(base::Contains(GetConsoleMessages(main_rfh()), "foo")); } TEST_F(NavigationConsoleLoggerTest, NavigationAlreadyFailed_NoLog) {
diff --git a/components/subresource_filter/content/browser/subframe_navigation_filtering_throttle_unittest.cc b/components/subresource_filter/content/browser/subframe_navigation_filtering_throttle_unittest.cc index 1a1c89b..49b40db 100644 --- a/components/subresource_filter/content/browser/subframe_navigation_filtering_throttle_unittest.cc +++ b/components/subresource_filter/content/browser/subframe_navigation_filtering_throttle_unittest.cc
@@ -185,7 +185,7 @@ SimulateStartAndExpectResult( content::NavigationThrottle::BLOCK_REQUEST_AND_COLLAPSE); EXPECT_TRUE( - base::ContainsValue(GetConsoleMessages(), GetFilterConsoleMessage(url))); + base::Contains(GetConsoleMessages(), GetFilterConsoleMessage(url))); } TEST_F(SubframeNavigationFilteringThrottleTest, FilterOnRedirect) { @@ -208,7 +208,7 @@ SimulateStartAndExpectResult(content::NavigationThrottle::PROCEED); EXPECT_FALSE( - base::ContainsValue(GetConsoleMessages(), GetFilterConsoleMessage(url))); + base::Contains(GetConsoleMessages(), GetFilterConsoleMessage(url))); } TEST_F(SubframeNavigationFilteringThrottleTest, DryRunOnRedirect) {
diff --git a/components/subresource_filter/core/browser/subresource_filter_features.cc b/components/subresource_filter/core/browser/subresource_filter_features.cc index 3555c7f0..6e2b5e1 100644 --- a/components/subresource_filter/core/browser/subresource_filter_features.cc +++ b/components/subresource_filter/core/browser/subresource_filter_features.cc
@@ -396,7 +396,7 @@ } bool HasEnabledConfiguration(const Configuration& config) { - return base::ContainsValue( + return base::Contains( GetEnabledConfigurations()->configs_by_decreasing_priority(), config); }
diff --git a/components/subresource_filter/core/browser/subresource_filter_features_unittest.cc b/components/subresource_filter/core/browser/subresource_filter_features_unittest.cc index ca7a6928..653b73b0 100644 --- a/components/subresource_filter/core/browser/subresource_filter_features_unittest.cc +++ b/components/subresource_filter/core/browser/subresource_filter_features_unittest.cc
@@ -658,7 +658,7 @@ Configuration::MakePresetForPerformanceTestingDryRunOnAllSites(); base::test::ScopedFeatureList scoped_feature; scoped_feature.InitAndEnableFeature(kAdTagging); - EXPECT_TRUE(base::ContainsValue( + EXPECT_TRUE(base::Contains( GetEnabledConfigurations()->configs_by_decreasing_priority(), dryrun)); } @@ -667,7 +667,7 @@ Configuration::MakePresetForPerformanceTestingDryRunOnAllSites(); base::test::ScopedFeatureList scoped_feature; scoped_feature.InitAndDisableFeature(kAdTagging); - EXPECT_FALSE(base::ContainsValue( + EXPECT_FALSE(base::Contains( GetEnabledConfigurations()->configs_by_decreasing_priority(), dryrun)); }
diff --git a/components/sync/engine_impl/directory_commit_contribution_unittest.cc b/components/sync/engine_impl/directory_commit_contribution_unittest.cc index 00bf0e2..91664701 100644 --- a/components/sync/engine_impl/directory_commit_contribution_unittest.cc +++ b/components/sync/engine_impl/directory_commit_contribution_unittest.cc
@@ -114,8 +114,8 @@ DirectoryCommitContribution::Build(dir(), PREFERENCES, 5, &emitter)); ASSERT_EQ(2U, cc->GetNumEntries()); - EXPECT_TRUE(base::ContainsValue(cc->metahandles_, pref1)); - EXPECT_TRUE(base::ContainsValue(cc->metahandles_, pref2)); + EXPECT_TRUE(base::Contains(cc->metahandles_, pref1)); + EXPECT_TRUE(base::Contains(cc->metahandles_, pref2)); cc->CleanUp(); }
diff --git a/components/sync/engine_impl/get_commit_ids.cc b/components/sync/engine_impl/get_commit_ids.cc index 47aa2e82..cdb2c4f 100644 --- a/components/sync/engine_impl/get_commit_ids.cc +++ b/components/sync/engine_impl/get_commit_ids.cc
@@ -277,7 +277,7 @@ // We're not interested in non-deleted parents. break; } - if (base::ContainsValue(traversed, handle)) { + if (base::Contains(traversed, handle)) { // We've already added this parent (and therefore all of its parents). // We can return early. break; @@ -365,7 +365,7 @@ if (HaveItem(handle)) continue; - if (base::ContainsValue(deletion_list, handle)) { + if (base::Contains(deletion_list, handle)) { continue; }
diff --git a/components/sync/engine_impl/model_type_worker.cc b/components/sync/engine_impl/model_type_worker.cc index 343fba9..160559e 100644 --- a/components/sync/engine_impl/model_type_worker.cc +++ b/components/sync/engine_impl/model_type_worker.cc
@@ -250,7 +250,7 @@ data->client_tag_hash = update_entity.client_defined_unique_tag(); data->creation_time = ProtoTimeToTime(update_entity.ctime()); data->modification_time = ProtoTimeToTime(update_entity.mtime()); - data->non_unique_name = update_entity.name(); + data->name = update_entity.name(); data->is_folder = update_entity.folder(); data->parent_id = update_entity.parent_id_string();
diff --git a/components/sync/engine_impl/model_type_worker_unittest.cc b/components/sync/engine_impl/model_type_worker_unittest.cc index 607b5e0..f84349677 100644 --- a/components/sync/engine_impl/model_type_worker_unittest.cc +++ b/components/sync/engine_impl/model_type_worker_unittest.cc
@@ -737,7 +737,7 @@ EXPECT_LT(0, update.response_version); EXPECT_FALSE(entity.creation_time.is_null()); EXPECT_FALSE(entity.modification_time.is_null()); - EXPECT_FALSE(entity.non_unique_name.empty()); + EXPECT_FALSE(entity.name.empty()); EXPECT_FALSE(entity.is_deleted()); EXPECT_EQ(kTag1, entity.specifics.preference().name()); EXPECT_EQ(kValue1, entity.specifics.preference().value());
diff --git a/components/sync/engine_impl/non_blocking_type_commit_contribution.cc b/components/sync/engine_impl/non_blocking_type_commit_contribution.cc index 1440bf5..116afbd 100644 --- a/components/sync/engine_impl/non_blocking_type_commit_contribution.cc +++ b/components/sync/engine_impl/non_blocking_type_commit_contribution.cc
@@ -191,7 +191,7 @@ commit_proto->set_version(commit_entity.base_version); commit_proto->set_deleted(entity_data.is_deleted()); commit_proto->set_folder(entity_data.is_folder); - commit_proto->set_name(entity_data.non_unique_name); + commit_proto->set_name(entity_data.name); if (!entity_data.is_deleted()) { // Handle bookmarks separately.
diff --git a/components/sync/engine_impl/non_blocking_type_commit_contribution_unittest.cc b/components/sync/engine_impl/non_blocking_type_commit_contribution_unittest.cc index ebd8d2f6..92053e7 100644 --- a/components/sync/engine_impl/non_blocking_type_commit_contribution_unittest.cc +++ b/components/sync/engine_impl/non_blocking_type_commit_contribution_unittest.cc
@@ -61,7 +61,7 @@ // to make this item look more realistic. data->creation_time = creation_time; data->modification_time = modification_time; - data->non_unique_name = "Name:"; + data->name = "Name:"; CommitRequestData request_data; request_data.sequence_number = 2; @@ -105,7 +105,7 @@ // to make this item look more realistic. data->creation_time = creation_time; data->modification_time = modification_time; - data->non_unique_name = "Name:"; + data->name = "Name:"; data->parent_id = "ParentOf:"; data->is_folder = true; syncer::UniquePosition uniquePosition = syncer::UniquePosition::FromInt64(
diff --git a/components/sync/engine_impl/uss_migrator_unittest.cc b/components/sync/engine_impl/uss_migrator_unittest.cc index dfd0a50..d3913f92 100644 --- a/components/sync/engine_impl/uss_migrator_unittest.cc +++ b/components/sync/engine_impl/uss_migrator_unittest.cc
@@ -144,7 +144,7 @@ EXPECT_EQ(1, update->response_version); EXPECT_EQ(ctime, entity.creation_time); EXPECT_EQ(ctime, entity.modification_time); - EXPECT_EQ(kTag1, entity.non_unique_name); + EXPECT_EQ(kTag1, entity.name); EXPECT_FALSE(entity.is_deleted()); EXPECT_EQ(kTag1, entity.specifics.preference().name()); EXPECT_EQ(kValue1, entity.specifics.preference().value());
diff --git a/components/sync/model/entity_data.cc b/components/sync/model/entity_data.cc index 44d008d4..523ebed5 100644 --- a/components/sync/model/entity_data.cc +++ b/components/sync/model/entity_data.cc
@@ -37,7 +37,7 @@ originator_cache_guid(std::move(other.originator_cache_guid)), originator_client_item_id(std::move(other.originator_client_item_id)), server_defined_unique_tag(std::move(other.server_defined_unique_tag)), - non_unique_name(std::move(other.non_unique_name)), + name(std::move(other.name)), creation_time(other.creation_time), modification_time(other.modification_time), parent_id(std::move(other.parent_id)), @@ -54,7 +54,7 @@ originator_cache_guid = std::move(other.originator_cache_guid); originator_client_item_id = std::move(other.originator_client_item_id); server_defined_unique_tag = std::move(other.server_defined_unique_tag); - non_unique_name = std::move(other.non_unique_name); + name = std::move(other.name); creation_time = other.creation_time; modification_time = other.modification_time; parent_id = other.parent_id; @@ -84,7 +84,7 @@ ADD_TO_DICT(dict, originator_cache_guid); ADD_TO_DICT(dict, originator_client_item_id); ADD_TO_DICT(dict, server_defined_unique_tag); - ADD_TO_DICT(dict, non_unique_name); + ADD_TO_DICT(dict, name); ADD_TO_DICT(dict, parent_id); ADD_TO_DICT_WITH_TRANSFORM(dict, ctime, GetTimeDebugString); ADD_TO_DICT_WITH_TRANSFORM(dict, mtime, GetTimeDebugString); @@ -104,7 +104,7 @@ memory_usage += EstimateMemoryUsage(originator_cache_guid); memory_usage += EstimateMemoryUsage(originator_client_item_id); memory_usage += EstimateMemoryUsage(server_defined_unique_tag); - memory_usage += EstimateMemoryUsage(non_unique_name); + memory_usage += EstimateMemoryUsage(name); memory_usage += EstimateMemoryUsage(specifics); memory_usage += EstimateMemoryUsage(parent_id); memory_usage += EstimateMemoryUsage(unique_position);
diff --git a/components/sync/model/entity_data.h b/components/sync/model/entity_data.h index c97663dc..80b01b1 100644 --- a/components/sync/model/entity_data.h +++ b/components/sync/model/entity_data.h
@@ -55,7 +55,7 @@ std::string server_defined_unique_tag; // Entity name, used mostly for Debug purposes. - std::string non_unique_name; + std::string name; // Model type specific sync data. sync_pb::EntitySpecifics specifics;
diff --git a/components/sync/model/fake_model_type_sync_bridge.cc b/components/sync/model/fake_model_type_sync_bridge.cc index f3f3ae3e..86fa9ce2 100644 --- a/components/sync/model/fake_model_type_sync_bridge.cc +++ b/components/sync/model/fake_model_type_sync_bridge.cc
@@ -87,7 +87,7 @@ std::unique_ptr<EntityData> entity_data = std::make_unique<EntityData>(); entity_data->client_tag_hash = TagHashFromKey(key); entity_data->specifics = GenerateSpecifics(key, value); - entity_data->non_unique_name = key; + entity_data->name = key; return entity_data; } @@ -229,8 +229,8 @@ std::string storage_key = change->storage_key(); EXPECT_NE(SupportsGetStorageKey(), storage_key.empty()); if (storage_key.empty()) { - if (base::ContainsKey(values_to_ignore_, - change->data().specifics.preference().value())) { + if (base::Contains(values_to_ignore_, + change->data().specifics.preference().value())) { change_processor()->UntrackEntityForClientTagHash( change->data().client_tag_hash); continue; @@ -385,7 +385,7 @@ auto new_data = std::make_unique<EntityData>(); new_data->id = old_data.id; new_data->client_tag_hash = old_data.client_tag_hash; - new_data->non_unique_name = old_data.non_unique_name; + new_data->name = old_data.name; new_data->specifics = old_data.specifics; new_data->creation_time = old_data.creation_time; new_data->modification_time = old_data.modification_time;
diff --git a/components/sync/model_impl/client_tag_based_model_type_processor.cc b/components/sync/model_impl/client_tag_based_model_type_processor.cc index 465c3cbc..b0dd59e 100644 --- a/components/sync/model_impl/client_tag_based_model_type_processor.cc +++ b/components/sync/model_impl/client_tag_based_model_type_processor.cc
@@ -379,7 +379,7 @@ DCHECK(IsAllowingChanges()); DCHECK(data); DCHECK(!data->is_deleted()); - DCHECK(!data->non_unique_name.empty()); + DCHECK(!data->name.empty()); DCHECK(!data->specifics.has_encrypted()); DCHECK_EQ(type_, GetModelTypeFromSpecifics(data->specifics));
diff --git a/components/sync/model_impl/client_tag_based_model_type_processor_unittest.cc b/components/sync/model_impl/client_tag_based_model_type_processor_unittest.cc index 83b7b67..242d9571 100644 --- a/components/sync/model_impl/client_tag_based_model_type_processor_unittest.cc +++ b/components/sync/model_impl/client_tag_based_model_type_processor_unittest.cc
@@ -756,7 +756,7 @@ EXPECT_TRUE(tag1_data.id.empty()); EXPECT_FALSE(tag1_data.creation_time.is_null()); EXPECT_FALSE(tag1_data.modification_time.is_null()); - EXPECT_EQ(kKey1, tag1_data.non_unique_name); + EXPECT_EQ(kKey1, tag1_data.name); EXPECT_FALSE(tag1_data.is_deleted()); EXPECT_EQ(kKey1, tag1_data.specifics.preference().name()); EXPECT_EQ(kValue1, tag1_data.specifics.preference().value()); @@ -807,7 +807,7 @@ entity_data->specifics.mutable_preference()->set_name(kKey1); entity_data->specifics.mutable_preference()->set_value(kValue1); - entity_data->non_unique_name = kKey1; + entity_data->name = kKey1; entity_data->client_tag_hash = kHash1; entity_data->id = kId1; bridge()->WriteItem(kKey1, std::move(entity_data)); @@ -832,7 +832,7 @@ // storage key and client tag values. entity_data->specifics.mutable_preference()->set_name(kKey2); entity_data->specifics.mutable_preference()->set_value(kValue2); - entity_data->non_unique_name = kKey2; + entity_data->name = kKey2; entity_data->client_tag_hash = kHash3; // Make sure ID isn't overwritten either. entity_data->id = kId2; @@ -912,7 +912,7 @@ EXPECT_FALSE(data_v2.id.empty()); EXPECT_EQ(ctime, data_v2.creation_time); EXPECT_EQ(mtime, data_v2.modification_time); - EXPECT_EQ(kKey1, data_v2.non_unique_name); + EXPECT_EQ(kKey1, data_v2.name); EXPECT_FALSE(data_v2.is_deleted()); EXPECT_EQ(kKey1, data_v2.specifics.preference().name()); EXPECT_EQ(kValue2, data_v2.specifics.preference().value()); @@ -983,7 +983,7 @@ EXPECT_TRUE(data_v2.id.empty()); EXPECT_EQ(ctime, data_v2.creation_time); EXPECT_EQ(mtime, data_v2.modification_time); - EXPECT_EQ(kKey1, data_v2.non_unique_name); + EXPECT_EQ(kKey1, data_v2.name); EXPECT_FALSE(data_v2.is_deleted()); EXPECT_EQ(kKey1, data_v2.specifics.preference().name()); EXPECT_EQ(kValue2, data_v2.specifics.preference().value()); @@ -1040,7 +1040,7 @@ EXPECT_EQ(kValue1, data.specifics.preference().value()); EXPECT_FALSE(data.creation_time.is_null()); EXPECT_FALSE(data.modification_time.is_null()); - EXPECT_EQ(kKey1, data.non_unique_name); + EXPECT_EQ(kKey1, data.name); EXPECT_FALSE(data.is_deleted()); const EntityMetadata metadata = db()->GetMetadata(kKey1); @@ -1401,7 +1401,7 @@ EXPECT_FALSE(tag1_data.id.empty()); EXPECT_FALSE(tag1_data.creation_time.is_null()); EXPECT_FALSE(tag1_data.modification_time.is_null()); - EXPECT_EQ(kKey1, tag1_data.non_unique_name); + EXPECT_EQ(kKey1, tag1_data.name); EXPECT_FALSE(tag1_data.is_deleted()); EXPECT_EQ(kKey1, tag1_data.specifics.preference().name()); EXPECT_EQ(kValue1, tag1_data.specifics.preference().value());
diff --git a/components/sync/model_impl/processor_entity_unittest.cc b/components/sync/model_impl/processor_entity_unittest.cc index 79d04b82..b56f33a6 100644 --- a/components/sync/model_impl/processor_entity_unittest.cc +++ b/components/sync/model_impl/processor_entity_unittest.cc
@@ -42,7 +42,7 @@ std::unique_ptr<EntityData> entity_data(new EntityData()); entity_data->client_tag_hash = hash; entity_data->specifics = GenerateSpecifics(name, value); - entity_data->non_unique_name = name; + entity_data->name = name; return entity_data; } @@ -72,7 +72,7 @@ int64_t version) { std::unique_ptr<EntityData> data = std::make_unique<EntityData>(); data->client_tag_hash = hash; - data->non_unique_name = name; + data->name = name; data->id = id; data->modification_time = mtime; auto update = std::make_unique<UpdateResponseData>(); @@ -199,7 +199,7 @@ const EntityData& data = *request.entity; EXPECT_EQ("", data.id); EXPECT_EQ(kHash, data.client_tag_hash); - EXPECT_EQ(kName, data.non_unique_name); + EXPECT_EQ(kName, data.name); EXPECT_EQ(kValue1, data.specifics.preference().value()); EXPECT_EQ(TimeToProtoTime(ctime_), TimeToProtoTime(data.creation_time)); EXPECT_EQ(entity->metadata().modification_time(), @@ -419,7 +419,7 @@ const EntityData& data = *request.entity; EXPECT_EQ(kId, data.id); EXPECT_EQ(kHash, data.client_tag_hash); - EXPECT_EQ("", data.non_unique_name); + EXPECT_EQ("", data.name); EXPECT_EQ(TimeToProtoTime(ctime_), TimeToProtoTime(data.creation_time)); EXPECT_EQ(entity->metadata().modification_time(), TimeToProtoTime(data.modification_time));
diff --git a/components/sync/model_impl/syncable_service_based_bridge.cc b/components/sync/model_impl/syncable_service_based_bridge.cc index aadefe8e..8fb88b81 100644 --- a/components/sync/model_impl/syncable_service_based_bridge.cc +++ b/components/sync/model_impl/syncable_service_based_bridge.cc
@@ -33,7 +33,7 @@ DCHECK(!client_tag_hash.empty()); auto entity_data = std::make_unique<EntityData>(); - entity_data->non_unique_name = std::move(*data.mutable_non_unique_name()); + entity_data->name = std::move(*data.mutable_non_unique_name()); entity_data->specifics = std::move(*data.mutable_specifics()); entity_data->client_tag_hash = client_tag_hash; @@ -47,7 +47,7 @@ sync_pb::PersistedEntityData CreatePersistedFromEntityData( const EntityData& entity_data) { sync_pb::PersistedEntityData persisted; - persisted.set_non_unique_name(entity_data.non_unique_name); + persisted.set_non_unique_name(entity_data.name); *persisted.mutable_specifics() = entity_data.specifics; return persisted; }
diff --git a/components/sync/nigori/nigori_model_type_processor.cc b/components/sync/nigori/nigori_model_type_processor.cc index 604ede7..5d2dde48 100644 --- a/components/sync/nigori/nigori_model_type_processor.cc +++ b/components/sync/nigori/nigori_model_type_processor.cc
@@ -317,7 +317,7 @@ DCHECK(entity_data); DCHECK(!entity_data->is_deleted()); DCHECK(entity_data->is_folder); - DCHECK(!entity_data->non_unique_name.empty()); + DCHECK(!entity_data->name.empty()); DCHECK(!entity_data->specifics.has_encrypted()); DCHECK_EQ(NIGORI, GetModelTypeFromSpecifics(entity_data->specifics)); DCHECK(entity_);
diff --git a/components/sync/nigori/nigori_model_type_processor_unittest.cc b/components/sync/nigori/nigori_model_type_processor_unittest.cc index abfdbe3..27ba362 100644 --- a/components/sync/nigori/nigori_model_type_processor_unittest.cc +++ b/components/sync/nigori/nigori_model_type_processor_unittest.cc
@@ -62,7 +62,7 @@ entity_data->specifics.mutable_nigori(); nigori_specifics->mutable_keystore_decryptor_token()->set_key_name( keystore_decryptor_token_key_name); - entity_data->non_unique_name = kNigoriNonUniqueName; + entity_data->name = kNigoriNonUniqueName; auto response_data = std::make_unique<syncer::UpdateResponseData>(); response_data->entity = std::move(entity_data); @@ -190,7 +190,7 @@ auto entity_data = std::make_unique<syncer::EntityData>(); entity_data->specifics.mutable_nigori(); - entity_data->non_unique_name = kNigoriNonUniqueName; + entity_data->name = kNigoriNonUniqueName; entity_data->is_folder = true; processor()->Put(std::move(entity_data)); @@ -217,7 +217,7 @@ auto entity_data = std::make_unique<syncer::EntityData>(); entity_data->specifics.mutable_nigori(); - entity_data->non_unique_name = kNigoriNonUniqueName; + entity_data->name = kNigoriNonUniqueName; entity_data->is_folder = true; processor()->Put(std::move(entity_data)); @@ -226,7 +226,7 @@ /*max_entries=*/10, base::BindOnce(&CaptureCommitRequest, &commit_request)); ASSERT_EQ(1U, commit_request.size()); - EXPECT_EQ(kNigoriNonUniqueName, commit_request[0]->entity->non_unique_name); + EXPECT_EQ(kNigoriNonUniqueName, commit_request[0]->entity->name); } TEST_F(NigoriModelTypeProcessorTest, @@ -235,7 +235,7 @@ auto entity_data = std::make_unique<syncer::EntityData>(); entity_data->specifics.mutable_nigori(); - entity_data->non_unique_name = kNigoriNonUniqueName; + entity_data->name = kNigoriNonUniqueName; entity_data->is_folder = true; processor()->Put(std::move(entity_data)); @@ -271,7 +271,7 @@ auto entity_data = std::make_unique<syncer::EntityData>(); entity_data->specifics.mutable_nigori(); - entity_data->non_unique_name = kNigoriNonUniqueName; + entity_data->name = kNigoriNonUniqueName; entity_data->is_folder = true; processor()->Put(std::move(entity_data)); @@ -291,7 +291,7 @@ ON_CALL(*mock_nigori_sync_bridge(), GetData()).WillByDefault([&]() { auto entity_data = std::make_unique<syncer::EntityData>(); entity_data->specifics.mutable_nigori(); - entity_data->non_unique_name = kNigoriNonUniqueName; + entity_data->name = kNigoriNonUniqueName; entity_data->is_folder = true; return entity_data; }); @@ -312,7 +312,7 @@ sync_pb::NigoriSpecifics* nigori_specifics = entity_data->specifics.mutable_nigori(); nigori_specifics->set_encrypt_bookmarks(true); - entity_data->non_unique_name = kNigoriNonUniqueName; + entity_data->name = kNigoriNonUniqueName; entity_data->is_folder = true; processor()->Put(std::move(entity_data)); @@ -332,7 +332,7 @@ // Make another local change before the commit response is received. entity_data = std::make_unique<syncer::EntityData>(); nigori_specifics = entity_data->specifics.mutable_nigori(); - entity_data->non_unique_name = kNigoriNonUniqueName; + entity_data->name = kNigoriNonUniqueName; entity_data->is_folder = true; nigori_specifics->set_encrypt_preferences(true); processor()->Put(std::move(entity_data)); @@ -357,7 +357,7 @@ auto entity_data = std::make_unique<syncer::EntityData>(); entity_data->specifics.mutable_nigori(); - entity_data->non_unique_name = kNigoriNonUniqueName; + entity_data->name = kNigoriNonUniqueName; entity_data->is_folder = true; processor()->Put(std::move(entity_data)); @@ -372,7 +372,7 @@ auto entity_data = std::make_unique<syncer::EntityData>(); entity_data->specifics.mutable_nigori(); - entity_data->non_unique_name = kNigoriNonUniqueName; + entity_data->name = kNigoriNonUniqueName; entity_data->is_folder = true; EXPECT_CALL(*mock_commit_queue(), NudgeForCommit());
diff --git a/components/sync/nigori/nigori_sync_bridge_impl.cc b/components/sync/nigori/nigori_sync_bridge_impl.cc index fe7f451..3071edd 100644 --- a/components/sync/nigori/nigori_sync_bridge_impl.cc +++ b/components/sync/nigori/nigori_sync_bridge_impl.cc
@@ -240,6 +240,20 @@ void NigoriSyncBridgeImpl::Init() { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + // Init() is called after the first sync cycle, so we can have + // |encrypt_everything_| enabled even if we don't persist the local state. + // TODO(crbug.com/922900): try to avoid double notification. Currently it + // happens iff we received explicit passphrase Nigori during the first + // sync cycle, and more complicated once we persist the local state. + ModelTypeSet encrypted_types; + if (encrypt_everything_) { + encrypted_types = EncryptableUserTypes(); + } else { + encrypted_types = SensitiveTypes(); + } + for (auto& observer : observers_) { + observer.OnEncryptedTypesChanged(encrypted_types, encrypt_everything_); + } NOTIMPLEMENTED(); // TODO(crbug.com/922900): notify observers about cryptographer change in // case UpdateLocalState() is not called in this function (i.e. @@ -589,7 +603,7 @@ NOTIMPLEMENTED(); auto entity_data = std::make_unique<EntityData>(); *entity_data->specifics.mutable_nigori() = std::move(specifics); - entity_data->non_unique_name = kNigoriNonUniqueName; + entity_data->name = kNigoriNonUniqueName; return entity_data; }
diff --git a/components/sync/nigori/nigori_sync_bridge_impl_unittest.cc b/components/sync/nigori/nigori_sync_bridge_impl_unittest.cc index de5fed50..7cf10e0 100644 --- a/components/sync/nigori/nigori_sync_bridge_impl_unittest.cc +++ b/components/sync/nigori/nigori_sync_bridge_impl_unittest.cc
@@ -216,6 +216,17 @@ testing::NiceMock<MockObserver> observer_; }; +// During initialization bridge should expose encrypted types via observers +// notification. +TEST_F(NigoriSyncBridgeImplTest, ShouldNotifyObserversOnInit) { + // TODO(crbug.com/922900): once persistence is supported for Nigori, this + // test should be extended to verify whole encryption state. + EXPECT_CALL(*observer(), + OnEncryptedTypesChanged(SyncEncryptionHandler::SensitiveTypes(), + /*encrypt_everything=*/false)); + bridge()->Init(); +} + // Simplest case of keystore Nigori: we have only one keystore key and no old // keys. This keystore key is encrypted in both encryption_keybag and // keystore_decryptor_token. Client receives such Nigori if initialization of
diff --git a/components/sync/protocol/autofill_specifics.proto b/components/sync/protocol/autofill_specifics.proto index b088254..8e90d749 100644 --- a/components/sync/protocol/autofill_specifics.proto +++ b/components/sync/protocol/autofill_specifics.proto
@@ -83,6 +83,20 @@ // optional AutofillCreditCardSpecifics deprecated_credit_card = 6; } +message CloudTokenData { + // Last 4-5 digits of the Cloud Primary Account Number (CPAN). + optional string suffix = 1; + + // CPAN Month number 1-12. + optional int32 exp_month = 2; + + // CPAN Four-digit year (e.g. 2017). + optional int32 exp_year = 3; + + // URL of the card art to be displayed for CPAN. + optional string art_file_url = 4; +} + message WalletMaskedCreditCard { enum WalletCardStatus { VALID = 0; @@ -136,6 +150,9 @@ // Issuing Bank name which is internationalized (e.g. "Chase", "工商银行") optional string bank_name = 10; + + // This field will be set if a cloud token is available for the instrument. + optional CloudTokenData cloud_token_data = 11; } // Different than an AutofillProfile because this represents some known address
diff --git a/components/sync/protocol/proto_visitors.h b/components/sync/protocol/proto_visitors.h index e759920..41c0c3e2 100644 --- a/components/sync/protocol/proto_visitors.h +++ b/components/sync/protocol/proto_visitors.h
@@ -1034,6 +1034,13 @@ VISIT_PROTO_FIELDS(const sync_pb::UserEventSpecifics::Test& proto) {} +VISIT_PROTO_FIELDS(const sync_pb::CloudTokenData& proto) { + VISIT(suffix); + VISIT(exp_month); + VISIT(exp_year); + VISIT(art_file_url); +} + VISIT_PROTO_FIELDS(const sync_pb::WalletMaskedCreditCard& proto) { VISIT(id); VISIT_ENUM(status);
diff --git a/components/sync/test/engine/mock_connection_manager.cc b/components/sync/test/engine/mock_connection_manager.cc index 8710365..cec1ac5 100644 --- a/components/sync/test/engine/mock_connection_manager.cc +++ b/components/sync/test/engine/mock_connection_manager.cc
@@ -593,7 +593,7 @@ } bool MockConnectionManager::ShouldTransientErrorThisId(syncable::Id id) { - return base::ContainsValue(transient_error_ids_, id); + return base::Contains(transient_error_ids_, id); } bool MockConnectionManager::ProcessCommit(
diff --git a/components/sync/test/engine/mock_model_type_processor.cc b/components/sync/test/engine/mock_model_type_processor.cc index d9a15e9..1c46ef0 100644 --- a/components/sync/test/engine/mock_model_type_processor.cc +++ b/components/sync/test/engine/mock_model_type_processor.cc
@@ -86,7 +86,7 @@ data->creation_time = base::Time::UnixEpoch() + base::TimeDelta::FromDays(1); data->modification_time = data->creation_time + base::TimeDelta::FromSeconds(base_version); - data->non_unique_name = "Name: " + tag_hash; + data->name = "Name: " + tag_hash; auto request_data = std::make_unique<CommitRequestData>(); request_data->entity = std::move(data); @@ -113,7 +113,7 @@ // These fields have little or no effect on behavior. We set them anyway to // make the test more realistic. data->creation_time = base::Time::UnixEpoch() + base::TimeDelta::FromDays(1); - data->non_unique_name = "Name deleted"; + data->name = "Name deleted"; data->modification_time = data->creation_time + base::TimeDelta::FromSeconds(base_version);
diff --git a/components/sync/test/engine/mock_model_type_worker.cc b/components/sync/test/engine/mock_model_type_worker.cc index f70ceb88..864cb87 100644 --- a/components/sync/test/engine/mock_model_type_worker.cc +++ b/components/sync/test/engine/mock_model_type_worker.cc
@@ -175,9 +175,9 @@ data->creation_time = base::Time::UnixEpoch() + base::TimeDelta::FromDays(1); data->modification_time = data->creation_time + base::TimeDelta::FromSeconds(version); - data->non_unique_name = data->specifics.has_encrypted() - ? "encrypted" - : data->specifics.preference().name(); + data->name = data->specifics.has_encrypted() + ? "encrypted" + : data->specifics.preference().name(); auto response_data = std::make_unique<syncer::UpdateResponseData>(); response_data->entity = std::move(data); @@ -227,7 +227,7 @@ data->creation_time = base::Time::UnixEpoch() + base::TimeDelta::FromDays(1); data->modification_time = data->creation_time + base::TimeDelta::FromSeconds(version); - data->non_unique_name = "Name Non Unique"; + data->name = "Name Non Unique"; auto response_data = std::make_unique<UpdateResponseData>(); response_data->entity = std::move(data);
diff --git a/components/sync_bookmarks/bookmark_local_changes_builder.cc b/components/sync_bookmarks/bookmark_local_changes_builder.cc index f0b7bc6..e5ffb17d 100644 --- a/components/sync_bookmarks/bookmark_local_changes_builder.cc +++ b/components/sync_bookmarks/bookmark_local_changes_builder.cc
@@ -65,7 +65,7 @@ // EntityData should contain empty specifics to indicate deletion. data->specifics = CreateSpecificsFromBookmarkNode( node, bookmark_model_, /*force_favicon_load=*/true); - data->non_unique_name = data->specifics.bookmark().title(); + data->name = data->specifics.bookmark().title(); } auto request = std::make_unique<syncer::CommitRequestData>(); request->entity = std::move(data);
diff --git a/components/sync_bookmarks/bookmark_model_type_processor.cc b/components/sync_bookmarks/bookmark_model_type_processor.cc index 3d72a79..9715dfc8 100644 --- a/components/sync_bookmarks/bookmark_model_type_processor.cc +++ b/components/sync_bookmarks/bookmark_model_type_processor.cc
@@ -564,7 +564,7 @@ data.creation_time = node->date_added(); data.modification_time = syncer::ProtoTimeToTime(metadata->modification_time()); - data.non_unique_name = base::UTF16ToUTF8(node->GetTitle()); + data.name = base::UTF16ToUTF8(node->GetTitle()); data.is_folder = node->is_folder(); data.unique_position = metadata->unique_position(); data.specifics = CreateSpecificsFromBookmarkNode(
diff --git a/components/sync_device_info/device_info_sync_bridge.cc b/components/sync_device_info/device_info_sync_bridge.cc index a809fd0..02f54eab 100644 --- a/components/sync_device_info/device_info_sync_bridge.cc +++ b/components/sync_device_info/device_info_sync_bridge.cc
@@ -67,7 +67,7 @@ const DeviceInfoSpecifics& specifics) { auto entity_data = std::make_unique<EntityData>(); *entity_data->specifics.mutable_device_info() = specifics; - entity_data->non_unique_name = specifics.client_name(); + entity_data->name = specifics.client_name(); return entity_data; }
diff --git a/components/sync_preferences/pref_model_associator.cc b/components/sync_preferences/pref_model_associator.cc index 66dec66..6655e377 100644 --- a/components/sync_preferences/pref_model_associator.cc +++ b/components/sync_preferences/pref_model_associator.cc
@@ -300,7 +300,7 @@ base::Value result = to_value.Clone(); base::Value::ListStorage& list = result.GetList(); for (const auto& value : from_value.GetList()) { - if (!base::ContainsValue(list, value)) + if (!base::Contains(list, value)) list.emplace_back(value.Clone()); }
diff --git a/components/sync_sessions/session_store.cc b/components/sync_sessions/session_store.cc index cae2705..3d9ecb8c 100644 --- a/components/sync_sessions/session_store.cc +++ b/components/sync_sessions/session_store.cc
@@ -66,11 +66,11 @@ const std::string& client_name, SessionSpecifics* specifics) { auto entity_data = std::make_unique<syncer::EntityData>(); - entity_data->non_unique_name = client_name; + entity_data->name = client_name; if (specifics->has_header()) { - entity_data->non_unique_name += " (header)"; + entity_data->name += " (header)"; } else if (specifics->has_tab()) { - entity_data->non_unique_name += + entity_data->name += base::StringPrintf(" (tab node %d)", specifics->tab_node_id()); } entity_data->specifics.mutable_session()->Swap(specifics);
diff --git a/components/sync_sessions/session_sync_bridge.cc b/components/sync_sessions/session_sync_bridge.cc index fb0c6fc..df684e7 100644 --- a/components/sync_sessions/session_sync_bridge.cc +++ b/components/sync_sessions/session_sync_bridge.cc
@@ -48,7 +48,7 @@ const std::string& client_name, SessionSpecifics* specifics) { auto entity_data = std::make_unique<syncer::EntityData>(); - entity_data->non_unique_name = client_name; + entity_data->name = client_name; entity_data->specifics.mutable_session()->Swap(specifics); return entity_data; }
diff --git a/components/sync_sessions/sessions_global_id_mapper.cc b/components/sync_sessions/sessions_global_id_mapper.cc index 6eff6b8..573e4be 100644 --- a/components/sync_sessions/sessions_global_id_mapper.cc +++ b/components/sync_sessions/sessions_global_id_mapper.cc
@@ -114,7 +114,7 @@ // orphaned from |global_to_unique_|. base::EraseIf(unique_to_current_global_, [this](const std::pair<int, int64_t> kv) { - return !base::ContainsKey(global_to_unique_, kv.second); + return !base::Contains(global_to_unique_, kv.second); }); } }
diff --git a/components/sync_user_events/user_event_sync_bridge.cc b/components/sync_user_events/user_event_sync_bridge.cc index e6ff61d..4b3a066 100644 --- a/components/sync_user_events/user_event_sync_bridge.cc +++ b/components/sync_user_events/user_event_sync_bridge.cc
@@ -52,8 +52,7 @@ std::unique_ptr<EntityData> MoveToEntityData( std::unique_ptr<UserEventSpecifics> specifics) { auto entity_data = std::make_unique<EntityData>(); - entity_data->non_unique_name = - base::NumberToString(specifics->event_time_usec()); + entity_data->name = base::NumberToString(specifics->event_time_usec()); entity_data->specifics.set_allocated_user_event(specifics.release()); return entity_data; } @@ -111,8 +110,8 @@ base::EraseIf(in_flight_nav_linked_events_, [&deleted_event_times]( const std::pair<int64_t, sync_pb::UserEventSpecifics> kv) { - return base::ContainsKey(deleted_event_times, - kv.second.event_time_usec()); + return base::Contains(deleted_event_times, + kv.second.event_time_usec()); }); batch->TakeMetadataChangesFrom(std::move(metadata_change_list));
diff --git a/components/tracing/BUILD.gn b/components/tracing/BUILD.gn index b8d8cea..470d686 100644 --- a/components/tracing/BUILD.gn +++ b/components/tracing/BUILD.gn
@@ -2,25 +2,14 @@ # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. -import("//build/config/compiler/compiler.gni") import("//testing/test.gni") -if (is_android) { - import("//build/config/android/rules.gni") -} - -config("wrap_find_exidx") { - ldflags = [ "-Wl,-wrap,dl_unwind_find_exidx" ] -} - component("tracing") { sources = [ "child/background_tracing_agent_impl.cc", "child/background_tracing_agent_impl.h", "common/graphics_memory_dump_provider_android.cc", "common/graphics_memory_dump_provider_android.h", - "common/tracing_sampler_profiler.cc", - "common/tracing_sampler_profiler.h", "tracing_export.h", ] @@ -31,20 +20,6 @@ "//components/tracing/common:interfaces", "//ipc", ] - - if (is_android && can_unwind_with_cfi_table && is_official_build) { - sources += [ - "common/stack_sampler_android.cc", - "common/stack_sampler_android.h", - "common/stack_unwinder_android.cc", - "common/stack_unwinder_android.h", - ] - deps += [ "//buildtools/third_party/libunwind" ] - include_dirs = [ "//buildtools/third_party/libunwind/trunk/include" ] - - # stack_unwinder_android.cc overrides the dl_unwind_find_exidx function. - all_dependent_configs = [ ":wrap_find_exidx" ] - } } component("startup_tracing") { @@ -71,7 +46,6 @@ sources = [ "child/background_tracing_agent_impl_unittest.cc", "common/graphics_memory_dump_provider_android_unittest.cc", - "common/tracing_sampler_profiler_unittest.cc", ] deps = [ @@ -88,14 +62,6 @@ sources += [ "common/trace_startup_config_unittest.cc" ] deps += [ ":startup_tracing" ] } - - if (is_android && can_unwind_with_cfi_table && is_official_build) { - sources += [ "common/stack_unwinder_android_unittest.cc" ] - deps += [ - ":jni_headers", - ":tracing_test_helper_java", - ] - } } test("tracing_perftests") { @@ -121,20 +87,3 @@ deps += [ "//testing/android/native_test:native_test_native_code" ] } } - -if (is_android) { - generate_jni("jni_headers") { - sources = [ - "android/test/src/org/chromium/tracing/UnwindTestHelper.java", - ] - jni_package = "tracing" - } - - android_library("tracing_test_helper_java") { - deps = [ - "//base:base_java", - ] - java_files = - [ "android/test/src/org/chromium/tracing/UnwindTestHelper.java" ] - } -}
diff --git a/components/tracing/DEPS b/components/tracing/DEPS index bde9c00..08980e5e 100644 --- a/components/tracing/DEPS +++ b/components/tracing/DEPS
@@ -6,7 +6,4 @@ '.*browsertest\.cc': [ "+content/public/test", ], - 'stack_unwinder_android_unittest.cc': [ - "+jni", - ], }
diff --git a/components/translate/core/browser/translate_language_list_unittest.cc b/components/translate/core/browser/translate_language_list_unittest.cc index 6f588f0..2383276 100644 --- a/components/translate/core/browser/translate_language_list_unittest.cc +++ b/components/translate/core/browser/translate_language_list_unittest.cc
@@ -103,12 +103,12 @@ // Check there are a lot of default languages. EXPECT_GE(languages.size(), 100ul); // Check that some very common languages are there. - EXPECT_TRUE(base::ContainsValue(languages, "en")); - EXPECT_TRUE(base::ContainsValue(languages, "es")); - EXPECT_TRUE(base::ContainsValue(languages, "fr")); - EXPECT_TRUE(base::ContainsValue(languages, "ru")); - EXPECT_TRUE(base::ContainsValue(languages, "zh-CN")); - EXPECT_TRUE(base::ContainsValue(languages, "zh-TW")); + EXPECT_TRUE(base::Contains(languages, "en")); + EXPECT_TRUE(base::Contains(languages, "es")); + EXPECT_TRUE(base::Contains(languages, "fr")); + EXPECT_TRUE(base::Contains(languages, "ru")); + EXPECT_TRUE(base::Contains(languages, "zh-CN")); + EXPECT_TRUE(base::Contains(languages, "zh-TW")); } // Check that we contact the translate server to update the supported language
diff --git a/components/translate/core/browser/translate_manager_unittest.cc b/components/translate/core/browser/translate_manager_unittest.cc index 3bcd019..1d7b7233 100644 --- a/components/translate/core/browser/translate_manager_unittest.cc +++ b/components/translate/core/browser/translate_manager_unittest.cc
@@ -595,7 +595,7 @@ // Accept languages shouldn't contain "hi" before translating to that language std::vector<std::string> languages; mock_translate_client_.GetTranslatePrefs()->GetLanguageList(&languages); - EXPECT_FALSE(base::ContainsValue(languages, "hi")); + EXPECT_FALSE(base::Contains(languages, "hi")); base::HistogramTester histogram_tester; prefs_.SetBoolean(prefs::kOfferTranslateEnabled, true); @@ -612,7 +612,7 @@ // Accept languages should now contain "hi" because the user chose to // translate to it once. mock_translate_client_.GetTranslatePrefs()->GetLanguageList(&languages); - EXPECT_TRUE(base::ContainsValue(languages, "hi")); + EXPECT_TRUE(base::Contains(languages, "hi")); } TEST_F(TranslateManagerTest, @@ -639,7 +639,7 @@ // Accept languages shouldn't contain "en" before translating to that language std::vector<std::string> languages; mock_translate_client_.GetTranslatePrefs()->GetLanguageList(&languages); - EXPECT_FALSE(base::ContainsValue(languages, "en")); + EXPECT_FALSE(base::Contains(languages, "en")); base::HistogramTester histogram_tester; prefs_.SetBoolean(prefs::kOfferTranslateEnabled, true); @@ -651,14 +651,14 @@ ElementsAre(Bucket(INITIATION_STATUS_SHOW_INFOBAR, 1), Bucket(INITIATION_STATUS_SHOW_ICON, 1))); - EXPECT_FALSE(base::ContainsValue(languages, "en")); + EXPECT_FALSE(base::Contains(languages, "en")); translate_manager_->TranslatePage("fr", "en", false); // Accept languages should not contain "en" because it is redundant // with "en-US" already being present. languages.clear(); mock_translate_client_.GetTranslatePrefs()->GetLanguageList(&languages); - EXPECT_FALSE(base::ContainsValue(languages, "en")); + EXPECT_FALSE(base::Contains(languages, "en")); } TEST_F(TranslateManagerTest, DontTranslateOffline) {
diff --git a/components/translate/core/browser/translate_prefs.cc b/components/translate/core/browser/translate_prefs.cc index 613ea869..ba77b0ff 100644 --- a/components/translate/core/browser/translate_prefs.cc +++ b/components/translate/core/browser/translate_prefs.cc
@@ -92,7 +92,7 @@ }; const base::Feature kCompactTranslateInfobarIOS{ - "CompactTranslateInfobarIOS", base::FEATURE_DISABLED_BY_DEFAULT}; + "CompactTranslateInfobarIOS", base::FEATURE_ENABLED_BY_DEFAULT}; DenialTimeUpdate::DenialTimeUpdate(PrefService* prefs, const std::string& language, @@ -240,7 +240,7 @@ } // Add the language to the list. - if (!base::ContainsValue(languages, chrome_language)) { + if (!base::Contains(languages, chrome_language)) { languages.push_back(chrome_language); UpdateLanguageList(languages); }
diff --git a/components/ui_devtools/viz/dom_agent_viz.cc b/components/ui_devtools/viz/dom_agent_viz.cc index 3eb9fbf..a82e2690 100644 --- a/components/ui_devtools/viz/dom_agent_viz.cc +++ b/components/ui_devtools/viz/dom_agent_viz.cc
@@ -88,7 +88,7 @@ // it to RootElement. Sometimes OnAddedSurfaceReference is called first, so // don't create the element if it already exists. const viz::SurfaceId& surface_id = surface_info.id(); - if (!base::ContainsKey(surface_elements_, surface_id)) { + if (!base::Contains(surface_elements_, surface_id)) { UIElement* surface_root = GetRootSurfaceElement(); CreateSurfaceElement(surface_id, surface_root) ->AddToParentSorted(surface_root); @@ -391,7 +391,7 @@ UIElement* parent, bool is_root, bool is_client_connected) { - DCHECK(!base::ContainsKey(frame_sink_elements_, frame_sink_id)); + DCHECK(!base::Contains(frame_sink_elements_, frame_sink_id)); frame_sink_elements_[frame_sink_id] = std::make_unique<FrameSinkElement>( frame_sink_id, frame_sink_manager_, this, parent, is_root, is_client_connected); @@ -401,7 +401,7 @@ SurfaceElement* DOMAgentViz::CreateSurfaceElement( const viz::SurfaceId& surface_id, UIElement* parent) { - DCHECK(!base::ContainsKey(surface_elements_, surface_id)); + DCHECK(!base::Contains(surface_elements_, surface_id)); surface_elements_[surface_id] = std::make_unique<SurfaceElement>( surface_id, frame_sink_manager_, this, parent); return surface_elements_[surface_id].get();
diff --git a/components/ukm/observers/sync_disable_observer.cc b/components/ukm/observers/sync_disable_observer.cc index 4b3c054..f8e428a 100644 --- a/components/ukm/observers/sync_disable_observer.cc +++ b/components/ukm/observers/sync_disable_observer.cc
@@ -215,7 +215,7 @@ void SyncDisableObserver::UpdateSyncState( syncer::SyncService* sync, UrlKeyedDataCollectionConsentHelper* consent_helper) { - DCHECK(base::ContainsKey(previous_states_, sync)); + DCHECK(base::Contains(previous_states_, sync)); const SyncDisableObserver::SyncState& previous_state = previous_states_[sync]; DCHECK(previous_state.anonymized_data_collection_state == DataCollectionState::kIgnored || @@ -250,7 +250,7 @@ } void SyncDisableObserver::OnSyncShutdown(syncer::SyncService* sync) { - DCHECK(base::ContainsKey(previous_states_, sync)); + DCHECK(base::Contains(previous_states_, sync)); auto found = consent_helpers_.find(sync); if (found != consent_helpers_.end()) { found->second->RemoveObserver(this);
diff --git a/components/ukm/ukm_recorder_impl.cc b/components/ukm/ukm_recorder_impl.cc index cbcb5351..dbc55381 100644 --- a/components/ukm/ukm_recorder_impl.cc +++ b/components/ukm/ukm_recorder_impl.cc
@@ -294,7 +294,7 @@ unmatched_sources++; continue; } - if (!base::ContainsKey(ids_seen, kv.first)) { + if (!base::Contains(ids_seen, kv.first)) { unsent_sources.push_back(std::move(kv.second)); continue; } @@ -422,7 +422,7 @@ const GURL& unsanitized_url) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - if (base::ContainsKey(recordings_.sources, source_id)) + if (base::Contains(recordings_.sources, source_id)) return; const GURL sanitized_url = SanitizeURL(unsanitized_url); @@ -444,7 +444,7 @@ SourceId source_id, const UkmSource::NavigationData& unsanitized_navigation_data) { DCHECK(GetSourceIdType(source_id) == SourceIdType::NAVIGATION_ID); - DCHECK(!base::ContainsKey(recordings_.sources, source_id)); + DCHECK(!base::Contains(recordings_.sources, source_id)); // TODO(csharrison): Consider changing this behavior so the Source isn't event // recorded at all if the final URL in |unsanitized_navigation_data| should // not be recorded. @@ -542,7 +542,7 @@ } if (ShouldRestrictToWhitelistedEntries() && - !base::ContainsKey(whitelisted_entry_hashes_, entry->event_hash)) { + !base::Contains(whitelisted_entry_hashes_, entry->event_hash)) { RecordDroppedEntry(DroppedDataReason::NOT_WHITELISTED); event_aggregate.dropped_due_to_whitelist++; for (auto& metric : entry->metrics)
diff --git a/components/update_client/update_client.cc b/components/update_client/update_client.cc index 369c6d3..1a12e47 100644 --- a/components/update_client/update_client.cc +++ b/components/update_client/update_client.cc
@@ -181,14 +181,14 @@ for (const auto task : tasks_) { const auto ids = task->GetIds(); - if (base::ContainsValue(ids, id)) { + if (base::Contains(ids, id)) { return true; } } for (const auto task : task_queue_) { const auto ids = task->GetIds(); - if (base::ContainsValue(ids, id)) { + if (base::Contains(ids, id)) { return true; } }
diff --git a/components/url_matcher/regex_set_matcher_unittest.cc b/components/url_matcher/regex_set_matcher_unittest.cc index 49d9a57..bd7511d 100644 --- a/components/url_matcher/regex_set_matcher_unittest.cc +++ b/components/url_matcher/regex_set_matcher_unittest.cc
@@ -26,14 +26,14 @@ std::set<StringPattern::ID> result1; matcher.Match("http://abracadabra.com", &result1); EXPECT_EQ(2U, result1.size()); - EXPECT_TRUE(base::ContainsKey(result1, 42)); - EXPECT_TRUE(base::ContainsKey(result1, 239)); + EXPECT_TRUE(base::Contains(result1, 42)); + EXPECT_TRUE(base::Contains(result1, 239)); std::set<StringPattern::ID> result2; matcher.Match("https://abfffffffffffffffffffffffffffffff.fi/cf", &result2); EXPECT_EQ(2U, result2.size()); - EXPECT_TRUE(base::ContainsKey(result2, 17)); - EXPECT_TRUE(base::ContainsKey(result2, 42)); + EXPECT_TRUE(base::Contains(result2, 17)); + EXPECT_TRUE(base::Contains(result2, 42)); std::set<StringPattern::ID> result3; matcher.Match("http://nothing.com/", &result3); @@ -56,7 +56,7 @@ std::set<StringPattern::ID> result2; matcher.Match("http://aaa.net/quaaACK", &result2); EXPECT_EQ(1U, result2.size()); - EXPECT_TRUE(base::ContainsKey(result2, 57)); + EXPECT_TRUE(base::Contains(result2, 57)); } } // namespace url_matcher
diff --git a/components/url_matcher/url_matcher.cc b/components/url_matcher/url_matcher.cc index 207739ed..da99794 100644 --- a/components/url_matcher/url_matcher.cc +++ b/components/url_matcher/url_matcher.cc
@@ -223,7 +223,7 @@ const std::set<StringPattern::ID>& matching_patterns, const GURL& url) const { DCHECK(string_pattern_); - if (!base::ContainsKey(matching_patterns, string_pattern_->id())) + if (!base::Contains(matching_patterns, string_pattern_->id())) return false; // The criteria HOST_CONTAINS, PATH_CONTAINS, QUERY_CONTAINS are based on // a substring match on the raw URL. In case of a match, we need to verify @@ -463,7 +463,7 @@ const std::set<StringPattern::ID>& used_patterns) { auto i = substring_pattern_singletons_.begin(); while (i != substring_pattern_singletons_.end()) { - if (base::ContainsKey(used_patterns, i->first->id())) + if (base::Contains(used_patterns, i->first->id())) ++i; else substring_pattern_singletons_.erase(i++); @@ -471,7 +471,7 @@ i = regex_pattern_singletons_.begin(); while (i != regex_pattern_singletons_.end()) { - if (base::ContainsKey(used_patterns, i->first->id())) + if (base::Contains(used_patterns, i->first->id())) ++i; else regex_pattern_singletons_.erase(i++); @@ -479,7 +479,7 @@ i = origin_and_path_regex_pattern_singletons_.begin(); while (i != origin_and_path_regex_pattern_singletons_.end()) { - if (base::ContainsKey(used_patterns, i->first->id())) + if (base::Contains(used_patterns, i->first->id())) ++i; else origin_and_path_regex_pattern_singletons_.erase(i++); @@ -682,7 +682,7 @@ URLMatcherSchemeFilter::~URLMatcherSchemeFilter() {} bool URLMatcherSchemeFilter::IsMatch(const GURL& url) const { - return base::ContainsValue(filters_, url.scheme()); + return base::Contains(filters_, url.scheme()); } // @@ -773,7 +773,7 @@ // elements are found, no need to verify match that is expected to take more // cycles. for (auto i = query_conditions_.begin(); i != query_conditions_.end(); ++i) { - if (!base::ContainsKey(matching_patterns, i->string_pattern()->id())) + if (!base::Contains(matching_patterns, i->string_pattern()->id())) return false; } for (auto i = query_conditions_.begin(); i != query_conditions_.end(); ++i) {
diff --git a/components/variations/child_process_field_trial_syncer.cc b/components/variations/child_process_field_trial_syncer.cc index 0694ccf..6825bdd 100644 --- a/components/variations/child_process_field_trial_syncer.cc +++ b/components/variations/child_process_field_trial_syncer.cc
@@ -41,7 +41,7 @@ base::FieldTrial::ActiveGroups current_active_trials; base::FieldTrialList::GetActiveFieldTrialGroups(¤t_active_trials); for (const auto& trial : current_active_trials) { - if (!base::ContainsKey(initially_active_trials_set, trial.trial_name)) + if (!base::Contains(initially_active_trials_set, trial.trial_name)) observer_->OnFieldTrialGroupFinalized(trial.trial_name, trial.group_name); } }
diff --git a/components/variations/study_filtering.cc b/components/variations/study_filtering.cc index 9c95beb..93f56b9 100644 --- a/components/variations/study_filtering.cc +++ b/components/variations/study_filtering.cc
@@ -21,7 +21,7 @@ return base::Time::UnixEpoch() + base::TimeDelta::FromSeconds(date_time); } -// Similar to base::ContainsValue(), but specifically for ASCII strings and +// Similar to base::Contains(), but specifically for ASCII strings and // case-insensitive comparison. template <typename Collection> bool ContainsStringIgnoreCaseASCII(const Collection& collection, @@ -59,10 +59,10 @@ // ignored. We do not expect both to be present for Chrome due to server-side // checks. if (filter.form_factor_size() > 0) - return base::ContainsValue(filter.form_factor(), form_factor); + return base::Contains(filter.form_factor(), form_factor); // Omit if we match the blacklist. - return !base::ContainsValue(filter.exclude_form_factor(), form_factor); + return !base::Contains(filter.exclude_form_factor(), form_factor); } bool CheckStudyHardwareClass(const Study::Filter& filter, @@ -99,10 +99,10 @@ // that this means this overrides the exclude_locale in case that ever occurs // (which it shouldn't). if (filter.locale_size() > 0) - return base::ContainsValue(filter.locale(), locale); + return base::Contains(filter.locale(), locale); // Omit if matches any of the exclude entries. - return !base::ContainsValue(filter.exclude_locale(), locale); + return !base::Contains(filter.exclude_locale(), locale); } bool CheckStudyPlatform(const Study::Filter& filter, Study::Platform platform) { @@ -184,10 +184,10 @@ // that this means this overrides the exclude_country in case that ever occurs // (which it shouldn't). if (filter.country_size() > 0) - return base::ContainsValue(filter.country(), country); + return base::Contains(filter.country(), country); // Omit if matches any of the exclude entries. - return !base::ContainsValue(filter.exclude_country(), country); + return !base::Contains(filter.exclude_country(), country); } const std::string& GetClientCountryForStudy( @@ -312,14 +312,14 @@ if (internal::IsStudyExpired(study, client_state.reference_date)) { expired_studies.push_back(&study); - } else if (!base::ContainsKey(created_studies, study.name())) { + } else if (!base::Contains(created_studies, study.name())) { ProcessedStudy::ValidateAndAppendStudy(&study, false, filtered_studies); created_studies.insert(study.name()); } } for (size_t i = 0; i < expired_studies.size(); ++i) { - if (!base::ContainsKey(created_studies, expired_studies[i]->name())) { + if (!base::Contains(created_studies, expired_studies[i]->name())) { ProcessedStudy::ValidateAndAppendStudy(expired_studies[i], true, filtered_studies); }
diff --git a/components/variations/synthetic_trial_registry_unittest.cc b/components/variations/synthetic_trial_registry_unittest.cc index 5e8f0f3..0ab93744 100644 --- a/components/variations/synthetic_trial_registry_unittest.cc +++ b/components/variations/synthetic_trial_registry_unittest.cc
@@ -175,11 +175,11 @@ std::string trial1_hash = base::StringPrintf("%x-%x", trial1.id.name, trial1.id.group); - EXPECT_TRUE(base::ContainsValue(output, trial1_hash)); + EXPECT_TRUE(base::Contains(output, trial1_hash)); std::string trial2_hash = base::StringPrintf("%x-%x", trial2.id.name, trial2.id.group); - EXPECT_TRUE(base::ContainsValue(output, trial2_hash)); + EXPECT_TRUE(base::Contains(output, trial2_hash)); } } // namespace variations
diff --git a/components/viz/client/frame_eviction_manager.cc b/components/viz/client/frame_eviction_manager.cc index 86c3ed6..86434925 100644 --- a/components/viz/client/frame_eviction_manager.cc +++ b/components/viz/client/frame_eviction_manager.cc
@@ -47,7 +47,7 @@ } void FrameEvictionManager::LockFrame(FrameEvictionManagerClient* frame) { - if (base::ContainsValue(unlocked_frames_, frame)) { + if (base::Contains(unlocked_frames_, frame)) { DCHECK(locked_frames_.find(frame) == locked_frames_.end()); unlocked_frames_.remove(frame); locked_frames_[frame] = 1;
diff --git a/components/viz/common/frame_sinks/begin_frame_source.cc b/components/viz/common/frame_sinks/begin_frame_source.cc index 18654a5..ef3deb9 100644 --- a/components/viz/common/frame_sinks/begin_frame_source.cc +++ b/components/viz/common/frame_sinks/begin_frame_source.cc
@@ -172,7 +172,7 @@ void BackToBackBeginFrameSource::AddObserver(BeginFrameObserver* obs) { DCHECK(obs); - DCHECK(!base::ContainsKey(observers_, obs)); + DCHECK(!base::Contains(observers_, obs)); observers_.insert(obs); pending_begin_frame_observers_.insert(obs); obs->OnBeginFrameSourcePausedChanged(false); @@ -181,7 +181,7 @@ void BackToBackBeginFrameSource::RemoveObserver(BeginFrameObserver* obs) { DCHECK(obs); - DCHECK(base::ContainsKey(observers_, obs)); + DCHECK(base::Contains(observers_, obs)); observers_.erase(obs); pending_begin_frame_observers_.erase(obs); if (pending_begin_frame_observers_.empty()) @@ -189,7 +189,7 @@ } void BackToBackBeginFrameSource::DidFinishFrame(BeginFrameObserver* obs) { - if (base::ContainsKey(observers_, obs)) { + if (base::Contains(observers_, obs)) { pending_begin_frame_observers_.insert(obs); time_source_->SetActive(true); } @@ -277,7 +277,7 @@ void DelayBasedBeginFrameSource::AddObserver(BeginFrameObserver* obs) { DCHECK(obs); - DCHECK(!base::ContainsKey(observers_, obs)); + DCHECK(!base::Contains(observers_, obs)); observers_.insert(obs); obs->OnBeginFrameSourcePausedChanged(false); @@ -304,7 +304,7 @@ void DelayBasedBeginFrameSource::RemoveObserver(BeginFrameObserver* obs) { DCHECK(obs); - DCHECK(base::ContainsKey(observers_, obs)); + DCHECK(base::Contains(observers_, obs)); observers_.erase(obs); if (observers_.empty()) @@ -375,7 +375,7 @@ void ExternalBeginFrameSource::AddObserver(BeginFrameObserver* obs) { DCHECK(obs); - DCHECK(!base::ContainsKey(observers_, obs)); + DCHECK(!base::Contains(observers_, obs)); bool observers_was_empty = observers_.empty(); observers_.insert(obs); @@ -393,7 +393,7 @@ void ExternalBeginFrameSource::RemoveObserver(BeginFrameObserver* obs) { DCHECK(obs); - DCHECK(base::ContainsKey(observers_, obs)); + DCHECK(base::Contains(observers_, obs)); observers_.erase(obs); if (observers_.empty())
diff --git a/components/viz/common/gpu/vulkan_in_process_context_provider.cc b/components/viz/common/gpu/vulkan_in_process_context_provider.cc index 2204a042..f8e8599 100644 --- a/components/viz/common/gpu/vulkan_in_process_context_provider.cc +++ b/components/viz/common/gpu/vulkan_in_process_context_provider.cc
@@ -80,10 +80,7 @@ device_extensions.size(), device_extensions.data()); backend_context.fVkExtensions = &gr_extensions; - // TODO(samans): Get rid of the const_cast once GrVkBackendTexture is updated - // to take a const value. - backend_context.fDeviceFeatures = const_cast<VkPhysicalDeviceFeatures*>( - &device_queue_->enabled_device_features()); + backend_context.fDeviceFeatures = &device_queue_->enabled_device_features(); backend_context.fGetProc = get_proc; gr_context_ = GrContext::MakeVulkan(backend_context);
diff --git a/components/viz/host/host_frame_sink_manager.cc b/components/viz/host/host_frame_sink_manager.cc index bff37f4..421a906 100644 --- a/components/viz/host/host_frame_sink_manager.cc +++ b/components/viz/host/host_frame_sink_manager.cc
@@ -223,11 +223,11 @@ child_frame_sink_id); FrameSinkData& child_data = frame_sink_data_map_[child_frame_sink_id]; - DCHECK(!base::ContainsValue(child_data.parents, parent_frame_sink_id)); + DCHECK(!base::Contains(child_data.parents, parent_frame_sink_id)); child_data.parents.push_back(parent_frame_sink_id); FrameSinkData& parent_data = iter->second; - DCHECK(!base::ContainsValue(parent_data.children, child_frame_sink_id)); + DCHECK(!base::Contains(parent_data.children, child_frame_sink_id)); parent_data.children.push_back(child_frame_sink_id); return true; @@ -238,11 +238,11 @@ const FrameSinkId& child_frame_sink_id) { // Unregister and clear the stored parent. FrameSinkData& child_data = frame_sink_data_map_[child_frame_sink_id]; - DCHECK(base::ContainsValue(child_data.parents, parent_frame_sink_id)); + DCHECK(base::Contains(child_data.parents, parent_frame_sink_id)); base::Erase(child_data.parents, parent_frame_sink_id); FrameSinkData& parent_data = frame_sink_data_map_[parent_frame_sink_id]; - DCHECK(base::ContainsValue(parent_data.children, child_frame_sink_id)); + DCHECK(base::Contains(parent_data.children, child_frame_sink_id)); base::Erase(parent_data.children, child_frame_sink_id); frame_sink_manager_->UnregisterFrameSinkHierarchy(parent_frame_sink_id, @@ -263,7 +263,7 @@ const FrameSinkId& child_frame_sink_id) const { auto iter = frame_sink_data_map_.find(parent_frame_sink_id); return iter != frame_sink_data_map_.end() && - base::ContainsValue(iter->second.children, child_frame_sink_id); + base::Contains(iter->second.children, child_frame_sink_id); } base::Optional<FrameSinkId> HostFrameSinkManager::FindRootFrameSinkId(
diff --git a/components/viz/service/display/display_resource_provider.cc b/components/viz/service/display/display_resource_provider.cc index 197c2cd9..2bf8113 100644 --- a/components/viz/service/display/display_resource_provider.cc +++ b/components/viz/service/display/display_resource_provider.cc
@@ -936,7 +936,7 @@ ResourceMetadata DisplayResourceProvider::LockSetForExternalUse::LockResource( ResourceId id) { - DCHECK(!base::ContainsValue(resources_, id)); + DCHECK(!base::Contains(resources_, id)); resources_.push_back(id); return resource_provider_->LockForExternalUse(id); }
diff --git a/components/viz/service/display/display_scheduler_unittest.cc b/components/viz/service/display/display_scheduler_unittest.cc index 365b88c..5a62e6d 100644 --- a/components/viz/service/display/display_scheduler_unittest.cc +++ b/components/viz/service/display/display_scheduler_unittest.cc
@@ -43,7 +43,7 @@ } bool SurfaceHasUnackedFrame(const SurfaceId& surface_id) const override { - return base::ContainsKey(undrawn_surfaces_, surface_id); + return base::Contains(undrawn_surfaces_, surface_id); } bool SurfaceDamaged(const SurfaceId& surface_id,
diff --git a/components/viz/service/display/draw_polygon_unittest.cc b/components/viz/service/display/draw_polygon_unittest.cc index 1f9d201..bb762d3 100644 --- a/components/viz/service/display/draw_polygon_unittest.cc +++ b/components/viz/service/display/draw_polygon_unittest.cc
@@ -531,8 +531,8 @@ EXPECT_TRUE(back_polygon != nullptr); for (auto vertex : vertices_b) { - EXPECT_TRUE(base::ContainsValue(front_polygon->points(), vertex) || - base::ContainsValue(back_polygon->points(), vertex)); + EXPECT_TRUE(base::Contains(front_polygon->points(), vertex) || + base::Contains(back_polygon->points(), vertex)); } } @@ -594,8 +594,8 @@ EXPECT_EQ(3u, second_back_polygon->points().size()); for (auto vertex : saved_back_polygon_vertices) { - EXPECT_TRUE(base::ContainsValue(second_front_polygon->points(), vertex) || - base::ContainsValue(second_back_polygon->points(), vertex)); + EXPECT_TRUE(base::Contains(second_front_polygon->points(), vertex) || + base::Contains(second_back_polygon->points(), vertex)); } }
diff --git a/components/viz/service/display/overlay_candidate.cc b/components/viz/service/display/overlay_candidate.cc index 6745a99..75f797e 100644 --- a/components/viz/service/display/overlay_candidate.cc +++ b/components/viz/service/display/overlay_candidate.cc
@@ -229,7 +229,7 @@ candidate->format = resource_provider->GetBufferFormat(resource_id); candidate->color_space = resource_provider->GetColorSpace(resource_id); - if (!base::ContainsValue(kOverlayFormats, candidate->format)) + if (!base::Contains(kOverlayFormats, candidate->format)) return false; gfx::OverlayTransform overlay_transform = GetOverlayTransform(
diff --git a/components/viz/service/display/surface_aggregator.cc b/components/viz/service/display/surface_aggregator.cc index 72e39af..9a721e7 100644 --- a/components/viz/service/display/surface_aggregator.cc +++ b/components/viz/service/display/surface_aggregator.cc
@@ -1177,7 +1177,7 @@ moved_pixel_passes_.insert(remapped_pass_id); bool in_moved_pixel_pass = has_pixel_moving_filter || - base::ContainsKey(moved_pixel_passes_, remapped_pass_id); + base::Contains(moved_pixel_passes_, remapped_pass_id); for (auto* quad : render_pass->quad_list) { if (quad->material == DrawQuad::Material::kSurfaceContent) {
diff --git a/components/viz/service/display_embedder/output_device_backing.cc b/components/viz/service/display_embedder/output_device_backing.cc index 68e3aca8..f261cf0 100644 --- a/components/viz/service/display_embedder/output_device_backing.cc +++ b/components/viz/service/display_embedder/output_device_backing.cc
@@ -58,7 +58,7 @@ } void OutputDeviceBacking::UnregisterClient(Client* client) { - DCHECK(base::ContainsValue(clients_, client)); + DCHECK(base::Contains(clients_, client)); base::Erase(clients_, client); ClientResized(); }
diff --git a/components/viz/service/display_embedder/server_shared_bitmap_manager.cc b/components/viz/service/display_embedder/server_shared_bitmap_manager.cc index dbb18dc..9a8fabb 100644 --- a/components/viz/service/display_embedder/server_shared_bitmap_manager.cc +++ b/components/viz/service/display_embedder/server_shared_bitmap_manager.cc
@@ -114,7 +114,7 @@ DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); // Duplicate ids are not allowed. - if (base::ContainsKey(handle_map_, id)) + if (base::Contains(handle_map_, id)) return false; // This function handles public API requests, so verify we unwrapped a shared
diff --git a/components/viz/service/display_embedder/skia_output_surface_impl.cc b/components/viz/service/display_embedder/skia_output_surface_impl.cc index ebc449c..03f476ed 100644 --- a/components/viz/service/display_embedder/skia_output_surface_impl.cc +++ b/components/viz/service/display_embedder/skia_output_surface_impl.cc
@@ -449,7 +449,6 @@ } void SkiaOutputSurfaceImpl::RemoveRenderPassResource( - std::vector<RenderPassId> ids) { DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); DCHECK(!ids.empty()); @@ -458,18 +457,23 @@ image_contexts.reserve(ids.size()); for (const auto id : ids) { auto it = render_pass_image_cache_.find(id); - DCHECK(it != render_pass_image_cache_.end()); - it->second->image = nullptr; - image_contexts.push_back(std::move(it->second)); - render_pass_image_cache_.erase(it); + // TODO(sgilhuly): This is a speculative fix for https://crbug.com/926194. + // Find out the cause of the crash and create a test that would repro it. + if (it != render_pass_image_cache_.end()) { + it->second->image = nullptr; + image_contexts.push_back(std::move(it->second)); + render_pass_image_cache_.erase(it); + } } // impl_on_gpu_ is released on the GPU thread by a posted task from // SkiaOutputSurfaceImpl::dtor. So it is safe to use base::Unretained. - auto callback = base::BindOnce( - &SkiaOutputSurfaceImplOnGpu::RemoveRenderPassResource, - base::Unretained(impl_on_gpu_.get()), std::move(image_contexts)); - ScheduleGpuTask(std::move(callback), std::vector<gpu::SyncToken>()); + if (!image_contexts.empty()) { + auto callback = base::BindOnce( + &SkiaOutputSurfaceImplOnGpu::RemoveRenderPassResource, + base::Unretained(impl_on_gpu_.get()), std::move(image_contexts)); + ScheduleGpuTask(std::move(callback), std::vector<gpu::SyncToken>()); + } } void SkiaOutputSurfaceImpl::CopyOutput(
diff --git a/components/viz/service/frame_sinks/compositor_frame_sink_support.cc b/components/viz/service/frame_sinks/compositor_frame_sink_support.cc index 8f028bb2..a6a6c94 100644 --- a/components/viz/service/frame_sinks/compositor_frame_sink_support.cc +++ b/components/viz/service/frame_sinks/compositor_frame_sink_support.cc
@@ -682,7 +682,7 @@ void CompositorFrameSinkSupport::AttachCaptureClient( CapturableFrameSink::Client* client) { - DCHECK(!base::ContainsValue(capture_clients_, client)); + DCHECK(!base::Contains(capture_clients_, client)); capture_clients_.push_back(client); }
diff --git a/components/viz/service/frame_sinks/frame_sink_manager_impl.cc b/components/viz/service/frame_sinks/frame_sink_manager_impl.cc index 3222d09..b9fde8e 100644 --- a/components/viz/service/frame_sinks/frame_sink_manager_impl.cc +++ b/components/viz/service/frame_sinks/frame_sink_manager_impl.cc
@@ -120,7 +120,7 @@ void FrameSinkManagerImpl::RegisterFrameSinkId(const FrameSinkId& frame_sink_id, bool report_activation) { DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); - DCHECK(!base::ContainsKey(frame_sink_data_, frame_sink_id)); + DCHECK(!base::Contains(frame_sink_data_, frame_sink_id)); frame_sink_data_.emplace(std::make_pair(frame_sink_id, report_activation)); @@ -169,7 +169,7 @@ void FrameSinkManagerImpl::CreateRootCompositorFrameSink( mojom::RootCompositorFrameSinkParamsPtr params) { DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); - DCHECK(!base::ContainsKey(root_sink_map_, params->frame_sink_id)); + DCHECK(!base::Contains(root_sink_map_, params->frame_sink_id)); DCHECK(output_surface_provider_); // We are transfering ownership of |params| so remember FrameSinkId here. @@ -188,7 +188,7 @@ mojom::CompositorFrameSinkRequest request, mojom::CompositorFrameSinkClientPtr client) { DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); - DCHECK(!base::ContainsKey(sink_map_, frame_sink_id)); + DCHECK(!base::Contains(sink_map_, frame_sink_id)); sink_map_[frame_sink_id] = std::make_unique<CompositorFrameSinkImpl>( this, frame_sink_id, std::move(request), std::move(client)); @@ -210,7 +210,7 @@ CHECK(!ChildContains(child_frame_sink_id, parent_frame_sink_id)); auto& children = frame_sink_source_map_[parent_frame_sink_id].children; - DCHECK(!base::ContainsKey(children, child_frame_sink_id)); + DCHECK(!base::Contains(children, child_frame_sink_id)); children.insert(child_frame_sink_id); for (auto& observer : observer_list_) { @@ -248,7 +248,7 @@ // Remove |child_frame_sink_id| from parents list of children. auto& mapping = iter->second; - DCHECK(base::ContainsKey(mapping.children, child_frame_sink_id)); + DCHECK(base::Contains(mapping.children, child_frame_sink_id)); mapping.children.erase(child_frame_sink_id); // Delete the FrameSinkSourceMapping for |parent_frame_sink_id| if empty. @@ -313,7 +313,7 @@ const std::vector<FrameSinkId>& hit_test_async_queried_debug_queue) { hit_test_manager_.SetHitTestAsyncQueriedDebugRegions( root_frame_sink_id, hit_test_async_queried_debug_queue); - DCHECK(base::ContainsKey(root_sink_map_, root_frame_sink_id)); + DCHECK(base::Contains(root_sink_map_, root_frame_sink_id)); root_sink_map_[root_frame_sink_id]->ForceImmediateDrawAndSwapIfPossible(); } @@ -390,7 +390,7 @@ const FrameSinkId& frame_sink_id, CompositorFrameSinkSupport* support) { DCHECK(support); - DCHECK(!base::ContainsKey(support_map_, frame_sink_id)); + DCHECK(!base::Contains(support_map_, frame_sink_id)); support_map_[frame_sink_id] = support; @@ -409,7 +409,7 @@ void FrameSinkManagerImpl::UnregisterCompositorFrameSinkSupport( const FrameSinkId& frame_sink_id) { - DCHECK(base::ContainsKey(support_map_, frame_sink_id)); + DCHECK(base::Contains(support_map_, frame_sink_id)); for (auto& observer : observer_list_) observer.OnDestroyedCompositorFrameSink(frame_sink_id);
diff --git a/components/viz/service/frame_sinks/frame_sink_manager_unittest.cc b/components/viz/service/frame_sinks/frame_sink_manager_unittest.cc index f4af32d..62aa869c 100644 --- a/components/viz/service/frame_sinks/frame_sink_manager_unittest.cc +++ b/components/viz/service/frame_sinks/frame_sink_manager_unittest.cc
@@ -78,8 +78,8 @@ // Checks if a [Root]CompositorFrameSinkImpl exists for |frame_sink_id|. bool CompositorFrameSinkExists(const FrameSinkId& frame_sink_id) { - return base::ContainsKey(manager_.sink_map_, frame_sink_id) || - base::ContainsKey(manager_.root_sink_map_, frame_sink_id); + return base::Contains(manager_.sink_map_, frame_sink_id) || + base::Contains(manager_.root_sink_map_, frame_sink_id); } // testing::Test implementation.
diff --git a/components/viz/test/test_gles2_interface.cc b/components/viz/test/test_gles2_interface.cc index cd04f69..9af2c69 100644 --- a/components/viz/test/test_gles2_interface.cc +++ b/components/viz/test/test_gles2_interface.cc
@@ -113,7 +113,7 @@ if (!texture) return; - DCHECK(base::ContainsKey(textures_, texture)); + DCHECK(base::Contains(textures_, texture)); used_textures_.insert(texture); } @@ -600,7 +600,7 @@ } void TestGLES2Interface::RetireFramebufferId(GLuint id) { - DCHECK(base::ContainsKey(framebuffer_set_, id)); + DCHECK(base::Contains(framebuffer_set_, id)); framebuffer_set_.erase(id); } @@ -613,7 +613,7 @@ } void TestGLES2Interface::RetireRenderbufferId(GLuint id) { - DCHECK(base::ContainsKey(renderbuffer_set_, id)); + DCHECK(base::Contains(renderbuffer_set_, id)); renderbuffer_set_.erase(id); }
diff --git a/components/viz/test/test_gles2_interface.h b/components/viz/test/test_gles2_interface.h index abe8e95..f722c30 100644 --- a/components/viz/test/test_gles2_interface.h +++ b/components/viz/test/test_gles2_interface.h
@@ -108,7 +108,7 @@ size_t NumUsedTextures() const { return used_textures_.size(); } bool UsedTexture(int texture) const { - return base::ContainsKey(used_textures_, texture); + return base::Contains(used_textures_, texture); } void ResetUsedTextures() { used_textures_.clear(); }
diff --git a/components/viz/test/test_gpu_service_holder.cc b/components/viz/test/test_gpu_service_holder.cc index eaf0a28..3245a4d 100644 --- a/components/viz/test/test_gpu_service_holder.cc +++ b/components/viz/test/test_gpu_service_holder.cc
@@ -75,10 +75,8 @@ } if (!g_holder) { - g_holder = new TestGpuServiceHolder( - gpu::gles2::ParseGpuPreferences(base::CommandLine::ForCurrentProcess()), - !base::CommandLine::ForCurrentProcess()->HasSwitch( - switches::kUseGpuInTests)); + g_holder = new TestGpuServiceHolder(gpu::gles2::ParseGpuPreferences( + base::CommandLine::ForCurrentProcess())); } return g_holder; } @@ -104,17 +102,16 @@ } TestGpuServiceHolder::TestGpuServiceHolder( - const gpu::GpuPreferences& gpu_preferences, - bool use_swiftshader_for_vulkan) + const gpu::GpuPreferences& gpu_preferences) : gpu_thread_("GPUMainThread"), io_thread_("GPUIOThread") { CHECK(gpu_thread_.Start()); CHECK(io_thread_.Start()); base::WaitableEvent completion; gpu_thread_.task_runner()->PostTask( - FROM_HERE, base::BindOnce(&TestGpuServiceHolder::InitializeOnGpuThread, - base::Unretained(this), gpu_preferences, - use_swiftshader_for_vulkan, &completion)); + FROM_HERE, + base::BindOnce(&TestGpuServiceHolder::InitializeOnGpuThread, + base::Unretained(this), gpu_preferences, &completion)); completion.Wait(); } @@ -129,22 +126,23 @@ void TestGpuServiceHolder::InitializeOnGpuThread( const gpu::GpuPreferences& gpu_preferences, - bool use_swiftshader_for_vulkan, base::WaitableEvent* completion) { DCHECK(gpu_thread_.task_runner()->BelongsToCurrentThread()); - if (gpu_preferences.enable_vulkan) { + if (gpu_preferences.use_vulkan != gpu::VulkanImplementationName::kNone) { #if BUILDFLAG(ENABLE_VULKAN) + bool use_swiftshader = gpu_preferences.use_vulkan == + gpu::VulkanImplementationName::kSwiftshader; + #ifndef USE_X11 // TODO(samans): Support Swiftshader on more platforms. // https://crbug.com/963988 - LOG_IF(ERROR, use_swiftshader_for_vulkan) + LOG_IF(ERROR, use_swiftshader) << "Unable to use Vulkan Swiftshader on this platform. Falling back to " "GPU."; - use_swiftshader_for_vulkan = false; + use_swiftshader = false; #endif - vulkan_implementation_ = - gpu::CreateVulkanImplementation(use_swiftshader_for_vulkan); + vulkan_implementation_ = gpu::CreateVulkanImplementation(use_swiftshader); if (!vulkan_implementation_ || !vulkan_implementation_->InitializeVulkanInstance( !gpu_preferences.disable_vulkan_surface)) {
diff --git a/components/viz/test/test_gpu_service_holder.h b/components/viz/test/test_gpu_service_holder.h index b577013..0ac1ba92 100644 --- a/components/viz/test/test_gpu_service_holder.h +++ b/components/viz/test/test_gpu_service_holder.h
@@ -54,8 +54,7 @@ // more than once. static void DestroyInstanceAfterEachTest(); - TestGpuServiceHolder(const gpu::GpuPreferences& preferences, - bool use_swiftshader_for_vulkan); + explicit TestGpuServiceHolder(const gpu::GpuPreferences& preferences); ~TestGpuServiceHolder(); scoped_refptr<base::SingleThreadTaskRunner> gpu_thread_task_runner() { @@ -82,7 +81,6 @@ friend struct base::DefaultSingletonTraits<TestGpuServiceHolder>; void InitializeOnGpuThread(const gpu::GpuPreferences& preferences, - bool use_swiftshader_for_vulkan, base::WaitableEvent* completion); void DeleteOnGpuThread();
diff --git a/content/app_shim_remote_cocoa/render_widget_host_view_cocoa.mm b/content/app_shim_remote_cocoa/render_widget_host_view_cocoa.mm index 03c722b..f70ed3d 100644 --- a/content/app_shim_remote_cocoa/render_widget_host_view_cocoa.mm +++ b/content/app_shim_remote_cocoa/render_widget_host_view_cocoa.mm
@@ -1571,8 +1571,7 @@ } - (NSRange)selectedRange { - return NSMakeRange(textSelectionRange_.GetMin() + textSelectionOffset_, - textSelectionRange_.length()); + return textSelectionRange_.ToNSRange(); } - (NSRange)markedRange {
diff --git a/content/browser/accessibility/accessibility_win_browsertest.cc b/content/browser/accessibility/accessibility_win_browsertest.cc index 48745274..32f42b2 100644 --- a/content/browser/accessibility/accessibility_win_browsertest.cc +++ b/content/browser/accessibility/accessibility_win_browsertest.cc
@@ -1189,6 +1189,165 @@ } IN_PROC_BROWSER_TEST_F(AccessibilityWinBrowserTest, + TestAccSelectionWithNoSelectedItems) { + LoadInitialAccessibilityTreeFromHtml(R"HTML( +<div role="listbox" aria-expanded="true"> +<div role="option" aria-selected="false"> +Option 1 +</div> +<div role="option" aria-selected="false"> +Option 2 +</div> +<div aria-selected="false"> +Option 3 +</div> +</div> + )HTML"); + + Microsoft::WRL::ComPtr<IAccessible> document(GetRendererAccessible()); + ASSERT_TRUE(document); + std::vector<base::win::ScopedVariant> document_children = + GetAllAccessibleChildren(document.Get()); + ASSERT_EQ(1u, document_children.size()); + + Microsoft::WRL::ComPtr<IAccessible2> listbox; + ASSERT_HRESULT_SUCCEEDED(QueryIAccessible2( + GetAccessibleFromVariant(document.Get(), document_children[0].AsInput()) + .Get(), + &listbox)); + LONG listbox_role = 0; + ASSERT_HRESULT_SUCCEEDED(listbox->role(&listbox_role)); + ASSERT_EQ(ROLE_SYSTEM_LIST, listbox_role); + + base::win::ScopedVariant selected; + ASSERT_HRESULT_SUCCEEDED(listbox->get_accSelection(selected.Receive())); + EXPECT_EQ(VT_EMPTY, selected.type()); +} + +IN_PROC_BROWSER_TEST_F(AccessibilityWinBrowserTest, + TestAccSelectionWithOneSelectedItem) { + LoadInitialAccessibilityTreeFromHtml(R"HTML( +<div role="listbox" aria-expanded="true"> +<div role="option" aria-selected="false"> +Option 1 +</div> +<div role="option" aria-selected="true"> +Option 2 +</div> +<div aria-selected="false"> +Option 3 +</div> +</div> + )HTML"); + + Microsoft::WRL::ComPtr<IAccessible> document(GetRendererAccessible()); + ASSERT_TRUE(document); + std::vector<base::win::ScopedVariant> document_children = + GetAllAccessibleChildren(document.Get()); + ASSERT_EQ(1u, document_children.size()); + + Microsoft::WRL::ComPtr<IAccessible2> listbox; + ASSERT_HRESULT_SUCCEEDED(QueryIAccessible2( + GetAccessibleFromVariant(document.Get(), document_children[0].AsInput()) + .Get(), + &listbox)); + LONG listbox_role = 0; + ASSERT_HRESULT_SUCCEEDED(listbox->role(&listbox_role)); + ASSERT_EQ(ROLE_SYSTEM_LIST, listbox_role); + + base::win::ScopedVariant selected; + ASSERT_HRESULT_SUCCEEDED(listbox->get_accSelection(selected.Receive())); + ASSERT_EQ(VT_DISPATCH, selected.type()); + + base::win::ScopedVariant childid_self(CHILDID_SELF); + Microsoft::WRL::ComPtr<IAccessible2> option; + ASSERT_HRESULT_SUCCEEDED( + V_DISPATCH(selected.AsInput())->QueryInterface(IID_PPV_ARGS(&option))); + LONG option_role = 0; + EXPECT_HRESULT_SUCCEEDED(option->role(&option_role)); + EXPECT_EQ(ROLE_SYSTEM_LISTITEM, option_role); + base::win::ScopedBstr option_name; + EXPECT_HRESULT_SUCCEEDED( + option->get_accName(childid_self, option_name.Receive())); + EXPECT_STREQ(L"Option 2", static_cast<BSTR>(option_name)); +} + +IN_PROC_BROWSER_TEST_F(AccessibilityWinBrowserTest, + TestAccSelectionWithMultipleSelectedItems) { + LoadInitialAccessibilityTreeFromHtml(R"HTML( +<div role="listbox" aria-expanded="true"> +<div role="option" aria-selected="true"> +Option 1 +</div> +<div role="option" aria-selected="true"> +Option 2 +</div> +<div aria-selected="false"> +Option 3 +</div> +</div> + )HTML"); + + Microsoft::WRL::ComPtr<IAccessible> document(GetRendererAccessible()); + ASSERT_TRUE(document); + std::vector<base::win::ScopedVariant> document_children = + GetAllAccessibleChildren(document.Get()); + ASSERT_EQ(1u, document_children.size()); + + Microsoft::WRL::ComPtr<IAccessible2> listbox; + ASSERT_HRESULT_SUCCEEDED(QueryIAccessible2( + GetAccessibleFromVariant(document.Get(), document_children[0].AsInput()) + .Get(), + &listbox)); + LONG listbox_role = 0; + ASSERT_HRESULT_SUCCEEDED(listbox->role(&listbox_role)); + ASSERT_EQ(ROLE_SYSTEM_LIST, listbox_role); + + base::win::ScopedVariant selected; + ASSERT_HRESULT_SUCCEEDED(listbox->get_accSelection(selected.Receive())); + ASSERT_EQ(VT_UNKNOWN, selected.type()); + + Microsoft::WRL::ComPtr<IEnumVARIANT> enum_variant; + ASSERT_HRESULT_SUCCEEDED(V_UNKNOWN(selected.AsInput()) + ->QueryInterface(IID_PPV_ARGS(&enum_variant))); + + selected.Release(); + ASSERT_HRESULT_SUCCEEDED(enum_variant->Next(1, selected.Receive(), nullptr)); + ASSERT_EQ(VT_DISPATCH, selected.type()); + + base::win::ScopedVariant childid_self(CHILDID_SELF); + { + Microsoft::WRL::ComPtr<IAccessible2> option; + ASSERT_HRESULT_SUCCEEDED( + V_DISPATCH(selected.AsInput())->QueryInterface(IID_PPV_ARGS(&option))); + LONG option_role = 0; + EXPECT_HRESULT_SUCCEEDED(option->role(&option_role)); + EXPECT_EQ(ROLE_SYSTEM_LISTITEM, option_role); + base::win::ScopedBstr option_name; + EXPECT_HRESULT_SUCCEEDED( + option->get_accName(childid_self, option_name.Receive())); + EXPECT_STREQ(L"Option 1", static_cast<BSTR>(option_name)); + } + + selected.Release(); + ASSERT_HRESULT_SUCCEEDED(enum_variant->Next(1, selected.Receive(), nullptr)); + ASSERT_EQ(VT_DISPATCH, selected.type()); + + { + Microsoft::WRL::ComPtr<IAccessible2> option; + ASSERT_HRESULT_SUCCEEDED( + V_DISPATCH(selected.AsInput())->QueryInterface(IID_PPV_ARGS(&option))); + LONG option_role = 0; + EXPECT_HRESULT_SUCCEEDED(option->role(&option_role)); + EXPECT_EQ(ROLE_SYSTEM_LISTITEM, option_role); + base::win::ScopedBstr option_name; + EXPECT_HRESULT_SUCCEEDED( + option->get_accName(childid_self, option_name.Receive())); + EXPECT_STREQ(L"Option 2", static_cast<BSTR>(option_name)); + } +} + +IN_PROC_BROWSER_TEST_F(AccessibilityWinBrowserTest, TestCharacterExtentsWithInvalidArguments) { Microsoft::WRL::ComPtr<IAccessibleText> paragraph_text; SetUpSampleParagraph(¶graph_text);
diff --git a/content/browser/appcache/appcache_request_handler.cc b/content/browser/appcache/appcache_request_handler.cc index 023b98c..7d44c72 100644 --- a/content/browser/appcache/appcache_request_handler.cc +++ b/content/browser/appcache/appcache_request_handler.cc
@@ -347,8 +347,8 @@ DCHECK(host_); if (storage()->IsInitialized() && - !base::ContainsKey(*service_->storage()->usage_map(), - url::Origin::Create(request_->GetURL()))) { + !base::Contains(*service_->storage()->usage_map(), + url::Origin::Create(request_->GetURL()))) { return nullptr; }
diff --git a/content/browser/appcache/appcache_update_job.cc b/content/browser/appcache/appcache_update_job.cc index 220ef99e..5dbf5b8a 100644 --- a/content/browser/appcache/appcache_update_job.cc +++ b/content/browser/appcache/appcache_update_job.cc
@@ -211,7 +211,7 @@ DCHECK(!new_master_resource.has_ref()); DCHECK(new_master_resource.GetOrigin() == manifest_url_.GetOrigin()); - if (base::ContainsKey(failed_master_entries_, new_master_resource)) + if (base::Contains(failed_master_entries_, new_master_resource)) return; // Cannot add more to this update if already terminating.
diff --git a/content/browser/appcache/appcache_update_job_unittest.cc b/content/browser/appcache/appcache_update_job_unittest.cc index ed99369..0626a22 100644 --- a/content/browser/appcache/appcache_update_job_unittest.cc +++ b/content/browser/appcache/appcache_update_job_unittest.cc
@@ -3572,13 +3572,12 @@ if (expect_old_cache_) { EXPECT_NE(expect_old_cache_, group_->newest_complete_cache()); - EXPECT_TRUE( - base::ContainsValue(group_->old_caches(), expect_old_cache_)); + EXPECT_TRUE(base::Contains(group_->old_caches(), expect_old_cache_)); } if (expect_newest_cache_) { EXPECT_EQ(expect_newest_cache_, group_->newest_complete_cache()); EXPECT_FALSE( - base::ContainsValue(group_->old_caches(), expect_newest_cache_)); + base::Contains(group_->old_caches(), expect_newest_cache_)); } else { // Tests that don't know which newest cache to expect contain updates // that succeed (because the update creates a new cache whose pointer
diff --git a/content/browser/background_sync/background_sync_context_impl.cc b/content/browser/background_sync/background_sync_context_impl.cc index 2722828..66a9ed4 100644 --- a/content/browser/background_sync/background_sync_context_impl.cc +++ b/content/browser/background_sync/background_sync_context_impl.cc
@@ -87,7 +87,7 @@ void BackgroundSyncContextImpl::ServiceHadConnectionError( BackgroundSyncServiceImpl* service) { DCHECK_CURRENTLY_ON(BrowserThread::IO); - DCHECK(base::ContainsKey(services_, service)); + DCHECK(base::Contains(services_, service)); services_.erase(service); }
diff --git a/content/browser/background_sync/background_sync_manager.cc b/content/browser/background_sync/background_sync_manager.cc index a60da5e..3b4c6fed 100644 --- a/content/browser/background_sync/background_sync_manager.cc +++ b/content/browser/background_sync/background_sync_manager.cc
@@ -1232,7 +1232,7 @@ if (clock_->Now() < registration.delay_until()) return false; - if (base::ContainsKey(emulated_offline_sw_, service_worker_id)) + if (base::Contains(emulated_offline_sw_, service_worker_id)) return false; return AreOptionConditionsMet(); @@ -1725,7 +1725,7 @@ if (!network_observer_->NetworkSufficient()) return blink::ServiceWorkerStatusCode::kErrorEventWaitUntilRejected; int64_t registration_id = active_version->registration_id(); - if (base::ContainsKey(emulated_offline_sw_, registration_id)) + if (base::Contains(emulated_offline_sw_, registration_id)) return blink::ServiceWorkerStatusCode::kErrorEventWaitUntilRejected; return blink::ServiceWorkerStatusCode::kOk; }
diff --git a/content/browser/blob_storage/blob_dispatcher_host.cc b/content/browser/blob_storage/blob_dispatcher_host.cc index 9de9c3f..eaf61f5d 100644 --- a/content/browser/blob_storage/blob_dispatcher_host.cc +++ b/content/browser/blob_storage/blob_dispatcher_host.cc
@@ -113,7 +113,7 @@ } bool BlobDispatcherHost::IsUrlRegisteredInHost(const GURL& blob_url) { - return base::ContainsKey(public_blob_urls_, blob_url); + return base::Contains(public_blob_urls_, blob_url); } void BlobDispatcherHost::ClearHostFromBlobStorageContext() {
diff --git a/content/browser/bluetooth/bluetooth_allowed_devices.cc b/content/browser/bluetooth/bluetooth_allowed_devices.cc index 862e1b0..ae07c9d 100644 --- a/content/browser/bluetooth/bluetooth_allowed_devices.cc +++ b/content/browser/bluetooth/bluetooth_allowed_devices.cc
@@ -113,7 +113,7 @@ return id_iter == device_id_to_services_map_.end() ? false - : base::ContainsKey(id_iter->second, service_uuid); + : base::Contains(id_iter->second, service_uuid); } bool BluetoothAllowedDevices::IsAllowedToGATTConnect( @@ -126,7 +126,7 @@ blink::WebBluetoothDeviceId BluetoothAllowedDevices::GenerateUniqueDeviceId() { blink::WebBluetoothDeviceId device_id = blink::WebBluetoothDeviceId::Create(); - while (base::ContainsKey(device_id_set_, device_id)) { + while (base::Contains(device_id_set_, device_id)) { LOG(WARNING) << "Generated repeated id."; device_id = blink::WebBluetoothDeviceId::Create(); }
diff --git a/content/browser/bluetooth/bluetooth_device_chooser_controller.cc b/content/browser/bluetooth/bluetooth_device_chooser_controller.cc index 480649e..ddbebfa 100644 --- a/content/browser/bluetooth/bluetooth_device_chooser_controller.cc +++ b/content/browser/bluetooth/bluetooth_device_chooser_controller.cc
@@ -132,7 +132,7 @@ if (filter->services) { for (const auto& service : filter->services.value()) { - if (!base::ContainsKey(device_uuids, service)) { + if (!base::Contains(device_uuids, service)) { return false; } }
diff --git a/content/browser/bluetooth/web_bluetooth_service_impl.cc b/content/browser/bluetooth/web_bluetooth_service_impl.cc index ef01e844..be704d8 100644 --- a/content/browser/bluetooth/web_bluetooth_service_impl.cc +++ b/content/browser/bluetooth/web_bluetooth_service_impl.cc
@@ -280,10 +280,21 @@ (*client)->RunRequestScanningStartCallback(std::move(result)); (*client)->set_prompt_controller(nullptr); - if (event == BluetoothScanningPrompt::Event::kAllow) + if (event == BluetoothScanningPrompt::Event::kAllow) { (*client)->set_allow_send_event(true); - else + } else if (event == BluetoothScanningPrompt::Event::kBlock) { + // Here because user explicitly blocks the permission to do Bluetooth + // scanning in one request, it can be interpreted as user wants the current + // and all previous scanning to be blocked, so remove all existing scanning + // clients. + scanning_clients_.clear(); + allowed_scan_filters_.clear(); + accept_all_advertisements_ = false; + } else if (event == BluetoothScanningPrompt::Event::kCanceled) { scanning_clients_.erase(client); + } else { + NOTREACHED(); + } } WebBluetoothServiceImpl::ScanningClient::ScanningClient( @@ -350,7 +361,7 @@ if (filter->services.has_value()) { bool found_uuid_match = false; for (auto& filter_uuid : filter->services.value()) { - found_uuid_match = base::ContainsValue(result->uuids, filter_uuid); + found_uuid_match = base::Contains(result->uuids, filter_uuid); if (found_uuid_match) break; } @@ -546,8 +557,8 @@ device::BluetoothRemoteGattCharacteristic* characteristic, const std::vector<uint8_t>& value) { // Don't notify of characteristics that we haven't returned. - if (!base::ContainsKey(characteristic_id_to_service_id_, - characteristic->GetIdentifier())) { + if (!base::Contains(characteristic_id_to_service_id_, + characteristic->GetIdentifier())) { return; } @@ -1200,10 +1211,6 @@ return; } - // TODO(https://crbug.com/953075): If the scan filters aren't allowed by - // user, we need to update the filters which are used on the previously - // started discovery session. - // By resetting |device_scanning_prompt_controller_|, it returns an error if // there are duplicate calls to RequestScanningStart(). device_scanning_prompt_controller_ = @@ -1219,6 +1226,9 @@ discovery_callback_ = std::move(callback); + // TODO(https://crbug.com/969109): Since scanning without a filter wastes + // resources, we need use StartDiscoverySessionWithFilter() instead of + // StartDiscoverySession() here. adapter->StartDiscoverySession( base::Bind(&WebBluetoothServiceImpl::OnStartDiscoverySession, weak_ptr_factory_.GetWeakPtr(), base::Passed(&client), @@ -1664,8 +1674,7 @@ } // Sending get-service responses unexpectedly queued another request. - DCHECK( - !base::ContainsKey(pending_primary_services_requests_, device_address)); + DCHECK(!base::Contains(pending_primary_services_requests_, device_address)); } RenderProcessHost* WebBluetoothServiceImpl::GetRenderProcessHost() {
diff --git a/content/browser/bluetooth/web_bluetooth_service_impl.h b/content/browser/bluetooth/web_bluetooth_service_impl.h index 356c24f9..4107585 100644 --- a/content/browser/bluetooth/web_bluetooth_service_impl.h +++ b/content/browser/bluetooth/web_bluetooth_service_impl.h
@@ -86,6 +86,8 @@ BluetoothScanningPermissionRevokedWhenTabHidden); FRIEND_TEST_ALL_PREFIXES(WebBluetoothServiceImplTest, BluetoothScanningPermissionRevokedWhenTabOccluded); + FRIEND_TEST_ALL_PREFIXES(WebBluetoothServiceImplTest, + BluetoothScanningPermissionRevokedWhenBlocked); friend class FrameConnectedBluetoothDevicesTest; friend class WebBluetoothServiceImplTest; using PrimaryServicesRequestCallback =
diff --git a/content/browser/bluetooth/web_bluetooth_service_impl_unittest.cc b/content/browser/bluetooth/web_bluetooth_service_impl_unittest.cc index d633a748..c968fc7c 100644 --- a/content/browser/bluetooth/web_bluetooth_service_impl_unittest.cc +++ b/content/browser/bluetooth/web_bluetooth_service_impl_unittest.cc
@@ -24,9 +24,13 @@ class FakeBluetoothScanningPrompt : public BluetoothScanningPrompt { public: - explicit FakeBluetoothScanningPrompt(const EventHandler& event_handler) { - event_handler.Run(content::BluetoothScanningPrompt::Event::kAllow); + FakeBluetoothScanningPrompt(const EventHandler& event_handler, bool allow) { + if (allow) + event_handler.Run(content::BluetoothScanningPrompt::Event::kAllow); + else + event_handler.Run(content::BluetoothScanningPrompt::Event::kBlock); } + ~FakeBluetoothScanningPrompt() override = default; private: @@ -61,13 +65,44 @@ std::unique_ptr<BluetoothScanningPrompt> ShowBluetoothScanningPrompt( RenderFrameHost* frame, const BluetoothScanningPrompt::EventHandler& event_handler) override { - return std::make_unique<FakeBluetoothScanningPrompt>(event_handler); + return std::make_unique<FakeBluetoothScanningPrompt>(event_handler, allow_); } + void set_allow(bool allow) { allow_ = allow; } + private: + bool allow_ = true; + DISALLOW_COPY_AND_ASSIGN(FakeWebContentsDelegate); }; +class FakeWebBluetoothScanClientImpl : blink::mojom::WebBluetoothScanClient { + public: + FakeWebBluetoothScanClientImpl() = default; + ~FakeWebBluetoothScanClientImpl() override = default; + + // blink::mojom::WebBluetoothScanClient: + void ScanEvent(blink::mojom::WebBluetoothScanResultPtr result) override {} + + void BindRequest( + blink::mojom::WebBluetoothScanClientAssociatedRequest request) { + binding_.Bind(std::move(request)); + binding_.set_connection_error_handler( + base::BindOnce(&FakeWebBluetoothScanClientImpl::OnConnectionError, + base::Unretained(this))); + } + + void OnConnectionError() { on_connection_error_called_ = true; } + + bool on_connection_error_called() { return on_connection_error_called_; } + + private: + mojo::AssociatedBinding<blink::mojom::WebBluetoothScanClient> binding_{this}; + bool on_connection_error_called_ = false; + + DISALLOW_COPY_AND_ASSIGN(FakeWebBluetoothScanClientImpl); +}; + } // namespace class WebBluetoothServiceImplTest : public RenderViewHostImplTestHarness { @@ -90,26 +125,6 @@ // Simulate a frame connected to a bluetooth service. service_ = contents()->GetMainFrame()->CreateWebBluetoothServiceForTesting(); - - blink::mojom::WebBluetoothScanClientAssociatedPtrInfo client_info; - mojo::MakeRequest(&client_info); - auto options = blink::mojom::WebBluetoothRequestLEScanOptions::New(); - base::Optional<std::vector<device::BluetoothUUID>> services; - services.emplace(); - services->push_back(device::BluetoothUUID(kBatteryServiceUUIDString)); - auto filter = - blink::mojom::WebBluetoothLeScanFilter::New(services, "a", "b"); - options->filters.emplace(); - options->filters->push_back(filter.Clone()); - filters_.emplace(); - filters_->push_back(filter.Clone()); - service_->RequestScanningStart( - std::move(client_info), std::move(options), - base::BindLambdaForTesting( - [&](blink::mojom::RequestScanningStartResultPtr p) { - loop_.Quit(); - })); - loop_.Run(); } void TearDown() override { @@ -118,10 +133,37 @@ } protected: + blink::mojom::WebBluetoothLeScanFilterPtr CreateScanFilter( + const std::string& name, + const std::string& name_prefix) { + base::Optional<std::vector<device::BluetoothUUID>> services; + services.emplace(); + services->push_back(device::BluetoothUUID(kBatteryServiceUUIDString)); + return blink::mojom::WebBluetoothLeScanFilter::New(services, name, + name_prefix); + } + + void RequestScanningStart( + const blink::mojom::WebBluetoothLeScanFilter& filter, + FakeWebBluetoothScanClientImpl* client_impl) { + blink::mojom::WebBluetoothScanClientAssociatedPtrInfo client_info; + client_impl->BindRequest(mojo::MakeRequest(&client_info)); + auto options = blink::mojom::WebBluetoothRequestLEScanOptions::New(); + options->filters.emplace(); + auto filter_ptr = blink::mojom::WebBluetoothLeScanFilter::New(filter); + options->filters->push_back(std::move(filter_ptr)); + base::RunLoop loop; + service_->RequestScanningStart( + std::move(client_info), std::move(options), + base::BindLambdaForTesting( + [&](blink::mojom::RequestScanningStartResultPtr p) { + loop.Quit(); + })); + loop.Run(); + } + WebBluetoothServiceImpl* service_; - base::Optional<WebBluetoothServiceImpl::ScanFilters> filters_; FakeWebContentsDelegate delegate_; - base::RunLoop loop_; private: DISALLOW_COPY_AND_ASSIGN(WebBluetoothServiceImplTest); @@ -129,22 +171,82 @@ TEST_F(WebBluetoothServiceImplTest, BluetoothScanningPermissionRevokedWhenTabHidden) { - EXPECT_TRUE(service_->AreScanFiltersAllowed(filters_)); + blink::mojom::WebBluetoothLeScanFilterPtr filter = CreateScanFilter("a", "b"); + base::Optional<WebBluetoothServiceImpl::ScanFilters> filters; + filters.emplace(); + filters->push_back(filter.Clone()); + FakeWebBluetoothScanClientImpl client_impl; + RequestScanningStart(*filter, &client_impl); + EXPECT_TRUE(service_->AreScanFiltersAllowed(filters)); contents()->SetVisibility(content::Visibility::HIDDEN); // The previously granted Bluetooth scanning permission should be revoked. - EXPECT_FALSE(service_->AreScanFiltersAllowed(filters_)); + EXPECT_FALSE(service_->AreScanFiltersAllowed(filters)); } TEST_F(WebBluetoothServiceImplTest, BluetoothScanningPermissionRevokedWhenTabOccluded) { - EXPECT_TRUE(service_->AreScanFiltersAllowed(filters_)); + blink::mojom::WebBluetoothLeScanFilterPtr filter = CreateScanFilter("a", "b"); + base::Optional<WebBluetoothServiceImpl::ScanFilters> filters; + filters.emplace(); + filters->push_back(filter.Clone()); + FakeWebBluetoothScanClientImpl client_impl; + RequestScanningStart(*filter, &client_impl); + EXPECT_TRUE(service_->AreScanFiltersAllowed(filters)); contents()->SetVisibility(content::Visibility::OCCLUDED); // The previously granted Bluetooth scanning permission should be revoked. - EXPECT_FALSE(service_->AreScanFiltersAllowed(filters_)); + EXPECT_FALSE(service_->AreScanFiltersAllowed(filters)); +} + +TEST_F(WebBluetoothServiceImplTest, + BluetoothScanningPermissionRevokedWhenBlocked) { + blink::mojom::WebBluetoothLeScanFilterPtr filter_1 = + CreateScanFilter("a", "b"); + base::Optional<WebBluetoothServiceImpl::ScanFilters> filters_1; + filters_1.emplace(); + filters_1->push_back(filter_1.Clone()); + FakeWebBluetoothScanClientImpl client_impl_1; + RequestScanningStart(*filter_1, &client_impl_1); + EXPECT_TRUE(service_->AreScanFiltersAllowed(filters_1)); + EXPECT_FALSE(client_impl_1.on_connection_error_called()); + + blink::mojom::WebBluetoothLeScanFilterPtr filter_2 = + CreateScanFilter("c", "d"); + base::Optional<WebBluetoothServiceImpl::ScanFilters> filters_2; + filters_2.emplace(); + filters_2->push_back(filter_2.Clone()); + FakeWebBluetoothScanClientImpl client_impl_2; + RequestScanningStart(*filter_2, &client_impl_2); + EXPECT_TRUE(service_->AreScanFiltersAllowed(filters_2)); + EXPECT_FALSE(client_impl_2.on_connection_error_called()); + + // Set |allow_| to false in the FakeWebContentsDelegate so that the next call + // to WebBluetoothServiceImpl::RequestScanningStart() will block the + // permission. + delegate_.set_allow(false); + + blink::mojom::WebBluetoothLeScanFilterPtr filter_3 = + CreateScanFilter("e", "f"); + base::Optional<WebBluetoothServiceImpl::ScanFilters> filters_3; + filters_3.emplace(); + filters_3->push_back(filter_3.Clone()); + FakeWebBluetoothScanClientImpl client_impl_3; + RequestScanningStart(*filter_3, &client_impl_3); + EXPECT_FALSE(service_->AreScanFiltersAllowed(filters_3)); + + // The previously granted Bluetooth scanning permission should be revoked. + EXPECT_FALSE(service_->AreScanFiltersAllowed(filters_1)); + EXPECT_FALSE(service_->AreScanFiltersAllowed(filters_2)); + + base::RunLoop().RunUntilIdle(); + + // All existing scanning clients are disconnected. + EXPECT_TRUE(client_impl_1.on_connection_error_called()); + EXPECT_TRUE(client_impl_2.on_connection_error_called()); + EXPECT_TRUE(client_impl_3.on_connection_error_called()); } } // namespace content
diff --git a/content/browser/browser_main_loop.cc b/content/browser/browser_main_loop.cc index dc34314c..55b5f75 100644 --- a/content/browser/browser_main_loop.cc +++ b/content/browser/browser_main_loop.cc
@@ -529,7 +529,14 @@ parsed_command_line_(parameters.command_line), result_code_(service_manager::RESULT_CODE_NORMAL_EXIT), created_threads_(false), - scoped_execution_fence_(std::move(scoped_execution_fence)) { + scoped_execution_fence_(std::move(scoped_execution_fence)) +#if !defined(OS_ANDROID) + , + // TODO(fdoray): Create the fence on Android too. Not enabled yet because + // tests timeout. https://crbug.com/887407 + scoped_best_effort_execution_fence_(base::in_place_t()) +#endif +{ DCHECK(!g_current_browser_main_loop); DCHECK(scoped_execution_fence_) << "ThreadPool must be halted before kicking off content."; @@ -951,12 +958,20 @@ // TODO(https://crbug.com/863341): Replace with a better API GetContentClient()->browser()->PostAfterStartupTask( - FROM_HERE, base::SequencedTaskRunnerHandle::Get(), base::BindOnce([]() { - // Non best effort queues will already have been enabled - // This will enable all queues on all browser threads, so we need to do - // this after the threads have been created, i.e. here. - content::BrowserTaskExecutor::EnableAllQueues(); - })); + FROM_HERE, base::SequencedTaskRunnerHandle::Get(), + base::BindOnce( + [](BrowserMainLoop* browser_main_loop) { + // Enable main thread and thread pool best effort queues. Non-best + // effort queues will already have been enabled. This will enable + // all queues on all browser threads, so we need to do this after + // the threads have been created, i.e. here. + content::BrowserTaskExecutor::EnableAllQueues(); + browser_main_loop->scoped_best_effort_execution_fence_.reset(); + }, + // Main thread tasks can't run after BrowserMainLoop destruction. + // Accessing an Unretained pointer to BrowserMainLoop from a main + // thread task is therefore safe. + base::Unretained(this))); created_threads_ = true; return result_code_;
diff --git a/content/browser/browser_main_loop.h b/content/browser/browser_main_loop.h index aa4e4e29..d2fbe32 100644 --- a/content/browser/browser_main_loop.h +++ b/content/browser/browser_main_loop.h
@@ -86,7 +86,7 @@ class FrameSinkManagerImpl; class HostFrameSinkManager; class ServerSharedBitmapManager; -} +} // namespace viz namespace content { class BrowserMainParts; @@ -305,6 +305,14 @@ std::unique_ptr<base::ThreadPoolInstance::ScopedExecutionFence> scoped_execution_fence_; + // BEST_EFFORT tasks are not allowed to run between //content initialization + // and startup completion. + // + // TODO(fdoray): Move this to a more elaborate class that prevents BEST_EFFORT + // tasks from running when resources are needed to respond to user actions. + base::Optional<base::ThreadPoolInstance::ScopedBestEffortExecutionFence> + scoped_best_effort_execution_fence_; + // Members initialized in |MainMessageLoopStart()| --------------------------- // Members initialized in |PostMainMessageLoopStart()| -----------------------
diff --git a/content/browser/browsing_data/browsing_data_remover_impl.cc b/content/browser/browsing_data/browsing_data_remover_impl.cc index 636748d..d63311d 100644 --- a/content/browser/browsing_data/browsing_data_remover_impl.cc +++ b/content/browser/browsing_data/browsing_data_remover_impl.cc
@@ -76,7 +76,7 @@ return false; const std::vector<std::string>& schemes = url::GetWebStorageSchemes(); - bool is_web_scheme = base::ContainsValue(schemes, origin.scheme()); + bool is_web_scheme = base::Contains(schemes, origin.scheme()); // If a websafe origin is unprotected, it matches iff UNPROTECTED_WEB. if ((!policy || !policy->IsStorageProtected(origin.GetURL())) &&
diff --git a/content/browser/browsing_data/browsing_data_remover_impl_browsertest.cc b/content/browser/browsing_data/browsing_data_remover_impl_browsertest.cc index 706c359..c39d302 100644 --- a/content/browser/browsing_data/browsing_data_remover_impl_browsertest.cc +++ b/content/browser/browsing_data/browsing_data_remover_impl_browsertest.cc
@@ -61,7 +61,7 @@ return nullptr; auto http_response = std::make_unique<net::test_server::BasicHttpResponse>(); - if (base::ContainsKey(request.headers, "Authorization")) { + if (base::Contains(request.headers, "Authorization")) { http_response->set_code(net::HTTP_OK); http_response->set_content("Success!"); } else {
diff --git a/content/browser/browsing_data/clear_site_data_handler_browsertest.cc b/content/browser/browsing_data/clear_site_data_handler_browsertest.cc index c9b296dc..dfaec124 100644 --- a/content/browser/browsing_data/clear_site_data_handler_browsertest.cc +++ b/content/browser/browsing_data/clear_site_data_handler_browsertest.cc
@@ -327,7 +327,7 @@ 0 /* process_id */, 0 /* render_frame_id */, net::LOAD_ONLY_FROM_CACHE) == net::OK; } else { - return base::ContainsValue(cache_test_util_->GetEntryKeys(), url.spec()); + return base::Contains(cache_test_util_->GetEntryKeys(), url.spec()); } }
diff --git a/content/browser/browsing_data/conditional_cache_deletion_helper_browsertest.cc b/content/browser/browsing_data/conditional_cache_deletion_helper_browsertest.cc index cf50bc0e..deb84a5 100644 --- a/content/browser/browsing_data/conditional_cache_deletion_helper_browsertest.cc +++ b/content/browser/browsing_data/conditional_cache_deletion_helper_browsertest.cc
@@ -96,7 +96,7 @@ net::LOAD_ONLY_FROM_CACHE | net::LOAD_SKIP_CACHE_VALIDATION) == net::OK; } else { - return base::ContainsValue(cache_util_->GetEntryKeys(), url.spec()); + return base::Contains(cache_util_->GetEntryKeys(), url.spec()); } }
diff --git a/content/browser/cache_storage/legacy/legacy_cache_storage.cc b/content/browser/cache_storage/legacy/legacy_cache_storage.cc index 422f0f5a..5bdb477 100644 --- a/content/browser/cache_storage/legacy/legacy_cache_storage.cc +++ b/content/browser/cache_storage/legacy/legacy_cache_storage.cc
@@ -212,13 +212,13 @@ void NotifyCacheCreated(const std::string& cache_name, CacheStorageCacheHandle cache_handle) override { - DCHECK(!base::ContainsKey(cache_handles_, cache_name)); + DCHECK(!base::Contains(cache_handles_, cache_name)); cache_handles_.insert(std::make_pair(cache_name, std::move(cache_handle))); } void NotifyCacheDoomed(CacheStorageCacheHandle cache_handle) override { auto* impl = LegacyCacheStorageCache::From(cache_handle); - DCHECK(base::ContainsKey(cache_handles_, impl->cache_name())); + DCHECK(base::Contains(cache_handles_, impl->cache_name())); cache_handles_.erase(impl->cache_name()); } @@ -260,7 +260,7 @@ int64_t cache_padding, std::unique_ptr<SymmetricKey> cache_padding_key) override { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - DCHECK(base::ContainsKey(cache_name_to_cache_dir_, cache_name)); + DCHECK(base::Contains(cache_name_to_cache_dir_, cache_name)); std::string cache_dir = cache_name_to_cache_dir_[cache_name]; base::FilePath cache_path = origin_path_.AppendASCII(cache_dir); @@ -312,7 +312,7 @@ void CleanUpDeletedCache(CacheStorageCache* cache) override { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - DCHECK(base::ContainsKey(doomed_cache_to_path_, cache)); + DCHECK(base::Contains(doomed_cache_to_path_, cache)); base::FilePath cache_path = origin_path_.AppendASCII(doomed_cache_to_path_[cache]); @@ -343,7 +343,7 @@ protobuf_index.set_origin(origin_.GetURL().spec()); for (const auto& cache_metadata : index.ordered_cache_metadata()) { - DCHECK(base::ContainsKey(cache_name_to_cache_dir_, cache_metadata.name)); + DCHECK(base::Contains(cache_name_to_cache_dir_, cache_metadata.name)); proto::CacheStorageIndex::Cache* index_cache = protobuf_index.add_cache(); index_cache->set_name(cache_metadata.name); @@ -444,7 +444,7 @@ void NotifyCacheDoomed(CacheStorageCacheHandle cache_handle) override { auto* impl = LegacyCacheStorageCache::From(cache_handle); - DCHECK(base::ContainsKey(cache_name_to_cache_dir_, impl->cache_name())); + DCHECK(base::Contains(cache_name_to_cache_dir_, impl->cache_name())); auto iter = cache_name_to_cache_dir_.find(impl->cache_name()); doomed_cache_to_path_[cache_handle.value()] = iter->second; cache_name_to_cache_dir_.erase(iter); @@ -465,8 +465,7 @@ { base::FilePath cache_path; while (!(cache_path = file_enum.Next()).empty()) { - if (!base::ContainsKey(*cache_dirs, - cache_path.BaseName().AsUTF8Unsafe())) + if (!base::Contains(*cache_dirs, cache_path.BaseName().AsUTF8Unsafe())) dirs_to_delete.push_back(cache_path); } } @@ -831,8 +830,8 @@ void LegacyCacheStorage::CacheSizeUpdated( const LegacyCacheStorageCache* cache) { // Should not be called for doomed caches. - DCHECK(!base::ContainsKey(doomed_caches_, - const_cast<LegacyCacheStorageCache*>(cache))); + DCHECK(!base::Contains(doomed_caches_, + const_cast<LegacyCacheStorageCache*>(cache))); DCHECK_NE(cache->cache_padding(), kSizeUnknown); bool size_changed = cache_index_->SetCacheSize(cache->cache_name(), cache->cache_size()); @@ -1020,7 +1019,7 @@ TRACE_ID_GLOBAL(trace_id), TRACE_EVENT_FLAG_FLOW_IN | TRACE_EVENT_FLAG_FLOW_OUT, "cache_name", cache_name); - bool has_cache = base::ContainsKey(cache_map_, cache_name); + bool has_cache = base::Contains(cache_map_, cache_name); std::move(callback).Run(has_cache, CacheStorageError::kSuccess); }
diff --git a/content/browser/child_process_security_policy_impl.cc b/content/browser/child_process_security_policy_impl.cc index 84115f3..b1dc760 100644 --- a/content/browser/child_process_security_policy_impl.cc +++ b/content/browser/child_process_security_policy_impl.cc
@@ -196,7 +196,7 @@ // Grant certain permissions to a file. void GrantPermissionsForFileSystem(const std::string& filesystem_id, int permissions) { - if (!base::ContainsKey(filesystem_permissions_, filesystem_id)) + if (!base::Contains(filesystem_permissions_, filesystem_id)) storage::IsolatedContext::GetInstance()->AddReference(filesystem_id); filesystem_permissions_[filesystem_id] |= permissions; } @@ -264,7 +264,7 @@ if (url.SchemeIs(url::kFileScheme)) { base::FilePath path; if (net::FileURLToFilePath(url, &path)) - return base::ContainsKey(request_file_set_, path); + return base::Contains(request_file_set_, path); } return false; // Unmentioned schemes are disallowed. @@ -593,7 +593,7 @@ const std::string& scheme) { base::AutoLock lock(lock_); - return base::ContainsKey(schemes_okay_to_request_in_any_process_, scheme); + return base::Contains(schemes_okay_to_request_in_any_process_, scheme); } void ChildProcessSecurityPolicyImpl::RegisterPseudoScheme( @@ -612,7 +612,7 @@ const std::string& scheme) { base::AutoLock lock(lock_); - return base::ContainsKey(pseudo_schemes_, scheme); + return base::Contains(pseudo_schemes_, scheme); } void ChildProcessSecurityPolicyImpl::GrantCommitURL(int child_id, @@ -969,7 +969,7 @@ // // TODO(creis, nick): https://crbug.com/515309: The line below does not // enforce that http pages cannot commit in an extension process. - if (base::ContainsKey(schemes_okay_to_commit_in_any_process_, scheme)) + if (base::Contains(schemes_okay_to_commit_in_any_process_, scheme)) return true; auto state = security_state_.find(child_id); @@ -1011,8 +1011,8 @@ // document origin. { base::AutoLock lock(lock_); - if (base::ContainsKey(schemes_okay_to_appear_as_origin_headers_, - url.scheme())) { + if (base::Contains(schemes_okay_to_appear_as_origin_headers_, + url.scheme())) { return true; } }
diff --git a/content/browser/dom_storage/dom_storage_context_impl.cc b/content/browser/dom_storage/dom_storage_context_impl.cc index 3d93f40..78ade68 100644 --- a/content/browser/dom_storage/dom_storage_context_impl.cc +++ b/content/browser/dom_storage/dom_storage_context_impl.cc
@@ -244,7 +244,7 @@ base::Optional<bad_message::BadMessageReason> DOMStorageContextImpl::DiagnoseSessionNamespaceId( const std::string& namespace_id) { - if (base::ContainsValue(recently_deleted_session_ids_, namespace_id)) + if (base::Contains(recently_deleted_session_ids_, namespace_id)) return bad_message::DSH_DELETED_SESSION_ID; return bad_message::DSH_NOT_ALLOCATED_SESSION_ID; }
diff --git a/content/browser/dom_storage/session_storage_area_impl_unittest.cc b/content/browser/dom_storage/session_storage_area_impl_unittest.cc index 726bc1d7f..ff223e7c 100644 --- a/content/browser/dom_storage/session_storage_area_impl_unittest.cc +++ b/content/browser/dom_storage/session_storage_area_impl_unittest.cc
@@ -142,7 +142,7 @@ std::vector<blink::mojom::KeyValuePtr> data; EXPECT_TRUE(test::GetAllSync(ss_leveldb.get(), &data)); ASSERT_EQ(1ul, data.size()); - EXPECT_TRUE(base::ContainsValue( + EXPECT_TRUE(base::Contains( data, blink::mojom::KeyValue::New(StdStringToUint8Vector("key1"), StdStringToUint8Vector("data1")))); @@ -261,7 +261,7 @@ std::vector<blink::mojom::KeyValuePtr> data; EXPECT_TRUE(test::GetAllSync(ss_leveldb1.get(), &data)); ASSERT_EQ(1ul, data.size()); - EXPECT_TRUE(base::ContainsValue( + EXPECT_TRUE(base::Contains( data, blink::mojom::KeyValue::New(StdStringToUint8Vector("key1"), StdStringToUint8Vector("data1")))); @@ -269,10 +269,10 @@ data.clear(); EXPECT_TRUE(test::GetAllSync(ss_leveldb2.get(), &data)); ASSERT_EQ(2ul, data.size()); - EXPECT_TRUE(base::ContainsValue( + EXPECT_TRUE(base::Contains( data, blink::mojom::KeyValue::New(StdStringToUint8Vector("key1"), StdStringToUint8Vector("data1")))); - EXPECT_TRUE(base::ContainsValue( + EXPECT_TRUE(base::Contains( data, blink::mojom::KeyValue::New(StdStringToUint8Vector("key2"), StdStringToUint8Vector("data2"))));
diff --git a/content/browser/dom_storage/session_storage_context_mojo.cc b/content/browser/dom_storage/session_storage_context_mojo.cc index 50cc0dca..45a6655 100644 --- a/content/browser/dom_storage/session_storage_context_mojo.cc +++ b/content/browser/dom_storage/session_storage_context_mojo.cc
@@ -202,8 +202,8 @@ // call on that mojo binding. namespace_impl->SetWaitingForClonePopulation(); clone_from_ns->second->AddNamespacesWaitingForClone(clone_namespace_id); - } else if (base::ContainsKey(metadata_.namespace_origin_map(), - namespace_id_to_clone)) { + } else if (base::Contains(metadata_.namespace_origin_map(), + namespace_id_to_clone)) { // The namespace exists on disk but is not in-use, so do the appropriate // metadata operations to clone the namespace and set up the new object. std::vector<leveldb::mojom::BatchedOperationPtr> save_operations;
diff --git a/content/browser/dom_storage/session_storage_context_mojo_unittest.cc b/content/browser/dom_storage/session_storage_context_mojo_unittest.cc index 711345b..5efc6ebe 100644 --- a/content/browser/dom_storage/session_storage_context_mojo_unittest.cc +++ b/content/browser/dom_storage/session_storage_context_mojo_unittest.cc
@@ -223,12 +223,12 @@ EXPECT_EQ(2ul, data.size()); std::vector<uint8_t> key_as_vector = StdStringToUint8Vector(base::UTF16ToUTF8(key)); - EXPECT_TRUE(base::ContainsValue( - data, blink::mojom::KeyValue::New(key_as_vector, - String16ToUint8Vector(value)))); - EXPECT_TRUE(base::ContainsValue( - data, blink::mojom::KeyValue::New(key_as_vector, - String16ToUint8Vector(value)))); + EXPECT_TRUE( + base::Contains(data, blink::mojom::KeyValue::New( + key_as_vector, String16ToUint8Vector(value)))); + EXPECT_TRUE( + base::Contains(data, blink::mojom::KeyValue::New( + key_as_vector, String16ToUint8Vector(value)))); } TEST_F(SessionStorageContextMojoTest, StartupShutdownSave) {
diff --git a/content/browser/dom_storage/session_storage_metadata_unittest.cc b/content/browser/dom_storage/session_storage_metadata_unittest.cc index e6e58fb..39b4b62 100644 --- a/content/browser/dom_storage/session_storage_metadata_unittest.cc +++ b/content/browser/dom_storage/session_storage_metadata_unittest.cc
@@ -269,7 +269,7 @@ EXPECT_EQ(DatabaseError::OK, error); EXPECT_FALSE( - base::ContainsKey(metadata.namespace_origin_map(), test_namespace1_id_)); + base::Contains(metadata.namespace_origin_map(), test_namespace1_id_)); // Verify in-memory metadata is correct. auto ns2_entry = metadata.GetOrCreateNamespaceEntry(test_namespace2_id_); @@ -277,18 +277,17 @@ EXPECT_EQ(1, ns2_entry->second[test_origin2_]->ReferenceCount()); // Verify metadata and data was deleted from disk. - EXPECT_FALSE(base::ContainsKey( + EXPECT_FALSE(base::Contains( mock_data_, StdStringToUint8Vector(std::string("namespace-") + test_namespace1_id_ + "-" + test_origin1_.GetURL().spec()))); - EXPECT_FALSE(base::ContainsKey( + EXPECT_FALSE(base::Contains( mock_data_, StdStringToUint8Vector(std::string("namespace-") + test_namespace1_id_ + "-" + test_origin2_.GetURL().spec()))); EXPECT_FALSE( - base::ContainsKey(mock_data_, StdStringToUint8Vector("map-3-key1"))); - EXPECT_TRUE( - base::ContainsKey(mock_data_, StdStringToUint8Vector("map-1-key1"))); + base::Contains(mock_data_, StdStringToUint8Vector("map-3-key1"))); + EXPECT_TRUE(base::Contains(mock_data_, StdStringToUint8Vector("map-1-key1"))); } TEST_F(SessionStorageMetadataTest, DeleteArea) { @@ -307,24 +306,22 @@ // Verify in-memory metadata is correct. auto ns1_entry = metadata.GetOrCreateNamespaceEntry(test_namespace1_id_); auto ns2_entry = metadata.GetOrCreateNamespaceEntry(test_namespace2_id_); - EXPECT_FALSE(base::ContainsKey(ns1_entry->second, test_origin1_)); + EXPECT_FALSE(base::Contains(ns1_entry->second, test_origin1_)); EXPECT_EQ(1, ns1_entry->second[test_origin2_]->ReferenceCount()); EXPECT_EQ(1, ns2_entry->second[test_origin1_]->ReferenceCount()); EXPECT_EQ(1, ns2_entry->second[test_origin2_]->ReferenceCount()); // Verify only the applicable data was deleted. - EXPECT_FALSE(base::ContainsKey( + EXPECT_FALSE(base::Contains( mock_data_, StdStringToUint8Vector(std::string("namespace-") + test_namespace1_id_ + "-" + test_origin1_.GetURL().spec()))); - EXPECT_TRUE(base::ContainsKey( + EXPECT_TRUE(base::Contains( mock_data_, StdStringToUint8Vector(std::string("namespace-") + test_namespace1_id_ + "-" + test_origin2_.GetURL().spec()))); - EXPECT_TRUE( - base::ContainsKey(mock_data_, StdStringToUint8Vector("map-1-key1"))); - EXPECT_TRUE( - base::ContainsKey(mock_data_, StdStringToUint8Vector("map-4-key1"))); + EXPECT_TRUE(base::Contains(mock_data_, StdStringToUint8Vector("map-1-key1"))); + EXPECT_TRUE(base::Contains(mock_data_, StdStringToUint8Vector("map-4-key1"))); // Now delete an area with a unique map. operations.clear(); @@ -334,26 +331,24 @@ EXPECT_EQ(DatabaseError::OK, error); // Verify in-memory metadata is correct. - EXPECT_FALSE(base::ContainsKey(ns1_entry->second, test_origin1_)); + EXPECT_FALSE(base::Contains(ns1_entry->second, test_origin1_)); EXPECT_EQ(1, ns1_entry->second[test_origin2_]->ReferenceCount()); EXPECT_EQ(1, ns2_entry->second[test_origin1_]->ReferenceCount()); - EXPECT_FALSE(base::ContainsKey(ns2_entry->second, test_origin2_)); + EXPECT_FALSE(base::Contains(ns2_entry->second, test_origin2_)); // Verify only the applicable data was deleted. - EXPECT_TRUE(base::ContainsKey( + EXPECT_TRUE(base::Contains( mock_data_, StdStringToUint8Vector(std::string("namespace-") + test_namespace2_id_ + "-" + test_origin1_.GetURL().spec()))); - EXPECT_FALSE(base::ContainsKey( + EXPECT_FALSE(base::Contains( mock_data_, StdStringToUint8Vector(std::string("namespace-") + test_namespace2_id_ + "-" + test_origin2_.GetURL().spec()))); - EXPECT_TRUE( - base::ContainsKey(mock_data_, StdStringToUint8Vector("map-1-key1"))); - EXPECT_TRUE( - base::ContainsKey(mock_data_, StdStringToUint8Vector("map-3-key1"))); + EXPECT_TRUE(base::Contains(mock_data_, StdStringToUint8Vector("map-1-key1"))); + EXPECT_TRUE(base::Contains(mock_data_, StdStringToUint8Vector("map-3-key1"))); EXPECT_FALSE( - base::ContainsKey(mock_data_, StdStringToUint8Vector("map-4-key1"))); + base::Contains(mock_data_, StdStringToUint8Vector("map-4-key1"))); } class SessionStorageMetadataMigrationTest : public testing::Test { @@ -458,21 +453,21 @@ EXPECT_FALSE(migration_operations.empty()); EXPECT_EQ(3ul, migration_operations.size()); - EXPECT_TRUE(base::ContainsValue( + EXPECT_TRUE(base::Contains( migration_operations, leveldb::mojom::BatchedOperation::New( leveldb::mojom::BatchOperationType::PUT_KEY, StdStringToUint8Vector("version"), StdStringToUint8Vector("1")))); - EXPECT_TRUE(base::ContainsValue( - migration_operations, - leveldb::mojom::BatchedOperation::New( - leveldb::mojom::BatchOperationType::DELETE_KEY, - StdStringToUint8Vector("map-0-"), base::nullopt))); - EXPECT_TRUE(base::ContainsValue( - migration_operations, - leveldb::mojom::BatchedOperation::New( - leveldb::mojom::BatchOperationType::DELETE_KEY, - StdStringToUint8Vector("namespace-"), base::nullopt))); + EXPECT_TRUE( + base::Contains(migration_operations, + leveldb::mojom::BatchedOperation::New( + leveldb::mojom::BatchOperationType::DELETE_KEY, + StdStringToUint8Vector("map-0-"), base::nullopt))); + EXPECT_TRUE( + base::Contains(migration_operations, + leveldb::mojom::BatchedOperation::New( + leveldb::mojom::BatchOperationType::DELETE_KEY, + StdStringToUint8Vector("namespace-"), base::nullopt))); } } // namespace
diff --git a/content/browser/dom_storage/session_storage_namespace_impl_mojo_unittest.cc b/content/browser/dom_storage/session_storage_namespace_impl_mojo_unittest.cc index 64ae0a7..7202610 100644 --- a/content/browser/dom_storage/session_storage_namespace_impl_mojo_unittest.cc +++ b/content/browser/dom_storage/session_storage_namespace_impl_mojo_unittest.cc
@@ -202,7 +202,7 @@ std::vector<blink::mojom::KeyValuePtr> data; EXPECT_TRUE(test::GetAllSync(leveldb_1.get(), &data)); EXPECT_EQ(1ul, data.size()); - EXPECT_TRUE(base::ContainsValue( + EXPECT_TRUE(base::Contains( data, blink::mojom::KeyValue::New(StdStringToUint8Vector("key1"), StdStringToUint8Vector("data1")))); @@ -237,10 +237,10 @@ std::vector<blink::mojom::KeyValuePtr> data; EXPECT_TRUE(test::GetAllSync(leveldb_1.get(), &data)); EXPECT_EQ(2ul, data.size()); - EXPECT_TRUE(base::ContainsValue( + EXPECT_TRUE(base::Contains( data, blink::mojom::KeyValue::New(StdStringToUint8Vector("key1"), StdStringToUint8Vector("data1")))); - EXPECT_TRUE(base::ContainsValue( + EXPECT_TRUE(base::Contains( data, blink::mojom::KeyValue::New(StdStringToUint8Vector("key2"), StdStringToUint8Vector("data2")))); @@ -288,10 +288,10 @@ std::vector<blink::mojom::KeyValuePtr> data; EXPECT_TRUE(test::GetAllSync(leveldb_2.get(), &data)); EXPECT_EQ(2ul, data.size()); - EXPECT_TRUE(base::ContainsValue( + EXPECT_TRUE(base::Contains( data, blink::mojom::KeyValue::New(StdStringToUint8Vector("key1"), StdStringToUint8Vector("data1")))); - EXPECT_TRUE(base::ContainsValue( + EXPECT_TRUE(base::Contains( data, blink::mojom::KeyValue::New(StdStringToUint8Vector("key2"), StdStringToUint8Vector("data2")))); @@ -351,14 +351,14 @@ std::vector<blink::mojom::KeyValuePtr> data; EXPECT_TRUE(test::GetAllSync(leveldb_n2_o1.get(), &data)); EXPECT_EQ(1ul, data.size()); - EXPECT_TRUE(base::ContainsValue( + EXPECT_TRUE(base::Contains( data, blink::mojom::KeyValue::New(StdStringToUint8Vector("key1"), StdStringToUint8Vector("data1")))); data.clear(); EXPECT_TRUE(test::GetAllSync(leveldb_n2_o2.get(), &data)); EXPECT_EQ(1ul, data.size()); - EXPECT_TRUE(base::ContainsValue( + EXPECT_TRUE(base::Contains( data, blink::mojom::KeyValue::New(StdStringToUint8Vector("key2"), StdStringToUint8Vector("data2"))));
diff --git a/content/browser/download/download_browsertest.cc b/content/browser/download/download_browsertest.cc index 14c33ea..6eedee9 100644 --- a/content/browser/download/download_browsertest.cc +++ b/content/browser/download/download_browsertest.cc
@@ -3885,7 +3885,8 @@ // Verify WebUI download will success with an associated renderer process. IN_PROC_BROWSER_TEST_F(DownloadContentTest, DownloadFromWebUI) { - GURL webui_url(GetWebUIURL("resources/images/apps/blue_button.png")); + GURL webui_url( + GetWebUIURL("resources/images/apps/topbar_button_maximize.png")); NavigateToURL(shell(), webui_url); SetupEnsureNoPendingDownloads(); @@ -3908,7 +3909,7 @@ // Verify WebUI download will gracefully fail without an associated renderer // process. IN_PROC_BROWSER_TEST_F(DownloadContentTest, DownloadFromWebUIWithoutRenderer) { - GURL webui_url("chrome://resources/images/apps/blue_button.png"); + GURL webui_url("chrome://resources/images/apps/topbar_button_maximize.png"); NavigateToURL(shell(), webui_url); SetupEnsureNoPendingDownloads();
diff --git a/content/browser/download/download_manager_impl.cc b/content/browser/download/download_manager_impl.cc index 9994201..cd50e7fd 100644 --- a/content/browser/download/download_manager_impl.cc +++ b/content/browser/download/download_manager_impl.cc
@@ -380,7 +380,7 @@ const download::DownloadCreateInfo& info) { DCHECK_CURRENTLY_ON(BrowserThread::UI); - if (base::ContainsKey(downloads_, id)) + if (base::Contains(downloads_, id)) return nullptr; download::DownloadItemImpl* download = @@ -732,7 +732,7 @@ bool result) { DCHECK_CURRENTLY_ON(BrowserThread::UI); if (!result) { // File does not exist. - if (base::ContainsKey(downloads_, download_id)) + if (base::Contains(downloads_, download_id)) downloads_[download_id]->OnDownloadedFileRemoved(); } } @@ -774,7 +774,7 @@ uint32_t id) { DCHECK_CURRENTLY_ON(BrowserThread::UI); DCHECK_NE(download::DownloadItem::kInvalidId, id); - DCHECK(!base::ContainsKey(downloads_, id)); + DCHECK(!base::Contains(downloads_, id)); download::DownloadItemImpl* download_item = item_factory_->CreateSavePageItem( this, id, main_file_path, page_url, mime_type, std::move(request_handle)); DownloadItemUtils::AttachInfo(download_item, GetBrowserContext(), @@ -1076,8 +1076,8 @@ void DownloadManagerImpl::OnDownloadCreated( std::unique_ptr<download::DownloadItemImpl> download) { - DCHECK(!base::ContainsKey(downloads_, download->GetId())); - DCHECK(!base::ContainsKey(downloads_by_guid_, download->GetGuid())); + DCHECK(!base::Contains(downloads_, download->GetId())); + DCHECK(!base::Contains(downloads_by_guid_, download->GetGuid())); download::DownloadItemImpl* item = download.get(); downloads_[item->GetId()] = std::move(download); downloads_by_guid_[item->GetGuid()] = item; @@ -1198,9 +1198,8 @@ } download::DownloadItem* DownloadManagerImpl::GetDownload(uint32_t download_id) { - return base::ContainsKey(downloads_, download_id) - ? downloads_[download_id].get() - : nullptr; + return base::Contains(downloads_, download_id) ? downloads_[download_id].get() + : nullptr; } download::DownloadItem* DownloadManagerImpl::GetDownloadByGuid( @@ -1211,8 +1210,8 @@ return it.get(); } } - return base::ContainsKey(downloads_by_guid_, guid) ? downloads_by_guid_[guid] - : nullptr; + return base::Contains(downloads_by_guid_, guid) ? downloads_by_guid_[guid] + : nullptr; } void DownloadManagerImpl::OnUrlDownloadStarted(
diff --git a/content/browser/download/save_package.cc b/content/browser/download/save_package.cc index 67911f5..3501e1a 100644 --- a/content/browser/download/save_package.cc +++ b/content/browser/download/save_package.cc
@@ -489,7 +489,7 @@ base::FilePath::StringType new_name = base_file_name + base::StringPrintf(FILE_PATH_LITERAL("(%d)"), i) + file_name_ext; - if (!base::ContainsKey(file_name_set_, new_name)) { + if (!base::Contains(file_name_set_, new_name)) { // Resolved name conflict. file_name = new_name; file_name_count_map_[base_file_name] = ++i; @@ -594,7 +594,7 @@ SaveItemIdMap& map = save_item->success() ? saved_success_items_ : saved_failed_items_; - DCHECK(!base::ContainsKey(map, save_item->id())); + DCHECK(!base::Contains(map, save_item->id())); map[save_item->id()] = std::move(owned_item); } @@ -804,7 +804,7 @@ waiting_item_queue_.pop_front(); // Add the item to |in_progress_items_|. - DCHECK(!base::ContainsKey(in_progress_items_, save_item->id())); + DCHECK(!base::Contains(in_progress_items_, save_item->id())); in_progress_items_[save_item_ptr->id()] = std::move(save_item); save_item_ptr->Start(); @@ -1057,7 +1057,7 @@ } } - if (base::ContainsKey(saved_failed_items_, save_item->id())) + if (base::Contains(saved_failed_items_, save_item->id())) wrote_to_failed_file_ = true; return;
diff --git a/content/browser/fileapi/file_system_url_loader_factory.cc b/content/browser/fileapi/file_system_url_loader_factory.cc index 0152372e..5b4ffbdf 100644 --- a/content/browser/fileapi/file_system_url_loader_factory.cc +++ b/content/browser/fileapi/file_system_url_loader_factory.cc
@@ -161,8 +161,11 @@ return; } + // If the requested URL is not commitable in the current process, block the + // request. This prevents one origin from fetching filesystem: resources + // belonging to another origin, see https://crbug.com/964245. if (params_.render_process_host_id != ChildProcessHost::kInvalidUniqueID && - !ChildProcessSecurityPolicyImpl::GetInstance()->CanRequestURL( + !ChildProcessSecurityPolicyImpl::GetInstance()->CanCommitURL( params_.render_process_host_id, request.url)) { DVLOG(1) << "Denied unauthorized request for " << request.url.possibly_invalid_spec();
diff --git a/content/browser/fileapi/file_system_url_loader_factory_browsertest.cc b/content/browser/fileapi/file_system_url_loader_factory_browsertest.cc index 5833e444..ac69f740 100644 --- a/content/browser/fileapi/file_system_url_loader_factory_browsertest.cc +++ b/content/browser/fileapi/file_system_url_loader_factory_browsertest.cc
@@ -21,9 +21,12 @@ #include "content/browser/fileapi/file_system_url_loader_factory.h" #include "content/browser/web_contents/web_contents_impl.h" #include "content/public/browser/browser_task_traits.h" +#include "content/public/test/browser_test_utils.h" #include "content/public/test/content_browser_test.h" +#include "content/public/test/test_utils.h" #include "content/shell/browser/shell.h" #include "net/base/mime_util.h" +#include "net/dns/mock_host_resolver.h" #include "net/http/http_util.h" #include "net/traffic_annotation/network_traffic_annotation_test_helper.h" #include "services/network/public/cpp/features.h" @@ -185,6 +188,9 @@ special_storage_policy_ = new MockSpecialStoragePolicy; + // Support multiple sites on the test server. + host_resolver()->AddRule("*", "127.0.0.1"); + ContentBrowserTest::SetUpOnMainThread(); // We use a test FileSystemContext which runs on the main thread, so we @@ -704,6 +710,30 @@ EXPECT_EQ("no-cache", cache_control); } +// Verify that when site isolation is enabled, a renderer process for one +// origin can't request filesystem: URLs belonging to another origin. See +// https://crbug.com/964245. +IN_PROC_BROWSER_TEST_P(FileSystemURLLoaderFactoryTest, CrossOriginFileBlocked) { + IsolateAllSitesForTesting(base::CommandLine::ForCurrentProcess()); + + base::ScopedAllowBlockingForTesting allow_blocking; + WriteFile("file1.dat", kTestFileData, base::size(kTestFileData) - 1); + + // Navigate main frame to foo.com. + ASSERT_TRUE(embedded_test_server()->Start()); + EXPECT_TRUE( + NavigateToURL(shell()->web_contents(), + embedded_test_server()->GetURL("foo.com", "/title1.html"))); + + // Try requesting filesystem:http://remote/temporary/file1.dat from that + // frame. This should be blocked, as foo.com isn't allowed to request a + // filesystem URL for the http://remote origin. + auto client = TestLoad(CreateFileSystemURL("file1.dat")); + EXPECT_FALSE(client->has_received_response()); + ASSERT_TRUE(client->has_received_completion()); + EXPECT_EQ(net::ERR_INVALID_URL, client->completion_status().error_code); +} + IN_PROC_BROWSER_TEST_P(FileSystemURLLoaderFactoryTest, FileTestFullSpecifiedRange) { base::ScopedAllowBlockingForTesting allow_blocking;
diff --git a/content/browser/frame_host/frame_tree_node.cc b/content/browser/frame_host/frame_tree_node.cc index 7ea14dfe6..424deca 100644 --- a/content/browser/frame_host/frame_tree_node.cc +++ b/content/browser/frame_host/frame_tree_node.cc
@@ -164,17 +164,42 @@ g_frame_tree_node_id_map.Get().erase(frame_tree_node_id_); + bool did_stop_loading = false; + if (navigation_request_) { + navigation_request_.reset(); // PlzNavigate: if a frame with a pending navigation is detached, make sure // the WebContents (and its observers) update their loading state. - navigation_request_.reset(); - DidStopLoading(); + did_stop_loading = true; } - // ~SiteProcessCountTracker DCHECKs in some tests if CleanUpNavigation is not - // called last. Ideally this would be closer to (possible before) the - // ResetLoadingState() call above. - render_manager_.CleanUpNavigation(); + // ~SiteProcessCountTracker DCHECKs in some tests if the speculative + // RenderFrameHostImpl is not destroyed last. Ideally this would be closer to + // (possible before) the ResetLoadingState() call above. + // + // There is an inherent race condition causing bugs 838348/915179/et al, where + // the renderer may have committed the speculative main frame and the browser + // has not heard about it yet. If this is a main frame, then in that case the + // speculative RenderFrame was unable to be deleted (it is owned by the + // renderer) and we should not be able to cancel the navigation at this point. + // CleanUpNavigation() would normally be called here but it will try to undo + // the navigation and expose the race condition. When it replaces the main + // frame with a RenderFrameProxy, that leaks the committed main frame, leaving + // the frame and its friend group with pointers that will become invalid + // shortly as we are shutting everything down and deleting the RenderView etc. + // We avoid this problematic situation by not calling CleanUpNavigation() or + // DiscardUnusedFrame() here. The speculative RenderFrameHost is simply + // returned and deleted immediately. This satisfies the requirement that the + // speculative RenderFrameHost is removed from the RenderFrameHostManager + // before it is destroyed. + if (render_manager_.speculative_frame_host()) { + did_stop_loading |= render_manager_.speculative_frame_host()->is_loading(); + render_manager_.UnsetSpeculativeRenderFrameHost(); + } + + if (did_stop_loading) + DidStopLoading(); + DCHECK(!IsLoading()); }
diff --git a/content/browser/frame_host/frame_tree_node_blame_context_unittest.cc b/content/browser/frame_host/frame_tree_node_blame_context_unittest.cc index 1b7f75b..db4933d1 100644 --- a/content/browser/frame_host/frame_tree_node_blame_context_unittest.cc +++ b/content/browser/frame_host/frame_tree_node_blame_context_unittest.cc
@@ -149,7 +149,7 @@ EXPECT_NE(nullptr, node); if (event->HasArg("snapshot")) { ExpectFrameTreeNodeSnapshot(event); - EXPECT_FALSE(base::ContainsKey(snapshot_traced, node)); + EXPECT_FALSE(base::Contains(snapshot_traced, node)); snapshot_traced.insert(node); std::string parent_id = GetParentNodeID(event); EXPECT_FALSE(parent_id.empty()); @@ -157,7 +157,7 @@ tree()->FindByID(strtol(parent_id.c_str(), nullptr, 16))); } else { EXPECT_EQ(TRACE_EVENT_PHASE_CREATE_OBJECT, event->phase); - EXPECT_FALSE(base::ContainsKey(creation_traced, node)); + EXPECT_FALSE(base::Contains(creation_traced, node)); creation_traced.insert(node); } } @@ -196,7 +196,7 @@ for (auto* event : events) { ExpectFrameTreeNodeObject(event); int id = strtol(event->id.c_str(), nullptr, 16); - EXPECT_TRUE(base::ContainsKey(node_ids, id)); + EXPECT_TRUE(base::Contains(node_ids, id)); node_ids.erase(id); } }
diff --git a/content/browser/frame_host/mixed_content_navigation_throttle.cc b/content/browser/frame_host/mixed_content_navigation_throttle.cc index 3fa9d5f..7dde101e 100644 --- a/content/browser/frame_host/mixed_content_navigation_throttle.cc +++ b/content/browser/frame_host/mixed_content_navigation_throttle.cc
@@ -31,13 +31,13 @@ // Should return the same value as SchemeRegistry::shouldTreatURLSchemeAsSecure. bool IsSecureScheme(const std::string& scheme) { - return base::ContainsValue(url::GetSecureSchemes(), scheme); + return base::Contains(url::GetSecureSchemes(), scheme); } // Should return the same value as SecurityOrigin::isLocal and // SchemeRegistry::shouldTreatURLSchemeAsCorsEnabled. bool ShouldTreatURLSchemeAsCorsEnabled(const GURL& url) { - return base::ContainsValue(url::GetCorsEnabledSchemes(), url.scheme()); + return base::Contains(url::GetCorsEnabledSchemes(), url.scheme()); } // Should return the same value as the resource URL checks assigned to
diff --git a/content/browser/frame_host/render_frame_host_impl.cc b/content/browser/frame_host/render_frame_host_impl.cc index 5426a98c..98ac2696 100644 --- a/content/browser/frame_host/render_frame_host_impl.cc +++ b/content/browser/frame_host/render_frame_host_impl.cc
@@ -1716,7 +1716,7 @@ // TODO(arthursonzogni): url::GetBypassingCSPScheme() is used instead of the // blink::SchemeRegistry. It contains 1) but not 2). const auto& bypassing_schemes = url::GetCSPBypassingSchemes(); - return base::ContainsValue(bypassing_schemes, scheme); + return base::Contains(bypassing_schemes, scheme); } mojom::FrameInputHandler* RenderFrameHostImpl::GetFrameInputHandler() { @@ -4468,7 +4468,7 @@ // ask it once. while (!rfh->is_local_root() && rfh != this) rfh = rfh->GetParent(); - if (base::ContainsKey(beforeunload_pending_replies_, rfh)) + if (base::Contains(beforeunload_pending_replies_, rfh)) continue; // For a case like A(B(A)), it's not necessary to send an IPC for the @@ -4783,7 +4783,7 @@ // See if this is for WebUI. std::string scheme = common_params.url.scheme(); const auto& webui_schemes = URLDataManagerBackend::GetWebUISchemes(); - if (base::ContainsValue(webui_schemes, scheme)) { + if (base::Contains(webui_schemes, scheme)) { network::mojom::URLLoaderFactoryPtr factory_for_webui = CreateWebUIURLLoaderBinding(this, scheme); // If the renderer has webui bindings, then don't give it access to @@ -6340,6 +6340,33 @@ base::debug::CrashKeySize::Size256), GetSiteInstance()->lock_url().spec()); + base::debug::SetCrashKeyString( + base::debug::AllocateCrashKeyString("original_url_origin", + base::debug::CrashKeySize::Size256), + GetSiteInstance()->original_url().GetOrigin().spec()); + + base::debug::SetCrashKeyString( + base::debug::AllocateCrashKeyString("is_transfer_needed", + base::debug::CrashKeySize::Size32), + bool_to_crash_key(frame_tree_node_->render_manager() + ->IsRendererTransferNeededForNavigation( + this, validated_params->url))); + + base::debug::SetCrashKeyString( + base::debug::AllocateCrashKeyString("is_mhtml_document", + base::debug::CrashKeySize::Size32), + bool_to_crash_key(is_mhtml_document())); + + base::debug::SetCrashKeyString( + base::debug::AllocateCrashKeyString("last_committed_url_origin", + base::debug::CrashKeySize::Size256), + GetLastCommittedURL().GetOrigin().spec()); + + base::debug::SetCrashKeyString( + base::debug::AllocateCrashKeyString("last_successful_url_origin", + base::debug::CrashKeySize::Size256), + last_successful_url().GetOrigin().spec()); + if (navigation_request && navigation_request->navigation_handle()) { NavigationHandleImpl* handle = navigation_request->navigation_handle(); base::debug::SetCrashKeyString( @@ -6364,6 +6391,11 @@ base::debug::SetCrashKeyString( base::debug::AllocateCrashKeyString( + "from_begin_navigation", base::debug::CrashKeySize::Size32), + bool_to_crash_key(navigation_request->from_begin_navigation())); + + base::debug::SetCrashKeyString( + base::debug::AllocateCrashKeyString( "net_error_code", base::debug::CrashKeySize::Size32), base::NumberToString(navigation_request->net_error())); @@ -6378,6 +6410,17 @@ base::debug::AllocateCrashKeyString( "starting_site_instance", base::debug::CrashKeySize::Size64), handle->GetStartingSiteInstance()->GetSiteURL().spec()); + + // Recompute the target SiteInstance to see if it matches the current one + // at commit time. + scoped_refptr<SiteInstance> dest_instance = + frame_tree_node_->render_manager() + ->GetSiteInstanceForNavigationRequest(*navigation_request); + base::debug::SetCrashKeyString( + base::debug::AllocateCrashKeyString( + "does_recomputed_site_instance_match", + base::debug::CrashKeySize::Size32), + bool_to_crash_key(dest_instance == GetSiteInstance())); } // Kills the process.
diff --git a/content/browser/gpu/compositor_util.cc b/content/browser/gpu/compositor_util.cc index e850ca4..49db19a 100644 --- a/content/browser/gpu/compositor_util.cc +++ b/content/browser/gpu/compositor_util.cc
@@ -48,13 +48,25 @@ enum class GpuFeatureInfoType { kCurrent, kForHardwareGpu }; +struct DisableInfo { + // The feature being disabled will be listed as a problem with |description|. + static DisableInfo Problem(const std::string& description) { + return DisableInfo{true, description}; + } + + // The feature being disabled will not be listed as a problem. + static DisableInfo NotProblem() { return DisableInfo{false, ""}; } + + bool is_problem; + std::string description; +}; + struct GpuFeatureData { std::string name; gpu::GpuFeatureStatus status; bool disabled; - std::string disabled_description; + DisableInfo disabled_info; bool fallback_to_software; - bool needs_gpu_access; }; bool IsForceGpuRasterizationEnabled() { @@ -103,117 +115,113 @@ *base::CommandLine::ForCurrentProcess(); const GpuFeatureData kGpuFeatureData[] = { - {"2d_canvas", - SafeGetFeatureStatus(gpu_feature_info, - gpu::GPU_FEATURE_TYPE_ACCELERATED_2D_CANVAS), - command_line.HasSwitch(switches::kDisableAccelerated2dCanvas), - "Accelerated 2D canvas is unavailable: either disabled via blacklist or" - " the command line.", - true, true}, - {"gpu_compositing", GetGpuCompositingStatus(gpu_feature_info, type), - command_line.HasSwitch(switches::kDisableGpuCompositing), - "Gpu compositing has been disabled, either via blacklist, about:flags " - "or the command line. The browser will fall back to software " - "compositing and hardware acceleration will be unavailable.", - true, true}, - {"webgl", - SafeGetFeatureStatus(gpu_feature_info, - gpu::GPU_FEATURE_TYPE_ACCELERATED_WEBGL), - command_line.HasSwitch(switches::kDisableWebGL), - "WebGL has been disabled via blacklist or the command line.", false, - true}, - {"flash_3d", - SafeGetFeatureStatus(gpu_feature_info, gpu::GPU_FEATURE_TYPE_FLASH3D), - command_line.HasSwitch(switches::kDisableFlash3d), - "Using 3d in flash has been disabled, either via blacklist, about:flags " - "or the command line.", - true, true}, - {"flash_stage3d", - SafeGetFeatureStatus(gpu_feature_info, - gpu::GPU_FEATURE_TYPE_FLASH_STAGE3D), - command_line.HasSwitch(switches::kDisableFlashStage3d), - "Using Stage3d in Flash has been disabled, either via blacklist, " - "about:flags or the command line.", - true, true}, - {"flash_stage3d_baseline", - SafeGetFeatureStatus(gpu_feature_info, - gpu::GPU_FEATURE_TYPE_FLASH_STAGE3D_BASELINE), - command_line.HasSwitch(switches::kDisableFlashStage3d), - "Using Stage3d Baseline profile in Flash has been disabled, either via " - "blacklist, about:flags or the command line.", - true, true}, - {"protected_video_decode", - SafeGetFeatureStatus(gpu_feature_info, - gpu::GPU_FEATURE_TYPE_PROTECTED_VIDEO_DECODE), - false, "Protected video decode has been disabled, via blacklist.", false, - true}, - {"video_decode", - SafeGetFeatureStatus(gpu_feature_info, - gpu::GPU_FEATURE_TYPE_ACCELERATED_VIDEO_DECODE), - command_line.HasSwitch(switches::kDisableAcceleratedVideoDecode), - "Accelerated video decode has been disabled, either via blacklist, " - "about:flags or the command line.", - true, true}, - {"rasterization", - SafeGetFeatureStatus(gpu_feature_info, - gpu::GPU_FEATURE_TYPE_GPU_RASTERIZATION), - (command_line.HasSwitch(switches::kDisableGpuRasterization) && - !IsForceGpuRasterizationEnabled()), - "Accelerated rasterization has been disabled, either via blacklist, " - "about:flags or the command line.", - true, true}, - {"oop_rasterization", - SafeGetFeatureStatus(gpu_feature_info, - gpu::GPU_FEATURE_TYPE_OOP_RASTERIZATION), - command_line.HasSwitch(switches::kDisableOopRasterization), - "Out-of-process accelerated rasterization has been disabled, either " - "via blacklist, about:flags or the command line.", - false, true}, - {"metal", - SafeGetFeatureStatus(gpu_feature_info, gpu::GPU_FEATURE_TYPE_METAL), + {"2d_canvas", + SafeGetFeatureStatus(gpu_feature_info, + gpu::GPU_FEATURE_TYPE_ACCELERATED_2D_CANVAS), + command_line.HasSwitch(switches::kDisableAccelerated2dCanvas), + DisableInfo::Problem( + "Accelerated 2D canvas is unavailable: either disabled " + "via blacklist or the command line."), + true}, + {"gpu_compositing", GetGpuCompositingStatus(gpu_feature_info, type), + command_line.HasSwitch(switches::kDisableGpuCompositing), + DisableInfo::Problem( + "Gpu compositing has been disabled, either via blacklist, about:flags " + "or the command line. The browser will fall back to software " + "compositing and hardware acceleration will be unavailable."), + true}, + {"webgl", + SafeGetFeatureStatus(gpu_feature_info, + gpu::GPU_FEATURE_TYPE_ACCELERATED_WEBGL), + command_line.HasSwitch(switches::kDisableWebGL), + DisableInfo::Problem( + "WebGL has been disabled via blacklist or the command line."), + false}, + {"flash_3d", + SafeGetFeatureStatus(gpu_feature_info, gpu::GPU_FEATURE_TYPE_FLASH3D), + command_line.HasSwitch(switches::kDisableFlash3d), + DisableInfo::Problem("Using 3d in flash has been disabled, either via " + "blacklist, about:flags or the command line."), + true}, + {"flash_stage3d", + SafeGetFeatureStatus(gpu_feature_info, + gpu::GPU_FEATURE_TYPE_FLASH_STAGE3D), + command_line.HasSwitch(switches::kDisableFlashStage3d), + DisableInfo::Problem( + "Using Stage3d in Flash has been disabled, either via blacklist, " + "about:flags or the command line."), + true}, + {"flash_stage3d_baseline", + SafeGetFeatureStatus(gpu_feature_info, + gpu::GPU_FEATURE_TYPE_FLASH_STAGE3D_BASELINE), + command_line.HasSwitch(switches::kDisableFlashStage3d), + DisableInfo::Problem( + "Using Stage3d Baseline profile in Flash has been disabled, either " + "via blacklist, about:flags or the command line."), + true}, + {"protected_video_decode", + SafeGetFeatureStatus(gpu_feature_info, + gpu::GPU_FEATURE_TYPE_PROTECTED_VIDEO_DECODE), + false, + DisableInfo::Problem( + "Protected video decode has been disabled, via blacklist."), + false}, + {"video_decode", + SafeGetFeatureStatus(gpu_feature_info, + gpu::GPU_FEATURE_TYPE_ACCELERATED_VIDEO_DECODE), + command_line.HasSwitch(switches::kDisableAcceleratedVideoDecode), + DisableInfo::Problem( + "Accelerated video decode has been disabled, either via blacklist, " + "about:flags or the command line."), + true}, + {"rasterization", + SafeGetFeatureStatus(gpu_feature_info, + gpu::GPU_FEATURE_TYPE_GPU_RASTERIZATION), + (command_line.HasSwitch(switches::kDisableGpuRasterization) && + !IsForceGpuRasterizationEnabled()), + DisableInfo::Problem( + "Accelerated rasterization has been disabled, either via blacklist, " + "about:flags or the command line."), + true}, + {"oop_rasterization", + SafeGetFeatureStatus(gpu_feature_info, + gpu::GPU_FEATURE_TYPE_OOP_RASTERIZATION), + command_line.HasSwitch(switches::kDisableOopRasterization), + DisableInfo::NotProblem(), false}, #if defined(OS_MACOSX) - !base::FeatureList::IsEnabled(features::kMetal) /* disabled */, - "Metal is not enabled by default.", -#else - true /* disabled */, "Metal is only available on macOS.", + {"metal", + SafeGetFeatureStatus(gpu_feature_info, gpu::GPU_FEATURE_TYPE_METAL), + !base::FeatureList::IsEnabled(features::kMetal) /* disabled */, + DisableInfo::NotProblem(), false /* fallback_to_software */}, #endif - false /* fallback_to_software */, false /* needs_gpu_access */}, - {"multiple_raster_threads", gpu::kGpuFeatureStatusEnabled, - NumberOfRendererRasterThreads() == 1, "Raster is using a single thread.", - false, true}, - {"surface_control", - SafeGetFeatureStatus(gpu_feature_info, - gpu::GPU_FEATURE_TYPE_ANDROID_SURFACE_CONTROL), + {"multiple_raster_threads", gpu::kGpuFeatureStatusEnabled, + NumberOfRendererRasterThreads() == 1, + DisableInfo::Problem("Raster is using a single thread."), false}, #if defined(OS_ANDROID) - !features::IsAndroidSurfaceControlEnabled(), -#else - false, + {"surface_control", + SafeGetFeatureStatus(gpu_feature_info, + gpu::GPU_FEATURE_TYPE_ANDROID_SURFACE_CONTROL), + !features::IsAndroidSurfaceControlEnabled(), + DisableInfo::Problem( + "Surface Control has been disabled by Finch trial or command line."), + false}, #endif - "Surface Control has been disabled by Finch trial or command line.", - false, false}, - {"surface_synchronization", gpu::kGpuFeatureStatusEnabled, - !features::IsSurfaceSynchronizationEnabled(), - "Surface synchronization has been disabled by Finch trial or command " - "line.", - false, false}, - {"webgl2", - SafeGetFeatureStatus(gpu_feature_info, - gpu::GPU_FEATURE_TYPE_ACCELERATED_WEBGL2), - (command_line.HasSwitch(switches::kDisableWebGL) || - command_line.HasSwitch(switches::kDisableWebGL2)), - "WebGL2 has been disabled via blacklist or the command line.", false, - true}, - {"viz_display_compositor", gpu::kGpuFeatureStatusEnabled, - !features::IsVizDisplayCompositorEnabled(), - "Viz service display compositor is not enabled by default.", false, - false}, - {"viz_hit_test_surface_layer", gpu::kGpuFeatureStatusEnabled, - !features::IsVizHitTestingSurfaceLayerEnabled(), - "Viz hit-test surface layer version is not enabled by default.", false, - false}, - {"skia_renderer", gpu::kGpuFeatureStatusEnabled, - !features::IsUsingSkiaRenderer(), - "Skia renderer is not used by default.", false, false}, + {"webgl2", + SafeGetFeatureStatus(gpu_feature_info, + gpu::GPU_FEATURE_TYPE_ACCELERATED_WEBGL2), + (command_line.HasSwitch(switches::kDisableWebGL) || + command_line.HasSwitch(switches::kDisableWebGL2)), + DisableInfo::Problem( + "WebGL2 has been disabled via blacklist or the command line."), + false}, + {"viz_display_compositor", gpu::kGpuFeatureStatusEnabled, + !features::IsVizDisplayCompositorEnabled(), DisableInfo::NotProblem(), + false}, + {"viz_hit_test_surface_layer", gpu::kGpuFeatureStatusEnabled, + !features::IsVizHitTestingSurfaceLayerEnabled(), DisableInfo::NotProblem(), + false}, + {"skia_renderer", gpu::kGpuFeatureStatusEnabled, + !features::IsUsingSkiaRenderer(), DisableInfo::NotProblem(), false}, }; DCHECK(index < base::size(kGpuFeatureData)); *eof = (index == base::size(kGpuFeatureData) - 1); @@ -238,10 +246,11 @@ const GpuFeatureData gpu_feature_data = GetGpuFeatureData(gpu_feature_info, type, i, &eof); std::string status; - if (gpu_feature_data.name == "surface_synchronization") { - status = (!gpu_feature_data.disabled ? "enabled_on" : "disabled_off"); - } else if (gpu_feature_data.name == "viz_display_compositor") { - status = (!gpu_feature_data.disabled ? "enabled_on" : "disabled_off"); + // Features undergoing a finch controlled roll out. + if (gpu_feature_data.name == "viz_display_compositor" || + gpu_feature_data.name == "skia_renderer" || + gpu_feature_data.name == "viz_hit_test_surface_layer") { + status = (gpu_feature_data.disabled ? "disabled_off_ok" : "enabled_on"); } else if (gpu_feature_data.disabled || gpu_access_blocked || gpu_feature_data.status == gpu::kGpuFeatureStatusDisabled) { status = "disabled"; @@ -271,16 +280,10 @@ status += "_force"; status += "_on"; } - if (gpu_feature_data.name == "skia_renderer") { - if (features::IsUsingSkiaRenderer()) - status += "_on"; - } - if (gpu_feature_data.name == "viz_hit_test_surface_layer") { - if (features::IsVizHitTestingSurfaceLayerEnabled()) - status += "_on"; - } - if (gpu_feature_data.name == "metal") + if (gpu_feature_data.name == "metal" || + gpu_feature_data.name == "surface_control") { status += "_on"; + } } feature_status_dict->SetString(gpu_feature_data.name, status); } @@ -326,9 +329,11 @@ for (size_t i = 0; !eof; ++i) { const GpuFeatureData gpu_feature_data = GetGpuFeatureData(gpu_feature_info, type, i, &eof); - if (gpu_feature_data.disabled) { + if (gpu_feature_data.disabled && + gpu_feature_data.disabled_info.is_problem) { auto problem = std::make_unique<base::DictionaryValue>(); - problem->SetString("description", gpu_feature_data.disabled_description); + problem->SetString("description", + gpu_feature_data.disabled_info.description); problem->Set("crBugs", std::make_unique<base::ListValue>()); auto disabled_features = std::make_unique<base::ListValue>(); disabled_features->AppendString(gpu_feature_data.name);
diff --git a/content/browser/gpu/gpu_internals_ui.cc b/content/browser/gpu/gpu_internals_ui.cc index 76fa8b65..9c9d6af 100644 --- a/content/browser/gpu/gpu_internals_ui.cc +++ b/content/browser/gpu/gpu_internals_ui.cc
@@ -310,7 +310,7 @@ if (i > 0) buffer_formats += ", "; buffer_formats += gfx::BufferFormatToString(buffer_format); - const bool supported = base::ContainsValue( + const bool supported = base::Contains( gpu_feature_info.supported_buffer_formats_for_allocation_and_texturing, buffer_format); buffer_formats += supported ? ": supported" : ": not supported"; @@ -365,7 +365,7 @@ std::string native_usage_support; for (size_t usage = 0; usage < static_cast<size_t>(gfx::BufferUsage::LAST) + 1; usage++) { - if (base::ContainsKey( + if (base::Contains( native_configurations, std::make_pair(static_cast<gfx::BufferFormat>(format), static_cast<gfx::BufferUsage>(usage)))) {
diff --git a/content/browser/gpu/gpu_process_host.cc b/content/browser/gpu/gpu_process_host.cc index f34cfb5..1c20823 100644 --- a/content/browser/gpu/gpu_process_host.cc +++ b/content/browser/gpu/gpu_process_host.cc
@@ -276,8 +276,8 @@ void OnGpuProcessHostDestroyedOnUI(int host_id, const std::string& message) { DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); - GpuDataManagerImpl::GetInstance()->AddLogMessage( - logging::LOG_ERROR, "GpuProcessHostUIShim", message); + GpuDataManagerImpl::GetInstance()->AddLogMessage(logging::LOG_ERROR, + "GpuProcessHost", message); #if defined(USE_OZONE) ui::OzonePlatform::GetInstance() ->GetGpuPlatformSupportHost() @@ -719,23 +719,28 @@ gpu::GpuSurfaceTracker::Get()->GetSurfaceCount()); #endif - std::string message; bool block_offscreen_contexts = true; - if (!in_process_ && process_launched_ && - kind_ == GPU_PROCESS_KIND_SANDBOXED) { + if (!in_process_ && process_launched_) { ChildProcessTerminationInfo info = process_->GetTerminationInfo(false /* known_dead */); - UMA_HISTOGRAM_ENUMERATION("GPU.GPUProcessTerminationStatus2", - ConvertToGpuTerminationStatus(info.status), - GpuTerminationStatus::MAX_ENUM); + std::string message; + if (kind_ == GPU_PROCESS_KIND_SANDBOXED) { + UMA_HISTOGRAM_ENUMERATION("GPU.GPUProcessTerminationStatus2", + ConvertToGpuTerminationStatus(info.status), + GpuTerminationStatus::MAX_ENUM); - if (info.status == base::TERMINATION_STATUS_NORMAL_TERMINATION || - info.status == base::TERMINATION_STATUS_ABNORMAL_TERMINATION || - info.status == base::TERMINATION_STATUS_PROCESS_CRASHED) { - // Windows always returns PROCESS_CRASHED on abnormal termination, as it - // doesn't have a way to distinguish the two. - base::UmaHistogramSparse("GPU.GPUProcessExitCode", - std::max(0, std::min(100, info.exit_code))); + if (info.status == base::TERMINATION_STATUS_NORMAL_TERMINATION || + info.status == base::TERMINATION_STATUS_ABNORMAL_TERMINATION || + info.status == base::TERMINATION_STATUS_PROCESS_CRASHED) { + // Windows always returns PROCESS_CRASHED on abnormal termination, as it + // doesn't have a way to distinguish the two. + base::UmaHistogramSparse("GPU.GPUProcessExitCode", + std::max(0, std::min(100, info.exit_code))); + } + + message = "The GPU process "; + } else { + message = "The unsandboxed GPU process "; } switch (info.status) { @@ -748,32 +753,46 @@ #if defined(OS_ANDROID) block_offscreen_contexts = false; #endif - message = "The GPU process exited normally. Everything is okay."; + message += "exited normally. Everything is okay."; break; case base::TERMINATION_STATUS_ABNORMAL_TERMINATION: - message = base::StringPrintf("The GPU process exited with code %d.", - info.exit_code); + message += base::StringPrintf("exited with code %d.", info.exit_code); break; case base::TERMINATION_STATUS_PROCESS_WAS_KILLED: UMA_HISTOGRAM_ENUMERATION("GPU.GPUProcessTerminationOrigin", termination_origin_, GpuTerminationOrigin::kMax); - message = "You killed the GPU process! Why?"; + message += "was killded by you! Why?"; + break; + case base::TERMINATION_STATUS_PROCESS_CRASHED: + message += "crashed!"; + break; + case base::TERMINATION_STATUS_STILL_RUNNING: + message += "hasn't exited yet."; break; #if defined(OS_CHROMEOS) case base::TERMINATION_STATUS_PROCESS_WAS_KILLED_BY_OOM: - message = "The GUP process was killed due to out of memory."; + message += "was killed due to out of memory."; break; -#endif - case base::TERMINATION_STATUS_PROCESS_CRASHED: - message = "The GPU process crashed!"; +#endif // OS_CHROMEOS +#if defined(OS_ANDROID) + case base::TERMINATION_STATUS_OOM_PROTECTED: + message += "was protected from out of memory kill."; break; +#endif // OS_ANDROID case base::TERMINATION_STATUS_LAUNCH_FAILED: - message = "The GPU process failed to start!"; + message += "failed to start!"; break; - default: + case base::TERMINATION_STATUS_OOM: + message += "died due to out of memory."; + break; + case base::TERMINATION_STATUS_MAX_ENUM: + NOTREACHED(); break; } + base::PostTaskWithTraits( + FROM_HERE, {BrowserThread::UI}, + base::BindOnce(&OnGpuProcessHostDestroyedOnUI, host_id_, message)); } // If there are any remaining offscreen contexts at the point the GPU process @@ -782,10 +801,6 @@ if (block_offscreen_contexts && gpu_host_) gpu_host_->BlockLiveOffscreenContexts(); - base::PostTaskWithTraits( - FROM_HERE, {BrowserThread::UI}, - base::BindOnce(&OnGpuProcessHostDestroyedOnUI, host_id_, message)); - if (ServiceManagerConnection::GetForProcess()) { ServiceManagerConnection::GetForProcess()->RemoveConnectionFilter( connection_filter_id_);
diff --git a/content/browser/gpu/gpu_process_host.h b/content/browser/gpu/gpu_process_host.h index 20974e3..327f186 100644 --- a/content/browser/gpu/gpu_process_host.h +++ b/content/browser/gpu/gpu_process_host.h
@@ -173,7 +173,7 @@ // Update GPU crash counters. Disable GPU if crash limit is reached. void RecordProcessCrash(); - // The serial number of the GpuProcessHost / GpuProcessHostUIShim pair. + // The serial number of the GpuProcessHost. int host_id_; // GPU process id in case GPU is not in-process.
diff --git a/content/browser/host_zoom_map_impl.cc b/content/browser/host_zoom_map_impl.cc index 3ce022d..d1acf73 100644 --- a/content/browser/host_zoom_map_impl.cc +++ b/content/browser/host_zoom_map_impl.cc
@@ -159,7 +159,7 @@ ? scheme_iterator->second : host_zoom_levels_; - return base::ContainsKey(zoom_levels, host); + return base::Contains(zoom_levels, host); } double HostZoomMapImpl::GetZoomLevelForHostAndScheme(const std::string& scheme, @@ -434,7 +434,7 @@ int render_view_id) { DCHECK_CURRENTLY_ON(BrowserThread::UI); RenderViewKey key(render_process_id, render_view_id); - return base::ContainsKey(temporary_zoom_levels_, key); + return base::Contains(temporary_zoom_levels_, key); } double HostZoomMapImpl::GetTemporaryZoomLevel(int render_process_id, @@ -472,7 +472,7 @@ DCHECK_CURRENTLY_ON(BrowserThread::UI); RenderViewKey key(render_process_id, render_view_id); - if (base::ContainsKey(temporary_zoom_levels_, key)) + if (base::Contains(temporary_zoom_levels_, key)) return temporary_zoom_levels_.find(key)->second; return GetZoomLevelForHostAndScheme(url.scheme(),
diff --git a/content/browser/indexed_db/indexed_db_active_blob_registry.cc b/content/browser/indexed_db/indexed_db_active_blob_registry.cc index 370906e..798604a8 100644 --- a/content/browser/indexed_db/indexed_db_active_blob_registry.cc +++ b/content/browser/indexed_db/indexed_db_active_blob_registry.cc
@@ -26,7 +26,7 @@ DCHECK(backing_store_->task_runner()->RunsTasksInCurrentSequence()); DCHECK(KeyPrefix::IsValidDatabaseId(database_id)); DCHECK(DatabaseMetaDataKey::IsValidBlobKey(blob_key)); - DCHECK(!base::ContainsKey(deleted_dbs_, database_id)); + DCHECK(!base::Contains(deleted_dbs_, database_id)); bool need_ref = use_tracker_.empty(); SingleDBMap& single_db_map = use_tracker_[database_id]; auto iter = single_db_map.find(blob_key);
diff --git a/content/browser/indexed_db/indexed_db_connection.cc b/content/browser/indexed_db/indexed_db_connection.cc index ea768af3..ebe2dc5 100644 --- a/content/browser/indexed_db/indexed_db_connection.cc +++ b/content/browser/indexed_db/indexed_db_connection.cc
@@ -170,7 +170,7 @@ IndexedDBConnection::AddTransactionForTesting( std::unique_ptr<IndexedDBTransaction> transaction) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - DCHECK(!base::ContainsKey(transactions_, transaction->id())); + DCHECK(!base::Contains(transactions_, transaction->id())); base::WeakPtr<IndexedDBTransaction> transaction_ptr = transaction->ptr_factory_.GetWeakPtr(); transactions_[transaction->id()] = std::move(transaction);
diff --git a/content/browser/indexed_db/indexed_db_database.cc b/content/browser/indexed_db/indexed_db_database.cc index 37b839a..9738331 100644 --- a/content/browser/indexed_db/indexed_db_database.cc +++ b/content/browser/indexed_db/indexed_db_database.cc
@@ -637,7 +637,7 @@ } bool IndexedDBDatabase::ValidateObjectStoreId(int64_t object_store_id) const { - if (!base::ContainsKey(metadata_.object_stores, object_store_id)) { + if (!base::Contains(metadata_.object_stores, object_store_id)) { DLOG(ERROR) << "Invalid object_store_id"; return false; } @@ -651,7 +651,7 @@ return false; const IndexedDBObjectStoreMetadata& object_store_metadata = metadata_.object_stores.find(object_store_id)->second; - if (!base::ContainsKey(object_store_metadata.indexes, index_id)) { + if (!base::Contains(object_store_metadata.indexes, index_id)) { DLOG(ERROR) << "Invalid index_id"; return false; } @@ -666,7 +666,7 @@ const IndexedDBObjectStoreMetadata& object_store_metadata = metadata_.object_stores.find(object_store_id)->second; if (index_id != IndexedDBIndexMetadata::kInvalidId && - !base::ContainsKey(object_store_metadata.indexes, index_id)) { + !base::Contains(object_store_metadata.indexes, index_id)) { DLOG(ERROR) << "Invalid index_id"; return false; } @@ -680,7 +680,7 @@ return false; const IndexedDBObjectStoreMetadata& object_store_metadata = metadata_.object_stores.find(object_store_id)->second; - if (base::ContainsKey(object_store_metadata.indexes, index_id)) { + if (base::Contains(object_store_metadata.indexes, index_id)) { DLOG(ERROR) << "Invalid index_id"; return false; } @@ -698,7 +698,7 @@ DCHECK_EQ(transaction->mode(), blink::mojom::IDBTransactionMode::VersionChange); - if (base::ContainsKey(metadata_.object_stores, object_store_id)) { + if (base::Contains(metadata_.object_stores, object_store_id)) { DLOG(ERROR) << "Invalid object_store_id"; return; }
diff --git a/content/browser/indexed_db/indexed_db_factory_impl.cc b/content/browser/indexed_db/indexed_db_factory_impl.cc index 2d0f9b1..304e7ae 100644 --- a/content/browser/indexed_db/indexed_db_factory_impl.cc +++ b/content/browser/indexed_db/indexed_db_factory_impl.cc
@@ -268,7 +268,7 @@ return; } - if (!base::ContainsValue(names, name)) { + if (!base::Contains(names, name)) { const int64_t version = 0; callbacks->OnSuccess(version); return; @@ -648,12 +648,12 @@ auto it = factories_per_origin_.find(origin); if (it == factories_per_origin_.end()) return false; - return base::ContainsKey(it->second->databases(), name); + return base::Contains(it->second->databases(), name); } bool IndexedDBFactoryImpl::IsBackingStoreOpen(const Origin& origin) const { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - return base::ContainsKey(factories_per_origin_, origin); + return base::Contains(factories_per_origin_, origin); } bool IndexedDBFactoryImpl::IsBackingStorePendingClose(
diff --git a/content/browser/indexed_db/indexed_db_observer.h b/content/browser/indexed_db/indexed_db_observer.h index 3477bd3f..c641b28 100644 --- a/content/browser/indexed_db/indexed_db_observer.h +++ b/content/browser/indexed_db/indexed_db_observer.h
@@ -53,7 +53,7 @@ return options_.operation_types[static_cast<size_t>(type)]; } bool IsRecordingObjectStore(int64_t object_store_id) const { - return base::ContainsKey(object_store_ids_, object_store_id); + return base::Contains(object_store_ids_, object_store_id); } bool include_transaction() const { return options_.include_transaction; } bool no_records() const { return options_.no_records; }
diff --git a/content/browser/indexed_db/indexed_db_origin_state.cc b/content/browser/indexed_db/indexed_db_origin_state.cc index 27ad7cf..fefd258b 100644 --- a/content/browser/indexed_db/indexed_db_origin_state.cc +++ b/content/browser/indexed_db/indexed_db_origin_state.cc
@@ -169,7 +169,7 @@ const base::string16& name, std::unique_ptr<IndexedDBDatabase> database) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - DCHECK(!base::ContainsKey(databases_, name)); + DCHECK(!base::Contains(databases_, name)); return databases_.emplace(name, std::move(database)).first->second.get(); }
diff --git a/content/browser/indexed_db/indexed_db_transaction.cc b/content/browser/indexed_db/indexed_db_transaction.cc index 8abc24a..26b3f0767 100644 --- a/content/browser/indexed_db/indexed_db_transaction.cc +++ b/content/browser/indexed_db/indexed_db_transaction.cc
@@ -599,7 +599,7 @@ const auto& it = std::remove_if( pending_observers_.begin(), pending_observers_.end(), [&pending_observer_ids](const std::unique_ptr<IndexedDBObserver>& o) { - return base::ContainsValue(pending_observer_ids, o->id()); + return base::Contains(pending_observer_ids, o->id()); }); if (it != pending_observers_.end()) pending_observers_.erase(it, pending_observers_.end());
diff --git a/content/browser/indexed_db/scopes/disjoint_range_lock_manager.cc b/content/browser/indexed_db/scopes/disjoint_range_lock_manager.cc index 478a5c9..a18c6cd 100644 --- a/content/browser/indexed_db/scopes/disjoint_range_lock_manager.cc +++ b/content/browser/indexed_db/scopes/disjoint_range_lock_manager.cc
@@ -19,14 +19,13 @@ : requested_type(type), locks_holder(std::move(locks_holder)), acquired_callback(std::move(acquired_callback)) {} -DisjointRangeLockManager::LockRequest::LockRequest(LockRequest&&) noexcept = - default; +DisjointRangeLockManager::LockRequest::LockRequest(LockRequest&&) = default; DisjointRangeLockManager::LockRequest::~LockRequest() = default; DisjointRangeLockManager::Lock::Lock() = default; -DisjointRangeLockManager::Lock::Lock(Lock&&) noexcept = default; +DisjointRangeLockManager::Lock::Lock(Lock&&) = default; DisjointRangeLockManager::Lock::~Lock() = default; DisjointRangeLockManager::Lock& DisjointRangeLockManager::Lock::operator=( - DisjointRangeLockManager::Lock&&) noexcept = default; + DisjointRangeLockManager::Lock&&) = default; DisjointRangeLockManager::DisjointRangeLockManager(int level_count) : task_runner_(base::SequencedTaskRunnerHandle::Get()),
diff --git a/content/browser/loader/navigation_url_loader_impl.cc b/content/browser/loader/navigation_url_loader_impl.cc index 54e83f8f..fa94e2e05 100644 --- a/content/browser/loader/navigation_url_loader_impl.cc +++ b/content/browser/loader/navigation_url_loader_impl.cc
@@ -1523,7 +1523,7 @@ network::mojom::URLLoaderFactoryPtrInfo factory_for_webui; const auto& schemes = URLDataManagerBackend::GetWebUISchemes(); std::string scheme = new_request->url.scheme(); - if (base::ContainsValue(schemes, scheme)) { + if (base::Contains(schemes, scheme)) { factory_for_webui = CreateWebUIURLLoaderBinding( frame_tree_node->current_frame_host(), scheme) .PassInterface();
diff --git a/content/browser/loader/sec_fetch_site_resource_handler.cc b/content/browser/loader/sec_fetch_site_resource_handler.cc index 378981d..32e1497c 100644 --- a/content/browser/loader/sec_fetch_site_resource_handler.cc +++ b/content/browser/loader/sec_fetch_site_resource_handler.cc
@@ -5,7 +5,7 @@ #include "content/browser/loader/sec_fetch_site_resource_handler.h" #include "content/browser/loader/resource_request_info_impl.h" -#include "services/network/sec_fetch_site.h" +#include "services/network/sec_header_helpers.h" namespace content {
diff --git a/content/browser/locks/lock_manager.cc b/content/browser/locks/lock_manager.cc index 6d43a7e6..4fedfea 100644 --- a/content/browser/locks/lock_manager.cc +++ b/content/browser/locks/lock_manager.cc
@@ -336,7 +336,7 @@ const auto& context = bindings_.dispatch_context(); - if (!base::ContainsKey(origins_, context.origin)) + if (!base::Contains(origins_, context.origin)) origins_.emplace(context.origin, this); int64_t lock_id = NextLockId();
diff --git a/content/browser/media/audible_metrics.cc b/content/browser/media/audible_metrics.cc index 3c088161..13b7569 100644 --- a/content/browser/media/audible_metrics.cc +++ b/content/browser/media/audible_metrics.cc
@@ -32,7 +32,7 @@ void AudibleMetrics::WebContentsDestroyed(const WebContents* web_contents, bool recently_audible) { - if (base::ContainsKey(audible_web_contents_, web_contents)) + if (base::Contains(audible_web_contents_, web_contents)) RemoveAudibleWebContents(web_contents); // If we have two web contents and we go down to one, we should record
diff --git a/content/browser/media/capture/audio_mirroring_manager.cc b/content/browser/media/capture/audio_mirroring_manager.cc index b378381..eff29c39 100644 --- a/content/browser/media/capture/audio_mirroring_manager.cc +++ b/content/browser/media/capture/audio_mirroring_manager.cc
@@ -74,7 +74,7 @@ // Insert an entry into the set of active mirroring sessions, if this is a // previously-unknown destination. - if (!base::ContainsValue(sessions_, destination)) + if (!base::Contains(sessions_, destination)) sessions_.push_back(destination); std::set<GlobalFrameRoutingId> candidates; @@ -188,7 +188,7 @@ const std::set<GlobalFrameRoutingId>& matches) { lock_.AssertAcquired(); - if (!base::ContainsValue(sessions_, destination)) + if (!base::Contains(sessions_, destination)) return; // Query result callback invoked after StopMirroring(). DVLOG(1) << (add_only ? "Add " : "Replace with ") << matches.size() @@ -220,7 +220,7 @@ const std::set<GlobalFrameRoutingId>& matches) { lock_.AssertAcquired(); - if (!base::ContainsValue(sessions_, destination)) + if (!base::Contains(sessions_, destination)) return; // Query result callback invoked after StopMirroring(). for (auto it = routes_.begin(); it != routes_.end(); ++it) {
diff --git a/content/browser/media/midi_host.cc b/content/browser/media/midi_host.cc index 1b88a3f..b79d272 100644 --- a/content/browser/media/midi_host.cc +++ b/content/browser/media/midi_host.cc
@@ -203,7 +203,7 @@ // happens here in the browser process. // Check |has_sys_ex_permission_| first to avoid searching kSysExByte in large // bulk data transfers for correct uses. - if (!has_sys_ex_permission_ && base::ContainsValue(data, kSysExByte)) { + if (!has_sys_ex_permission_ && base::Contains(data, kSysExByte)) { if (!has_sys_ex_permission_) { has_sys_ex_permission_ = ChildProcessSecurityPolicyImpl::GetInstance()
diff --git a/content/browser/media/session/media_session_browsertest.cc b/content/browser/media/session/media_session_browsertest.cc index 4c8ff9ca..c251955 100644 --- a/content/browser/media/session/media_session_browsertest.cc +++ b/content/browser/media/session/media_session_browsertest.cc
@@ -134,7 +134,7 @@ bool WasURLVisited(const GURL& url) { base::AutoLock lock(visited_urls_lock_); - return base::ContainsKey(visited_urls_, url); + return base::Contains(visited_urls_, url); } MediaSession* SetupMediaImageTest() {
diff --git a/content/browser/media/session/media_session_impl.cc b/content/browser/media/session/media_session_impl.cc index 6c67965..1c54a20 100644 --- a/content/browser/media/session/media_session_impl.cc +++ b/content/browser/media/session/media_session_impl.cc
@@ -854,7 +854,7 @@ // We should make sure |image| is in |images_|. bool found = false; for (auto& image_type : images_) - found = found || base::ContainsValue(image_type.second, image); + found = found || base::Contains(image_type.second, image); // Check that |image.sizes| contains a size that is above the minimum size. bool check_size = false; @@ -1106,8 +1106,7 @@ bool MediaSessionImpl::ShouldRouteAction( media_session::mojom::MediaSessionAction action) const { - return routed_service_ && - base::ContainsKey(routed_service_->actions(), action); + return routed_service_ && base::Contains(routed_service_->actions(), action); } void MediaSessionImpl::RebuildAndNotifyActionsChanged() {
diff --git a/content/browser/native_file_system/file_system_chooser_browsertest.cc b/content/browser/native_file_system/file_system_chooser_browsertest.cc index 253ffb2..614583b 100644 --- a/content/browser/native_file_system/file_system_chooser_browsertest.cc +++ b/content/browser/native_file_system/file_system_chooser_browsertest.cc
@@ -197,10 +197,10 @@ dialog_params.file_types->extensions[0][0]); EXPECT_EQ(FILE_PATH_LITERAL("txt"), dialog_params.file_types->extensions[0][1]); - EXPECT_TRUE(base::ContainsValue(dialog_params.file_types->extensions[1], - FILE_PATH_LITERAL("jpg"))); - EXPECT_TRUE(base::ContainsValue(dialog_params.file_types->extensions[1], - FILE_PATH_LITERAL("jpeg"))); + EXPECT_TRUE(base::Contains(dialog_params.file_types->extensions[1], + FILE_PATH_LITERAL("jpg"))); + EXPECT_TRUE(base::Contains(dialog_params.file_types->extensions[1], + FILE_PATH_LITERAL("jpeg"))); ASSERT_EQ(2u, dialog_params.file_types->extension_description_overrides.size());
diff --git a/content/browser/native_file_system/file_system_chooser_unittest.cc b/content/browser/native_file_system/file_system_chooser_unittest.cc index 0c30b8e3..936184c 100644 --- a/content/browser/native_file_system/file_system_chooser_unittest.cc +++ b/content/browser/native_file_system/file_system_chooser_unittest.cc
@@ -85,21 +85,21 @@ EXPECT_TRUE(dialog_params.file_types->include_all_files); ASSERT_EQ(2u, dialog_params.file_types->extensions.size()); - EXPECT_TRUE(base::ContainsValue(dialog_params.file_types->extensions[0], - FILE_PATH_LITERAL("text"))); - EXPECT_TRUE(base::ContainsValue(dialog_params.file_types->extensions[0], - FILE_PATH_LITERAL("txt"))); + EXPECT_TRUE(base::Contains(dialog_params.file_types->extensions[0], + FILE_PATH_LITERAL("text"))); + EXPECT_TRUE(base::Contains(dialog_params.file_types->extensions[0], + FILE_PATH_LITERAL("txt"))); - EXPECT_TRUE(base::ContainsValue(dialog_params.file_types->extensions[1], - FILE_PATH_LITERAL("gif"))); - EXPECT_TRUE(base::ContainsValue(dialog_params.file_types->extensions[1], - FILE_PATH_LITERAL("jpg"))); - EXPECT_TRUE(base::ContainsValue(dialog_params.file_types->extensions[1], - FILE_PATH_LITERAL("jpeg"))); - EXPECT_TRUE(base::ContainsValue(dialog_params.file_types->extensions[1], - FILE_PATH_LITERAL("png"))); - EXPECT_TRUE(base::ContainsValue(dialog_params.file_types->extensions[1], - FILE_PATH_LITERAL("tiff"))); + EXPECT_TRUE(base::Contains(dialog_params.file_types->extensions[1], + FILE_PATH_LITERAL("gif"))); + EXPECT_TRUE(base::Contains(dialog_params.file_types->extensions[1], + FILE_PATH_LITERAL("jpg"))); + EXPECT_TRUE(base::Contains(dialog_params.file_types->extensions[1], + FILE_PATH_LITERAL("jpeg"))); + EXPECT_TRUE(base::Contains(dialog_params.file_types->extensions[1], + FILE_PATH_LITERAL("png"))); + EXPECT_TRUE(base::Contains(dialog_params.file_types->extensions[1], + FILE_PATH_LITERAL("tiff"))); ASSERT_EQ(2u, dialog_params.file_types->extension_description_overrides.size()); @@ -124,10 +124,10 @@ ASSERT_EQ(1u, dialog_params.file_types->extensions.size()); EXPECT_EQ(2u, dialog_params.file_types->extensions[0].size()); - EXPECT_TRUE(base::ContainsValue(dialog_params.file_types->extensions[0], - FILE_PATH_LITERAL("text"))); - EXPECT_TRUE(base::ContainsValue(dialog_params.file_types->extensions[0], - FILE_PATH_LITERAL("js"))); + EXPECT_TRUE(base::Contains(dialog_params.file_types->extensions[0], + FILE_PATH_LITERAL("text"))); + EXPECT_TRUE(base::Contains(dialog_params.file_types->extensions[0], + FILE_PATH_LITERAL("js"))); ASSERT_EQ(1u, dialog_params.file_types->extension_description_overrides.size()); @@ -149,12 +149,12 @@ EXPECT_FALSE(dialog_params.file_types->include_all_files); ASSERT_EQ(1u, dialog_params.file_types->extensions.size()); - EXPECT_TRUE(base::ContainsValue(dialog_params.file_types->extensions[0], - FILE_PATH_LITERAL("text"))); - EXPECT_TRUE(base::ContainsValue(dialog_params.file_types->extensions[0], - FILE_PATH_LITERAL("gif"))); - EXPECT_TRUE(base::ContainsValue(dialog_params.file_types->extensions[0], - FILE_PATH_LITERAL("jpeg"))); + EXPECT_TRUE(base::Contains(dialog_params.file_types->extensions[0], + FILE_PATH_LITERAL("text"))); + EXPECT_TRUE(base::Contains(dialog_params.file_types->extensions[0], + FILE_PATH_LITERAL("gif"))); + EXPECT_TRUE(base::Contains(dialog_params.file_types->extensions[0], + FILE_PATH_LITERAL("jpeg"))); EXPECT_EQ(1, base::STLCount(dialog_params.file_types->extensions[0], FILE_PATH_LITERAL("jpg")));
diff --git a/content/browser/payments/payment_app_content_unittest_base.cc b/content/browser/payments/payment_app_content_unittest_base.cc index 4359317..fb08f0b 100644 --- a/content/browser/payments/payment_app_content_unittest_base.cc +++ b/content/browser/payments/payment_app_content_unittest_base.cc
@@ -224,7 +224,7 @@ // Find a last registered payment manager. for (const auto& candidate_manager : payment_app_context()->payment_managers_) { - if (!base::ContainsKey(existing_managers, candidate_manager.first)) { + if (!base::Contains(existing_managers, candidate_manager.first)) { candidate_manager.first->Init(sw_script_url, scope_url.spec()); base::RunLoop().RunUntilIdle(); return candidate_manager.first;
diff --git a/content/browser/payments/payment_app_context_impl.cc b/content/browser/payments/payment_app_context_impl.cc index f091da1..3d064815 100644 --- a/content/browser/payments/payment_app_context_impl.cc +++ b/content/browser/payments/payment_app_context_impl.cc
@@ -56,7 +56,7 @@ void PaymentAppContextImpl::PaymentManagerHadConnectionError( PaymentManager* payment_manager) { DCHECK_CURRENTLY_ON(BrowserThread::IO); - DCHECK(base::ContainsKey(payment_managers_, payment_manager)); + DCHECK(base::Contains(payment_managers_, payment_manager)); payment_managers_.erase(payment_manager); }
diff --git a/content/browser/payments/payment_app_database.cc b/content/browser/payments/payment_app_database.cc index 4184308..a8e381cb 100644 --- a/content/browser/payments/payment_app_database.cc +++ b/content/browser/payments/payment_app_database.cc
@@ -570,7 +570,7 @@ continue; int64_t id = instrument_proto.registration_id(); - if (!base::ContainsKey(apps, id)) + if (!base::Contains(apps, id)) continue; apps[id]->enabled_methods.emplace_back(instrument_proto.method());
diff --git a/content/browser/renderer_host/media/media_devices_manager.cc b/content/browser/renderer_host/media/media_devices_manager.cc index e6ebdee..2d04cea 100644 --- a/content/browser/renderer_host/media/media_devices_manager.cc +++ b/content/browser/renderer_host/media/media_devices_manager.cc
@@ -792,7 +792,7 @@ size_t capabilities_index, const base::Optional<media::AudioParameters>& parameters) { DCHECK_CURRENTLY_ON(BrowserThread::IO); - DCHECK(base::ContainsKey(enumeration_states_, state_id)); + DCHECK(base::Contains(enumeration_states_, state_id)); auto& enumeration_state = enumeration_states_[state_id]; DCHECK_GT(enumeration_state.num_pending_audio_input_capabilities, 0);
diff --git a/content/browser/renderer_host/media/video_capture_controller.cc b/content/browser/renderer_host/media/video_capture_controller.cc index 35018e7..3a884b6 100644 --- a/content/browser/renderer_host/media/video_capture_controller.cc +++ b/content/browser/renderer_host/media/video_capture_controller.cc
@@ -510,15 +510,15 @@ // On the first use of a BufferContext for a particular client, call // OnBufferCreated(). - if (!base::ContainsValue(client->known_buffer_context_ids, - buffer_context_id)) { + if (!base::Contains(client->known_buffer_context_ids, + buffer_context_id)) { client->known_buffer_context_ids.push_back(buffer_context_id); client->event_handler->OnNewBuffer( client->controller_id, buffer_context_iter->CloneBufferHandle(), buffer_context_id); } - if (!base::ContainsValue(client->buffers_in_use, buffer_context_id)) + if (!base::Contains(client->buffers_in_use, buffer_context_id)) client->buffers_in_use.push_back(buffer_context_id); else NOTREACHED() << "Unexpected duplicate buffer: " << buffer_context_id;
diff --git a/content/browser/renderer_host/media/video_capture_host.cc b/content/browser/renderer_host/media/video_capture_host.cc index 8736e10..3d5ebd2 100644 --- a/content/browser/renderer_host/media/video_capture_host.cc +++ b/content/browser/renderer_host/media/video_capture_host.cc
@@ -125,7 +125,7 @@ if (controllers_.find(controller_id) == controllers_.end()) return; - if (base::ContainsKey(device_id_to_observer_map_, controller_id)) { + if (base::Contains(device_id_to_observer_map_, controller_id)) { device_id_to_observer_map_[controller_id]->OnNewBuffer( buffer_id, std::move(buffer_handle)); } @@ -137,7 +137,7 @@ if (controllers_.find(controller_id) == controllers_.end()) return; - if (base::ContainsKey(device_id_to_observer_map_, controller_id)) + if (base::Contains(device_id_to_observer_map_, controller_id)) device_id_to_observer_map_[controller_id]->OnBufferDestroyed(buffer_id); } @@ -149,7 +149,7 @@ if (controllers_.find(controller_id) == controllers_.end()) return; - if (!base::ContainsKey(device_id_to_observer_map_, controller_id)) + if (!base::Contains(device_id_to_observer_map_, controller_id)) return; device_id_to_observer_map_[controller_id]->OnBufferReady(buffer_id, @@ -171,7 +171,7 @@ if (controllers_.find(controller_id) == controllers_.end()) return; - if (base::ContainsKey(device_id_to_observer_map_, controller_id)) { + if (base::Contains(device_id_to_observer_map_, controller_id)) { device_id_to_observer_map_[controller_id]->OnStateChanged( media::mojom::VideoCaptureState::STARTED); NotifyStreamAdded(); @@ -189,7 +189,7 @@ << media::VideoCaptureFormat::ToString(params.requested_format); DCHECK_CURRENTLY_ON(BrowserThread::IO); - DCHECK(!base::ContainsKey(device_id_to_observer_map_, device_id)); + DCHECK(!base::Contains(device_id_to_observer_map_, device_id)); device_id_to_observer_map_[device_id] = std::move(observer); const VideoCaptureControllerID controller_id(device_id); @@ -213,7 +213,7 @@ VideoCaptureControllerID controller_id(device_id); - if (base::ContainsKey(device_id_to_observer_map_, device_id)) { + if (base::Contains(device_id_to_observer_map_, device_id)) { device_id_to_observer_map_[device_id]->OnStateChanged( media::mojom::VideoCaptureState::STOPPED); } @@ -234,7 +234,7 @@ media_stream_manager_->video_capture_manager()->PauseCaptureForClient( it->second.get(), controller_id, this); - if (base::ContainsKey(device_id_to_observer_map_, device_id)) { + if (base::Contains(device_id_to_observer_map_, device_id)) { device_id_to_observer_map_[device_id]->OnStateChanged( media::mojom::VideoCaptureState::PAUSED); } @@ -253,7 +253,7 @@ media_stream_manager_->video_capture_manager()->ResumeCaptureForClient( session_id, params, it->second.get(), controller_id, this); - if (base::ContainsKey(device_id_to_observer_map_, device_id)) { + if (base::Contains(device_id_to_observer_map_, device_id)) { device_id_to_observer_map_[device_id]->OnStateChanged( media::mojom::VideoCaptureState::RESUMED); } @@ -354,7 +354,7 @@ if (controllers_.find(controller_id) == controllers_.end()) return; - if (base::ContainsKey(device_id_to_observer_map_, controller_id)) { + if (base::Contains(device_id_to_observer_map_, controller_id)) { device_id_to_observer_map_[controller_id]->OnStateChanged( media::mojom::VideoCaptureState::FAILED); } @@ -369,7 +369,7 @@ if (controllers_.find(controller_id) == controllers_.end()) return; - if (base::ContainsKey(device_id_to_observer_map_, controller_id)) { + if (base::Contains(device_id_to_observer_map_, controller_id)) { device_id_to_observer_map_[controller_id]->OnStateChanged( media::mojom::VideoCaptureState::ENDED); } @@ -394,7 +394,7 @@ } if (!controller) { - if (base::ContainsKey(device_id_to_observer_map_, controller_id)) { + if (base::Contains(device_id_to_observer_map_, controller_id)) { device_id_to_observer_map_[device_id]->OnStateChanged( media::mojom::VideoCaptureState::FAILED); }
diff --git a/content/browser/renderer_host/media/video_capture_manager.cc b/content/browser/renderer_host/media/video_capture_manager.cc index abc205a8..37d67c6 100644 --- a/content/browser/renderer_host/media/video_capture_manager.cc +++ b/content/browser/renderer_host/media/video_capture_manager.cc
@@ -814,7 +814,7 @@ bool VideoCaptureManager::IsControllerPointerValid( const VideoCaptureController* controller) const { DCHECK_CURRENTLY_ON(BrowserThread::IO); - return base::ContainsValue(controllers_, controller); + return base::Contains(controllers_, controller); } scoped_refptr<VideoCaptureController>
diff --git a/content/browser/renderer_host/plugin_registry_impl.cc b/content/browser/renderer_host/plugin_registry_impl.cc index 8dd463f..77df339 100644 --- a/content/browser/renderer_host/plugin_registry_impl.cc +++ b/content/browser/renderer_host/plugin_registry_impl.cc
@@ -84,8 +84,8 @@ mime_type_blink->file_extensions = mime_type.file_extensions; plugin_blink->mime_types.push_back(std::move(mime_type_blink)); if (!plugin_blink->may_use_external_handler) { - plugin_blink->may_use_external_handler = base::ContainsKey( - mime_handler_view_mime_types, mime_type.mime_type); + plugin_blink->may_use_external_handler = + base::Contains(mime_handler_view_mime_types, mime_type.mime_type); } } plugins.push_back(std::move(plugin_blink));
diff --git a/content/browser/renderer_host/render_process_host_impl.cc b/content/browser/renderer_host/render_process_host_impl.cc index c1de080..98c3bb3 100644 --- a/content/browser/renderer_host/render_process_host_impl.cc +++ b/content/browser/renderer_host/render_process_host_impl.cc
@@ -3509,14 +3509,14 @@ } void RenderProcessHostImpl::AddPriorityClient(PriorityClient* priority_client) { - DCHECK(!base::ContainsKey(priority_clients_, priority_client)); + DCHECK(!base::Contains(priority_clients_, priority_client)); priority_clients_.insert(priority_client); UpdateProcessPriorityInputs(); } void RenderProcessHostImpl::RemovePriorityClient( PriorityClient* priority_client) { - DCHECK(base::ContainsKey(priority_clients_, priority_client)); + DCHECK(base::Contains(priority_clients_, priority_client)); priority_clients_.erase(priority_client); UpdateProcessPriorityInputs(); }
diff --git a/content/browser/renderer_host/render_view_host_impl.cc b/content/browser/renderer_host/render_view_host_impl.cc index bb08c0e4..d54af22 100644 --- a/content/browser/renderer_host/render_view_host_impl.cc +++ b/content/browser/renderer_host/render_view_host_impl.cc
@@ -325,18 +325,12 @@ return false; DCHECK(GetProcess()->IsInitializedAndNotDead()); DCHECK(GetProcess()->GetBrowserContext()); - CHECK(main_frame_routing_id_ != MSG_ROUTING_NONE || - proxy_route_id != MSG_ROUTING_NONE); - // We should not set both main_frame_routing_id_ and proxy_route_id. Log - // cases that this happens (without crashing) to track down - // https://crbug.com/575245. - // TODO(creis): Remove this once we've found the cause. - if (main_frame_routing_id_ != MSG_ROUTING_NONE && - proxy_route_id != MSG_ROUTING_NONE) { - NOTREACHED() << "Don't set both main_frame_routing_id_ and proxy_route_id"; - base::debug::DumpWithoutCrashing(); - } + // Exactly one of main_frame_routing_id_ or proxy_route_id should be set. + CHECK((main_frame_routing_id_ != MSG_ROUTING_NONE && + proxy_route_id == MSG_ROUTING_NONE) || + (main_frame_routing_id_ == MSG_ROUTING_NONE && + proxy_route_id != MSG_ROUTING_NONE)); RenderFrameHostImpl* main_rfh = nullptr; if (main_frame_routing_id_ != MSG_ROUTING_NONE) {
diff --git a/content/browser/renderer_host/render_widget_host_impl.cc b/content/browser/renderer_host/render_widget_host_impl.cc index 6415dc8..dd229c4 100644 --- a/content/browser/renderer_host/render_widget_host_impl.cc +++ b/content/browser/renderer_host/render_widget_host_impl.cc
@@ -2523,7 +2523,7 @@ const bool esc_requested = !keyboard_keys_to_lock_.has_value() || - base::ContainsKey(keyboard_keys_to_lock_.value(), ui::DomCode::ESCAPE); + base::Contains(keyboard_keys_to_lock_.value(), ui::DomCode::ESCAPE); if (!delegate_->RequestKeyboardLock(this, esc_requested)) { CancelKeyboardLock();
diff --git a/content/browser/renderer_host/render_widget_host_view_mac_unittest.mm b/content/browser/renderer_host/render_widget_host_view_mac_unittest.mm index 859cb7c6..2e2c878 100644 --- a/content/browser/renderer_host/render_widget_host_view_mac_unittest.mm +++ b/content/browser/renderer_host/render_widget_host_view_mac_unittest.mm
@@ -572,7 +572,7 @@ rwhv_mac_->SelectionChanged(base::UTF8ToUTF16("llo, world!"), 2, gfx::Range(5, 10)); - EXPECT_NSEQ(NSMakeRange(7, 5), [rwhv_cocoa_ selectedRange]); + EXPECT_NSEQ(NSMakeRange(5, 5), [rwhv_cocoa_ selectedRange]); NSRange actualRange = NSMakeRange(1u, 2u); NSAttributedString* actualString = [rwhv_cocoa_
diff --git a/content/browser/resources/gpu/info_view.js b/content/browser/resources/gpu/info_view.js index fdbeca0..3bd13fa 100644 --- a/content/browser/resources/gpu/info_view.js +++ b/content/browser/resources/gpu/info_view.js
@@ -228,11 +228,10 @@ 'multiple_raster_threads': 'Multiple Raster Threads', 'native_gpu_memory_buffers': 'Native GpuMemoryBuffers', 'protected_video_decode': 'Hardware Protected Video Decode', - 'surface_synchronization': 'Surface Synchronization', 'surface_control': 'Surface Control', 'vpx_decode': 'VPx Video Decode', 'webgl2': 'WebGL2', - 'viz_display_compositor': 'Viz Service Display Compositor', + 'viz_display_compositor': 'Viz Display Compositor', 'viz_hit_test_surface_layer': 'Viz Hit-test Surface Layer', 'skia_renderer': 'Skia Renderer', };
diff --git a/content/browser/scheduler/browser_task_executor.h b/content/browser/scheduler/browser_task_executor.h index f37dac3..e72e31af 100644 --- a/content/browser/scheduler/browser_task_executor.h +++ b/content/browser/scheduler/browser_task_executor.h
@@ -62,8 +62,6 @@ // // Attention: This method can only be called once (as there must be only one // IO thread). - // Attention: Must be called after Create() - // Attention: Can not be called after Shutdown() or ResetForTesting() static std::unique_ptr<BrowserProcessSubThread> CreateIOThread(); // Enables non best effort queues on the IO thread. Usually called from @@ -85,9 +83,7 @@ // Winds down the BrowserTaskExecutor, after this no tasks can be executed // and the base::TaskExecutor APIs are non-functional but won't crash if - // called. In unittests however we need to clean up, so - // BrowserTaskExecutor::ResetForTesting should be - // called (~TestBrowserThreadBundle() takes care of this). + // called. static void Shutdown(); // Unregister and delete the TaskExecutor after a test.
diff --git a/content/browser/screenlock_monitor/screenlock_monitor_unittest.cc b/content/browser/screenlock_monitor/screenlock_monitor_unittest.cc index 5f2da1f..7e69c4e 100644 --- a/content/browser/screenlock_monitor/screenlock_monitor_unittest.cc +++ b/content/browser/screenlock_monitor/screenlock_monitor_unittest.cc
@@ -5,9 +5,9 @@ #include "content/browser/screenlock_monitor/screenlock_monitor.h" #include "base/macros.h" -#include "base/message_loop/message_loop.h" #include "base/message_loop/message_loop_current.h" #include "base/run_loop.h" +#include "base/test/scoped_task_environment.h" #include "content/browser/screenlock_monitor/screenlock_monitor_source.h" #include "testing/gtest/include/gtest/gtest.h" @@ -61,7 +61,7 @@ std::unique_ptr<ScreenlockMonitor> screenlock_monitor_; private: - base::MessageLoop message_loop_; + base::test::ScopedTaskEnvironment scoped_task_environment_; DISALLOW_COPY_AND_ASSIGN(ScreenlockMonitorTest); };
diff --git a/content/browser/service_worker/embedded_worker_instance.cc b/content/browser/service_worker/embedded_worker_instance.cc index c0094df7..028b4d6d 100644 --- a/content/browser/service_worker/embedded_worker_instance.cc +++ b/content/browser/service_worker/embedded_worker_instance.cc
@@ -1022,7 +1022,7 @@ // To be safe, ignore schemes that aren't allowed to register service // workers. We assume that importScripts and fetch() should fail on such // schemes. - if (!base::ContainsValue(GetServiceWorkerSchemes(), scheme)) + if (!base::Contains(GetServiceWorkerSchemes(), scheme)) continue; network::mojom::URLLoaderFactoryPtr factory_ptr; mojo::MakeStrongBinding(std::move(factory),
diff --git a/content/browser/service_worker/service_worker_context_core_unittest.cc b/content/browser/service_worker/service_worker_context_core_unittest.cc index 54b8e3e..1aa239f 100644 --- a/content/browser/service_worker/service_worker_context_core_unittest.cc +++ b/content/browser/service_worker/service_worker_context_core_unittest.cc
@@ -158,7 +158,7 @@ context()->UpdateVersionFailureCount(kVersionId, blink::ServiceWorkerStatusCode::kOk); EXPECT_EQ(0, context()->GetVersionFailureCount(kVersionId)); - EXPECT_FALSE(base::ContainsKey(context()->failure_counts_, kVersionId)); + EXPECT_FALSE(base::Contains(context()->failure_counts_, kVersionId)); } TEST_F(ServiceWorkerContextCoreTest, DeleteForOrigin) {
diff --git a/content/browser/service_worker/service_worker_database_unittest.cc b/content/browser/service_worker/service_worker_database_unittest.cc index 4a7ec0b..1f138e74 100644 --- a/content/browser/service_worker/service_worker_database_unittest.cc +++ b/content/browser/service_worker/service_worker_database_unittest.cc
@@ -401,9 +401,9 @@ EXPECT_EQ(ServiceWorkerDatabase::STATUS_OK, database->GetOriginsWithRegistrations(&origins)); EXPECT_EQ(3U, origins.size()); - EXPECT_TRUE(base::ContainsKey(origins, origin1)); - EXPECT_TRUE(base::ContainsKey(origins, origin2)); - EXPECT_TRUE(base::ContainsKey(origins, origin3)); + EXPECT_TRUE(base::Contains(origins, origin1)); + EXPECT_TRUE(base::Contains(origins, origin2)); + EXPECT_TRUE(base::Contains(origins, origin3)); // |origin3| has another registration, so should not remove it from the // unique origin list. @@ -418,9 +418,9 @@ EXPECT_EQ(ServiceWorkerDatabase::STATUS_OK, database->GetOriginsWithRegistrations(&origins)); EXPECT_EQ(3U, origins.size()); - EXPECT_TRUE(base::ContainsKey(origins, origin1)); - EXPECT_TRUE(base::ContainsKey(origins, origin2)); - EXPECT_TRUE(base::ContainsKey(origins, origin3)); + EXPECT_TRUE(base::Contains(origins, origin1)); + EXPECT_TRUE(base::Contains(origins, origin2)); + EXPECT_TRUE(base::Contains(origins, origin3)); // |origin3| should be removed from the unique origin list. ASSERT_EQ(ServiceWorkerDatabase::STATUS_OK, @@ -434,8 +434,8 @@ EXPECT_EQ(ServiceWorkerDatabase::STATUS_OK, database->GetOriginsWithRegistrations(&origins)); EXPECT_EQ(2U, origins.size()); - EXPECT_TRUE(base::ContainsKey(origins, origin1)); - EXPECT_TRUE(base::ContainsKey(origins, origin2)); + EXPECT_TRUE(base::Contains(origins, origin1)); + EXPECT_TRUE(base::Contains(origins, origin2)); } TEST(ServiceWorkerDatabaseTest, GetRegistrationsForOrigin) { @@ -712,8 +712,8 @@ EXPECT_EQ(ServiceWorkerDatabase::STATUS_OK, database->GetPurgeableResourceIds(&purgeable_ids_out)); EXPECT_EQ(2u, purgeable_ids_out.size()); - EXPECT_TRUE(base::ContainsKey(purgeable_ids_out, resources[0].resource_id)); - EXPECT_TRUE(base::ContainsKey(purgeable_ids_out, resources[1].resource_id)); + EXPECT_TRUE(base::Contains(purgeable_ids_out, resources[0].resource_id)); + EXPECT_TRUE(base::Contains(purgeable_ids_out, resources[1].resource_id)); } TEST(ServiceWorkerDatabaseTest, DeleteNonExistentRegistration) { @@ -844,8 +844,8 @@ EXPECT_EQ(ServiceWorkerDatabase::STATUS_OK, database->GetPurgeableResourceIds(&purgeable_ids_out)); EXPECT_EQ(2u, purgeable_ids_out.size()); - EXPECT_TRUE(base::ContainsKey(purgeable_ids_out, resources1[0].resource_id)); - EXPECT_TRUE(base::ContainsKey(purgeable_ids_out, resources1[1].resource_id)); + EXPECT_TRUE(base::Contains(purgeable_ids_out, resources1[0].resource_id)); + EXPECT_TRUE(base::Contains(purgeable_ids_out, resources1[1].resource_id)); } TEST(ServiceWorkerDatabaseTest, Registration_Multiple) { @@ -938,8 +938,8 @@ EXPECT_EQ(ServiceWorkerDatabase::STATUS_OK, database->GetPurgeableResourceIds(&purgeable_ids_out)); EXPECT_EQ(2u, purgeable_ids_out.size()); - EXPECT_TRUE(base::ContainsKey(purgeable_ids_out, resources1[0].resource_id)); - EXPECT_TRUE(base::ContainsKey(purgeable_ids_out, resources1[1].resource_id)); + EXPECT_TRUE(base::Contains(purgeable_ids_out, resources1[0].resource_id)); + EXPECT_TRUE(base::Contains(purgeable_ids_out, resources1[1].resource_id)); // Make sure that registration2 is still alive. resources_out.clear(); @@ -2030,7 +2030,7 @@ EXPECT_EQ(ServiceWorkerDatabase::STATUS_OK, database->GetOriginsWithRegistrations(&unique_origins)); EXPECT_EQ(1u, unique_origins.size()); - EXPECT_TRUE(base::ContainsKey(unique_origins, origin2)); + EXPECT_TRUE(base::Contains(unique_origins, origin2)); // The registrations for |origin1| should be removed. std::vector<RegistrationData> registrations; @@ -2060,10 +2060,10 @@ EXPECT_EQ(ServiceWorkerDatabase::STATUS_OK, database->GetPurgeableResourceIds(&purgeable_ids_out)); EXPECT_EQ(4u, purgeable_ids_out.size()); - EXPECT_TRUE(base::ContainsKey(purgeable_ids_out, 1)); - EXPECT_TRUE(base::ContainsKey(purgeable_ids_out, 2)); - EXPECT_TRUE(base::ContainsKey(purgeable_ids_out, 3)); - EXPECT_TRUE(base::ContainsKey(purgeable_ids_out, 4)); + EXPECT_TRUE(base::Contains(purgeable_ids_out, 1)); + EXPECT_TRUE(base::Contains(purgeable_ids_out, 2)); + EXPECT_TRUE(base::Contains(purgeable_ids_out, 3)); + EXPECT_TRUE(base::Contains(purgeable_ids_out, 4)); // The user data associated with |origin1| should be removed. std::vector<std::string> user_data_out;
diff --git a/content/browser/service_worker/service_worker_installed_scripts_sender_unittest.cc b/content/browser/service_worker/service_worker_installed_scripts_sender_unittest.cc index 00ba5d0..09f09bb 100644 --- a/content/browser/service_worker/service_worker_installed_scripts_sender_unittest.cc +++ b/content/browser/service_worker/service_worker_installed_scripts_sender_unittest.cc
@@ -103,7 +103,7 @@ EXPECT_EQ(script_url_, script_info->script_url); EXPECT_EQ(encoding_, script_info->encoding); for (const auto& header : headers_) { - EXPECT_TRUE(base::ContainsKey(script_info->headers, header.first)); + EXPECT_TRUE(base::Contains(script_info->headers, header.first)); EXPECT_EQ(header.second, script_info->headers[header.first]); script_info->headers.erase(header.first); } @@ -267,7 +267,7 @@ ASSERT_EQ(kExpectedScriptInfoMap.size(), scripts_info->installed_urls.size()); for (const auto& url : scripts_info->installed_urls) - EXPECT_TRUE(base::ContainsKey(kExpectedScriptInfoMap, url)); + EXPECT_TRUE(base::Contains(kExpectedScriptInfoMap, url)); EXPECT_TRUE(scripts_info->manager_request.is_pending()); renderer_manager = std::make_unique<MockServiceWorkerInstalledScriptsManager>( @@ -323,7 +323,7 @@ ASSERT_EQ(kExpectedScriptInfoMap.size(), scripts_info->installed_urls.size()); for (const auto& url : scripts_info->installed_urls) - EXPECT_TRUE(base::ContainsKey(kExpectedScriptInfoMap, url)); + EXPECT_TRUE(base::Contains(kExpectedScriptInfoMap, url)); EXPECT_TRUE(scripts_info->manager_request.is_pending()); renderer_manager = std::make_unique<MockServiceWorkerInstalledScriptsManager>( @@ -338,7 +338,7 @@ // Reset a data pipe during sending the body. auto script_info = renderer_manager->WaitUntilTransferInstalledScript(); EXPECT_TRUE( - base::ContainsKey(kExpectedScriptInfoMap, script_info->script_url)); + base::Contains(kExpectedScriptInfoMap, script_info->script_url)); script_info->body.reset(); kExpectedScriptInfoMap.erase(script_info->script_url); // Wait until the error is triggered on the sender side. @@ -382,7 +382,7 @@ ASSERT_EQ(kExpectedScriptInfoMap.size(), scripts_info->installed_urls.size()); for (const auto& url : scripts_info->installed_urls) - EXPECT_TRUE(base::ContainsKey(kExpectedScriptInfoMap, url)); + EXPECT_TRUE(base::Contains(kExpectedScriptInfoMap, url)); EXPECT_TRUE(scripts_info->manager_request.is_pending()); renderer_manager = std::make_unique<MockServiceWorkerInstalledScriptsManager>( @@ -397,7 +397,7 @@ // Reset a data pipe during sending the meta data. auto script_info = renderer_manager->WaitUntilTransferInstalledScript(); EXPECT_TRUE( - base::ContainsKey(kExpectedScriptInfoMap, script_info->script_url)); + base::Contains(kExpectedScriptInfoMap, script_info->script_url)); script_info->meta_data.reset(); kExpectedScriptInfoMap.erase(script_info->script_url); // Wait until the error is triggered on the sender side. @@ -453,7 +453,7 @@ ASSERT_EQ(kExpectedScriptInfoMap.size(), scripts_info->installed_urls.size()); for (const auto& url : scripts_info->installed_urls) - EXPECT_TRUE(base::ContainsKey(kExpectedScriptInfoMap, url)); + EXPECT_TRUE(base::Contains(kExpectedScriptInfoMap, url)); EXPECT_TRUE(scripts_info->manager_request.is_pending()); renderer_manager = std::make_unique<MockServiceWorkerInstalledScriptsManager>( @@ -534,7 +534,7 @@ ASSERT_EQ(kExpectedScriptInfoMap.size(), scripts_info->installed_urls.size()); for (const auto& url : scripts_info->installed_urls) - EXPECT_TRUE(base::ContainsKey(kExpectedScriptInfoMap, url)); + EXPECT_TRUE(base::Contains(kExpectedScriptInfoMap, url)); EXPECT_TRUE(scripts_info->manager_request.is_pending()); renderer_manager = std::make_unique<MockServiceWorkerInstalledScriptsManager>( @@ -620,7 +620,7 @@ ASSERT_EQ(kExpectedScriptInfoMap.size(), scripts_info->installed_urls.size()); for (const auto& url : scripts_info->installed_urls) - EXPECT_TRUE(base::ContainsKey(kExpectedScriptInfoMap, url)); + EXPECT_TRUE(base::Contains(kExpectedScriptInfoMap, url)); EXPECT_TRUE(scripts_info->manager_request.is_pending()); renderer_manager = std::make_unique<MockServiceWorkerInstalledScriptsManager>(
diff --git a/content/browser/service_worker/service_worker_object_host.cc b/content/browser/service_worker/service_worker_object_host.cc index 82dfd5a..cb2ec44 100644 --- a/content/browser/service_worker/service_worker_object_host.cc +++ b/content/browser/service_worker/service_worker_object_host.cc
@@ -72,6 +72,13 @@ return; } + // Abort if redundant. This is not strictly needed since RunAfterStartWorker + // does the same, but avoids logging UMA about failed startups. + if (worker->is_redundant()) { + std::move(callback).Run(blink::ServiceWorkerStatusCode::kErrorRedundant); + return; + } + worker->RunAfterStartWorker( ServiceWorkerMetrics::EventType::MESSAGE, base::BindOnce(&DispatchExtendableMessageEventAfterStartWorker, worker,
diff --git a/content/browser/service_worker/service_worker_process_manager.cc b/content/browser/service_worker/service_worker_process_manager.cc index 603434a..28de58f4 100644 --- a/content/browser/service_worker/service_worker_process_manager.cc +++ b/content/browser/service_worker/service_worker_process_manager.cc
@@ -104,7 +104,7 @@ return blink::ServiceWorkerStatusCode::kErrorAbort; } - DCHECK(!base::ContainsKey(worker_process_map_, embedded_worker_id)) + DCHECK(!base::Contains(worker_process_map_, embedded_worker_id)) << embedded_worker_id << " already has a process allocated"; // Create a SiteInstance to get the renderer process from. Use the site URL
diff --git a/content/browser/service_worker/service_worker_provider_host.cc b/content/browser/service_worker/service_worker_provider_host.cc index 1faf563..ec9e7cc 100644 --- a/content/browser/service_worker/service_worker_provider_host.cc +++ b/content/browser/service_worker/service_worker_provider_host.cc
@@ -548,7 +548,7 @@ if (!IsContextSecureForServiceWorker()) return; size_t key = registration->scope().spec().size(); - if (base::ContainsKey(matching_registrations_, key)) + if (base::Contains(matching_registrations_, key)) return; registration->AddListener(this); matching_registrations_[key] = registration; @@ -582,14 +582,14 @@ void ServiceWorkerProviderHost::RemoveServiceWorkerRegistrationObjectHost( int64_t registration_id) { - DCHECK(base::ContainsKey(registration_object_hosts_, registration_id)); + DCHECK(base::Contains(registration_object_hosts_, registration_id)); registration_object_hosts_.erase(registration_id); } void ServiceWorkerProviderHost::RemoveServiceWorkerObjectHost( int64_t version_id) { DCHECK_CURRENTLY_ON(BrowserThread::IO); - DCHECK(base::ContainsKey(service_worker_object_hosts_, version_id)); + DCHECK(base::Contains(service_worker_object_hosts_, version_id)); service_worker_object_hosts_.erase(version_id); }
diff --git a/content/browser/service_worker/service_worker_storage.cc b/content/browser/service_worker/service_worker_storage.cc index 8e58c7e..de65b73e 100644 --- a/content/browser/service_worker/service_worker_storage.cc +++ b/content/browser/service_worker/service_worker_storage.cc
@@ -165,7 +165,7 @@ } // See if there are any stored registrations for the origin. - if (!base::ContainsKey(registered_origins_, document_url.GetOrigin())) { + if (!base::Contains(registered_origins_, document_url.GetOrigin())) { // Look for something currently being installed. scoped_refptr<ServiceWorkerRegistration> installing_registration = FindInstallingRegistrationForDocument(document_url); @@ -219,7 +219,7 @@ } // See if there are any stored registrations for the origin. - if (!base::ContainsKey(registered_origins_, scope.GetOrigin())) { + if (!base::Contains(registered_origins_, scope.GetOrigin())) { // Look for something currently being installed. scoped_refptr<ServiceWorkerRegistration> installing_registration = FindInstallingRegistrationForScope(scope); @@ -277,7 +277,7 @@ } // See if there are any stored registrations for the origin. - if (!base::ContainsKey(registered_origins_, origin)) { + if (!base::Contains(registered_origins_, origin)) { // Look for something currently being installed. scoped_refptr<ServiceWorkerRegistration> installing_registration = FindInstallingRegistrationForId(registration_id);
diff --git a/content/browser/service_worker/service_worker_version.cc b/content/browser/service_worker/service_worker_version.cc index 89450d2..d2a01a2 100644 --- a/content/browser/service_worker/service_worker_version.cc +++ b/content/browser/service_worker/service_worker_version.cc
@@ -711,7 +711,7 @@ DCHECK_CURRENTLY_ON(BrowserThread::IO); const std::string& uuid = provider_host->client_uuid(); CHECK(!provider_host->client_uuid().empty()); - DCHECK(!base::ContainsKey(controllee_map_, uuid)); + DCHECK(!base::Contains(controllee_map_, uuid)); // TODO(crbug.com/951571): Change to DCHECK once we figured out the cause of // invalid controller status. CHECK(status_ == ACTIVATING || status_ == ACTIVATED); @@ -739,7 +739,7 @@ void ServiceWorkerVersion::RemoveControllee(const std::string& client_uuid) { DCHECK_CURRENTLY_ON(BrowserThread::IO); - DCHECK(base::ContainsKey(controllee_map_, client_uuid)); + DCHECK(base::Contains(controllee_map_, client_uuid)); controllee_map_.erase(client_uuid); embedded_worker_->UpdateForegroundPriority();
diff --git a/content/browser/site_per_process_browsertest.cc b/content/browser/site_per_process_browsertest.cc index 92021a3..b453846 100644 --- a/content/browser/site_per_process_browsertest.cc +++ b/content/browser/site_per_process_browsertest.cc
@@ -7985,10 +7985,10 @@ filter2->Wait(); // At this point, we should have two pending WebContents. - EXPECT_TRUE(base::ContainsKey( + EXPECT_TRUE(base::Contains( web_contents()->pending_contents_, GlobalRoutingID(process1->GetID(), filter1->routing_id()))); - EXPECT_TRUE(base::ContainsKey( + EXPECT_TRUE(base::Contains( web_contents()->pending_contents_, GlobalRoutingID(process2->GetID(), filter2->routing_id()))); @@ -8063,10 +8063,10 @@ filter2->Wait(); // At this point, we should have two pending widgets. - EXPECT_TRUE(base::ContainsKey( + EXPECT_TRUE(base::Contains( web_contents()->pending_widget_views_, GlobalRoutingID(process1->GetID(), filter1->routing_id()))); - EXPECT_TRUE(base::ContainsKey( + EXPECT_TRUE(base::Contains( web_contents()->pending_widget_views_, GlobalRoutingID(process2->GetID(), filter2->routing_id()))); @@ -8080,10 +8080,10 @@ false, gfx::Rect()); web_contents()->ShowCreatedWidget(process2->GetID(), filter2->routing_id(), false, gfx::Rect()); - EXPECT_FALSE(base::ContainsKey( + EXPECT_FALSE(base::Contains( web_contents()->pending_widget_views_, GlobalRoutingID(process1->GetID(), filter1->routing_id()))); - EXPECT_FALSE(base::ContainsKey( + EXPECT_FALSE(base::Contains( web_contents()->pending_widget_views_, GlobalRoutingID(process2->GetID(), filter2->routing_id()))); }
diff --git a/content/browser/site_per_process_hit_test_browsertest.cc b/content/browser/site_per_process_hit_test_browsertest.cc index c035bcc..f72407a 100644 --- a/content/browser/site_per_process_hit_test_browsertest.cc +++ b/content/browser/site_per_process_hit_test_browsertest.cc
@@ -2370,8 +2370,8 @@ // Verify that this a mouse wheel event was sent to the child frame renderer. EXPECT_TRUE(child_frame_monitor.EventWasReceived()); - EXPECT_TRUE(base::ContainsValue(child_frame_monitor.events_received(), - blink::WebInputEvent::kMouseWheel)); + EXPECT_TRUE(base::Contains(child_frame_monitor.events_received(), + blink::WebInputEvent::kMouseWheel)); } // Tests that touching an OOPIF editable element correctly resizes the @@ -2972,7 +2972,7 @@ void WaitUntil(const base::string16& tooltip_text) { tooltip_text_wanted_ = tooltip_text; - if (base::ContainsValue(tooltips_received_, tooltip_text)) + if (base::Contains(tooltips_received_, tooltip_text)) return; run_loop_->Run(); } @@ -4138,8 +4138,8 @@ // Verify that this a mouse wheel event was sent to the child frame renderer. EXPECT_TRUE(child_frame_monitor.EventWasReceived()); - EXPECT_TRUE(base::ContainsValue(child_frame_monitor.events_received(), - blink::WebInputEvent::kMouseWheel)); + EXPECT_TRUE(base::Contains(child_frame_monitor.events_received(), + blink::WebInputEvent::kMouseWheel)); // Kill the wheel target view process. This must reset the wheel_target_. RenderProcessHost* child_process =
diff --git a/content/browser/tracing/background_tracing_active_scenario.cc b/content/browser/tracing/background_tracing_active_scenario.cc index a644aef..30f66f89 100644 --- a/content/browser/tracing/background_tracing_active_scenario.cc +++ b/content/browser/tracing/background_tracing_active_scenario.cc
@@ -269,9 +269,7 @@ base::OnceClosure on_aborted_callback) : config_(std::move(config)), requires_anonymized_data_(requires_anonymized_data), - scenario_state_(State::kIdle), receive_callback_(std::move(receive_callback)), - triggered_named_event_handle_(-1), on_aborted_callback_(std::move(on_aborted_callback)), weak_ptr_factory_(this) { DCHECK(config_ && !config_->rules().empty()); @@ -527,8 +525,7 @@ return; } - last_triggered_rule_.reset(new base::DictionaryValue); - triggered_rule->IntoDict(last_triggered_rule_.get()); + last_triggered_rule_ = triggered_rule; int trace_delay = triggered_rule->GetTraceDelay(); @@ -606,8 +603,20 @@ metadata_dict->SetString("scenario_name", config_->scenario_name()); if (last_triggered_rule_) { - metadata_dict->Set("last_triggered_rule", std::move(last_triggered_rule_)); + auto rule = std::make_unique<base::DictionaryValue>(); + last_triggered_rule_->IntoDict(rule.get()); + metadata_dict->Set("last_triggered_rule", std::move(rule)); } } +void BackgroundTracingActiveScenario::GenerateMetadataProto( + perfetto::protos::pbzero::ChromeMetadataPacket* metadata) { + if (!last_triggered_rule_) { + return; + } + auto* triggered_rule = + metadata->set_background_tracing_metadata()->set_triggered_rule(); + last_triggered_rule_->GenerateMetadataProto(triggered_rule); +} + } // namespace content
diff --git a/content/browser/tracing/background_tracing_active_scenario.h b/content/browser/tracing/background_tracing_active_scenario.h index 89f6d41c..3e539ee 100644 --- a/content/browser/tracing/background_tracing_active_scenario.h +++ b/content/browser/tracing/background_tracing_active_scenario.h
@@ -13,6 +13,7 @@ #include "content/browser/tracing/background_tracing_config_impl.h" #include "content/browser/tracing/tracing_controller_impl.h" #include "content/public/browser/background_tracing_manager.h" +#include "services/tracing/public/cpp/perfetto/trace_event_data_source.h" #include "services/tracing/public/mojom/perfetto_service.mojom.h" namespace base { @@ -40,6 +41,8 @@ const BackgroundTracingConfigImpl* GetConfig() const; void GenerateMetadataDict(base::DictionaryValue* metadata_dict); + void GenerateMetadataProto( + perfetto::protos::pbzero::ChromeMetadataPacket* metadata); State state() const { return scenario_state_; } bool requires_anonymized_data() const { return requires_anonymized_data_; } base::WeakPtr<BackgroundTracingActiveScenario> GetWeakPtr(); @@ -79,12 +82,13 @@ std::unique_ptr<TracingSession> tracing_session_; std::unique_ptr<BackgroundTracingConfigImpl> config_; - bool requires_anonymized_data_; - State scenario_state_; - std::unique_ptr<base::DictionaryValue> last_triggered_rule_; + // Owned by |config_|. + const BackgroundTracingRule* last_triggered_rule_ = nullptr; + const bool requires_anonymized_data_ = false; + State scenario_state_ = State::kIdle; base::RepeatingClosure rule_triggered_callback_for_testing_; BackgroundTracingManager::ReceiveCallback receive_callback_; - BackgroundTracingManager::TriggerHandle triggered_named_event_handle_; + BackgroundTracingManager::TriggerHandle triggered_named_event_handle_ = -1; base::OnceClosure on_aborted_callback_; base::OnceClosure started_finalizing_closure_;
diff --git a/content/browser/tracing/background_tracing_manager_impl.cc b/content/browser/tracing/background_tracing_manager_impl.cc index 0af1721..1dc755c 100644 --- a/content/browser/tracing/background_tracing_manager_impl.cc +++ b/content/browser/tracing/background_tracing_manager_impl.cc
@@ -103,6 +103,9 @@ tracing::TraceEventAgent::GetInstance()->AddMetadataGeneratorFunction( base::BindRepeating(&BackgroundTracingManagerImpl::GenerateMetadataDict, base::Unretained(this))); + tracing::TraceEventMetadataSource::GetInstance()->AddGeneratorFunction( + base::BindRepeating(&BackgroundTracingManagerImpl::GenerateMetadataProto, + base::Unretained(this))); } bool BackgroundTracingManagerImpl::SetActiveScenario( @@ -405,6 +408,14 @@ return metadata_dict; } +void BackgroundTracingManagerImpl::GenerateMetadataProto( + perfetto::protos::pbzero::ChromeMetadataPacket* metadata) { + DCHECK_CURRENTLY_ON(BrowserThread::UI); + if (active_scenario_) { + active_scenario_->GenerateMetadataProto(metadata); + } +} + void BackgroundTracingManagerImpl::AbortScenarioForTesting() { AbortScenario(); }
diff --git a/content/browser/tracing/background_tracing_manager_impl.h b/content/browser/tracing/background_tracing_manager_impl.h index a092f68..f620a91 100644 --- a/content/browser/tracing/background_tracing_manager_impl.h +++ b/content/browser/tracing/background_tracing_manager_impl.h
@@ -13,6 +13,7 @@ #include "base/macros.h" #include "content/browser/tracing/background_tracing_config_impl.h" #include "content/public/browser/background_tracing_manager.h" +#include "services/tracing/public/cpp/perfetto/trace_event_data_source.h" namespace base { template <typename T> @@ -142,6 +143,8 @@ void ValidateStartupScenario(); bool IsSupportedConfig(BackgroundTracingConfigImpl* config); std::unique_ptr<base::DictionaryValue> GenerateMetadataDict(); + void GenerateMetadataProto( + perfetto::protos::pbzero::ChromeMetadataPacket* metadata); bool IsTriggerHandleValid(TriggerHandle handle) const; void OnScenarioAborted();
diff --git a/content/browser/tracing/background_tracing_rule.cc b/content/browser/tracing/background_tracing_rule.cc index b21a479..ac60ae87 100644 --- a/content/browser/tracing/background_tracing_rule.cc +++ b/content/browser/tracing/background_tracing_rule.cc
@@ -8,6 +8,7 @@ #include "base/bind.h" #include "base/metrics/histogram_macros.h" +#include "base/metrics/metrics_hashes.h" #include "base/metrics/statistics_recorder.h" #include "base/rand_util.h" #include "base/strings/safe_sprintf.h" @@ -105,6 +106,9 @@ } } +void BackgroundTracingRule::GenerateMetadataProto( + BackgroundTracingRule::MetadataProto* out) const {} + void BackgroundTracingRule::Setup(const base::DictionaryValue* dict) { dict->GetDouble(kConfigRuleTriggerChance, &trigger_chance_); dict->GetInteger(kConfigRuleTriggerDelay, &trigger_delay_); @@ -137,6 +141,23 @@ dict->SetString(kConfigRuleTriggerNameKey, named_event_.c_str()); } + void GenerateMetadataProto( + BackgroundTracingRule::MetadataProto* out) const override { + DCHECK(out); + BackgroundTracingRule::GenerateMetadataProto(out); + out->set_trigger_type(MetadataProto::MONITOR_AND_DUMP_WHEN_TRIGGER_NAMED); + auto* named_rule = out->set_named_rule(); + if (named_event_ == "startup-config") { + named_rule->set_event_type(MetadataProto::NamedRule::STARTUP); + } else if (named_event_ == "navigation-config") { + named_rule->set_event_type(MetadataProto::NamedRule::NAVIGATION); + } else if (named_event_ == "session-restore-config") { + named_rule->set_event_type(MetadataProto::NamedRule::SESSION_RESTORE); + } else if (named_event_ == "preemptive_test") { + named_rule->set_event_type(MetadataProto::NamedRule::TEST_RULE); + } + } + bool ShouldTriggerNamedEvent(const std::string& named_event) const override { return named_event == named_event_; } @@ -223,6 +244,18 @@ dict->SetBoolean(kConfigRuleHistogramRepeatKey, repeat_); } + void GenerateMetadataProto( + BackgroundTracingRule::MetadataProto* out) const override { + DCHECK(out); + BackgroundTracingRule::GenerateMetadataProto(out); + out->set_trigger_type( + MetadataProto::MONITOR_AND_DUMP_WHEN_SPECIFIC_HISTOGRAM_AND_VALUE); + auto* rule = out->set_histogram_rule(); + rule->set_histogram_name_hash(base::HashMetricName(histogram_name_)); + rule->set_histogram_min_trigger(histogram_lower_value_); + rule->set_histogram_max_trigger(histogram_upper_value_); + } + void OnHistogramTrigger(const std::string& histogram_name) const override { if (histogram_name != histogram_name_) return; @@ -312,6 +345,14 @@ dict->SetString(kConfigRuleTriggerNameKey, named_event_.c_str()); } + void GenerateMetadataProto( + BackgroundTracingRule::MetadataProto* out) const override { + DCHECK(out); + BackgroundTracingRule::GenerateMetadataProto(out); + out->set_trigger_type(MetadataProto::MONITOR_AND_DUMP_WHEN_TRIGGER_NAMED); + out->set_named_rule()->set_event_type(MetadataProto::NamedRule::NAVIGATION); + } + bool ShouldTriggerNamedEvent(const std::string& named_event) const override { return named_event == named_event_; } @@ -354,6 +395,12 @@ dict->SetInteger(kConfigRuleRandomIntervalTimeoutMax, timeout_max_); } + void GenerateMetadataProto( + BackgroundTracingRule::MetadataProto* out) const override { + // TODO(ssid): Add config if we enabled this type of trigger. + NOTREACHED(); + } + void Install() override { handle_ = BackgroundTracingManagerImpl::GetInstance()->RegisterTriggerType( named_event_.c_str());
diff --git a/content/browser/tracing/background_tracing_rule.h b/content/browser/tracing/background_tracing_rule.h index 63f1023..8fa90d7 100644 --- a/content/browser/tracing/background_tracing_rule.h +++ b/content/browser/tracing/background_tracing_rule.h
@@ -11,6 +11,8 @@ #include "base/values.h" #include "content/browser/tracing/background_tracing_config_impl.h" #include "content/common/content_export.h" +#include "content/public/browser/background_tracing_manager.h" +#include "third_party/perfetto/protos/perfetto/trace/chrome/chrome_metadata.pbzero.h" namespace base { class DictionaryValue; @@ -20,6 +22,9 @@ class CONTENT_EXPORT BackgroundTracingRule { public: + using MetadataProto = + perfetto::protos::pbzero::BackgroundTracingMetadata::TriggerRule; + BackgroundTracingRule(); explicit BackgroundTracingRule(int trigger_delay); @@ -36,6 +41,7 @@ virtual void Install() {} virtual void IntoDict(base::DictionaryValue* dict) const; + virtual void GenerateMetadataProto(MetadataProto* out) const; virtual bool ShouldTriggerNamedEvent(const std::string& named_event) const; virtual void OnHistogramTrigger(const std::string& histogram_name) const {}
diff --git a/content/browser/webauth/authenticator_common.cc b/content/browser/webauth/authenticator_common.cc index 58418f62..8e0b5d8 100644 --- a/content/browser/webauth/authenticator_common.cc +++ b/content/browser/webauth/authenticator_common.cc
@@ -383,7 +383,7 @@ for (const auto& mapping : kTransportMapping) { if (transport_bits.AssertsBit(mapping.bit_index) && - !base::ContainsValue(*out_transports, mapping.transport)) { + !base::Contains(*out_transports, mapping.transport)) { out_transports->push_back(mapping.transport); } } @@ -1078,6 +1078,13 @@ blink::mojom::AuthenticatorStatus::NOT_ALLOWED_ERROR, nullptr, Focus::kDoCheck); return; + case device::FidoReturnCode::kAuthenticatorMissingBioEnrollment: + NOTREACHED() << "This should only be reachable from BioEnrollmentHandler"; + InvokeCallbackAndCleanup( + std::move(make_credential_response_callback_), + blink::mojom::AuthenticatorStatus::NOT_ALLOWED_ERROR, nullptr, + Focus::kDoCheck); + return; case device::FidoReturnCode::kStorageFull: SignalFailureToRequestDelegate( AuthenticatorRequestClientDelegate::InterestingFailureReason:: @@ -1276,6 +1283,12 @@ std::move(get_assertion_response_callback_), blink::mojom::AuthenticatorStatus::NOT_ALLOWED_ERROR); return; + case device::FidoReturnCode::kAuthenticatorMissingBioEnrollment: + NOTREACHED() << "This should only be reachable from BioEnrollmentHandler"; + InvokeCallbackAndCleanup( + std::move(get_assertion_response_callback_), + blink::mojom::AuthenticatorStatus::NOT_ALLOWED_ERROR); + return; case device::FidoReturnCode::kStorageFull: NOTREACHED() << "Should not be possible for assertions."; SignalFailureToRequestDelegate(
diff --git a/content/browser/webauth/authenticator_environment_impl.cc b/content/browser/webauth/authenticator_environment_impl.cc index 92c5123a..308e3be 100644 --- a/content/browser/webauth/authenticator_environment_impl.cc +++ b/content/browser/webauth/authenticator_environment_impl.cc
@@ -53,7 +53,7 @@ FrameTreeNode* node) { // Do not create a new virtual authenticator if there is one already defined // for the |node|. - if (base::ContainsKey(virtual_discovery_factories_, node)) + if (base::Contains(virtual_discovery_factories_, node)) return; node->AddObserver(this); @@ -63,7 +63,7 @@ void AuthenticatorEnvironmentImpl::DisableVirtualAuthenticatorFor( FrameTreeNode* node) { - if (!base::ContainsKey(virtual_discovery_factories_, node)) + if (!base::Contains(virtual_discovery_factories_, node)) return; node->RemoveObserver(this); @@ -73,7 +73,7 @@ VirtualFidoDiscoveryFactory* AuthenticatorEnvironmentImpl::GetVirtualFactoryFor( FrameTreeNode* node) { do { - if (base::ContainsKey(virtual_discovery_factories_, node)) { + if (base::Contains(virtual_discovery_factories_, node)) { return virtual_discovery_factories_[node].get(); } } while ((node = node->parent()));
diff --git a/content/browser/webauth/authenticator_impl_unittest.cc b/content/browser/webauth/authenticator_impl_unittest.cc index 5126e51..d2e0f60 100644 --- a/content/browser/webauth/authenticator_impl_unittest.cc +++ b/content/browser/webauth/authenticator_impl_unittest.cc
@@ -452,7 +452,7 @@ } bool SupportsTransportProtocol(::device::FidoTransportProtocol protocol) { - return base::ContainsKey( + return base::Contains( authenticator_impl_->get_authenticator_common_for_testing() ->enabled_transports_for_testing(), protocol);
diff --git a/content/browser/webauth/virtual_fido_discovery_factory.cc b/content/browser/webauth/virtual_fido_discovery_factory.cc index fec0452..8132832 100644 --- a/content/browser/webauth/virtual_fido_discovery_factory.cc +++ b/content/browser/webauth/virtual_fido_discovery_factory.cc
@@ -69,7 +69,7 @@ void VirtualFidoDiscoveryFactory::OnDiscoveryDestroyed( VirtualFidoDiscovery* discovery) { - if (base::ContainsKey(discoveries_, discovery)) + if (base::Contains(discoveries_, discovery)) discoveries_.erase(discovery); }
diff --git a/content/browser/webui/url_data_manager.cc b/content/browser/webui/url_data_manager.cc index a765356..2b11121 100644 --- a/content/browser/webui/url_data_manager.cc +++ b/content/browser/webui/url_data_manager.cc
@@ -161,7 +161,7 @@ bool URLDataManager::IsScheduledForDeletion( const URLDataSourceImpl* data_source) { base::AutoLock lock(g_delete_lock.Get()); - return data_sources_ && base::ContainsValue(*data_sources_, data_source); + return data_sources_ && base::Contains(*data_sources_, data_source); } } // namespace content
diff --git a/content/browser/webui/url_data_manager_backend.cc b/content/browser/webui/url_data_manager_backend.cc index 6f68751..8facf181 100644 --- a/content/browser/webui/url_data_manager_backend.cc +++ b/content/browser/webui/url_data_manager_backend.cc
@@ -61,7 +61,7 @@ bool SchemeIsInSchemes(const std::string& scheme, const std::vector<std::string>& schemes) { - return base::ContainsValue(schemes, scheme); + return base::Contains(schemes, scheme); } // Returns a value of 'Origin:' header for the |request| if the header is set.
diff --git a/content/gpu/BUILD.gn b/content/gpu/BUILD.gn index 2b116526..29e78fe 100644 --- a/content/gpu/BUILD.gn +++ b/content/gpu/BUILD.gn
@@ -82,6 +82,7 @@ "//services/service_manager/sandbox:chromecast_sandbox_whitelist_buildflags", "//services/shape_detection:lib", "//services/shape_detection/public/mojom", + "//services/tracing/public/cpp", "//services/viz/privileged/interfaces", "//skia", "//third_party/angle:angle_gpu_info_util",
diff --git a/content/gpu/DEPS b/content/gpu/DEPS index 452be50f..1a5a9db 100644 --- a/content/gpu/DEPS +++ b/content/gpu/DEPS
@@ -7,6 +7,7 @@ "+libGLESv2", "+services/service_manager", "+services/shape_detection", + "+services/tracing/public/cpp", "+services/viz/privileged/interfaces", "+services/viz/service", "+sandbox",
diff --git a/content/gpu/gpu_main.cc b/content/gpu/gpu_main.cc index 635e8f93..bf47f47 100644 --- a/content/gpu/gpu_main.cc +++ b/content/gpu/gpu_main.cc
@@ -21,7 +21,6 @@ #include "base/timer/hi_res_timer_manager.h" #include "base/trace_event/trace_event.h" #include "build/build_config.h" -#include "components/tracing/common/tracing_sampler_profiler.h" #include "components/viz/service/main/viz_main_impl.h" #include "content/common/content_constants_internal.h" #include "content/common/content_switches_internal.h" @@ -44,6 +43,7 @@ #include "gpu/ipc/service/gpu_init.h" #include "gpu/ipc/service/gpu_watchdog_thread.h" #include "media/gpu/buildflags.h" +#include "services/tracing/public/cpp/stack_sampling/tracing_sampler_profiler.h" #include "third_party/angle/src/gpu_info_util/SystemInfo.h" #include "ui/events/platform/platform_event_source.h" #include "ui/gfx/switches.h"
diff --git a/content/public/browser/gpu_utils.cc b/content/public/browser/gpu_utils.cc index 78dc61c..33854a5f 100644 --- a/content/public/browser/gpu_utils.cc +++ b/content/public/browser/gpu_utils.cc
@@ -91,9 +91,18 @@ gpu_preferences.enable_oop_rasterization_ddl = command_line->HasSwitch(switches::kEnableOopRasterizationDDL); - - gpu_preferences.enable_vulkan = - command_line->HasSwitch(switches::kEnableVulkan); + if (command_line->HasSwitch(switches::kUseVulkan)) { + auto value = command_line->GetSwitchValueASCII(switches::kUseVulkan); + if (value.empty() || value == switches::kVulkanImplementationNameNative) { + gpu_preferences.use_vulkan = gpu::VulkanImplementationName::kNative; + } else if (value == switches::kVulkanImplementationNameSwiftshader) { + gpu_preferences.use_vulkan = gpu::VulkanImplementationName::kSwiftshader; + } else { + gpu_preferences.use_vulkan = gpu::VulkanImplementationName::kNone; + } + } else { + gpu_preferences.use_vulkan = gpu::VulkanImplementationName::kNone; + } gpu_preferences.disable_vulkan_fallback_to_gl_for_testing = command_line->HasSwitch(switches::kDisableVulkanFallbackToGLForTesting);
diff --git a/content/public/test/browser_test_base.cc b/content/public/test/browser_test_base.cc index bf2ed9a..9c9e8c96 100644 --- a/content/public/test/browser_test_base.cc +++ b/content/public/test/browser_test_base.cc
@@ -410,6 +410,7 @@ // for the test harness to be able to delete temp dirs. base::ThreadRestrictions::SetIOAllowed(true); + BrowserTaskExecutor::ResetForTesting(); #else GetContentMainParams()->ui_task = ui_task.release(); GetContentMainParams()->created_main_parts_closure =
diff --git a/content/renderer/BUILD.gn b/content/renderer/BUILD.gn index bde316ef..b1848dc 100644 --- a/content/renderer/BUILD.gn +++ b/content/renderer/BUILD.gn
@@ -515,7 +515,6 @@ "//components/metrics", "//components/metrics:single_sample_metrics", "//components/services/leveldb/public/cpp", - "//components/tracing", "//components/url_formatter", "//components/viz/client", "//components/viz/common", @@ -571,6 +570,7 @@ "//services/network:network_service", "//services/service_manager/public/cpp", "//services/service_manager/public/mojom", + "//services/tracing/public/cpp", "//services/ws/public/cpp/gpu", "//skia", "//storage/common",
diff --git a/content/renderer/DEPS b/content/renderer/DEPS index 3b0f954c..fa79e26 100644 --- a/content/renderer/DEPS +++ b/content/renderer/DEPS
@@ -5,7 +5,6 @@ "+components/metrics", "+components/metrics:single_sample_metrics", "+components/payments", - "+components/tracing", "+components/url_formatter", "+components/viz/client", "+components/viz/common",
diff --git a/content/renderer/dom_serializer_browsertest.cc b/content/renderer/dom_serializer_browsertest.cc index 6d20c9f3..bda6ad1 100644 --- a/content/renderer/dom_serializer_browsertest.cc +++ b/content/renderer/dom_serializer_browsertest.cc
@@ -134,7 +134,6 @@ contents, base_url, encoding_info.IsEmpty() ? "UTF-8" : encoding_info.Utf8(), GURL(), false /* replace_current_item */); - base::MessageLoopCurrent::ScopedNestableTaskAllower allow; waiter.Wait(); }
diff --git a/content/renderer/render_widget.cc b/content/renderer/render_widget.cc index d54a31c..cc8e8d5 100644 --- a/content/renderer/render_widget.cc +++ b/content/renderer/render_widget.cc
@@ -1236,6 +1236,13 @@ host->SetDebugState(debug_state); } +void RenderWidget::SetShowLayoutShiftRegions(bool show) { + cc::LayerTreeHost* host = layer_tree_view_->layer_tree_host(); + cc::LayerTreeDebugState debug_state = host->GetDebugState(); + debug_state.show_layout_shift_regions = show; + host->SetDebugState(debug_state); +} + void RenderWidget::SetShowPaintRects(bool show) { cc::LayerTreeHost* host = layer_tree_view_->layer_tree_host(); cc::LayerTreeDebugState debug_state = host->GetDebugState();
diff --git a/content/renderer/render_widget.h b/content/renderer/render_widget.h index 1d9ba506..4f48d53b 100644 --- a/content/renderer/render_widget.h +++ b/content/renderer/render_widget.h
@@ -384,6 +384,7 @@ void SetRootLayer(scoped_refptr<cc::Layer> layer) override; void ScheduleAnimation() override; void SetShowFPSCounter(bool show) override; + void SetShowLayoutShiftRegions(bool) override; void SetShowPaintRects(bool) override; void SetShowDebugBorders(bool) override; void SetShowScrollBottleneckRects(bool) override;
diff --git a/content/renderer/renderer_main.cc b/content/renderer/renderer_main.cc index 3ac5e99..180c89fd 100644 --- a/content/renderer/renderer_main.cc +++ b/content/renderer/renderer_main.cc
@@ -20,7 +20,6 @@ #include "base/timer/hi_res_timer_manager.h" #include "base/trace_event/trace_event.h" #include "build/build_config.h" -#include "components/tracing/common/tracing_sampler_profiler.h" #include "content/common/content_constants_internal.h" #include "content/common/content_switches_internal.h" #include "content/common/service_manager/service_manager_connection_impl.h" @@ -36,6 +35,7 @@ #include "mojo/public/cpp/bindings/mojo_buildflags.h" #include "ppapi/buildflags/buildflags.h" #include "services/service_manager/sandbox/switches.h" +#include "services/tracing/public/cpp/stack_sampling/tracing_sampler_profiler.h" #include "third_party/blink/public/platform/scheduler/web_thread_scheduler.h" #include "third_party/webrtc_overrides/init_webrtc.h" // nogncheck #include "ui/base/ui_base_switches.h"
diff --git a/device/fido/bio/enrollment.cc b/device/fido/bio/enrollment.cc index 1dfe414..12f35398 100644 --- a/device/fido/bio/enrollment.cc +++ b/device/fido/bio/enrollment.cc
@@ -5,44 +5,97 @@ #include "device/fido/bio/enrollment.h" #include "components/cbor/diagnostic_writer.h" +#include "components/cbor/writer.h" #include "components/device_event_log/device_event_log.h" namespace device { // static BioEnrollmentRequest BioEnrollmentRequest::ForGetModality() { - return BioEnrollmentRequest(true); + BioEnrollmentRequest request; + request.get_modality = true; + return request; } // static BioEnrollmentRequest BioEnrollmentRequest::ForGetSensorInfo() { - return BioEnrollmentRequest( - BioEnrollmentModality::kFingerprint, - BioEnrollmentSubCommand::kGetFingerprintSensorInfo); + BioEnrollmentRequest request; + request.modality = BioEnrollmentModality::kFingerprint; + request.subcommand = BioEnrollmentSubCommand::kGetFingerprintSensorInfo; + return request; +} + +// static +BioEnrollmentRequest BioEnrollmentRequest::ForEnrollBegin( + const pin::TokenResponse& response) { + BioEnrollmentRequest request; + request.pin_protocol = 1; + request.modality = BioEnrollmentModality::kFingerprint; + request.subcommand = BioEnrollmentSubCommand::kEnrollBegin; + request.pin_auth = response.PinAuth( + std::vector<uint8_t>{static_cast<uint8_t>(*request.modality), + static_cast<uint8_t>(*request.subcommand)}); + return request; +} + +// static +BioEnrollmentRequest BioEnrollmentRequest::ForEnrollNextSample( + const pin::TokenResponse& response, + std::vector<uint8_t> template_id) { + BioEnrollmentRequest request; + request.pin_protocol = 1; + request.modality = BioEnrollmentModality::kFingerprint; + request.subcommand = BioEnrollmentSubCommand::kEnrollCaptureNextSample; + request.params = cbor::Value::MapValue(); + request.params->emplace( + static_cast<int>(BioEnrollmentSubCommandParam::kTemplateId), + cbor::Value(template_id)); + + std::vector<uint8_t> pin_auth = + *cbor::Writer::Write(cbor::Value(*request.params)); + pin_auth.insert(pin_auth.begin(), static_cast<int>(*request.subcommand)); + pin_auth.insert(pin_auth.begin(), static_cast<int>(*request.modality)); + + request.pin_auth = response.PinAuth(std::move(pin_auth)); + + return request; +} + +// static +BioEnrollmentRequest BioEnrollmentRequest::ForCancel() { + BioEnrollmentRequest request; + request.modality = BioEnrollmentModality::kFingerprint; + request.subcommand = BioEnrollmentSubCommand::kCancelCurrentEnrollment; + return request; } BioEnrollmentRequest::BioEnrollmentRequest(BioEnrollmentRequest&&) = default; - +BioEnrollmentRequest& BioEnrollmentRequest::operator=(BioEnrollmentRequest&&) = + default; +BioEnrollmentRequest::BioEnrollmentRequest() = default; BioEnrollmentRequest::~BioEnrollmentRequest() = default; -BioEnrollmentRequest::BioEnrollmentRequest(bool get_modality_) - : get_modality(get_modality_) {} - -BioEnrollmentRequest::BioEnrollmentRequest(BioEnrollmentModality modality_, - BioEnrollmentSubCommand subcommand_) - : modality(modality_), subcommand(subcommand_) {} +template <typename T> +static base::Optional<T> ToBioEnrollmentEnum(uint8_t v) { + // Check if enum-class is in range... + if (v < static_cast<int>(T::kMin) || v > static_cast<int>(T::kMax)) { + // ...to avoid UB. + return base::nullopt; + } + return static_cast<T>(v); +} // static base::Optional<BioEnrollmentResponse> BioEnrollmentResponse::Parse( const base::Optional<cbor::Value>& cbor_response) { + BioEnrollmentResponse response; + if (!cbor_response || !cbor_response->is_map()) { - return base::nullopt; + return response; } const auto& response_map = cbor_response->GetMap(); - BioEnrollmentResponse response; - // modality auto it = response_map.find( cbor::Value(static_cast<int>(BioEnrollmentResponseKey::kModality))); @@ -51,7 +104,10 @@ return base::nullopt; } response.modality = - static_cast<BioEnrollmentModality>(it->second.GetUnsigned()); + ToBioEnrollmentEnum<BioEnrollmentModality>(it->second.GetUnsigned()); + if (!response.modality) { + return base::nullopt; + } } // fingerprint kind @@ -62,7 +118,11 @@ return base::nullopt; } response.fingerprint_kind = - static_cast<BioEnrollmentFingerprintKind>(it->second.GetUnsigned()); + ToBioEnrollmentEnum<BioEnrollmentFingerprintKind>( + it->second.GetUnsigned()); + if (!response.fingerprint_kind) { + return base::nullopt; + } } // max captures required for enroll @@ -75,9 +135,47 @@ response.max_samples_for_enroll = it->second.GetUnsigned(); } + // template id + it = response_map.find( + cbor::Value(static_cast<int>(BioEnrollmentResponseKey::kTemplateId))); + if (it != response_map.end()) { + if (!it->second.is_bytestring()) { + return base::nullopt; + } + response.template_id = it->second.GetBytestring(); + } + + // last enroll sample status + it = response_map.find(cbor::Value( + static_cast<int>(BioEnrollmentResponseKey::kLastEnrollSampleStatus))); + if (it != response_map.end()) { + if (!it->second.is_unsigned()) { + return base::nullopt; + } + response.last_status = ToBioEnrollmentEnum<BioEnrollmentSampleStatus>( + it->second.GetUnsigned()); + if (!response.last_status) { + return base::nullopt; + } + } + + // remaining samples + it = response_map.find(cbor::Value( + static_cast<int>(BioEnrollmentResponseKey::kRemainingSamples))); + if (it != response_map.end()) { + if (!it->second.is_unsigned()) { + return base::nullopt; + } + response.remaining_samples = it->second.GetUnsigned(); + } + return response; } +BioEnrollmentResponse::BioEnrollmentResponse() = default; +BioEnrollmentResponse::BioEnrollmentResponse(BioEnrollmentResponse&&) = default; +BioEnrollmentResponse::~BioEnrollmentResponse() = default; + std::pair<CtapRequestCommand, base::Optional<cbor::Value>> AsCTAPRequestValuePair(const BioEnrollmentRequest& request) { cbor::Value::MapValue map;
diff --git a/device/fido/bio/enrollment.h b/device/fido/bio/enrollment.h index 29bbda1..be9ce8c 100644 --- a/device/fido/bio/enrollment.h +++ b/device/fido/bio/enrollment.h
@@ -11,6 +11,7 @@ #include "components/cbor/values.h" #include "device/fido/fido_constants.h" +#include "device/fido/pin.h" namespace device { @@ -29,11 +30,17 @@ kGetModality = 0x06 }; -enum class BioEnrollmentModality : uint8_t { kFingerprint = 0x01 }; +enum class BioEnrollmentModality : uint8_t { + kFingerprint = 0x01, + kMin = kFingerprint, + kMax = kFingerprint +}; enum class BioEnrollmentFingerprintKind : uint8_t { kTouch = 0x01, - kSwipe = 0x02 + kSwipe = 0x02, + kMin = kTouch, + kMax = kSwipe }; enum class BioEnrollmentSubCommand : uint8_t { @@ -43,7 +50,9 @@ kEnumerateEnrollments = 0x04, kSetFriendlyName = 0x05, kRemoveEnrollment = 0x06, - kGetFingerprintSensorInfo = 0x07 + kGetFingerprintSensorInfo = 0x07, + kMin = kEnrollBegin, + kMax = kGetFingerprintSensorInfo }; enum class BioEnrollmentSubCommandParam : uint8_t { @@ -82,38 +91,54 @@ kExists = 0x0B, kDatabaseFull = 0x0C, kNoUserActivity = 0x0D, - kNoUserPresenceTransition = 0x0E + kNoUserPresenceTransition = 0x0E, + kMin = kGood, + kMax = kNoUserPresenceTransition }; struct BioEnrollmentRequest { + static std::pair<CtapRequestCommand, base::Optional<cbor::Value>> + EncodeAsCBOR(const BioEnrollmentRequest& request); + static BioEnrollmentRequest ForGetModality(); static BioEnrollmentRequest ForGetSensorInfo(); + static BioEnrollmentRequest ForEnrollBegin( + const pin::TokenResponse& pin_token); + static BioEnrollmentRequest ForEnrollNextSample( + const pin::TokenResponse& pin_token, + std::vector<uint8_t> template_id); + static BioEnrollmentRequest ForCancel(); base::Optional<BioEnrollmentModality> modality; base::Optional<BioEnrollmentSubCommand> subcommand; base::Optional<cbor::Value::MapValue> params; base::Optional<uint8_t> pin_protocol; - base::Optional<std::array<uint8_t, 16>> pin_auth; + base::Optional<std::vector<uint8_t>> pin_auth; base::Optional<bool> get_modality; BioEnrollmentRequest(BioEnrollmentRequest&&); + BioEnrollmentRequest& operator=(BioEnrollmentRequest&&); ~BioEnrollmentRequest(); private: - explicit BioEnrollmentRequest(bool get_modality); - BioEnrollmentRequest(BioEnrollmentModality modality, - BioEnrollmentSubCommand subcommand); - - BioEnrollmentRequest(const BioEnrollmentRequest&) = delete; + BioEnrollmentRequest(); }; struct COMPONENT_EXPORT(DEVICE_FIDO) BioEnrollmentResponse { static base::Optional<BioEnrollmentResponse> Parse( const base::Optional<cbor::Value>& cbor_response); - BioEnrollmentModality modality; - BioEnrollmentFingerprintKind fingerprint_kind; - uint8_t max_samples_for_enroll; + BioEnrollmentResponse(); + BioEnrollmentResponse(BioEnrollmentResponse&&); + BioEnrollmentResponse& operator=(BioEnrollmentResponse&&) = default; + ~BioEnrollmentResponse(); + + base::Optional<BioEnrollmentModality> modality; + base::Optional<BioEnrollmentFingerprintKind> fingerprint_kind; + base::Optional<uint8_t> max_samples_for_enroll; + base::Optional<std::vector<uint8_t>> template_id; + base::Optional<BioEnrollmentSampleStatus> last_status; + base::Optional<uint8_t> remaining_samples; }; COMPONENT_EXPORT(DEVICE_FIDO)
diff --git a/device/fido/bio/enrollment_handler.cc b/device/fido/bio/enrollment_handler.cc index f0f2f3ec..88c87ca6 100644 --- a/device/fido/bio/enrollment_handler.cc +++ b/device/fido/bio/enrollment_handler.cc
@@ -5,7 +5,7 @@ #include "device/fido/bio/enrollment_handler.h" #include "base/bind.h" -#include "device/fido/bio/enrollment.h" +#include "components/device_event_log/device_event_log.h" #include "device/fido/fido_authenticator.h" #include "device/fido/fido_constants.h" @@ -13,11 +13,15 @@ BioEnrollmentHandler::BioEnrollmentHandler( service_manager::Connector* connector, - FidoDiscoveryFactory* factory, const base::flat_set<FidoTransportProtocol>& supported_transports, - base::OnceClosure ready_callback) + base::OnceClosure ready_callback, + ErrorCallback error_callback, + GetPINCallback get_pin_callback, + FidoDiscoveryFactory* factory) : FidoRequestHandlerBase(connector, factory, supported_transports), ready_callback_(std::move(ready_callback)), + error_callback_(std::move(error_callback)), + get_pin_callback_(std::move(get_pin_callback)), weak_factory_(this) { Start(); } @@ -26,34 +30,51 @@ DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker); } -void BioEnrollmentHandler::GetModality(GetInfoCallback callback) { +void BioEnrollmentHandler::GetModality(ResponseCallback callback) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker); - if (authenticator_->Options()->bio_enrollment_availability_preview == - AuthenticatorSupportedOptions::BioEnrollmentAvailability::kNotSupported) { + if (!authenticator_ || + authenticator_->Options()->bio_enrollment_availability_preview == + AuthenticatorSupportedOptions::BioEnrollmentAvailability:: + kNotSupported) { std::move(callback).Run(CtapDeviceResponseCode::kCtap2ErrUnsupportedOption, base::nullopt); } else { - callback_ = std::move(callback); - authenticator_->GetModality(base::BindOnce(&BioEnrollmentHandler::OnGetInfo, - weak_factory_.GetWeakPtr())); + authenticator_->GetModality(std::move(callback)); } } -void BioEnrollmentHandler::GetSensorInfo(GetInfoCallback callback) { +void BioEnrollmentHandler::GetSensorInfo(ResponseCallback callback) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker); - if (authenticator_->Options()->bio_enrollment_availability_preview == - AuthenticatorSupportedOptions::BioEnrollmentAvailability::kNotSupported) { + if (!authenticator_ || + authenticator_->Options()->bio_enrollment_availability_preview == + AuthenticatorSupportedOptions::BioEnrollmentAvailability:: + kNotSupported) { std::move(callback).Run(CtapDeviceResponseCode::kCtap2ErrUnsupportedOption, base::nullopt); } else { - callback_ = std::move(callback); - authenticator_->GetSensorInfo(base::BindOnce( - &BioEnrollmentHandler::OnGetInfo, weak_factory_.GetWeakPtr())); + authenticator_->GetSensorInfo(std::move(callback)); } } +void BioEnrollmentHandler::Enroll(ResponseCallback callback) { + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker); + + response_callback_ = std::move(callback); + authenticator_->BioEnrollFingerprint( + *pin_token_response_, base::BindRepeating(&BioEnrollmentHandler::OnEnroll, + weak_factory_.GetWeakPtr())); +} + +void BioEnrollmentHandler::Cancel(base::OnceClosure callback) { + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker); + + status_callback_ = std::move(callback); + authenticator_->BioEnrollCancel(base::BindOnce( + &BioEnrollmentHandler::OnCancel, weak_factory_.GetWeakPtr())); +} + void BioEnrollmentHandler::DispatchRequest(FidoAuthenticator* authenticator) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker); authenticator->GetTouch(base::BindOnce(&BioEnrollmentHandler::OnTouch, @@ -64,22 +85,123 @@ void BioEnrollmentHandler::AuthenticatorRemoved( FidoDiscoveryBase* discovery, FidoAuthenticator* authenticator) { - if (authenticator_ == authenticator) { - authenticator_ = nullptr; - } + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker); FidoRequestHandlerBase::AuthenticatorRemoved(discovery, authenticator); + if (authenticator_ != authenticator) { + return; + } + + authenticator_ = nullptr; + + std::move(error_callback_) + .Run(pin_token_response_ + ? FidoReturnCode::kAuthenticatorRemovedDuringPINEntry + : FidoReturnCode::kSuccess); } void BioEnrollmentHandler::OnTouch(FidoAuthenticator* authenticator) { + CancelActiveAuthenticators(authenticator->GetId()); + + if (!authenticator->Options() || + authenticator->Options()->bio_enrollment_availability_preview == + AuthenticatorSupportedOptions::BioEnrollmentAvailability:: + kNotSupported) { + std::move(error_callback_) + .Run(FidoReturnCode::kAuthenticatorMissingBioEnrollment); + return; + } + authenticator_ = authenticator; - CancelActiveAuthenticators(authenticator_->GetId()); + authenticator_->GetRetries(base::BindOnce( + &BioEnrollmentHandler::OnRetriesResponse, weak_factory_.GetWeakPtr())); +} + +void BioEnrollmentHandler::OnRetriesResponse( + CtapDeviceResponseCode code, + base::Optional<pin::RetriesResponse> response) { + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker); + if (!response || code != CtapDeviceResponseCode::kSuccess) { + FIDO_LOG(DEBUG) << "OnRetriesResponse failed: " << static_cast<int>(code); + std::move(error_callback_) + .Run(FidoReturnCode::kAuthenticatorResponseInvalid); + return; + } + + if (response->retries == 0) { + std::move(error_callback_).Run(FidoReturnCode::kHardPINBlock); + return; + } + + get_pin_callback_.Run(response->retries, + base::BindOnce(&BioEnrollmentHandler::OnHavePIN, + weak_factory_.GetWeakPtr())); +} + +void BioEnrollmentHandler::OnHavePIN(std::string pin) { + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker); + + authenticator_->GetEphemeralKey( + base::BindOnce(&BioEnrollmentHandler::OnHaveEphemeralKey, + weak_factory_.GetWeakPtr(), std::move(pin))); +} + +void BioEnrollmentHandler::OnHaveEphemeralKey( + std::string pin, + CtapDeviceResponseCode code, + base::Optional<pin::KeyAgreementResponse> response) { + if (code != CtapDeviceResponseCode::kSuccess) { + FIDO_LOG(DEBUG) << "OnHaveEphemeralKey failed: " << static_cast<int>(code); + std::move(error_callback_) + .Run(FidoReturnCode::kAuthenticatorResponseInvalid); + return; + } + + authenticator_->GetPINToken( + std::move(pin), *response, + base::BindOnce(&BioEnrollmentHandler::OnHavePINToken, + weak_factory_.GetWeakPtr())); +} + +void BioEnrollmentHandler::OnHavePINToken( + CtapDeviceResponseCode code, + base::Optional<pin::TokenResponse> response) { + if (code == CtapDeviceResponseCode::kCtap2ErrPinInvalid) { + authenticator_->GetRetries(base::BindOnce( + &BioEnrollmentHandler::OnRetriesResponse, weak_factory_.GetWeakPtr())); + return; + } + + switch (code) { + case CtapDeviceResponseCode::kCtap2ErrPinAuthBlocked: + std::move(error_callback_).Run(FidoReturnCode::kSoftPINBlock); + return; + case CtapDeviceResponseCode::kCtap2ErrPinBlocked: + std::move(error_callback_).Run(FidoReturnCode::kHardPINBlock); + return; + default: + std::move(error_callback_) + .Run(FidoReturnCode::kAuthenticatorResponseInvalid); + return; + case CtapDeviceResponseCode::kSuccess: + // fall through on success + break; + } + + pin_token_response_ = *response; std::move(ready_callback_).Run(); } -void BioEnrollmentHandler::OnGetInfo( - CtapDeviceResponseCode status, +void BioEnrollmentHandler::OnEnroll( + CtapDeviceResponseCode code, base::Optional<BioEnrollmentResponse> response) { - std::move(callback_).Run(status, response); + FIDO_LOG(DEBUG) << "Finished bio enrollment with code " + << static_cast<int>(code); + std::move(response_callback_).Run(code, std::move(response)); +} + +void BioEnrollmentHandler::OnCancel(CtapDeviceResponseCode, + base::Optional<BioEnrollmentResponse>) { + std::move(status_callback_).Run(); } } // namespace device
diff --git a/device/fido/bio/enrollment_handler.h b/device/fido/bio/enrollment_handler.h index 9173878..3bdf0c0 100644 --- a/device/fido/bio/enrollment_handler.h +++ b/device/fido/bio/enrollment_handler.h
@@ -11,6 +11,7 @@ #include "device/fido/fido_constants.h" #include "device/fido/fido_discovery_factory.h" #include "device/fido/fido_request_handler_base.h" +#include "device/fido/pin.h" namespace service_manager { class Connector; @@ -21,19 +22,28 @@ class COMPONENT_EXPORT(DEVICE_FIDO) BioEnrollmentHandler : public FidoRequestHandlerBase { public: - using GetInfoCallback = + using ErrorCallback = base::OnceCallback<void(FidoReturnCode)>; + using GetPINCallback = + base::RepeatingCallback<void(int64_t retries, + base::OnceCallback<void(std::string)>)>; + using ResponseCallback = base::OnceCallback<void(CtapDeviceResponseCode, base::Optional<BioEnrollmentResponse>)>; BioEnrollmentHandler( service_manager::Connector* connector, - FidoDiscoveryFactory* factory, const base::flat_set<FidoTransportProtocol>& supported_transports, - base::OnceClosure ready_callback); + base::OnceClosure ready_callback, + ErrorCallback error_callback, + GetPINCallback get_pin_callback, + FidoDiscoveryFactory* factory = + std::make_unique<FidoDiscoveryFactory>().get()); ~BioEnrollmentHandler() override; - void GetModality(GetInfoCallback callback); - void GetSensorInfo(GetInfoCallback callback); + void GetModality(ResponseCallback); + void GetSensorInfo(ResponseCallback); + void Enroll(ResponseCallback); + void Cancel(base::OnceClosure); private: // FidoRequestHandlerBase: @@ -41,13 +51,26 @@ void AuthenticatorRemoved(FidoDiscoveryBase*, FidoAuthenticator*) override; void OnTouch(FidoAuthenticator* authenticator); - void OnGetInfo(CtapDeviceResponseCode, base::Optional<BioEnrollmentResponse>); + void OnRetriesResponse(CtapDeviceResponseCode, + base::Optional<pin::RetriesResponse>); + void OnHavePIN(std::string pin); + void OnHaveEphemeralKey(std::string, + CtapDeviceResponseCode, + base::Optional<pin::KeyAgreementResponse>); + void OnHavePINToken(CtapDeviceResponseCode, + base::Optional<pin::TokenResponse>); + void OnEnroll(CtapDeviceResponseCode, base::Optional<BioEnrollmentResponse>); + void OnCancel(CtapDeviceResponseCode, base::Optional<BioEnrollmentResponse>); SEQUENCE_CHECKER(sequence_checker); FidoAuthenticator* authenticator_ = nullptr; base::OnceClosure ready_callback_; - GetInfoCallback callback_; + ErrorCallback error_callback_; + GetPINCallback get_pin_callback_; + ResponseCallback response_callback_; + base::OnceClosure status_callback_; + base::Optional<pin::TokenResponse> pin_token_response_; base::WeakPtrFactory<BioEnrollmentHandler> weak_factory_; BioEnrollmentHandler(const BioEnrollmentHandler&) = delete;
diff --git a/device/fido/bio/enrollment_handler_unittest.cc b/device/fido/bio/enrollment_handler_unittest.cc index a9887d27..b70bb7c7 100644 --- a/device/fido/bio/enrollment_handler_unittest.cc +++ b/device/fido/bio/enrollment_handler_unittest.cc
@@ -17,28 +17,45 @@ namespace device { namespace { +constexpr char kPIN[] = "1477"; + class BioEnrollmentHandlerTest : public ::testing::Test { + void SetUp() override { + virtual_device_factory_.SetSupportedProtocol(ProtocolVersion::kCtap2); + virtual_device_factory_.mutable_state()->pin = kPIN; + virtual_device_factory_.mutable_state()->retries = 8; + } + protected: std::unique_ptr<BioEnrollmentHandler> MakeHandler() { return std::make_unique<BioEnrollmentHandler>( - /*connector=*/nullptr, &virtual_device_factory_, + /*connector=*/nullptr, base::flat_set<FidoTransportProtocol>{ FidoTransportProtocol::kUsbHumanInterfaceDevice}, - ready_callback_.callback()); + ready_callback_.callback(), error_callback_.callback(), + base::BindRepeating(&BioEnrollmentHandlerTest::GetPIN, + base::Unretained(this)), + &virtual_device_factory_); + } + + void GetPIN(int64_t attempts, + base::OnceCallback<void(std::string)> provide_pin) { + std::move(provide_pin).Run(kPIN); } base::test::ScopedTaskEnvironment scoped_task_environment_; test::TestCallbackReceiver<> ready_callback_; + test::ValueCallbackReceiver<FidoReturnCode> error_callback_; test::VirtualFidoDeviceFactory virtual_device_factory_; }; // Tests getting authenticator modality without pin auth. TEST_F(BioEnrollmentHandlerTest, Modality) { VirtualCtap2Device::Config config; + config.pin_support = true; config.bio_enrollment_support = true; virtual_device_factory_.SetCtap2Config(config); - virtual_device_factory_.SetSupportedProtocol(ProtocolVersion::kCtap2); auto handler = MakeHandler(); ready_callback_.WaitForCallback(); @@ -49,18 +66,26 @@ handler->GetModality(cb.callback()); cb.WaitForCallback(); - EXPECT_EQ(cb.status(), CtapDeviceResponseCode::kSuccess); - EXPECT_TRUE(cb.value()); - EXPECT_EQ(cb.value()->modality, BioEnrollmentModality::kFingerprint); + auto result = cb.TakeResult(); + EXPECT_EQ(std::get<0>(result), CtapDeviceResponseCode::kSuccess); + + auto v = std::move(std::get<1>(result)); + EXPECT_TRUE(v); + EXPECT_EQ(v->modality, BioEnrollmentModality::kFingerprint); + EXPECT_FALSE(v->fingerprint_kind); + EXPECT_FALSE(v->max_samples_for_enroll); + EXPECT_FALSE(v->template_id); + EXPECT_FALSE(v->last_status); + EXPECT_FALSE(v->remaining_samples); } // Tests getting authenticator modality without pin auth. TEST_F(BioEnrollmentHandlerTest, FingerprintSensorInfo) { VirtualCtap2Device::Config config; + config.pin_support = true; config.bio_enrollment_support = true; virtual_device_factory_.SetCtap2Config(config); - virtual_device_factory_.SetSupportedProtocol(ProtocolVersion::kCtap2); auto handler = MakeHandler(); ready_callback_.WaitForCallback(); @@ -71,21 +96,30 @@ handler->GetSensorInfo(cb.callback()); cb.WaitForCallback(); - EXPECT_EQ(cb.status(), CtapDeviceResponseCode::kSuccess); - EXPECT_TRUE(cb.value()); - EXPECT_EQ(cb.value()->fingerprint_kind, BioEnrollmentFingerprintKind::kTouch); - EXPECT_EQ(cb.value()->max_samples_for_enroll, 7); + auto result = cb.TakeResult(); + EXPECT_EQ(std::get<0>(result), CtapDeviceResponseCode::kSuccess); + + auto v = std::move(std::get<1>(result)); + EXPECT_TRUE(v); + EXPECT_EQ(v->modality, BioEnrollmentModality::kFingerprint); + EXPECT_EQ(v->fingerprint_kind, BioEnrollmentFingerprintKind::kTouch); + EXPECT_EQ(v->max_samples_for_enroll, 7); + EXPECT_FALSE(v->template_id); + EXPECT_FALSE(v->last_status); + EXPECT_FALSE(v->remaining_samples); } // Tests bio enrollment commands against an authenticator lacking support. TEST_F(BioEnrollmentHandlerTest, NoBioEnrollmentSupport) { VirtualCtap2Device::Config config; + config.pin_support = true; virtual_device_factory_.SetCtap2Config(config); - virtual_device_factory_.SetSupportedProtocol(ProtocolVersion::kCtap2); auto handler = MakeHandler(); - ready_callback_.WaitForCallback(); + error_callback_.WaitForCallback(); + EXPECT_EQ(error_callback_.value(), + FidoReturnCode::kAuthenticatorMissingBioEnrollment); // Test unsupported bio-enrollment command. test::StatusAndValueCallbackReceiver<CtapDeviceResponseCode, @@ -108,5 +142,50 @@ EXPECT_FALSE(cb1.value()); } +// Tests fingerprint enrollment lifecycle. +TEST_F(BioEnrollmentHandlerTest, Enroll) { + VirtualCtap2Device::Config config; + config.pin_support = true; + config.bio_enrollment_support = true; + + virtual_device_factory_.SetCtap2Config(config); + + auto handler = MakeHandler(); + ready_callback_.WaitForCallback(); + + test::StatusAndValueCallbackReceiver<CtapDeviceResponseCode, + base::Optional<BioEnrollmentResponse>> + cb; + handler->Enroll(cb.callback()); + + cb.WaitForCallback(); + EXPECT_EQ(cb.status(), CtapDeviceResponseCode::kSuccess); + + auto v = std::move(std::get<1>(cb.TakeResult())); + EXPECT_TRUE(v); + EXPECT_FALSE(v->modality); + EXPECT_FALSE(v->fingerprint_kind); + EXPECT_FALSE(v->max_samples_for_enroll); + EXPECT_FALSE(v->template_id); + EXPECT_EQ(v->last_status, BioEnrollmentSampleStatus::kGood); + EXPECT_EQ(v->remaining_samples, 0); +} + +// Tests cancelling fingerprint without an ongoing enrollment. +TEST_F(BioEnrollmentHandlerTest, CancelNoEnroll) { + VirtualCtap2Device::Config config; + config.pin_support = true; + config.bio_enrollment_support = true; + + virtual_device_factory_.SetCtap2Config(config); + + auto handler = MakeHandler(); + ready_callback_.WaitForCallback(); + + test::TestCallbackReceiver<> cb; + handler->Cancel(cb.callback()); + cb.WaitForCallback(); +} + } // namespace } // namespace device
diff --git a/device/fido/ble/fido_ble_device.cc b/device/fido/ble/fido_ble_device.cc index f8f8d4e..7a77188 100644 --- a/device/fido/ble/fido_ble_device.cc +++ b/device/fido/ble/fido_ble_device.cc
@@ -49,8 +49,8 @@ } // static -std::string FidoBleDevice::GetId(base::StringPiece address) { - return std::string("ble:").append(address.begin(), address.end()); +std::string FidoBleDevice::GetIdForAddress(const std::string& address) { + return "ble:" + address; } void FidoBleDevice::Cancel(CancelToken token) { @@ -75,7 +75,7 @@ } std::string FidoBleDevice::GetId() const { - return GetId(connection_->address()); + return GetIdForAddress(connection_->address()); } base::string16 FidoBleDevice::GetDisplayName() const { @@ -280,6 +280,7 @@ } void FidoBleDevice::OnTimeout() { + FIDO_LOG(ERROR) << "FIDO BLE device timeout for " << GetId(); state_ = State::kDeviceError; Transition(); }
diff --git a/device/fido/ble/fido_ble_device.h b/device/fido/ble/fido_ble_device.h index 6d6195cf..28c73a2 100644 --- a/device/fido/ble/fido_ble_device.h +++ b/device/fido/ble/fido_ble_device.h
@@ -32,28 +32,26 @@ class COMPONENT_EXPORT(DEVICE_FIDO) FidoBleDevice : public FidoDevice { public: using FrameCallback = FidoBleTransaction::FrameCallback; + FidoBleDevice(BluetoothAdapter* adapter, std::string address); explicit FidoBleDevice(std::unique_ptr<FidoBleConnection> connection); ~FidoBleDevice() override; + // Returns FidoDevice::GetId() for a given FidoBleConnection address. + static std::string GetIdForAddress(const std::string& ble_address); + void Connect(); void SendPing(std::vector<uint8_t> data, DeviceCallback callback); - static std::string GetId(base::StringPiece address); + FidoBleConnection::ReadCallback GetReadCallbackForTesting(); // FidoDevice: void Cancel(CancelToken token) override; std::string GetId() const override; base::string16 GetDisplayName() const override; FidoTransportProtocol DeviceTransport() const override; - - // Returns whether or not the underlying BLE device is currently in pairing - // mode by investigating the advertisement payload. bool IsInPairingMode() const override; - bool IsPaired() const override; - FidoBleConnection::ReadCallback GetReadCallbackForTesting(); - protected: // FidoDevice: CancelToken DeviceTransact(std::vector<uint8_t> command,
diff --git a/device/fido/ble/fido_ble_device_unittest.cc b/device/fido/ble/fido_ble_device_unittest.cc index 83697c93..e958cabe 100644 --- a/device/fido/ble/fido_ble_device_unittest.cc +++ b/device/fido/ble/fido_ble_device_unittest.cc
@@ -258,7 +258,7 @@ TEST_F(FidoBleDeviceTest, StaticGetIdTest) { std::string address = BluetoothTestBase::kTestDeviceAddress1; - EXPECT_EQ("ble:" + address, FidoBleDevice::GetId(address)); + EXPECT_EQ("ble:" + address, FidoBleDevice::GetIdForAddress(address)); } TEST_F(FidoBleDeviceTest, GetIdTest) {
diff --git a/device/fido/ble/fido_ble_discovery.cc b/device/fido/ble/fido_ble_discovery.cc index 0386fbd..c6d74ab 100644 --- a/device/fido/ble/fido_ble_discovery.cc +++ b/device/fido/ble/fido_ble_discovery.cc
@@ -39,12 +39,12 @@ for (BluetoothDevice* device : adapter()->GetDevices()) { if (!CheckForExcludedDeviceAndCacheAddress(device) && - base::ContainsKey(device->GetUUIDs(), FidoServiceUUID())) { + base::Contains(device->GetUUIDs(), FidoServiceUUID())) { const auto& device_address = device->GetAddress(); VLOG(2) << "FIDO BLE device: " << device_address; AddDevice(std::make_unique<FidoBleDevice>(adapter(), device_address)); CheckAndRecordDevicePairingModeOnDiscovery( - FidoBleDevice::GetId(device_address)); + FidoBleDevice::GetIdForAddress(device_address)); } } @@ -65,23 +65,23 @@ void FidoBleDiscovery::DeviceAdded(BluetoothAdapter* adapter, BluetoothDevice* device) { if (!CheckForExcludedDeviceAndCacheAddress(device) && - base::ContainsKey(device->GetUUIDs(), FidoServiceUUID())) { + base::Contains(device->GetUUIDs(), FidoServiceUUID())) { const auto& device_address = device->GetAddress(); VLOG(2) << "Discovered FIDO BLE device: " << device_address; AddDevice(std::make_unique<FidoBleDevice>(adapter, device_address)); CheckAndRecordDevicePairingModeOnDiscovery( - FidoBleDevice::GetId(device_address)); + FidoBleDevice::GetIdForAddress(device_address)); } } void FidoBleDiscovery::DeviceChanged(BluetoothAdapter* adapter, BluetoothDevice* device) { if (CheckForExcludedDeviceAndCacheAddress(device) || - !base::ContainsKey(device->GetUUIDs(), FidoServiceUUID())) { + !base::Contains(device->GetUUIDs(), FidoServiceUUID())) { return; } - auto authenticator_id = FidoBleDevice::GetId(device->GetAddress()); + auto authenticator_id = FidoBleDevice::GetIdForAddress(device->GetAddress()); auto* authenticator = GetAuthenticator(authenticator_id); if (!authenticator) { VLOG(2) << "Discovered FIDO service on existing BLE device: " @@ -99,9 +99,9 @@ void FidoBleDiscovery::DeviceRemoved(BluetoothAdapter* adapter, BluetoothDevice* device) { - if (base::ContainsKey(device->GetUUIDs(), FidoServiceUUID())) { + if (base::Contains(device->GetUUIDs(), FidoServiceUUID())) { VLOG(2) << "FIDO BLE device removed: " << device->GetAddress(); - auto device_id = FidoBleDevice::GetId(device->GetAddress()); + auto device_id = FidoBleDevice::GetIdForAddress(device->GetAddress()); RemoveDevice(device_id); RemoveDeviceFromPairingTracker(device_id); } @@ -119,8 +119,8 @@ void FidoBleDiscovery::DeviceAddressChanged(BluetoothAdapter* adapter, BluetoothDevice* device, const std::string& old_address) { - auto previous_device_id = FidoBleDevice::GetId(old_address); - auto new_device_id = FidoBleDevice::GetId(device->GetAddress()); + auto previous_device_id = FidoBleDevice::GetIdForAddress(old_address); + auto new_device_id = FidoBleDevice::GetIdForAddress(device->GetAddress()); auto it = authenticators_.find(previous_device_id); if (it == authenticators_.end()) return;
diff --git a/device/fido/ble/fido_ble_discovery_base.cc b/device/fido/ble/fido_ble_discovery_base.cc index caa2f08..0758e0f 100644 --- a/device/fido/ble/fido_ble_discovery_base.cc +++ b/device/fido/ble/fido_ble_discovery_base.cc
@@ -60,8 +60,8 @@ bool FidoBleDiscoveryBase::IsCableDevice(const BluetoothDevice* device) const { const auto& uuid = CableAdvertisementUUID(); - return base::ContainsKey(device->GetServiceData(), uuid) || - base::ContainsKey(device->GetUUIDs(), uuid); + return base::Contains(device->GetServiceData(), uuid) || + base::Contains(device->GetUUIDs(), uuid); } void FidoBleDiscoveryBase::OnGetAdapter(
diff --git a/device/fido/ble/fido_ble_discovery_unittest.cc b/device/fido/ble/fido_ble_discovery_unittest.cc index df2de7f5..0b535b8 100644 --- a/device/fido/ble/fido_ble_discovery_unittest.cc +++ b/device/fido/ble/fido_ble_discovery_unittest.cc
@@ -277,8 +277,9 @@ const auto authenticators = discovery.GetAuthenticatorsForTesting(); ASSERT_THAT(authenticators, ::testing::SizeIs(1u)); - EXPECT_EQ(FidoBleDevice::GetId(BluetoothTestBase::kTestDeviceAddress1), - authenticators[0]->GetId()); + EXPECT_EQ( + FidoBleDevice::GetIdForAddress(BluetoothTestBase::kTestDeviceAddress1), + authenticators[0]->GetId()); } } @@ -347,7 +348,7 @@ EXPECT_CALL(*adapter(), IsPresent()).WillOnce(Return(true)); auto mock_device = CreateMockFidoDevice(); - const auto device_id = FidoBleDevice::GetId(kDeviceAddress); + const auto device_id = FidoBleDevice::GetIdForAddress(kDeviceAddress); discovery()->Start(); scoped_task_environment_.FastForwardUntilNoTasksRemain(); @@ -370,7 +371,7 @@ EXPECT_CALL(*adapter(), IsPresent()).WillOnce(Return(true)); auto mock_device = CreateMockFidoDevice(); - const auto device_id = FidoBleDevice::GetId(kDeviceAddress); + const auto device_id = FidoBleDevice::GetIdForAddress(kDeviceAddress); discovery()->Start(); scoped_task_environment_.FastForwardUntilNoTasksRemain(); @@ -455,10 +456,10 @@ adapter()->NotifyDeviceChanged(mock_device.get()); EXPECT_EQ(authenticator->GetId(), - FidoBleDevice::GetId(kDeviceChangedAddress)); + FidoBleDevice::GetIdForAddress(kDeviceChangedAddress)); EXPECT_EQ(2u, discovery()->GetAuthenticatorsForTesting().size()); EXPECT_TRUE(discovery()->GetAuthenticatorForTesting( - FidoBleDevice::GetId(kDeviceChangedAddress))); + FidoBleDevice::GetIdForAddress(kDeviceChangedAddress))); } } // namespace device
diff --git a/device/fido/ble/fido_ble_pairing_delegate.cc b/device/fido/ble/fido_ble_pairing_delegate.cc index c46a3ac51..15acd2cf 100644 --- a/device/fido/ble/fido_ble_pairing_delegate.cc +++ b/device/fido/ble/fido_ble_pairing_delegate.cc
@@ -17,7 +17,7 @@ void FidoBlePairingDelegate::RequestPinCode(device::BluetoothDevice* device) { auto it = bluetooth_device_pincode_map_.find( - FidoBleDevice::GetId(device->GetAddress())); + FidoBleDevice::GetIdForAddress(device->GetAddress())); if (it == bluetooth_device_pincode_map_.end()) { device->CancelPairing(); return; @@ -28,7 +28,7 @@ void FidoBlePairingDelegate::RequestPasskey(device::BluetoothDevice* device) { auto it = bluetooth_device_pincode_map_.find( - FidoBleDevice::GetId(device->GetAddress())); + FidoBleDevice::GetIdForAddress(device->GetAddress())); if (it == bluetooth_device_pincode_map_.end()) { device->CancelPairing(); return; @@ -97,7 +97,8 @@ auto it = std::find_if( bluetooth_devices.begin(), bluetooth_devices.end(), [&authenticator_id](const auto* device) { - return FidoBleDevice::GetId(device->GetAddress()) == authenticator_id; + return FidoBleDevice::GetIdForAddress(device->GetAddress()) == + authenticator_id; }); if (it == bluetooth_devices.end()) continue;
diff --git a/device/fido/ble/fido_ble_pairing_delegate_unittest.cc b/device/fido/ble/fido_ble_pairing_delegate_unittest.cc index 465893b..dfb67d7 100644 --- a/device/fido/ble/fido_ble_pairing_delegate_unittest.cc +++ b/device/fido/ble/fido_ble_pairing_delegate_unittest.cc
@@ -100,16 +100,16 @@ pairing_delegate()->StoreBlePinCodeForDevice(kTestFidoBleDeviceId, kTestPinCode); EXPECT_TRUE( - base::ContainsKey(pairing_delegate_pincode_map(), kTestFidoBleDeviceId)); - EXPECT_FALSE(base::ContainsKey(pairing_delegate_pincode_map(), - kTestNewBleDeviceAddress)); + base::Contains(pairing_delegate_pincode_map(), kTestFidoBleDeviceId)); + EXPECT_FALSE( + base::Contains(pairing_delegate_pincode_map(), kTestNewBleDeviceAddress)); pairing_delegate()->ChangeStoredDeviceAddress(kTestFidoBleDeviceId, kTestNewBleDeviceAddress); EXPECT_FALSE( - base::ContainsKey(pairing_delegate_pincode_map(), kTestFidoBleDeviceId)); - EXPECT_TRUE(base::ContainsKey(pairing_delegate_pincode_map(), - kTestNewBleDeviceAddress)); + base::Contains(pairing_delegate_pincode_map(), kTestFidoBleDeviceId)); + EXPECT_TRUE( + base::Contains(pairing_delegate_pincode_map(), kTestNewBleDeviceAddress)); } } // namespace device
diff --git a/device/fido/ble_adapter_manager.cc b/device/fido/ble_adapter_manager.cc index c7e84b6..a2b62b61 100644 --- a/device/fido/ble_adapter_manager.cc +++ b/device/fido/ble_adapter_manager.cc
@@ -46,7 +46,7 @@ auto device_it = std::find_if( device_list.begin(), device_list.end(), [&authenticator_id](const auto& bluetooth_device) { - return FidoBleDevice::GetId(bluetooth_device->GetAddress()) == + return FidoBleDevice::GetIdForAddress(bluetooth_device->GetAddress()) == authenticator_id; }); @@ -81,8 +81,8 @@ BluetoothDevice* device, const std::string& old_address) { pairing_delegate_.ChangeStoredDeviceAddress( - FidoBleDevice::GetId(old_address), - FidoBleDevice::GetId(device->GetAddress())); + FidoBleDevice::GetIdForAddress(old_address), + FidoBleDevice::GetIdForAddress(device->GetAddress())); } void BleAdapterManager::Start(scoped_refptr<BluetoothAdapter> adapter) {
diff --git a/device/fido/ble_adapter_manager_unittest.cc b/device/fido/ble_adapter_manager_unittest.cc index 5c4d5b05..d004f68 100644 --- a/device/fido/ble_adapter_manager_unittest.cc +++ b/device/fido/ble_adapter_manager_unittest.cc
@@ -228,7 +228,7 @@ const auto& pin_code_map = device_pincode_map(ble_pairing_delegate(*adapter_manager)); EXPECT_EQ(1u, pin_code_map.size()); - ASSERT_TRUE(base::ContainsKey(pin_code_map, kTestFidoBleAuthenticatorId)); + ASSERT_TRUE(base::Contains(pin_code_map, kTestFidoBleAuthenticatorId)); EXPECT_EQ(kTestPinCode, pin_code_map.find(kTestFidoBleAuthenticatorId)->second); } @@ -275,7 +275,7 @@ const auto& pin_code_map = device_pincode_map(ble_pairing_delegate(*adapter_manager)); EXPECT_EQ(1u, pin_code_map.size()); - ASSERT_TRUE(base::ContainsKey(pin_code_map, kTestFidoBleAuthenticatorId)); + ASSERT_TRUE(base::Contains(pin_code_map, kTestFidoBleAuthenticatorId)); EXPECT_EQ(kTestPinCode, pin_code_map.find(kTestFidoBleAuthenticatorId)->second);
diff --git a/device/fido/cable/fido_cable_discovery.cc b/device/fido/cable/fido_cable_discovery.cc index f76cc0a..4b6e4c12 100644 --- a/device/fido/cable/fido_cable_discovery.cc +++ b/device/fido/cable/fido_cable_discovery.cc
@@ -174,7 +174,7 @@ if (IsCableDevice(device) && GetCableDiscoveryData(device)) { const auto& device_address = device->GetAddress(); FIDO_LOG(DEBUG) << "caBLE device removed: " << device_address; - RemoveDevice(FidoBleDevice::GetId(device_address)); + RemoveDevice(FidoBleDevice::GetIdForAddress(device_address)); } } @@ -306,7 +306,7 @@ base::span<const uint8_t, kSessionPreKeySize> session_pre_key, base::span<const uint8_t, 8> nonce) { // At most one handshake messages should be exchanged for each Cable device. - if (base::ContainsKey(cable_handshake_handlers_, cable_device->GetId())) { + if (base::Contains(cable_handshake_handlers_, cable_device->GetId())) { FIDO_LOG(DEBUG) << "We've already exchanged a handshake with this device."; return; }
diff --git a/device/fido/ctap_response_unittest.cc b/device/fido/ctap_response_unittest.cc index 6d4f149..6d74ee8 100644 --- a/device/fido/ctap_response_unittest.cc +++ b/device/fido/ctap_response_unittest.cc
@@ -580,9 +580,9 @@ ASSERT_TRUE(get_info_response->max_msg_size); EXPECT_EQ(*get_info_response->max_msg_size, 1200u); EXPECT_TRUE( - base::ContainsKey(get_info_response->versions, ProtocolVersion::kCtap2)); + base::Contains(get_info_response->versions, ProtocolVersion::kCtap2)); EXPECT_TRUE( - base::ContainsKey(get_info_response->versions, ProtocolVersion::kU2f)); + base::Contains(get_info_response->versions, ProtocolVersion::kU2f)); EXPECT_TRUE(get_info_response->options.is_platform_device); EXPECT_TRUE(get_info_response->options.supports_resident_key); EXPECT_TRUE(get_info_response->options.supports_user_presence);
diff --git a/device/fido/device_response_converter.cc b/device/fido/device_response_converter.cc index 3149c1a..6611d4d 100644 --- a/device/fido/device_response_converter.cc +++ b/device/fido/device_response_converter.cc
@@ -47,7 +47,7 @@ return CtapDeviceResponseCode::kCtap2ErrInvalidCBOR; auto code = static_cast<CtapDeviceResponseCode>(buffer[0]); - return base::ContainsValue(GetCtapResponseCodeList(), code) + return base::Contains(GetCtapResponseCodeList(), code) ? code : CtapDeviceResponseCode::kCtap2ErrInvalidCBOR; }
diff --git a/device/fido/fido_authenticator.cc b/device/fido/fido_authenticator.cc index 54ef5ee..75635759 100644 --- a/device/fido/fido_authenticator.cc +++ b/device/fido/fido_authenticator.cc
@@ -83,11 +83,20 @@ NOTREACHED(); } -void FidoAuthenticator::GetModality(GetBioEnrollmentInfoCallback) { +void FidoAuthenticator::GetModality(BioEnrollmentCallback) { NOTREACHED(); } -void FidoAuthenticator::GetSensorInfo(GetBioEnrollmentInfoCallback) { +void FidoAuthenticator::GetSensorInfo(BioEnrollmentCallback) { + NOTREACHED(); +} + +void FidoAuthenticator::BioEnrollFingerprint(pin::TokenResponse, + BioEnrollmentCallback) { + NOTREACHED(); +} + +void FidoAuthenticator::BioEnrollCancel(BioEnrollmentCallback) { NOTREACHED(); }
diff --git a/device/fido/fido_authenticator.h b/device/fido/fido_authenticator.h index 4c96d0f..c8a5b4a 100644 --- a/device/fido/fido_authenticator.h +++ b/device/fido/fido_authenticator.h
@@ -21,6 +21,7 @@ #include "device/fido/credential_management.h" #include "device/fido/fido_request_handler_base.h" #include "device/fido/fido_transport_protocol.h" +#include "device/fido/pin.h" namespace device { @@ -69,7 +70,7 @@ using DeleteCredentialCallback = base::OnceCallback<void(CtapDeviceResponseCode, base::Optional<DeleteCredentialResponse>)>; - using GetBioEnrollmentInfoCallback = + using BioEnrollmentCallback = base::OnceCallback<void(CtapDeviceResponseCode, base::Optional<BioEnrollmentResponse>)>; @@ -168,8 +169,10 @@ DeleteCredentialCallback callback); // bio enrollment - virtual void GetModality(GetBioEnrollmentInfoCallback callback); - virtual void GetSensorInfo(GetBioEnrollmentInfoCallback callback); + virtual void GetModality(BioEnrollmentCallback callback); + virtual void GetSensorInfo(BioEnrollmentCallback callback); + virtual void BioEnrollFingerprint(pin::TokenResponse, BioEnrollmentCallback); + virtual void BioEnrollCancel(BioEnrollmentCallback); // Reset triggers a reset operation on the authenticator. This erases all // stored resident keys and any configured PIN.
diff --git a/device/fido/fido_constants.h b/device/fido/fido_constants.h index adb9d04..3a932d8 100644 --- a/device/fido/fido_constants.h +++ b/device/fido/fido_constants.h
@@ -41,6 +41,7 @@ // kStorageFull indicates that a resident credential could not be created // because the authenticator has insufficient storage. kStorageFull, + kAuthenticatorMissingBioEnrollment, }; enum class ProtocolVersion {
diff --git a/device/fido/fido_device.cc b/device/fido/fido_device.cc index e4c0bc6..6ce6a5fa 100644 --- a/device/fido/fido_device.cc +++ b/device/fido/fido_device.cc
@@ -59,8 +59,8 @@ state_ = FidoDevice::State::kReady; base::Optional<AuthenticatorGetInfoResponse> get_info_response = response ? ReadCTAPGetInfoResponse(*response) : base::nullopt; - if (!get_info_response || !base::ContainsKey(get_info_response->versions, - ProtocolVersion::kCtap2)) { + if (!get_info_response || + !base::Contains(get_info_response->versions, ProtocolVersion::kCtap2)) { supported_protocol_ = ProtocolVersion::kU2f; FIDO_LOG(DEBUG) << "The device only supports the U2F protocol."; } else {
diff --git a/device/fido/fido_device_authenticator.cc b/device/fido/fido_device_authenticator.cc index f81c415c..3c25dc1 100644 --- a/device/fido/fido_device_authenticator.cc +++ b/device/fido/fido_device_authenticator.cc
@@ -488,8 +488,7 @@ operation_->Start(); } -void FidoDeviceAuthenticator::GetModality( - GetBioEnrollmentInfoCallback callback) { +void FidoDeviceAuthenticator::GetModality(BioEnrollmentCallback callback) { DCHECK( Options()->bio_enrollment_availability_preview != AuthenticatorSupportedOptions::BioEnrollmentAvailability::kNotSupported); @@ -498,12 +497,11 @@ Ctap2DeviceOperation<BioEnrollmentRequest, BioEnrollmentResponse>>( device_.get(), BioEnrollmentRequest::ForGetModality(), std::move(callback), base::BindOnce(&BioEnrollmentResponse::Parse), - nullptr); + /*string_fixup_predicate=*/nullptr); operation_->Start(); } -void FidoDeviceAuthenticator::GetSensorInfo( - GetBioEnrollmentInfoCallback callback) { +void FidoDeviceAuthenticator::GetSensorInfo(BioEnrollmentCallback callback) { DCHECK( Options()->bio_enrollment_availability_preview != AuthenticatorSupportedOptions::BioEnrollmentAvailability::kNotSupported); @@ -512,7 +510,64 @@ Ctap2DeviceOperation<BioEnrollmentRequest, BioEnrollmentResponse>>( device_.get(), BioEnrollmentRequest::ForGetSensorInfo(), std::move(callback), base::BindOnce(&BioEnrollmentResponse::Parse), - nullptr); + /*string_fixup_predicate=*/nullptr); + operation_->Start(); +} + +void FidoDeviceAuthenticator::BioEnrollFingerprint( + pin::TokenResponse token, + BioEnrollmentCallback callback) { + DCHECK( + Options()->bio_enrollment_availability_preview != + AuthenticatorSupportedOptions::BioEnrollmentAvailability::kNotSupported); + + operation_ = std::make_unique< + Ctap2DeviceOperation<BioEnrollmentRequest, BioEnrollmentResponse>>( + device_.get(), BioEnrollmentRequest::ForEnrollBegin(token), + base::BindOnce(&FidoDeviceAuthenticator::OnBioEnroll, + weak_factory_.GetWeakPtr(), std::move(token), + std::move(callback)), + base::BindOnce(&BioEnrollmentResponse::Parse), + /*string_fixup_predicate=*/nullptr); + operation_->Start(); +} + +void FidoDeviceAuthenticator::OnBioEnroll( + pin::TokenResponse token, + BioEnrollmentCallback callback, + CtapDeviceResponseCode code, + base::Optional<BioEnrollmentResponse> bio) { + static base::Optional<std::vector<uint8_t>> template_id_; + if (code != CtapDeviceResponseCode::kSuccess || bio->remaining_samples == 0) { + std::move(callback).Run(code, std::move(bio)); + return; + } + if (bio->template_id) { + template_id_ = std::move(bio->template_id); + } + + operation_ = std::make_unique< + Ctap2DeviceOperation<BioEnrollmentRequest, BioEnrollmentResponse>>( + device_.get(), + BioEnrollmentRequest::ForEnrollNextSample(token, *template_id_), + base::BindOnce(&FidoDeviceAuthenticator::OnBioEnroll, + weak_factory_.GetWeakPtr(), std::move(token), + std::move(callback)), + base::BindOnce(&BioEnrollmentResponse::Parse), + /*string_fixup_predicate=*/nullptr); + operation_->Start(); +} + +void FidoDeviceAuthenticator::BioEnrollCancel(BioEnrollmentCallback callback) { + DCHECK( + Options()->bio_enrollment_availability_preview != + AuthenticatorSupportedOptions::BioEnrollmentAvailability::kNotSupported); + + operation_ = std::make_unique< + Ctap2DeviceOperation<BioEnrollmentRequest, BioEnrollmentResponse>>( + device_.get(), BioEnrollmentRequest::ForCancel(), std::move(callback), + base::BindOnce(&BioEnrollmentResponse::Parse), + /*string_fixup_predicate=*/nullptr); operation_->Start(); }
diff --git a/device/fido/fido_device_authenticator.h b/device/fido/fido_device_authenticator.h index 9232016..61af170 100644 --- a/device/fido/fido_device_authenticator.h +++ b/device/fido/fido_device_authenticator.h
@@ -79,8 +79,10 @@ base::span<const uint8_t> credential_id, DeleteCredentialCallback callback) override; - void GetModality(GetBioEnrollmentInfoCallback callback) override; - void GetSensorInfo(GetBioEnrollmentInfoCallback callback) override; + void GetModality(BioEnrollmentCallback callback) override; + void GetSensorInfo(BioEnrollmentCallback callback) override; + void BioEnrollFingerprint(pin::TokenResponse, BioEnrollmentCallback) override; + void BioEnrollCancel(BioEnrollmentCallback) override; void Reset(ResetCallback callback) override; void Cancel() override; @@ -119,6 +121,11 @@ CtapDeviceResponseCode status, base::Optional<EnumerateCredentialsResponse> response); + void OnBioEnroll(pin::TokenResponse, + BioEnrollmentCallback callback, + CtapDeviceResponseCode, + base::Optional<BioEnrollmentResponse>); + const std::unique_ptr<FidoDevice> device_; base::Optional<AuthenticatorSupportedOptions> options_; std::unique_ptr<FidoTask> task_;
diff --git a/device/fido/fido_request_handler_base.cc b/device/fido/fido_request_handler_base.cc index 5e9efc69ca..3b6eb76c 100644 --- a/device/fido/fido_request_handler_base.cc +++ b/device/fido/fido_request_handler_base.cc
@@ -117,11 +117,10 @@ discoveries_.push_back(std::move(discovery)); } - if (base::ContainsKey( - available_transports, - FidoTransportProtocol::kCloudAssistedBluetoothLowEnergy) || - base::ContainsKey(available_transports, - FidoTransportProtocol::kBluetoothLowEnergy)) { + if (base::Contains(available_transports, + FidoTransportProtocol::kCloudAssistedBluetoothLowEnergy) || + base::Contains(available_transports, + FidoTransportProtocol::kBluetoothLowEnergy)) { ++transport_info_callback_count; base::SequencedTaskRunnerHandle::Get()->PostTask( FROM_HERE, @@ -170,9 +169,8 @@ // device communication block (only GetAssertionRequestHandler uses // caBLE). Otherwise, do not instantiate any other transports. base::flat_set<FidoTransportProtocol> other_transports = {}; - if (base::ContainsKey( - available_transports, - FidoTransportProtocol::kCloudAssistedBluetoothLowEnergy)) + if (base::Contains(available_transports, + FidoTransportProtocol::kCloudAssistedBluetoothLowEnergy)) other_transports = { FidoTransportProtocol::kCloudAssistedBluetoothLowEnergy}; @@ -266,7 +264,7 @@ void FidoRequestHandlerBase::AuthenticatorAdded( FidoDiscoveryBase* discovery, FidoAuthenticator* authenticator) { - DCHECK(!base::ContainsKey(active_authenticators(), authenticator->GetId())); + DCHECK(!base::Contains(active_authenticators(), authenticator->GetId())); AddAuthenticator(authenticator); } @@ -318,7 +316,7 @@ void FidoRequestHandlerBase::AddAuthenticator( FidoAuthenticator* authenticator) { DCHECK(authenticator && - !base::ContainsKey(active_authenticators(), authenticator->GetId())); + !base::Contains(active_authenticators(), authenticator->GetId())); active_authenticators_.emplace(authenticator->GetId(), authenticator); // If |observer_| exists, dispatching request to |authenticator| is @@ -361,8 +359,8 @@ base::Optional<PlatformAuthenticatorInfo> platform_authenticator_info) { DCHECK(!platform_authenticator_); if (platform_authenticator_info && - base::ContainsKey(transport_availability_info_.available_transports, - FidoTransportProtocol::kInternal)) { + base::Contains(transport_availability_info_.available_transports, + FidoTransportProtocol::kInternal)) { DCHECK(platform_authenticator_info->authenticator); DCHECK( platform_authenticator_info->authenticator->AuthenticatorTransport() && @@ -384,7 +382,7 @@ bool FidoRequestHandlerBase::HasAuthenticator( const std::string& authenticator_id) const { - return base::ContainsKey(active_authenticators_, authenticator_id); + return base::Contains(active_authenticators_, authenticator_id); } void FidoRequestHandlerBase::NotifyObserverTransportAvailability() {
diff --git a/device/fido/get_assertion_handler_unittest.cc b/device/fido/get_assertion_handler_unittest.cc index d92722c..e9ab17c 100644 --- a/device/fido/get_assertion_handler_unittest.cc +++ b/device/fido/get_assertion_handler_unittest.cc
@@ -111,27 +111,26 @@ GetAssertionRequestHandler* request_handler, base::flat_set<FidoTransportProtocol> transports) { using Transport = FidoTransportProtocol; - if (base::ContainsKey(transports, Transport::kUsbHumanInterfaceDevice)) + if (base::Contains(transports, Transport::kUsbHumanInterfaceDevice)) discovery()->WaitForCallToStartAndSimulateSuccess(); - if (base::ContainsKey(transports, Transport::kBluetoothLowEnergy)) + if (base::Contains(transports, Transport::kBluetoothLowEnergy)) ble_discovery()->WaitForCallToStartAndSimulateSuccess(); - if (base::ContainsKey(transports, - Transport::kCloudAssistedBluetoothLowEnergy)) + if (base::Contains(transports, Transport::kCloudAssistedBluetoothLowEnergy)) cable_discovery()->WaitForCallToStartAndSimulateSuccess(); - if (base::ContainsKey(transports, Transport::kNearFieldCommunication)) + if (base::Contains(transports, Transport::kNearFieldCommunication)) nfc_discovery()->WaitForCallToStartAndSimulateSuccess(); scoped_task_environment_.FastForwardUntilNoTasksRemain(); EXPECT_FALSE(get_assertion_callback().was_called()); - if (!base::ContainsKey(transports, Transport::kUsbHumanInterfaceDevice)) + if (!base::Contains(transports, Transport::kUsbHumanInterfaceDevice)) EXPECT_FALSE(discovery()->is_start_requested()); - if (!base::ContainsKey(transports, Transport::kBluetoothLowEnergy)) + if (!base::Contains(transports, Transport::kBluetoothLowEnergy)) EXPECT_FALSE(ble_discovery()->is_start_requested()); - if (!base::ContainsKey(transports, - Transport::kCloudAssistedBluetoothLowEnergy)) + if (!base::Contains(transports, + Transport::kCloudAssistedBluetoothLowEnergy)) EXPECT_FALSE(cable_discovery()->is_start_requested()); - if (!base::ContainsKey(transports, Transport::kNearFieldCommunication)) + if (!base::Contains(transports, Transport::kNearFieldCommunication)) EXPECT_FALSE(nfc_discovery()->is_start_requested()); // Even with FidoTransportProtocol::kInternal allowed, unless the platform
diff --git a/device/fido/get_assertion_request_handler.cc b/device/fido/get_assertion_request_handler.cc index 6add793..bf59fd9 100644 --- a/device/fido/get_assertion_request_handler.cc +++ b/device/fido/get_assertion_request_handler.cc
@@ -90,8 +90,8 @@ return credential.id() == response.raw_credential_id() && (!opt_transport_used || - base::ContainsKey(credential.transports(), - *opt_transport_used)); + base::Contains(credential.transports(), + *opt_transport_used)); }))) { return false; } @@ -212,9 +212,8 @@ transport_availability_info().has_empty_allow_list = request_.allow_list.empty(); - if (base::ContainsKey( - transport_availability_info().available_transports, - FidoTransportProtocol::kCloudAssistedBluetoothLowEnergy)) { + if (base::Contains(transport_availability_info().available_transports, + FidoTransportProtocol::kCloudAssistedBluetoothLowEnergy)) { DCHECK(request_.cable_extension); auto discovery = fido_discovery_factory_->CreateCable(*request_.cable_extension);
diff --git a/device/fido/get_assertion_task.cc b/device/fido/get_assertion_task.cc index a60447b8f..c94ec89 100644 --- a/device/fido/get_assertion_task.cc +++ b/device/fido/get_assertion_task.cc
@@ -22,7 +22,7 @@ const CtapGetAssertionRequest& request) { bool ctap2_device_supports_u2f = device.device_info() && - base::ContainsKey(device.device_info()->versions, ProtocolVersion::kU2f); + base::Contains(device.device_info()->versions, ProtocolVersion::kU2f); return request.alternative_application_parameter && ctap2_device_supports_u2f && !request.allow_list.empty(); }
diff --git a/device/fido/hid/fido_hid_device.cc b/device/fido/hid/fido_hid_device.cc index edd84036..61c1093 100644 --- a/device/fido/hid/fido_hid_device.cc +++ b/device/fido/hid/fido_hid_device.cc
@@ -469,6 +469,7 @@ } void FidoHidDevice::OnTimeout() { + FIDO_LOG(ERROR) << "FIDO HID device timeout for " << GetId(); Transition(State::kDeviceError); } @@ -512,8 +513,7 @@ "20a0:4287", // Nitrokey FIDO U2F }); - if (base::ContainsKey(kForceU2fCompatibilitySet, - VidPidToString(device_info_))) { + if (base::Contains(kForceU2fCompatibilitySet, VidPidToString(device_info_))) { supported_protocol_ = ProtocolVersion::kU2f; DCHECK(SupportedProtocolIsInitialized()); std::move(done).Run();
diff --git a/device/fido/hid/fido_hid_device.h b/device/fido/hid/fido_hid_device.h index 89db992..e3e35994 100644 --- a/device/fido/hid/fido_hid_device.h +++ b/device/fido/hid/fido_hid_device.h
@@ -31,22 +31,18 @@ device::mojom::HidManager* hid_manager); ~FidoHidDevice() final; - // Send a command to this device. - CancelToken DeviceTransact(std::vector<uint8_t> command, - DeviceCallback callback) final; + // Returns FidoDevice::GetId() for a given HidDeviceInfo. + static std::string GetIdForDevice( + const device::mojom::HidDeviceInfo& device_info); // FidoDevice: - // Send command to cancel an outstanding request. + CancelToken DeviceTransact(std::vector<uint8_t> command, + DeviceCallback callback) final; void Cancel(CancelToken token) final; - // Get a string identifier to compare to other devices. std::string GetId() const final; FidoTransportProtocol DeviceTransport() const final; void DiscoverSupportedProtocolAndDeviceInfo(base::OnceClosure done) override; - // Get a string identifier for a given device info. - static std::string GetIdForDevice( - const device::mojom::HidDeviceInfo& device_info); - private: FRIEND_TEST_ALL_PREFIXES(FidoHidDeviceTest, TestConnectionFailure); FRIEND_TEST_ALL_PREFIXES(FidoHidDeviceTest, TestDeviceError);
diff --git a/device/fido/hid/fido_hid_packet.cc b/device/fido/hid/fido_hid_packet.cc index 58994e3..ddf9e4e 100644 --- a/device/fido/hid/fido_hid_packet.cc +++ b/device/fido/hid/fido_hid_packet.cc
@@ -34,7 +34,7 @@ channel_id |= serialized[index++] & 0xff; auto command = static_cast<FidoHidDeviceCommand>(serialized[index++] & 0x7f); - if (!base::ContainsValue(GetFidoHidDeviceCommandList(), command)) + if (!base::Contains(GetFidoHidDeviceCommandList(), command)) return nullptr; uint16_t payload_size = serialized[index++] << 8;
diff --git a/device/fido/mac/get_assertion_operation.mm b/device/fido/mac/get_assertion_operation.mm index edb7a5b..7c064c2 100644 --- a/device/fido/mac/get_assertion_operation.mm +++ b/device/fido/mac/get_assertion_operation.mm
@@ -160,8 +160,8 @@ for (const auto& credential_descriptor : request.allow_list) { if (credential_descriptor.credential_type() == CredentialType::kPublicKey && (credential_descriptor.transports().empty() || - base::ContainsKey(credential_descriptor.transports(), - FidoTransportProtocol::kInternal))) { + base::Contains(credential_descriptor.transports(), + FidoTransportProtocol::kInternal))) { allowed_credential_ids.insert(credential_descriptor.id()); } }
diff --git a/device/fido/mac/keychain.mm b/device/fido/mac/keychain.mm index 663ce5c..b56bc90 100644 --- a/device/fido/mac/keychain.mm +++ b/device/fido/mac/keychain.mm
@@ -140,7 +140,7 @@ CFDataGetBytePtr(application_label) + CFDataGetLength(application_label)); if (!allowed_credential_ids.empty() && - !base::ContainsKey(allowed_credential_ids, credential_id)) { + !base::Contains(allowed_credential_ids, credential_id)) { continue; } base::ScopedCFTypeRef<SecKeyRef> private_key(key,
diff --git a/device/fido/make_credential_handler_unittest.cc b/device/fido/make_credential_handler_unittest.cc index 70e8233c..54d7c58f 100644 --- a/device/fido/make_credential_handler_unittest.cc +++ b/device/fido/make_credential_handler_unittest.cc
@@ -95,21 +95,21 @@ MakeCredentialRequestHandler* request_handler, base::flat_set<FidoTransportProtocol> transports) { using Transport = FidoTransportProtocol; - if (base::ContainsKey(transports, Transport::kUsbHumanInterfaceDevice)) + if (base::Contains(transports, Transport::kUsbHumanInterfaceDevice)) discovery()->WaitForCallToStartAndSimulateSuccess(); - if (base::ContainsKey(transports, Transport::kBluetoothLowEnergy)) + if (base::Contains(transports, Transport::kBluetoothLowEnergy)) ble_discovery()->WaitForCallToStartAndSimulateSuccess(); - if (base::ContainsKey(transports, Transport::kNearFieldCommunication)) + if (base::Contains(transports, Transport::kNearFieldCommunication)) nfc_discovery()->WaitForCallToStartAndSimulateSuccess(); scoped_task_environment_.FastForwardUntilNoTasksRemain(); EXPECT_FALSE(callback().was_called()); - if (!base::ContainsKey(transports, Transport::kUsbHumanInterfaceDevice)) + if (!base::Contains(transports, Transport::kUsbHumanInterfaceDevice)) EXPECT_FALSE(discovery()->is_start_requested()); - if (!base::ContainsKey(transports, Transport::kBluetoothLowEnergy)) + if (!base::Contains(transports, Transport::kBluetoothLowEnergy)) EXPECT_FALSE(ble_discovery()->is_start_requested()); - if (!base::ContainsKey(transports, Transport::kNearFieldCommunication)) + if (!base::Contains(transports, Transport::kNearFieldCommunication)) EXPECT_FALSE(nfc_discovery()->is_start_requested()); EXPECT_THAT(
diff --git a/device/fido/make_credential_task.cc b/device/fido/make_credential_task.cc index ee15ae5..ac5559ea 100644 --- a/device/fido/make_credential_task.cc +++ b/device/fido/make_credential_task.cc
@@ -36,7 +36,7 @@ device->device_info()->options.client_pin_availability == AuthenticatorSupportedOptions::ClientPinAvailability::kSupportedAndPinSet; bool supports_u2f = - base::ContainsKey(device->device_info()->versions, ProtocolVersion::kU2f); + base::Contains(device->device_info()->versions, ProtocolVersion::kU2f); return client_pin_set && supports_u2f; }
diff --git a/device/fido/pin.h b/device/fido/pin.h index e5e849a0..c4aec16 100644 --- a/device/fido/pin.h +++ b/device/fido/pin.h
@@ -166,7 +166,7 @@ std::vector<uint8_t> PinAuth( base::span<const uint8_t> client_data_hash) const; - const std::vector<uint8_t>& token() { return token_; } + const std::vector<uint8_t>& token() const { return token_; } private: TokenResponse();
diff --git a/device/fido/virtual_ctap2_device.cc b/device/fido/virtual_ctap2_device.cc index ef37d80..13d720231 100644 --- a/device/fido/virtual_ctap2_device.cc +++ b/device/fido/virtual_ctap2_device.cc
@@ -1301,7 +1301,7 @@ } const std::vector<uint8_t>& credential_id = credential_id_it->second.GetBytestring(); - if (!base::ContainsKey(mutable_state()->registrations, credential_id)) { + if (!base::Contains(mutable_state()->registrations, credential_id)) { return CtapDeviceResponseCode::kCtap2ErrNoCredentials; } mutable_state()->registrations.erase(credential_id); @@ -1349,7 +1349,9 @@ return CtapDeviceResponseCode::kSuccess; } - // Check for the get-sensor-info command. + // Check for subcommands. + using SubCmd = BioEnrollmentSubCommand; + it = request_map.find( cbor::Value(static_cast<int>(BioEnrollmentRequestKey::kSubCommand))); if (it == request_map.end()) { @@ -1362,12 +1364,11 @@ return CtapDeviceResponseCode::kCtap2ErrCBORUnexpectedType; } - switch (static_cast<BioEnrollmentSubCommand>(it->second.GetUnsigned())) { - case BioEnrollmentSubCommand::kGetFingerprintSensorInfo: + switch (it->second.GetUnsigned()) { + case static_cast<int>(SubCmd::kGetFingerprintSensorInfo): response_map.emplace( static_cast<int>(BioEnrollmentResponseKey::kModality), static_cast<int>(BioEnrollmentModality::kFingerprint)); - response_map.emplace( static_cast<int>(BioEnrollmentResponseKey::kFingerprintKind), static_cast<int>(BioEnrollmentFingerprintKind::kTouch)); @@ -1375,16 +1376,33 @@ static_cast<int>( BioEnrollmentResponseKey::kMaxCaptureSamplesRequiredForEnroll), 7); - - *response = - cbor::Writer::Write(cbor::Value(std::move(response_map))).value(); + break; + case static_cast<int>(SubCmd::kEnrollBegin): + response_map.emplace( + static_cast<int>(BioEnrollmentResponseKey::kTemplateId), + cbor::Value(std::vector<uint8_t>{0, 0, 0, 1})); + response_map.emplace( + static_cast<int>(BioEnrollmentResponseKey::kLastEnrollSampleStatus), + static_cast<int>(BioEnrollmentSampleStatus::kGood)); + response_map.emplace( + static_cast<int>(BioEnrollmentResponseKey::kRemainingSamples), 1); + break; + case static_cast<int>(SubCmd::kEnrollCaptureNextSample): + response_map.emplace( + static_cast<int>(BioEnrollmentResponseKey::kLastEnrollSampleStatus), + static_cast<int>(BioEnrollmentSampleStatus::kGood)); + response_map.emplace( + static_cast<int>(BioEnrollmentResponseKey::kRemainingSamples), 0); + break; + case static_cast<int>(SubCmd::kCancelCurrentEnrollment): return CtapDeviceResponseCode::kSuccess; - default: // Handle all other commands as if they were unsupported (will change // when support is added). return CtapDeviceResponseCode::kCtap2ErrUnsupportedOption; } + *response = cbor::Writer::Write(cbor::Value(std::move(response_map))).value(); + return CtapDeviceResponseCode::kSuccess; } void VirtualCtap2Device::InitPendingRPs() { @@ -1397,7 +1415,7 @@ DCHECK(!registration.second.is_u2f); DCHECK(registration.second.user); DCHECK(registration.second.rp); - if (!base::ContainsKey(rp_ids, registration.second.rp->id)) { + if (!base::Contains(rp_ids, registration.second.rp->id)) { mutable_state()->pending_rps.push_back(*registration.second.rp); } }
diff --git a/device/fido/win/type_conversions.cc b/device/fido/win/type_conversions.cc index f1d01d3..62990b2 100644 --- a/device/fido/win/type_conversions.cc +++ b/device/fido/win/type_conversions.cc
@@ -222,7 +222,7 @@ {STRING16_LITERAL("UnknownError"), CtapDeviceResponseCode::kCtap2ErrOther}, }); - return base::ContainsKey(kResponseCodeMap, error_name) + return base::Contains(kResponseCodeMap, error_name) ? kResponseCodeMap[error_name] : CtapDeviceResponseCode::kCtap2ErrOther; }
diff --git a/device/gamepad/BUILD.gn b/device/gamepad/BUILD.gn index 471d675..989b3566a 100644 --- a/device/gamepad/BUILD.gn +++ b/device/gamepad/BUILD.gn
@@ -164,6 +164,7 @@ public_deps = [ ":gamepad", "//base", + "//base/test:test_support", "//device/gamepad/public/cpp:shared_with_blink", "//third_party/blink/public:blink_headers", ]
diff --git a/device/gamepad/gamepad_test_helpers.h b/device/gamepad/gamepad_test_helpers.h index 87857c2..05cf09f 100644 --- a/device/gamepad/gamepad_test_helpers.h +++ b/device/gamepad/gamepad_test_helpers.h
@@ -8,9 +8,9 @@ #include <memory> #include "base/macros.h" -#include "base/message_loop/message_loop.h" #include "base/synchronization/lock.h" #include "base/synchronization/waitable_event.h" +#include "base/test/scoped_task_environment.h" #include "device/gamepad/gamepad_data_fetcher.h" #include "device/gamepad/gamepad_service.h" #include "device/gamepad/gamepad_shared_buffer.h" @@ -58,11 +58,9 @@ GamepadTestHelper(); virtual ~GamepadTestHelper(); - base::MessageLoop& message_loop() { return message_loop_; } - private: // This must be constructed before the system monitor. - base::MessageLoop message_loop_; + base::test::ScopedTaskEnvironment scoped_task_environment_; DISALLOW_COPY_AND_ASSIGN(GamepadTestHelper); };
diff --git a/device/gamepad/public/cpp/gamepad.cc b/device/gamepad/public/cpp/gamepad.cc index 31c5c6e..5c79a5c 100644 --- a/device/gamepad/public/cpp/gamepad.cc +++ b/device/gamepad/public/cpp/gamepad.cc
@@ -4,6 +4,8 @@ #include "device/gamepad/public/cpp/gamepad.h" +#include <string.h> + namespace device { const float GamepadButton::kDefaultButtonPressedThreshold;
diff --git a/device/vr/openvr/openvr_render_loop.cc b/device/vr/openvr/openvr_render_loop.cc index e342bd1..eff315d 100644 --- a/device/vr/openvr/openvr_render_loop.cc +++ b/device/vr/openvr/openvr_render_loop.cc
@@ -58,6 +58,13 @@ } // namespace +void OpenVRRenderLoop::InputActiveState::MarkAsInactive() { + active = false; + primary_input_pressed = false; + device_class = vr::TrackedDeviceClass_Invalid; + controller_role = vr::TrackedControllerRole_Invalid; +} + OpenVRRenderLoop::OpenVRRenderLoop() : XRCompositorCommon() {} OpenVRRenderLoop::~OpenVRRenderLoop() { @@ -233,12 +240,8 @@ if (!pose.bDeviceIsConnected) { // If this was an active controller on the last frame report it as // disconnected. - if (input_active_state.active) { - input_active_state.active = false; - input_active_state.primary_input_pressed = false; - input_active_state.device_class = vr::TrackedDeviceClass_Invalid; - input_active_state.controller_role = vr::TrackedControllerRole_Invalid; - } + if (input_active_state.active) + input_active_state.MarkAsInactive(); continue; } @@ -262,8 +265,10 @@ vr::VRControllerState_t controller_state; bool have_state = openvr_->GetSystem()->GetControllerState( i, &controller_state, sizeof(vr::VRControllerState_t)); - if (!have_state) + if (!have_state) { + input_active_state.MarkAsInactive(); continue; + } bool pressed = controller_state.ulButtonPressed & vr::ButtonMaskFromId(vr::k_EButton_SteamVR_Trigger);
diff --git a/device/vr/openvr/openvr_render_loop.h b/device/vr/openvr/openvr_render_loop.h index a4cc3f9..bc020fa 100644 --- a/device/vr/openvr/openvr_render_loop.h +++ b/device/vr/openvr/openvr_render_loop.h
@@ -54,6 +54,8 @@ bool primary_input_pressed; vr::ETrackedDeviceClass device_class; vr::ETrackedControllerRole controller_role; + + void MarkAsInactive(); }; InputActiveState input_active_states_[vr::k_unMaxTrackedDeviceCount];
diff --git a/device/vr/openvr/test/fake_openvr_impl_api.cc b/device/vr/openvr/test/fake_openvr_impl_api.cc index 214f6e69..cb0cfc0 100644 --- a/device/vr/openvr/test/fake_openvr_impl_api.cc +++ b/device/vr/openvr/test/fake_openvr_impl_api.cc
@@ -570,10 +570,24 @@ unsigned int count2) { TrackedDevicePose_t pose = g_test_helper.GetPose(true /* presenting pose */); for (unsigned int i = 0; i < count1; ++i) { + if (i != vr::k_unTrackedDeviceIndex_Hmd) { + VRControllerState_t controller_state; + pose.bDeviceIsConnected = + g_test_helper.GetControllerState(i, &controller_state); + } else { + pose.bDeviceIsConnected = true; + } poses1[i] = pose; } for (unsigned int i = 0; i < count2; ++i) { + if (i != vr::k_unTrackedDeviceIndex_Hmd) { + VRControllerState_t controller_state; + pose.bDeviceIsConnected = + g_test_helper.GetControllerState(i, &controller_state); + } else { + pose.bDeviceIsConnected = true; + } poses2[i] = pose; }
diff --git a/device/vr/vr_device_base_unittest.cc b/device/vr/vr_device_base_unittest.cc index 5b1f696..ba7e549b 100644 --- a/device/vr/vr_device_base_unittest.cc +++ b/device/vr/vr_device_base_unittest.cc
@@ -8,8 +8,8 @@ #include "base/bind.h" #include "base/bind_helpers.h" -#include "base/message_loop/message_loop.h" #include "base/run_loop.h" +#include "base/test/scoped_task_environment.h" #include "device/vr/public/mojom/vr_service.mojom.h" #include "device/vr/test/fake_vr_device.h" #include "device/vr/test/fake_vr_service_client.h" @@ -116,7 +116,7 @@ FakeVRServiceClient* client() { return client_.get(); } std::unique_ptr<FakeVRServiceClient> client_; - base::MessageLoop message_loop_; + base::test::ScopedTaskEnvironment scoped_task_environment_; DISALLOW_COPY_AND_ASSIGN(VRDeviceTest); };
diff --git a/device/vr/vr_display_impl_unittest.cc b/device/vr/vr_display_impl_unittest.cc index 740366d..e03cc1b3 100644 --- a/device/vr/vr_display_impl_unittest.cc +++ b/device/vr/vr_display_impl_unittest.cc
@@ -8,8 +8,8 @@ #include "base/bind.h" #include "base/memory/ptr_util.h" -#include "base/message_loop/message_loop.h" #include "base/run_loop.h" +#include "base/test/scoped_task_environment.h" #include "device/vr/public/mojom/vr_service.mojom.h" #include "device/vr/test/fake_vr_device.h" #include "device/vr/test/fake_vr_service_client.h" @@ -56,7 +56,7 @@ VRDeviceBase* device() { return device_.get(); } FakeVRServiceClient* client() { return client_.get(); } - base::MessageLoop message_loop_; + base::test::ScopedTaskEnvironment scoped_task_environment_; std::unique_ptr<FakeVRDevice> device_; std::unique_ptr<FakeVRServiceClient> client_;
diff --git a/docs/infra/cq_builders.md b/docs/infra/cq_builders.md index a738300..5b43151 100644 --- a/docs/infra/cq_builders.md +++ b/docs/infra/cq_builders.md
@@ -178,6 +178,16 @@ * [`//third_party/blink/web_tests/webgpu/.+`](https://cs.chromium.org/chromium/src/third_party/blink/web_tests/webgpu/) * [`//third_party/dawn/.+`](https://cs.chromium.org/chromium/src/third_party/dawn/) +* [fuchsia-arm64-cast](https://ci.chromium.org/p/chromium/builders/luci.chromium.try/fuchsia-arm64-cast) ([`commit-queue.cfg` entry](https://cs.chromium.org/search/?q=package:%5Echromium$+file:commit-queue.cfg+chromium/try/fuchsia-arm64-cast)) ([matching builders](https://cs.chromium.org/search/?q=file:trybots.py+fuchsia-arm64-cast)) + + Path regular expressions: + * [`//chromecast/.+`](https://cs.chromium.org/chromium/src/chromecast/) + +* [fuchsia-x64-cast](https://ci.chromium.org/p/chromium/builders/luci.chromium.try/fuchsia-x64-cast) ([`commit-queue.cfg` entry](https://cs.chromium.org/search/?q=package:%5Echromium$+file:commit-queue.cfg+chromium/try/fuchsia-x64-cast)) ([matching builders](https://cs.chromium.org/search/?q=file:trybots.py+fuchsia-x64-cast)) + + Path regular expressions: + * [`//chromecast/.+`](https://cs.chromium.org/chromium/src/chromecast/) + * [ios-simulator-cronet](https://ci.chromium.org/p/chromium/builders/luci.chromium.try/ios-simulator-cronet) ([`commit-queue.cfg` entry](https://cs.chromium.org/search/?q=package:%5Echromium$+file:commit-queue.cfg+chromium/try/ios-simulator-cronet)) ([matching builders](https://cs.chromium.org/search/?q=file:trybots.py+ios-simulator-cronet)) Path regular expressions:
diff --git a/extensions/browser/api/declarative_net_request/rules_monitor_service.cc b/extensions/browser/api/declarative_net_request/rules_monitor_service.cc index 304a4600..84c06cdb 100644 --- a/extensions/browser/api/declarative_net_request/rules_monitor_service.cc +++ b/extensions/browser/api/declarative_net_request/rules_monitor_service.cc
@@ -181,16 +181,6 @@ extensions_with_rulesets_.end(); } -void RulesMonitorService::AddObserver(Observer* observer) { - DCHECK(observer); - observers_.AddObserver(observer); -} - -void RulesMonitorService::RemoveObserver(Observer* observer) { - DCHECK(observer); - observers_.RemoveObserver(observer); -} - void RulesMonitorService::UpdateDynamicRules( const Extension& extension, std::vector<api::declarative_net_request::Rule> rules, @@ -380,8 +370,6 @@ return; extensions_with_rulesets_.insert(load_data.extension_id); - for (auto& observer : observers_) - observer.OnRulesetLoaded(); base::OnceClosure load_ruleset_on_io = base::BindOnce(&LoadRulesetOnIOThread, load_data.extension_id,
diff --git a/extensions/browser/api/declarative_net_request/rules_monitor_service.h b/extensions/browser/api/declarative_net_request/rules_monitor_service.h index 7d25daa..ab79f9b8 100644 --- a/extensions/browser/api/declarative_net_request/rules_monitor_service.h +++ b/extensions/browser/api/declarative_net_request/rules_monitor_service.h
@@ -46,15 +46,6 @@ class RulesMonitorService : public BrowserContextKeyedAPI, public ExtensionRegistryObserver { public: - class Observer { - public: - // Called when this service loads a new ruleset. - virtual void OnRulesetLoaded() = 0; - - protected: - virtual ~Observer() {} - }; - // BrowserContextKeyedAPI implementation. static BrowserContextKeyedAPIFactory<RulesMonitorService>* GetFactoryInstance(); @@ -65,10 +56,6 @@ // the given |extension_id|. bool HasRegisteredRuleset(const ExtensionId& extension_id) const; - // Adds or removes an observer. - void AddObserver(Observer* observer); - void RemoveObserver(Observer* observer); - // Updates the dynamic rules for the |extension| and then invokes // |callback| with an optional error. using DynamicRuleUpdateUICallback = @@ -125,8 +112,6 @@ ExtensionRegistry* const extension_registry_; WarningService* const warning_service_; - base::ObserverList<Observer>::Unchecked observers_; - content::BrowserContext* const context_; // Must be the last member variable. See WeakPtrFactory documentation for
diff --git a/extensions/browser/api/web_request/web_request_proxying_url_loader_factory.cc b/extensions/browser/api/web_request/web_request_proxying_url_loader_factory.cc index 4221791..e1d7cdb 100644 --- a/extensions/browser/api/web_request/web_request_proxying_url_loader_factory.cc +++ b/extensions/browser/api/web_request/web_request_proxying_url_loader_factory.cc
@@ -260,7 +260,8 @@ // Set-Cookie if it existed. auto saved_headers = current_response_.headers; current_response_ = head; - current_response_.headers = saved_headers; + if (saved_headers) + current_response_.headers = saved_headers; ContinueToBeforeRedirect(redirect_info, net::OK); } else { current_response_ = head;
diff --git a/extensions/browser/content_verifier.cc b/extensions/browser/content_verifier.cc index 52480ce..388f3273 100644 --- a/extensions/browser/content_verifier.cc +++ b/extensions/browser/content_verifier.cc
@@ -61,8 +61,12 @@ // Note that elsewhere we always normalize path separators to '/' so this // should work for all platforms. - return base::FilePath( - base::JoinString(parts, base::FilePath::StringType(1, '/'))); + base::FilePath::StringType normalized_relative_path = + base::JoinString(parts, base::FilePath::StringType(1, '/')); + // Preserve trailing separator, if present. + if (path.EndsWithSeparator()) + normalized_relative_path.append(1, '/'); + return base::FilePath(normalized_relative_path); } bool HasScriptFileExt(const base::FilePath& requested_path) { @@ -753,4 +757,9 @@ io_data_->AddData(extension->id(), CreateIOData(extension, delegate_.get())); } +base::FilePath ContentVerifier::NormalizeRelativePathForTesting( + const base::FilePath& path) { + return NormalizeRelativePath(path); +} + } // namespace extensions
diff --git a/extensions/browser/content_verifier.h b/extensions/browser/content_verifier.h index 24410bd..8780385 100644 --- a/extensions/browser/content_verifier.h +++ b/extensions/browser/content_verifier.h
@@ -102,6 +102,10 @@ // call |OnExtensionLoaded|. void ResetIODataForTesting(const Extension* extension); + // Test helper to normalize relative path of file. + static base::FilePath NormalizeRelativePathForTesting( + const base::FilePath& path); + private: friend class ContentVerifierTest; friend class base::RefCountedThreadSafe<ContentVerifier>;
diff --git a/extensions/browser/content_verifier_unittest.cc b/extensions/browser/content_verifier_unittest.cc index 7067f27..7d850b1 100644 --- a/extensions/browser/content_verifier_unittest.cc +++ b/extensions/browser/content_verifier_unittest.cc
@@ -9,6 +9,7 @@ #include "base/values.h" #include "content/public/test/test_browser_thread_bundle.h" #include "content/public/test/test_utils.h" +#include "extensions/browser/content_verifier.h" #include "extensions/browser/content_verifier/test_utils.h" #include "extensions/browser/extension_registry.h" #include "extensions/browser/extensions_test.h" @@ -215,4 +216,24 @@ BackgroundManifestType::kBackgroundScript, BackgroundManifestType::kBackgroundPage)); +TEST(ContentVerifierTest, NormalizeRelativePath) { +// This macro helps avoid wrapped lines in the test structs. +#define FPL(x) FILE_PATH_LITERAL(x) + struct TestData { + base::FilePath::StringPieceType input; + base::FilePath::StringPieceType expected; + } test_cases[] = {{FPL("foo/bar"), FPL("foo/bar")}, + {FPL("foo//bar"), FPL("foo/bar")}, + {FPL("foo/bar/"), FPL("foo/bar/")}, + {FPL("foo/bar//"), FPL("foo/bar/")}, + {FPL("foo/options.html/"), FPL("foo/options.html/")}}; +#undef FPL + for (const auto& test_case : test_cases) { + base::FilePath input(test_case.input); + base::FilePath expected(test_case.expected); + EXPECT_EQ(expected, + ContentVerifier::NormalizeRelativePathForTesting(input)); + } +} + } // namespace extensions
diff --git a/extensions/browser/guest_view/mime_handler_view/mime_handler_view_browsertest.cc b/extensions/browser/guest_view/mime_handler_view/mime_handler_view_browsertest.cc index 326a6aa..b99770f 100644 --- a/extensions/browser/guest_view/mime_handler_view/mime_handler_view_browsertest.cc +++ b/extensions/browser/guest_view/mime_handler_view/mime_handler_view_browsertest.cc
@@ -189,11 +189,6 @@ void SetUpCommandLine(base::CommandLine* cl) override { MimeHandlerViewTest::SetUpCommandLine(cl); is_cross_process_mode_ = GetParam(); - // TODO(ekaramad): All these tests started timing out on ChromeOS (https:// - // crbug.com/949565). -#if defined(OS_CHROMEOS) - is_cross_process_mode_ = false; -#endif if (is_cross_process_mode_) { scoped_feature_list_.InitAndEnableFeature( features::kMimeHandlerViewInCrossProcessFrame);
diff --git a/extensions/browser/preload_check_group_unittest.cc b/extensions/browser/preload_check_group_unittest.cc index 2998886..c0810f99 100644 --- a/extensions/browser/preload_check_group_unittest.cc +++ b/extensions/browser/preload_check_group_unittest.cc
@@ -5,7 +5,7 @@ #include <memory> #include <vector> -#include "base/message_loop/message_loop.h" +#include "base/test/scoped_task_environment.h" #include "extensions/browser/preload_check_group.h" #include "extensions/browser/preload_check_test_util.h" #include "testing/gmock/include/gmock/gmock.h" @@ -50,8 +50,8 @@ std::unique_ptr<PreloadCheckGroup> check_group_; private: - // A message loop is required for the asynchronous tests. - base::MessageLoop message_loop_; + // Required for the asynchronous tests. + base::test::ScopedTaskEnvironment scoped_task_environment_; }; // Tests multiple succeeding checks.
diff --git a/extensions/renderer/script_context_set_unittest.cc b/extensions/renderer/script_context_set_unittest.cc index 7d64eb97..a88d5e11 100644 --- a/extensions/renderer/script_context_set_unittest.cc +++ b/extensions/renderer/script_context_set_unittest.cc
@@ -4,8 +4,8 @@ #include <vector> -#include "base/message_loop/message_loop.h" #include "base/run_loop.h" +#include "base/test/scoped_task_environment.h" #include "extensions/common/extension.h" #include "extensions/common/extension_set.h" #include "extensions/common/features/feature.h" @@ -21,7 +21,7 @@ namespace extensions { TEST(ScriptContextSetTest, Lifecycle) { - base::MessageLoop loop; + base::test::ScopedTaskEnvironment scoped_task_environment; ScopedWebFrame web_frame; // Used by ScriptContextSet::Register(). TestExtensionsRendererClient extensions_renderer_client;
diff --git a/gin/gin_features.cc b/gin/gin_features.cc index f062ed9..048f048 100644 --- a/gin/gin_features.cc +++ b/gin/gin_features.cc
@@ -26,4 +26,12 @@ const base::Feature kV8HugeMaxOldGenerationSize{ "V8HugeMaxOldGenerationSize", base::FEATURE_DISABLED_BY_DEFAULT}; +// Enables new background GC scheduling heuristics. +const base::Feature kV8GCBackgroundSchedule{"V8GCBackgroundSchedule", + base::FEATURE_DISABLED_BY_DEFAULT}; + +// Perform less compaction in non-memory reducing mode. +const base::Feature kV8GCLessCompaction{"V8GCLessCompaction", + base::FEATURE_DISABLED_BY_DEFAULT}; + } // namespace features
diff --git a/gin/gin_features.h b/gin/gin_features.h index 1ed04a4..2d5652f 100644 --- a/gin/gin_features.h +++ b/gin/gin_features.h
@@ -15,6 +15,8 @@ GIN_EXPORT extern const base::Feature kV8LazyFeedbackAllocation; GIN_EXPORT extern const base::Feature kV8MemoryReducerForSmallHeaps; GIN_EXPORT extern const base::Feature kV8HugeMaxOldGenerationSize; +GIN_EXPORT extern const base::Feature kV8GCBackgroundSchedule; +GIN_EXPORT extern const base::Feature kV8GCLessCompaction; } // namespace features
diff --git a/gin/v8_initializer.cc b/gin/v8_initializer.cc index 8148f75..aab46a0 100644 --- a/gin/v8_initializer.cc +++ b/gin/v8_initializer.cc
@@ -246,6 +246,20 @@ sizeof(huge_max_old_generation_size) - 1); } + if (base::FeatureList::IsEnabled(features::kV8GCBackgroundSchedule)) { + static const char gc_experiment_background_schedule[] = + "--gc_experiment_background_schedule"; + v8::V8::SetFlagsFromString(gc_experiment_background_schedule, + sizeof(gc_experiment_background_schedule) - 1); + } + + if (base::FeatureList::IsEnabled(features::kV8GCLessCompaction)) { + static const char gc_experiment_less_compaction[] = + "--gc_experiment_less_compaction"; + v8::V8::SetFlagsFromString(gc_experiment_less_compaction, + sizeof(gc_experiment_less_compaction) - 1); + } + if (IsolateHolder::kStrictMode == mode) { static const char use_strict[] = "--use_strict"; v8::V8::SetFlagsFromString(use_strict, sizeof(use_strict) - 1);
diff --git a/google_apis/gaia/core_account_id.cc b/google_apis/gaia/core_account_id.cc index d808082..12eefe3 100644 --- a/google_apis/gaia/core_account_id.cc +++ b/google_apis/gaia/core_account_id.cc
@@ -6,8 +6,16 @@ CoreAccountId::CoreAccountId() = default; +CoreAccountId::CoreAccountId(const CoreAccountId&) = default; + +CoreAccountId::CoreAccountId(CoreAccountId&&) noexcept = default; + CoreAccountId::~CoreAccountId() = default; +CoreAccountId& CoreAccountId::operator=(const CoreAccountId&) = default; + +CoreAccountId& CoreAccountId::operator=(CoreAccountId&&) noexcept = default; + CoreAccountId::CoreAccountId(const char* id) : id(id) {} CoreAccountId::CoreAccountId(std::string&& id) : id(std::move(id)) {}
diff --git a/google_apis/gaia/core_account_id.h b/google_apis/gaia/core_account_id.h index 5ea602a..c2d1911 100644 --- a/google_apis/gaia/core_account_id.h +++ b/google_apis/gaia/core_account_id.h
@@ -14,8 +14,13 @@ // for design and tracking). struct CoreAccountId { CoreAccountId(); + CoreAccountId(const CoreAccountId&); + CoreAccountId(CoreAccountId&&) noexcept; ~CoreAccountId(); + CoreAccountId& operator=(const CoreAccountId&); + CoreAccountId& operator=(CoreAccountId&&) noexcept; + // Those implicit constructor and conversion operator allow to // progressively migrate the code to use this struct. Removing // them is tracked by https://crbug.com/959161
diff --git a/gpu/command_buffer/client/cmd_buffer_helper_test.cc b/gpu/command_buffer/client/cmd_buffer_helper_test.cc index 8e2755df..23e9fa3 100644 --- a/gpu/command_buffer/client/cmd_buffer_helper_test.cc +++ b/gpu/command_buffer/client/cmd_buffer_helper_test.cc
@@ -13,8 +13,8 @@ #include "base/bind.h" #include "base/bind_helpers.h" #include "base/macros.h" -#include "base/message_loop/message_loop.h" #include "base/run_loop.h" +#include "base/test/scoped_task_environment.h" #include "gpu/command_buffer/client/cmd_buffer_helper.h" #include "gpu/command_buffer/client/command_buffer_direct_locked.h" #include "gpu/command_buffer/service/mocks.h" @@ -202,7 +202,7 @@ std::vector<std::unique_ptr<CommandBufferEntry[]>> test_command_args_; unsigned int test_command_next_id_; Sequence sequence_; - base::MessageLoop message_loop_; + base::test::ScopedTaskEnvironment scoped_task_environment_; }; // Checks immediate_entry_count_ changes based on RingBuffer state.
diff --git a/gpu/command_buffer/client/fenced_allocator_test.cc b/gpu/command_buffer/client/fenced_allocator_test.cc index be304f1..a5f7cd1 100644 --- a/gpu/command_buffer/client/fenced_allocator_test.cc +++ b/gpu/command_buffer/client/fenced_allocator_test.cc
@@ -11,8 +11,8 @@ #include "base/bind.h" #include "base/bind_helpers.h" #include "base/memory/aligned_memory.h" -#include "base/message_loop/message_loop.h" #include "base/run_loop.h" +#include "base/test/scoped_task_environment.h" #include "gpu/command_buffer/client/cmd_buffer_helper.h" #include "gpu/command_buffer/client/fenced_allocator.h" #include "gpu/command_buffer/service/command_buffer_direct.h" @@ -58,7 +58,7 @@ std::unique_ptr<CommandBufferDirect> command_buffer_; std::unique_ptr<AsyncAPIMock> api_mock_; std::unique_ptr<CommandBufferHelper> helper_; - base::MessageLoop message_loop_; + base::test::ScopedTaskEnvironment scoped_task_environment_; }; #ifndef _MSC_VER
diff --git a/gpu/command_buffer/client/mapped_memory_unittest.cc b/gpu/command_buffer/client/mapped_memory_unittest.cc index d1844a0..1a574fc 100644 --- a/gpu/command_buffer/client/mapped_memory_unittest.cc +++ b/gpu/command_buffer/client/mapped_memory_unittest.cc
@@ -11,8 +11,8 @@ #include <memory> #include "base/bind.h" -#include "base/message_loop/message_loop.h" #include "base/run_loop.h" +#include "base/test/scoped_task_environment.h" #include "gpu/command_buffer/client/cmd_buffer_helper.h" #include "gpu/command_buffer/client/command_buffer_direct_locked.h" #include "gpu/command_buffer/service/mocks.h" @@ -55,7 +55,7 @@ std::unique_ptr<CommandBufferDirectLocked> command_buffer_; std::unique_ptr<AsyncAPIMock> api_mock_; std::unique_ptr<CommandBufferHelper> helper_; - base::MessageLoop message_loop_; + base::test::ScopedTaskEnvironment scoped_task_environment_; }; #ifndef _MSC_VER
diff --git a/gpu/command_buffer/client/ring_buffer_test.cc b/gpu/command_buffer/client/ring_buffer_test.cc index 4dd4f68..f7c0b6e 100644 --- a/gpu/command_buffer/client/ring_buffer_test.cc +++ b/gpu/command_buffer/client/ring_buffer_test.cc
@@ -12,8 +12,8 @@ #include "base/bind.h" #include "base/bind_helpers.h" -#include "base/message_loop/message_loop.h" #include "base/run_loop.h" +#include "base/test/scoped_task_environment.h" #include "gpu/command_buffer/client/cmd_buffer_helper.h" #include "gpu/command_buffer/service/command_buffer_direct.h" #include "gpu/command_buffer/service/mocks.h" @@ -85,7 +85,7 @@ std::unique_ptr<int8_t[]> buffer_; int8_t* buffer_start_; - base::MessageLoop message_loop_; + base::test::ScopedTaskEnvironment scoped_task_environment_; }; #ifndef _MSC_VER
diff --git a/gpu/command_buffer/service/feature_info.cc b/gpu/command_buffer/service/feature_info.cc index e18f33850..345a9bc 100644 --- a/gpu/command_buffer/service/feature_info.cc +++ b/gpu/command_buffer/service/feature_info.cc
@@ -1680,8 +1680,9 @@ } } - // Assume all desktop (!gl_version_info_->is_es) supports float blend - if (!gl_version_info_->is_es || + // Assume all desktop (!gl_version_info_->is_es) supports float blend. + // Floating-point format blending is core of ES 3.2. + if (!gl_version_info_->is_es || gl_version_info_->IsAtLeastGLES(3, 2) || gfx::HasExtension(extensions, "GL_EXT_float_blend")) { if (!disallowed_features_.ext_float_blend) { EnableEXTFloatBlend();
diff --git a/gpu/command_buffer/service/gles2_cmd_decoder_unittest_base.h b/gpu/command_buffer/service/gles2_cmd_decoder_unittest_base.h index d81387c..4b9e783 100644 --- a/gpu/command_buffer/service/gles2_cmd_decoder_unittest_base.h +++ b/gpu/command_buffer/service/gles2_cmd_decoder_unittest_base.h
@@ -11,7 +11,7 @@ #include <array> #include <memory> -#include "base/message_loop/message_loop.h" +#include "base/test/scoped_task_environment.h" #include "gpu/command_buffer/client/client_test_helper.h" #include "gpu/command_buffer/common/gles2_cmd_format.h" #include "gpu/command_buffer/common/gles2_cmd_utils.h" @@ -813,7 +813,7 @@ SharedImageManager shared_image_manager_; scoped_refptr<ContextGroup> group_; MockGLStates gl_states_; - base::MessageLoop message_loop_; + base::test::ScopedTaskEnvironment scoped_task_environment_; MockCopyTextureResourceManager* copy_texture_manager_; // not owned MockCopyTexImageResourceManager* copy_tex_image_blitter_; // not owned
diff --git a/gpu/command_buffer/service/gpu_service_test.h b/gpu/command_buffer/service/gpu_service_test.h index 2163a4e..8cf3a83 100644 --- a/gpu/command_buffer/service/gpu_service_test.h +++ b/gpu/command_buffer/service/gpu_service_test.h
@@ -8,7 +8,7 @@ #include <memory> #include "base/memory/ref_counted.h" -#include "base/message_loop/message_loop.h" +#include "base/test/scoped_task_environment.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" #include "ui/gl/gl_mock.h" @@ -42,7 +42,7 @@ bool ran_teardown_; scoped_refptr<gl::GLContextStub> context_; scoped_refptr<gl::GLSurfaceStub> surface_; - base::MessageLoop message_loop_; + base::test::ScopedTaskEnvironment scoped_task_environment_; }; } // namespace gles2
diff --git a/gpu/command_buffer/service/gpu_switches.cc b/gpu/command_buffer/service/gpu_switches.cc index e920902..e7798d4 100644 --- a/gpu/command_buffer/service/gpu_switches.cc +++ b/gpu/command_buffer/service/gpu_switches.cc
@@ -73,8 +73,11 @@ // tracking. const char kUseCmdDecoder[] = "use-cmd-decoder"; -// Enable Vulkan support, must also have ENABLE_VULKAN defined. -const char kEnableVulkan[] = "enable-vulkan"; +// Enable Vulkan support and select Vulkan implementation, must also have +// ENABLE_VULKAN defined. +const char kUseVulkan[] = "use-vulkan"; +const char kVulkanImplementationNameNative[] = "native"; +const char kVulkanImplementationNameSwiftshader[] = "swiftshader"; // Disables VK_KHR_surface extension. Instead of using swapchain, bitblt will be // used for present render result on screen.
diff --git a/gpu/command_buffer/service/gpu_switches.h b/gpu/command_buffer/service/gpu_switches.h index bff68af..aa6dfbeb 100644 --- a/gpu/command_buffer/service/gpu_switches.h +++ b/gpu/command_buffer/service/gpu_switches.h
@@ -36,7 +36,9 @@ GPU_EXPORT extern const char kGLShaderIntermOutput[]; GPU_EXPORT extern const char kEmulateShaderPrecision[]; GPU_EXPORT extern const char kUseCmdDecoder[]; -GPU_EXPORT extern const char kEnableVulkan[]; +GPU_EXPORT extern const char kUseVulkan[]; +GPU_EXPORT extern const char kVulkanImplementationNameNative[]; +GPU_EXPORT extern const char kVulkanImplementationNameSwiftshader[]; GPU_EXPORT extern const char kDisableVulkanSurface[]; GPU_EXPORT extern const char kDisableVulkanFallbackToGLForTesting[];
diff --git a/gpu/command_buffer/service/raster_decoder_unittest_base.h b/gpu/command_buffer/service/raster_decoder_unittest_base.h index 9e72426..8b321db 100644 --- a/gpu/command_buffer/service/raster_decoder_unittest_base.h +++ b/gpu/command_buffer/service/raster_decoder_unittest_base.h
@@ -14,7 +14,7 @@ #include <string> #include <vector> -#include "base/message_loop/message_loop.h" +#include "base/test/scoped_task_environment.h" #include "components/viz/common/resources/resource_format.h" #include "gpu/command_buffer/client/client_test_helper.h" #include "gpu/command_buffer/common/raster_cmd_format.h" @@ -246,7 +246,7 @@ MemoryTypeTracker memory_tracker_; std::vector<std::unique_ptr<SharedImageRepresentationFactoryRef>> shared_images_; - base::MessageLoop message_loop_; + base::test::ScopedTaskEnvironment scoped_task_environment_; gles2::MockCopyTextureResourceManager* copy_texture_manager_; // not owned GLuint next_fake_texture_client_id_ = 271828; };
diff --git a/gpu/command_buffer/service/service_utils.cc b/gpu/command_buffer/service/service_utils.cc index ca291cdb..a97c10e 100644 --- a/gpu/command_buffer/service/service_utils.cc +++ b/gpu/command_buffer/service/service_utils.cc
@@ -167,8 +167,18 @@ command_line->HasSwitch(switches::kIgnoreGpuBlacklist); gpu_preferences.enable_webgpu = command_line->HasSwitch(switches::kEnableUnsafeWebGPU); - gpu_preferences.enable_vulkan = - command_line->HasSwitch(switches::kEnableVulkan); + if (command_line->HasSwitch(switches::kUseVulkan)) { + auto value = command_line->GetSwitchValueASCII(switches::kUseVulkan); + if (value.empty() || value == switches::kVulkanImplementationNameNative) { + gpu_preferences.use_vulkan = VulkanImplementationName::kNative; + } else if (value == switches::kVulkanImplementationNameSwiftshader) { + gpu_preferences.use_vulkan = VulkanImplementationName::kSwiftshader; + } else { + gpu_preferences.use_vulkan = VulkanImplementationName::kNone; + } + } else { + gpu_preferences.use_vulkan = VulkanImplementationName::kNone; + } gpu_preferences.disable_vulkan_surface = command_line->HasSwitch(switches::kDisableVulkanSurface); return gpu_preferences;
diff --git a/gpu/command_buffer/tests/webgpu_test.cc b/gpu/command_buffer/tests/webgpu_test.cc index e73a987..3f97e54 100644 --- a/gpu/command_buffer/tests/webgpu_test.cc +++ b/gpu/command_buffer/tests/webgpu_test.cc
@@ -39,8 +39,8 @@ void WebGPUTest::SetUp() { gpu::GpuPreferences gpu_preferences; gpu_preferences.enable_webgpu = true; - gpu_service_holder_ = std::make_unique<viz::TestGpuServiceHolder>( - gpu_preferences, false /* use_swiftshader_for_vulkan */); + gpu_service_holder_ = + std::make_unique<viz::TestGpuServiceHolder>(gpu_preferences); } void WebGPUTest::TearDown() {
diff --git a/gpu/config/gpu_preferences.h b/gpu/config/gpu_preferences.h index aa5a09aa..a336269 100644 --- a/gpu/config/gpu_preferences.h +++ b/gpu/config/gpu_preferences.h
@@ -25,6 +25,13 @@ const size_t kLowEndMaxProgramCacheMemoryBytes = 128 * 1024; #endif +enum VulkanImplementationName : uint32_t { + kNone = 0, + kNative = 1, + kSwiftshader = 2, + kLast = kSwiftshader, +}; + // NOTE: if you modify this structure then you must also modify the // following two files to keep them in sync: // src/gpu/ipc/common/gpu_preferences.mojom @@ -186,7 +193,7 @@ // =================================== // Settings from //gpu/command_buffer/service/gpu_switches.h // Use Vulkan for rasterization and display compositing. - bool enable_vulkan = false; + VulkanImplementationName use_vulkan = VulkanImplementationName::kNone; // Use vulkan VK_KHR_surface for presenting. bool disable_vulkan_surface = false;
diff --git a/gpu/config/gpu_preferences_unittest.cc b/gpu/config/gpu_preferences_unittest.cc index ca358f26..97037088 100644 --- a/gpu/config/gpu_preferences_unittest.cc +++ b/gpu/config/gpu_preferences_unittest.cc
@@ -68,7 +68,7 @@ EXPECT_EQ(left.disable_oop_rasterization, right.disable_oop_rasterization); EXPECT_EQ(left.watchdog_starts_backgrounded, right.watchdog_starts_backgrounded); - EXPECT_EQ(left.enable_vulkan, right.enable_vulkan); + EXPECT_EQ(left.use_vulkan, right.use_vulkan); EXPECT_EQ(left.enable_gpu_benchmarking_extension, right.enable_gpu_benchmarking_extension); EXPECT_EQ(left.enable_webgpu, right.enable_webgpu); @@ -105,6 +105,13 @@ prefs_mojom.name = value; \ EXPECT_EQ(input_prefs.name, prefs_mojom.name); +#define GPU_PREFERENCES_FIELD_ENUM(name, value) \ + input_prefs.name = value; \ + EXPECT_NE(default_prefs.name, input_prefs.name); \ + prefs_mojom.name = mojom::value; \ + EXPECT_EQ(static_cast<uint32_t>(input_prefs.name), \ + static_cast<uint32_t>(prefs_mojom.name)); + GPU_PREFERENCES_FIELD(disable_accelerated_video_decode, true) GPU_PREFERENCES_FIELD(disable_accelerated_video_encode, true) GPU_PREFERENCES_FIELD(gpu_startup_dialog, true) @@ -143,7 +150,7 @@ GPU_PREFERENCES_FIELD(enable_oop_rasterization, true) GPU_PREFERENCES_FIELD(disable_oop_rasterization, true) GPU_PREFERENCES_FIELD(watchdog_starts_backgrounded, true) - GPU_PREFERENCES_FIELD(enable_vulkan, true) + GPU_PREFERENCES_FIELD_ENUM(use_vulkan, VulkanImplementationName::kNative) GPU_PREFERENCES_FIELD(enable_gpu_benchmarking_extension, true) GPU_PREFERENCES_FIELD(enable_webgpu, true)
diff --git a/gpu/ipc/common/gpu_preferences.mojom b/gpu/ipc/common/gpu_preferences.mojom index fabd910f..96d8043 100644 --- a/gpu/ipc/common/gpu_preferences.mojom +++ b/gpu/ipc/common/gpu_preferences.mojom
@@ -7,6 +7,14 @@ import "ui/gfx/mojo/buffer_types.mojom"; +// Corresponds to gpu::VulkanImplementationName. +enum VulkanImplementationName { + kNone = 0, + kNative = 1, + kSwiftshader = 2, + kLast = kSwiftshader, +}; + // gpu::GpuPreferences struct GpuPreferences { bool disable_accelerated_video_decode; @@ -53,7 +61,7 @@ bool disable_oop_rasterization; bool enable_oop_rasterization_ddl; bool watchdog_starts_backgrounded; - bool enable_vulkan; + VulkanImplementationName use_vulkan; bool disable_vulkan_surface; bool disable_vulkan_fallback_to_gl_for_testing; bool enable_metal;
diff --git a/gpu/ipc/common/gpu_preferences_struct_traits.h b/gpu/ipc/common/gpu_preferences_struct_traits.h index cf1347d..87a9115 100644 --- a/gpu/ipc/common/gpu_preferences_struct_traits.h +++ b/gpu/ipc/common/gpu_preferences_struct_traits.h
@@ -14,6 +14,39 @@ namespace mojo { template <> +struct EnumTraits<gpu::mojom::VulkanImplementationName, + gpu::VulkanImplementationName> { + static gpu::mojom::VulkanImplementationName ToMojom( + gpu::VulkanImplementationName input) { + switch (input) { + case gpu::VulkanImplementationName::kNone: + return gpu::mojom::VulkanImplementationName::kNone; + case gpu::VulkanImplementationName::kNative: + return gpu::mojom::VulkanImplementationName::kNative; + case gpu::VulkanImplementationName::kSwiftshader: + return gpu::mojom::VulkanImplementationName::kSwiftshader; + } + NOTREACHED(); + return gpu::mojom::VulkanImplementationName::kNone; + } + static bool FromMojom(gpu::mojom::VulkanImplementationName input, + gpu::VulkanImplementationName* out) { + switch (input) { + case gpu::mojom::VulkanImplementationName::kNone: + *out = gpu::VulkanImplementationName::kNone; + return true; + case gpu::mojom::VulkanImplementationName::kNative: + *out = gpu::VulkanImplementationName::kNative; + return true; + case gpu::mojom::VulkanImplementationName::kSwiftshader: + *out = gpu::VulkanImplementationName::kSwiftshader; + return true; + } + return false; + } +}; + +template <> struct StructTraits<gpu::mojom::GpuPreferencesDataView, gpu::GpuPreferences> { static bool Read(gpu::mojom::GpuPreferencesDataView prefs, gpu::GpuPreferences* out) { @@ -77,7 +110,8 @@ out->disable_oop_rasterization = prefs.disable_oop_rasterization(); out->enable_oop_rasterization_ddl = prefs.enable_oop_rasterization_ddl(); out->watchdog_starts_backgrounded = prefs.watchdog_starts_backgrounded(); - out->enable_vulkan = prefs.enable_vulkan(); + if (!prefs.ReadUseVulkan(&out->use_vulkan)) + return false; out->disable_vulkan_surface = prefs.disable_vulkan_surface(); out->disable_vulkan_fallback_to_gl_for_testing = prefs.disable_vulkan_fallback_to_gl_for_testing(); @@ -213,8 +247,9 @@ static bool watchdog_starts_backgrounded(const gpu::GpuPreferences& prefs) { return prefs.watchdog_starts_backgrounded; } - static bool enable_vulkan(const gpu::GpuPreferences& prefs) { - return prefs.enable_vulkan; + static gpu::VulkanImplementationName use_vulkan( + const gpu::GpuPreferences& prefs) { + return prefs.use_vulkan; } static bool disable_vulkan_surface(const gpu::GpuPreferences& prefs) { return prefs.disable_vulkan_surface;
diff --git a/gpu/ipc/service/gpu_init.cc b/gpu/ipc/service/gpu_init.cc index 0302db0..46fafa1 100644 --- a/gpu/ipc/service/gpu_init.cc +++ b/gpu/ipc/service/gpu_init.cc
@@ -251,19 +251,22 @@ #endif #if BUILDFLAG(ENABLE_VULKAN) - if (gpu_preferences_.enable_vulkan) { - vulkan_implementation_ = gpu::CreateVulkanImplementation(); + if (gpu_preferences_.use_vulkan != gpu::VulkanImplementationName::kNone) { + bool use_swiftshader = gpu_preferences_.use_vulkan == + gpu::VulkanImplementationName::kSwiftshader; + vulkan_implementation_ = gpu::CreateVulkanImplementation(use_swiftshader); if (!vulkan_implementation_ || !vulkan_implementation_->InitializeVulkanInstance( !gpu_preferences_.disable_vulkan_surface)) { - DLOG(WARNING) << "Failed to create and initialize Vulkan implementation."; + DLOG(ERROR) << "Failed to create and initialize Vulkan implementation."; vulkan_implementation_ = nullptr; CHECK(!gpu_preferences_.disable_vulkan_fallback_to_gl_for_testing); } - gpu_preferences_.enable_vulkan = !!vulkan_implementation_; + if (!vulkan_implementation_) + gpu_preferences_.use_vulkan = gpu::VulkanImplementationName::kNone; } #else - gpu_preferences_.enable_vulkan = false; + gpu_preferences_.use_vulkan = gpu::VulkanImplementationName::kNone; #endif if (!use_swiftshader) {
diff --git a/gpu/vulkan/BUILD.gn b/gpu/vulkan/BUILD.gn index 066ae742..4900d8cf 100644 --- a/gpu/vulkan/BUILD.gn +++ b/gpu/vulkan/BUILD.gn
@@ -99,13 +99,6 @@ "tests/native_window.h", ] - # Vulkan Swiftshader can only be built on Linux. - # TODO(samans): Support more platforms. https://crbug.com/963988 - if (use_x11) { - data_deps = [ - "//third_party/swiftshader/src/Vulkan:swiftshader_libvulkan", - ] - } deps = [ "//ui/gfx", "//ui/gfx:native_widget_types",
diff --git a/gpu/vulkan/x/BUILD.gn b/gpu/vulkan/x/BUILD.gn index 14d586d..4a1158c 100644 --- a/gpu/vulkan/x/BUILD.gn +++ b/gpu/vulkan/x/BUILD.gn
@@ -37,4 +37,10 @@ "//base", "//gpu/vulkan", ] + + # Vulkan Swiftshader can only be built on Linux. + # TODO(samans): Support more platforms. https://crbug.com/963988 + data_deps = [ + "//third_party/swiftshader/src/Vulkan:swiftshader_libvulkan", + ] }
diff --git a/infra/config/commit-queue.cfg b/infra/config/commit-queue.cfg index 3f0a3acd..389193c 100644 --- a/infra/config/commit-queue.cfg +++ b/infra/config/commit-queue.cfg
@@ -238,6 +238,14 @@ location_regexp: ".+/[+]/third_party/dawn/.+" } builders { + name: "chromium/try/fuchsia-arm64-cast" + location_regexp: ".+/[+]/chromecast/.+" + } + builders { + name: "chromium/try/fuchsia-x64-cast" + location_regexp: ".+/[+]/chromecast/.+" + } + builders { name: "chromium/try/ios-simulator-cronet" location_regexp: ".+/[+]/components/cronet/.+" location_regexp: ".+/[+]/components/grpc_support/.+"
diff --git a/infra/config/cq_cfg_presubmit.py b/infra/config/cq_cfg_presubmit.py index 40c14db..549a5aa 100755 --- a/infra/config/cq_cfg_presubmit.py +++ b/infra/config/cq_cfg_presubmit.py
@@ -283,7 +283,8 @@ invalid_regexp = False for regexp in regexps: regexp = regexp.replace('\\\\', '') - assert regexp.startswith(REGEX_PREFIX) + assert regexp.startswith(REGEX_PREFIX), ( + 'location_regexp "%s" must start with "%s"' % (regexp, REGEX_PREFIX)) regexp = regexp[len(REGEX_PREFIX):] # Split by path name, so that we don't have to run os.walk on the entire # source tree. commit-queue.cfg always uses '/' as the path separator.
diff --git a/infra/config/cr-buildbucket.cfg b/infra/config/cr-buildbucket.cfg index 169bb0f..5573153ab 100644 --- a/infra/config/cr-buildbucket.cfg +++ b/infra/config/cr-buildbucket.cfg
@@ -1452,9 +1452,9 @@ builders { name: "Linux Builder" - mixins: "linux-ci" + mixins: "linux-ci-goma-rbe-prod" mixins: "linux-xenial" - dimensions: "cores:32" + mixins: "builderless" } builders { @@ -1528,7 +1528,6 @@ builders { name: "Linux Builder (dbg)" mixins: "linux-ci-goma-rbe-prod" - dimensions: "cores:32" mixins: "linux-xenial" mixins: "builderless" } @@ -1571,6 +1570,7 @@ builders { name: "GPU Linux Builder" mixins: "linux-gpu-ci" + mixins: "goma-rbe-prod" } builders { @@ -3710,17 +3710,37 @@ mixins: "linux-xenial" mixins: "builderless" } - builders { mixins: "linux-try" name: "fuchsia-arm64-cast" } - builders { mixins: "linux-try" name: "fuchsia-fyi-arm64-rel" } - builders { mixins: "linux-try" name: "fuchsia-fyi-x64-dbg" } - builders { mixins: "linux-try" name: "fuchsia-fyi-x64-rel" } + builders { + mixins: "builderless" + mixins: "linux-try" + name: "fuchsia-arm64-cast" + } + builders { + mixins: "builderless" + mixins: "linux-try" + name: "fuchsia-fyi-arm64-rel" + } + builders { + mixins: "builderless" + mixins: "linux-try" + name: "fuchsia-fyi-x64-dbg" + } + builders { + mixins: "builderless" + mixins: "linux-try" + name: "fuchsia-fyi-x64-rel" + } builders { mixins: "linux-try" name: "fuchsia_x64" mixins: "linux-xenial" mixins: "builderless" } - builders { mixins: "linux-try" name: "fuchsia-x64-cast" } + builders { + mixins: "builderless" + mixins: "linux-try" + name: "fuchsia-x64-cast" + } builders { mixins: "linux-optional-gpu-try" name: "gpu-fyi-try-linux-intel-dqp" @@ -3782,7 +3802,11 @@ name: "linux-blink-heap-concurrent-marking-tsan-rel" } builders { mixins: "linux-try" name: "linux-blink-heap-verification-try" } - builders { mixins: "linux-try" name: "linux-dcheck-off-rel" } + builders { + mixins: "linux-try" + mixins: "goma-rbe-prod" + name: "linux-dcheck-off-rel" + } builders { mixins: "linux-try" mixins: "goma-j150" @@ -3855,6 +3879,7 @@ } builders { mixins: "linux-try" + mixins: "goma-rbe-prod" name: "linux_chromium_compile_rel_ng" } builders { @@ -3883,7 +3908,7 @@ builders { mixins: "linux-try" mixins: "linux-xenial" - mixins: "goma-j150" + mixins: "goma-rbe-prod-j150" mixins: "builderless" name: "linux-rel" }
diff --git a/infra/config/luci-milo.cfg b/infra/config/luci-milo.cfg index bba9264..a921c2f6 100644 --- a/infra/config/luci-milo.cfg +++ b/infra/config/luci-milo.cfg
@@ -2985,6 +2985,15 @@ category: "week2d|mac" short_name: "jumbo" } + builders { + name: "buildbucket/luci.chromium.ci/Linux Builder" + category: "week2.5|linux" + } + builders { + name: "buildbucket/luci.chromium.ci/GPU Linux Builder" + category: "week2.5|linux" + short_name: "gpu" + } } consoles {
diff --git a/ios/build/bots/chromium.fyi/ios12-beta-simulator.json b/ios/build/bots/chromium.fyi/ios12-beta-simulator.json index e9676c2..89a3dacb 100644 --- a/ios/build/bots/chromium.fyi/ios12-beta-simulator.json +++ b/ios/build/bots/chromium.fyi/ios12-beta-simulator.json
@@ -1,9 +1,9 @@ { "comments": [ "Run tests on iOS12beta track on 64-bit iOS 12 simulators.", - "Note: Xcode 10 requires OSX 10.13.4 hence 'host os'" + "Note: Xcode 11 requires OSX 10.14.3 hence 'host os'" ], - "xcode build version": "10b61", + "xcode build version": "10e1001", "gn_args": [ "goma_dir=\"$(goma_dir)\"", "is_component_build=false", @@ -17,13 +17,13 @@ { "include": "common_tests.json", "device type": "iPhone X", - "os": "12.1", - "xcode build version": "10o45e", - "host os": "Mac-10.13.6", + "os": "12.2", + "xcode build version": "10e1001", + "host os": "Mac-10.14.4", "pool":"Chrome", "optional_dimensions": { "60": [{ - "host os": "Mac-10.14.4" + "host os": "Mac-10.14.5" }], "120": [{ "host os": "Mac-10.14.3" @@ -33,13 +33,13 @@ { "include": "eg_cq_tests.json", "device type": "iPhone X", - "os": "12.1", - "xcode build version": "10o45e", - "host os": "Mac-10.13.6", + "os": "12.2", + "xcode build version": "10e1001", + "host os": "Mac-10.14.4", "pool":"Chrome", "optional_dimensions": { "60": [{ - "host os": "Mac-10.14.4" + "host os": "Mac-10.14.5" }], "120": [{ "host os": "Mac-10.14.3" @@ -49,13 +49,13 @@ { "include": "eg_cq_tests.json", "device type": "iPhone 6 Plus", - "os": "12.1", - "xcode build version": "10o45e", - "host os": "Mac-10.13.6", + "os": "12.2", + "xcode build version": "10e1001", + "host os": "Mac-10.14.4", "pool":"Chrome", "optional_dimensions": { "60": [{ - "host os": "Mac-10.14.4" + "host os": "Mac-10.14.5" }], "120": [{ "host os": "Mac-10.14.3" @@ -65,13 +65,13 @@ { "include": "eg_cq_tests.json", "device type": "iPhone 5s", - "os": "12.1", - "xcode build version": "10o45e", - "host os": "Mac-10.13.6", + "os": "12.2", + "xcode build version": "10e1001", + "host os": "Mac-10.14.4", "pool":"Chrome", "optional_dimensions": { "60": [{ - "host os": "Mac-10.14.4" + "host os": "Mac-10.14.5" }], "120": [{ "host os": "Mac-10.14.3" @@ -81,13 +81,13 @@ { "include": "eg_cq_tests.json", "device type": "iPad Pro (12.9-inch)", - "os": "12.1", - "xcode build version": "10o45e", - "host os": "Mac-10.13.6", + "os": "12.2", + "xcode build version": "10e1001", + "host os": "Mac-10.14.4", "pool":"Chrome", "optional_dimensions": { "60": [{ - "host os": "Mac-10.14.4" + "host os": "Mac-10.14.5" }], "120": [{ "host os": "Mac-10.14.3" @@ -97,13 +97,13 @@ { "include": "eg_tests.json", "device type": "iPhone X", - "os": "12.1", - "xcode build version": "10o45e", - "host os": "Mac-10.13.6", + "os": "12.2", + "xcode build version": "10e1001", + "host os": "Mac-10.14.4", "pool":"Chrome", "optional_dimensions": { "60": [{ - "host os": "Mac-10.14.4" + "host os": "Mac-10.14.5" }], "120": [{ "host os": "Mac-10.14.3" @@ -113,13 +113,13 @@ { "include": "eg_tests.json", "device type": "iPhone 6 Plus", - "os": "12.1", - "xcode build version": "10o45e", - "host os": "Mac-10.13.6", + "os": "12.2", + "xcode build version": "10e1001", + "host os": "Mac-10.14.4", "pool":"Chrome", "optional_dimensions": { "60": [{ - "host os": "Mac-10.14.4" + "host os": "Mac-10.14.5" }], "120": [{ "host os": "Mac-10.14.3" @@ -129,13 +129,13 @@ { "include": "eg_tests.json", "device type": "iPad Air", - "os": "12.1", - "xcode build version": "10o45e", - "host os": "Mac-10.13.6", + "os": "12.2", + "xcode build version": "10e1001", + "host os": "Mac-10.14.4", "pool":"Chrome", "optional_dimensions": { "60": [{ - "host os": "Mac-10.14.4" + "host os": "Mac-10.14.5" }], "120": [{ "host os": "Mac-10.14.3" @@ -145,13 +145,13 @@ { "include": "eg_tests.json", "device type": "iPhone 5s", - "os": "12.1", - "xcode build version": "10o45e", - "host os": "Mac-10.13.6", + "os": "12.2", + "xcode build version": "10e1001", + "host os": "Mac-10.14.4", "pool":"Chrome", "optional_dimensions": { "60": [{ - "host os": "Mac-10.14.4" + "host os": "Mac-10.14.5" }], "120": [{ "host os": "Mac-10.14.3" @@ -161,13 +161,13 @@ { "include": "screen_size_dependent_tests.json", "device type": "iPhone 6s Plus", - "os": "12.1", - "xcode build version": "10o45e", - "host os": "Mac-10.13.6", + "os": "12.2", + "xcode build version": "10e1001", + "host os": "Mac-10.14.4", "pool":"Chrome", "optional_dimensions": { "60": [{ - "host os": "Mac-10.14.4" + "host os": "Mac-10.14.5" }], "120": [{ "host os": "Mac-10.14.3" @@ -177,13 +177,13 @@ { "include": "screen_size_dependent_tests.json", "device type": "iPhone X", - "os": "12.1", - "xcode build version": "10o45e", - "host os": "Mac-10.13.6", + "os": "12.2", + "xcode build version": "10e1001", + "host os": "Mac-10.14.4", "pool":"Chrome", "optional_dimensions": { "60": [{ - "host os": "Mac-10.14.4" + "host os": "Mac-10.14.5" }], "120": [{ "host os": "Mac-10.14.3" @@ -193,13 +193,13 @@ { "include": "screen_size_dependent_tests.json", "device type": "iPhone 5s", - "os": "12.1", - "xcode build version": "10o45e", - "host os": "Mac-10.13.6", + "os": "12.2", + "xcode build version": "10e1001", + "host os": "Mac-10.14.4", "pool":"Chrome", "optional_dimensions": { "60": [{ - "host os": "Mac-10.14.4" + "host os": "Mac-10.14.5" }], "120": [{ "host os": "Mac-10.14.3" @@ -209,13 +209,13 @@ { "include": "screen_size_dependent_tests.json", "device type": "iPad Air 2", - "os": "12.1", - "xcode build version": "10o45e", - "host os": "Mac-10.13.6", + "os": "12.2", + "xcode build version": "10e1001", + "host os": "Mac-10.14.4", "pool":"Chrome", "optional_dimensions": { "60": [{ - "host os": "Mac-10.14.4" + "host os": "Mac-10.14.5" }], "120": [{ "host os": "Mac-10.14.3"
diff --git a/ios/chrome/app/application_delegate/memory_warning_helper_unittest.mm b/ios/chrome/app/application_delegate/memory_warning_helper_unittest.mm index c41d5971..534cf76 100644 --- a/ios/chrome/app/application_delegate/memory_warning_helper_unittest.mm +++ b/ios/chrome/app/application_delegate/memory_warning_helper_unittest.mm
@@ -6,8 +6,8 @@ #include "base/bind.h" #include "base/memory/memory_pressure_listener.h" -#include "base/message_loop/message_loop.h" #include "base/run_loop.h" +#include "base/test/scoped_task_environment.h" #include "base/threading/thread.h" #import "ios/chrome/browser/metrics/previous_session_info.h" #include "testing/platform_test.h" @@ -52,7 +52,7 @@ void RunMessageLoop() { run_loop_.Run(); } private: - base::MessageLoop message_loop_; + base::test::ScopedTaskEnvironment scoped_task_environment_; base::RunLoop run_loop_; base::MemoryPressureListener::MemoryPressureLevel memory_pressure_level_; std::unique_ptr<base::MemoryPressureListener> memory_pressure_listener_;
diff --git a/ios/chrome/app/strings/resources/ios_strings_am.xtb b/ios/chrome/app/strings/resources/ios_strings_am.xtb index ca7ae27..42351656 100644 --- a/ios/chrome/app/strings/resources/ios_strings_am.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_am.xtb
@@ -25,6 +25,7 @@ <translation id="1254117744268754948">አቃፊ ይምረጡ</translation> <translation id="1265739287306757398">እንዴት እንደሆነ ይወቁ</translation> <translation id="1272079795634619415">አቁም</translation> +<translation id="1283524564873030414">ባለፉት 24 ሰዓቶች</translation> <translation id="1323735185997015385">ሰርዝ</translation> <translation id="132683371494960526">የቀድሞ አቃፊውን ለመለወጥ ሁለቴ መታ ያድርጉ።</translation> <translation id="1340643665687018190">ምናሌን ዝጋ</translation> @@ -79,6 +80,7 @@ <translation id="1974060860693918893">የላቀ</translation> <translation id="1989112275319619282">አስስ</translation> <translation id="2015722694326466240">የይለፍ ቃላትን ለመመልከት በመጀመሪያ በመሣሪያዎ ላይ የይለፍ ኮድ ማዘጋጀት አለብዎት።</translation> +<translation id="2073572773299281212">ገባሪ ከ<ph name="DAYS" /> ቀናት በፊት</translation> <translation id="2074131957428911366">በማንኛውም ጊዜ ምን እንደሚያሳምሩ በ<ph name="BEGIN_LINK" />ቅንብሮች<ph name="END_LINK" /> ውስጥ መምረጥ ይችላሉ።</translation> <translation id="2079545284768500474">ቀልብስ</translation> <translation id="209018056901015185">የዴስክቶፕ ጣቢያን ጠይቅ</translation> @@ -113,6 +115,7 @@ <translation id="2529021024822217800">ሁሉንም ክፈት</translation> <translation id="2570206273416014374">ፍለጋዎችን ከአድራሻ አሞሌው እና ከፍለጋ ሳጥኑ እና አንዳንድ ኩኪዎችን ወደ ነባሪው የፍለጋ ፕሮግራምዎ ይልካል።</translation> <translation id="2572712655377361602">አንድ የመሣሪያ መመሪያ የፎቶዎችዎን መዳረሻ አግዷል</translation> +<translation id="2578571896248130439">ድረ-ገጽ ይላኩ</translation> <translation id="2584132361465095047">መለያ አክል…</translation> <translation id="2625189173221582860">የይለፍ ቃል ተቀድቷል።</translation> <translation id="2648803196158606475">የተነበቡትን ሰርዝ</translation> @@ -152,6 +155,7 @@ <translation id="3112556859945124369">ምልክት አድርግበት…</translation> <translation id="3157684681743766797">ሁሉንም ምልክት አድርግባቸው…</translation> <translation id="3175081911749765310">የድር አገልግሎቶች</translation> +<translation id="3178650076442119961">ገባሪ ዛሬ</translation> <translation id="3207960819495026254">ዕልባት ተደርጎበታል</translation> <translation id="3224641773458703735">የይለፍ ቃላትን ወደ ውጭ ለመላክ በመጀመሪያ በመሣሪያዎ ላይ የይለፍ ኮድ ማዘጋጀት አለብዎት።</translation> <translation id="3240426699337459095">አገናኝ ተቀድቷል</translation> @@ -226,6 +230,7 @@ <translation id="4272631900155121838">የQR ኮድን ለመቃኘት፣ ካሜራውን በቅንብሮች ውስጥ ያንቁ</translation> <translation id="4281844954008187215">የአግልግሎት ውል</translation> <translation id="430793432425771671">ሁሉንም ያመሳስሉ</translation> +<translation id="430967081421617822">የምንጊዜም</translation> <translation id="4338650699862464074">የሚጎበኟቸው የገጾች ዩአርኤሎችን ወደ Google ይላኩ።</translation> <translation id="4359125752503270327">ይህ ገጽ በሌላ መተግበሪያ ውስጥ ይከፈታል።</translation> <translation id="4370827530403103842">ስምረት እየሠራ አይደለም። ለማስተካከል መታ ያድርጉ።</translation> @@ -281,6 +286,7 @@ <translation id="5127805178023152808">አመሳስል ጠፍቷል</translation> <translation id="5132942445612118989">የእርስዎን የይለፍ ቃላት፣ ታሪክ እና ተጨማሪ ነገሮች በሁሉም መሣሪያዎች ላይ ያስምሩ</translation> <translation id="5140288047769711648">Chrome ይህን የይለፍ ቃል ለእርስዎ ያስታውሳል። እርስዎ ማስታወስ አያስፈልግዎትም።</translation> +<translation id="5150492518600715772">ወደ የእርስዎ መሣሪያ ይላኩ</translation> <translation id="5181140330217080051">በማውረድ ላይ</translation> <translation id="5186185447130319458">የግል</translation> <translation id="5190835502935405962">የዕልባቶች አሞሌ</translation> @@ -295,6 +301,7 @@ <translation id="5327248766486351172">ስም</translation> <translation id="5388358297987318779">ምስል ክፈት</translation> <translation id="5409365236829784218">ይህን ፋይል መክፈት የሚችሉ መተግበሪያዎች አልተጫኑም።</translation> +<translation id="5416022985862681400">ባለፉት 7 ቀኖች</translation> <translation id="5433691172869980887">የተጠቃሚ ስም ተቀድቷል</translation> <translation id="54401264925851789">የገጽ ደህንነት መረጃ</translation> <translation id="5443952882982198570">ክሬዲት ካርዶች</translation> @@ -309,6 +316,7 @@ <translation id="5659593005791499971">ኢሜይል</translation> <translation id="5669528293118408608">www</translation> <translation id="567881659373499783">ስሪት <ph name="PRODUCT_VERSION" /></translation> +<translation id="5706552126692816153">1 ቀን በፊት ንቁ ነበር</translation> <translation id="5711039611392265845">ከግላዊነት፣ ደህንነት እና የውሂብ ስብስብ ጋር ለሚዛመዱ ተጨማሪ ቅንብሮች <ph name="BEGIN_LINK" />ስምረት እና የGoogle አገልግሎቶች<ph name="END_LINK" /></translation> <translation id="5728700505257787410">ይቅርታ፣ ወደ መለያዎ መግባት ላይ ችግር ነበር።</translation> <translation id="5737974891429562743">የመለያ መግቢያ ዝርዝሮች ጊዜ ያለፈባቸው ናቸው። ስምረትን ለመጀመር ያዘምኑ።</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ar.xtb b/ios/chrome/app/strings/resources/ios_strings_ar.xtb index 72ea9ce..c607cfa 100644 --- a/ios/chrome/app/strings/resources/ios_strings_ar.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_ar.xtb
@@ -499,6 +499,7 @@ <translation id="8532105204136943229">عام انتهاء الصلاحية</translation> <translation id="8534481786647257214">اكتمل النشر على Google+.</translation> <translation id="8548878600947630424">بحث في الصفحة...</translation> +<translation id="8583866649835978847">يُرجى إرسال <ph name="TITLE" /> إلى أحد أجهزتك.</translation> <translation id="8605219856220328675">إغلاق علامة التبويب.</translation> <translation id="8620640915598389714">تعديل</translation> <translation id="8636825310635137004">للحصول على علامات التبويب من أجهزتك الأخرى، شغِّل المزامنة.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_bg.xtb b/ios/chrome/app/strings/resources/ios_strings_bg.xtb index 8581867..da0c8c8 100644 --- a/ios/chrome/app/strings/resources/ios_strings_bg.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_bg.xtb
@@ -25,6 +25,7 @@ <translation id="1254117744268754948">Избор на папка</translation> <translation id="1265739287306757398">Научете как</translation> <translation id="1272079795634619415">Стоп</translation> +<translation id="1283524564873030414">Последните 24 часа</translation> <translation id="1323735185997015385">Изтриване</translation> <translation id="132683371494960526">Докоснете двукратно, за да промените главната папка.</translation> <translation id="1340643665687018190">Затваряне на менюто</translation> @@ -79,6 +80,7 @@ <translation id="1974060860693918893">Разширени</translation> <translation id="1989112275319619282">Сърфиране</translation> <translation id="2015722694326466240">За да видите паролите, трябва първо да зададете код за достъп на устройството си.</translation> +<translation id="2073572773299281212">Активно преди <ph name="DAYS" /> дни</translation> <translation id="2074131957428911366">Винаги можете да изберете какво да се синхронизира от <ph name="BEGIN_LINK" />настройките<ph name="END_LINK" />.</translation> <translation id="2079545284768500474">Отмяна</translation> <translation id="209018056901015185">Заявка за настолния сайт</translation> @@ -113,6 +115,7 @@ <translation id="2529021024822217800">Отваряне на всички</translation> <translation id="2570206273416014374">Изпраща някои „бисквитки“ и заявките за търсене от адресната лента и полето за търсене до стандартната ви търсеща машина.</translation> <translation id="2572712655377361602">Достъпът до снимките ви е блокиран от правило за устройства</translation> +<translation id="2578571896248130439">Изпращане на уеб страницата</translation> <translation id="2584132361465095047">Добавяне на профил…</translation> <translation id="2625189173221582860">Паролата е копирана</translation> <translation id="2648803196158606475">Изтриване на прочетените</translation> @@ -152,6 +155,7 @@ <translation id="3112556859945124369">Означаване…</translation> <translation id="3157684681743766797">Означаване на всички…</translation> <translation id="3175081911749765310">Уеб услуги</translation> +<translation id="3178650076442119961">Активно днес</translation> <translation id="3207960819495026254">С отметка</translation> <translation id="3224641773458703735">За да експортирате паролите, трябва първо да зададете код за достъп на устройството си.</translation> <translation id="3240426699337459095">Връзката е копирана</translation> @@ -226,6 +230,7 @@ <translation id="4272631900155121838">За да сканирате код за бърза реакция, активирайте камерата от настройките</translation> <translation id="4281844954008187215">Условия за ползване</translation> <translation id="430793432425771671">Синхронизиране на всичко</translation> +<translation id="430967081421617822">За цялото време</translation> <translation id="4338650699862464074">Изпраща до Google URL адресите на посещаваните от вас страници.</translation> <translation id="4359125752503270327">Тази страница ще се отвори в друго приложение.</translation> <translation id="4370827530403103842">Синхронизирането не работи. Докоснете, за да отстраните проблема.</translation> @@ -281,6 +286,7 @@ <translation id="5127805178023152808">Синхронизирането е изключено</translation> <translation id="5132942445612118989">Синхронизиране на паролите, историята ви и др. на всички устройства</translation> <translation id="5140288047769711648">Chrome ще запамети тази парола. Няма нужда да я помните.</translation> +<translation id="5150492518600715772">Изпращане до устройството ви</translation> <translation id="5181140330217080051">Изтегля се</translation> <translation id="5186185447130319458">Частно</translation> <translation id="5190835502935405962">Лента на отметките</translation> @@ -295,6 +301,7 @@ <translation id="5327248766486351172">Име</translation> <translation id="5388358297987318779">Отваряне на изображението</translation> <translation id="5409365236829784218">Няма инсталирани приложения, които могат да отворят файла.</translation> +<translation id="5416022985862681400">Последните 7 дни</translation> <translation id="5433691172869980887">Потребителското име е копирано</translation> <translation id="54401264925851789">Информация за сигурността на страницата</translation> <translation id="5443952882982198570">Кредитни карти</translation> @@ -309,6 +316,7 @@ <translation id="5659593005791499971">Имейл</translation> <translation id="5669528293118408608">www</translation> <translation id="567881659373499783">Версия <ph name="PRODUCT_VERSION" /></translation> +<translation id="5706552126692816153">Активно преди 1 ден</translation> <translation id="5711039611392265845">За още настройки за поверителността, сигурността и събирането на данни вижте <ph name="BEGIN_LINK" />Синхронизиране и услуги на Google<ph name="END_LINK" />.</translation> <translation id="5728700505257787410">За съжаление при влизането в профила ви възникна проблем.</translation> <translation id="5737974891429562743">Данните за вход в профила не са актуални. Актуализирайте ги, за да започне синхронизирането.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_bn.xtb b/ios/chrome/app/strings/resources/ios_strings_bn.xtb index d609eac..722c91a9 100644 --- a/ios/chrome/app/strings/resources/ios_strings_bn.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_bn.xtb
@@ -25,6 +25,7 @@ <translation id="1254117744268754948">ফোল্ডার বেছে নিন</translation> <translation id="1265739287306757398">কীভাবে করবেন জানুন</translation> <translation id="1272079795634619415">বন্ধ</translation> +<translation id="1283524564873030414">গত ২৪ ঘণ্টা</translation> <translation id="1323735185997015385">মুছুন</translation> <translation id="132683371494960526">মূল ফোল্ডার পরিবর্তন করতে দুবার আলতো চাপুন।</translation> <translation id="1340643665687018190">মেনু বন্ধ করুন</translation> @@ -79,6 +80,7 @@ <translation id="1974060860693918893">উন্নত</translation> <translation id="1989112275319619282">ব্রাউজ করুন</translation> <translation id="2015722694326466240">পাসওয়ার্ড দেখার জন্য আপনার ডিভাইসে আপনাকে অবশ্যই একটি পাসকোড সেট করতে হবে।</translation> +<translation id="2073572773299281212"><ph name="DAYS" /> দিন আগে ব্যবহার করা হয়েছে</translation> <translation id="2074131957428911366"><ph name="BEGIN_LINK" />সেটিংসে<ph name="END_LINK" /> কী সিঙ্ক করা হবে তা আপনি সবসময় বেছে নিতে পারেন।</translation> <translation id="2079545284768500474">আগের অবস্থায় ফিরুন</translation> <translation id="209018056901015185">ডেস্কটপ সাইট অনুরোধ করুন</translation> @@ -113,6 +115,7 @@ <translation id="2529021024822217800">সবকটি খুলুন</translation> <translation id="2570206273416014374">অ্যাড্রেস বার ও সার্চ বক্স থেকে সার্চের তথ্য এবং কিছু কুকি আপনার ডিফল্ট সার্চ ইঞ্জিনে পাঠায়।</translation> <translation id="2572712655377361602">একটি ডিভাইস নীতি আপনার ফটোতে অ্যাক্সেস অবরুদ্ধ করেছে</translation> +<translation id="2578571896248130439">ওয়েবপেজ পাঠান</translation> <translation id="2584132361465095047">অ্যাকাউন্ট যোগ করুন...</translation> <translation id="2625189173221582860">পাসওয়ার্ড কপি করা হয়েছে</translation> <translation id="2648803196158606475">’পড়া হয়েছে’ মুছুন</translation> @@ -152,6 +155,7 @@ <translation id="3112556859945124369">চিহ্নিত করুন…</translation> <translation id="3157684681743766797">সবগুলি চিহ্নিত করুন…</translation> <translation id="3175081911749765310">ওয়েব পরিষেবা</translation> +<translation id="3178650076442119961">আজ ব্যবহার করা হয়েছে</translation> <translation id="3207960819495026254">বুকমার্ক করা হয়েছে</translation> <translation id="3224641773458703735">পাসওয়ার্ড এক্সপোর্ট করার জন্য আপনার ডিভাইসে আপনাকে অবশ্যই একটি পাসকোড সেট করতে হবে।</translation> <translation id="3240426699337459095">লিঙ্ক কপি করা হয়েছে</translation> @@ -226,6 +230,7 @@ <translation id="4272631900155121838">একটি QR কোড স্ক্যান করতে, সেটিংস থেকে ক্যামেরা চালু করুন</translation> <translation id="4281844954008187215">পরিষেবার শর্তাদি</translation> <translation id="430793432425771671">সবকিছু সিঙ্ক করুন</translation> +<translation id="430967081421617822">সব সময়</translation> <translation id="4338650699862464074">আপনার দেখা পৃষ্ঠাগুলির ইউআরএল Google-এ পাঠায়।</translation> <translation id="4359125752503270327">এই পৃষ্ঠাটি আরেকটি অ্যাপ্লিকেশানে খুলবে।</translation> <translation id="4370827530403103842">সিঙ্ক কাজ করছে না। ঠিক করতে আলতো চাপুন।</translation> @@ -281,6 +286,7 @@ <translation id="5127805178023152808">সিঙ্ক বন্ধ রয়েছে</translation> <translation id="5132942445612118989">সমস্ত ডিভাইসে আপনার পাসওয়ার্ড, ইতিহাস ও আরও অনেক কিছু সিঙ্ক করুন</translation> <translation id="5140288047769711648">Chrome আপনার জন্য এই পাসওয়ার্ড মনে রাখবে। আপনাকে এটি মনে রাখতে হবে না।</translation> +<translation id="5150492518600715772">আপনার অন্য ডিভাইসে পাঠান</translation> <translation id="5181140330217080051">ডাউনলোড হচ্ছে</translation> <translation id="5186185447130319458">ব্যক্তিগত</translation> <translation id="5190835502935405962">বুকমার্ক বার</translation> @@ -295,6 +301,7 @@ <translation id="5327248766486351172">নাম</translation> <translation id="5388358297987318779">ইমেজ খুলুন</translation> <translation id="5409365236829784218">এই ফাউলটি খুলতে পারে এমন কোনো অ্যাপ্লিকেশন এখানে ডাউনলোড করা নেই৷</translation> +<translation id="5416022985862681400">গত ৭ দিনে</translation> <translation id="5433691172869980887">ইউজারনেম কপি করা হয়েছে</translation> <translation id="54401264925851789">পৃষ্ঠা নিরাপত্তা তথ্য</translation> <translation id="5443952882982198570">ক্রেডিট কার্ড</translation> @@ -310,6 +317,7 @@ <translation id="5659593005791499971">ইমেল আইডি</translation> <translation id="5669528293118408608">www</translation> <translation id="567881659373499783">ভার্সন <ph name="PRODUCT_VERSION" /></translation> +<translation id="5706552126692816153">১ দিন আগে ব্যবহার করা হয়েছে</translation> <translation id="5711039611392265845">আপনার গোপনীয়তা, নিরাপত্তা ও ডেটা সংগ্রহের সাথে সম্পর্কিত আরও সেটিংসের জন্য <ph name="BEGIN_LINK" />সিঙ্ক এবং Google পরিষেবা<ph name="END_LINK" /> দেখুন।</translation> <translation id="5728700505257787410">দুঃখিত, আপনার অ্যাকাউন্টে সাইন-ইন করার সময় একটি সমস্যা হয়েছে৷</translation> <translation id="5737974891429562743">অ্যাকাউন্ট সাইন-ইনের বিশদ বিবরণ পুরনো হয়ে গেছে। সিঙ্ক শুরু করার জন্য আপডেট করুন।</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ca.xtb b/ios/chrome/app/strings/resources/ios_strings_ca.xtb index ecfc46c..c3b13b2a 100644 --- a/ios/chrome/app/strings/resources/ios_strings_ca.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_ca.xtb
@@ -25,6 +25,7 @@ <translation id="1254117744268754948">Tria la carpeta</translation> <translation id="1265739287306757398">Més informació</translation> <translation id="1272079795634619415">Atura</translation> +<translation id="1283524564873030414">24 darreres hores</translation> <translation id="1323735185997015385">Suprimeix</translation> <translation id="132683371494960526">Feu doble toc per canviar la carpeta principal.</translation> <translation id="1340643665687018190">Tanca el menú</translation> @@ -79,6 +80,7 @@ <translation id="1974060860693918893">Configuració avançada</translation> <translation id="1989112275319619282">Examina</translation> <translation id="2015722694326466240">Per veure les contrasenyes, primer has d'establir una contrasenya al dispositiu.</translation> +<translation id="2073572773299281212">Actiu fa <ph name="DAYS" /> dies</translation> <translation id="2074131957428911366">Sempre pots anar a la <ph name="BEGIN_LINK" />configuració<ph name="END_LINK" /> per decidir què vols sincronitzar.</translation> <translation id="2079545284768500474">Desfés</translation> <translation id="209018056901015185">Mostra com a ordinador</translation> @@ -113,6 +115,7 @@ <translation id="2529021024822217800">Obre-les totes</translation> <translation id="2570206273416014374">Envia al motor de cerca predeterminat algunes galetes i cerques de la barra d'adreces i del quadre de cerca.</translation> <translation id="2572712655377361602">Una política del dispositiu ha bloquejat l'accés a les vostres fotos</translation> +<translation id="2578571896248130439">Envia la pàgina web</translation> <translation id="2584132361465095047">Afegiu un compte…</translation> <translation id="2625189173221582860">S'ha copiat la contrasenya</translation> <translation id="2648803196158606475">Suprimeix els elements llegits</translation> @@ -152,6 +155,7 @@ <translation id="3112556859945124369">Marca com a…</translation> <translation id="3157684681743766797">Marca-ho tot com a…</translation> <translation id="3175081911749765310">Serveis web</translation> +<translation id="3178650076442119961">Actiu avui</translation> <translation id="3207960819495026254">S'ha afegit a les adreces d'interès.</translation> <translation id="3224641773458703735">Per exportar les contrasenyes, primer has d'establir una contrasenya al dispositiu.</translation> <translation id="3240426699337459095">S'ha copiat l'enllaç.</translation> @@ -226,6 +230,7 @@ <translation id="4272631900155121838">Per poder escanejar un codi QR, activa la càmera a la configuració</translation> <translation id="4281844954008187215">Termes i condicions</translation> <translation id="430793432425771671">Sincronitza-ho tot</translation> +<translation id="430967081421617822">Des de sempre</translation> <translation id="4338650699862464074">Envia a Google els URL de les pàgines que visites.</translation> <translation id="4359125752503270327">Aquesta pàgina s'obrirà en una altra aplicació.</translation> <translation id="4370827530403103842">La sincronització no funciona. Toqueu per solucionar-ho.</translation> @@ -281,6 +286,7 @@ <translation id="5127805178023152808">Sincronització desactivada</translation> <translation id="5132942445612118989">Sincronitza les contrasenyes, l'historial i altres elements en tots els dispositius</translation> <translation id="5140288047769711648">Chrome recordarà aquesta contrasenya. No cal que la memoritzis.</translation> +<translation id="5150492518600715772">Envia al teu dispositiu</translation> <translation id="5181140330217080051">S'està baixant</translation> <translation id="5186185447130319458">Privat</translation> <translation id="5190835502935405962">Barra d'adreces d'interès</translation> @@ -295,6 +301,7 @@ <translation id="5327248766486351172">Nom</translation> <translation id="5388358297987318779">Obre una imatge</translation> <translation id="5409365236829784218">Cap aplicació instal·lada no pot obrir el fitxer.</translation> +<translation id="5416022985862681400">7 darrers dies</translation> <translation id="5433691172869980887">S'ha copiat el nom d'usuari</translation> <translation id="54401264925851789">Informació de seguretat de la pàgina</translation> <translation id="5443952882982198570">Targetes de crèdit</translation> @@ -309,6 +316,7 @@ <translation id="5659593005791499971">Correu electrònic</translation> <translation id="5669528293118408608">www</translation> <translation id="567881659373499783">Versió <ph name="PRODUCT_VERSION" /></translation> +<translation id="5706552126692816153">Actiu fa 1 dia</translation> <translation id="5711039611392265845">Per trobar més opcions de configuració relacionades amb la privadesa, la seguretat i la recollida de dades, consulta <ph name="BEGIN_LINK" />Sincronització i serveis de Google<ph name="END_LINK" />.</translation> <translation id="5728700505257787410">S'ha produït un problema en iniciar la sessió al vostre compte.</translation> <translation id="5737974891429562743">Actualitza les dades d'inici de sessió del compte per iniciar la sincronització.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_cs.xtb b/ios/chrome/app/strings/resources/ios_strings_cs.xtb index 3cae1ca4..3aa51da 100644 --- a/ios/chrome/app/strings/resources/ios_strings_cs.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_cs.xtb
@@ -25,6 +25,7 @@ <translation id="1254117744268754948">Výběr složky</translation> <translation id="1265739287306757398">Postup</translation> <translation id="1272079795634619415">Zastavit</translation> +<translation id="1283524564873030414">Posledních 24 hodin</translation> <translation id="1323735185997015385">Smazat</translation> <translation id="132683371494960526">Dvojitým klepnutím změníte nadřazenou složku.</translation> <translation id="1340643665687018190">Zavřít nabídku</translation> @@ -79,6 +80,7 @@ <translation id="1974060860693918893">Rozšířená nastavení</translation> <translation id="1989112275319619282">Procházet</translation> <translation id="2015722694326466240">Chcete-li zobrazit hesla, musíte nejdříve na zařízení nastavit heslo.</translation> +<translation id="2073572773299281212">Aktivní před tímto počtem dní: <ph name="DAYS" /></translation> <translation id="2074131957428911366">Synchronizované položky můžete kdykoliv vybrat v <ph name="BEGIN_LINK" />nastavení<ph name="END_LINK" />.</translation> <translation id="2079545284768500474">Vrátit zpět</translation> <translation id="209018056901015185">Verze webu pro PC</translation> @@ -113,6 +115,7 @@ <translation id="2529021024822217800">Otevřít vše</translation> <translation id="2570206273416014374">Odesílá soubory cookie a vyhledávací dotazy z adresního řádku a vyhledávacího pole a několik souborů cookie vašemu výchozímu vyhledávači.</translation> <translation id="2572712655377361602">Přístup k vašim fotkám blokují zásady zařízení.</translation> +<translation id="2578571896248130439">Odeslat webovou stránku</translation> <translation id="2584132361465095047">Přidat účet...</translation> <translation id="2625189173221582860">Heslo bylo zkopírováno</translation> <translation id="2648803196158606475">Smazat přečtené</translation> @@ -152,6 +155,7 @@ <translation id="3112556859945124369">Označit…</translation> <translation id="3157684681743766797">Označit vše…</translation> <translation id="3175081911749765310">Webové služby</translation> +<translation id="3178650076442119961">Aktivní dnes</translation> <translation id="3207960819495026254">Přidáno do záložek</translation> <translation id="3224641773458703735">Chcete-li exportovat hesla, musíte nejdříve na zařízení nastavit heslo.</translation> <translation id="3240426699337459095">Odkaz byl zkopírován</translation> @@ -226,6 +230,7 @@ <translation id="4272631900155121838">Chcete-li naskenovat QR kód, povolte v nastavení fotoaparát</translation> <translation id="4281844954008187215">Smluvní podmínky</translation> <translation id="430793432425771671">Synchronizovat vše</translation> +<translation id="430967081421617822">Od počátku věků</translation> <translation id="4338650699862464074">Odesílá do Googlu adresy URL navštívených stránek.</translation> <translation id="4359125752503270327">Tato stránka se otevře v jiné aplikaci.</translation> <translation id="4370827530403103842">Synchronizace nefunguje. Problém odstraníte klepnutím.</translation> @@ -281,6 +286,7 @@ <translation id="5127805178023152808">Synchronizace je vypnuta</translation> <translation id="5132942445612118989">Vaše hesla, historie a další údaje na všech zařízeních</translation> <translation id="5140288047769711648">Chrome si pro vás toto heslo zapamatuje. Vy si ho pamatovat nemusíte.</translation> +<translation id="5150492518600715772">Odeslat na vaše zařízení</translation> <translation id="5181140330217080051">Stahování</translation> <translation id="5186185447130319458">Soukromé</translation> <translation id="5190835502935405962">Lišta záložek</translation> @@ -295,6 +301,7 @@ <translation id="5327248766486351172">Jméno</translation> <translation id="5388358297987318779">Otevřít obrázek</translation> <translation id="5409365236829784218">Nemáte nainstalovanou žádnou aplikaci, která by tento soubor uměla otevřít.</translation> +<translation id="5416022985862681400">Posledních 7 dnů</translation> <translation id="5433691172869980887">Uživatelské jméno bylo zkopírováno</translation> <translation id="54401264925851789">Informace o zabezpečení stránky</translation> <translation id="5443952882982198570">Platební karty</translation> @@ -309,6 +316,7 @@ <translation id="5659593005791499971">E-mail</translation> <translation id="5669528293118408608">www</translation> <translation id="567881659373499783">Verze <ph name="PRODUCT_VERSION" /></translation> +<translation id="5706552126692816153">Aktivní včera</translation> <translation id="5711039611392265845">Další nastavení související s ochranou soukromí, zabezpečením a shromažďováním dat naleznete v části <ph name="BEGIN_LINK" />Synchronizace a služby Google<ph name="END_LINK" />.</translation> <translation id="5728700505257787410">Litujeme, při přihlašování k vašemu účtu se vyskytl problém.</translation> <translation id="5737974891429562743">Přihlašovací údaje k účtu jsou zastaralé. Chcete-li zahájit synchronizaci, aktualizujte je.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_el.xtb b/ios/chrome/app/strings/resources/ios_strings_el.xtb index 71218506..36e7959d 100644 --- a/ios/chrome/app/strings/resources/ios_strings_el.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_el.xtb
@@ -25,6 +25,7 @@ <translation id="1254117744268754948">Επιλογή φακέλου</translation> <translation id="1265739287306757398">Μάθετε με ποιον τρόπο</translation> <translation id="1272079795634619415">Διακοπή</translation> +<translation id="1283524564873030414">Τελευταίες 24 ώρες</translation> <translation id="1323735185997015385">Διαγραφή</translation> <translation id="132683371494960526">Πατήστε δύο φορές για να αλλάξετε τον γονικό φάκελο.</translation> <translation id="1340643665687018190">Κλείσιμο μενού</translation> @@ -79,6 +80,7 @@ <translation id="1974060860693918893">Σύνθετες</translation> <translation id="1989112275319619282">Περιήγηση</translation> <translation id="2015722694326466240">Για να δείτε τους κωδικούς πρόσβασης, θα πρέπει πρώτα να ορίσετε έναν κωδικό πρόσβασης για τη συσκευή σας.</translation> +<translation id="2073572773299281212">Ενεργή <ph name="DAYS" /> ημέρες πριν</translation> <translation id="2074131957428911366">Μπορείτε πάντα να επιλέξετε τα στοιχεία που θέλετε να συγχρονίσετε στις <ph name="BEGIN_LINK" />ρυθμίσεις<ph name="END_LINK" />.</translation> <translation id="2079545284768500474">Αναίρεση</translation> <translation id="209018056901015185">Αίτηση ιστότ. για υπολογ.</translation> @@ -113,6 +115,7 @@ <translation id="2529021024822217800">Άνοιγμα όλων</translation> <translation id="2570206273416014374">Αποστέλλει ορισμένα cookie και αναζητήσεις από τη γραμμή διευθύνσεων και το πλαίσιο αναζήτησης στην προεπιλεγμένη μηχανή αναζήτησης.</translation> <translation id="2572712655377361602">Μια πολιτική συσκευής απέκλεισε την πρόσβαση στις φωτογραφίες σας</translation> +<translation id="2578571896248130439">Αποστολή ιστοσελίδας</translation> <translation id="2584132361465095047">Προσθήκη λογαριασμού…</translation> <translation id="2625189173221582860">Ο κωδικός πρόσβασης αντιγράφηκε</translation> <translation id="2648803196158606475">Διαγραφή αναγνωσμένων</translation> @@ -152,6 +155,7 @@ <translation id="3112556859945124369">Επισήμανση…</translation> <translation id="3157684681743766797">Επισήμανση όλων…</translation> <translation id="3175081911749765310">Υπηρ.ιστού</translation> +<translation id="3178650076442119961">Ενεργή σήμερα</translation> <translation id="3207960819495026254">Προστέθηκε στους σελιδοδείκτες</translation> <translation id="3224641773458703735">Για να εξαγάγετε τους κωδικούς πρόσβασης, θα πρέπει πρώτα να ορίσετε έναν κωδικό πρόσβασης στη συσκευή σας.</translation> <translation id="3240426699337459095">Ο σύνδεσμος αντιγράφηκε</translation> @@ -226,6 +230,7 @@ <translation id="4272631900155121838">Για να σαρώσετε έναν κώδικα QR, ενεργοποιήστε την κάμερα από τις ρυθμίσεις</translation> <translation id="4281844954008187215">Όροι Παροχής Υπηρεσιών</translation> <translation id="430793432425771671">Συγχρονισμός όλων</translation> +<translation id="430967081421617822">Από την αρχή</translation> <translation id="4338650699862464074">Αποστέλλει στην Google URL των σελίδων που επισκέπτεστε.</translation> <translation id="4359125752503270327">Αυτή η σελίδα θα ανοίξει σε άλλη εφαρμογή.</translation> <translation id="4370827530403103842">Ο συγχρονισμός δεν λειτουργεί. Πατήστε για επιδιόρθωση.</translation> @@ -281,6 +286,7 @@ <translation id="5127805178023152808">Ο συγχρονισμός είναι απενεργοποιημένος</translation> <translation id="5132942445612118989">Συγχρονίστε κωδικούς πρόσβασης, ιστορικό και πολλά άλλα σε όλες τις συσκευές</translation> <translation id="5140288047769711648">Το Chrome θα απομνημονεύσει αυτόν τον κωδικό πρόσβασης για εσάς. Δεν χρειάζεται να τον θυμάστε.</translation> +<translation id="5150492518600715772">Αποστολή στη συσκευή σας</translation> <translation id="5181140330217080051">Λήψη</translation> <translation id="5186185447130319458">Ιδιωτικό</translation> <translation id="5190835502935405962">Γραμμή σελιδοδεικτών</translation> @@ -295,6 +301,7 @@ <translation id="5327248766486351172">Όνομα</translation> <translation id="5388358297987318779">Άνοιγμα εικόνας</translation> <translation id="5409365236829784218">Δεν υπάρχουν εγκατεστ. εφαρμογές για το άνοιγμα του αρχείου</translation> +<translation id="5416022985862681400">Τελευταίες 7 ημέρες</translation> <translation id="5433691172869980887">Το όνομα χρήστη αντιγράφηκε</translation> <translation id="54401264925851789">Πληροφορίες ασφάλειας σελίδας</translation> <translation id="5443952882982198570">Πιστωτικές κάρτες</translation> @@ -309,6 +316,7 @@ <translation id="5659593005791499971">Διεύθυνση ηλεκτρονικού ταχυδρομείου</translation> <translation id="5669528293118408608">www</translation> <translation id="567881659373499783">Έκδοση <ph name="PRODUCT_VERSION" /></translation> +<translation id="5706552126692816153">Ενεργή 1 ημέρα πριν</translation> <translation id="5711039611392265845">Για περισσότερες ρυθμίσεις που σχετίζονται με το απόρρητο, την ασφάλεια και τη συλλογή δεδομένων, ανατρέξτε στην ενότητα <ph name="BEGIN_LINK" />Συγχρονισμός και υπηρεσίες Google<ph name="END_LINK" />.</translation> <translation id="5728700505257787410">Παρουσιάστηκε πρόβλημα με τη σύνδεση στον λογαριασμό σας.</translation> <translation id="5737974891429562743">Τα στοιχεία σύνδεσης λογαριασμού δεν είναι ενημερωμένα. Ενημερώστε τα για να ξεκινήσει ο συγχρονισμός.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_en-GB.xtb b/ios/chrome/app/strings/resources/ios_strings_en-GB.xtb index ef0b7012..c3fa5302 100644 --- a/ios/chrome/app/strings/resources/ios_strings_en-GB.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_en-GB.xtb
@@ -25,6 +25,7 @@ <translation id="1254117744268754948">Choose Folder</translation> <translation id="1265739287306757398">Learn How</translation> <translation id="1272079795634619415">Stop</translation> +<translation id="1283524564873030414">Last 24 hours</translation> <translation id="1323735185997015385">Delete</translation> <translation id="132683371494960526">Double tap to change the parent folder.</translation> <translation id="1340643665687018190">Close menu</translation> @@ -79,6 +80,7 @@ <translation id="1974060860693918893">Advanced</translation> <translation id="1989112275319619282">Browse</translation> <translation id="2015722694326466240">To see passwords, you must first set a passcode on your device.</translation> +<translation id="2073572773299281212">Active <ph name="DAYS" /> days ago</translation> <translation id="2074131957428911366">You can always choose what to sync in <ph name="BEGIN_LINK" />settings<ph name="END_LINK" />.</translation> <translation id="2079545284768500474">Undo</translation> <translation id="209018056901015185">Request Desktop Site</translation> @@ -113,6 +115,7 @@ <translation id="2529021024822217800">Open All</translation> <translation id="2570206273416014374">Sends some cookies and searches from the address bar and search box to your default search engine.</translation> <translation id="2572712655377361602">A device policy blocked access to your photos</translation> +<translation id="2578571896248130439">Send Web Page</translation> <translation id="2584132361465095047">Add Account…</translation> <translation id="2625189173221582860">Password copied</translation> <translation id="2648803196158606475">Delete Read</translation> @@ -152,6 +155,7 @@ <translation id="3112556859945124369">Mark…</translation> <translation id="3157684681743766797">Mark All…</translation> <translation id="3175081911749765310">Web Services</translation> +<translation id="3178650076442119961">Active today</translation> <translation id="3207960819495026254">Bookmarked</translation> <translation id="3224641773458703735">To export passwords, you must first set a passcode on your device.</translation> <translation id="3240426699337459095">Link copied</translation> @@ -226,6 +230,7 @@ <translation id="4272631900155121838">To scan a QR code, enable the camera from settings</translation> <translation id="4281844954008187215">Terms of Service</translation> <translation id="430793432425771671">Sync Everything</translation> +<translation id="430967081421617822">All time</translation> <translation id="4338650699862464074">Sends URLs of pages that you visit to Google.</translation> <translation id="4359125752503270327">This page will open in another application.</translation> <translation id="4370827530403103842">Sync isn't working. Tap to fix.</translation> @@ -281,6 +286,7 @@ <translation id="5127805178023152808">Sync is off</translation> <translation id="5132942445612118989">Sync your passwords, history and more on all devices</translation> <translation id="5140288047769711648">Chrome will remember this password for you. You don't have to remember it.</translation> +<translation id="5150492518600715772">Send to your device</translation> <translation id="5181140330217080051">Downloading</translation> <translation id="5186185447130319458">Private</translation> <translation id="5190835502935405962">Bookmarks Bar</translation> @@ -295,6 +301,7 @@ <translation id="5327248766486351172">Name</translation> <translation id="5388358297987318779">Open Image</translation> <translation id="5409365236829784218">There are no applications installed that can open this file.</translation> +<translation id="5416022985862681400">Last 7 days</translation> <translation id="5433691172869980887">Username copied</translation> <translation id="54401264925851789">Page Security Info</translation> <translation id="5443952882982198570">Credit cards</translation> @@ -309,6 +316,7 @@ <translation id="5659593005791499971">Email</translation> <translation id="5669528293118408608">www</translation> <translation id="567881659373499783">Version <ph name="PRODUCT_VERSION" /></translation> +<translation id="5706552126692816153">Active 1 day ago</translation> <translation id="5711039611392265845">For more settings that relate to privacy, security and data collection, see <ph name="BEGIN_LINK" />Sync and Google Services<ph name="END_LINK" />.</translation> <translation id="5728700505257787410">Sorry, there was a problem signing in to your account.</translation> <translation id="5737974891429562743">Account sign-in details are out of date. Update to start sync.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_et.xtb b/ios/chrome/app/strings/resources/ios_strings_et.xtb index 14d52c2..0ddfa1d 100644 --- a/ios/chrome/app/strings/resources/ios_strings_et.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_et.xtb
@@ -25,6 +25,7 @@ <translation id="1254117744268754948">Kausta valimine</translation> <translation id="1265739287306757398">Lisateave</translation> <translation id="1272079795634619415">Peata</translation> +<translation id="1283524564873030414">Viimased 24 tundi</translation> <translation id="1323735185997015385">Kustuta</translation> <translation id="132683371494960526">Ülemkausta muutmiseks topeltpuudutage.</translation> <translation id="1340643665687018190">Sule menüü</translation> @@ -79,6 +80,7 @@ <translation id="1974060860693918893">Täpsemad</translation> <translation id="1989112275319619282">Sirvi</translation> <translation id="2015722694326466240">Paroolide nägemiseks peate oma seadmes esmalt pääsukoodi seadistama.</translation> +<translation id="2073572773299281212">Aktiivne <ph name="DAYS" /> päeva tagasi</translation> <translation id="2074131957428911366">Jaotises <ph name="BEGIN_LINK" />Seaded<ph name="END_LINK" /> saate igal ajal valida, mida sünkroonida.</translation> <translation id="2079545284768500474">Võta tagasi</translation> <translation id="209018056901015185">Taotle Desktopi saiti</translation> @@ -113,6 +115,7 @@ <translation id="2529021024822217800">Ava kõik</translation> <translation id="2570206273416014374">Saadab teie vaikeotsingumootorile mõned küpsisefailid ja otsingud teie aadressiribalt ning otsingukastist.</translation> <translation id="2572712655377361602">Seadme reegel blokeeris juurdepääsu teie fotodele</translation> +<translation id="2578571896248130439">Veebilehe saatmine</translation> <translation id="2584132361465095047">Lisa konto …</translation> <translation id="2625189173221582860">Parool on kopeeritud</translation> <translation id="2648803196158606475">Kustuta loetud</translation> @@ -152,6 +155,7 @@ <translation id="3112556859945124369">Märgi …</translation> <translation id="3157684681743766797">Märgi kõik …</translation> <translation id="3175081911749765310">Teenused</translation> +<translation id="3178650076442119961">Aktiivne täna</translation> <translation id="3207960819495026254">Järjehoidjatesse lisatud</translation> <translation id="3224641773458703735">Paroolide eksportimiseks peate oma seadmes esmalt pääsukoodi seadistama.</translation> <translation id="3240426699337459095">Link on kopeeritud</translation> @@ -226,6 +230,7 @@ <translation id="4272631900155121838">QR-koodi skannimiseks lubage seadetes kaamera</translation> <translation id="4281844954008187215">Teenusetingimused</translation> <translation id="430793432425771671">Sünkrooni kõik</translation> +<translation id="430967081421617822">Algusest</translation> <translation id="4338650699862464074">Saadab Google'ile teie külastatud lehtede URL-id.</translation> <translation id="4359125752503270327">See leht avatakse teises rakenduses.</translation> <translation id="4370827530403103842">Sünkroonimine ei tööta. Puudutage parandamiseks.</translation> @@ -281,6 +286,7 @@ <translation id="5127805178023152808">Sünkroonimine on välja lülitatud</translation> <translation id="5132942445612118989">Teie paroolide, ajaloo ja muude andmete sünkroonimine kõigis seadmetes</translation> <translation id="5140288047769711648">Chrome jätab selle parooli meelde. Teil ei ole vaja seda ise meelde jätta.</translation> +<translation id="5150492518600715772">Saada seadmesse</translation> <translation id="5181140330217080051">Allalaadimine</translation> <translation id="5186185447130319458">Privaatne</translation> <translation id="5190835502935405962">Järjehoidjariba</translation> @@ -295,6 +301,7 @@ <translation id="5327248766486351172">Nimi</translation> <translation id="5388358297987318779">Ava kujutis</translation> <translation id="5409365236829784218">Pole installitud rakendust, mis suudaks selle faili avada.</translation> +<translation id="5416022985862681400">Viimased 7 päeva</translation> <translation id="5433691172869980887">Kasutajanimi on kopeeritud</translation> <translation id="54401264925851789">Lehe turvateave</translation> <translation id="5443952882982198570">Krediitkaardid</translation> @@ -309,6 +316,7 @@ <translation id="5659593005791499971">Meil</translation> <translation id="5669528293118408608">www</translation> <translation id="567881659373499783">Versioon <ph name="PRODUCT_VERSION" /></translation> +<translation id="5706552126692816153">Aktiivne 1 päev tagasi</translation> <translation id="5711039611392265845">Privaatsuse, turvalisuse ning andmete kogumisega seotud lisaseadete nägemiseks avage valik <ph name="BEGIN_LINK" />Sünkroonimine ja Google'i teenused<ph name="END_LINK" />.</translation> <translation id="5728700505257787410">Kahjuks ilmnes kontole sisselogimisel probleem.</translation> <translation id="5737974891429562743">Konto sisselogimisandmed on aegunud. Värskendage andmeid sünkroonimise alustamiseks.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_fi.xtb b/ios/chrome/app/strings/resources/ios_strings_fi.xtb index 7f1ee48..8a16e5c5 100644 --- a/ios/chrome/app/strings/resources/ios_strings_fi.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_fi.xtb
@@ -25,6 +25,7 @@ <translation id="1254117744268754948">Valitse kansio</translation> <translation id="1265739287306757398">Lisätietoja</translation> <translation id="1272079795634619415">Pysäytä</translation> +<translation id="1283524564873030414">Viimeiset 24 tuntia</translation> <translation id="1323735185997015385">Poista</translation> <translation id="132683371494960526">Vaihda ylätason kansiota kaksoisnapauttamalla.</translation> <translation id="1340643665687018190">Sulje valikko</translation> @@ -79,6 +80,7 @@ <translation id="1974060860693918893">Lisäasetukset</translation> <translation id="1989112275319619282">Selaa</translation> <translation id="2015722694326466240">Jos haluat nähdä salasanat, sinun on ensin määritettävä tunnuskoodi laitteellesi.</translation> +<translation id="2073572773299281212">Aktiivinen <ph name="DAYS" /> päivää sitten</translation> <translation id="2074131957428911366">Voit valita synkronoitavan sisällön <ph name="BEGIN_LINK" />asetuksissa<ph name="END_LINK" />.</translation> <translation id="2079545284768500474">Kumoa</translation> <translation id="209018056901015185">Käytä tietokoneversiota</translation> @@ -113,6 +115,7 @@ <translation id="2529021024822217800">Avaa kaikki</translation> <translation id="2570206273416014374">Lähettää joitakin osoitekentän ja hakukentän kautta tehtyjä hakuja sekä joitakin evästeitä oletushakukoneellesi.</translation> <translation id="2572712655377361602">Laitekäytäntö esti pääsyn kuviisi.</translation> +<translation id="2578571896248130439">Lähetä verkkosivu</translation> <translation id="2584132361465095047">Lisää tili…</translation> <translation id="2625189173221582860">Salasana kopioitu</translation> <translation id="2648803196158606475">Poista luetut</translation> @@ -152,6 +155,7 @@ <translation id="3112556859945124369">Merkitse…</translation> <translation id="3157684681743766797">Merkitse kaikki…</translation> <translation id="3175081911749765310">Verkkopalvelut</translation> +<translation id="3178650076442119961">Aktiivinen tänään</translation> <translation id="3207960819495026254">Kirjanmerkeissä</translation> <translation id="3224641773458703735">Jos haluat viedä salasanoja, sinun on ensin määritettävä laitteellesi tunnuskoodi.</translation> <translation id="3240426699337459095">Linkki kopioitu</translation> @@ -226,6 +230,7 @@ <translation id="4272631900155121838">Jos haluat skannata QR-koodin, ota kamera käyttöön asetuksissa.</translation> <translation id="4281844954008187215">Käyttöehdot</translation> <translation id="430793432425771671">Synkronoi kaikki</translation> +<translation id="430967081421617822">Koko historia</translation> <translation id="4338650699862464074">Lähettää avaamiesi sivujen URL-osoitteet Googlelle.</translation> <translation id="4359125752503270327">Tämä sivu avataan toisessa sovelluksessa.</translation> <translation id="4370827530403103842">Synkronointi ei toimi. Korjaa napauttamalla.</translation> @@ -281,6 +286,7 @@ <translation id="5127805178023152808">Synkronointi ei ole käytössä</translation> <translation id="5132942445612118989">Synkronoi salasanasi, historiasi ja paljon muuta kaikilla laitteilla</translation> <translation id="5140288047769711648">Chrome muistaa tämän salasanan, jotta sinun ei tarvitse.</translation> +<translation id="5150492518600715772">Lähetä laitteeseen</translation> <translation id="5181140330217080051">Ladataan</translation> <translation id="5186185447130319458">Yksityinen</translation> <translation id="5190835502935405962">Kirjanmerkkipalkki</translation> @@ -295,6 +301,7 @@ <translation id="5327248766486351172">Nimi</translation> <translation id="5388358297987318779">Avaa kuva</translation> <translation id="5409365236829784218">Et ole asentanut sovellusta, jolla tämän tiedoston voi avata.</translation> +<translation id="5416022985862681400">Viimeiset 7 päivää</translation> <translation id="5433691172869980887">Käyttäjänimi kopioitu</translation> <translation id="54401264925851789">Sivun suojaustiedot</translation> <translation id="5443952882982198570">Luottokortit</translation> @@ -309,6 +316,7 @@ <translation id="5659593005791499971">Sähköposti</translation> <translation id="5669528293118408608">www</translation> <translation id="567881659373499783">Versio <ph name="PRODUCT_VERSION" /></translation> +<translation id="5706552126692816153">Aktiivinen 1 päivä sitten</translation> <translation id="5711039611392265845">Näet lisää yksityisyyteen, tietoturvaan ja datankeruuseen liittyviä asetuksia <ph name="BEGIN_LINK" />Synkronointi ja Google-palvelut<ph name="END_LINK" /> ‑kohdasta.</translation> <translation id="5728700505257787410">Tiliin kirjautuminen epäonnistui.</translation> <translation id="5737974891429562743">Tilin kirjautumistiedot ovat vanhentuneet. Aloita synkronointi päivittämällä.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_fr.xtb b/ios/chrome/app/strings/resources/ios_strings_fr.xtb index 8de54939..a74d49c 100644 --- a/ios/chrome/app/strings/resources/ios_strings_fr.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_fr.xtb
@@ -25,6 +25,7 @@ <translation id="1254117744268754948">Sélectionner un dossier</translation> <translation id="1265739287306757398">En savoir plus</translation> <translation id="1272079795634619415">Arrêter</translation> +<translation id="1283524564873030414">Dernières 24 heures</translation> <translation id="1323735185997015385">Supprimer</translation> <translation id="132683371494960526">Appuyez deux fois pour modifier le dossier parent.</translation> <translation id="1340643665687018190">Fermer le menu</translation> @@ -79,6 +80,7 @@ <translation id="1974060860693918893">Paramètres avancés</translation> <translation id="1989112275319619282">Parcourir</translation> <translation id="2015722694326466240">Pour afficher les mots de passe, vous devez d'abord définir un code secret sur votre appareil.</translation> +<translation id="2073572773299281212">Actif il y a <ph name="DAYS" /> jours</translation> <translation id="2074131957428911366">Vous avez toujours la possibilité de sélectionner les éléments à synchroniser dans les <ph name="BEGIN_LINK" />paramètres<ph name="END_LINK" />.</translation> <translation id="2079545284768500474">Annuler</translation> <translation id="209018056901015185">Voir version ordinateur</translation> @@ -113,6 +115,7 @@ <translation id="2529021024822217800">Tout ouvrir</translation> <translation id="2570206273416014374">Envoie des cookies et des recherches effectuées à partir de la barre d'adresse et du champ de recherche à votre moteur de recherche par défaut.</translation> <translation id="2572712655377361602">Les règles relatives aux appareils ont bloqué l'accès à vos photos.</translation> +<translation id="2578571896248130439">Envoyer la page Web</translation> <translation id="2584132361465095047">Ajouter un compte…</translation> <translation id="2625189173221582860">Mot de passe copié</translation> <translation id="2648803196158606475">Supprimer entrées lues</translation> @@ -152,6 +155,7 @@ <translation id="3112556859945124369">Marquer…</translation> <translation id="3157684681743766797">Tout marquer…</translation> <translation id="3175081911749765310">Services Web</translation> +<translation id="3178650076442119961">Actif aujourd'hui</translation> <translation id="3207960819495026254">Favori</translation> <translation id="3224641773458703735">Pour exporter les mots de passe, vous devez d'abord définir un code secret sur votre appareil.</translation> <translation id="3240426699337459095">Le lien a bien été copié.</translation> @@ -226,6 +230,7 @@ <translation id="4272631900155121838">Pour scanner un code QR, activez l'appareil photo depuis les paramètres</translation> <translation id="4281844954008187215">Conditions d'utilisation</translation> <translation id="430793432425771671">Tout synchroniser</translation> +<translation id="430967081421617822">Toutes les périodes</translation> <translation id="4338650699862464074">Envoie à Google les URL des pages que vous consultez.</translation> <translation id="4359125752503270327">Cette page va s'ouvrir dans une autre application.</translation> <translation id="4370827530403103842">La synchronisation ne fonctionne pas. Appuyez pour corriger.</translation> @@ -281,6 +286,7 @@ <translation id="5127805178023152808">La synchronisation est désactivée.</translation> <translation id="5132942445612118989">Synchroniser vos mots de passe, votre historique et plus encore sur tous les appareils</translation> <translation id="5140288047769711648">Chrome mémorisera ce mot de passe pour vous. Vous n'avez donc pas besoin de le retenir.</translation> +<translation id="5150492518600715772">Envoyer sur votre appareil</translation> <translation id="5181140330217080051">Téléchargement</translation> <translation id="5186185447130319458">Privé</translation> <translation id="5190835502935405962">Barre de favoris</translation> @@ -295,6 +301,7 @@ <translation id="5327248766486351172">Nom</translation> <translation id="5388358297987318779">Ouvrir l'image</translation> <translation id="5409365236829784218">Aucune application installée ne peut ouvrir ce fichier.</translation> +<translation id="5416022985862681400">Sept derniers jours</translation> <translation id="5433691172869980887">Nom d'utilisateur copié</translation> <translation id="54401264925851789">Informations sur la sécurité de cette page</translation> <translation id="5443952882982198570">Cartes de crédit</translation> @@ -309,6 +316,7 @@ <translation id="5659593005791499971">E-mail</translation> <translation id="5669528293118408608">www</translation> <translation id="567881659373499783">Version <ph name="PRODUCT_VERSION" /></translation> +<translation id="5706552126692816153">Actif il y a 1 jour</translation> <translation id="5711039611392265845">Pour accéder à d'autres paramètres liés à la confidentialité, à la sécurité et à la collecte de données, consultez la section <ph name="BEGIN_LINK" />Services Google/Synchronisation<ph name="END_LINK" />.</translation> <translation id="5728700505257787410">Désolé, problème lors de la connexion à votre compte.</translation> <translation id="5737974891429562743">Informations de connexion au compte obsolètes. Mettez-les à jour pour lancer la synchronisation.</translation> @@ -499,7 +507,7 @@ <translation id="8532105204136943229">Année d'expiration</translation> <translation id="8534481786647257214">Post Google+ publié.</translation> <translation id="8548878600947630424">Rechercher sur la page…</translation> -<translation id="8583866649835978847">Envoyez <ph name="TITLE" /> vers un de vos appareils.</translation> +<translation id="8583866649835978847">Envoyez l'onglet <ph name="TITLE" /> sur un de vos appareils.</translation> <translation id="8605219856220328675">Fermer l'onglet</translation> <translation id="8620640915598389714">Modifier</translation> <translation id="8636825310635137004">Activez la synchronisation pour accéder à vos onglets sur vos autres appareils.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_hr.xtb b/ios/chrome/app/strings/resources/ios_strings_hr.xtb index e08cc97..da8c73f 100644 --- a/ios/chrome/app/strings/resources/ios_strings_hr.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_hr.xtb
@@ -25,6 +25,7 @@ <translation id="1254117744268754948">Odabir mape</translation> <translation id="1265739287306757398">Saznajte kako</translation> <translation id="1272079795634619415">Zaustavi</translation> +<translation id="1283524564873030414">Posljednja 24 sata</translation> <translation id="1323735185997015385">Izbriši</translation> <translation id="132683371494960526">Dodirnite dvaput da biste promijenili nadređenu mapu.</translation> <translation id="1340643665687018190">Zatvori izbornik</translation> @@ -79,6 +80,7 @@ <translation id="1974060860693918893">Napredno</translation> <translation id="1989112275319619282">Pregledaj</translation> <translation id="2015722694326466240">Da biste vidjeli zaporke, najprije morate postaviti šifru zaporke na uređaju.</translation> +<translation id="2073572773299281212">Aktivan prije <ph name="DAYS" /> dana</translation> <translation id="2074131957428911366">Uvijek možete odabrati u <ph name="BEGIN_LINK" />postavkama<ph name="END_LINK" /> što će se sinkronizirati.</translation> <translation id="2079545284768500474">Poništi</translation> <translation id="209018056901015185">Prikaži klasičnu stranicu</translation> @@ -113,6 +115,7 @@ <translation id="2529021024822217800">Otvori sve</translation> <translation id="2570206273416014374">Zadanoj tražilici šalje neke kolačiće i pretraživanja iz adresne trake i okvira za pretraživanje.</translation> <translation id="2572712655377361602">Pravila za uređaje blokirala su pristup fotografijama</translation> +<translation id="2578571896248130439">Pošalji web-stranicu</translation> <translation id="2584132361465095047">Dodaj račun…</translation> <translation id="2625189173221582860">Zaporka je kopirana</translation> <translation id="2648803196158606475">Izbriši pročitano</translation> @@ -152,6 +155,7 @@ <translation id="3112556859945124369">Označi...</translation> <translation id="3157684681743766797">Označi sve...</translation> <translation id="3175081911749765310">Web-usluge</translation> +<translation id="3178650076442119961">Aktivan danas</translation> <translation id="3207960819495026254">Označeno</translation> <translation id="3224641773458703735">Da biste izvezli zaporke, najprije morate postaviti šifru zaporke na uređaju.</translation> <translation id="3240426699337459095">Veza je kopirana</translation> @@ -226,6 +230,7 @@ <translation id="4272631900155121838">Da biste skenirali QR kod, omogućite fotoaparat u postavkama</translation> <translation id="4281844954008187215">Uvjeti upotrebe usluge</translation> <translation id="430793432425771671">Sinkroniziraj sve</translation> +<translation id="430967081421617822">Cijelo vrijeme</translation> <translation id="4338650699862464074">Šalje Googleu URL-ove stranica koje posjećujete.</translation> <translation id="4359125752503270327">Stranica će se otvoriti u nekoj drugoj aplikaciji.</translation> <translation id="4370827530403103842">Sinkronizacija ne radi. Dodirnite za ispravak.</translation> @@ -281,6 +286,7 @@ <translation id="5127805178023152808">Sinkronizacija je isključena</translation> <translation id="5132942445612118989">Sinkronizirajte svoje zaporke, povijest i drugo na svim uređajima</translation> <translation id="5140288047769711648">Chrome će zapamtiti ovu zaporku umjesto vas. Ne morate je pamtiti.</translation> +<translation id="5150492518600715772">Pošalji na svoj uređaj</translation> <translation id="5181140330217080051">Preuzimanje</translation> <translation id="5186185447130319458">Privatno</translation> <translation id="5190835502935405962">Traka oznaka</translation> @@ -295,6 +301,7 @@ <translation id="5327248766486351172">Naziv</translation> <translation id="5388358297987318779">Otvori sliku</translation> <translation id="5409365236829784218">Nema instalirane aplikacije za otvaranje ove datoteke.</translation> +<translation id="5416022985862681400">Posljednjih sedam dana</translation> <translation id="5433691172869980887">Korisničko je ime kopirano</translation> <translation id="54401264925851789">Informacije o sigurnosti stranice</translation> <translation id="5443952882982198570">Kreditne kartice</translation> @@ -309,6 +316,7 @@ <translation id="5659593005791499971">E-pošta</translation> <translation id="5669528293118408608">www</translation> <translation id="567881659373499783">Verzija <ph name="PRODUCT_VERSION" /></translation> +<translation id="5706552126692816153">Aktivan prije jednog dana</translation> <translation id="5711039611392265845">Više postavki koje se odnose na privatnost, sigurnost i prikupljanje podataka dostupno je u odjeljku <ph name="BEGIN_LINK" />Sinkronizacija i Googleove usluge<ph name="END_LINK" />.</translation> <translation id="5728700505257787410">Došlo je do problema prilikom prijave na vaš račun.</translation> <translation id="5737974891429562743">Pojedinosti prijave na račun su zastarjele. Ažurirajte ih da biste pokrenuli sinkronizaciju.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_hu.xtb b/ios/chrome/app/strings/resources/ios_strings_hu.xtb index 5d770490..026e5756 100644 --- a/ios/chrome/app/strings/resources/ios_strings_hu.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_hu.xtb
@@ -25,6 +25,7 @@ <translation id="1254117744268754948">Mappa kiválasztása</translation> <translation id="1265739287306757398">További információ</translation> <translation id="1272079795634619415">Leállítás</translation> +<translation id="1283524564873030414">Az elmúlt 24 órából</translation> <translation id="1323735185997015385">Törlés</translation> <translation id="132683371494960526">Koppintson duplán a szülőmappa módosításához.</translation> <translation id="1340643665687018190">Menü bezárása</translation> @@ -79,6 +80,7 @@ <translation id="1974060860693918893">Speciális</translation> <translation id="1989112275319619282">Böngészés</translation> <translation id="2015722694326466240">A jelszavak megtekintéséhez előbb be kell állítania az eszközön a biztonsági kódot.</translation> +<translation id="2073572773299281212"><ph name="DAYS" /> napja volt aktív</translation> <translation id="2074131957428911366">A <ph name="BEGIN_LINK" />beállítások<ph name="END_LINK" /> között bármikor módosíthatja a szinkronizálni kívánt elemeket.</translation> <translation id="2079545284768500474">Visszavonás</translation> <translation id="209018056901015185">Asztali webhely kérése</translation> @@ -113,6 +115,7 @@ <translation id="2529021024822217800">Az összes megnyitása</translation> <translation id="2570206273416014374">Bizonyos cookie-kat és kereséseket küld a címsávból és a keresőmezőből az alapértelmezett keresőmotornak.</translation> <translation id="2572712655377361602">Egy eszközszabályzat letiltotta a fényképeihez való hozzáférést</translation> +<translation id="2578571896248130439">Weboldal küldése</translation> <translation id="2584132361465095047">Fiók hozzáadása...</translation> <translation id="2625189173221582860">Jelszó vágólapra másolva</translation> <translation id="2648803196158606475">Olvasottak törlése</translation> @@ -152,6 +155,7 @@ <translation id="3112556859945124369">Megjelölés…</translation> <translation id="3157684681743766797">Az összes megjelölése…</translation> <translation id="3175081911749765310">Webszolgáltató</translation> +<translation id="3178650076442119961">Ma volt aktív</translation> <translation id="3207960819495026254">Könyvjelző rögzítve</translation> <translation id="3224641773458703735">A jelszavak exportálásához előbb be kell állítania az eszközön a biztonsági kódot.</translation> <translation id="3240426699337459095">Link másolva</translation> @@ -226,6 +230,7 @@ <translation id="4272631900155121838">QR-kód beolvasásához engedélyezze a kamerát a beállítások között</translation> <translation id="4281844954008187215">Általános Szerződési Feltételek</translation> <translation id="430793432425771671">Az összes szinkronizálása</translation> +<translation id="430967081421617822">Mindenkori</translation> <translation id="4338650699862464074">Elküldi a felkeresett oldalak URL-címét a Google-nak.</translation> <translation id="4359125752503270327">Az oldal egy másik alkalmazásban nyílik meg.</translation> <translation id="4370827530403103842">A szinkronizálás nem működik. Koppintson a javításához.</translation> @@ -281,6 +286,7 @@ <translation id="5127805178023152808">Szinkronizálás kikapcsolva</translation> <translation id="5132942445612118989">Jelszavak, előzmények és egyebek szinkronizálása valamennyi eszközén</translation> <translation id="5140288047769711648">A Chrome megjegyzi ezt a jelszót, így Önnek nem kell észben tartania.</translation> +<translation id="5150492518600715772">Küldés az eszközére</translation> <translation id="5181140330217080051">Letöltés</translation> <translation id="5186185447130319458">Privát</translation> <translation id="5190835502935405962">Könyvjelzősáv</translation> @@ -295,6 +301,7 @@ <translation id="5327248766486351172">Név</translation> <translation id="5388358297987318779">Kép megnyitása</translation> <translation id="5409365236829784218">A fájl megnyitásához nincs telepítve alkalmazás.</translation> +<translation id="5416022985862681400">Legutóbbi 7 nap</translation> <translation id="5433691172869980887">Felhasználónév vágólapra másolva</translation> <translation id="54401264925851789">Oldal biztonsági információi</translation> <translation id="5443952882982198570">Hitelkártyák</translation> @@ -309,6 +316,7 @@ <translation id="5659593005791499971">E-mail</translation> <translation id="5669528293118408608">www</translation> <translation id="567881659373499783">Verzió: <ph name="PRODUCT_VERSION" /></translation> +<translation id="5706552126692816153">1 napja volt aktív</translation> <translation id="5711039611392265845">A <ph name="BEGIN_LINK" />Szinkronizálás és Google<ph name="END_LINK" /> részben további beállításokat talál az adatvédelemre, biztonságra és adatgyűjtésre vonatkozóan.</translation> <translation id="5728700505257787410">A fiókjába történő bejelentkezés során hiba történt.</translation> <translation id="5737974891429562743">A fiók bejelentkezési adatai elavultak. Frissítsen a szinkronizálás megkezdéséhez.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_it.xtb b/ios/chrome/app/strings/resources/ios_strings_it.xtb index 83738a3..2761b16 100644 --- a/ios/chrome/app/strings/resources/ios_strings_it.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_it.xtb
@@ -25,6 +25,7 @@ <translation id="1254117744268754948">Scegli cartella</translation> <translation id="1265739287306757398">Scopri come</translation> <translation id="1272079795634619415">Interrompi</translation> +<translation id="1283524564873030414">Ultime 24 ore</translation> <translation id="1323735185997015385">Elimina</translation> <translation id="132683371494960526">Tocca due volte per cambiare la cartella principale.</translation> <translation id="1340643665687018190">Chiudi menu</translation> @@ -79,6 +80,7 @@ <translation id="1974060860693918893">Avanzate</translation> <translation id="1989112275319619282">Esplora</translation> <translation id="2015722694326466240">Per visualizzare le password, per prima cosa imposta un passcode sul tuo dispositivo.</translation> +<translation id="2073572773299281212">Attivo <ph name="DAYS" /> giorni fa</translation> <translation id="2074131957428911366">Puoi scegliere in qualsiasi momento i dati da sincronizzare nelle <ph name="BEGIN_LINK" />impostazioni<ph name="END_LINK" />.</translation> <translation id="2079545284768500474">Annulla</translation> <translation id="209018056901015185">Richiedi sito desktop</translation> @@ -113,6 +115,7 @@ <translation id="2529021024822217800">Apri tutto</translation> <translation id="2570206273416014374">Invia al tuo motore di ricerca predefinito alcuni cookie e alcune ricerche dalla barra degli indirizzi e dalla casella di ricerca.</translation> <translation id="2572712655377361602">Un criterio relativo al dispositivo ha impedito l'accesso alle tue foto</translation> +<translation id="2578571896248130439">invia pagina web</translation> <translation id="2584132361465095047">Aggiungi account…</translation> <translation id="2625189173221582860">Password copiata</translation> <translation id="2648803196158606475">Elimina voci lette</translation> @@ -152,6 +155,7 @@ <translation id="3112556859945124369">Segna come…</translation> <translation id="3157684681743766797">Segna tutti come...</translation> <translation id="3175081911749765310">Servizi web</translation> +<translation id="3178650076442119961">Attivo oggi</translation> <translation id="3207960819495026254">Aggiunto ai preferiti</translation> <translation id="3224641773458703735">Per esportare le password devi innanzitutto impostare un passcode sul dispositivo.</translation> <translation id="3240426699337459095">Link copiato</translation> @@ -226,6 +230,7 @@ <translation id="4272631900155121838">Per eseguire la scansione di un codice QR, attiva la videocamera dalle impostazioni</translation> <translation id="4281844954008187215">Termini di servizio</translation> <translation id="430793432425771671">Sincronizza tutto</translation> +<translation id="430967081421617822">Dall'inizio</translation> <translation id="4338650699862464074">Invia a Google gli URL delle pagine che visiti.</translation> <translation id="4359125752503270327">Questa pagina verrà aperta con un'altra applicazione.</translation> <translation id="4370827530403103842">La sincronizzazione non funziona. Tocca per risolvere il problema.</translation> @@ -281,6 +286,7 @@ <translation id="5127805178023152808">La sincronizzazione è disattivata</translation> <translation id="5132942445612118989">Sincronizza le tue password, la tua cronologia e altro su tutti i tuoi dispositivi</translation> <translation id="5140288047769711648">Chrome memorizzerà la password. Non è necessario ricordarla.</translation> +<translation id="5150492518600715772">Invia al tuo dispositivo</translation> <translation id="5181140330217080051">Download in corso</translation> <translation id="5186185447130319458">Privata</translation> <translation id="5190835502935405962">Barra dei Preferiti</translation> @@ -295,6 +301,7 @@ <translation id="5327248766486351172">Nome</translation> <translation id="5388358297987318779">Apri immagine</translation> <translation id="5409365236829784218">Non ci sono applicazioni installate in grado di aprire questo file.</translation> +<translation id="5416022985862681400">Ultimi 7 giorni</translation> <translation id="5433691172869980887">Nome utente copiato</translation> <translation id="54401264925851789">Info sicurezza pagina</translation> <translation id="5443952882982198570">Carte di credito</translation> @@ -309,6 +316,7 @@ <translation id="5659593005791499971">Email</translation> <translation id="5669528293118408608">www</translation> <translation id="567881659373499783">Versione <ph name="PRODUCT_VERSION" /></translation> +<translation id="5706552126692816153">Attivo 1 giorno fa</translation> <translation id="5711039611392265845">Per altre impostazioni relative a privacy, sicurezza e raccolta dei dati, consulta la sezione <ph name="BEGIN_LINK" />Sincronizzazione e servizi Google<ph name="END_LINK" />.</translation> <translation id="5728700505257787410">Spiacenti, problema durante l'accesso all'account.</translation> <translation id="5737974891429562743">I dati di accesso dell'account sono obsoleti. Aggiorna per avviare la sincronizzazione.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_lt.xtb b/ios/chrome/app/strings/resources/ios_strings_lt.xtb index b6972e2..5a3dd81 100644 --- a/ios/chrome/app/strings/resources/ios_strings_lt.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_lt.xtb
@@ -25,6 +25,7 @@ <translation id="1254117744268754948">Pasirinkti aplanką</translation> <translation id="1265739287306757398">Sužinoti, kaip tai padaryti</translation> <translation id="1272079795634619415">Sustabdyti</translation> +<translation id="1283524564873030414">Pastarosios 24 valandos</translation> <translation id="1323735185997015385">Ištrinti</translation> <translation id="132683371494960526">Dukart palieskite, kad pakeistumėte viršaplankį.</translation> <translation id="1340643665687018190">Uždaryti meniu</translation> @@ -79,6 +80,7 @@ <translation id="1974060860693918893">Išplėstiniai</translation> <translation id="1989112275319619282">Naršyti</translation> <translation id="2015722694326466240">Jei norite matyti slaptažodžius, pirmiausia turite nustatyti įrenginio slaptažodį.</translation> +<translation id="2073572773299281212">Aktyvus prieš <ph name="DAYS" /> d.</translation> <translation id="2074131957428911366">Bet kada galite pasirinkti, ką norite sinchronizuoti, skiltyje <ph name="BEGIN_LINK" />„Nustatymai“<ph name="END_LINK" />.</translation> <translation id="2079545284768500474">Anuliuoti</translation> <translation id="209018056901015185">Užkl. dėl svet. v. komp.</translation> @@ -113,6 +115,7 @@ <translation id="2529021024822217800">Atidaryti viską</translation> <translation id="2570206273416014374">Numatytajam paieškos varikliui siunčiami kai kurie slapukai ir į adreso juostą bei paieškos laukelį įvestos paieškos.</translation> <translation id="2572712655377361602">Pagal įrenginio politiką prieiga prie nuotraukų buvo užblokuota</translation> +<translation id="2578571896248130439">Siųsti tinklalapį</translation> <translation id="2584132361465095047">Pridėti paskyrą...</translation> <translation id="2625189173221582860">Slaptažodis nukopijuotas</translation> <translation id="2648803196158606475">Ištrinti skaitytus</translation> @@ -152,6 +155,7 @@ <translation id="3112556859945124369">Pažymėti…</translation> <translation id="3157684681743766797">Pažymėti visus...</translation> <translation id="3175081911749765310">Žin. pasl.</translation> +<translation id="3178650076442119961">Aktyvus šiandien</translation> <translation id="3207960819495026254">Pažymėta</translation> <translation id="3224641773458703735">Jei norite eksportuoti slaptažodžius, pirmiausia turite nustatyti įrenginio slaptažodį.</translation> <translation id="3240426699337459095">Nuoroda nukopijuota</translation> @@ -226,6 +230,7 @@ <translation id="4272631900155121838">Jei norite nuskaityti QR kodą, nustatymuose įgalinkite fotoaparatą</translation> <translation id="4281844954008187215">Paslaugų teikimo sąlygos</translation> <translation id="430793432425771671">Sinchronizuoti viską</translation> +<translation id="430967081421617822">Visas laikotarpis</translation> <translation id="4338650699862464074">Siunčiami „Google“ puslapių, kuriuose lankotės, URL.</translation> <translation id="4359125752503270327">Šis puslapis bus atidarytas kitoje programoje.</translation> <translation id="4370827530403103842">Sinchronizavimas neveikia. Palieskite, kad sutvarkytumėte.</translation> @@ -281,6 +286,7 @@ <translation id="5127805178023152808">Sinchronizavimas išjungtas</translation> <translation id="5132942445612118989">Sinchronizuokite slaptažodžius, istoriją ir daugiau visuose įrenginiuose</translation> <translation id="5140288047769711648">„Chrome“ įsimins šį slaptažodį už jus. Jums nereikia jo prisiminti.</translation> +<translation id="5150492518600715772">Siųsti į įrenginį</translation> <translation id="5181140330217080051">Atsisiunčiama</translation> <translation id="5186185447130319458">Privatu</translation> <translation id="5190835502935405962">Žymių juosta</translation> @@ -295,6 +301,7 @@ <translation id="5327248766486351172">Pavadinimas</translation> <translation id="5388358297987318779">Atidaryti vaizdą</translation> <translation id="5409365236829784218">Nėra įdiegtų pr., kurias naudojant galima atidaryti failą.</translation> +<translation id="5416022985862681400">Pastarosios 7 dienos</translation> <translation id="5433691172869980887">Naudotojo vardas nukopijuotas</translation> <translation id="54401264925851789">Puslapio saugos informacija</translation> <translation id="5443952882982198570">Kredito kortelės</translation> @@ -309,6 +316,7 @@ <translation id="5659593005791499971">El. paštas</translation> <translation id="5669528293118408608">www</translation> <translation id="567881659373499783"><ph name="PRODUCT_VERSION" /> versija</translation> +<translation id="5706552126692816153">Aktyvus prieš 1 d.</translation> <translation id="5711039611392265845">Daugiau nustatymų, susijusių su privatumu, sauga ir duomenų rinkimu, žr. skiltyje <ph name="BEGIN_LINK" />„Sinchronizavimas ir „Google“ paslaugos“<ph name="END_LINK" />.</translation> <translation id="5728700505257787410">Apgailestaujame, prisijungiant prie paskyros kilo problema.</translation> <translation id="5737974891429562743">Išsami paskyros prisijungimo informacija pasenusi. Atnaujinkite, kad pradėtumėte sinchronizuoti.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_lv.xtb b/ios/chrome/app/strings/resources/ios_strings_lv.xtb index d16e360..90fa2395 100644 --- a/ios/chrome/app/strings/resources/ios_strings_lv.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_lv.xtb
@@ -25,6 +25,7 @@ <translation id="1254117744268754948">Mapes izvēle</translation> <translation id="1265739287306757398">Uzzināt, kā to izdarīt</translation> <translation id="1272079795634619415">Apturēt</translation> +<translation id="1283524564873030414">Pēdējās 24 stundas</translation> <translation id="1323735185997015385">Dzēst</translation> <translation id="132683371494960526">Veiciet dubultskārienu, lai mainītu vecākmapi.</translation> <translation id="1340643665687018190">Aizvērt izvēlni</translation> @@ -79,6 +80,7 @@ <translation id="1974060860693918893">Papildu</translation> <translation id="1989112275319619282">Pārlūkot</translation> <translation id="2015722694326466240">Lai skatītu paroles, vispirms ierīcei ir jāiestata piekļuves kods.</translation> +<translation id="2073572773299281212">Aktīvs pirms <ph name="DAYS" /> dienām</translation> <translation id="2074131957428911366">Jūs jebkurā laikā <ph name="BEGIN_LINK" />iestatījumos<ph name="END_LINK" /> varat izvēlēties, ko sinhronizēt.</translation> <translation id="2079545284768500474">Atsaukt</translation> <translation id="209018056901015185">Pieprasīt datora vietni</translation> @@ -113,6 +115,7 @@ <translation id="2529021024822217800">Atvērt visas</translation> <translation id="2570206273416014374">Nosūta dažus sīkfailus un meklēšanas vaicājumus no adreses joslas un meklēšanas lodziņa uz jūsu noklusējuma meklētājprogrammu.</translation> <translation id="2572712655377361602">Ierīces politikas dēļ tika bloķēta piekļuve jūsu fotoattēliem.</translation> +<translation id="2578571896248130439">Tīmekļa lapas sūtīšana</translation> <translation id="2584132361465095047">Pievienot kontu…</translation> <translation id="2625189173221582860">Parole ir nokopēta.</translation> <translation id="2648803196158606475">Dzēst izlasītos</translation> @@ -152,6 +155,7 @@ <translation id="3112556859945124369">Atzīmēt…</translation> <translation id="3157684681743766797">Atzīmēt visus…</translation> <translation id="3175081911749765310">Tīm. pak.</translation> +<translation id="3178650076442119961">Aktīva šodien</translation> <translation id="3207960819495026254">Atzīmēts kā grāmatzīme</translation> <translation id="3224641773458703735">Lai eksportētu paroles, vispirms ierīcei ir jāiestata piekļuves kods.</translation> <translation id="3240426699337459095">Saite nokopēta</translation> @@ -226,6 +230,7 @@ <translation id="4272631900155121838">Lai skenētu QR kodu, iestatījumos iespējojiet kameru.</translation> <translation id="4281844954008187215">Google pakalpojumu noteikumi</translation> <translation id="430793432425771671">Sinhronizēt visu</translation> +<translation id="430967081421617822">Viss periods</translation> <translation id="4338650699862464074">Nosūta Google serveriem apmeklēto lapu vietrāžus URL.</translation> <translation id="4359125752503270327">Šī lapa tiks atvērta citā lietojumprogrammā.</translation> <translation id="4370827530403103842">Sinhronizācija nedarbojas. Pieskarieties, lai novērstu problēmu.</translation> @@ -281,6 +286,7 @@ <translation id="5127805178023152808">Sinhronizācija izslēgta</translation> <translation id="5132942445612118989">Sinhronizējiet paroles, vēsturi un citu saturu visās ierīcēs</translation> <translation id="5140288047769711648">Chrome iegaumēs šo paroli. Jums tā nav jāatceras.</translation> +<translation id="5150492518600715772">Nosūtīt uz jūsu ierīci</translation> <translation id="5181140330217080051">Notiek lejupielāde</translation> <translation id="5186185447130319458">Privāti</translation> <translation id="5190835502935405962">Grāmatzīmju josla</translation> @@ -295,6 +301,7 @@ <translation id="5327248766486351172">Nosaukums</translation> <translation id="5388358297987318779">Atvērt attēlu</translation> <translation id="5409365236829784218">Nav instalēta neviena lietotne, ar kuru atvērt šo failu.</translation> +<translation id="5416022985862681400">Pēdējās 7 dienas</translation> <translation id="5433691172869980887">Lietotājvārds ir nokopēts.</translation> <translation id="54401264925851789">Lapas drošības informācija</translation> <translation id="5443952882982198570">Kredītkartes</translation> @@ -309,6 +316,7 @@ <translation id="5659593005791499971">E-pasts</translation> <translation id="5669528293118408608">www</translation> <translation id="567881659373499783">Versija <ph name="PRODUCT_VERSION" /></translation> +<translation id="5706552126692816153">Aktīva pirms 1 dienas</translation> <translation id="5711039611392265845">Papildu iestatījumus, kas attiecas uz konfidencialitāti, drošību un datu apkopošanu, skatiet lapā <ph name="BEGIN_LINK" />Sinhronizēšana un Google pakalpojumi<ph name="END_LINK" />.</translation> <translation id="5728700505257787410">Diemžēl, pierakstoties kontā, radās problēma.</translation> <translation id="5737974891429562743">Konta pieteikuminformācija ir novecojusi. Atjauniniet to, lai sāktu sinhronizāciju.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_no.xtb b/ios/chrome/app/strings/resources/ios_strings_no.xtb index e37f45dd..6a9df3f 100644 --- a/ios/chrome/app/strings/resources/ios_strings_no.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_no.xtb
@@ -25,6 +25,7 @@ <translation id="1254117744268754948">Valg av mappe</translation> <translation id="1265739287306757398">Finn ut hvordan</translation> <translation id="1272079795634619415">Stopp</translation> +<translation id="1283524564873030414">Siste døgn</translation> <translation id="1323735185997015385">Slett</translation> <translation id="132683371494960526">Dobbelttrykk for å bytte overordnet mappe.</translation> <translation id="1340643665687018190">Lukk menyen</translation> @@ -79,6 +80,7 @@ <translation id="1974060860693918893">Avansert</translation> <translation id="1989112275319619282">Bla gjennom</translation> <translation id="2015722694326466240">For å se passordene må du først angi en adgangskode på enheten din.</translation> +<translation id="2073572773299281212">Aktiv for <ph name="DAYS" /> dager siden</translation> <translation id="2074131957428911366">Du kan når som helst velge hva du vil synkronisere, i <ph name="BEGIN_LINK" />innstillingene<ph name="END_LINK" />.</translation> <translation id="2079545284768500474">Angre</translation> <translation id="209018056901015185">Bruk skrivebordsversjon</translation> @@ -113,6 +115,7 @@ <translation id="2529021024822217800">Åpne alle</translation> <translation id="2570206273416014374">Sender standardsøkemotoren din noen informasjonskapsler og søk fra adressefeltet og søkefeltet.</translation> <translation id="2572712655377361602">En enhetsinnstilling har blokkert tilgangen til bildene dine</translation> +<translation id="2578571896248130439">Send nettside</translation> <translation id="2584132361465095047">Legg til en konto …</translation> <translation id="2625189173221582860">Passordet er kopiert</translation> <translation id="2648803196158606475">Slett leste</translation> @@ -152,6 +155,7 @@ <translation id="3112556859945124369">Merk…</translation> <translation id="3157684681743766797">Merk alle…</translation> <translation id="3175081911749765310">Nettjenester</translation> +<translation id="3178650076442119961">Aktiv i dag</translation> <translation id="3207960819495026254">Bokmerket</translation> <translation id="3224641773458703735">For å eksportere passordene må du først angi en adgangskode på enheten din.</translation> <translation id="3240426699337459095">Linken er kopiert</translation> @@ -226,6 +230,7 @@ <translation id="4272631900155121838">For å skanne QR-koder, slå på kameraet i innstillingene</translation> <translation id="4281844954008187215">Vilkår for bruk</translation> <translation id="430793432425771671">Synkroniser alt</translation> +<translation id="430967081421617822">Alle datoer</translation> <translation id="4338650699862464074">Sender Google nettadressene til sider du besøker.</translation> <translation id="4359125752503270327">Denne siden åpnes i et annet program.</translation> <translation id="4370827530403103842">Synkronisering fungerer ikke. Trykk for å fikse.</translation> @@ -281,6 +286,7 @@ <translation id="5127805178023152808">Synkronisering er slått av</translation> <translation id="5132942445612118989">Synkroniser passordene dine, loggen din med mer på alle enheter</translation> <translation id="5140288047769711648">Chrome husker dette passordet for deg. Du trenger ikke å huske det selv.</translation> +<translation id="5150492518600715772">Send til enheten din</translation> <translation id="5181140330217080051">Laster ned</translation> <translation id="5186185447130319458">Privat</translation> <translation id="5190835502935405962">Bokmerkerad</translation> @@ -295,6 +301,7 @@ <translation id="5327248766486351172">Navn</translation> <translation id="5388358297987318779">Åpne bildet</translation> <translation id="5409365236829784218">Ingen av de installerte appene kan åpne denne filen.</translation> +<translation id="5416022985862681400">De siste 7 dagene</translation> <translation id="5433691172869980887">Brukernavnet er kopiert</translation> <translation id="54401264925851789">Sikkerhetsinformasjon for siden</translation> <translation id="5443952882982198570">Kredittkort</translation> @@ -309,6 +316,7 @@ <translation id="5659593005791499971">E-post</translation> <translation id="5669528293118408608">www</translation> <translation id="567881659373499783">Versjon <ph name="PRODUCT_VERSION" /></translation> +<translation id="5706552126692816153">Aktiv for én dag siden</translation> <translation id="5711039611392265845">Se <ph name="BEGIN_LINK" />Synkronisering og Google-tjenester<ph name="END_LINK" /> for flere innstillinger knyttet til personvern, sikkerhet og datainnsamling.</translation> <translation id="5728700505257787410">Det oppsto et problem ved pålogging til kontoen din.</translation> <translation id="5737974891429562743">Påloggingsdetaljene for kontoen er utdatert. Oppdater for å starte synkroniseringen.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_pl.xtb b/ios/chrome/app/strings/resources/ios_strings_pl.xtb index 76e90d3..0bd9ee3e 100644 --- a/ios/chrome/app/strings/resources/ios_strings_pl.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_pl.xtb
@@ -25,6 +25,7 @@ <translation id="1254117744268754948">Wybierz folder</translation> <translation id="1265739287306757398">Instrukcje</translation> <translation id="1272079795634619415">Zatrzymaj</translation> +<translation id="1283524564873030414">Ostatnie 24 godziny</translation> <translation id="1323735185997015385">Usuń</translation> <translation id="132683371494960526">Kliknij dwukrotnie, by zmienić folder nadrzędny.</translation> <translation id="1340643665687018190">Zamknij menu</translation> @@ -79,6 +80,7 @@ <translation id="1974060860693918893">Zaawansowane</translation> <translation id="1989112275319619282">Przeglądaj</translation> <translation id="2015722694326466240">Aby wyświetlić hasła, musisz najpierw ustawić kod dostępu na urządzeniu.</translation> +<translation id="2073572773299281212">Aktywność <ph name="DAYS" /> dni temu</translation> <translation id="2074131957428911366">W <ph name="BEGIN_LINK" />ustawieniach<ph name="END_LINK" /> możesz wybrać, co chcesz synchronizować.</translation> <translation id="2079545284768500474">Cofnij</translation> <translation id="209018056901015185">Wersja na komputer</translation> @@ -113,6 +115,7 @@ <translation id="2529021024822217800">Otwórz wszystkie</translation> <translation id="2570206273416014374">Niektóre pliki cookie oraz zapytania wpisywane na pasku adresu i w polu wyszukiwania będą wysyłane do domyślnej wyszukiwarki.</translation> <translation id="2572712655377361602">Zasady dotyczące urządzeń zablokowały dostęp do Twoich zdjęć</translation> +<translation id="2578571896248130439">Wyślij stronę internetową</translation> <translation id="2584132361465095047">Dodaj konto…</translation> <translation id="2625189173221582860">Hasło zostało skopiowane</translation> <translation id="2648803196158606475">Usuń przeczytane</translation> @@ -152,6 +155,7 @@ <translation id="3112556859945124369">Oznacz…</translation> <translation id="3157684681743766797">Oznacz wszystko…</translation> <translation id="3175081911749765310">Usługi internetowe</translation> +<translation id="3178650076442119961">Aktywność dzisiaj</translation> <translation id="3207960819495026254">Dodano do zakładek</translation> <translation id="3224641773458703735">Aby wyeksportować hasła, musisz najpierw ustawić kod dostępu na urządzeniu.</translation> <translation id="3240426699337459095">Link skopiowany</translation> @@ -226,6 +230,7 @@ <translation id="4272631900155121838">Aby zeskanować kod QR, włącz aparat w ustawieniach</translation> <translation id="4281844954008187215">Warunki korzystania z usługi</translation> <translation id="430793432425771671">Synchronizuj wszystko</translation> +<translation id="430967081421617822">Od początku</translation> <translation id="4338650699862464074">Adresy URL odwiedzanych stron będą wysyłane do Google.</translation> <translation id="4359125752503270327">Strona zostanie otwarta w innej aplikacji.</translation> <translation id="4370827530403103842">Synchronizacja nie działa. Kliknij, by ją naprawić.</translation> @@ -281,6 +286,7 @@ <translation id="5127805178023152808">Synchronizacja jest wyłączona</translation> <translation id="5132942445612118989">Synchronizuj swoje hasła, historię i inne dane na wszystkich swoich urządzeniach</translation> <translation id="5140288047769711648">Chrome będzie pamiętać to hasło za Ciebie. Nie musisz go zapamiętywać.</translation> +<translation id="5150492518600715772">Wyślij na swoje urządzenie</translation> <translation id="5181140330217080051">Pobieranie</translation> <translation id="5186185447130319458">Prywatna</translation> <translation id="5190835502935405962">Pasek zakładek</translation> @@ -295,6 +301,7 @@ <translation id="5327248766486351172">Nazwa</translation> <translation id="5388358297987318779">Otwórz obraz</translation> <translation id="5409365236829784218">Nie masz aplikacji, w których można otworzyć ten plik.</translation> +<translation id="5416022985862681400">Ostatnie 7 dni</translation> <translation id="5433691172869980887">Nazwa użytkownika została skopiowana</translation> <translation id="54401264925851789">Informacje o bezpieczeństwie strony</translation> <translation id="5443952882982198570">Karty kredytowe</translation> @@ -309,6 +316,7 @@ <translation id="5659593005791499971">E-mail</translation> <translation id="5669528293118408608">www</translation> <translation id="567881659373499783">Wersja <ph name="PRODUCT_VERSION" /></translation> +<translation id="5706552126692816153">Aktywność 1 dzień temu</translation> <translation id="5711039611392265845">Więcej ustawień związanych z prywatnością, bezpieczeństwem i zbieraniem danych znajdziesz w sekcji <ph name="BEGIN_LINK" />Synchronizacja i usługi Google<ph name="END_LINK" />.</translation> <translation id="5728700505257787410">Niestety, wystąpił problem z zalogowaniem się na konto.</translation> <translation id="5737974891429562743">Dane logowania na konto są nieaktualne. Zaktualizuj je, by rozpocząć synchronizację.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_pt-PT.xtb b/ios/chrome/app/strings/resources/ios_strings_pt-PT.xtb index c40e998..393cb20 100644 --- a/ios/chrome/app/strings/resources/ios_strings_pt-PT.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_pt-PT.xtb
@@ -25,6 +25,7 @@ <translation id="1254117744268754948">Escolher Pasta</translation> <translation id="1265739287306757398">Saiba como</translation> <translation id="1272079795634619415">Parar</translation> +<translation id="1283524564873030414">Últimas 24 horas</translation> <translation id="1323735185997015385">Eliminar</translation> <translation id="132683371494960526">Toque duas vezes para alterar a pasta principal.</translation> <translation id="1340643665687018190">Fechar menu</translation> @@ -79,6 +80,7 @@ <translation id="1974060860693918893">Avançadas</translation> <translation id="1989112275319619282">Procurar</translation> <translation id="2015722694326466240">Para ver as palavras-passe, tem de definir primeiro um código secreto no dispositivo.</translation> +<translation id="2073572773299281212">Ativo há <ph name="DAYS" /> dias</translation> <translation id="2074131957428911366">Pode escolher o que pretende sincronizar nas <ph name="BEGIN_LINK" />definições<ph name="END_LINK" />.</translation> <translation id="2079545284768500474">Anular</translation> <translation id="209018056901015185">Pedir site para computador</translation> @@ -113,6 +115,7 @@ <translation id="2529021024822217800">Abrir todos</translation> <translation id="2570206273416014374">Envia alguns cookies e pesquisas da barra de endereço e da caixa de pesquisa para o motor de pesquisa predefinido.</translation> <translation id="2572712655377361602">Uma política do dispositivo bloqueou o acesso às suas fotos</translation> +<translation id="2578571896248130439">Envie a página Web</translation> <translation id="2584132361465095047">Adicionar conta...</translation> <translation id="2625189173221582860">Palavra-passe copiada</translation> <translation id="2648803196158606475">Eliminar lidas</translation> @@ -152,6 +155,7 @@ <translation id="3112556859945124369">Marcar…</translation> <translation id="3157684681743766797">Marcar tudo…</translation> <translation id="3175081911749765310">Serviços Web</translation> +<translation id="3178650076442119961">Ativo hoje</translation> <translation id="3207960819495026254">Adicionado aos marcadores</translation> <translation id="3224641773458703735">Para exportar palavras-passe, tem de definir primeiro um código secreto no dispositivo.</translation> <translation id="3240426699337459095">Link copiado</translation> @@ -226,6 +230,7 @@ <translation id="4272631900155121838">Para ler um código QR, ative a câmara nas definições</translation> <translation id="4281844954008187215">Termos de Utilização</translation> <translation id="430793432425771671">Sincronizar Tudo</translation> +<translation id="430967081421617822">Sempre</translation> <translation id="4338650699862464074">Envia para a Google os URLs das páginas que visita.</translation> <translation id="4359125752503270327">Esta página abre noutra aplicação.</translation> <translation id="4370827530403103842">A sincronização não está a funcionar. Toque para corrigir.</translation> @@ -281,6 +286,7 @@ <translation id="5127805178023152808">A sincronização está desativada</translation> <translation id="5132942445612118989">Sincronize as suas palavras-passe, o histórico e muito mais em todos os dispositivos</translation> <translation id="5140288047769711648">O Chrome memorizará esta palavra-passe por si. Não tem de a memorizar.</translation> +<translation id="5150492518600715772">Enviar para o dispositivo</translation> <translation id="5181140330217080051">A transferir</translation> <translation id="5186185447130319458">Privado</translation> <translation id="5190835502935405962">Barra de marcadores</translation> @@ -295,6 +301,7 @@ <translation id="5327248766486351172">Nome</translation> <translation id="5388358297987318779">Abrir Imagem</translation> <translation id="5409365236829784218">Não existem aplicações instaladas que possam abrir este ficheiro.</translation> +<translation id="5416022985862681400">Últimos 7 dias</translation> <translation id="5433691172869980887">Nome de utilizador copiado</translation> <translation id="54401264925851789">Informações de Segurança da Página</translation> <translation id="5443952882982198570">Cartões de crédito</translation> @@ -309,6 +316,7 @@ <translation id="5659593005791499971">Email</translation> <translation id="5669528293118408608">www</translation> <translation id="567881659373499783">Versão <ph name="PRODUCT_VERSION" /></translation> +<translation id="5706552126692816153">Ativo há 1 dia</translation> <translation id="5711039611392265845">Para obter mais definições relacionadas com privacidade, segurança e recolha de dados, consulte <ph name="BEGIN_LINK" />Sincronização e serviços Google<ph name="END_LINK" />.</translation> <translation id="5728700505257787410">Lamentamos, mas houve um problema ao iniciar sessão na sua conta.</translation> <translation id="5737974891429562743">Os detalhes de início de sessão na conta estão desatualizados. Atualize-os para iniciar a sincronização.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ro.xtb b/ios/chrome/app/strings/resources/ios_strings_ro.xtb index 1cc3632..3ac68a06 100644 --- a/ios/chrome/app/strings/resources/ios_strings_ro.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_ro.xtb
@@ -25,6 +25,7 @@ <translation id="1254117744268754948">Alegeți dosarul</translation> <translation id="1265739287306757398">Află cum</translation> <translation id="1272079795634619415">Oprește</translation> +<translation id="1283524564873030414">Ultimele 24 de ore</translation> <translation id="1323735185997015385">Șterge</translation> <translation id="132683371494960526">Atinge de două ori pentru a modifica dosarul părinte.</translation> <translation id="1340643665687018190">Meniul Închide</translation> @@ -79,6 +80,7 @@ <translation id="1974060860693918893">Avansate</translation> <translation id="1989112275319619282">Răsfoiește</translation> <translation id="2015722694326466240">Pentru a vedea parolele, trebuie mai întâi să setezi o parolă pe dispozitiv.</translation> +<translation id="2073572773299281212">Activ acum <ph name="DAYS" /> zile</translation> <translation id="2074131957428911366">Poți să alegi oricând ce să sincronizezi în <ph name="BEGIN_LINK" />setări<ph name="END_LINK" />.</translation> <translation id="2079545284768500474">Anulează</translation> <translation id="209018056901015185">Site desktop</translation> @@ -113,6 +115,7 @@ <translation id="2529021024822217800">Deschide-le pe toate</translation> <translation id="2570206273416014374">Trimite anumite cookie-uri și căutări din bara de adrese și din caseta de căutare în motorul de căutare prestabilit.</translation> <translation id="2572712655377361602">O politică a dispozitivului a blocat accesul la fotografii</translation> +<translation id="2578571896248130439">Trimite pagina web</translation> <translation id="2584132361465095047">Adaugă un cont…</translation> <translation id="2625189173221582860">Parola a fost copiată</translation> <translation id="2648803196158606475">Șterge-le pe cele citite</translation> @@ -152,6 +155,7 @@ <translation id="3112556859945124369">Marchează…</translation> <translation id="3157684681743766797">Marchează-le pe toate…</translation> <translation id="3175081911749765310">Servicii web</translation> +<translation id="3178650076442119961">Activ astăzi</translation> <translation id="3207960819495026254">Marcată</translation> <translation id="3224641773458703735">Pentru a exporta parolele, trebuie mai întâi să setezi o parolă pe dispozitiv.</translation> <translation id="3240426699337459095">Linkul a fost copiat</translation> @@ -226,6 +230,7 @@ <translation id="4272631900155121838">Pentru a scana un cod QR, activează camera foto din setări</translation> <translation id="4281844954008187215">Condiții de furnizare a serviciilor</translation> <translation id="430793432425771671">Sincronizează tot</translation> +<translation id="430967081421617822">Dintotdeauna</translation> <translation id="4338650699862464074">Trimite la Google adresele URL ale paginilor pe care le accesezi.</translation> <translation id="4359125752503270327">Această pagină se va deschide în altă aplicație.</translation> <translation id="4370827530403103842">Sincronizarea nu funcționează. Atinge pentru a o remedia.</translation> @@ -281,6 +286,7 @@ <translation id="5127805178023152808">Sincronizarea este dezactivată</translation> <translation id="5132942445612118989">Sincronizează parolele, istoricul și alte date pe toate dispozitivele</translation> <translation id="5140288047769711648">Chrome va memora această parolă pentru tine. Nu trebuie să o ții minte.</translation> +<translation id="5150492518600715772">Trimite pe dispozitivul tău.</translation> <translation id="5181140330217080051">Se descarcă</translation> <translation id="5186185447130319458">Privat</translation> <translation id="5190835502935405962">Bară de marcaje</translation> @@ -295,6 +301,7 @@ <translation id="5327248766486351172">Nume</translation> <translation id="5388358297987318779">Deschide imaginea</translation> <translation id="5409365236829784218">Nicio aplicație instalată nu poate deschide fișierul.</translation> +<translation id="5416022985862681400">Ultimele șapte zile</translation> <translation id="5433691172869980887">Numele de utilizator a fost copiat</translation> <translation id="54401264925851789">Informații privind securitatea paginii</translation> <translation id="5443952882982198570">Carduri de credit</translation> @@ -309,6 +316,7 @@ <translation id="5659593005791499971">Adresă de e-mail</translation> <translation id="5669528293118408608">www</translation> <translation id="567881659373499783">Versiunea <ph name="PRODUCT_VERSION" /></translation> +<translation id="5706552126692816153">Activ acum o zi</translation> <translation id="5711039611392265845">Pentru mai multe setări privind confidențialitatea, securitatea și colectarea datelor, consultă <ph name="BEGIN_LINK" />Sincronizarea și serviciile Google<ph name="END_LINK" /></translation> <translation id="5728700505257787410">A apărut o problemă de conectare la cont.</translation> <translation id="5737974891429562743">Datele de conectare la cont sunt învechite. Actualizează pentru a începe sincronizarea.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_sk.xtb b/ios/chrome/app/strings/resources/ios_strings_sk.xtb index 858dca86..73dc496 100644 --- a/ios/chrome/app/strings/resources/ios_strings_sk.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_sk.xtb
@@ -25,6 +25,7 @@ <translation id="1254117744268754948">Vybrať priečinok</translation> <translation id="1265739287306757398">Ako na to</translation> <translation id="1272079795634619415">Zastaviť</translation> +<translation id="1283524564873030414">Posledných 24 hodín</translation> <translation id="1323735185997015385">Odstrániť</translation> <translation id="132683371494960526">Dvojitým klepnutím zmeníte nadradený priečinok.</translation> <translation id="1340643665687018190">Zavrieť ponuku</translation> @@ -79,6 +80,7 @@ <translation id="1974060860693918893">Rozšírené</translation> <translation id="1989112275319619282">Prehliadať</translation> <translation id="2015722694326466240">Ak si chcete zobraziť heslá, najprv musíte v zariadení nastaviť vstupný kód.</translation> +<translation id="2073572773299281212">Aktívne pred <ph name="DAYS" /> dňami</translation> <translation id="2074131957428911366">Položky, ktoré chcete synchronizovať, môžete vybrať v <ph name="BEGIN_LINK" />nastaveniach<ph name="END_LINK" />.</translation> <translation id="2079545284768500474">Späť</translation> <translation id="209018056901015185">Vyžiadať stránky pre počítač</translation> @@ -113,6 +115,7 @@ <translation id="2529021024822217800">Otvoriť všetky</translation> <translation id="2570206273416014374">Odošle niektoré súbory cookie a vyhľadávania z panela s adresou a vyhľadávacieho poľa do vášho predvoleného vyhľadávača.</translation> <translation id="2572712655377361602">Pravidlá pre zariadenie zablokovali prístup k vašim fotkám</translation> +<translation id="2578571896248130439">Odoslanie webovej stránky</translation> <translation id="2584132361465095047">Pridať účet…</translation> <translation id="2625189173221582860">Heslo bolo skopírované.</translation> <translation id="2648803196158606475">Odstrániť prečítané</translation> @@ -152,6 +155,7 @@ <translation id="3112556859945124369">Označiť…</translation> <translation id="3157684681743766797">Označiť všetko…</translation> <translation id="3175081911749765310">Web. služ.</translation> +<translation id="3178650076442119961">Aktívne dnes</translation> <translation id="3207960819495026254">Pridané medzi záložky</translation> <translation id="3224641773458703735">Ak chcete exportovať heslá, najprv musíte v zariadení nastaviť vstupný kód.</translation> <translation id="3240426699337459095">Odkaz bol skopírovaný</translation> @@ -226,6 +230,7 @@ <translation id="4272631900155121838">Ak chcete naskenovať QR kód, povoľte v nastaveniach fotoaparát</translation> <translation id="4281844954008187215">Zmluvné podmienky</translation> <translation id="430793432425771671">Synchronizovať všetko</translation> +<translation id="430967081421617822">Za celé obdobie</translation> <translation id="4338650699862464074">Odosiela Googlu webové adresy navštívených stránok.</translation> <translation id="4359125752503270327">Táto stránka sa otvorí v ďalšej aplikácii.</translation> <translation id="4370827530403103842">Synchronizácia nefunguje. Opravte ju klepnutím.</translation> @@ -281,6 +286,7 @@ <translation id="5127805178023152808">Synchronizácia je vypnutá.</translation> <translation id="5132942445612118989">Synchronizujte svoje heslá, históriu a ďalší obsah vo všetkých zariadeniach</translation> <translation id="5140288047769711648">Chrome si toto heslo zapamätá za vás. Nemusíte sa ho učiť naspamäť.</translation> +<translation id="5150492518600715772">Odoslať do vášho zariadenia</translation> <translation id="5181140330217080051">Sťahovanie</translation> <translation id="5186185447130319458">Súkromné</translation> <translation id="5190835502935405962">Panel so záložkami</translation> @@ -295,6 +301,7 @@ <translation id="5327248766486351172">Názov</translation> <translation id="5388358297987318779">Otvoriť obrázok</translation> <translation id="5409365236829784218">Nie sú nainštalované žiadne aplikácie, ktoré dokážu otvoriť tento súbor.</translation> +<translation id="5416022985862681400">Posledných 7 dní</translation> <translation id="5433691172869980887">Používateľské meno bolo skopírované</translation> <translation id="54401264925851789">Informácie o zabezpečení stránky</translation> <translation id="5443952882982198570">Kreditné karty</translation> @@ -309,6 +316,7 @@ <translation id="5659593005791499971">E-mail</translation> <translation id="5669528293118408608">www</translation> <translation id="567881659373499783">Verzia <ph name="PRODUCT_VERSION" /></translation> +<translation id="5706552126692816153">Aktívne včera</translation> <translation id="5711039611392265845">Ďalšie nastavenia týkajúce sa ochrany súkromia, zabezpečenia a zhromažďovania údajov nájdete v časti <ph name="BEGIN_LINK" />Synchronizácia a služby Googlu<ph name="END_LINK" />.</translation> <translation id="5728700505257787410">Je nám ľúto, pri prihlasovaní do účtu sa vyskytol problém.</translation> <translation id="5737974891429562743">Informácie o prihlásení do účtu sú neaktuálne. Ak chcete spustiť synchronizáciu, aktualizujte ich.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_sl.xtb b/ios/chrome/app/strings/resources/ios_strings_sl.xtb index 2384def..793c18e 100644 --- a/ios/chrome/app/strings/resources/ios_strings_sl.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_sl.xtb
@@ -25,6 +25,7 @@ <translation id="1254117744268754948">Izbira mape</translation> <translation id="1265739287306757398">Več o tem</translation> <translation id="1272079795634619415">Ustavi</translation> +<translation id="1283524564873030414">Zadnjih 24 ur</translation> <translation id="1323735185997015385">Izbriši</translation> <translation id="132683371494960526">Double tap to change the parent folder.</translation> <translation id="1340643665687018190">Close Menu</translation> @@ -79,6 +80,7 @@ <translation id="1974060860693918893">Dodatno</translation> <translation id="1989112275319619282">Brskanje</translation> <translation id="2015722694326466240">Če si želite ogledati gesla, morate najprej nastaviti geslo v napravi.</translation> +<translation id="2073572773299281212">Aktivna pred toliko dnevi: <ph name="DAYS" /></translation> <translation id="2074131957428911366">V <ph name="BEGIN_LINK" />nastavitvah<ph name="END_LINK" /> lahko kadar koli izberete, kaj želite sinhronizirati.</translation> <translation id="2079545284768500474">Razveljavi</translation> <translation id="209018056901015185">Zahtevaj spletno mesto za nam. računalnik</translation> @@ -113,6 +115,7 @@ <translation id="2529021024822217800">Odpri vse</translation> <translation id="2570206273416014374">Pošilja nekatere piškotke in iskanja iz naslovne vrstice ter iskalnega polja privzetemu iskalniku.</translation> <translation id="2572712655377361602">Pravilnik o napravah je blokiral dostop do fotografij.</translation> +<translation id="2578571896248130439">Pošlji spletno stran</translation> <translation id="2584132361465095047">Dodajanje računa ...</translation> <translation id="2625189173221582860">Geslo kopirano</translation> <translation id="2648803196158606475">Izbriši prebrano</translation> @@ -152,6 +155,7 @@ <translation id="3112556859945124369">Označi …</translation> <translation id="3157684681743766797">Označi vse …</translation> <translation id="3175081911749765310">Spletne storitve</translation> +<translation id="3178650076442119961">Aktivna danes</translation> <translation id="3207960819495026254">Dodano med zaznamke</translation> <translation id="3224641773458703735">Če želite izvoziti gesla, morate najprej nastaviti geslo v napravi.</translation> <translation id="3240426699337459095">Povezava kopirana</translation> @@ -226,6 +230,7 @@ <translation id="4272631900155121838">Če želite optično prebrati kodo QR, v nastavitvah omogočite fotoaparat</translation> <translation id="4281844954008187215">Pogoji storitve</translation> <translation id="430793432425771671">Sinhroniziraj vse</translation> +<translation id="430967081421617822">Od začetka</translation> <translation id="4338650699862464074">Googlu pošlje URL-je strani, ki jih obiščete.</translation> <translation id="4359125752503270327">This page will open in another application.</translation> <translation id="4370827530403103842">Sync isn't working. Tap to fix.</translation> @@ -281,6 +286,7 @@ <translation id="5127805178023152808">Sinhroniziranje je izklopljeno</translation> <translation id="5132942445612118989">Sinhronizirajte gesla, zgodovino in drugo v vseh napravah</translation> <translation id="5140288047769711648">Chrome si bo zapomnil to geslo namesto vas. Ni si vam ga treba zapomniti.</translation> +<translation id="5150492518600715772">Pošlji v napravo</translation> <translation id="5181140330217080051">Prenos</translation> <translation id="5186185447130319458">Zasebno</translation> <translation id="5190835502935405962">Vrstica z zaznamki</translation> @@ -295,6 +301,7 @@ <translation id="5327248766486351172">Ime</translation> <translation id="5388358297987318779">Odpri sliko</translation> <translation id="5409365236829784218">Nameščena ni nobena apl. za odpiranje te datoteke.</translation> +<translation id="5416022985862681400">Zadnjih 7 dni</translation> <translation id="5433691172869980887">Uporabniško ime kopirano</translation> <translation id="54401264925851789">Informacije o varnosti strani</translation> <translation id="5443952882982198570">Kreditne kartice</translation> @@ -309,6 +316,7 @@ <translation id="5659593005791499971">E-pošta</translation> <translation id="5669528293118408608">www</translation> <translation id="567881659373499783">Različica <ph name="PRODUCT_VERSION" /></translation> +<translation id="5706552126692816153">Aktivna pred 1 dnevom</translation> <translation id="5711039611392265845">Če vas zanima več nastavitev, povezanih z zasebnostjo, varnostjo in zbiranjem podatkov, si oglejte razdelek <ph name="BEGIN_LINK" />Sinhronizacija in Googlove storitve<ph name="END_LINK" /></translation> <translation id="5728700505257787410">Žal je bila pri prijavi v račun težava.</translation> <translation id="5737974891429562743">Account sign-in details are out of date. Update to start sync.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_sr.xtb b/ios/chrome/app/strings/resources/ios_strings_sr.xtb index 4eac952..232a84f 100644 --- a/ios/chrome/app/strings/resources/ios_strings_sr.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_sr.xtb
@@ -25,6 +25,7 @@ <translation id="1254117744268754948">Избор директоријума</translation> <translation id="1265739287306757398">Сазнајте како</translation> <translation id="1272079795634619415">Заустави</translation> +<translation id="1283524564873030414">Последња 24 сата</translation> <translation id="1323735185997015385">Избриши</translation> <translation id="132683371494960526">Додирните двапут да бисте променили надређени директоријум.</translation> <translation id="1340643665687018190">Затвори мени</translation> @@ -79,6 +80,7 @@ <translation id="1974060860693918893">Напредне опције</translation> <translation id="1989112275319619282">Прегледај</translation> <translation id="2015722694326466240">Да бисте видели лозинке, прво морате да подесите шифру на уређају.</translation> +<translation id="2073572773299281212">Последња активност: пре <ph name="DAYS" /> дан/а</translation> <translation id="2074131957428911366">Увек можете да одаберете шта ћете синхронизовати у <ph name="BEGIN_LINK" />подешавањима<ph name="END_LINK" />.</translation> <translation id="2079545284768500474">Опозови</translation> <translation id="209018056901015185">Захтевај сајт за рачунар</translation> @@ -113,6 +115,7 @@ <translation id="2529021024822217800">Отвори све</translation> <translation id="2570206273416014374">Подразумеваном претраживачу шаље неке колачиће и претраге из траке за адресу и оквира за претрагу.</translation> <translation id="2572712655377361602">Смернице за уређај су блокирале приступ сликама</translation> +<translation id="2578571896248130439">Пошаљите веб-страницу</translation> <translation id="2584132361465095047">Додај налог…</translation> <translation id="2625189173221582860">Лозинка је копирана</translation> <translation id="2648803196158606475">Избриши прочитано</translation> @@ -152,6 +155,7 @@ <translation id="3112556859945124369">Означи…</translation> <translation id="3157684681743766797">Означи све…</translation> <translation id="3175081911749765310">Веб-услуге</translation> +<translation id="3178650076442119961">Последња активност: данас</translation> <translation id="3207960819495026254">Обележено</translation> <translation id="3224641773458703735">Да бисте извозили лозинке, прво морате да подесите шифру на уређају.</translation> <translation id="3240426699337459095">Линк је копиран</translation> @@ -226,6 +230,7 @@ <translation id="4272631900155121838">Да бисте скенирали QR кôд, омогућите камеру у подешавањима</translation> <translation id="4281844954008187215">Услови коришћења услуге</translation> <translation id="430793432425771671">Синхронизуј све</translation> +<translation id="430967081421617822">Одувек</translation> <translation id="4338650699862464074">Шаље URL-ове страница које посећујете Google-у.</translation> <translation id="4359125752503270327">Ова страница ће се отворити у другој апликацији.</translation> <translation id="4370827530403103842">Синхронизација не функционише. Додирните да бисте решили проблем.</translation> @@ -281,6 +286,7 @@ <translation id="5127805178023152808">Синхронизација је искључена</translation> <translation id="5132942445612118989">Синхронизујте лозинке, историју и други садржај на свим уређајима</translation> <translation id="5140288047769711648">Chrome ће запамтити ову лозинку уместо вас. Не морате ви да је памтите.</translation> +<translation id="5150492518600715772">Пошаљите на уређај</translation> <translation id="5181140330217080051">Преузимање</translation> <translation id="5186185447130319458">Приватно</translation> <translation id="5190835502935405962">Трака са обележивачима</translation> @@ -295,6 +301,7 @@ <translation id="5327248766486351172">Назив</translation> <translation id="5388358297987318779">Отвори слику</translation> <translation id="5409365236829784218">Није инсталирана ниједна апликација за отварање ове датотеке.</translation> +<translation id="5416022985862681400">Последњих 7 дана</translation> <translation id="5433691172869980887">Корисничко име је копирано</translation> <translation id="54401264925851789">Информације о безбедности странице</translation> <translation id="5443952882982198570">Кредитне картице</translation> @@ -309,6 +316,7 @@ <translation id="5659593005791499971">Имејл</translation> <translation id="5669528293118408608">www</translation> <translation id="567881659373499783">Верзија <ph name="PRODUCT_VERSION" /></translation> +<translation id="5706552126692816153">Последња активност: пре 1 дан</translation> <translation id="5711039611392265845">Више подешавања у вези са приватношћу, безбедношћу и прикупљањем података потражите у одељку <ph name="BEGIN_LINK" />Синхронизација и Google услуге<ph name="END_LINK" />.</translation> <translation id="5728700505257787410">Жао нам је, дошло је до проблема при пријављивању на налог.</translation> <translation id="5737974891429562743">Подаци за пријављивање на налог су застарели. Ажурирајте их да бисте започели синхронизацију.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_sw.xtb b/ios/chrome/app/strings/resources/ios_strings_sw.xtb index fc8eda73..0cb278bc 100644 --- a/ios/chrome/app/strings/resources/ios_strings_sw.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_sw.xtb
@@ -25,6 +25,7 @@ <translation id="1254117744268754948">Chagua Folda</translation> <translation id="1265739287306757398">Pata Maelezo Zaidi</translation> <translation id="1272079795634619415">Simamisha</translation> +<translation id="1283524564873030414">Saa 24 Zilizopita</translation> <translation id="1323735185997015385">Futa</translation> <translation id="132683371494960526">Gusa mara mbili ili ubadilishe folda kuu.</translation> <translation id="1340643665687018190">Funga Menyu</translation> @@ -79,6 +80,7 @@ <translation id="1974060860693918893">Mipangilio ya kina</translation> <translation id="1989112275319619282">Vinjari</translation> <translation id="2015722694326466240">Ili uone manenosiri, ni lazima kwanza uweke nambari ya siri kwenye kifaa chako.</translation> +<translation id="2073572773299281212">Ilitumika Siku <ph name="DAYS" /> Zilizopita</translation> <translation id="2074131957428911366">Unaweza kuchagua utakachosawazisha wakati wowote katika <ph name="BEGIN_LINK" />mipangilio<ph name="END_LINK" />.</translation> <translation id="2079545284768500474">Tendua</translation> <translation id="209018056901015185">Omba Tovuti ya Eneo-kazi</translation> @@ -113,6 +115,7 @@ <translation id="2529021024822217800">Fungua Zote</translation> <translation id="2570206273416014374">Hutuma baadhi ya vidakuzi na utafutaji kutoka sehemu ya anwani na kisanduku cha kutafutia kwenye mtambo wako chaguomsingi wa kutafuta.</translation> <translation id="2572712655377361602">Sera ya kifaa imezuia idhini ya kufikia picha zako</translation> +<translation id="2578571896248130439">Tuma Ukurasa wa Wavuti</translation> <translation id="2584132361465095047">Ongeza Akaunti...</translation> <translation id="2625189173221582860">Nenosiri limenakiliwa</translation> <translation id="2648803196158606475">Futa Zilizosomwa</translation> @@ -152,6 +155,7 @@ <translation id="3112556859945124369">Tia alama…</translation> <translation id="3157684681743766797">Tia Zote Alama...</translation> <translation id="3175081911749765310">Huduma za Wavuti</translation> +<translation id="3178650076442119961">Kimetumika Leo</translation> <translation id="3207960819495026254">Imealamishwa</translation> <translation id="3224641773458703735">Ili utume manenosiri, ni lazima kwanza uweke nambari ya siri kwenye kifaa chako.</translation> <translation id="3240426699337459095">Kiungo kimenakiliwa</translation> @@ -226,6 +230,7 @@ <translation id="4272631900155121838">Ili kuchanganua msimbo wa QR, washa kamera kwenye mipangilio</translation> <translation id="4281844954008187215">Sheria na Masharti</translation> <translation id="430793432425771671">Sawazisha Kila kitu</translation> +<translation id="430967081421617822">Muda Wote</translation> <translation id="4338650699862464074">Hutuma URL za kurasa unazotembelea kwa Google.</translation> <translation id="4359125752503270327">Ukurasa huu utafunguka katika programu nyingine.</translation> <translation id="4370827530403103842">Kipengele cha usawazishaji hakifanyi kazi. Gusa ili urekebishe.</translation> @@ -281,6 +286,7 @@ <translation id="5127805178023152808">Usawazishaji umezimwa</translation> <translation id="5132942445612118989">Sawazisha historia, manenosiri na mambo yako mengine kwenye vifaa vyote</translation> <translation id="5140288047769711648">Chrome itakumbuka nenosiri hili kwa niaba yako. Huhitaji kulikumbuka.</translation> +<translation id="5150492518600715772">Tuma Kwenye Kifaa Chako</translation> <translation id="5181140330217080051">Inapakua</translation> <translation id="5186185447130319458">Faragha</translation> <translation id="5190835502935405962">Sehemu ya Alamisho</translation> @@ -295,6 +301,7 @@ <translation id="5327248766486351172">Jina</translation> <translation id="5388358297987318779">Fungua Picha</translation> <translation id="5409365236829784218">Hakuna programu zilizosakinishwa zinazoweza kufungua faili hii.</translation> +<translation id="5416022985862681400">Siku 7 Zilizopita</translation> <translation id="5433691172869980887">Jina la mtumiaji limenakiliwa</translation> <translation id="54401264925851789">Maelezo ya Usalama wa Ukurasa</translation> <translation id="5443952882982198570">Kadi za Mikopo</translation> @@ -309,6 +316,7 @@ <translation id="5659593005791499971">Barua pepe</translation> <translation id="5669528293118408608">www</translation> <translation id="567881659373499783">Toleo <ph name="PRODUCT_VERSION" /></translation> +<translation id="5706552126692816153">Ilitumika Siku 1 Iliyopita</translation> <translation id="5711039611392265845">Ili upate mipangilio zaidi inayohusiana na faragha, usalama na ukusanyaji wa data, angalia <ph name="BEGIN_LINK" />Huduma za Google na Usawazishaji<ph name="END_LINK" />.</translation> <translation id="5728700505257787410">Samahani, kulikuwa na tatizo wakati wa kuingia kwenye akaunti yako.</translation> <translation id="5737974891429562743">Maelezo ya kuingia kwenye akaunti hayatumiki tena. Sasisha ili uanze kusawazisha.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_th.xtb b/ios/chrome/app/strings/resources/ios_strings_th.xtb index 983bb97..cf8537e 100644 --- a/ios/chrome/app/strings/resources/ios_strings_th.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_th.xtb
@@ -25,6 +25,7 @@ <translation id="1254117744268754948">เลือกโฟลเดอร์</translation> <translation id="1265739287306757398">เรียนรู้วิธี</translation> <translation id="1272079795634619415">หยุด</translation> +<translation id="1283524564873030414">24 ชั่วโมงที่ผ่านมา</translation> <translation id="1323735185997015385">ลบ</translation> <translation id="132683371494960526">แตะ 2 ครั้งเพื่อเปลี่ยนโฟลเดอร์ระดับบนสุด</translation> <translation id="1340643665687018190">ปิดเมนู</translation> @@ -79,6 +80,7 @@ <translation id="1974060860693918893">ขั้นสูง</translation> <translation id="1989112275319619282">เล่นเน็ต</translation> <translation id="2015722694326466240">หากต้องการดูรหัสผ่าน คุณต้องตั้งพาสโค้ดในอุปกรณ์ก่อน</translation> +<translation id="2073572773299281212">ใช้งานเมื่อ <ph name="DAYS" /> วันที่ผ่านมา</translation> <translation id="2074131957428911366">คุณเลือกสิ่งที่ต้องการซิงค์ได้เสมอใน<ph name="BEGIN_LINK" />การตั้งค่า<ph name="END_LINK" /></translation> <translation id="2079545284768500474">เลิกทำ</translation> <translation id="209018056901015185">ขอไซต์สำหรับเดสก์ท็อป</translation> @@ -113,6 +115,7 @@ <translation id="2529021024822217800">เปิดทั้งหมด</translation> <translation id="2570206273416014374">ส่งคุกกี้และการค้นหาบางรายการจากแถบที่อยู่และช่องค้นหาไปยังเครื่องมือค้นหาเริ่มต้น</translation> <translation id="2572712655377361602">นโยบายของอุปกรณ์บล็อกการเข้าถึงรูปภาพของคุณ</translation> +<translation id="2578571896248130439">ส่งหน้าเว็บ</translation> <translation id="2584132361465095047">เพิ่มบัญชี…</translation> <translation id="2625189173221582860">คัดลอกรหัสผ่านแล้ว</translation> <translation id="2648803196158606475">ลบรายการที่อ่านแล้ว</translation> @@ -152,6 +155,7 @@ <translation id="3112556859945124369">ทำเครื่องหมาย…</translation> <translation id="3157684681743766797">ทำเครื่องหมายทั้งหมด…</translation> <translation id="3175081911749765310">บริการทางเว็บ</translation> +<translation id="3178650076442119961">ใช้งานวันนี้</translation> <translation id="3207960819495026254">บุ๊กมาร์กแล้ว</translation> <translation id="3224641773458703735">หากต้องการส่งออกรหัสผ่าน คุณต้องตั้งรหัสผ่านในอุปกรณ์ก่อน</translation> <translation id="3240426699337459095">คัดลอกลิงก์แล้ว</translation> @@ -226,6 +230,7 @@ <translation id="4272631900155121838">หากต้องการสแกนโค้ด QR ให้เปิดใช้กล้องถ่ายรูปจากการตั้งค่า</translation> <translation id="4281844954008187215">ข้อกำหนดในการให้บริการ</translation> <translation id="430793432425771671">ซิงค์ทุกอย่าง</translation> +<translation id="430967081421617822">ตั้งแต่ต้น</translation> <translation id="4338650699862464074">ส่ง URL ของหน้าที่คุณเข้าชมไปยัง Google</translation> <translation id="4359125752503270327">หน้านี้จะเปิดในแอปพลิเคชันอื่น</translation> <translation id="4370827530403103842">การซิงค์ไม่ทำงาน แตะเพื่อแก้ไข</translation> @@ -281,6 +286,7 @@ <translation id="5127805178023152808">การซิงค์ปิดอยู่</translation> <translation id="5132942445612118989">ซิงค์รหัสผ่าน ประวัติการเข้าชม และอื่นๆ ในอุปกรณ์ทุกเครื่อง</translation> <translation id="5140288047769711648">Chrome จะจำรหัสผ่านนี้ให้คุณ คุณไม่จำเป็นต้องจำเอง</translation> +<translation id="5150492518600715772">ส่งไปที่อุปกรณ์</translation> <translation id="5181140330217080051">กำลังดาวน์โหลด</translation> <translation id="5186185447130319458">ส่วนตัว</translation> <translation id="5190835502935405962">แถบบุ๊กมาร์ก</translation> @@ -295,6 +301,7 @@ <translation id="5327248766486351172">ชื่อ</translation> <translation id="5388358297987318779">เปิดภาพ</translation> <translation id="5409365236829784218">ไม่ได้ติดตั้งแอปพลิเคชันที่สามารถเปิดไฟล์นี้</translation> +<translation id="5416022985862681400">7 วันที่ผ่านมา</translation> <translation id="5433691172869980887">คัดลอกชื่อผู้ใช้แล้ว</translation> <translation id="54401264925851789">ข้อมูลเกี่ยวกับการรักษาความปลอดภัยของหน้าเว็บ</translation> <translation id="5443952882982198570">บัตรเครดิต</translation> @@ -309,6 +316,7 @@ <translation id="5659593005791499971">อีเมล</translation> <translation id="5669528293118408608">www</translation> <translation id="567881659373499783">รุ่น <ph name="PRODUCT_VERSION" /></translation> +<translation id="5706552126692816153">ใช้งานเมื่อ 1 วันที่ผ่านมา</translation> <translation id="5711039611392265845">ดูการตั้งค่าเพิ่มเติมเกี่ยวกับความเป็นส่วนตัว ความปลอดภัย และการรวบรวมข้อมูลได้ที่<ph name="BEGIN_LINK" />การซิงค์และบริการต่างๆ ของ Google<ph name="END_LINK" /></translation> <translation id="5728700505257787410">ขออภัย เกิดปัญหาในการลงชื่อเข้าใช้บัญชีของคุณ</translation> <translation id="5737974891429562743">รายละเอียดการลงชื่อเข้าใช้บัญชีล้าสมัยแล้ว โปรดอัปเดตเพื่อเริ่มการซิงค์</translation>
diff --git a/ios/chrome/browser/metrics/tab_usage_recorder_egtest.mm b/ios/chrome/browser/metrics/tab_usage_recorder_egtest.mm index 329b03ec..0ead77b 100644 --- a/ios/chrome/browser/metrics/tab_usage_recorder_egtest.mm +++ b/ios/chrome/browser/metrics/tab_usage_recorder_egtest.mm
@@ -79,12 +79,10 @@ // page. void NewMainTabWithURL(const GURL& url, const std::string& word) { int number_of_tabs = [ChromeEarlGrey mainTabCount]; - CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey openNewTab]); - CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:url]); - CHROME_EG_ASSERT_NO_ERROR( - [ChromeEarlGrey waitForWebStateContainingText:word]); - CHROME_EG_ASSERT_NO_ERROR( - [ChromeEarlGrey waitForMainTabCount:(number_of_tabs + 1)]); + [ChromeEarlGrey openNewTab]; + [ChromeEarlGrey loadURL:url]; + [ChromeEarlGrey waitForWebStateContainingText:word]; + [ChromeEarlGrey waitForMainTabCount:(number_of_tabs + 1)]; } // Opens 2 new tabs with different URLs. @@ -134,7 +132,7 @@ // Open two tabs with urls. OpenTwoTabs(); - CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey waitForMainTabCount:2]); + [ChromeEarlGrey waitForMainTabCount:2]; // Switch between the two tabs. Both are currently in memory. [ChromeEarlGrey selectTabAtIndex:0]; @@ -153,8 +151,7 @@ // Switch back to the normal tabs. Should be on tab one. CHROME_EG_ASSERT_NO_ERROR(SwitchToNormalMode()); - CHROME_EG_ASSERT_NO_ERROR( - [ChromeEarlGrey waitForWebStateContainingText:kURL1FirstWord]); + [ChromeEarlGrey waitForWebStateContainingText:kURL1FirstWord]; histogramTester.ExpectTotalCount(kSelectedTabHistogramName, 2, failureBlock); histogramTester.ExpectBucketCount(kSelectedTabHistogramName, @@ -178,11 +175,10 @@ // Open three tabs with http:// urls. for (NSUInteger i = 0; i < numberOfTabs; i++) { - CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey openNewTab]); - CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:url1]); - CHROME_EG_ASSERT_NO_ERROR( - [ChromeEarlGrey waitForWebStateContainingText:kURL1FirstWord]); - CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey waitForMainTabCount:(i + 1)]); + [ChromeEarlGrey openNewTab]; + [ChromeEarlGrey loadURL:url1]; + [ChromeEarlGrey waitForWebStateContainingText:kURL1FirstWord]; + [ChromeEarlGrey waitForMainTabCount:(i + 1)]; } // Switch between the tabs. They are currently in memory. @@ -209,22 +205,20 @@ }), @"JavaScript to reload each tab did not finish"); [ChromeEarlGreyUI reload]; - CHROME_EG_ASSERT_NO_ERROR( - [ChromeEarlGrey waitForWebStateContainingText:kURL1FirstWord]); + [ChromeEarlGrey waitForWebStateContainingText:kURL1FirstWord]; } // Evict the tab. Create a dummy tab so that switching back to normal mode // does not trigger a reload immediately. - CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey openNewTab]); + [ChromeEarlGrey openNewTab]; CHROME_EG_ASSERT_NO_ERROR(OpenNewIncognitoTabUsingUIAndEvictMainTabs()); - CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey waitForIncognitoTabCount:1]); + [ChromeEarlGrey waitForIncognitoTabCount:1]; // Switch back to the normal tabs. Should be on tab one. CHROME_EG_ASSERT_NO_ERROR(SwitchToNormalMode()); [ChromeEarlGrey selectTabAtIndex:0]; - CHROME_EG_ASSERT_NO_ERROR( - [ChromeEarlGrey waitForWebStateContainingText:kURL1FirstWord]); + [ChromeEarlGrey waitForWebStateContainingText:kURL1FirstWord]; // Verify that one page-load count has been recorded. It should contain two // page loads for each tab created. @@ -250,7 +244,7 @@ // Open two tabs with urls. OpenTwoTabs(); - CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey waitForMainTabCount:2]); + [ChromeEarlGrey waitForMainTabCount:2]; // Set the normal tabs as 'cold start' tabs. [ChromeEarlGrey setCurrentTabsToBeColdStartTabs]; @@ -258,18 +252,16 @@ CHROME_EG_ASSERT_NO_ERROR(OpenNewIncognitoTabUsingUIAndEvictMainTabs()); CHROME_EG_ASSERT_NO_ERROR(OpenNewIncognitoTabUsingUIAndEvictMainTabs()); - CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey waitForIncognitoTabCount:2]); + [ChromeEarlGrey waitForIncognitoTabCount:2]; // Switch back to the normal tabs. CHROME_EG_ASSERT_NO_ERROR(SwitchToNormalMode()); - CHROME_EG_ASSERT_NO_ERROR( - [ChromeEarlGrey waitForWebStateContainingText:kURL2FirstWord]); + [ChromeEarlGrey waitForWebStateContainingText:kURL2FirstWord]; // Select the other one so it also reloads. [ChromeEarlGrey selectTabAtIndex:0]; - CHROME_EG_ASSERT_NO_ERROR( - [ChromeEarlGrey waitForWebStateContainingText:kURL1FirstWord]); + [ChromeEarlGrey waitForWebStateContainingText:kURL1FirstWord]; FailureBlock failureBlock = ^(NSString* error) { GREYFail(error); }; @@ -285,8 +277,7 @@ [ChromeEarlGrey selectTabAtIndex:1]; [ChromeEarlGrey selectTabAtIndex:0]; - CHROME_EG_ASSERT_NO_ERROR( - [ChromeEarlGrey waitForWebStateContainingText:kURL1FirstWord]); + [ChromeEarlGrey waitForWebStateContainingText:kURL1FirstWord]; histogramTester.ExpectBucketCount(kSelectedTabHistogramName, TabUsageRecorder::EVICTED_DUE_TO_COLD_START, 1, failureBlock); @@ -307,7 +298,7 @@ // Open two tabs with urls. OpenTwoTabs(); - CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey waitForMainTabCount:2]); + [ChromeEarlGrey waitForMainTabCount:2]; // Simulate going into the background. [ChromeEarlGrey simulateTabsBackgrounding]; @@ -321,8 +312,7 @@ // Switch back to the normal tabs. CHROME_EG_ASSERT_NO_ERROR(SwitchToNormalMode()); - CHROME_EG_ASSERT_NO_ERROR( - [ChromeEarlGrey waitForWebStateContainingText:kURL2FirstWord]); + [ChromeEarlGrey waitForWebStateContainingText:kURL2FirstWord]; const GURL url1 = web::test::HttpServer::MakeUrl(kTestUrl1); const GURL url2 = web::test::HttpServer::MakeUrl(kTestUrl2); @@ -332,8 +322,7 @@ histogramTester.ExpectTotalCount(kEvictedTabReloadTime, 1, failureBlock); [ChromeEarlGrey selectTabAtIndex:0]; - CHROME_EG_ASSERT_NO_ERROR( - [ChromeEarlGrey waitForWebStateContainingText:kURL1FirstWord]); + [ChromeEarlGrey waitForWebStateContainingText:kURL1FirstWord]; [[EarlGrey selectElementWithMatcher:chrome_test_util::OmniboxText(url1.GetContent())] assertWithMatcher:grey_notNil()]; @@ -356,9 +345,8 @@ CHROME_EG_ASSERT_NO_ERROR(OpenNewIncognitoTabUsingUIAndEvictMainTabs()); CHROME_EG_ASSERT_NO_ERROR(SwitchToNormalMode()); - CHROME_EG_ASSERT_NO_ERROR( - [ChromeEarlGrey waitForWebStateContainingText:kURL1FirstWord]); - CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey waitForMainTabCount:1]); + [ChromeEarlGrey waitForWebStateContainingText:kURL1FirstWord]; + [ChromeEarlGrey waitForMainTabCount:1]; histogramTester.ExpectUniqueSample(kEvictedTabReloadSuccessRate, TabUsageRecorder::LOAD_SUCCESS, 1, @@ -385,10 +373,9 @@ }; // A blank tab needed to switch to it after reloading. - CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey openNewTab]); - CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey openNewTab]); - CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:slowURL - waitForCompletion:NO]); + [ChromeEarlGrey openNewTab]; + [ChromeEarlGrey openNewTab]; + [ChromeEarlGrey loadURL:slowURL waitForCompletion:NO]; CHROME_EG_ASSERT_NO_ERROR(OpenNewIncognitoTabUsingUIAndEvictMainTabs()); web::test::SetUpHttpServer(std::make_unique<web::DelayedResponseProvider>( @@ -466,7 +453,7 @@ grey_sufficientlyVisible(), nil); Wait(toolMenuMatcher, @"Tool Menu"); - CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey openNewTab]); + [ChromeEarlGrey openNewTab]; [[GREYConfiguration sharedInstance] setValue:@(YES) forConfigKey:kGREYConfigKeySynchronizationEnabled]; @@ -498,8 +485,7 @@ [ChromeEarlGreyUI tapSettingsMenuButton:SettingsMenuPrivacyButton()]; [[EarlGrey selectElementWithMatcher:SettingsDoneButton()] performAction:grey_tap()]; - CHROME_EG_ASSERT_NO_ERROR( - [ChromeEarlGrey waitForWebStateContainingText:responses[slowURL]]); + [ChromeEarlGrey waitForWebStateContainingText:responses[slowURL]]; histogramTester.ExpectBucketCount(kDidUserWaitForEvictedTabReload, TabUsageRecorder::USER_DID_NOT_WAIT, 0, @@ -519,9 +505,8 @@ web::test::SetUpHttpServer(std::make_unique<HtmlResponseProvider>(responses)); chrome_test_util::HistogramTester histogramTester; - CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey openNewTab]); - CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:slowURL - waitForCompletion:NO]); + [ChromeEarlGrey openNewTab]; + [ChromeEarlGrey loadURL:slowURL waitForCompletion:NO]; CHROME_EG_ASSERT_NO_ERROR(OpenNewIncognitoTabUsingUIAndEvictMainTabs()); web::test::SetUpHttpServer(std::make_unique<web::DelayedResponseProvider>( @@ -572,12 +557,11 @@ chrome_test_util::HistogramTester histogramTester; // We need two tabs to be able to switch. - CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey openNewTab]); + [ChromeEarlGrey openNewTab]; [[GREYConfiguration sharedInstance] setValue:@(NO) forConfigKey:kGREYConfigKeySynchronizationEnabled]; - CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:slowURL - waitForCompletion:NO]); + [ChromeEarlGrey loadURL:slowURL waitForCompletion:NO]; // Ensure loading starts but is not finished. base::test::ios::SpinRunLoopWithMaxDelay(base::TimeDelta::FromSeconds(1)); @@ -611,13 +595,12 @@ assertWithMatcher:grey_notNil()]; NSUInteger tabIndex = [ChromeEarlGrey mainTabCount] - 1; - CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey openNewTab]); + [ChromeEarlGrey openNewTab]; CHROME_EG_ASSERT_NO_ERROR(OpenNewIncognitoTabUsingUIAndEvictMainTabs()); CHROME_EG_ASSERT_NO_ERROR(SwitchToNormalMode()); [ChromeEarlGrey selectTabAtIndex:tabIndex]; - CHROME_EG_ASSERT_NO_ERROR( - [ChromeEarlGrey waitForWebStateContainingText:"arrived"]); + [ChromeEarlGrey waitForWebStateContainingText:"arrived"]; FailureBlock failureBlock = ^(NSString* error) { GREYFail(error); @@ -655,18 +638,16 @@ // Open a tab with a link to click. NewMainTabWithURL(initialURL, "link"); // Click the link. - CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey tapWebStateElementWithID:@"link"]); + [ChromeEarlGrey tapWebStateElementWithID:@"link"]; - CHROME_EG_ASSERT_NO_ERROR( - [ChromeEarlGrey waitForWebStateContainingText:"Whee"]); + [ChromeEarlGrey waitForWebStateContainingText:"Whee"]; NSUInteger tabIndex = [ChromeEarlGrey mainTabCount] - 1; - CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey openNewTab]); + [ChromeEarlGrey openNewTab]; CHROME_EG_ASSERT_NO_ERROR(OpenNewIncognitoTabUsingUIAndEvictMainTabs()); CHROME_EG_ASSERT_NO_ERROR(SwitchToNormalMode()); [ChromeEarlGrey selectTabAtIndex:tabIndex]; - CHROME_EG_ASSERT_NO_ERROR( - [ChromeEarlGrey waitForWebStateContainingText:"Whee"]); + [ChromeEarlGrey waitForWebStateContainingText:"Whee"]; // Verify that the page-load count has been recorded. It should contain a // sum of 2 - one sample with 2 page loads. @@ -719,14 +700,12 @@ [[EarlGrey selectElementWithMatcher:OpenLinkInNewTabButton()] performAction:grey_tap()]; - CHROME_EG_ASSERT_NO_ERROR( - [ChromeEarlGrey waitForMainTabCount:(numberOfTabs + 1)]); + [ChromeEarlGrey waitForMainTabCount:(numberOfTabs + 1)]; [ChromeEarlGrey selectTabAtIndex:numberOfTabs]; [[GREYUIThreadExecutor sharedInstance] drainUntilIdle]; - CHROME_EG_ASSERT_NO_ERROR( - [ChromeEarlGrey waitForWebStateContainingText:"Whee"]); + [ChromeEarlGrey waitForWebStateContainingText:"Whee"]; FailureBlock failureBlock = ^(NSString* error) { GREYFail(error); @@ -742,7 +721,7 @@ chrome_test_util::HistogramTester histogramTester; [ChromeEarlGrey resetTabUsageRecorder]; - CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey openNewTab]); + [ChromeEarlGrey openNewTab]; GURL url(kTestUrl1); chrome_test_util::OpenChromeFromExternalApp(url);
diff --git a/ios/chrome/browser/metrics/ukm_egtest.mm b/ios/chrome/browser/metrics/ukm_egtest.mm index 1f6bfce..deaf9d21 100644 --- a/ios/chrome/browser/metrics/ukm_egtest.mm +++ b/ios/chrome/browser/metrics/ukm_egtest.mm
@@ -133,9 +133,8 @@ void OpenNewIncognitoTab() { NSUInteger incognito_tab_count = [ChromeEarlGrey incognitoTabCount]; - CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey openNewIncognitoTab]); - CHROME_EG_ASSERT_NO_ERROR( - [ChromeEarlGrey waitForIncognitoTabCount:(incognito_tab_count + 1)]); + [ChromeEarlGrey openNewIncognitoTab]; + [ChromeEarlGrey waitForIncognitoTabCount:(incognito_tab_count + 1)]; GREYAssert([ChromeEarlGrey isIncognitoMode], @"Failed to switch to incognito mode."); } @@ -143,13 +142,12 @@ void CloseCurrentIncognitoTab() { NSUInteger incognito_tab_count = [ChromeEarlGrey incognitoTabCount]; [ChromeEarlGrey closeCurrentTab]; - CHROME_EG_ASSERT_NO_ERROR( - [ChromeEarlGrey waitForIncognitoTabCount:(incognito_tab_count - 1)]); + [ChromeEarlGrey waitForIncognitoTabCount:(incognito_tab_count - 1)]; } void CloseAllIncognitoTabs() { - CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey closeAllIncognitoTabs]); - CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey waitForIncognitoTabCount:0]); + [ChromeEarlGrey closeAllIncognitoTabs]; + [ChromeEarlGrey waitForIncognitoTabCount:0]; // The user is dropped into the tab grid after closing the last incognito tab. // Therefore this test must manually switch back to showing the normal tabs. @@ -164,9 +162,8 @@ void OpenNewRegularTab() { NSUInteger tab_count = [ChromeEarlGrey mainTabCount]; - CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey openNewTab]); - CHROME_EG_ASSERT_NO_ERROR( - [ChromeEarlGrey waitForMainTabCount:(tab_count + 1)]); + [ChromeEarlGrey openNewTab]; + [ChromeEarlGrey waitForMainTabCount:(tab_count + 1)]; } // Grant/revoke metrics consent and update MetricsServicesManager. @@ -217,16 +214,14 @@ - (void)setUp { [super setUp]; - CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey - waitForSyncInitialized:NO - syncTimeout:kSyncUKMOperationsTimeout]); + [ChromeEarlGrey waitForSyncInitialized:NO + syncTimeout:kSyncUKMOperationsTimeout]; AssertUKMEnabled(false); // Enable sync. [SigninEarlGreyUI signinWithIdentity:[SigninEarlGreyUtils fakeIdentity1]]; - CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey - waitForSyncInitialized:YES - syncTimeout:kSyncUKMOperationsTimeout]); + [ChromeEarlGrey waitForSyncInitialized:YES + syncTimeout:kSyncUKMOperationsTimeout]; // Grant metrics consent and update MetricsServicesManager. GREYAssert(!g_metrics_enabled, @"Unpaired set/reset of user consent."); @@ -239,9 +234,8 @@ } - (void)tearDown { - CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey - waitForSyncInitialized:YES - syncTimeout:kSyncUKMOperationsTimeout]); + [ChromeEarlGrey waitForSyncInitialized:YES + syncTimeout:kSyncUKMOperationsTimeout]; AssertUKMEnabled(true); // Revoke metrics consent and update MetricsServicesManager. @@ -255,9 +249,8 @@ // Disable sync. SignOut(); - CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey - waitForSyncInitialized:NO - syncTimeout:kSyncUKMOperationsTimeout]); + [ChromeEarlGrey waitForSyncInitialized:NO + syncTimeout:kSyncUKMOperationsTimeout]; [ChromeEarlGrey clearSyncServerData]; [super tearDown]; @@ -295,7 +288,7 @@ - (void)testIncognitoPlusRegular { uint64_t original_client_id = metrics::UkmEGTestHelper::client_id(); [ChromeEarlGrey closeAllTabs]; - CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey waitForMainTabCount:(0)]); + [ChromeEarlGrey waitForMainTabCount:0]; OpenNewIncognitoTab(); AssertUKMEnabled(false); @@ -304,8 +297,8 @@ OpenNewRegularTab(); AssertUKMEnabled(false); - CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey closeAllIncognitoTabs]); - CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey waitForIncognitoTabCount:0]); + [ChromeEarlGrey closeAllIncognitoTabs]; + [ChromeEarlGrey waitForIncognitoTabCount:0]; AssertUKMEnabled(true); // Client ID should not have been reset.
diff --git a/ios/chrome/browser/translate/translate_infobar_controller.mm b/ios/chrome/browser/translate/translate_infobar_controller.mm index a39ce6b..7bc7012 100644 --- a/ios/chrome/browser/translate/translate_infobar_controller.mm +++ b/ios/chrome/browser/translate/translate_infobar_controller.mm
@@ -161,13 +161,12 @@ - (UIView*)infobarView { TranslateInfobarView* infobarView = [[TranslateInfobarView alloc] initWithFrame:CGRectZero]; + // |_infobarView| is referenced inside |-updateUIForTranslateStep:|. + _infobarView = infobarView; infobarView.sourceLanguage = self.sourceLanguage; infobarView.targetLanguage = self.targetLanguage; infobarView.delegate = self; - infobarView.state = - [self translateInfobarViewStateForTranslateStep:self.infoBarDelegate - ->translate_step()]; - _infobarView = infobarView; + [self updateUIForTranslateStep:self.infoBarDelegate->translate_step()]; return infobarView; } @@ -176,13 +175,7 @@ - (void)translateInfoBarDelegate:(translate::TranslateInfoBarDelegate*)delegate didChangeTranslateStep:(translate::TranslateStep)step withErrorType:(translate::TranslateErrors::Type)errorType { - _infobarView.state = [self translateInfobarViewStateForTranslateStep:step]; - - if (step == translate::TranslateStep::TRANSLATE_STEP_TRANSLATE_ERROR) { - [self.translateNotificationHandler - showTranslateNotificationWithDelegate:self - notificationType:TranslateNotificationTypeError]; - } + [self updateUIForTranslateStep:step]; if (step == translate::TranslateStep::TRANSLATE_STEP_TRANSLATE_ERROR || step == translate::TranslateStep::TRANSLATE_STEP_AFTER_TRANSLATE) { @@ -484,20 +477,27 @@ #pragma mark - Private -// Returns the infobar view state for the given translate::TranslateStep. -- (TranslateInfobarViewState)translateInfobarViewStateForTranslateStep: - (translate::TranslateStep)step { +// Updates the infobar view state for the given translate::TranslateStep. Shows +// an error for translate::TranslateStep::TRANSLATE_STEP_TRANSLATE_ERROR. +- (void)updateUIForTranslateStep:(translate::TranslateStep)step { switch (step) { - case translate::TranslateStep::TRANSLATE_STEP_BEFORE_TRANSLATE: case translate::TranslateStep::TRANSLATE_STEP_TRANSLATE_ERROR: - return TranslateInfobarViewStateBeforeTranslate; + [self.translateNotificationHandler + showTranslateNotificationWithDelegate:self + notificationType:TranslateNotificationTypeError]; + FALLTHROUGH; + case translate::TranslateStep::TRANSLATE_STEP_BEFORE_TRANSLATE: + _infobarView.state = TranslateInfobarViewStateBeforeTranslate; + break; case translate::TranslateStep::TRANSLATE_STEP_TRANSLATING: - return TranslateInfobarViewStateTranslating; + _infobarView.state = TranslateInfobarViewStateTranslating; + break; case translate::TranslateStep::TRANSLATE_STEP_AFTER_TRANSLATE: - return TranslateInfobarViewStateAfterTranslate; + _infobarView.state = TranslateInfobarViewStateAfterTranslate; + break; case translate::TranslateStep::TRANSLATE_STEP_NEVER_TRANSLATE: NOTREACHED() << "Translate infobar should never be in this state."; - return TranslateInfobarViewStateBeforeTranslate; + break; } }
diff --git a/ios/chrome/browser/ui/activity_services/activity_service_controller_egtest.mm b/ios/chrome/browser/ui/activity_services/activity_service_controller_egtest.mm index a4df7f0d..33a145e9 100644 --- a/ios/chrome/browser/ui/activity_services/activity_service_controller_egtest.mm +++ b/ios/chrome/browser/ui/activity_services/activity_service_controller_egtest.mm
@@ -10,7 +10,6 @@ #include "ios/chrome/grit/ios_strings.h" #import "ios/chrome/test/earl_grey/chrome_earl_grey.h" #import "ios/chrome/test/earl_grey/chrome_earl_grey_ui.h" -#import "ios/chrome/test/earl_grey/chrome_error_util.h" #import "ios/chrome/test/earl_grey/chrome_matchers.h" #import "ios/chrome/test/earl_grey/chrome_test_case.h" #import "ios/testing/earl_grey/earl_grey_test.h" @@ -85,8 +84,7 @@ web::test::SetUpHttpServer(std::move(provider)); // Open a page with an error. - CHROME_EG_ASSERT_NO_ERROR( - [ChromeEarlGrey loadURL:ErrorPageResponseProvider::GetDnsFailureUrl()]); + [ChromeEarlGrey loadURL:ErrorPageResponseProvider::GetDnsFailureUrl()]; // Verify that you can share, but that the Print action is not available. [ChromeEarlGreyUI openShareMenu]; @@ -110,7 +108,7 @@ - (void)testActivityServiceControllerIsDisabled { // Open an un-shareable page. GURL kURL("chrome://version"); - CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:kURL]); + [ChromeEarlGrey loadURL:kURL]; // Verify that the share button is disabled. id<GREYMatcher> share_button = chrome_test_util::ShareButton(); [[EarlGrey selectElementWithMatcher:share_button] @@ -130,7 +128,7 @@ web::test::SetUpSimpleHttpServer(responses); // Open page and open the share menu. - CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:url]); + [ChromeEarlGrey loadURL:url]; [ChromeEarlGreyUI openShareMenu]; // Verify that the share menu is up and contains a Copy action.
diff --git a/ios/chrome/browser/ui/authentication/signin_earl_grey_ui.h b/ios/chrome/browser/ui/authentication/signin_earl_grey_ui.h index aef92d1b..b0080bf 100644 --- a/ios/chrome/browser/ui/authentication/signin_earl_grey_ui.h +++ b/ios/chrome/browser/ui/authentication/signin_earl_grey_ui.h
@@ -29,6 +29,11 @@ // visible on short devices (e.g. iPhone 5s). + (void)confirmSigninConfirmationDialog; +// Taps on the "ADD ACCOUNT" button in the unified consent, to display the +// SSO dialog. +// This method should only be used with UnifiedConsent flag. ++ (void)tapAddAccountButton; + // Checks that the sign-in promo view (with a close button) is visible using the // right mode. + (void)checkSigninPromoVisibleWithMode:(SigninPromoViewMode)mode;
diff --git a/ios/chrome/browser/ui/authentication/signin_earl_grey_ui.mm b/ios/chrome/browser/ui/authentication/signin_earl_grey_ui.mm index 0261e302..8622876a 100644 --- a/ios/chrome/browser/ui/authentication/signin_earl_grey_ui.mm +++ b/ios/chrome/browser/ui/authentication/signin_earl_grey_ui.mm
@@ -51,6 +51,7 @@ using chrome_test_util::PrimarySignInButton; using chrome_test_util::SecondarySignInButton; using chrome_test_util::SettingsDoneButton; +using chrome_test_util::UnifiedConsentAddAccountButton; @implementation SigninEarlGreyUI @@ -137,6 +138,31 @@ performAction:grey_tap()]; } ++ (void)tapAddAccountButton { + GREYAssertTrue(unified_consent::IsUnifiedConsentFeatureEnabled(), + @"-[SigninEarlGreyUI tapAddAccountButton] is not available " + @"without UnifiedConsent flag"); + id<GREYMatcher> confirmationScrollViewMatcher = + grey_accessibilityID(kUnifiedConsentScrollViewIdentifier); + [[GREYUIThreadExecutor sharedInstance] drainUntilIdle]; + NSError* error = nil; + [[EarlGrey selectElementWithMatcher:confirmationScrollViewMatcher] + assertWithMatcher:ContentViewSmallerThanScrollView() + error:&error]; + if (error) { + // If the consent is bigger than the scroll view, the primary button should + // be "MORE". + [[EarlGrey selectElementWithMatcher: + chrome_test_util::ButtonWithAccessibilityLabelId( + IDS_IOS_ACCOUNT_CONSISTENCY_CONFIRMATION_SCROLL_BUTTON)] + assertWithMatcher:grey_notNil()]; + [[EarlGrey selectElementWithMatcher:confirmationScrollViewMatcher] + performAction:grey_scrollToContentEdge(kGREYContentEdgeBottom)]; + } + [[EarlGrey selectElementWithMatcher:UnifiedConsentAddAccountButton()] + performAction:grey_tap()]; +} + + (void)checkSigninPromoVisibleWithMode:(SigninPromoViewMode)mode { [self checkSigninPromoVisibleWithMode:mode closeButton:YES]; }
diff --git a/ios/chrome/browser/ui/browser_view/BUILD.gn b/ios/chrome/browser/ui/browser_view/BUILD.gn index a4e248b..51a4b1652 100644 --- a/ios/chrome/browser/ui/browser_view/BUILD.gn +++ b/ios/chrome/browser/ui/browser_view/BUILD.gn
@@ -124,6 +124,7 @@ "//ios/chrome/browser/ui/recent_tabs", "//ios/chrome/browser/ui/sad_tab", "//ios/chrome/browser/ui/sad_tab:coordinator", + "//ios/chrome/browser/ui/send_tab_to_self", "//ios/chrome/browser/ui/settings/sync/utils", "//ios/chrome/browser/ui/side_swipe", "//ios/chrome/browser/ui/signin_interaction/public",
diff --git a/ios/chrome/browser/ui/browser_view/browser_view_controller.mm b/ios/chrome/browser/ui/browser_view/browser_view_controller.mm index b874905..e60d668 100644 --- a/ios/chrome/browser/ui/browser_view/browser_view_controller.mm +++ b/ios/chrome/browser/ui/browser_view/browser_view_controller.mm
@@ -135,6 +135,7 @@ #import "ios/chrome/browser/ui/presenters/vertical_animation_container.h" #import "ios/chrome/browser/ui/reading_list/offline_page_native_content.h" #import "ios/chrome/browser/ui/sad_tab/sad_tab_coordinator.h" +#import "ios/chrome/browser/ui/send_tab_to_self/send_tab_to_self_coordinator.h" #import "ios/chrome/browser/ui/settings/sync/utils/sync_util.h" #import "ios/chrome/browser/ui/side_swipe/side_swipe_controller.h" #import "ios/chrome/browser/ui/side_swipe/swipe_view.h" @@ -641,6 +642,9 @@ @property(nonatomic, assign, readonly, getter=isNTPActiveForCurrentWebState) BOOL NTPActiveForCurrentWebState; +// The coordinator that shows the Send Tab To Self UI. +@property(nonatomic, strong) SendTabToSelfCoordinator* sendTabToSelfCoordinator; + // BVC initialization // ------------------ // If the BVC is initialized with a valid browser state & tab model immediately, @@ -4313,7 +4317,11 @@ } - (void)showSendTabToSelfUI { - NOTIMPLEMENTED(); + // TODO(crbug.com/972114) Move or reroute to browserCoordinator. + self.sendTabToSelfCoordinator = [[SendTabToSelfCoordinator alloc] + initWithBaseViewController:self + browserState:self.browserState]; + [self.sendTabToSelfCoordinator start]; } - (void)requestDesktopSite {
diff --git a/ios/chrome/browser/ui/content_suggestions/content_suggestions_egtest.mm b/ios/chrome/browser/ui/content_suggestions/content_suggestions_egtest.mm index e227d9c..8c9c5160 100644 --- a/ios/chrome/browser/ui/content_suggestions/content_suggestions_egtest.mm +++ b/ios/chrome/browser/ui/content_suggestions/content_suggestions_egtest.mm
@@ -37,7 +37,6 @@ #import "ios/chrome/test/app/chrome_test_util.h" #import "ios/chrome/test/earl_grey/chrome_earl_grey.h" #import "ios/chrome/test/earl_grey/chrome_earl_grey_ui.h" -#import "ios/chrome/test/earl_grey/chrome_error_util.h" #import "ios/chrome/test/earl_grey/chrome_matchers.h" #import "ios/chrome/test/earl_grey/chrome_test_case.h" #include "net/test/embedded_test_server/http_request.h" @@ -225,7 +224,7 @@ // Open a new Tab. ScrollUp(); [ChromeEarlGreyUI openNewTab]; - CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey waitForMainTabCount:2]); + [ChromeEarlGrey waitForMainTabCount:2]; // Go back to the previous tab. [ChromeEarlGrey selectTabAtIndex:0]; @@ -296,13 +295,12 @@ performAction:grey_tap()]; // Check that the page has been opened. - CHROME_EG_ASSERT_NO_ERROR( - [ChromeEarlGrey waitForWebStateContainingText:kPageLoadedString]); + [ChromeEarlGrey waitForWebStateContainingText:kPageLoadedString]; [[EarlGrey selectElementWithMatcher:chrome_test_util::OmniboxText( pageURL.GetContent())] assertWithMatcher:grey_notNil()]; - CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey waitForMainTabCount:1]); - CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey waitForIncognitoTabCount:0]); + [ChromeEarlGrey waitForMainTabCount:1]; + [ChromeEarlGrey waitForIncognitoTabCount:0]; // Go back. [[EarlGrey selectElementWithMatcher:chrome_test_util::BackButton()] @@ -349,8 +347,8 @@ performAction:grey_tap()]; // Check a new page in normal model is opened. - CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey waitForMainTabCount:2]); - CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey waitForIncognitoTabCount:0]); + [ChromeEarlGrey waitForMainTabCount:2]; + [ChromeEarlGrey waitForIncognitoTabCount:0]; // Check that the tab has been opened in background. ConditionBlock condition = ^{ @@ -367,8 +365,7 @@ // Check the page has been correctly opened. [ChromeEarlGrey selectTabAtIndex:1]; - CHROME_EG_ASSERT_NO_ERROR( - [ChromeEarlGrey waitForWebStateContainingText:kPageLoadedString]); + [ChromeEarlGrey waitForWebStateContainingText:kPageLoadedString]; [[EarlGrey selectElementWithMatcher:chrome_test_util::OmniboxText( pageURL.GetContent())] assertWithMatcher:grey_notNil()]; @@ -386,12 +383,11 @@ IDS_IOS_CONTENT_CONTEXT_OPENLINKNEWINCOGNITOTAB)] performAction:grey_tap()]; - CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey waitForMainTabCount:1]); - CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey waitForIncognitoTabCount:1]); + [ChromeEarlGrey waitForMainTabCount:1]; + [ChromeEarlGrey waitForIncognitoTabCount:1]; // Check that the tab has been opened in foreground. - CHROME_EG_ASSERT_NO_ERROR( - [ChromeEarlGrey waitForWebStateContainingText:kPageLoadedString]); + [ChromeEarlGrey waitForWebStateContainingText:kPageLoadedString]; [[EarlGrey selectElementWithMatcher:chrome_test_util::OmniboxText( pageURL.GetContent())] assertWithMatcher:grey_notNil()]; @@ -499,16 +495,15 @@ // Clear history and verify that the tile does not exist. [ChromeEarlGrey clearBrowsingHistory]; - CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:pageURL]); - CHROME_EG_ASSERT_NO_ERROR( - [ChromeEarlGrey waitForWebStateContainingText:kPageLoadedString]); + [ChromeEarlGrey loadURL:pageURL]; + [ChromeEarlGrey waitForWebStateContainingText:kPageLoadedString]; // After loading URL, need to do another action before opening a new tab // with the icon present. - CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey goBack]); + [ChromeEarlGrey goBack]; [[self class] closeAllTabs]; - CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey openNewTab]); + [ChromeEarlGrey openNewTab]; [[EarlGrey selectElementWithMatcher: chrome_test_util::StaticTextWithAccessibilityLabel(pageTitle)]
diff --git a/ios/chrome/browser/ui/content_suggestions/ntp_home_egtest.mm b/ios/chrome/browser/ui/content_suggestions/ntp_home_egtest.mm index abef60f..92c2302 100644 --- a/ios/chrome/browser/ui/content_suggestions/ntp_home_egtest.mm +++ b/ios/chrome/browser/ui/content_suggestions/ntp_home_egtest.mm
@@ -42,7 +42,6 @@ #include "ios/chrome/test/earl_grey/accessibility_util.h" #import "ios/chrome/test/earl_grey/chrome_earl_grey.h" #import "ios/chrome/test/earl_grey/chrome_earl_grey_ui.h" -#import "ios/chrome/test/earl_grey/chrome_error_util.h" #import "ios/chrome/test/earl_grey/chrome_matchers.h" #import "ios/chrome/test/earl_grey/chrome_test_case.h" #import "ios/chrome/test/scoped_eg_synchronization_disabler.h" @@ -429,9 +428,8 @@ chrome_test_util::StaticTextWithAccessibilityLabel( base::SysUTF8ToNSString(kPageTitle))] performAction:grey_tap()]; - CHROME_EG_ASSERT_NO_ERROR( - [ChromeEarlGrey waitForWebStateContainingText:kPageLoadedString]); - CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey goBack]); + [ChromeEarlGrey waitForWebStateContainingText:kPageLoadedString]; + [ChromeEarlGrey goBack]; // Check that the new position is the same. omnibox = ntp_home::FakeOmnibox(); @@ -468,9 +466,8 @@ chrome_test_util::StaticTextWithAccessibilityLabel( base::SysUTF8ToNSString(kPageTitle))] performAction:grey_tap()]; - CHROME_EG_ASSERT_NO_ERROR( - [ChromeEarlGrey waitForWebStateContainingText:kPageLoadedString]); - CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey goBack]); + [ChromeEarlGrey waitForWebStateContainingText:kPageLoadedString]; + [ChromeEarlGrey goBack]; // Check that the new position is the same. omnibox = ntp_home::FakeOmnibox(); @@ -499,8 +496,7 @@ performAction:grey_typeText([URL stringByAppendingString:@"\n"])]; // Check that the page is loaded. - CHROME_EG_ASSERT_NO_ERROR( - [ChromeEarlGrey waitForWebStateContainingText:kPageLoadedString]); + [ChromeEarlGrey waitForWebStateContainingText:kPageLoadedString]; } // Tests that tapping the omnibox search button logs correctly. @@ -631,9 +627,8 @@ [[EarlGrey selectElementWithMatcher:grey_accessibilityID( kToolbarOmniboxButtonIdentifier)] performAction:grey_tap()]; - CHROME_EG_ASSERT_NO_ERROR( - [ChromeEarlGrey waitForSufficientlyVisibleElementWithMatcher: - chrome_test_util::Omnibox()]); + [ChromeEarlGrey + waitForSufficientlyVisibleElementWithMatcher:chrome_test_util::Omnibox()]; } - (void)testOpeningNewTab { @@ -722,24 +717,22 @@ // Clear history to ensure the tile will be shown. [ChromeEarlGrey clearBrowsingHistory]; - CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:pageURL]); - CHROME_EG_ASSERT_NO_ERROR( - [ChromeEarlGrey waitForWebStateContainingText:kPageLoadedString]); + [ChromeEarlGrey loadURL:pageURL]; + [ChromeEarlGrey waitForWebStateContainingText:kPageLoadedString]; // After loading URL, need to do another action before opening a new tab // with the icon present. - CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey goBack]); + [ChromeEarlGrey goBack]; [[self class] closeAllTabs]; - CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey openNewTab]); + [ChromeEarlGrey openNewTab]; } // Taps the fake omnibox and waits for the real omnibox to be visible. - (void)focusFakebox { [[EarlGrey selectElementWithMatcher:chrome_test_util::FakeOmnibox()] performAction:grey_tap()]; - CHROME_EG_ASSERT_NO_ERROR( - [ChromeEarlGrey waitForSufficientlyVisibleElementWithMatcher: - chrome_test_util::Omnibox()]); + [ChromeEarlGrey + waitForSufficientlyVisibleElementWithMatcher:chrome_test_util::Omnibox()]; } @end
diff --git a/ios/chrome/browser/ui/infobars/badge/infobar_badge_button.mm b/ios/chrome/browser/ui/infobars/badge/infobar_badge_button.mm index 5c5d610..d8daa9d 100644 --- a/ios/chrome/browser/ui/infobars/badge/infobar_badge_button.mm +++ b/ios/chrome/browser/ui/infobars/badge/infobar_badge_button.mm
@@ -19,6 +19,8 @@ const CGFloat kActiveTintColor = 0x1A73E8; // To achieve a circular corner radius, divide length of a side by 2. const CGFloat kCircularCornerRadiusDivisor = 2.0; +// Alpha value of button in an inactive state. +const CGFloat kButtonInactiveAlpha = 0.38; } // namespace @interface InfobarBadgeButton () @@ -50,8 +52,9 @@ - (void)setActive:(BOOL)active animated:(BOOL)animated { void (^changeTintColor)() = ^{ - self.tintColor = - active ? UIColorFromRGB(kActiveTintColor) : [UIColor lightGrayColor]; + self.tintColor = active ? UIColorFromRGB(kActiveTintColor) + : [UIColor colorWithWhite:0 + alpha:kButtonInactiveAlpha]; }; if (animated) { [UIView animateWithDuration:kButtonAnimationDuration
diff --git a/ios/chrome/browser/ui/location_bar/location_bar_steady_view.mm b/ios/chrome/browser/ui/location_bar/location_bar_steady_view.mm index 959a0bc..28bde429 100644 --- a/ios/chrome/browser/ui/location_bar/location_bar_steady_view.mm +++ b/ios/chrome/browser/ui/location_bar/location_bar_steady_view.mm
@@ -71,7 +71,7 @@ scheme.fontColor = [UIColor colorWithWhite:0 alpha:0.7]; scheme.placeholderColor = [UIColor colorWithWhite:0 alpha:kOmniboxPlaceholderAlpha]; - scheme.trailingButtonColor = [UIColor colorWithWhite:0 alpha:0.7]; + scheme.trailingButtonColor = [UIColor colorWithWhite:0 alpha:0.45]; return scheme; }
diff --git a/ios/chrome/browser/ui/overlays/web_content_area/BUILD.gn b/ios/chrome/browser/ui/overlays/web_content_area/BUILD.gn index 937a521..01a54bc 100644 --- a/ios/chrome/browser/ui/overlays/web_content_area/BUILD.gn +++ b/ios/chrome/browser/ui/overlays/web_content_area/BUILD.gn
@@ -15,5 +15,8 @@ deps = [ "//base", "//ios/chrome/browser/ui/overlays:coordinators", + "//ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs:alerts", + "//ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs:confirmations", + "//ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs:prompts", ] }
diff --git a/ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/BUILD.gn b/ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/BUILD.gn index f405cb2e..28e8edc 100644 --- a/ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/BUILD.gn +++ b/ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/BUILD.gn
@@ -28,16 +28,97 @@ ] } -source_set("unit_tests") { - testonly = true +source_set("alerts") { sources = [ - "java_script_dialog_overlay_mediator_unittest.mm", + "java_script_alert_overlay_coordinator.h", + "java_script_alert_overlay_coordinator.mm", + "java_script_alert_overlay_mediator.h", + "java_script_alert_overlay_mediator.mm", ] configs += [ "//build/config/compiler:enable_arc" ] deps = [ ":common", + "//base", + "//components/strings:components_strings_grit", + "//ios/chrome/app/strings:ios_strings_grit", + "//ios/chrome/browser/overlays", + "//ios/chrome/browser/overlays/public/web_content_area", + "//ios/chrome/browser/ui/alert_view_controller", + "//ios/chrome/browser/ui/elements", + "//ios/chrome/browser/ui/overlays:coordinators", + "//ui/base", + ] +} + +source_set("confirmations") { + sources = [ + "java_script_confirmation_overlay_coordinator.h", + "java_script_confirmation_overlay_coordinator.mm", + "java_script_confirmation_overlay_mediator.h", + "java_script_confirmation_overlay_mediator.mm", + ] + + configs += [ "//build/config/compiler:enable_arc" ] + + deps = [ + ":common", + "//base", + "//components/strings:components_strings_grit", + "//ios/chrome/app/strings:ios_strings_grit", + "//ios/chrome/browser/overlays", + "//ios/chrome/browser/overlays/public/web_content_area", + "//ios/chrome/browser/ui/alert_view_controller", + "//ios/chrome/browser/ui/elements", + "//ios/chrome/browser/ui/overlays:coordinators", + "//ui/base", + ] +} + +source_set("prompts") { + sources = [ + "java_script_prompt_overlay_coordinator.h", + "java_script_prompt_overlay_coordinator.mm", + "java_script_prompt_overlay_mediator.h", + "java_script_prompt_overlay_mediator.mm", + ] + + configs += [ "//build/config/compiler:enable_arc" ] + + deps = [ + ":common", + "//base", + "//components/strings:components_strings_grit", + "//ios/chrome/app/strings:ios_strings_grit", + "//ios/chrome/browser/overlays", + "//ios/chrome/browser/overlays/public/web_content_area", + "//ios/chrome/browser/ui/alert_view_controller", + "//ios/chrome/browser/ui/elements", + "//ios/chrome/browser/ui/overlays:coordinators", + "//ui/base", + ] +} + +source_set("unit_tests") { + testonly = true + sources = [ + "java_script_alert_overlay_coordinator_unittest.mm", + "java_script_alert_overlay_mediator_unittest.mm", + "java_script_confirmation_overlay_coordinator_unittest.mm", + "java_script_confirmation_overlay_mediator_unittest.mm", + "java_script_dialog_overlay_mediator_unittest.mm", + "java_script_prompt_overlay_coordinator_unittest.mm", + "java_script_prompt_overlay_mediator_unittest.mm", + ] + + configs += [ "//build/config/compiler:enable_arc" ] + + deps = [ + ":alerts", + ":common", + ":confirmations", + ":prompts", "//base/test:test_support", "//components/strings:components_strings_grit", "//components/url_formatter", @@ -47,6 +128,7 @@ "//ios/chrome/browser/overlays/test", "//ios/chrome/browser/ui/alert_view_controller", "//ios/chrome/browser/ui/alert_view_controller/test", + "//ios/chrome/browser/ui/elements", "//ios/chrome/browser/ui/overlays/test", "//ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/test", "//ios/web/public",
diff --git a/ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_alert_overlay_coordinator.h b/ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_alert_overlay_coordinator.h new file mode 100644 index 0000000..df10076 --- /dev/null +++ b/ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_alert_overlay_coordinator.h
@@ -0,0 +1,15 @@ +// 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 IOS_CHROME_BROWSER_UI_OVERLAYS_WEB_CONTENT_AREA_JAVA_SCRIPT_DIALOGS_JAVA_SCRIPT_ALERT_OVERLAY_COORDINATOR_H_ +#define IOS_CHROME_BROWSER_UI_OVERLAYS_WEB_CONTENT_AREA_JAVA_SCRIPT_DIALOGS_JAVA_SCRIPT_ALERT_OVERLAY_COORDINATOR_H_ + +#import "ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_dialog_overlay_coordinator.h" + +// An OverlayCoordinator that displays the UI for JavaScript alerts. +@interface JavaScriptAlertOverlayCoordinator + : JavaScriptDialogOverlayCoordinator +@end + +#endif // IOS_CHROME_BROWSER_UI_OVERLAYS_WEB_CONTENT_AREA_JAVA_SCRIPT_DIALOGS_JAVA_SCRIPT_ALERT_OVERLAY_COORDINATOR_H_
diff --git a/ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_alert_overlay_coordinator.mm b/ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_alert_overlay_coordinator.mm new file mode 100644 index 0000000..f3fbaca --- /dev/null +++ b/ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_alert_overlay_coordinator.mm
@@ -0,0 +1,32 @@ +// 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. + +#import "ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_alert_overlay_coordinator.h" + +#import "ios/chrome/browser/overlays/public/overlay_request.h" +#import "ios/chrome/browser/overlays/public/web_content_area/java_script_alert_overlay.h" +#import "ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_alert_overlay_mediator.h" +#import "ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_dialog_overlay_coordinator+subclassing.h" + +#if !defined(__has_feature) || !__has_feature(objc_arc) +#error "This file requires ARC support." +#endif + +@implementation JavaScriptAlertOverlayCoordinator + +#pragma mark - OverlayRequestCoordinator + ++ (BOOL)supportsRequest:(OverlayRequest*)request { + return !!request->GetConfig<JavaScriptAlertOverlayRequestConfig>(); +} + +@end + +@implementation JavaScriptAlertOverlayCoordinator (Subclassing) + +- (JavaScriptDialogOverlayMediator*)newMediator { + return [[JavaScriptAlertOverlayMediator alloc] initWithRequest:self.request]; +} + +@end
diff --git a/ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_alert_overlay_coordinator_unittest.mm b/ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_alert_overlay_coordinator_unittest.mm new file mode 100644 index 0000000..057b27b --- /dev/null +++ b/ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_alert_overlay_coordinator_unittest.mm
@@ -0,0 +1,48 @@ +// 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. + +#import "ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_alert_overlay_coordinator.h" + +#import "base/test/ios/wait_util.h" +#import "ios/chrome/browser/overlays/public/overlay_request.h" +#import "ios/chrome/browser/overlays/public/web_content_area/java_script_alert_overlay.h" +#import "ios/chrome/browser/ui/alert_view_controller/alert_view_controller.h" +#import "ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/test/java_script_dialog_overlay_coordinator_test.h" + +#if !defined(__has_feature) || !__has_feature(objc_arc) +#error "This file requires ARC support." +#endif + +using base::test::ios::kWaitForUIElementTimeout; +using base::test::ios::WaitUntilConditionOrTimeout; + +// Test fixture for JavaScriptAlertOverlayCoordinator. +using JavaScriptAlertOverlayCoordinatorTest = + JavaScriptDialogOverlayCoordinatorTest; + +// Tests that JavaScriptAlertOverlayCoordinator creates an alert and presents it +// non-modally. +TEST_F(JavaScriptAlertOverlayCoordinatorTest, StartAndStop) { + std::unique_ptr<OverlayRequest> passed_request = + OverlayRequest::CreateWithConfig<JavaScriptAlertOverlayRequestConfig>( + GURL("https://chromium.test"), /*is_main_frame=*/true, + "Message Text"); + OverlayRequest* request = passed_request.get(); + SetRequest(std::move(passed_request)); + + // Start the coordinator and verify that the alert is shown. + StartDialogCoordinator(); + __weak UIViewController* alert = GetAlertViewController(); + EXPECT_TRUE(WaitUntilConditionOrTimeout(kWaitForUIElementTimeout, ^bool { + return !!alert.presentingViewController && !alert.beingPresented; + })); + + // Stop the coordinator and verify that the alert is dismissed and that the + // dismissal delegate is notified. + StopDialogCoordinator(); + EXPECT_TRUE(WaitUntilConditionOrTimeout(kWaitForUIElementTimeout, ^bool { + return !alert.presentingViewController; + })); + EXPECT_TRUE(dismissal_delegate().HasUIBeenDismissed(request)); +}
diff --git a/ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_alert_overlay_mediator.h b/ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_alert_overlay_mediator.h new file mode 100644 index 0000000..d526815 --- /dev/null +++ b/ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_alert_overlay_mediator.h
@@ -0,0 +1,15 @@ +// 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 IOS_CHROME_BROWSER_UI_OVERLAYS_WEB_CONTENT_AREA_JAVA_SCRIPT_DIALOGS_JAVA_SCRIPT_ALERT_OVERLAY_MEDIATOR_H_ +#define IOS_CHROME_BROWSER_UI_OVERLAYS_WEB_CONTENT_AREA_JAVA_SCRIPT_DIALOGS_JAVA_SCRIPT_ALERT_OVERLAY_MEDIATOR_H_ + +#import "ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_dialog_overlay_mediator.h" + +// Mediator object that uses a JavaScriptAlertOverlayRequestConfig to set up the +// UI for a JavaScript alert overlay. +@interface JavaScriptAlertOverlayMediator : JavaScriptDialogOverlayMediator +@end + +#endif // IOS_CHROME_BROWSER_UI_OVERLAYS_WEB_CONTENT_AREA_JAVA_SCRIPT_DIALOGS_JAVA_SCRIPT_ALERT_OVERLAY_MEDIATOR_H_
diff --git a/ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_alert_overlay_mediator.mm b/ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_alert_overlay_mediator.mm new file mode 100644 index 0000000..71114b0 --- /dev/null +++ b/ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_alert_overlay_mediator.mm
@@ -0,0 +1,57 @@ +// 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. + +#import "ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_alert_overlay_mediator.h" + +#include "base/strings/sys_string_conversions.h" +#include "components/strings/grit/components_strings.h" +#import "ios/chrome/browser/overlays/public/overlay_request.h" +#import "ios/chrome/browser/overlays/public/web_content_area/java_script_alert_overlay.h" +#import "ios/chrome/browser/ui/alert_view_controller/alert_action.h" +#import "ios/chrome/browser/ui/alert_view_controller/alert_consumer.h" +#import "ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_dialog_overlay_mediator+subclassing.h" +#include "ios/chrome/grit/ios_strings.h" +#include "ui/base/l10n/l10n_util.h" + +#if !defined(__has_feature) || !__has_feature(objc_arc) +#error "This file requires ARC support." +#endif + +@interface JavaScriptAlertOverlayMediator () +// The alert config. +@property(nonatomic, readonly) JavaScriptAlertOverlayRequestConfig* config; +@end + +@implementation JavaScriptAlertOverlayMediator + +#pragma mark - Accessors + +- (JavaScriptAlertOverlayRequestConfig*)config { + return self.request->GetConfig<JavaScriptAlertOverlayRequestConfig>(); +} + +- (void)setConsumer:(id<AlertConsumer>)consumer { + if (self.consumer == consumer) + return; + [super setConsumer:consumer]; + [self.consumer setMessage:base::SysUTF8ToNSString(self.config->message())]; + __weak __typeof__(self) weakSelf = self; + [self.consumer setActions:@[ + [AlertAction actionWithTitle:l10n_util::GetNSString(IDS_OK) + style:UIAlertActionStyleDefault + handler:^(AlertAction* action) { + [weakSelf.delegate stopDialogForMediator:weakSelf]; + }], + ]]; +} + +@end + +@implementation JavaScriptAlertOverlayMediator (Subclassing) + +- (const JavaScriptDialogSource*)requestSource { + return &self.config->source(); +} + +@end
diff --git a/ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_alert_overlay_mediator_unittest.mm b/ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_alert_overlay_mediator_unittest.mm new file mode 100644 index 0000000..b08a06e --- /dev/null +++ b/ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_alert_overlay_mediator_unittest.mm
@@ -0,0 +1,42 @@ +// 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. + +#import "ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_alert_overlay_mediator.h" + +#include "base/strings/sys_string_conversions.h" +#include "components/strings/grit/components_strings.h" +#include "components/url_formatter/elide_url.h" +#import "ios/chrome/browser/overlays/public/overlay_request.h" +#import "ios/chrome/browser/overlays/public/web_content_area/java_script_alert_overlay.h" +#import "ios/chrome/browser/ui/alert_view_controller/alert_action.h" +#import "ios/chrome/browser/ui/alert_view_controller/test/fake_alert_consumer.h" +#import "ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_dialog_overlay_mediator.h" +#import "ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/test/java_script_dialog_overlay_mediator_test.h" +#include "ios/chrome/grit/ios_strings.h" +#include "testing/gtest_mac.h" +#include "ui/base/l10n/l10n_util.h" + +#if !defined(__has_feature) || !__has_feature(objc_arc) +#error "This file requires ARC support." +#endif + +using JavaScriptAlertOverlayMediatorTest = JavaScriptDialogOverlayMediatorTest; + +// Tests that the consumer values are set correctly for alerts. +TEST_F(JavaScriptAlertOverlayMediatorTest, AlertSetup) { + const GURL kUrl("https://chromium.test"); + const std::string kMessage("Message"); + std::unique_ptr<OverlayRequest> request = + OverlayRequest::CreateWithConfig<JavaScriptAlertOverlayRequestConfig>( + kUrl, /*is_main_frame=*/true, kMessage); + SetMediator( + [[JavaScriptAlertOverlayMediator alloc] initWithRequest:request.get()]); + + // Verify the consumer values. + EXPECT_NSEQ(base::SysUTF8ToNSString(kMessage), consumer().message); + EXPECT_EQ(0U, consumer().textFieldConfigurations.count); + ASSERT_EQ(1U, consumer().actions.count); + EXPECT_EQ(UIAlertActionStyleDefault, consumer().actions[0].style); + EXPECT_NSEQ(l10n_util::GetNSString(IDS_OK), consumer().actions[0].title); +}
diff --git a/ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_confirmation_overlay_coordinator.h b/ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_confirmation_overlay_coordinator.h new file mode 100644 index 0000000..5c39b5c --- /dev/null +++ b/ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_confirmation_overlay_coordinator.h
@@ -0,0 +1,15 @@ +// 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 IOS_CHROME_BROWSER_UI_OVERLAYS_WEB_CONTENT_AREA_JAVA_SCRIPT_DIALOGS_JAVA_SCRIPT_CONFIRMATION_OVERLAY_COORDINATOR_H_ +#define IOS_CHROME_BROWSER_UI_OVERLAYS_WEB_CONTENT_AREA_JAVA_SCRIPT_DIALOGS_JAVA_SCRIPT_CONFIRMATION_OVERLAY_COORDINATOR_H_ + +#import "ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_dialog_overlay_coordinator.h" + +// An OverlayCoordinator that displays the UI for JavaScript confirmations. +@interface JavaScriptConfirmationOverlayCoordinator + : JavaScriptDialogOverlayCoordinator +@end + +#endif // IOS_CHROME_BROWSER_UI_OVERLAYS_WEB_CONTENT_AREA_JAVA_SCRIPT_DIALOGS_JAVA_SCRIPT_CONFIRMATION_OVERLAY_COORDINATOR_H_
diff --git a/ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_confirmation_overlay_coordinator.mm b/ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_confirmation_overlay_coordinator.mm new file mode 100644 index 0000000..59be3598 --- /dev/null +++ b/ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_confirmation_overlay_coordinator.mm
@@ -0,0 +1,49 @@ +// 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. + +#import "ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_confirmation_overlay_coordinator.h" + +#if !defined(__has_feature) || !__has_feature(objc_arc) +#error "This file requires ARC support." +#endif + +#include "base/strings/sys_string_conversions.h" +#include "components/strings/grit/components_strings.h" +#import "ios/chrome/browser/overlays/public/overlay_request.h" +#import "ios/chrome/browser/overlays/public/overlay_response.h" +#import "ios/chrome/browser/overlays/public/web_content_area/java_script_confirmation_overlay.h" +#import "ios/chrome/browser/ui/alert_view_controller/alert_action.h" +#import "ios/chrome/browser/ui/alert_view_controller/alert_view_controller.h" +#import "ios/chrome/browser/ui/overlays/overlay_ui_dismissal_delegate.h" +#import "ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_confirmation_overlay_mediator.h" +#import "ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_dialog_overlay_coordinator+subclassing.h" +#include "ios/chrome/grit/ios_strings.h" +#include "ui/base/l10n/l10n_util.h" + +@interface JavaScriptConfirmationOverlayCoordinator () + +// Returns the confirmation configuration from the OverlayRequest. +@property(nonatomic, readonly) + JavaScriptConfirmationOverlayRequestConfig* confirmationConfig; + +@end + +@implementation JavaScriptConfirmationOverlayCoordinator + +#pragma mark - OverlayRequestCoordinator + ++ (BOOL)supportsRequest:(OverlayRequest*)request { + return !!request->GetConfig<JavaScriptConfirmationOverlayRequestConfig>(); +} + +@end + +@implementation JavaScriptConfirmationOverlayCoordinator (Subclassing) + +- (JavaScriptDialogOverlayMediator*)newMediator { + return [[JavaScriptConfirmationOverlayMediator alloc] + initWithRequest:self.request]; +} + +@end
diff --git a/ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_confirmation_overlay_coordinator_unittest.mm b/ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_confirmation_overlay_coordinator_unittest.mm new file mode 100644 index 0000000..16397a7 --- /dev/null +++ b/ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_confirmation_overlay_coordinator_unittest.mm
@@ -0,0 +1,49 @@ +// 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. + +#import "ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_confirmation_overlay_coordinator.h" + +#import "base/test/ios/wait_util.h" +#import "ios/chrome/browser/overlays/public/overlay_request.h" +#import "ios/chrome/browser/overlays/public/web_content_area/java_script_confirmation_overlay.h" +#import "ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/test/java_script_dialog_overlay_coordinator_test.h" + +#if !defined(__has_feature) || !__has_feature(objc_arc) +#error "This file requires ARC support." +#endif + +using base::test::ios::kWaitForUIElementTimeout; +using base::test::ios::WaitUntilConditionOrTimeout; + +// Test fixture for JavaScriptConfirmationOverlayCoordinator. +using JavaScriptConfirmationOverlayCoordinatorTest = + JavaScriptDialogOverlayCoordinatorTest; + +// Tests that JavaScriptConfirmationOverlayCoordinator creates an alert and +// presents it non-modally. +TEST_F(JavaScriptConfirmationOverlayCoordinatorTest, StartAndStop) { + std::unique_ptr<OverlayRequest> passed_request = + OverlayRequest::CreateWithConfig< + JavaScriptConfirmationOverlayRequestConfig>( + GURL("https://chromium.test"), /*is_main_frame=*/true, + "Message Text"); + OverlayRequest* request = passed_request.get(); + SetRequest(std::move(passed_request)); + + // Start the coordinator and verify that the alert is shown. + StartDialogCoordinator(); + __weak UIViewController* confirmation = GetAlertViewController(); + EXPECT_TRUE(WaitUntilConditionOrTimeout(kWaitForUIElementTimeout, ^bool { + return !!confirmation.presentingViewController && + !confirmation.beingPresented; + })); + + // Stop the coordinator and verify that the alert is dismissed and that the + // dismissal delegate is notified. + StopDialogCoordinator(); + EXPECT_TRUE(WaitUntilConditionOrTimeout(kWaitForUIElementTimeout, ^bool { + return !confirmation.presentingViewController; + })); + EXPECT_TRUE(dismissal_delegate().HasUIBeenDismissed(request)); +}
diff --git a/ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_confirmation_overlay_mediator.h b/ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_confirmation_overlay_mediator.h new file mode 100644 index 0000000..1eb4a73 --- /dev/null +++ b/ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_confirmation_overlay_mediator.h
@@ -0,0 +1,16 @@ +// 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 IOS_CHROME_BROWSER_UI_OVERLAYS_WEB_CONTENT_AREA_JAVA_SCRIPT_DIALOGS_JAVA_SCRIPT_CONFIRMATION_OVERLAY_MEDIATOR_H_ +#define IOS_CHROME_BROWSER_UI_OVERLAYS_WEB_CONTENT_AREA_JAVA_SCRIPT_DIALOGS_JAVA_SCRIPT_CONFIRMATION_OVERLAY_MEDIATOR_H_ + +#import "ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_dialog_overlay_mediator.h" + +// Mediator object that uses a JavaScriptConfirmationOverlayRequestConfig to set +// up the UI for a JavaScript confirmation overlay. +@interface JavaScriptConfirmationOverlayMediator + : JavaScriptDialogOverlayMediator +@end + +#endif // IOS_CHROME_BROWSER_UI_OVERLAYS_WEB_CONTENT_AREA_JAVA_SCRIPT_DIALOGS_JAVA_SCRIPT_CONFIRMATION_OVERLAY_MEDIATOR_H_
diff --git a/ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_confirmation_overlay_mediator.mm b/ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_confirmation_overlay_mediator.mm new file mode 100644 index 0000000..bd5075908 --- /dev/null +++ b/ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_confirmation_overlay_mediator.mm
@@ -0,0 +1,79 @@ +// 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. + +#import "ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_confirmation_overlay_mediator.h" + +#include "base/strings/sys_string_conversions.h" +#include "components/strings/grit/components_strings.h" +#import "ios/chrome/browser/overlays/public/overlay_request.h" +#import "ios/chrome/browser/overlays/public/overlay_response.h" +#import "ios/chrome/browser/overlays/public/web_content_area/java_script_confirmation_overlay.h" +#import "ios/chrome/browser/ui/alert_view_controller/alert_action.h" +#import "ios/chrome/browser/ui/alert_view_controller/alert_consumer.h" +#import "ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_dialog_overlay_mediator+subclassing.h" +#include "ios/chrome/grit/ios_strings.h" +#include "ui/base/l10n/l10n_util.h" + +#if !defined(__has_feature) || !__has_feature(objc_arc) +#error "This file requires ARC support." +#endif + +@interface JavaScriptConfirmationOverlayMediator () +// The confirmation config. +@property(nonatomic, readonly) + JavaScriptConfirmationOverlayRequestConfig* config; +@end + +@implementation JavaScriptConfirmationOverlayMediator + +#pragma mark - Accessors + +- (JavaScriptConfirmationOverlayRequestConfig*)config { + return self.request->GetConfig<JavaScriptConfirmationOverlayRequestConfig>(); +} + +- (void)setConsumer:(id<AlertConsumer>)consumer { + if (self.consumer == consumer) + return; + [super setConsumer:consumer]; + [self.consumer setMessage:base::SysUTF8ToNSString(self.config->message())]; + __weak __typeof__(self) weakSelf = self; + [self.consumer setActions:@[ + [AlertAction actionWithTitle:l10n_util::GetNSString(IDS_OK) + style:UIAlertActionStyleDefault + handler:^(AlertAction* action) { + __typeof__(self) strongSelf = weakSelf; + [strongSelf setConfirmationResponse:YES]; + [strongSelf.delegate + stopDialogForMediator:strongSelf]; + }], + [AlertAction actionWithTitle:l10n_util::GetNSString(IDS_CANCEL) + style:UIAlertActionStyleCancel + handler:^(AlertAction* action) { + __typeof__(self) strongSelf = weakSelf; + [strongSelf setConfirmationResponse:NO]; + [strongSelf.delegate + stopDialogForMediator:strongSelf]; + }], + ]]; +} + +#pragma mark - Response helpers + +// Sets the OverlayResponse using the user's selection from the confirmation UI. +- (void)setConfirmationResponse:(BOOL)dialogConfirmed { + self.request->set_response( + OverlayResponse::CreateWithInfo< + JavaScriptConfirmationOverlayResponseInfo>(dialogConfirmed)); +} + +@end + +@implementation JavaScriptConfirmationOverlayMediator (Subclassing) + +- (const JavaScriptDialogSource*)requestSource { + return &self.config->source(); +} + +@end
diff --git a/ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_confirmation_overlay_mediator_unittest.mm b/ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_confirmation_overlay_mediator_unittest.mm new file mode 100644 index 0000000..4c54242f --- /dev/null +++ b/ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_confirmation_overlay_mediator_unittest.mm
@@ -0,0 +1,96 @@ +// 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. + +#import "ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_confirmation_overlay_mediator.h" + +#include "base/strings/sys_string_conversions.h" +#include "components/strings/grit/components_strings.h" +#include "components/url_formatter/elide_url.h" +#import "ios/chrome/browser/overlays/public/overlay_request.h" +#import "ios/chrome/browser/overlays/public/overlay_response.h" +#import "ios/chrome/browser/overlays/public/web_content_area/java_script_confirmation_overlay.h" +#import "ios/chrome/browser/ui/alert_view_controller/alert_action.h" +#import "ios/chrome/browser/ui/alert_view_controller/test/fake_alert_consumer.h" +#import "ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_dialog_overlay_mediator.h" +#import "ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/test/java_script_dialog_overlay_mediator_test.h" +#include "ios/chrome/grit/ios_strings.h" +#include "testing/gtest_mac.h" +#include "ui/base/l10n/l10n_util.h" + +#if !defined(__has_feature) || !__has_feature(objc_arc) +#error "This file requires ARC support." +#endif + +class JavaScriptConfirmationOverlayMediatorTest + : public JavaScriptDialogOverlayMediatorTest { + public: + JavaScriptConfirmationOverlayMediatorTest() + : url_("https://chromium.test"), message_("Message") {} + + // Creates a mediator and sets it for testing. + void CreateMediator() { + request_ = OverlayRequest::CreateWithConfig< + JavaScriptConfirmationOverlayRequestConfig>( + url_, /*is_main_frame=*/true, message_); + SetMediator([[JavaScriptConfirmationOverlayMediator alloc] + initWithRequest:request_.get()]); + } + + const GURL& url() const { return url_; } + const std::string& message() const { return message_; } + const OverlayRequest* request() const { return request_.get(); } + + private: + const GURL url_; + const std::string message_; + std::unique_ptr<OverlayRequest> request_; +}; + +// Tests that the consumer values are set correctly for confirmations. +TEST_F(JavaScriptConfirmationOverlayMediatorTest, ConfirmationSetup) { + CreateMediator(); + + // Verify the consumer values. + EXPECT_NSEQ(base::SysUTF8ToNSString(message()), consumer().message); + EXPECT_EQ(0U, consumer().textFieldConfigurations.count); + ASSERT_EQ(2U, consumer().actions.count); + EXPECT_EQ(UIAlertActionStyleDefault, consumer().actions[0].style); + EXPECT_NSEQ(l10n_util::GetNSString(IDS_OK), consumer().actions[0].title); + EXPECT_EQ(UIAlertActionStyleCancel, consumer().actions[1].style); + EXPECT_NSEQ(l10n_util::GetNSString(IDS_CANCEL), consumer().actions[1].title); +} + +// Tests that the correct response is provided for the confirm action. +TEST_F(JavaScriptConfirmationOverlayMediatorTest, ConfirmResponse) { + CreateMediator(); + ASSERT_EQ(2U, consumer().actions.count); + ASSERT_FALSE(!!request()->response()); + + // Execute the confirm action and verify the response. + AlertAction* confirm_action = consumer().actions[0]; + confirm_action.handler(confirm_action); + OverlayResponse* confirm_response = request()->response(); + ASSERT_TRUE(!!confirm_response); + JavaScriptConfirmationOverlayResponseInfo* confirm_response_info = + confirm_response->GetInfo<JavaScriptConfirmationOverlayResponseInfo>(); + ASSERT_TRUE(confirm_response_info); + EXPECT_TRUE(confirm_response_info->dialog_confirmed()); +} + +// Tests that the correct response is provided for the cancel action. +TEST_F(JavaScriptConfirmationOverlayMediatorTest, CancelResponse) { + CreateMediator(); + ASSERT_EQ(2U, consumer().actions.count); + ASSERT_FALSE(!!request()->response()); + + // Execute the cancel action and verify the response. + AlertAction* cancel_action = consumer().actions[1]; + cancel_action.handler(cancel_action); + OverlayResponse* cancel_response = request()->response(); + ASSERT_TRUE(!!cancel_response); + JavaScriptConfirmationOverlayResponseInfo* cancel_response_info = + cancel_response->GetInfo<JavaScriptConfirmationOverlayResponseInfo>(); + ASSERT_TRUE(cancel_response_info); + EXPECT_FALSE(cancel_response_info->dialog_confirmed()); +}
diff --git a/ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_prompt_overlay_coordinator.h b/ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_prompt_overlay_coordinator.h new file mode 100644 index 0000000..f6224b5c --- /dev/null +++ b/ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_prompt_overlay_coordinator.h
@@ -0,0 +1,15 @@ +// 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 IOS_CHROME_BROWSER_UI_OVERLAYS_WEB_CONTENT_AREA_JAVA_SCRIPT_DIALOGS_JAVA_SCRIPT_PROMPT_OVERLAY_COORDINATOR_H_ +#define IOS_CHROME_BROWSER_UI_OVERLAYS_WEB_CONTENT_AREA_JAVA_SCRIPT_DIALOGS_JAVA_SCRIPT_PROMPT_OVERLAY_COORDINATOR_H_ + +#import "ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_dialog_overlay_coordinator.h" + +// An OverlayCoordinator that displays the UI for JavaScript prompts. +@interface JavaScriptPromptOverlayCoordinator + : JavaScriptDialogOverlayCoordinator +@end + +#endif // IOS_CHROME_BROWSER_UI_OVERLAYS_WEB_CONTENT_AREA_JAVA_SCRIPT_DIALOGS_JAVA_SCRIPT_PROMPT_OVERLAY_COORDINATOR_H_
diff --git a/ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_prompt_overlay_coordinator.mm b/ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_prompt_overlay_coordinator.mm new file mode 100644 index 0000000..bcfeae8 --- /dev/null +++ b/ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_prompt_overlay_coordinator.mm
@@ -0,0 +1,51 @@ +// 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. + +#import "ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_prompt_overlay_coordinator.h" + +#import "ios/chrome/browser/overlays/public/overlay_request.h" +#import "ios/chrome/browser/overlays/public/web_content_area/java_script_prompt_overlay.h" +#import "ios/chrome/browser/ui/alert_view_controller/alert_view_controller.h" +#import "ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_dialog_overlay_coordinator+subclassing.h" +#import "ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_prompt_overlay_mediator.h" + +#if !defined(__has_feature) || !__has_feature(objc_arc) +#error "This file requires ARC support." +#endif + +@interface JavaScriptPromptOverlayCoordinator () < + JavaScriptPromptOverlayMediatorDataSource> + +// Returns the prompt configuration from the OverlayRequest. +@property(nonatomic, readonly) + JavaScriptPromptOverlayRequestConfig* promptConfig; + +@end + +@implementation JavaScriptPromptOverlayCoordinator + +#pragma mark - OverlayCoordinator + ++ (BOOL)supportsRequest:(OverlayRequest*)request { + return !!request->GetConfig<JavaScriptPromptOverlayRequestConfig>(); +} + +#pragma mark - JavaScriptPromptOverlayMediatorDataSource + +- (NSString*)promptInputForMediator:(JavaScriptPromptOverlayMediator*)mediator { + return self.alertViewController.textFieldResults.firstObject; +} + +@end + +@implementation JavaScriptPromptOverlayCoordinator (Subclassing) + +- (JavaScriptDialogOverlayMediator*)newMediator { + JavaScriptPromptOverlayMediator* mediator = + [[JavaScriptPromptOverlayMediator alloc] initWithRequest:self.request]; + mediator.dataSource = self; + return mediator; +} + +@end
diff --git a/ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_prompt_overlay_coordinator_unittest.mm b/ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_prompt_overlay_coordinator_unittest.mm new file mode 100644 index 0000000..9c179154 --- /dev/null +++ b/ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_prompt_overlay_coordinator_unittest.mm
@@ -0,0 +1,47 @@ +// 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. + +#import "ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_prompt_overlay_coordinator.h" + +#import "base/test/ios/wait_util.h" +#import "ios/chrome/browser/overlays/public/overlay_request.h" +#import "ios/chrome/browser/overlays/public/web_content_area/java_script_prompt_overlay.h" +#import "ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/test/java_script_dialog_overlay_coordinator_test.h" + +#if !defined(__has_feature) || !__has_feature(objc_arc) +#error "This file requires ARC support." +#endif + +using base::test::ios::kWaitForUIElementTimeout; +using base::test::ios::WaitUntilConditionOrTimeout; + +// Test fixture for JavaScriptPromptOverlayCoordinator. +using JavaScriptPromptOverlayCoordinatorTest = + JavaScriptDialogOverlayCoordinatorTest; + +// Tests that JavaScriptPromptOverlayCoordinator creates an alert and +// presents it non-modally. +TEST_F(JavaScriptPromptOverlayCoordinatorTest, StartAndStop) { + std::unique_ptr<OverlayRequest> passed_request = + OverlayRequest::CreateWithConfig<JavaScriptPromptOverlayRequestConfig>( + GURL("https://chromium.test"), /*is_main_frame=*/true, "Message Text", + "Default Prompt Value"); + OverlayRequest* request = passed_request.get(); + SetRequest(std::move(passed_request)); + + // Start the coordinator and verify that the alert is shown. + StartDialogCoordinator(); + __weak UIViewController* prompt = GetAlertViewController(); + EXPECT_TRUE(WaitUntilConditionOrTimeout(kWaitForUIElementTimeout, ^bool { + return !!prompt.presentingViewController && !prompt.isBeingPresented; + })); + + // Stop the coordinator and verify that the alert is dismissed and that the + // dismissal delegate is notified. + StopDialogCoordinator(); + EXPECT_TRUE(WaitUntilConditionOrTimeout(kWaitForUIElementTimeout, ^bool { + return !prompt.presentingViewController; + })); + EXPECT_TRUE(dismissal_delegate().HasUIBeenDismissed(request)); +}
diff --git a/ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_prompt_overlay_mediator.h b/ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_prompt_overlay_mediator.h new file mode 100644 index 0000000..710e40c2 --- /dev/null +++ b/ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_prompt_overlay_mediator.h
@@ -0,0 +1,34 @@ +// 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 IOS_CHROME_BROWSER_UI_OVERLAYS_WEB_CONTENT_AREA_JAVA_SCRIPT_DIALOGS_JAVA_SCRIPT_PROMPT_OVERLAY_MEDIATOR_H_ +#define IOS_CHROME_BROWSER_UI_OVERLAYS_WEB_CONTENT_AREA_JAVA_SCRIPT_DIALOGS_JAVA_SCRIPT_PROMPT_OVERLAY_MEDIATOR_H_ + +#import "ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_dialog_overlay_mediator.h" + +class JavaScriptPromptOverlayRequestConfig; +@protocol JavaScriptPromptOverlayMediatorDataSource; + +// The accessibility ID for prompt's text field. +extern NSString* const kJavaScriptPromptTextFieldAccessibiltyIdentifier; + +// Mediator object that uses a JavaScriptPromptOverlayRequestConfig to set +// up the UI for a JavaScript prompt overlay. +@interface JavaScriptPromptOverlayMediator : JavaScriptDialogOverlayMediator + +// The datasource for prompt input values. +@property(nonatomic, weak) id<JavaScriptPromptOverlayMediatorDataSource> + dataSource; + +@end + +// Protocol used to provide the text input from the prompt UI to the mediator. +@protocol JavaScriptPromptOverlayMediatorDataSource <NSObject> + +// Returns the input value for the prompt UI set up by |mediator|. +- (NSString*)promptInputForMediator:(JavaScriptPromptOverlayMediator*)mediator; + +@end + +#endif // IOS_CHROME_BROWSER_UI_OVERLAYS_WEB_CONTENT_AREA_JAVA_SCRIPT_DIALOGS_JAVA_SCRIPT_PROMPT_OVERLAY_MEDIATOR_H_
diff --git a/ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_prompt_overlay_mediator.mm b/ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_prompt_overlay_mediator.mm new file mode 100644 index 0000000..4214e7f --- /dev/null +++ b/ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_prompt_overlay_mediator.mm
@@ -0,0 +1,92 @@ +// 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. + +#import "ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_prompt_overlay_mediator.h" + +#include "base/strings/sys_string_conversions.h" +#include "components/strings/grit/components_strings.h" +#import "ios/chrome/browser/overlays/public/overlay_request.h" +#import "ios/chrome/browser/overlays/public/overlay_response.h" +#import "ios/chrome/browser/overlays/public/web_content_area/java_script_prompt_overlay.h" +#import "ios/chrome/browser/ui/alert_view_controller/alert_action.h" +#import "ios/chrome/browser/ui/alert_view_controller/alert_view_controller.h" +#import "ios/chrome/browser/ui/elements/text_field_configuration.h" +#import "ios/chrome/browser/ui/overlays/overlay_ui_dismissal_delegate.h" +#import "ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_dialog_overlay_coordinator+subclassing.h" +#import "ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_dialog_overlay_mediator+subclassing.h" +#include "ios/chrome/grit/ios_strings.h" +#include "ui/base/l10n/l10n_util.h" + +#if !defined(__has_feature) || !__has_feature(objc_arc) +#error "This file requires ARC support." +#endif + +NSString* const kJavaScriptPromptTextFieldAccessibiltyIdentifier = + @"JavaScriptPromptTextFieldAccessibiltyIdentifier"; + +@interface JavaScriptPromptOverlayMediator () +// The confirmation config. +@property(nonatomic, readonly) JavaScriptPromptOverlayRequestConfig* config; +@end + +@implementation JavaScriptPromptOverlayMediator + +#pragma mark - Accessors + +- (JavaScriptPromptOverlayRequestConfig*)config { + return self.request->GetConfig<JavaScriptPromptOverlayRequestConfig>(); +} + +- (void)setConsumer:(id<AlertConsumer>)consumer { + if (self.consumer == consumer) + return; + [super setConsumer:consumer]; + [self.consumer setMessage:base::SysUTF8ToNSString(self.config->message())]; + __weak __typeof__(self) weakSelf = self; + [self.consumer setActions:@[ + [AlertAction actionWithTitle:l10n_util::GetNSString(IDS_OK) + style:UIAlertActionStyleDefault + handler:^(AlertAction* action) { + __typeof__(self) strongSelf = weakSelf; + NSString* input = [strongSelf.dataSource + promptInputForMediator:strongSelf]; + [strongSelf setPromptResponse:input ? input : @""]; + [strongSelf.delegate + stopDialogForMediator:strongSelf]; + }], + [AlertAction actionWithTitle:l10n_util::GetNSString(IDS_CANCEL) + style:UIAlertActionStyleCancel + handler:^(AlertAction* action) { + [weakSelf.delegate stopDialogForMediator:weakSelf]; + }], + ]]; + NSString* defaultPromptValue = + base::SysUTF8ToNSString(self.config->default_prompt_value()); + [self.consumer setTextFieldConfigurations:@[ + [[TextFieldConfiguration alloc] + initWithText:defaultPromptValue + placeholder:nil + accessibilityIdentifier:kJavaScriptPromptTextFieldAccessibiltyIdentifier + secureTextEntry:NO] + ]]; +} + +#pragma mark - Response helpers + +// Sets the OverlayResponse using the user input from the prompt UI. +- (void)setPromptResponse:(NSString*)textInput { + self.request->set_response( + OverlayResponse::CreateWithInfo<JavaScriptPromptOverlayResponseInfo>( + base::SysNSStringToUTF8(textInput))); +} + +@end + +@implementation JavaScriptPromptOverlayMediator (Subclassing) + +- (const JavaScriptDialogSource*)requestSource { + return &self.config->source(); +} + +@end
diff --git a/ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_prompt_overlay_mediator_unittest.mm b/ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_prompt_overlay_mediator_unittest.mm new file mode 100644 index 0000000..7b41458 --- /dev/null +++ b/ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_prompt_overlay_mediator_unittest.mm
@@ -0,0 +1,153 @@ +// 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. + +#import "ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_prompt_overlay_mediator.h" + +#include "base/strings/sys_string_conversions.h" +#include "components/strings/grit/components_strings.h" +#include "components/url_formatter/elide_url.h" +#import "ios/chrome/browser/overlays/public/overlay_request.h" +#import "ios/chrome/browser/overlays/public/overlay_response.h" +#import "ios/chrome/browser/overlays/public/web_content_area/java_script_prompt_overlay.h" +#import "ios/chrome/browser/ui/alert_view_controller/alert_action.h" +#import "ios/chrome/browser/ui/alert_view_controller/test/fake_alert_consumer.h" +#import "ios/chrome/browser/ui/elements/text_field_configuration.h" +#import "ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_dialog_overlay_mediator.h" +#import "ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/test/java_script_dialog_overlay_mediator_test.h" +#include "ios/chrome/grit/ios_strings.h" +#include "testing/gtest_mac.h" +#include "ui/base/l10n/l10n_util.h" + +#if !defined(__has_feature) || !__has_feature(objc_arc) +#error "This file requires ARC support." +#endif + +namespace { +// User input string provided by FakePromptOverlayMediatorDataSource. +NSString* const kFakeUserInput = @"Fake User Input"; +} + +// Fake version of the mediator data source. +@interface FakePromptOverlayMediatorDataSource + : NSObject <JavaScriptPromptOverlayMediatorDataSource> +@property(nonatomic, copy) NSString* promptInput; +@end + +@implementation FakePromptOverlayMediatorDataSource + +- (NSString*)promptInputForMediator:(JavaScriptPromptOverlayMediator*)mediator { + return self.promptInput; +} + +@end + +class JavaScriptPromptOverlayMediatorTest + : public JavaScriptDialogOverlayMediatorTest { + public: + JavaScriptPromptOverlayMediatorTest() + : url_("https://chromium.test"), + message_("Message"), + default_prompt_value_("Default Prompt Value"), + data_source_([[FakePromptOverlayMediatorDataSource alloc] init]) {} + + // Creates a mediator and sets it for testing. + void CreateMediator() { + request_ = + OverlayRequest::CreateWithConfig<JavaScriptPromptOverlayRequestConfig>( + url_, /*is_main_frame=*/true, message_, default_prompt_value_); + JavaScriptPromptOverlayMediator* mediator = + [[JavaScriptPromptOverlayMediator alloc] + initWithRequest:request_.get()]; + mediator.dataSource = data_source_; + SetMediator(mediator); + } + + const GURL& url() const { return url_; } + const std::string& message() const { return message_; } + const std::string& default_prompt_value() const { + return default_prompt_value_; + } + const OverlayRequest* request() const { return request_.get(); } + FakePromptOverlayMediatorDataSource* data_source() { return data_source_; } + + private: + const GURL url_; + const std::string message_; + const std::string default_prompt_value_; + std::unique_ptr<OverlayRequest> request_; + FakePromptOverlayMediatorDataSource* data_source_ = nil; +}; + +// Tests that the consumer values are set correctly for main frame prompts. +TEST_F(JavaScriptPromptOverlayMediatorTest, PromptSetup) { + CreateMediator(); + + // Verify the consumer values. + EXPECT_NSEQ(base::SysUTF8ToNSString(message()), consumer().message); + ASSERT_EQ(1U, consumer().textFieldConfigurations.count); + EXPECT_NSEQ(base::SysUTF8ToNSString(default_prompt_value()), + consumer().textFieldConfigurations[0].text); + EXPECT_FALSE(!!consumer().textFieldConfigurations[0].placeholder); + EXPECT_NSEQ(kJavaScriptPromptTextFieldAccessibiltyIdentifier, + consumer().textFieldConfigurations[0].accessibilityIdentifier); + ASSERT_EQ(2U, consumer().actions.count); + EXPECT_EQ(UIAlertActionStyleDefault, consumer().actions[0].style); + EXPECT_NSEQ(l10n_util::GetNSString(IDS_OK), consumer().actions[0].title); + EXPECT_EQ(UIAlertActionStyleCancel, consumer().actions[1].style); + EXPECT_NSEQ(l10n_util::GetNSString(IDS_CANCEL), consumer().actions[1].title); +} + +// Tests that the correct response is provided for the confirm action. +TEST_F(JavaScriptPromptOverlayMediatorTest, ConfirmResponse) { + data_source().promptInput = kFakeUserInput; + CreateMediator(); + ASSERT_EQ(2U, consumer().actions.count); + ASSERT_FALSE(!!request()->response()); + + // Execute the confirm action and verify the response. + AlertAction* confirm_action = consumer().actions[0]; + confirm_action.handler(confirm_action); + OverlayResponse* confirm_response = request()->response(); + ASSERT_TRUE(!!confirm_response); + JavaScriptPromptOverlayResponseInfo* confirm_response_info = + confirm_response->GetInfo<JavaScriptPromptOverlayResponseInfo>(); + ASSERT_TRUE(confirm_response_info); + EXPECT_NSEQ(kFakeUserInput, + base::SysUTF8ToNSString(confirm_response_info->text_input())); +} + +// Tests that an empty string is provided in the response when the confirm +// action is executed and the datasource returns nil. +TEST_F(JavaScriptPromptOverlayMediatorTest, EmptyConfirmResponse) { + data_source().promptInput = nil; + CreateMediator(); + ASSERT_EQ(2U, consumer().actions.count); + ASSERT_FALSE(!!request()->response()); + + // Execute the confirm action and verify the response. + AlertAction* confirm_action = consumer().actions[0]; + confirm_action.handler(confirm_action); + OverlayResponse* confirm_response = request()->response(); + ASSERT_TRUE(!!confirm_response); + JavaScriptPromptOverlayResponseInfo* confirm_response_info = + confirm_response->GetInfo<JavaScriptPromptOverlayResponseInfo>(); + ASSERT_TRUE(confirm_response_info); + EXPECT_NSEQ(@"", + base::SysUTF8ToNSString(confirm_response_info->text_input())); +} + +// Tests that the correct response is provided for the cancel action. +TEST_F(JavaScriptPromptOverlayMediatorTest, CancelResponse) { + data_source().promptInput = kFakeUserInput; + CreateMediator(); + ASSERT_EQ(2U, consumer().actions.count); + ASSERT_FALSE(!!request()->response()); + + // Execute the cancel action and verify that there is no response for + // cancelled prompts. + AlertAction* cancel_action = consumer().actions[1]; + cancel_action.handler(cancel_action); + OverlayResponse* cancel_response = request()->response(); + EXPECT_FALSE(!!cancel_response); +}
diff --git a/ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/test/BUILD.gn b/ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/test/BUILD.gn index d888596..7bd4f42 100644 --- a/ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/test/BUILD.gn +++ b/ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/test/BUILD.gn
@@ -24,7 +24,10 @@ "//ios/chrome/browser/ui/overlays", "//ios/chrome/browser/ui/overlays:coordinators", "//ios/chrome/browser/ui/overlays/test", + "//ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs:alerts", "//ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs:common", + "//ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs:confirmations", + "//ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs:prompts", "//ios/chrome/browser/web_state_list", "//ios/chrome/browser/web_state_list:test_support", "//ios/chrome/test:test_support",
diff --git a/ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/test/java_script_dialog_overlay_coordinator_test.mm b/ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/test/java_script_dialog_overlay_coordinator_test.mm index 195ad65..9e5254e 100644 --- a/ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/test/java_script_dialog_overlay_coordinator_test.mm +++ b/ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/test/java_script_dialog_overlay_coordinator_test.mm
@@ -8,6 +8,9 @@ #import "ios/chrome/browser/ui/alert_view_controller/alert_view_controller.h" #import "ios/chrome/browser/ui/overlays/overlay_coordinator_factory+initialization.h" #import "ios/chrome/browser/ui/overlays/overlay_request_coordinator.h" +#import "ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_alert_overlay_coordinator.h" +#import "ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_confirmation_overlay_coordinator.h" +#import "ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_prompt_overlay_coordinator.h" #if !defined(__has_feature) || !__has_feature(objc_arc) #error "This file requires ARC support." @@ -35,8 +38,10 @@ DCHECK(!request_); DCHECK(request); request_ = std::move(request); - // TODO(crbug.com/941745): Add supported overlay coordinator classes. - NSArray<Class>* coordinator_classes = @[]; + NSArray<Class>* coordinator_classes = + @ [[JavaScriptAlertOverlayCoordinator class], + [JavaScriptConfirmationOverlayCoordinator class], + [JavaScriptPromptOverlayCoordinator class]]; OverlayRequestCoordinatorFactory* factory = [[OverlayRequestCoordinatorFactory alloc] initWithBrowser:browser_.get()
diff --git a/ios/chrome/browser/ui/overlays/web_content_area/web_content_area_supported_overlay_coordinator_classes.mm b/ios/chrome/browser/ui/overlays/web_content_area/web_content_area_supported_overlay_coordinator_classes.mm index 832771c..29369624 100644 --- a/ios/chrome/browser/ui/overlays/web_content_area/web_content_area_supported_overlay_coordinator_classes.mm +++ b/ios/chrome/browser/ui/overlays/web_content_area/web_content_area_supported_overlay_coordinator_classes.mm
@@ -4,6 +4,10 @@ #import "ios/chrome/browser/ui/overlays/web_content_area/web_content_area_supported_overlay_coordinator_classes.h" +#import "ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_alert_overlay_coordinator.h" +#import "ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_confirmation_overlay_coordinator.h" +#import "ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_prompt_overlay_coordinator.h" + #if !defined(__has_feature) || !__has_feature(objc_arc) #error "This file requires ARC support." #endif @@ -12,7 +16,9 @@ NSArray<Class>* GetSupportedOverlayCoordinatorClasses() { // TODO(crbug.com/941745): Add more supported overlay coordinator classes. - return @[]; + return @ [[JavaScriptAlertOverlayCoordinator class], + [JavaScriptConfirmationOverlayCoordinator class], + [JavaScriptPromptOverlayCoordinator class]]; } } // web_content_area
diff --git a/ios/chrome/browser/ui/payments/payment_request_accessibility_egtest.mm b/ios/chrome/browser/ui/payments/payment_request_accessibility_egtest.mm index 95581125..ba221fe 100644 --- a/ios/chrome/browser/ui/payments/payment_request_accessibility_egtest.mm +++ b/ios/chrome/browser/ui/payments/payment_request_accessibility_egtest.mm
@@ -111,10 +111,10 @@ _creditCard2 = autofill::test::GetCreditCard2(); CHROME_EG_ASSERT_NO_ERROR([self addCreditCard:_creditCard2]); - CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey - loadURL:web::test::HttpServer::MakeUrl(kPaymentRequestDemoPage)]); + [ChromeEarlGrey + loadURL:web::test::HttpServer::MakeUrl(kPaymentRequestDemoPage)]; - CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey tapWebStateElementWithID:@"buy"]); + [ChromeEarlGrey tapWebStateElementWithID:@"buy"]; } #pragma mark - Tests
diff --git a/ios/chrome/browser/ui/payments/payment_request_can_make_payment_egtest.mm b/ios/chrome/browser/ui/payments/payment_request_can_make_payment_egtest.mm index b629b96b..76f1cd66 100644 --- a/ios/chrome/browser/ui/payments/payment_request_can_make_payment_egtest.mm +++ b/ios/chrome/browser/ui/payments/payment_request_can_make_payment_egtest.mm
@@ -58,10 +58,9 @@ - (void)testCanMakePaymentIsSupported { CHROME_EG_ASSERT_NO_ERROR( [self addCreditCard:autofill::test::GetCreditCard()]); // visa. - CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey - loadURL:web::test::HttpServer::MakeUrl(kCanMakePaymentPage)]); + [ChromeEarlGrey loadURL:web::test::HttpServer::MakeUrl(kCanMakePaymentPage)]; - CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey tapWebStateElementWithID:@"buy"]); + [ChromeEarlGrey tapWebStateElementWithID:@"buy"]; [self waitForWebViewContainingTexts:{"true"}]; } @@ -76,25 +75,22 @@ [[EarlGrey selectElementWithMatcher:grey_accessibilityID( kToolsMenuNewIncognitoTabId)] performAction:grey_tap()]; - CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey waitForIncognitoTabCount:1]); + [ChromeEarlGrey waitForIncognitoTabCount:1]; - CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey - loadURL:web::test::HttpServer::MakeUrl(kCanMakePaymentPage)]); + [ChromeEarlGrey loadURL:web::test::HttpServer::MakeUrl(kCanMakePaymentPage)]; - CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey - loadURL:web::test::HttpServer::MakeUrl(kCanMakePaymentPage)]); + [ChromeEarlGrey loadURL:web::test::HttpServer::MakeUrl(kCanMakePaymentPage)]; - CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey tapWebStateElementWithID:@"buy"]); + [ChromeEarlGrey tapWebStateElementWithID:@"buy"]; [self waitForWebViewContainingTexts:{"true"}]; } // Tests canMakePayment() when visa is required, but user doesn't have one. - (void)testCanMakePaymentIsNotSupported { - CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey - loadURL:web::test::HttpServer::MakeUrl(kCanMakePaymentPage)]); + [ChromeEarlGrey loadURL:web::test::HttpServer::MakeUrl(kCanMakePaymentPage)]; - CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey tapWebStateElementWithID:@"buy"]); + [ChromeEarlGrey tapWebStateElementWithID:@"buy"]; [self waitForWebViewContainingTexts:{"false"}]; } @@ -107,12 +103,11 @@ [[EarlGrey selectElementWithMatcher:grey_accessibilityID( kToolsMenuNewIncognitoTabId)] performAction:grey_tap()]; - CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey waitForIncognitoTabCount:1]); + [ChromeEarlGrey waitForIncognitoTabCount:1]; - CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey - loadURL:web::test::HttpServer::MakeUrl(kCanMakePaymentPage)]); + [ChromeEarlGrey loadURL:web::test::HttpServer::MakeUrl(kCanMakePaymentPage)]; - CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey tapWebStateElementWithID:@"buy"]); + [ChromeEarlGrey tapWebStateElementWithID:@"buy"]; [self waitForWebViewContainingTexts:{"false"}]; } @@ -127,10 +122,9 @@ CHROME_EG_ASSERT_NO_ERROR( [self addCreditCard:autofill::test::GetCreditCard()]); // visa. - CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey - loadURL:web::test::HttpServer::MakeUrl(kCanMakePaymentPage)]); + [ChromeEarlGrey loadURL:web::test::HttpServer::MakeUrl(kCanMakePaymentPage)]; - CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey tapWebStateElementWithID:@"buy"]); + [ChromeEarlGrey tapWebStateElementWithID:@"buy"]; [self waitForWebViewContainingTexts:{"false"}]; } @@ -151,15 +145,13 @@ [[EarlGrey selectElementWithMatcher:grey_accessibilityID( kToolsMenuNewIncognitoTabId)] performAction:grey_tap()]; - CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey waitForIncognitoTabCount:1]); + [ChromeEarlGrey waitForIncognitoTabCount:1]; - CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey - loadURL:web::test::HttpServer::MakeUrl(kCanMakePaymentPage)]); + [ChromeEarlGrey loadURL:web::test::HttpServer::MakeUrl(kCanMakePaymentPage)]; - CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey - loadURL:web::test::HttpServer::MakeUrl(kCanMakePaymentPage)]); + [ChromeEarlGrey loadURL:web::test::HttpServer::MakeUrl(kCanMakePaymentPage)]; - CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey tapWebStateElementWithID:@"buy"]); + [ChromeEarlGrey tapWebStateElementWithID:@"buy"]; [self waitForWebViewContainingTexts:{"false"}]; } @@ -194,18 +186,17 @@ @"available."); } - CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey - loadURL:web::test::HttpServer::MakeUrl(kCanMakePaymentCreditCardPage)]); + [ChromeEarlGrey + loadURL:web::test::HttpServer::MakeUrl(kCanMakePaymentCreditCardPage)]; // Query visa payment method. - CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey tapWebStateElementWithID:@"buy"]); + [ChromeEarlGrey tapWebStateElementWithID:@"buy"]; // User does not have a visa card. [self waitForWebViewContainingTexts:{"false"}]; // Query Mastercard payment method. - CHROME_EG_ASSERT_NO_ERROR( - [ChromeEarlGrey tapWebStateElementWithID:@"other-buy"]); + [ChromeEarlGrey tapWebStateElementWithID:@"other-buy"]; // Query quota exceeded. [self @@ -216,14 +207,13 @@ [self addCreditCard:autofill::test::GetCreditCard()]); // visa. // Query visa payment method. - CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey tapWebStateElementWithID:@"buy"]); + [ChromeEarlGrey tapWebStateElementWithID:@"buy"]; // User has a visa card. While the query is cached, result is always fresh. [self waitForWebViewContainingTexts:{"true"}]; // Query Mastercard payment method. - CHROME_EG_ASSERT_NO_ERROR( - [ChromeEarlGrey tapWebStateElementWithID:@"other-buy"]); + [ChromeEarlGrey tapWebStateElementWithID:@"other-buy"]; // Query quota exceeded. [self @@ -261,21 +251,18 @@ @"available."); } - CHROME_EG_ASSERT_NO_ERROR( - [ChromeEarlGrey loadURL:web::test::HttpServer::MakeUrl( - kCanMakePaymentMethodIdentifierPage)]); + [ChromeEarlGrey loadURL:web::test::HttpServer::MakeUrl( + kCanMakePaymentMethodIdentifierPage)]; // Query basic-card payment method with "supportedNetworks": ["visa"] in the // payment method specific data. - CHROME_EG_ASSERT_NO_ERROR( - [ChromeEarlGrey tapWebStateElementWithID:@"checkBasicVisa"]); + [ChromeEarlGrey tapWebStateElementWithID:@"checkBasicVisa"]; // User does not have a visa card. [self waitForWebViewContainingTexts:{"false"}]; // Query basic-card payment method without "supportedNetworks" parameter. - CHROME_EG_ASSERT_NO_ERROR( - [ChromeEarlGrey tapWebStateElementWithID:@"checkBasicCard"]); + [ChromeEarlGrey tapWebStateElementWithID:@"checkBasicCard"]; // Query quota exceeded. [self @@ -287,15 +274,13 @@ // Query basic-card payment method with "supportedNetworks": ["visa"] in the // payment method specific data. - CHROME_EG_ASSERT_NO_ERROR( - [ChromeEarlGrey tapWebStateElementWithID:@"checkBasicVisa"]); + [ChromeEarlGrey tapWebStateElementWithID:@"checkBasicVisa"]; // User has a visa card. While the query is cached, result is always fresh. [self waitForWebViewContainingTexts:{"true"}]; // Query basic-card payment method without "supportedNetworks" parameter. - CHROME_EG_ASSERT_NO_ERROR( - [ChromeEarlGrey tapWebStateElementWithID:@"checkBasicCard"]); + [ChromeEarlGrey tapWebStateElementWithID:@"checkBasicCard"]; // Query quota exceeded. [self
diff --git a/ios/chrome/browser/ui/payments/payment_request_cancel_pay_abort_egtest.mm b/ios/chrome/browser/ui/payments/payment_request_cancel_pay_abort_egtest.mm index 4d71c58..b6db9d8 100644 --- a/ios/chrome/browser/ui/payments/payment_request_cancel_pay_abort_egtest.mm +++ b/ios/chrome/browser/ui/payments/payment_request_cancel_pay_abort_egtest.mm
@@ -51,17 +51,15 @@ // Tests that navigating to a URL closes the Payment Request UI. - (void)testOpenAndNavigateToURL { - CHROME_EG_ASSERT_NO_ERROR( - [ChromeEarlGrey loadURL:web::test::HttpServer::MakeUrl(kAbortPage)]); + [ChromeEarlGrey loadURL:web::test::HttpServer::MakeUrl(kAbortPage)]; - CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey tapWebStateElementWithID:@"buy"]); + [ChromeEarlGrey tapWebStateElementWithID:@"buy"]; // Confirm that the Payment Request UI is showing. [[EarlGrey selectElementWithMatcher:chrome_test_util::PaymentRequestView()] assertWithMatcher:grey_notNil()]; - CHROME_EG_ASSERT_NO_ERROR( - [ChromeEarlGrey loadURL:web::test::HttpServer::MakeUrl(kNoShippingPage)]); + [ChromeEarlGrey loadURL:web::test::HttpServer::MakeUrl(kNoShippingPage)]; // Confirm that the Payment Request UI is not showing. [[EarlGrey selectElementWithMatcher:chrome_test_util::PaymentRequestView()] @@ -70,16 +68,15 @@ // Tests that reloading the page closes the Payment Request UI. - (void)testOpenAndReload { - CHROME_EG_ASSERT_NO_ERROR( - [ChromeEarlGrey loadURL:web::test::HttpServer::MakeUrl(kAbortPage)]); + [ChromeEarlGrey loadURL:web::test::HttpServer::MakeUrl(kAbortPage)]; - CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey tapWebStateElementWithID:@"buy"]); + [ChromeEarlGrey tapWebStateElementWithID:@"buy"]; // Confirm that the Payment Request UI is showing. [[EarlGrey selectElementWithMatcher:chrome_test_util::PaymentRequestView()] assertWithMatcher:grey_notNil()]; - CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey reload]); + [ChromeEarlGrey reload]; // Confirm that the Payment Request UI is not showing. [[EarlGrey selectElementWithMatcher:chrome_test_util::PaymentRequestView()] @@ -88,16 +85,15 @@ // Tests that navigating to the previous page closes the Payment Request UI. - (void)testOpenAndNavigateBack { - CHROME_EG_ASSERT_NO_ERROR( - [ChromeEarlGrey loadURL:web::test::HttpServer::MakeUrl(kAbortPage)]); + [ChromeEarlGrey loadURL:web::test::HttpServer::MakeUrl(kAbortPage)]; - CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey tapWebStateElementWithID:@"buy"]); + [ChromeEarlGrey tapWebStateElementWithID:@"buy"]; // Confirm that the Payment Request UI is showing. [[EarlGrey selectElementWithMatcher:chrome_test_util::PaymentRequestView()] assertWithMatcher:grey_notNil()]; - CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey goBack]); + [ChromeEarlGrey goBack]; // Confirm that the Payment Request UI is not showing. [[EarlGrey selectElementWithMatcher:chrome_test_util::PaymentRequestView()] @@ -113,10 +109,9 @@ @"available."); } - CHROME_EG_ASSERT_NO_ERROR( - [ChromeEarlGrey loadURL:web::test::HttpServer::MakeUrl(kAbortPage)]); + [ChromeEarlGrey loadURL:web::test::HttpServer::MakeUrl(kAbortPage)]; - CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey tapWebStateElementWithID:@"buy"]); + [ChromeEarlGrey tapWebStateElementWithID:@"buy"]; // Confirm that the Payment Request UI is showing. [[EarlGrey selectElementWithMatcher:chrome_test_util::PaymentRequestView()] @@ -144,10 +139,9 @@ @"available."); } - CHROME_EG_ASSERT_NO_ERROR( - [ChromeEarlGrey loadURL:web::test::HttpServer::MakeUrl(kAbortPage)]); + [ChromeEarlGrey loadURL:web::test::HttpServer::MakeUrl(kAbortPage)]; - CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey tapWebStateElementWithID:@"buy"]); + [ChromeEarlGrey tapWebStateElementWithID:@"buy"]; // Confirm that the Payment Request UI is showing. [[EarlGrey selectElementWithMatcher:chrome_test_util::PaymentRequestView()] @@ -180,10 +174,9 @@ card.set_billing_address_id(profile.guid()); CHROME_EG_ASSERT_NO_ERROR([self addCreditCard:card]); - CHROME_EG_ASSERT_NO_ERROR( - [ChromeEarlGrey loadURL:web::test::HttpServer::MakeUrl(kNoShippingPage)]); + [ChromeEarlGrey loadURL:web::test::HttpServer::MakeUrl(kNoShippingPage)]; - CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey tapWebStateElementWithID:@"buy"]); + [ChromeEarlGrey tapWebStateElementWithID:@"buy"]; // Confirm that the Payment Request UI is showing. [[EarlGrey selectElementWithMatcher:chrome_test_util::PaymentRequestView()] @@ -217,16 +210,15 @@ // Tests that calling request.abort() successfully aborts the Payment Request. - (void)testAbort { - CHROME_EG_ASSERT_NO_ERROR( - [ChromeEarlGrey loadURL:web::test::HttpServer::MakeUrl(kAbortPage)]); + [ChromeEarlGrey loadURL:web::test::HttpServer::MakeUrl(kAbortPage)]; - CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey tapWebStateElementWithID:@"buy"]); + [ChromeEarlGrey tapWebStateElementWithID:@"buy"]; // Confirm that the Payment Request UI is showing. [[EarlGrey selectElementWithMatcher:chrome_test_util::PaymentRequestView()] assertWithMatcher:grey_notNil()]; - CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey tapWebStateElementWithID:@"abort"]); + [ChromeEarlGrey tapWebStateElementWithID:@"abort"]; // Confirm that the error confirmation UI is showing. [[EarlGrey
diff --git a/ios/chrome/browser/ui/payments/payment_request_data_url_egtest.mm b/ios/chrome/browser/ui/payments/payment_request_data_url_egtest.mm index b3d54bc..8aefff803 100644 --- a/ios/chrome/browser/ui/payments/payment_request_data_url_egtest.mm +++ b/ios/chrome/browser/ui/payments/payment_request_data_url_egtest.mm
@@ -7,7 +7,6 @@ #import "ios/chrome/browser/ui/payments/payment_request_egtest_base.h" #import "ios/chrome/test/app/chrome_test_util.h" #import "ios/chrome/test/earl_grey/chrome_earl_grey.h" -#import "ios/chrome/test/earl_grey/chrome_error_util.h" #include "testing/gtest/include/gtest/gtest.h" #if !defined(__has_feature) || !__has_feature(objc_arc) @@ -25,7 +24,7 @@ // Tests that PaymentRequest's constructor throws a SecurityError. - (void)testSecurityError { - CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey + [ChromeEarlGrey loadURL:GURL("data:text/html,<html><head><meta name=\"viewport\" " "content=\"width=device-width, initial-scale=1, " "maximum-scale=1\"></head><body><button id=\"buy\" " @@ -35,9 +34,9 @@ "'1.00'}}})).show(); } " "catch(e) { document.getElementById('result').innerHTML = " "e; }\">Data URL Test</button><div " - "id='result'></div></body></html>")]); + "id='result'></div></body></html>")]; - CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey tapWebStateElementWithID:@"buy"]); + [ChromeEarlGrey tapWebStateElementWithID:@"buy"]; [self waitForWebViewContainingTexts:{"SecurityError", "Failed to construct 'PaymentRequest': "
diff --git a/ios/chrome/browser/ui/payments/payment_request_debit_egtest.mm b/ios/chrome/browser/ui/payments/payment_request_debit_egtest.mm index 6a80846..f09c56d2 100644 --- a/ios/chrome/browser/ui/payments/payment_request_debit_egtest.mm +++ b/ios/chrome/browser/ui/payments/payment_request_debit_egtest.mm
@@ -99,13 +99,11 @@ featureList.InitAndEnableFeature( payments::features::kReturnGooglePayInBasicCard); - CHROME_EG_ASSERT_NO_ERROR( - [ChromeEarlGrey loadURL:web::test::HttpServer::MakeUrl(kDebitPage)]); + [ChromeEarlGrey loadURL:web::test::HttpServer::MakeUrl(kDebitPage)]; [self addServerCardWithType:DEBIT]; - CHROME_EG_ASSERT_NO_ERROR( - [ChromeEarlGrey tapWebStateElementWithID:@"canMakePayment"]); + [ChromeEarlGrey tapWebStateElementWithID:@"canMakePayment"]; [self waitForWebViewContainingTexts:{"true"}]; } @@ -116,27 +114,23 @@ featureList.InitAndEnableFeature( payments::features::kReturnGooglePayInBasicCard); - CHROME_EG_ASSERT_NO_ERROR( - [ChromeEarlGrey loadURL:web::test::HttpServer::MakeUrl(kDebitPage)]); + [ChromeEarlGrey loadURL:web::test::HttpServer::MakeUrl(kDebitPage)]; [self addServerCardWithType:UNKNOWN]; - CHROME_EG_ASSERT_NO_ERROR( - [ChromeEarlGrey tapWebStateElementWithID:@"canMakePayment"]); + [ChromeEarlGrey tapWebStateElementWithID:@"canMakePayment"]; [self waitForWebViewContainingTexts:{"true"}]; } // Tests that canMakePayment() resolves with false with credit or prepaid cards. - (void)testCannotMakePaymentWithCreditAndPrepaidCard { - CHROME_EG_ASSERT_NO_ERROR( - [ChromeEarlGrey loadURL:web::test::HttpServer::MakeUrl(kDebitPage)]); + [ChromeEarlGrey loadURL:web::test::HttpServer::MakeUrl(kDebitPage)]; [self addServerCardWithType:CREDIT]; [self addServerCardWithType:PREPAID]; - CHROME_EG_ASSERT_NO_ERROR( - [ChromeEarlGrey tapWebStateElementWithID:@"canMakePayment"]); + [ChromeEarlGrey tapWebStateElementWithID:@"canMakePayment"]; [self waitForWebViewContainingTexts:{"false"}]; } @@ -147,12 +141,11 @@ featureList.InitAndEnableFeature( payments::features::kReturnGooglePayInBasicCard); - CHROME_EG_ASSERT_NO_ERROR( - [ChromeEarlGrey loadURL:web::test::HttpServer::MakeUrl(kDebitPage)]); + [ChromeEarlGrey loadURL:web::test::HttpServer::MakeUrl(kDebitPage)]; [self addServerCardWithType:DEBIT]; - CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey tapWebStateElementWithID:@"buy"]); + [ChromeEarlGrey tapWebStateElementWithID:@"buy"]; // Confirm that the Payment Request UI is showing. [[EarlGrey selectElementWithMatcher:chrome_test_util::PaymentRequestView()] @@ -166,12 +159,11 @@ // Tests that an "unknown" card is not preselected. - (void)testUnknownCardTypeIsNotPreselected { - CHROME_EG_ASSERT_NO_ERROR( - [ChromeEarlGrey loadURL:web::test::HttpServer::MakeUrl(kDebitPage)]); + [ChromeEarlGrey loadURL:web::test::HttpServer::MakeUrl(kDebitPage)]; [self addServerCardWithType:UNKNOWN]; - CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey tapWebStateElementWithID:@"buy"]); + [ChromeEarlGrey tapWebStateElementWithID:@"buy"]; // Confirm that the Payment Request UI is showing. [[EarlGrey selectElementWithMatcher:chrome_test_util::PaymentRequestView()] @@ -191,10 +183,9 @@ card.set_billing_address_id(_profile->guid()); CHROME_EG_ASSERT_NO_ERROR([self addCreditCard:card]); - CHROME_EG_ASSERT_NO_ERROR( - [ChromeEarlGrey loadURL:web::test::HttpServer::MakeUrl(kDebitPage)]); + [ChromeEarlGrey loadURL:web::test::HttpServer::MakeUrl(kDebitPage)]; - CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey tapWebStateElementWithID:@"buy"]); + [ChromeEarlGrey tapWebStateElementWithID:@"buy"]; // Confirm that the Payment Request UI is showing. [[EarlGrey selectElementWithMatcher:chrome_test_util::PaymentRequestView()]
diff --git a/ios/chrome/browser/ui/payments/payment_request_journey_logger_egtest.mm b/ios/chrome/browser/ui/payments/payment_request_journey_logger_egtest.mm index c4fd5b1..6efd992 100644 --- a/ios/chrome/browser/ui/payments/payment_request_journey_logger_egtest.mm +++ b/ios/chrome/browser/ui/payments/payment_request_journey_logger_egtest.mm
@@ -73,7 +73,7 @@ [self addCard1]; [self loadTestPage:"payment_request_no_shipping_test.html"]; - CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey tapWebStateElementWithID:@"buy"]); + [ChromeEarlGrey tapWebStateElementWithID:@"buy"]; [self payWithCreditCardUsingCVC:@"123"]; // Make sure the correct events were logged. @@ -130,7 +130,7 @@ [self addCard1]; [self loadTestPage:"payment_request_bobpay_test.html"]; - CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey tapWebStateElementWithID:@"buy"]); + [ChromeEarlGrey tapWebStateElementWithID:@"buy"]; [self waitForWebViewContainingTexts:{"rejected"}]; FailureBlock failureBlock = ^(NSString* error) { @@ -195,9 +195,8 @@ [self addCard1]; [self loadTestPage:"payment_request_multiple_show_test.html"]; - CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey tapWebStateElementWithID:@"buy"]); - CHROME_EG_ASSERT_NO_ERROR( - [ChromeEarlGrey tapWebStateElementWithID:@"showAgain"]); + [ChromeEarlGrey tapWebStateElementWithID:@"buy"]; + [ChromeEarlGrey tapWebStateElementWithID:@"showAgain"]; [self payWithCreditCardUsingCVC:@"123"]; // Trying to show the same request twice is not considered a concurrent @@ -271,7 +270,7 @@ [self loadTestPage: "payment_request_contact_details_and_free_shipping_test.html"]; - CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey tapWebStateElementWithID:@"buy"]); + [ChromeEarlGrey tapWebStateElementWithID:@"buy"]; [self payWithCreditCardUsingCVC:@"123"]; FailureBlock failureBlock = ^(NSString* error) { @@ -345,7 +344,7 @@ [self loadTestPage: "payment_request_contact_details_and_free_shipping_test.html"]; - CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey tapWebStateElementWithID:@"buy"]); + [ChromeEarlGrey tapWebStateElementWithID:@"buy"]; [[EarlGrey selectElementWithMatcher:chrome_test_util::ButtonWithAccessibilityLabelId( IDS_CANCEL)] performAction:grey_tap()]; @@ -423,7 +422,7 @@ [self addCard1]; [self loadTestPage:"payment_request_contact_details_test.html"]; - CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey tapWebStateElementWithID:@"buy"]); + [ChromeEarlGrey tapWebStateElementWithID:@"buy"]; [self payWithCreditCardUsingCVC:@"123"]; FailureBlock failureBlock = ^(NSString* error) { @@ -498,7 +497,7 @@ [self addCard1]; [self loadTestPage:"payment_request_contact_details_test.html"]; - CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey tapWebStateElementWithID:@"buy"]); + [ChromeEarlGrey tapWebStateElementWithID:@"buy"]; [[EarlGrey selectElementWithMatcher:chrome_test_util::ButtonWithAccessibilityLabelId( IDS_CANCEL)] performAction:grey_tap()]; @@ -579,7 +578,7 @@ [self addCard1]; [self loadTestPage:"payment_request_free_shipping_test.html"]; - CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey tapWebStateElementWithID:@"buy"]); + [ChromeEarlGrey tapWebStateElementWithID:@"buy"]; [self payWithCreditCardUsingCVC:@"123"]; FailureBlock failureBlock = ^(NSString* error) { @@ -655,7 +654,7 @@ [self addCard1]; [self loadTestPage:"payment_request_free_shipping_test.html"]; - CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey tapWebStateElementWithID:@"buy"]); + [ChromeEarlGrey tapWebStateElementWithID:@"buy"]; [[EarlGrey selectElementWithMatcher:chrome_test_util::ButtonWithAccessibilityLabelId( IDS_CANCEL)] performAction:grey_tap()]; @@ -729,8 +728,7 @@ chrome_test_util::HistogramTester histogramTester; [self loadTestPage:"payment_request_can_make_payment_metrics_test.html"]; - CHROME_EG_ASSERT_NO_ERROR( - [ChromeEarlGrey tapWebStateElementWithID:@"queryNoShow"]); + [ChromeEarlGrey tapWebStateElementWithID:@"queryNoShow"]; // Navigate away to abort the Payment Request and trigger the logs. [self loadTestPage:"payment_request_email_test.html"]; @@ -777,7 +775,7 @@ [self addCard1]; [self loadTestPage:"payment_request_email_test.html"]; - CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey tapWebStateElementWithID:@"buy"]); + [ChromeEarlGrey tapWebStateElementWithID:@"buy"]; // Navigate away to abort the Payment Request and trigger the logs. [self loadTestPage:"payment_request_email_test.html"]; @@ -829,7 +827,7 @@ [self addProfiles]; // The user has no form of payment on file. [self loadTestPage:"payment_request_email_test.html"]; - CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey tapWebStateElementWithID:@"buy"]); + [ChromeEarlGrey tapWebStateElementWithID:@"buy"]; // Navigate away to abort the Payment Request and trigger the logs. [self loadTestPage:"payment_request_email_test.html"]; @@ -882,7 +880,7 @@ [self addCard2]; // AMEX is not supported by the merchant. [self loadTestPage:"payment_request_email_test.html"]; - CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey tapWebStateElementWithID:@"buy"]); + [ChromeEarlGrey tapWebStateElementWithID:@"buy"]; // Navigate away to abort the Payment Request and trigger the logs. [self loadTestPage:"payment_request_email_test.html"];
diff --git a/ios/chrome/browser/ui/payments/payment_request_misc_egtest.mm b/ios/chrome/browser/ui/payments/payment_request_misc_egtest.mm index 8822751e..64efcca 100644 --- a/ios/chrome/browser/ui/payments/payment_request_misc_egtest.mm +++ b/ios/chrome/browser/ui/payments/payment_request_misc_egtest.mm
@@ -8,7 +8,6 @@ #import "ios/chrome/browser/ui/payments/payment_request_egtest_base.h" #import "ios/chrome/test/app/chrome_test_util.h" #import "ios/chrome/test/earl_grey/chrome_earl_grey.h" -#import "ios/chrome/test/earl_grey/chrome_error_util.h" #import "ios/web/public/test/http_server/http_server.h" #include "testing/gtest/include/gtest/gtest.h" @@ -37,8 +36,8 @@ // Tests that the page can create multiple PaymentRequest objects. - (void)testMultipleRequests { - CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey - loadURL:web::test::HttpServer::MakeUrl(kMultipleRequestsPage)]); + [ChromeEarlGrey + loadURL:web::test::HttpServer::MakeUrl(kMultipleRequestsPage)]; const payments::PaymentRequestCache::PaymentRequestSet& payment_requests = [self paymentRequestsForWebState:GetCurrentWebState()];
diff --git a/ios/chrome/browser/ui/payments/payment_request_modifiers_egtest.mm b/ios/chrome/browser/ui/payments/payment_request_modifiers_egtest.mm index 74615eb3..da92854 100644 --- a/ios/chrome/browser/ui/payments/payment_request_modifiers_egtest.mm +++ b/ios/chrome/browser/ui/payments/payment_request_modifiers_egtest.mm
@@ -101,10 +101,9 @@ // Tests that no modifier should be applied if there is no selected instrument. - (void)testNoModifierAppliedNoSelectedInstrument { - CHROME_EG_ASSERT_NO_ERROR( - [ChromeEarlGrey loadURL:web::test::HttpServer::MakeUrl(kModifiersPage)]); + [ChromeEarlGrey loadURL:web::test::HttpServer::MakeUrl(kModifiersPage)]; - CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey tapWebStateElementWithID:@"buy"]); + [ChromeEarlGrey tapWebStateElementWithID:@"buy"]; // Verify there's no line item. [[EarlGrey selectElementWithMatcher:PriceCellMatcher(@"Total, USD $5.00", NO)] @@ -114,12 +113,11 @@ // Tests that modifiers should be applied if there is a selected local credit // card instrument and the modifiers are for basic-card. - (void)testModifierAppliedSelectedLocalInstrumentWithoutTypeOrNetwork { - CHROME_EG_ASSERT_NO_ERROR( - [ChromeEarlGrey loadURL:web::test::HttpServer::MakeUrl(kModifiersPage)]); + [ChromeEarlGrey loadURL:web::test::HttpServer::MakeUrl(kModifiersPage)]; [self addLocalCard]; - CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey tapWebStateElementWithID:@"buy"]); + [ChromeEarlGrey tapWebStateElementWithID:@"buy"]; // Verify there's a selected payment method. [[EarlGrey selectElementWithMatcher:PaymentMethodCellMatcher(_localCard)] @@ -143,12 +141,11 @@ featureList.InitAndEnableFeature( payments::features::kReturnGooglePayInBasicCard); - CHROME_EG_ASSERT_NO_ERROR( - [ChromeEarlGrey loadURL:web::test::HttpServer::MakeUrl(kModifiersPage)]); + [ChromeEarlGrey loadURL:web::test::HttpServer::MakeUrl(kModifiersPage)]; [self addServerCardWithType:CREDIT]; - CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey tapWebStateElementWithID:@"buy"]); + [ChromeEarlGrey tapWebStateElementWithID:@"buy"]; // Verify there's a selected payment method. [[EarlGrey selectElementWithMatcher:PaymentMethodCellMatcher(_serverCard)] @@ -172,13 +169,11 @@ featureList.InitAndEnableFeature( payments::features::kReturnGooglePayInBasicCard); - CHROME_EG_ASSERT_NO_ERROR( - [ChromeEarlGrey loadURL:web::test::HttpServer::MakeUrl(kModifiersPage)]); + [ChromeEarlGrey loadURL:web::test::HttpServer::MakeUrl(kModifiersPage)]; [self addServerCardWithType:CREDIT]; - CHROME_EG_ASSERT_NO_ERROR( - [ChromeEarlGrey tapWebStateElementWithID:@"credit_supported_type"]); + [ChromeEarlGrey tapWebStateElementWithID:@"credit_supported_type"]; // Verify there's a selected payment method. [[EarlGrey selectElementWithMatcher:PaymentMethodCellMatcher(_serverCard)] @@ -198,13 +193,11 @@ // Tests that no modifier should be applied if there is a selected credit card // instrument but the modifiers are for basic-card of mismatching type. - (void)testNoModifierAppliedSelectedInstrumentWithMismatchingSupportedType { - CHROME_EG_ASSERT_NO_ERROR( - [ChromeEarlGrey loadURL:web::test::HttpServer::MakeUrl(kModifiersPage)]); + [ChromeEarlGrey loadURL:web::test::HttpServer::MakeUrl(kModifiersPage)]; [self addServerCardWithType:CREDIT]; - CHROME_EG_ASSERT_NO_ERROR( - [ChromeEarlGrey tapWebStateElementWithID:@"debit_supported_type"]); + [ChromeEarlGrey tapWebStateElementWithID:@"debit_supported_type"]; // Verify there's no line item. [[EarlGrey selectElementWithMatcher:PriceCellMatcher(@"Total, USD $5.00", NO)] @@ -218,13 +211,11 @@ featureList.InitAndEnableFeature( payments::features::kReturnGooglePayInBasicCard); - CHROME_EG_ASSERT_NO_ERROR( - [ChromeEarlGrey loadURL:web::test::HttpServer::MakeUrl(kModifiersPage)]); + [ChromeEarlGrey loadURL:web::test::HttpServer::MakeUrl(kModifiersPage)]; [self addServerCardWithType:CREDIT]; - CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey - tapWebStateElementWithID:@"mastercard_any_supported_type"]); + [ChromeEarlGrey tapWebStateElementWithID:@"mastercard_any_supported_type"]; // Verify there's a selected payment method. [[EarlGrey selectElementWithMatcher:PaymentMethodCellMatcher(_serverCard)] @@ -244,13 +235,11 @@ // Tests that no modifier should be applied if there is a selected credit card // instrument but the modifiers are for basic-card of mismatching network. - (void)testNoModifierAppliedSelectedInstrumentWithMismatchingSupportedNetwork { - CHROME_EG_ASSERT_NO_ERROR( - [ChromeEarlGrey loadURL:web::test::HttpServer::MakeUrl(kModifiersPage)]); + [ChromeEarlGrey loadURL:web::test::HttpServer::MakeUrl(kModifiersPage)]; [self addLocalCard]; - CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey - tapWebStateElementWithID:@"mastercard_any_supported_type"]); + [ChromeEarlGrey tapWebStateElementWithID:@"mastercard_any_supported_type"]; // Verify there's a selected payment method. [[EarlGrey selectElementWithMatcher:PaymentMethodCellMatcher(_localCard)] @@ -269,13 +258,11 @@ featureList.InitAndEnableFeature( payments::features::kReturnGooglePayInBasicCard); - CHROME_EG_ASSERT_NO_ERROR( - [ChromeEarlGrey loadURL:web::test::HttpServer::MakeUrl(kModifiersPage)]); + [ChromeEarlGrey loadURL:web::test::HttpServer::MakeUrl(kModifiersPage)]; [self addServerCardWithType:CREDIT]; - CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey - tapWebStateElementWithID:@"mastercard_supported_network"]); + [ChromeEarlGrey tapWebStateElementWithID:@"mastercard_supported_network"]; // Verify there's a selected payment method. [[EarlGrey selectElementWithMatcher:PaymentMethodCellMatcher(_serverCard)]
diff --git a/ios/chrome/browser/ui/payments/payment_request_payment_app_egtest.mm b/ios/chrome/browser/ui/payments/payment_request_payment_app_egtest.mm index 5eeb2fd..36a19fb 100644 --- a/ios/chrome/browser/ui/payments/payment_request_payment_app_egtest.mm +++ b/ios/chrome/browser/ui/payments/payment_request_payment_app_egtest.mm
@@ -7,7 +7,6 @@ #include "base/ios/ios_util.h" #import "ios/chrome/browser/ui/payments/payment_request_egtest_base.h" #import "ios/chrome/test/earl_grey/chrome_earl_grey.h" -#import "ios/chrome/test/earl_grey/chrome_error_util.h" #import "ios/web/public/test/http_server/http_server.h" #include "testing/gtest/include/gtest/gtest.h" @@ -42,10 +41,9 @@ @"available."); } - CHROME_EG_ASSERT_NO_ERROR( - [ChromeEarlGrey loadURL:web::test::HttpServer::MakeUrl(kBobPayPage)]); + [ChromeEarlGrey loadURL:web::test::HttpServer::MakeUrl(kBobPayPage)]; - CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey tapWebStateElementWithID:@"buy"]); + [ChromeEarlGrey tapWebStateElementWithID:@"buy"]; [self waitForWebViewContainingTexts:{"NotSupportedError", "The payment method is not supported"}]; @@ -54,11 +52,9 @@ // Tests that the Promise returned by canMakePayment() gets resolved with false // if the requested payment methods are payment apps that are not installed. - (void)testCanMakePaymentPaymentAppNotInstalled { - CHROME_EG_ASSERT_NO_ERROR( - [ChromeEarlGrey loadURL:web::test::HttpServer::MakeUrl(kBobPayPage)]); + [ChromeEarlGrey loadURL:web::test::HttpServer::MakeUrl(kBobPayPage)]; - CHROME_EG_ASSERT_NO_ERROR( - [ChromeEarlGrey tapWebStateElementWithID:@"canMakePayment"]); + [ChromeEarlGrey tapWebStateElementWithID:@"canMakePayment"]; [self waitForWebViewContainingTexts:{"false"}]; }
diff --git a/ios/chrome/browser/ui/payments/payment_request_payment_method_identifier_egtest.mm b/ios/chrome/browser/ui/payments/payment_request_payment_method_identifier_egtest.mm index 23254f11..e390b6a 100644 --- a/ios/chrome/browser/ui/payments/payment_request_payment_method_identifier_egtest.mm +++ b/ios/chrome/browser/ui/payments/payment_request_payment_method_identifier_egtest.mm
@@ -10,7 +10,6 @@ #import "ios/chrome/browser/ui/payments/payment_request_egtest_base.h" #import "ios/chrome/test/app/chrome_test_util.h" #import "ios/chrome/test/earl_grey/chrome_earl_grey.h" -#import "ios/chrome/test/earl_grey/chrome_error_util.h" #import "ios/web/public/test/http_server/http_server.h" #import "ios/web/public/test/web_view_interaction_test_util.h" #include "testing/gtest/include/gtest/gtest.h" @@ -43,10 +42,10 @@ // One network is specified in 'basic-card' data, one in supportedMethods. - (void)testBasicCardNetworksSpecified { - CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey - loadURL:web::test::HttpServer::MakeUrl(kPaymentMethodIdentifierPage)]); + [ChromeEarlGrey + loadURL:web::test::HttpServer::MakeUrl(kPaymentMethodIdentifierPage)]; - CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey tapWebStateElementWithID:@"buy"]); + [ChromeEarlGrey tapWebStateElementWithID:@"buy"]; const payments::PaymentRequestCache::PaymentRequestSet& requests = [self paymentRequestsForWebState:GetCurrentWebState()]; @@ -64,11 +63,10 @@ // Only specifying 'basic-card' with no supportedNetworks means all networks are // supported. - (void)testBasicCardNoNetworksSpecified { - CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey - loadURL:web::test::HttpServer::MakeUrl(kPaymentMethodIdentifierPage)]); + [ChromeEarlGrey + loadURL:web::test::HttpServer::MakeUrl(kPaymentMethodIdentifierPage)]; - CHROME_EG_ASSERT_NO_ERROR( - [ChromeEarlGrey tapWebStateElementWithID:@"buyBasicCard"]); + [ChromeEarlGrey tapWebStateElementWithID:@"buyBasicCard"]; const payments::PaymentRequestCache::PaymentRequestSet& requests = [self paymentRequestsForWebState:GetCurrentWebState()]; @@ -91,8 +89,8 @@ // Specifying 'basic-card' with some networks after having explicitely included // the same networks does not yield duplicates and has the expected order. - (void)testBasicCardNetworkThenBasicCardWithSameNetwork { - CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey - loadURL:web::test::HttpServer::MakeUrl(kPaymentMethodIdentifierPage)]); + [ChromeEarlGrey + loadURL:web::test::HttpServer::MakeUrl(kPaymentMethodIdentifierPage)]; web::test::ExecuteJavaScript( GetCurrentWebState(), @@ -123,8 +121,8 @@ // A url-based payment method identifier is only supported if it has an https // scheme. - (void)testValidURLBasedPaymentMethodIdentifier { - CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey - loadURL:web::test::HttpServer::MakeUrl(kPaymentMethodIdentifierPage)]); + [ChromeEarlGrey + loadURL:web::test::HttpServer::MakeUrl(kPaymentMethodIdentifierPage)]; web::test::ExecuteJavaScript(GetCurrentWebState(), "buyHelper([{" @@ -146,8 +144,8 @@ // An invalid URL-based payment method identifier results in a RangeError. - (void)testURLBasedPaymentMethodIdentifierWithInvalidScheme { - CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey - loadURL:web::test::HttpServer::MakeUrl(kPaymentMethodIdentifierPage)]); + [ChromeEarlGrey + loadURL:web::test::HttpServer::MakeUrl(kPaymentMethodIdentifierPage)]; web::test::ExecuteJavaScript(GetCurrentWebState(), "buyHelper([{" @@ -168,8 +166,8 @@ // An invalid standard payment method identifier results in a RangeError. - (void)testStandardPaymentMethodIdentifierWithInvalidCharacters { - CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey - loadURL:web::test::HttpServer::MakeUrl(kPaymentMethodIdentifierPage)]); + [ChromeEarlGrey + loadURL:web::test::HttpServer::MakeUrl(kPaymentMethodIdentifierPage)]; web::test::ExecuteJavaScript( GetCurrentWebState(),
diff --git a/ios/chrome/browser/ui/payments/payment_request_payment_response_egtest.mm b/ios/chrome/browser/ui/payments/payment_request_payment_response_egtest.mm index 3a58a44..8df03969 100644 --- a/ios/chrome/browser/ui/payments/payment_request_payment_response_egtest.mm +++ b/ios/chrome/browser/ui/payments/payment_request_payment_response_egtest.mm
@@ -67,10 +67,9 @@ card.set_billing_address_id(billingAddress.guid()); CHROME_EG_ASSERT_NO_ERROR([self addCreditCard:card]); - CHROME_EG_ASSERT_NO_ERROR( - [ChromeEarlGrey loadURL:web::test::HttpServer::MakeUrl(kNoShippingPage)]); + [ChromeEarlGrey loadURL:web::test::HttpServer::MakeUrl(kNoShippingPage)]; - CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey tapWebStateElementWithID:@"buy"]); + [ChromeEarlGrey tapWebStateElementWithID:@"buy"]; // Tap the buy button. [[EarlGrey selectElementWithMatcher:ButtonWithAccessibilityLabelId( @@ -135,10 +134,9 @@ shippingAddress.set_use_count(2000); CHROME_EG_ASSERT_NO_ERROR([self addAutofillProfile:shippingAddress]); - CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey - loadURL:web::test::HttpServer::MakeUrl(kFreeShippingPage)]); + [ChromeEarlGrey loadURL:web::test::HttpServer::MakeUrl(kFreeShippingPage)]; - CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey tapWebStateElementWithID:@"buy"]); + [ChromeEarlGrey tapWebStateElementWithID:@"buy"]; // Tap the buy button. [[EarlGrey selectElementWithMatcher:ButtonWithAccessibilityLabelId( @@ -190,10 +188,9 @@ card.set_billing_address_id(billingAddress.guid()); CHROME_EG_ASSERT_NO_ERROR([self addCreditCard:card]); - CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey - loadURL:web::test::HttpServer::MakeUrl(kContactDetailsPage)]); + [ChromeEarlGrey loadURL:web::test::HttpServer::MakeUrl(kContactDetailsPage)]; - CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey tapWebStateElementWithID:@"buy"]); + [ChromeEarlGrey tapWebStateElementWithID:@"buy"]; // Tap the buy button. [[EarlGrey selectElementWithMatcher:ButtonWithAccessibilityLabelId( @@ -227,10 +224,9 @@ card.set_billing_address_id(billingAddress.guid()); CHROME_EG_ASSERT_NO_ERROR([self addCreditCard:card]); - CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey - loadURL:web::test::HttpServer::MakeUrl(kRequestEmailPage)]); + [ChromeEarlGrey loadURL:web::test::HttpServer::MakeUrl(kRequestEmailPage)]; - CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey tapWebStateElementWithID:@"buy"]); + [ChromeEarlGrey tapWebStateElementWithID:@"buy"]; // Tap the buy button. [[EarlGrey selectElementWithMatcher:ButtonWithAccessibilityLabelId(
diff --git a/ios/chrome/browser/ui/payments/payment_request_show_egtest.mm b/ios/chrome/browser/ui/payments/payment_request_show_egtest.mm index b46fbc9..27ae123 100644 --- a/ios/chrome/browser/ui/payments/payment_request_show_egtest.mm +++ b/ios/chrome/browser/ui/payments/payment_request_show_egtest.mm
@@ -62,11 +62,9 @@ // Tests when PaymentRequest.show() is called without a promise the payment // sheet is displayed with the payment details. - (void)testBuyWithNoPromise { - CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey - loadURL:web::test::HttpServer::MakeUrl(kShowPromisePage)]); + [ChromeEarlGrey loadURL:web::test::HttpServer::MakeUrl(kShowPromisePage)]; - CHROME_EG_ASSERT_NO_ERROR( - [ChromeEarlGrey tapWebStateElementWithID:@"buyWithNoPromise"]); + [ChromeEarlGrey tapWebStateElementWithID:@"buyWithNoPromise"]; // Confirm that the Payment Request UI is showing. [[EarlGrey selectElementWithMatcher:chrome_test_util::PaymentRequestView()] @@ -87,8 +85,7 @@ // the promise resolves, the payment sheet displays the payment details and the // Buy button is enabled. - (void)testBuyWithResolvingPromise { - CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey - loadURL:web::test::HttpServer::MakeUrl(kShowPromisePage)]); + [ChromeEarlGrey loadURL:web::test::HttpServer::MakeUrl(kShowPromisePage)]; // Disable EarlGrey's synchronization. Needed likely due to // MDCActivityIndicator being present on the payment request view. @@ -96,8 +93,7 @@ setValue:@NO forConfigKey:kGREYConfigKeySynchronizationEnabled]; - CHROME_EG_ASSERT_NO_ERROR( - [ChromeEarlGrey tapWebStateElementWithID:@"buyWithResolvingPromise"]); + [ChromeEarlGrey tapWebStateElementWithID:@"buyWithResolvingPromise"]; // Wait until the payment request view shows. ConditionBlock condition = ^{ @@ -141,8 +137,7 @@ // is initially displayed with a spinner and the Buy button is not enabled. Once // the promise rejects, the payment is aborted. - (void)testBuyWithRejectingPromise { - CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey - loadURL:web::test::HttpServer::MakeUrl(kShowPromisePage)]); + [ChromeEarlGrey loadURL:web::test::HttpServer::MakeUrl(kShowPromisePage)]; // Disable EarlGrey's synchronization. Needed likely due to // MDCActivityIndicator being present on the payment request view. @@ -150,8 +145,7 @@ setValue:@NO forConfigKey:kGREYConfigKeySynchronizationEnabled]; - CHROME_EG_ASSERT_NO_ERROR( - [ChromeEarlGrey tapWebStateElementWithID:@"buyWithRejectingPromise"]); + [ChromeEarlGrey tapWebStateElementWithID:@"buyWithRejectingPromise"]; // Wait until the payment request view shows. ConditionBlock condition = ^{
diff --git a/ios/chrome/browser/ui/payments/payment_request_use_stats_egtest.mm b/ios/chrome/browser/ui/payments/payment_request_use_stats_egtest.mm index 35b50f8..d36cb6e 100644 --- a/ios/chrome/browser/ui/payments/payment_request_use_stats_egtest.mm +++ b/ios/chrome/browser/ui/payments/payment_request_use_stats_egtest.mm
@@ -67,7 +67,7 @@ // Completes the Payment Request. - (void)completePayment { - CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey tapWebStateElementWithID:@"buy"]); + [ChromeEarlGrey tapWebStateElementWithID:@"buy"]; // Tap the buy button. [[EarlGrey selectElementWithMatcher:ButtonWithAccessibilityLabelId( @@ -113,8 +113,7 @@ EXPECT_EQ(1U, initialBilling->use_count()); EXPECT_EQ(kSomeDate, initialBilling->use_date()); - CHROME_EG_ASSERT_NO_ERROR( - [ChromeEarlGrey loadURL:web::test::HttpServer::MakeUrl(kNoShippingPage)]); + [ChromeEarlGrey loadURL:web::test::HttpServer::MakeUrl(kNoShippingPage)]; testClock.SetNow(kSomeLaterDate); [self completePayment]; @@ -152,8 +151,7 @@ EXPECT_EQ(3U, initialShipping->use_count()); EXPECT_EQ(kSomeDate, initialShipping->use_date()); - CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey - loadURL:web::test::HttpServer::MakeUrl(kFreeShippingPage)]); + [ChromeEarlGrey loadURL:web::test::HttpServer::MakeUrl(kFreeShippingPage)]; testClock.SetNow(kSomeLaterDate); [self completePayment]; @@ -185,8 +183,7 @@ EXPECT_EQ(3U, initialContact->use_count()); EXPECT_EQ(kSomeDate, initialContact->use_date()); - CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey - loadURL:web::test::HttpServer::MakeUrl(kRequestNamePage)]); + [ChromeEarlGrey loadURL:web::test::HttpServer::MakeUrl(kRequestNamePage)]; testClock.SetNow(kSomeLaterDate); [self completePayment]; @@ -218,8 +215,8 @@ EXPECT_EQ(3U, initialAddress->use_count()); EXPECT_EQ(kSomeDate, initialAddress->use_date()); - CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey - loadURL:web::test::HttpServer::MakeUrl(kContactDetailsFreeShippingPage)]); + [ChromeEarlGrey + loadURL:web::test::HttpServer::MakeUrl(kContactDetailsFreeShippingPage)]; testClock.SetNow(kSomeLaterDate); [self completePayment];
diff --git a/ios/chrome/browser/ui/qr_scanner/qr_scanner_view_controller_egtest.mm b/ios/chrome/browser/ui/qr_scanner/qr_scanner_view_controller_egtest.mm index ad007a0..d5d5fac 100644 --- a/ios/chrome/browser/ui/qr_scanner/qr_scanner_view_controller_egtest.mm +++ b/ios/chrome/browser/ui/qr_scanner/qr_scanner_view_controller_egtest.mm
@@ -29,7 +29,6 @@ #import "ios/chrome/test/app/chrome_test_util.h" #import "ios/chrome/test/base/scoped_block_swizzler.h" #import "ios/chrome/test/earl_grey/chrome_earl_grey.h" -#import "ios/chrome/test/earl_grey/chrome_error_util.h" #import "ios/chrome/test/earl_grey/chrome_matchers.h" #import "ios/chrome/test/earl_grey/chrome_test_case.h" #import "ios/web/public/test/http_server/http_server.h" @@ -116,9 +115,8 @@ // Tap the omnibox to get the keyboard accessory view to show up. [[EarlGrey selectElementWithMatcher:chrome_test_util::NewTabPageOmnibox()] performAction:grey_tap()]; - CHROME_EG_ASSERT_NO_ERROR( - [ChromeEarlGrey waitForSufficientlyVisibleElementWithMatcher: - chrome_test_util::Omnibox()]); + [ChromeEarlGrey + waitForSufficientlyVisibleElementWithMatcher:chrome_test_util::Omnibox()]; // Tap the QR Code scanner button in the keyboard accessory view. id<GREYMatcher> matcher = @@ -777,8 +775,7 @@ } else { TapKeyboardReturnKeyInOmniboxWithText(result); } - CHROME_EG_ASSERT_NO_ERROR( - [ChromeEarlGrey waitForWebStateContainingText:response]); + [ChromeEarlGrey waitForWebStateContainingText:response]; // Press the back button to get back to the NTP. [[EarlGrey selectElementWithMatcher:chrome_test_util::BackButton()]
diff --git a/ios/chrome/browser/ui/reading_list/reading_list_egtest.mm b/ios/chrome/browser/ui/reading_list/reading_list_egtest.mm index ec5a288..4964348c 100644 --- a/ios/chrome/browser/ui/reading_list/reading_list_egtest.mm +++ b/ios/chrome/browser/ui/reading_list/reading_list_egtest.mm
@@ -32,7 +32,6 @@ #import "ios/chrome/test/earl_grey/accessibility_util.h" #import "ios/chrome/test/earl_grey/chrome_earl_grey.h" #import "ios/chrome/test/earl_grey/chrome_earl_grey_ui.h" -#import "ios/chrome/test/earl_grey/chrome_error_util.h" #import "ios/chrome/test/earl_grey/chrome_matchers.h" #import "ios/chrome/test/earl_grey/chrome_test_case.h" #import "ios/third_party/material_components_ios/src/components/Snackbar/src/MaterialSnackbar.h" @@ -434,8 +433,7 @@ void AssertIsShowingDistillablePageNoNativeContent( bool online, const GURL& distillable_url) { - CHROME_EG_ASSERT_NO_ERROR( - [ChromeEarlGrey waitForWebStateContainingText:kContentToKeep]); + [ChromeEarlGrey waitForWebStateContainingText:kContentToKeep]; [[EarlGrey selectElementWithMatcher:chrome_test_util::OmniboxText( distillable_url.GetContent())] @@ -443,15 +441,11 @@ // Test that the offline and online pages are properly displayed. if (online) { - CHROME_EG_ASSERT_NO_ERROR( - [ChromeEarlGrey waitForWebStateContainingText:kContentToRemove]); - CHROME_EG_ASSERT_NO_ERROR( - [ChromeEarlGrey waitForWebStateContainingText:kContentToKeep]); + [ChromeEarlGrey waitForWebStateContainingText:kContentToRemove]; + [ChromeEarlGrey waitForWebStateContainingText:kContentToKeep]; } else { - CHROME_EG_ASSERT_NO_ERROR( - [ChromeEarlGrey waitForWebStateNotContainingText:kContentToRemove]); - CHROME_EG_ASSERT_NO_ERROR( - [ChromeEarlGrey waitForWebStateContainingText:kContentToKeep]); + [ChromeEarlGrey waitForWebStateNotContainingText:kContentToRemove]; + [ChromeEarlGrey waitForWebStateContainingText:kContentToKeep]; } // Test the presence of the omnibox offline chip. @@ -489,12 +483,11 @@ // Test that the offline and online pages are properly displayed. if (online) { - CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey - waitForWebStateContainingText:base::SysNSStringToUTF8(contentToKeep)]); + [ChromeEarlGrey + waitForWebStateContainingText:base::SysNSStringToUTF8(contentToKeep)]; WaitForStaticHtmlViewNotContainingText(contentToKeep); } else { - CHROME_EG_ASSERT_NO_ERROR( - [ChromeEarlGrey waitForWebStateNotContainingText:kContentToKeep]); + [ChromeEarlGrey waitForWebStateNotContainingText:kContentToKeep]; WaitForStaticHtmlViewContainingText(contentToKeep); } @@ -572,13 +565,13 @@ GURL nonDistillablePageURL(self.testServer->GetURL(kNonDistillableURL)); std::string pageTitle(kDistillableTitle); // Open http://potato - CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:distillablePageURL]); + [ChromeEarlGrey loadURL:distillablePageURL]; AddCurrentPageToReadingList(); // Navigate to http://beans - CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:nonDistillablePageURL]); - CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey waitForPageToFinishLoading]); + [ChromeEarlGrey loadURL:nonDistillablePageURL]; + [ChromeEarlGrey waitForPageToFinishLoading]; // Verify that an entry with the correct title is present in the reading list. OpenReadingList(); @@ -616,14 +609,13 @@ std::string pageTitle(kDistillableTitle); GURL distillableURL = self.testServer->GetURL(kDistillableURL); // Open http://potato - CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:distillableURL]); + [ChromeEarlGrey loadURL:distillableURL]; AddCurrentPageToReadingList(); // Navigate to http://beans - CHROME_EG_ASSERT_NO_ERROR( - [ChromeEarlGrey loadURL:self.testServer->GetURL(kNonDistillableURL)]); - CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey waitForPageToFinishLoading]); + [ChromeEarlGrey loadURL:self.testServer->GetURL(kNonDistillableURL)]; + [ChromeEarlGrey waitForPageToFinishLoading]; // Verify that an entry with the correct title is present in the reading list. OpenReadingList(); @@ -654,15 +646,14 @@ std::string pageTitle(kDistillableTitle); GURL distillableURL = self.testServer->GetURL(kDistillableURL); // Open http://potato - CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:distillableURL]); + [ChromeEarlGrey loadURL:distillableURL]; AddCurrentPageToReadingList(); // Navigate to http://beans - CHROME_EG_ASSERT_NO_ERROR( - [ChromeEarlGrey loadURL:self.testServer->GetURL(kNonDistillableURL)]); - CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey waitForPageToFinishLoading]); + [ChromeEarlGrey loadURL:self.testServer->GetURL(kNonDistillableURL)]; + [ChromeEarlGrey waitForPageToFinishLoading]; // Verify that an entry with the correct title is present in the reading list. OpenReadingList(); @@ -684,8 +675,8 @@ // TODO(crbug.com/954248) This DCHECK's (but works) with slimnav disabled. if (base::FeatureList::IsEnabled(web::features::kSlimNavigationManager)) { - CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey goBack]); - CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey goForward]); + [ChromeEarlGrey goBack]; + [ChromeEarlGrey goForward]; AssertIsShowingDistillablePage(false, distillableURL); } @@ -709,14 +700,13 @@ std::string pageTitle(kDistillableTitle); GURL distillableURL = self.testServer->GetURL(kDistillableURL); // Open http://potato - CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:distillableURL]); + [ChromeEarlGrey loadURL:distillableURL]; AddCurrentPageToReadingList(); // Navigate to http://beans - CHROME_EG_ASSERT_NO_ERROR( - [ChromeEarlGrey loadURL:self.testServer->GetURL(kNonDistillableURL)]); - CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey waitForPageToFinishLoading]); + [ChromeEarlGrey loadURL:self.testServer->GetURL(kNonDistillableURL)]; + [ChromeEarlGrey waitForPageToFinishLoading]; // Verify that an entry with the correct title is present in the reading OpenReadingList(); @@ -729,8 +719,8 @@ AssertIsShowingDistillablePage(false, distillableURL); - CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey goBack]); - CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey goForward]); + [ChromeEarlGrey goBack]; + [ChromeEarlGrey goForward]; AssertIsShowingDistillablePage(false, distillableURL); // Reload should load online page.
diff --git a/ios/chrome/browser/ui/recent_tabs/recent_tabs_egtest.mm b/ios/chrome/browser/ui/recent_tabs/recent_tabs_egtest.mm index 4045df0..d410a829 100644 --- a/ios/chrome/browser/ui/recent_tabs/recent_tabs_egtest.mm +++ b/ios/chrome/browser/ui/recent_tabs/recent_tabs_egtest.mm
@@ -23,7 +23,6 @@ #import "ios/chrome/test/app/chrome_test_util.h" #import "ios/chrome/test/earl_grey/chrome_earl_grey.h" #import "ios/chrome/test/earl_grey/chrome_earl_grey_ui.h" -#import "ios/chrome/test/earl_grey/chrome_error_util.h" #import "ios/chrome/test/earl_grey/chrome_matchers.h" #import "ios/chrome/test/earl_grey/chrome_test_case.h" #import "ios/public/provider/chrome/browser/signin/fake_chrome_identity_service.h" @@ -55,10 +54,10 @@ // At least one tab is needed to be able to open the recent tabs panel. if ([ChromeEarlGrey isIncognitoMode]) { if ([ChromeEarlGrey incognitoTabCount] == 0) - CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey openNewIncognitoTab]); + [ChromeEarlGrey openNewIncognitoTab]; } else { if ([ChromeEarlGrey mainTabCount] == 0) - CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey openNewTab]); + [ChromeEarlGrey openNewTab]; } [ChromeEarlGreyUI openToolsMenu]; @@ -108,9 +107,8 @@ const GURL testPageURL = web::test::HttpServer::MakeUrl(kURLOfTestPage); // Open the test page in a new tab. - CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:testPageURL]); - CHROME_EG_ASSERT_NO_ERROR( - [ChromeEarlGrey waitForWebStateContainingText:"hello"]); + [ChromeEarlGrey loadURL:testPageURL]; + [ChromeEarlGrey waitForWebStateContainingText:"hello"]; // Open the Recent Tabs panel, check that the test page is not // present. @@ -142,12 +140,11 @@ const GURL testPageURL = web::test::HttpServer::MakeUrl(kURLOfTestPage); // Open the test page in a new tab. - CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:testPageURL]); - CHROME_EG_ASSERT_NO_ERROR( - [ChromeEarlGrey waitForWebStateContainingText:"hello"]); + [ChromeEarlGrey loadURL:testPageURL]; + [ChromeEarlGrey waitForWebStateContainingText:"hello"]; // Open a new incognito tab, then close the non-OTR tab. - CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey openNewIncognitoTab]); + [ChromeEarlGrey openNewIncognitoTab]; CloseAllNormalTabs(); // Open the Recent Tabs panel and check that the test page is present. @@ -161,7 +158,7 @@ @"Unexpected tabs in the main WebStateList"); [[EarlGrey selectElementWithMatcher:TitleOfTestPage()] performAction:grey_tap()]; - CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey waitForMainTabCount:1]); + [ChromeEarlGrey waitForMainTabCount:1]; GREYAssertTrue([ChromeEarlGrey incognitoTabCount] == 1, @"Unexpected tab added to the incognito WebStateList"); }
diff --git a/ios/chrome/browser/ui/send_tab_to_self/BUILD.gn b/ios/chrome/browser/ui/send_tab_to_self/BUILD.gn new file mode 100644 index 0000000..538aa9e7 --- /dev/null +++ b/ios/chrome/browser/ui/send_tab_to_self/BUILD.gn
@@ -0,0 +1,15 @@ +# 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. + +source_set("send_tab_to_self") { + configs += [ "//build/config/compiler:enable_arc" ] + sources = [ + "send_tab_to_self_coordinator.h", + "send_tab_to_self_coordinator.mm", + ] + deps = [ + "//base", + "//ios/chrome/browser/ui/coordinators:chrome_coordinators", + ] +}
diff --git a/ios/chrome/browser/ui/send_tab_to_self/send_tab_to_self_coordinator.h b/ios/chrome/browser/ui/send_tab_to_self/send_tab_to_self_coordinator.h new file mode 100644 index 0000000..cdf39e48 --- /dev/null +++ b/ios/chrome/browser/ui/send_tab_to_self/send_tab_to_self_coordinator.h
@@ -0,0 +1,17 @@ +// 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 IOS_CHROME_BROWSER_UI_SEND_TAB_TO_SELF_SEND_TAB_TO_SELF_COORDINATOR_H_ +#define IOS_CHROME_BROWSER_UI_SEND_TAB_TO_SELF_SEND_TAB_TO_SELF_COORDINATOR_H_ + +#import "ios/chrome/browser/ui/coordinators/chrome_coordinator.h" + +// Displays the send tab to self UI for all device form factors. Will show a +// modal dialog popup on both platforms. Once this coordinator is stopped, the +// underlying dialog is dismissed. +@interface SendTabToSelfCoordinator : ChromeCoordinator + +@end + +#endif // IOS_CHROME_BROWSER_UI_SEND_TAB_TO_SELF_SEND_TAB_TO_SELF_COORDINATOR_H_
diff --git a/ios/chrome/browser/ui/send_tab_to_self/send_tab_to_self_coordinator.mm b/ios/chrome/browser/ui/send_tab_to_self/send_tab_to_self_coordinator.mm new file mode 100644 index 0000000..59889418 --- /dev/null +++ b/ios/chrome/browser/ui/send_tab_to_self/send_tab_to_self_coordinator.mm
@@ -0,0 +1,25 @@ +// 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. + +#import "ios/chrome/browser/ui/send_tab_to_self/send_tab_to_self_coordinator.h" + +#include "base/logging.h" + +#if !defined(__has_feature) || !__has_feature(objc_arc) +#error "This file requires ARC support." +#endif + +@implementation SendTabToSelfCoordinator + +#pragma mark - ChromeCoordinator Methods + +- (void)start { + NOTIMPLEMENTED(); +} + +- (void)stop { + NOTIMPLEMENTED(); +} + +@end
diff --git a/ios/chrome/browser/ui/settings/block_popups_egtest.mm b/ios/chrome/browser/ui/settings/block_popups_egtest.mm index 4ba7027af..41e94d9 100644 --- a/ios/chrome/browser/ui/settings/block_popups_egtest.mm +++ b/ios/chrome/browser/ui/settings/block_popups_egtest.mm
@@ -16,7 +16,6 @@ #import "ios/chrome/test/earl_grey/chrome_actions.h" #import "ios/chrome/test/earl_grey/chrome_earl_grey.h" #import "ios/chrome/test/earl_grey/chrome_earl_grey_ui.h" -#import "ios/chrome/test/earl_grey/chrome_error_util.h" #import "ios/chrome/test/earl_grey/chrome_matchers.h" #import "ios/chrome/test/earl_grey/chrome_test_case.h" #include "ios/chrome/test/scoped_block_popups_pref.h" @@ -130,13 +129,13 @@ ScopedBlockPopupsPref prefSetter(CONTENT_SETTING_ALLOW, GetOriginalBrowserState()); - CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:blockPopupsURL]); - CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey waitForMainTabCount:1]); + [ChromeEarlGrey loadURL:blockPopupsURL]; + [ChromeEarlGrey waitForMainTabCount:1]; // Request popup (execute script without using a user gesture) and make sure // the popup opened in a new tab. [ChromeEarlGrey executeJavaScript:kOpenPopupScript]; - CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey waitForMainTabCount:2]); + [ChromeEarlGrey waitForMainTabCount:2]; // No infobar should be displayed. [[EarlGrey selectElementWithMatcher:chrome_test_util:: @@ -160,8 +159,8 @@ ScopedBlockPopupsPref prefSetter(CONTENT_SETTING_BLOCK, GetOriginalBrowserState()); - CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:blockPopupsURL]); - CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey waitForMainTabCount:1]); + [ChromeEarlGrey loadURL:blockPopupsURL]; + [ChromeEarlGrey waitForMainTabCount:1]; // Request popup (execute script without using a user gesture), then make sure // it was blocked and an infobar was displayed. The window.open() call is run @@ -180,7 +179,7 @@ error:&error]; return error == nil; }] waitWithTimeout:4.0]; - CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey waitForMainTabCount:1]); + [ChromeEarlGrey waitForMainTabCount:1]; } // Tests that the "exceptions" section on the settings page is hidden and
diff --git a/ios/chrome/browser/ui/settings/settings_egtest.mm b/ios/chrome/browser/ui/settings/settings_egtest.mm index 372842f..20111b1 100644 --- a/ios/chrome/browser/ui/settings/settings_egtest.mm +++ b/ios/chrome/browser/ui/settings/settings_egtest.mm
@@ -31,7 +31,6 @@ #include "ios/chrome/test/earl_grey/accessibility_util.h" #import "ios/chrome/test/earl_grey/chrome_earl_grey.h" #import "ios/chrome/test/earl_grey/chrome_earl_grey_ui.h" -#import "ios/chrome/test/earl_grey/chrome_error_util.h" #import "ios/chrome/test/earl_grey/chrome_matchers.h" #import "ios/chrome/test/earl_grey/chrome_test_case.h" #import "ios/web/public/test/http_server/http_server.h" @@ -454,24 +453,18 @@ web::test::SetUpSimpleHttpServerWithSetCookies(response); // Load |kUrl| and check that cookie is not set. - CHROME_EG_ASSERT_NO_ERROR( - [ChromeEarlGrey loadURL:web::test::HttpServer::MakeUrl(kUrl)]); - CHROME_EG_ASSERT_NO_ERROR( - [ChromeEarlGrey waitForWebStateContainingText:kResponse]); + [ChromeEarlGrey loadURL:web::test::HttpServer::MakeUrl(kUrl)]; + [ChromeEarlGrey waitForWebStateContainingText:kResponse]; NSDictionary* cookies = [ChromeEarlGrey cookies]; GREYAssertEqual(0U, cookies.count, @"No cookie should be found."); // Visit |kUrlWithSetCookie| to set a cookie and then load |kUrl| to check it // is still set. - CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey - loadURL:web::test::HttpServer::MakeUrl(kUrlWithSetCookie)]); - CHROME_EG_ASSERT_NO_ERROR( - [ChromeEarlGrey waitForWebStateContainingText:kResponseWithSetCookie]); - CHROME_EG_ASSERT_NO_ERROR( - [ChromeEarlGrey loadURL:web::test::HttpServer::MakeUrl(kUrl)]); - CHROME_EG_ASSERT_NO_ERROR( - [ChromeEarlGrey waitForWebStateContainingText:kResponse]); + [ChromeEarlGrey loadURL:web::test::HttpServer::MakeUrl(kUrlWithSetCookie)]; + [ChromeEarlGrey waitForWebStateContainingText:kResponseWithSetCookie]; + [ChromeEarlGrey loadURL:web::test::HttpServer::MakeUrl(kUrl)]; + [ChromeEarlGrey waitForWebStateContainingText:kResponse]; cookies = [ChromeEarlGrey cookies]; GREYAssertEqualObjects(kCookieValue, cookies[kCookieName], @@ -489,10 +482,8 @@ [self clearCookiesAndSiteData]; // Reload and test that there are no cookies left. - CHROME_EG_ASSERT_NO_ERROR( - [ChromeEarlGrey loadURL:web::test::HttpServer::MakeUrl(kUrl)]); - CHROME_EG_ASSERT_NO_ERROR( - [ChromeEarlGrey waitForWebStateContainingText:kResponse]); + [ChromeEarlGrey loadURL:web::test::HttpServer::MakeUrl(kUrl)]; + [ChromeEarlGrey waitForWebStateContainingText:kResponse]; cookies = [ChromeEarlGrey cookies]; GREYAssertEqual(0U, cookies.count, @"No cookie should be found."); @@ -539,7 +530,7 @@ // Verifies that Settings opens when signed-out and in Incognito mode. // This tests that crbug.com/607335 has not regressed. - (void)testSettingsSignedOutIncognito { - CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey openNewIncognitoTab]); + [ChromeEarlGrey openNewIncognitoTab]; [ChromeEarlGreyUI openSettingsMenu]; [[EarlGrey selectElementWithMatcher:SettingsCollectionView()] assertWithMatcher:grey_notNil()];
diff --git a/ios/chrome/browser/ui/settings/sync/utils/sync_fake_server_egtest.mm b/ios/chrome/browser/ui/settings/sync/utils/sync_fake_server_egtest.mm index b6f6da9..e3a35af 100644 --- a/ios/chrome/browser/ui/settings/sync/utils/sync_fake_server_egtest.mm +++ b/ios/chrome/browser/ui/settings/sync/utils/sync_fake_server_egtest.mm
@@ -23,7 +23,6 @@ #import "ios/chrome/test/app/chrome_test_util.h" #import "ios/chrome/test/earl_grey/chrome_earl_grey.h" #import "ios/chrome/test/earl_grey/chrome_earl_grey_ui.h" -#import "ios/chrome/test/earl_grey/chrome_error_util.h" #import "ios/chrome/test/earl_grey/chrome_matchers.h" #import "ios/chrome/test/earl_grey/chrome_test_case.h" #import "ios/public/provider/chrome/browser/signin/fake_chrome_identity.h" @@ -66,8 +65,8 @@ @implementation SyncFakeServerTestCase - (void)tearDown { - CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey waitForBookmarksToFinishLoading]); - CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey clearBookmarks]); + [ChromeEarlGrey waitForBookmarksToFinishLoading]; + [ChromeEarlGrey clearBookmarks]; [ChromeEarlGrey clearSyncServerData]; AssertNumberOfEntities(0, syncer::AUTOFILL_PROFILE); @@ -96,9 +95,7 @@ [SigninEarlGreyUI signinWithIdentity:identity]; // Assert that the correct number of bookmarks have been synced. - CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey - waitForSyncInitialized:YES - syncTimeout:kSyncOperationTimeout]); + [ChromeEarlGrey waitForSyncInitialized:YES syncTimeout:kSyncOperationTimeout]; AssertNumberOfEntities(1, syncer::BOOKMARKS); } @@ -110,9 +107,7 @@ [SigninEarlGreyUI signinWithIdentity:identity]; // Add a bookmark after sync is initialized. - CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey - waitForSyncInitialized:YES - syncTimeout:kSyncOperationTimeout]); + [ChromeEarlGrey waitForSyncInitialized:YES syncTimeout:kSyncOperationTimeout]; [self addBookmark:GURL("https://www.goo.com") withTitle:@"goo"]; AssertNumberOfEntities(1, syncer::BOOKMARKS); } @@ -129,9 +124,7 @@ ios::FakeChromeIdentityService::GetInstanceFromChromeProvider()->AddIdentity( identity); [SigninEarlGreyUI signinWithIdentity:identity]; - CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey - waitForSyncInitialized:YES - syncTimeout:kSyncOperationTimeout]); + [ChromeEarlGrey waitForSyncInitialized:YES syncTimeout:kSyncOperationTimeout]; [[self class] assertBookmarksWithTitle:@"hoo" expectedCount:1]; } @@ -142,22 +135,16 @@ ios::FakeChromeIdentityService::GetInstanceFromChromeProvider()->AddIdentity( identity); [SigninEarlGreyUI signinWithIdentity:identity]; - CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey - waitForSyncInitialized:YES - syncTimeout:kSyncOperationTimeout]); + [ChromeEarlGrey waitForSyncInitialized:YES syncTimeout:kSyncOperationTimeout]; // Store the original guid, then restart sync. std::string original_guid = [ChromeEarlGrey syncCacheGUID]; [ChromeEarlGrey stopSync]; - CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey - waitForSyncInitialized:NO - syncTimeout:kSyncOperationTimeout]); + [ChromeEarlGrey waitForSyncInitialized:NO syncTimeout:kSyncOperationTimeout]; [ChromeEarlGrey startSync]; // Verify the guid did not change. - CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey - waitForSyncInitialized:YES - syncTimeout:kSyncOperationTimeout]); + [ChromeEarlGrey waitForSyncInitialized:YES syncTimeout:kSyncOperationTimeout]; GREYAssertEqual([ChromeEarlGrey syncCacheGUID], original_guid, @"Stored guid doesn't match current value"); } @@ -170,9 +157,7 @@ ios::FakeChromeIdentityService::GetInstanceFromChromeProvider()->AddIdentity( identity); [SigninEarlGreyUI signinWithIdentity:identity]; - CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey - waitForSyncInitialized:YES - syncTimeout:kSyncOperationTimeout]); + [ChromeEarlGrey waitForSyncInitialized:YES syncTimeout:kSyncOperationTimeout]; std::string original_guid = [ChromeEarlGrey syncCacheGUID]; // Sign out the current user. @@ -183,15 +168,11 @@ GREYAssert(authentication_service->IsAuthenticated(), @"User is not signed in."); authentication_service->SignOut(signin_metrics::SIGNOUT_TEST, nil); - CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey - waitForSyncInitialized:NO - syncTimeout:kSyncOperationTimeout]); + [ChromeEarlGrey waitForSyncInitialized:NO syncTimeout:kSyncOperationTimeout]; // Sign the user back in, and verify the guid has changed. [SigninEarlGreyUI signinWithIdentity:identity]; - CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey - waitForSyncInitialized:YES - syncTimeout:kSyncOperationTimeout]); + [ChromeEarlGrey waitForSyncInitialized:YES syncTimeout:kSyncOperationTimeout]; GREYAssertTrue( [ChromeEarlGrey syncCacheGUID] != original_guid, @"guid didn't change after user signed out and signed back in"); @@ -206,9 +187,7 @@ ios::FakeChromeIdentityService::GetInstanceFromChromeProvider()->AddIdentity( identity); [SigninEarlGreyUI signinWithIdentity:identity]; - CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey - waitForSyncInitialized:YES - syncTimeout:kSyncOperationTimeout]); + [ChromeEarlGrey waitForSyncInitialized:YES syncTimeout:kSyncOperationTimeout]; // Sign out the current user. ios::ChromeBrowserState* browser_state = @@ -218,28 +197,20 @@ GREYAssert(authentication_service->IsAuthenticated(), @"User is not signed in."); authentication_service->SignOut(signin_metrics::SIGNOUT_TEST, nil); - CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey - waitForSyncInitialized:NO - syncTimeout:kSyncOperationTimeout]); + [ChromeEarlGrey waitForSyncInitialized:NO syncTimeout:kSyncOperationTimeout]; // Sign the user back in. [SigninEarlGreyUI signinWithIdentity:identity]; - CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey - waitForSyncInitialized:YES - syncTimeout:kSyncOperationTimeout]); + [ChromeEarlGrey waitForSyncInitialized:YES syncTimeout:kSyncOperationTimeout]; // Record the initial guid, before restarting sync. std::string original_guid = [ChromeEarlGrey syncCacheGUID]; [ChromeEarlGrey stopSync]; - CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey - waitForSyncInitialized:NO - syncTimeout:kSyncOperationTimeout]); + [ChromeEarlGrey waitForSyncInitialized:NO syncTimeout:kSyncOperationTimeout]; [ChromeEarlGrey startSync]; // Verify the guid did not change after restarting sync. - CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey - waitForSyncInitialized:YES - syncTimeout:kSyncOperationTimeout]); + [ChromeEarlGrey waitForSyncInitialized:YES syncTimeout:kSyncOperationTimeout]; GREYAssertEqual([ChromeEarlGrey syncCacheGUID], original_guid, @"Stored guid doesn't match current value"); } @@ -264,9 +235,7 @@ [SigninEarlGreyUI signinWithIdentity:identity]; // Verify that the autofill profile has been downloaded. - CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey - waitForSyncInitialized:YES - syncTimeout:kSyncOperationTimeout]); + [ChromeEarlGrey waitForSyncInitialized:YES syncTimeout:kSyncOperationTimeout]; GREYAssertTrue([ChromeEarlGrey isAutofillProfilePresentWithGUID:kGuid autofillProfileName:kFullName], @"autofill profile should exist"); @@ -295,9 +264,7 @@ [SigninEarlGreyUI signinWithIdentity:identity]; // Verify that the autofill profile has been downloaded. - CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey - waitForSyncInitialized:YES - syncTimeout:kSyncOperationTimeout]); + [ChromeEarlGrey waitForSyncInitialized:YES syncTimeout:kSyncOperationTimeout]; GREYAssertTrue([ChromeEarlGrey isAutofillProfilePresentWithGUID:kGuid autofillProfileName:kFullName], @"autofill profile should exist"); @@ -344,9 +311,7 @@ [SigninEarlGreyUI signinWithIdentity:identity]; // Verify that the autofill profile has been downloaded - CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey - waitForSyncInitialized:YES - syncTimeout:kSyncOperationTimeout]); + [ChromeEarlGrey waitForSyncInitialized:YES syncTimeout:kSyncOperationTimeout]; GREYAssertTrue([ChromeEarlGrey isAutofillProfilePresentWithGUID:kGuid autofillProfileName:kFullName], @"autofill profile should exist"); @@ -376,9 +341,9 @@ web::test::SetUpSimpleHttpServer(responses); // Load both URLs in separate tabs. - CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:URL1]); - CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey openNewTab]); - CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:URL2]); + [ChromeEarlGrey loadURL:URL1]; + [ChromeEarlGrey openNewTab]; + [ChromeEarlGrey loadURL:URL2]; // Sign in to sync, after opening two tabs. ChromeIdentity* identity = [SigninEarlGreyUtils fakeIdentity1]; @@ -387,16 +352,14 @@ [SigninEarlGreyUI signinWithIdentity:identity]; // Verify the sessions on the sync server. - CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey - waitForSyncInitialized:YES - syncTimeout:kSyncOperationTimeout]); + [ChromeEarlGrey waitForSyncInitialized:YES syncTimeout:kSyncOperationTimeout]; AssertNumberOfEntities(3, syncer::SESSIONS); NSArray<NSString*>* specs = @[ base::SysUTF8ToNSString(URL1.spec()), base::SysUTF8ToNSString(URL2.spec()), ]; - CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey verifySyncServerURLs:specs]); + [ChromeEarlGrey verifySyncServerURLs:specs]; } // Tests that a typed URL (after Sync is enabled) is uploaded to the Sync @@ -416,17 +379,14 @@ identity); [SigninEarlGreyUI signinWithIdentity:identity]; - CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey - waitForSyncInitialized:YES - syncTimeout:kSyncOperationTimeout]); + [ChromeEarlGrey waitForSyncInitialized:YES syncTimeout:kSyncOperationTimeout]; // Trigger sync and verify the typed URL is on the fake sync server. [ChromeEarlGrey triggerSyncCycleForType:syncer::TYPED_URLS]; - CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey - waitForSyncServerEntitiesWithType:syncer::TYPED_URLS - name:mockURL.spec() - count:1 - timeout:kSyncOperationTimeout]); + [ChromeEarlGrey waitForSyncServerEntitiesWithType:syncer::TYPED_URLS + name:mockURL.spec() + count:1 + timeout:kSyncOperationTimeout]; } // Tests that typed url is downloaded from sync server. @@ -447,15 +407,12 @@ identity); [SigninEarlGreyUI signinWithIdentity:identity]; - CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey - waitForSyncInitialized:YES - syncTimeout:kSyncOperationTimeout]); + [ChromeEarlGrey waitForSyncInitialized:YES syncTimeout:kSyncOperationTimeout]; // Wait for typed url to appear on client. - CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey - waitForTypedURL:mockURL - expectPresent:YES - timeout:kSyncOperationTimeout]); + [ChromeEarlGrey waitForTypedURL:mockURL + expectPresent:YES + timeout:kSyncOperationTimeout]; } // Tests that when typed url is deleted on the client, sync the change gets @@ -477,15 +434,12 @@ identity); [SigninEarlGreyUI signinWithIdentity:identity]; - CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey - waitForSyncInitialized:YES - syncTimeout:kSyncOperationTimeout]); + [ChromeEarlGrey waitForSyncInitialized:YES syncTimeout:kSyncOperationTimeout]; // Wait for typed url to appear on client. - CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey - waitForTypedURL:mockURL - expectPresent:YES - timeout:kSyncOperationTimeout]); + [ChromeEarlGrey waitForTypedURL:mockURL + expectPresent:YES + timeout:kSyncOperationTimeout]; GREYAssert( [ChromeEarlGrey numberOfSyncEntitiesWithType:syncer::TYPED_URLS] == 1, @"There should be 1 typed URL entity"); @@ -515,24 +469,20 @@ identity); [SigninEarlGreyUI signinWithIdentity:identity]; - CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey - waitForSyncInitialized:YES - syncTimeout:kSyncOperationTimeout]); + [ChromeEarlGrey waitForSyncInitialized:YES syncTimeout:kSyncOperationTimeout]; [ChromeEarlGrey triggerSyncCycleForType:syncer::TYPED_URLS]; - CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey - waitForSyncServerEntitiesWithType:syncer::TYPED_URLS - name:mockURL.spec() - count:1 - timeout:kSyncOperationTimeout]); + [ChromeEarlGrey waitForSyncServerEntitiesWithType:syncer::TYPED_URLS + name:mockURL.spec() + count:1 + timeout:kSyncOperationTimeout]; [ChromeEarlGrey deleteHistoryServiceTypedURL:mockURL]; // Trigger sync and wait for fake server to be updated. [ChromeEarlGrey triggerSyncCycleForType:syncer::TYPED_URLS]; - CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey - waitForTypedURL:mockURL - expectPresent:NO - timeout:kSyncOperationTimeout]); + [ChromeEarlGrey waitForTypedURL:mockURL + expectPresent:NO + timeout:kSyncOperationTimeout]; } #pragma mark - Test Utilities @@ -542,7 +492,7 @@ // TODO(crbug.com/646164): This is copied from bookmarks_egtest.mm and should // move to common location. - (void)addBookmark:(const GURL)url withTitle:(NSString*)title { - CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey waitForBookmarksToFinishLoading]); + [ChromeEarlGrey waitForBookmarksToFinishLoading]; bookmarks::BookmarkModel* bookmark_model = ios::BookmarkModelFactory::GetForBrowserState( chrome_test_util::GetOriginalBrowserState());
diff --git a/ios/chrome/browser/ui/signin_interaction/signin_interaction_controller_unity_egtest.mm b/ios/chrome/browser/ui/signin_interaction/signin_interaction_controller_unity_egtest.mm index 330c36e6..9a86ee69 100644 --- a/ios/chrome/browser/ui/signin_interaction/signin_interaction_controller_unity_egtest.mm +++ b/ios/chrome/browser/ui/signin_interaction/signin_interaction_controller_unity_egtest.mm
@@ -46,13 +46,6 @@ grey_sufficientlyVisible(), nil); } -// Returns a matcher for "ADD ACCOUNT" in IdentityChooserViewController. -id<GREYMatcher> addIdentityButtonInIdentityChooser() { - return chrome_test_util::ButtonWithAccessibilityLabel( - l10n_util::GetNSStringWithFixup( - IDS_IOS_ACCOUNT_UNIFIED_CONSENT_ADD_ACCOUNT)); -} - // Opens Accounts Settings and tap the sign out button. Assumes that the main // settings page is visible. void SignOutFromSettings() { @@ -93,8 +86,7 @@ [ChromeEarlGreyUI tapSettingsMenuButton:PrimarySignInButton()]; [[GREYUIThreadExecutor sharedInstance] drainUntilIdle]; // Tap on "ADD ACCOUNT". - [[EarlGrey selectElementWithMatcher:addIdentityButtonInIdentityChooser()] - performAction:grey_tap()]; + [SigninEarlGreyUI tapAddAccountButton]; // Check for the fake SSO screen. WaitForMatcher(grey_accessibilityID(kFakeAddAccountViewIdentifier)); // Close the SSO view controller.
diff --git a/ios/chrome/browser/ui/tab_grid/tab_grid_egtest.mm b/ios/chrome/browser/ui/tab_grid/tab_grid_egtest.mm index b52269b..a29923f 100644 --- a/ios/chrome/browser/ui/tab_grid/tab_grid_egtest.mm +++ b/ios/chrome/browser/ui/tab_grid/tab_grid_egtest.mm
@@ -9,7 +9,6 @@ #import "ios/chrome/browser/ui/tab_grid/tab_grid_egtest_util.h" #import "ios/chrome/test/earl_grey/chrome_earl_grey.h" #import "ios/chrome/test/earl_grey/chrome_earl_grey_ui.h" -#import "ios/chrome/test/earl_grey/chrome_error_util.h" #import "ios/chrome/test/earl_grey/chrome_matchers.h" #import "ios/chrome/test/earl_grey/chrome_test_case.h" #import "ios/web/public/test/http_server/http_server.h" @@ -143,17 +142,14 @@ } - (void)loadTestURLs { - CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:_URL1]); - CHROME_EG_ASSERT_NO_ERROR( - [ChromeEarlGrey waitForWebStateContainingText:kResponse1]); + [ChromeEarlGrey loadURL:_URL1]; + [ChromeEarlGrey waitForWebStateContainingText:kResponse1]; - CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:_URL2]); - CHROME_EG_ASSERT_NO_ERROR( - [ChromeEarlGrey waitForWebStateContainingText:kResponse2]); + [ChromeEarlGrey loadURL:_URL2]; + [ChromeEarlGrey waitForWebStateContainingText:kResponse2]; - CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:_URL3]); - CHROME_EG_ASSERT_NO_ERROR( - [ChromeEarlGrey waitForWebStateContainingText:kResponse3]); + [ChromeEarlGrey loadURL:_URL3]; + [ChromeEarlGrey waitForWebStateContainingText:kResponse3]; } // Test that Clear Browsing Data can be successfully done from tab grid.
diff --git a/ios/chrome/browser/ui/tab_grid/tab_grid_transition_egtest.mm b/ios/chrome/browser/ui/tab_grid/tab_grid_transition_egtest.mm index 4eb8228..a2bda7d5 100644 --- a/ios/chrome/browser/ui/tab_grid/tab_grid_transition_egtest.mm +++ b/ios/chrome/browser/ui/tab_grid/tab_grid_transition_egtest.mm
@@ -17,7 +17,6 @@ #import "ios/chrome/test/app/chrome_test_util.h" #import "ios/chrome/test/earl_grey/chrome_earl_grey.h" #import "ios/chrome/test/earl_grey/chrome_earl_grey_ui.h" -#import "ios/chrome/test/earl_grey/chrome_error_util.h" #import "ios/chrome/test/earl_grey/chrome_matchers.h" #import "ios/chrome/test/earl_grey/chrome_test_case.h" #include "net/test/embedded_test_server/http_request.h" @@ -194,16 +193,15 @@ [self setUpTestServer]; // Load a test URL in the current tab. - CHROME_EG_ASSERT_NO_ERROR( - [ChromeEarlGrey loadURL:[self makeURLForTitle:tab1_title]]); + [ChromeEarlGrey loadURL:[self makeURLForTitle:tab1_title]]; // Enter and leave the switcher. ShowTabSwitcher(); ShowTabViewController(); // Verify that the original tab is visible again. - CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey - waitForWebStateContainingText:base::SysNSStringToUTF8(tab1_title)]); + [ChromeEarlGrey + waitForWebStateContainingText:base::SysNSStringToUTF8(tab1_title)]; } // Tests exiting the switcher by tapping the new tab button or selecting new tab @@ -218,10 +216,9 @@ [[EarlGrey selectElementWithMatcher:matcher] performAction:grey_tap()]; // Load a URL in this newly-created tab and verify that the tab is visible. - CHROME_EG_ASSERT_NO_ERROR( - [ChromeEarlGrey loadURL:[self makeURLForTitle:tab1_title]]); - CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey - waitForWebStateContainingText:base::SysNSStringToUTF8(tab1_title)]); + [ChromeEarlGrey loadURL:[self makeURLForTitle:tab1_title]]; + [ChromeEarlGrey + waitForWebStateContainingText:base::SysNSStringToUTF8(tab1_title)]; } // Tests exiting the switcher by tapping the new incognito tab button or @@ -240,10 +237,9 @@ [[EarlGrey selectElementWithMatcher:matcher] performAction:grey_tap()]; // Load a URL in this newly-created tab and verify that the tab is visible. - CHROME_EG_ASSERT_NO_ERROR( - [ChromeEarlGrey loadURL:[self makeURLForTitle:tab1_title]]); - CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey - waitForWebStateContainingText:base::SysNSStringToUTF8(tab1_title)]); + [ChromeEarlGrey loadURL:[self makeURLForTitle:tab1_title]]; + [ChromeEarlGrey + waitForWebStateContainingText:base::SysNSStringToUTF8(tab1_title)]; } // Tests exiting the switcher by opening a new tab in the other tab model. @@ -260,10 +256,9 @@ performAction:grey_tap()]; // Load a URL in this newly-created tab and verify that the tab is visible. - CHROME_EG_ASSERT_NO_ERROR( - [ChromeEarlGrey loadURL:[self makeURLForTitle:incognito_title]]); - CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey - waitForWebStateContainingText:base::SysNSStringToUTF8(incognito_title)]); + [ChromeEarlGrey loadURL:[self makeURLForTitle:incognito_title]]; + [ChromeEarlGrey + waitForWebStateContainingText:base::SysNSStringToUTF8(incognito_title)]; // Go from incognito mode to normal mode. ShowTabSwitcher(); @@ -273,10 +268,9 @@ performAction:grey_tap()]; // Load a URL in this newly-created tab and verify that the tab is visible. - CHROME_EG_ASSERT_NO_ERROR( - [ChromeEarlGrey loadURL:[self makeURLForTitle:normal_title]]); - CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey - waitForWebStateContainingText:base::SysNSStringToUTF8(normal_title)]); + [ChromeEarlGrey loadURL:[self makeURLForTitle:normal_title]]; + [ChromeEarlGrey + waitForWebStateContainingText:base::SysNSStringToUTF8(normal_title)]; } // Tests exiting the tab switcher by selecting a normal tab. @@ -287,24 +281,21 @@ [self setUpTestServer]; // Create a few tabs and give them all unique titles. - CHROME_EG_ASSERT_NO_ERROR( - [ChromeEarlGrey loadURL:[self makeURLForTitle:tab1_title]]); + [ChromeEarlGrey loadURL:[self makeURLForTitle:tab1_title]]; [ChromeEarlGreyUI openNewTab]; - CHROME_EG_ASSERT_NO_ERROR( - [ChromeEarlGrey loadURL:[self makeURLForTitle:tab2_title]]); + [ChromeEarlGrey loadURL:[self makeURLForTitle:tab2_title]]; [ChromeEarlGreyUI openNewTab]; - CHROME_EG_ASSERT_NO_ERROR( - [ChromeEarlGrey loadURL:[self makeURLForTitle:tab3_title]]); + [ChromeEarlGrey loadURL:[self makeURLForTitle:tab3_title]]; ShowTabSwitcher(); SelectTab(tab1_title); - CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey - waitForWebStateContainingText:base::SysNSStringToUTF8(tab1_title)]); + [ChromeEarlGrey + waitForWebStateContainingText:base::SysNSStringToUTF8(tab1_title)]; ShowTabSwitcher(); SelectTab(tab3_title); - CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey - waitForWebStateContainingText:base::SysNSStringToUTF8(tab3_title)]); + [ChromeEarlGrey + waitForWebStateContainingText:base::SysNSStringToUTF8(tab3_title)]; } // Tests exiting the tab switcher by selecting an incognito tab. @@ -316,25 +307,22 @@ // Create a few tabs and give them all unique titles. [ChromeEarlGreyUI openNewIncognitoTab]; - CHROME_EG_ASSERT_NO_ERROR( - [ChromeEarlGrey loadURL:[self makeURLForTitle:tab1_title]]); + [ChromeEarlGrey loadURL:[self makeURLForTitle:tab1_title]]; [ChromeEarlGreyUI openNewIncognitoTab]; - CHROME_EG_ASSERT_NO_ERROR( - [ChromeEarlGrey loadURL:[self makeURLForTitle:tab2_title]]); + [ChromeEarlGrey loadURL:[self makeURLForTitle:tab2_title]]; [ChromeEarlGreyUI openNewIncognitoTab]; - CHROME_EG_ASSERT_NO_ERROR( - [ChromeEarlGrey loadURL:[self makeURLForTitle:tab3_title]]); + [ChromeEarlGrey loadURL:[self makeURLForTitle:tab3_title]]; [GetNormalTabModel() closeAllTabs]; ShowTabSwitcher(); SelectTab(tab1_title); - CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey - waitForWebStateContainingText:base::SysNSStringToUTF8(tab1_title)]); + [ChromeEarlGrey + waitForWebStateContainingText:base::SysNSStringToUTF8(tab1_title)]; ShowTabSwitcher(); SelectTab(tab3_title); - CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey - waitForWebStateContainingText:base::SysNSStringToUTF8(tab3_title)]); + [ChromeEarlGrey + waitForWebStateContainingText:base::SysNSStringToUTF8(tab3_title)]; } // Tests exiting the tab switcher by selecting a tab in the other tab model. @@ -344,19 +332,17 @@ [self setUpTestServer]; // Create a few tabs and give them all unique titles. - CHROME_EG_ASSERT_NO_ERROR( - [ChromeEarlGrey loadURL:[self makeURLForTitle:normal_title]]); + [ChromeEarlGrey loadURL:[self makeURLForTitle:normal_title]]; [ChromeEarlGreyUI openNewIncognitoTab]; - CHROME_EG_ASSERT_NO_ERROR( - [ChromeEarlGrey loadURL:[self makeURLForTitle:incognito_title]]); + [ChromeEarlGrey loadURL:[self makeURLForTitle:incognito_title]]; ShowTabSwitcher(); // Switch to the normal panel and select the one tab that is there. [[EarlGrey selectElementWithMatcher:TabGridOpenTabsPanelButton()] performAction:grey_tap()]; SelectTab(normal_title); - CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey - waitForWebStateContainingText:base::SysNSStringToUTF8(normal_title)]); + [ChromeEarlGrey + waitForWebStateContainingText:base::SysNSStringToUTF8(normal_title)]; ShowTabSwitcher(); // Switch to the incognito panel and select the one tab that is there. @@ -364,8 +350,8 @@ performAction:grey_tap()]; SelectTab(incognito_title); - CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey - waitForWebStateContainingText:base::SysNSStringToUTF8(incognito_title)]); + [ChromeEarlGrey + waitForWebStateContainingText:base::SysNSStringToUTF8(incognito_title)]; } // Tests switching back and forth between the normal and incognito BVCs. @@ -390,32 +376,31 @@ - (void)testRotationsWhileSwitcherIsNotActive { NSString* tab_title = @"NormalTabLongerStringForRotationTest"; [self setUpTestServer]; - CHROME_EG_ASSERT_NO_ERROR( - [ChromeEarlGrey loadURL:[self makeURLForTitle:tab_title]]); + [ChromeEarlGrey loadURL:[self makeURLForTitle:tab_title]]; // Show the tab switcher and return to the BVC, in portrait. [EarlGrey rotateDeviceToOrientation:UIDeviceOrientationPortrait errorOrNil:nil]; ShowTabSwitcher(); SelectTab(tab_title); - CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey - waitForWebStateContainingText:base::SysNSStringToUTF8(tab_title)]); + [ChromeEarlGrey + waitForWebStateContainingText:base::SysNSStringToUTF8(tab_title)]; // Show the tab switcher and return to the BVC, in landscape. [EarlGrey rotateDeviceToOrientation:UIDeviceOrientationLandscapeLeft errorOrNil:nil]; ShowTabSwitcher(); SelectTab(tab_title); - CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey - waitForWebStateContainingText:base::SysNSStringToUTF8(tab_title)]); + [ChromeEarlGrey + waitForWebStateContainingText:base::SysNSStringToUTF8(tab_title)]; // Show the tab switcher and return to the BVC, in portrait. [EarlGrey rotateDeviceToOrientation:UIDeviceOrientationPortrait errorOrNil:nil]; ShowTabSwitcher(); SelectTab(tab_title); - CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey - waitForWebStateContainingText:base::SysNSStringToUTF8(tab_title)]); + [ChromeEarlGrey + waitForWebStateContainingText:base::SysNSStringToUTF8(tab_title)]; } @end
diff --git a/ios/chrome/browser/ui/tabs/tab_strip_egtest.mm b/ios/chrome/browser/ui/tabs/tab_strip_egtest.mm index be6c834c..29cc008 100644 --- a/ios/chrome/browser/ui/tabs/tab_strip_egtest.mm +++ b/ios/chrome/browser/ui/tabs/tab_strip_egtest.mm
@@ -13,7 +13,6 @@ #import "ios/chrome/test/app/tab_test_util.h" #import "ios/chrome/test/earl_grey/chrome_earl_grey.h" #import "ios/chrome/test/earl_grey/chrome_earl_grey_ui.h" -#import "ios/chrome/test/earl_grey/chrome_error_util.h" #import "ios/chrome/test/earl_grey/chrome_test_case.h" #include "ui/base/l10n/l10n_util.h" @@ -45,9 +44,9 @@ // case. const int kNumberOfTabs = 3; [ChromeEarlGreyUI openNewTab]; - CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:GURL("chrome://about")]); + [ChromeEarlGrey loadURL:GURL("chrome://about")]; [ChromeEarlGreyUI openNewTab]; - CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:GURL("chrome://version")]); + [ChromeEarlGrey loadURL:GURL("chrome://version")]; // Note that the tab ordering wraps. E.g. if A, B, and C are open, // and C is the current tab, the 'next' tab is 'A'.
diff --git a/ios/chrome/test/earl_grey/chrome_matchers.h b/ios/chrome/test/earl_grey/chrome_matchers.h index 7854b58..853ca8c 100644 --- a/ios/chrome/test/earl_grey/chrome_matchers.h +++ b/ios/chrome/test/earl_grey/chrome_matchers.h
@@ -128,6 +128,9 @@ // Returns matcher for the account consistency confirmation button. id<GREYMatcher> AccountConsistencyConfirmationOkButton(); +// Returns matcher for "ADD ACCOUNT" button in unified consent dialog. +id<GREYMatcher> UnifiedConsentAddAccountButton(); + // Returns matcher for the add account accounts button. id<GREYMatcher> AddAccountButton();
diff --git a/ios/chrome/test/earl_grey/chrome_matchers.mm b/ios/chrome/test/earl_grey/chrome_matchers.mm index a07b9097..7fd791c 100644 --- a/ios/chrome/test/earl_grey/chrome_matchers.mm +++ b/ios/chrome/test/earl_grey/chrome_matchers.mm
@@ -165,6 +165,10 @@ return [ChromeMatchersAppInterface accountConsistencyConfirmationOKButton]; } +id<GREYMatcher> UnifiedConsentAddAccountButton() { + return [ChromeMatchersAppInterface unifiedConsentAddAccountButton]; +} + id<GREYMatcher> AddAccountButton() { return [ChromeMatchersAppInterface addAccountButton]; }
diff --git a/ios/chrome/test/earl_grey/chrome_matchers_app_interface.h b/ios/chrome/test/earl_grey/chrome_matchers_app_interface.h index 08ef23d..34b1a213 100644 --- a/ios/chrome/test/earl_grey/chrome_matchers_app_interface.h +++ b/ios/chrome/test/earl_grey/chrome_matchers_app_interface.h
@@ -129,6 +129,9 @@ // Returns matcher for the account consistency confirmation button. + (id<GREYMatcher>)accountConsistencyConfirmationOKButton; +// Returns matcher for "ADD ACCOUNT" button in unified consent dialog. ++ (id<GREYMatcher>)unifiedConsentAddAccountButton; + // Returns matcher for the add account accounts button. + (id<GREYMatcher>)addAccountButton;
diff --git a/ios/chrome/test/earl_grey/chrome_matchers_app_interface.mm b/ios/chrome/test/earl_grey/chrome_matchers_app_interface.mm index 5cf17bd..56025be 100644 --- a/ios/chrome/test/earl_grey/chrome_matchers_app_interface.mm +++ b/ios/chrome/test/earl_grey/chrome_matchers_app_interface.mm
@@ -355,6 +355,12 @@ return [ChromeMatchersAppInterface buttonWithAccessibilityLabelID:(labelID)]; } ++ (id<GREYMatcher>)unifiedConsentAddAccountButton { + return [ChromeMatchersAppInterface + buttonWithAccessibilityLabelID: + (IDS_IOS_ACCOUNT_UNIFIED_CONSENT_ADD_ACCOUNT)]; +} + + (id<GREYMatcher>)addAccountButton { return grey_accessibilityID(kSettingsAccountsTableViewAddAccountCellId); }
diff --git a/ios/chrome/test/earl_grey/device_check_egtest.mm b/ios/chrome/test/earl_grey/device_check_egtest.mm index 9b7ece8..c7ffffe 100644 --- a/ios/chrome/test/earl_grey/device_check_egtest.mm +++ b/ios/chrome/test/earl_grey/device_check_egtest.mm
@@ -6,7 +6,6 @@ #import <XCTest/XCTest.h> #import "ios/chrome/test/earl_grey/chrome_earl_grey.h" -#import "ios/chrome/test/earl_grey/chrome_error_util.h" #import "ios/chrome/test/earl_grey/chrome_test_case.h" #include "url/gurl.h" @@ -22,10 +21,8 @@ // Verifies Internet connectivity by navigating to browsingtest.appspot.com. - (void)testNetworkConnection { - CHROME_EG_ASSERT_NO_ERROR( - [ChromeEarlGrey loadURL:GURL("http://browsingtest.appspot.com")]); - CHROME_EG_ASSERT_NO_ERROR( - [ChromeEarlGrey waitForWebStateContainingText:"Window1"]); + [ChromeEarlGrey loadURL:GURL("http://browsingtest.appspot.com")]; + [ChromeEarlGrey waitForWebStateContainingText:"Window1"]; } @end
diff --git a/ios/showcase/infobars/OWNERS b/ios/showcase/infobars/OWNERS new file mode 100644 index 0000000..b215c963 --- /dev/null +++ b/ios/showcase/infobars/OWNERS
@@ -0,0 +1,4 @@ +sczs@chromium.org + +# TEAM: ios-directory-owners@chromium.org +# OS: iOS
diff --git a/ios/web/web_state/ui/crw_wk_script_message_router.mm b/ios/web/web_state/ui/crw_wk_script_message_router.mm index b462a43a..d501501 100644 --- a/ios/web/web_state/ui/crw_wk_script_message_router.mm +++ b/ios/web/web_state/ui/crw_wk_script_message_router.mm
@@ -21,9 +21,11 @@ @end @implementation CRWWKScriptMessageRouter { - // Two level map of registed message handlers. Keys are message names and - // values are more maps (where keys are web views and values are handlers). - NSMutableDictionary* _handlers; + // Two level map of registed message handlers: + // {MessageName => {WKWebView => MessageCallbacks}}. + NSMutableDictionary<NSString*, + NSMapTable<WKWebView*, void (^)(WKScriptMessage*)>*>* + _handlers; // Wrapped WKUserContentController. WKUserContentController* _userContentController; }
diff --git a/ipc/ipc_channel_mojo_unittest.cc b/ipc/ipc_channel_mojo_unittest.cc index 7b96387..387efad4 100644 --- a/ipc/ipc_channel_mojo_unittest.cc +++ b/ipc/ipc_channel_mojo_unittest.cc
@@ -21,7 +21,6 @@ #include "base/memory/platform_shared_memory_region.h" #include "base/memory/shared_memory.h" #include "base/memory/shared_memory_mapping.h" -#include "base/message_loop/message_loop.h" #include "base/optional.h" #include "base/path_service.h" #include "base/pickle.h" @@ -30,6 +29,7 @@ #include "base/strings/stringprintf.h" #include "base/synchronization/waitable_event.h" #include "base/test/bind_test_util.h" +#include "base/test/scoped_task_environment.h" #include "base/test/test_io_thread.h" #include "base/test/test_shared_memory_util.h" #include "base/test/test_timeouts.h" @@ -948,7 +948,7 @@ IPC::ChannelProxy* proxy() { return runner_->proxy(); } private: - base::MessageLoop message_loop_; + base::test::ScopedTaskEnvironment scoped_task_environment_; std::unique_ptr<ChannelProxyRunner> runner_; };
diff --git a/ipc/ipc_cpu_perftest.cc b/ipc/ipc_cpu_perftest.cc index 2564d08..4c5d22c 100644 --- a/ipc/ipc_cpu_perftest.cc +++ b/ipc/ipc_cpu_perftest.cc
@@ -5,12 +5,12 @@ #include <memory> #include "base/bind.h" -#include "base/message_loop/message_loop.h" #include "base/process/process_metrics.h" #include "base/run_loop.h" #include "base/strings/stringprintf.h" #include "base/synchronization/waitable_event.h" #include "base/test/perf_log.h" +#include "base/test/scoped_task_environment.h" #include "base/timer/timer.h" #include "ipc/ipc_channel_proxy.h" #include "ipc/ipc_perftest_messages.h" @@ -394,7 +394,7 @@ }; DEFINE_TEST_CLIENT_WITH_PIPE(PingPongClient, MojoSteadyPingPongTest, h) { - base::MessageLoop main_message_loop; + base::test::ScopedTaskEnvironment scoped_task_environment; return RunPingPongClient(h); } @@ -402,14 +402,14 @@ // instead of raw IPC::Messages. TEST_F(MojoSteadyPingPongTest, AsyncPingPong) { RunTestClient("PingPongClient", [&](MojoHandle h) { - base::MessageLoop main_message_loop; + base::test::ScopedTaskEnvironment scoped_task_environment; RunPingPongServer(h, "Mojo_CPU_Async", false); }); } TEST_F(MojoSteadyPingPongTest, SyncPingPong) { RunTestClient("PingPongClient", [&](MojoHandle h) { - base::MessageLoop main_message_loop; + base::test::ScopedTaskEnvironment scoped_task_environment; RunPingPongServer(h, "Mojo_CPU_Sync", true); }); }
diff --git a/ipc/ipc_mojo_bootstrap_unittest.cc b/ipc/ipc_mojo_bootstrap_unittest.cc index 7772896..12e6c1d 100644 --- a/ipc/ipc_mojo_bootstrap_unittest.cc +++ b/ipc/ipc_mojo_bootstrap_unittest.cc
@@ -8,8 +8,8 @@ #include <memory> #include <utility> -#include "base/message_loop/message_loop.h" #include "base/run_loop.h" +#include "base/test/scoped_task_environment.h" #include "base/threading/thread_task_runner_handle.h" #include "ipc/ipc.mojom.h" #include "ipc/ipc_test_base.h" @@ -107,7 +107,7 @@ }; TEST_F(IPCMojoBootstrapTest, Connect) { - base::MessageLoop message_loop; + base::test::ScopedTaskEnvironment scoped_task_environment; Connection connection( IPC::MojoBootstrap::Create( helper_.StartChild("IPCMojoBootstrapTestClient"), @@ -132,7 +132,7 @@ MULTIPROCESS_TEST_MAIN_WITH_SETUP( IPCMojoBootstrapTestClientTestChildMain, ::mojo::core::test::MultiprocessTestHelper::ChildSetup) { - base::MessageLoop message_loop; + base::test::ScopedTaskEnvironment scoped_task_environment; Connection connection( IPC::MojoBootstrap::Create( std::move(mojo::core::test::MultiprocessTestHelper::primordial_pipe), @@ -153,7 +153,7 @@ } TEST_F(IPCMojoBootstrapTest, ReceiveEmptyMessage) { - base::MessageLoop message_loop; + base::test::ScopedTaskEnvironment scoped_task_environment; Connection connection( IPC::MojoBootstrap::Create( helper_.StartChild("IPCMojoBootstrapTestEmptyMessage"), @@ -180,7 +180,7 @@ MULTIPROCESS_TEST_MAIN_WITH_SETUP( IPCMojoBootstrapTestEmptyMessageTestChildMain, ::mojo::core::test::MultiprocessTestHelper::ChildSetup) { - base::MessageLoop message_loop; + base::test::ScopedTaskEnvironment scoped_task_environment; Connection connection( IPC::MojoBootstrap::Create( std::move(mojo::core::test::MultiprocessTestHelper::primordial_pipe),
diff --git a/ipc/ipc_mojo_perftest.cc b/ipc/ipc_mojo_perftest.cc index 6a62073..e1f2a4a 100644 --- a/ipc/ipc_mojo_perftest.cc +++ b/ipc/ipc_mojo_perftest.cc
@@ -7,12 +7,12 @@ #include "base/bind.h" #include "base/memory/ptr_util.h" -#include "base/message_loop/message_loop.h" #include "base/process/process_metrics.h" #include "base/run_loop.h" #include "base/strings/stringprintf.h" #include "base/synchronization/waitable_event.h" #include "base/test/perf_time_logger.h" +#include "base/test/scoped_task_environment.h" #include "base/threading/thread.h" #include "base/threading/thread_task_runner_handle.h" #include "build/build_config.h" @@ -536,7 +536,7 @@ DEFINE_TEST_CLIENT_WITH_PIPE(InterfacePassingClient, MojoInterfacePassingPerfTest, h) { - base::MessageLoop main_message_loop; + base::test::ScopedTaskEnvironment scoped_task_environment; return RunInterfacePassingClient(h); } @@ -571,7 +571,7 @@ InProcessPerfTest<MojoInterfacePassingPerfTest>; DEFINE_TEST_CLIENT_WITH_PIPE(PingPongClient, MojoInterfacePerfTest, h) { - base::MessageLoop main_message_loop; + base::test::ScopedTaskEnvironment scoped_task_environment; return RunPingPongClient(h); } @@ -579,7 +579,7 @@ // raw IPC::Messages. TEST_F(MojoInterfacePerfTest, MultiprocessPingPong) { RunTestClient("PingPongClient", [&](MojoHandle h) { - base::MessageLoop main_message_loop; + base::test::ScopedTaskEnvironment scoped_task_environment; RunPingPongServer(h, "Multiprocess"); }); } @@ -587,21 +587,21 @@ TEST_F(MojoInterfacePerfTest, MultiprocessSyncPing) { sync_ = true; RunTestClient("PingPongClient", [&](MojoHandle h) { - base::MessageLoop main_message_loop; + base::test::ScopedTaskEnvironment scoped_task_environment; RunPingPongServer(h, "MultiprocessSync"); }); } TEST_F(MojoInterfacePassingPerfTest, MultiprocessInterfacePassing) { RunTestClient("InterfacePassingClient", [&](MojoHandle h) { - base::MessageLoop main_message_loop; + base::test::ScopedTaskEnvironment scoped_task_environment; RunInterfacePassingServer(h, "InterfacePassing", false /* associated */); }); } TEST_F(MojoInterfacePassingPerfTest, MultiprocessAssociatedInterfacePassing) { RunTestClient("InterfacePassingClient", [&](MojoHandle h) { - base::MessageLoop main_message_loop; + base::test::ScopedTaskEnvironment scoped_task_environment; RunInterfacePassingServer(h, "AssociatedInterfacePassing", true /* associated*/); }); @@ -618,7 +618,7 @@ FROM_HERE, base::BindOnce(base::IgnoreResult(&RunPingPongClient), client_handle)); - base::MessageLoop main_message_loop; + base::test::ScopedTaskEnvironment scoped_task_environment; RunPingPongServer(server_handle, "SingleProcess"); } @@ -626,7 +626,7 @@ MojoHandle server_handle, client_handle; CreateMessagePipe(&server_handle, &client_handle); - base::MessageLoop main_message_loop; + base::test::ScopedTaskEnvironment scoped_task_environment; mojo::MessagePipeHandle mp_handle(client_handle); mojo::ScopedMessagePipeHandle scoped_mp(mp_handle); LockThreadAffinity thread_locker(kSharedCore); @@ -650,7 +650,7 @@ FROM_HERE, base::BindOnce(base::IgnoreResult(&RunInterfacePassingClient), client_handle)); - base::MessageLoop main_message_loop; + base::test::ScopedTaskEnvironment scoped_task_environment; RunInterfacePassingServer(server_handle, "SingleProcess", false /* associated */); } @@ -666,7 +666,7 @@ FROM_HERE, base::BindOnce(base::IgnoreResult(&RunInterfacePassingClient), client_handle)); - base::MessageLoop main_message_loop; + base::test::ScopedTaskEnvironment scoped_task_environment; RunInterfacePassingServer(server_handle, "SingleProcess", true /* associated */); } @@ -675,7 +675,7 @@ MojoHandle server_handle, client_handle; CreateMessagePipe(&server_handle, &client_handle); - base::MessageLoop main_message_loop; + base::test::ScopedTaskEnvironment scoped_task_environment; mojo::MessagePipeHandle mp_handle(client_handle); mojo::ScopedMessagePipeHandle scoped_mp(mp_handle); LockThreadAffinity thread_locker(kSharedCore); @@ -690,7 +690,7 @@ MojoHandle server_handle, client_handle; CreateMessagePipe(&server_handle, &client_handle); - base::MessageLoop main_message_loop; + base::test::ScopedTaskEnvironment scoped_task_environment; mojo::MessagePipeHandle mp_handle(client_handle); mojo::ScopedMessagePipeHandle scoped_mp(mp_handle); LockThreadAffinity thread_locker(kSharedCore); @@ -729,7 +729,7 @@ } void Ping(const std::string& value) { - main_message_loop_.task_runner()->PostTask( + scoped_task_environment_.GetMainThreadTaskRunner()->PostTask( FROM_HERE, base::BindOnce(&CallbackPerfTest::OnPong, base::Unretained(this), value)); } @@ -836,7 +836,7 @@ private: base::Thread client_thread_; - base::MessageLoop main_message_loop_; + base::test::ScopedTaskEnvironment scoped_task_environment_; int message_count_; int count_down_; std::string payload_;
diff --git a/ipc/ipc_sync_channel_unittest.cc b/ipc/ipc_sync_channel_unittest.cc index eb73065c..f9804dd0 100644 --- a/ipc/ipc_sync_channel_unittest.cc +++ b/ipc/ipc_sync_channel_unittest.cc
@@ -15,12 +15,12 @@ #include "base/location.h" #include "base/logging.h" #include "base/macros.h" -#include "base/message_loop/message_loop.h" #include "base/process/process_handle.h" #include "base/run_loop.h" #include "base/single_thread_task_runner.h" #include "base/strings/string_util.h" #include "base/synchronization/waitable_event.h" +#include "base/test/scoped_task_environment.h" #include "base/threading/platform_thread.h" #include "base/threading/thread.h" #include "base/threading/thread_task_runner_handle.h" @@ -290,7 +290,7 @@ class IPCSyncChannelTest : public testing::Test { private: - base::MessageLoop message_loop_; + base::test::ScopedTaskEnvironment scoped_task_environment_; }; //------------------------------------------------------------------------------
diff --git a/jingle/notifier/base/gaia_token_pre_xmpp_auth.cc b/jingle/notifier/base/gaia_token_pre_xmpp_auth.cc index d5f274a6..50567d6 100644 --- a/jingle/notifier/base/gaia_token_pre_xmpp_auth.cc +++ b/jingle/notifier/base/gaia_token_pre_xmpp_auth.cc
@@ -101,8 +101,8 @@ std::string GaiaTokenPreXmppAuth::ChooseBestSaslMechanism( const std::vector<std::string> & mechanisms, bool encrypted) { - return base::ContainsValue(mechanisms, auth_mechanism_) ? auth_mechanism_ - : std::string(); + return base::Contains(mechanisms, auth_mechanism_) ? auth_mechanism_ + : std::string(); } jingle_xmpp::SaslMechanism* GaiaTokenPreXmppAuth::CreateSaslMechanism(
diff --git a/media/audio/audio_output_dispatcher_impl.cc b/media/audio/audio_output_dispatcher_impl.cc index ebe96ea..64f1c661 100644 --- a/media/audio/audio_output_dispatcher_impl.cc +++ b/media/audio/audio_output_dispatcher_impl.cc
@@ -88,7 +88,7 @@ double volume = 0; stream_proxy->GetVolume(&volume); physical_stream->SetVolume(volume); - DCHECK(base::ContainsKey(audio_logs_, physical_stream)); + DCHECK(base::Contains(audio_logs_, physical_stream)); AudioLog* const audio_log = audio_logs_[physical_stream].get(); audio_log->OnSetVolume(volume); physical_stream->Start(callback); @@ -115,7 +115,7 @@ if (it != proxy_to_physical_map_.end()) { AudioOutputStream* physical_stream = it->second; physical_stream->SetVolume(volume); - DCHECK(base::ContainsKey(audio_logs_, physical_stream)); + DCHECK(base::Contains(audio_logs_, physical_stream)); audio_logs_[physical_stream]->OnSetVolume(volume); } } @@ -188,7 +188,7 @@ void AudioOutputDispatcherImpl::StopPhysicalStream(AudioOutputStream* stream) { DCHECK(audio_manager()->GetTaskRunner()->BelongsToCurrentThread()); stream->Stop(); - DCHECK(base::ContainsKey(audio_logs_, stream)); + DCHECK(base::Contains(audio_logs_, stream)); audio_logs_[stream]->OnStopped(); idle_streams_.push_back(stream); close_timer_.Reset();
diff --git a/media/base/fake_audio_worker_unittest.cc b/media/base/fake_audio_worker_unittest.cc index df0363d6..3872434 100644 --- a/media/base/fake_audio_worker_unittest.cc +++ b/media/base/fake_audio_worker_unittest.cc
@@ -5,9 +5,9 @@ #include "media/base/fake_audio_worker.h" #include "base/bind.h" #include "base/macros.h" -#include "base/message_loop/message_loop.h" #include "base/run_loop.h" #include "base/single_thread_task_runner.h" +#include "base/test/scoped_task_environment.h" #include "base/time/time.h" #include "build/build_config.h" #include "media/base/audio_parameters.h" @@ -20,11 +20,9 @@ class FakeAudioWorkerTest : public testing::Test { public: FakeAudioWorkerTest() - : params_(AudioParameters::AUDIO_FAKE, - CHANNEL_LAYOUT_STEREO, - 44100, - 128), - fake_worker_(message_loop_.task_runner(), params_), + : params_(AudioParameters::AUDIO_FAKE, CHANNEL_LAYOUT_STEREO, 44100, 128), + fake_worker_(scoped_task_environment_.GetMainThreadTaskRunner(), + params_), seen_callbacks_(0) { time_between_callbacks_ = base::TimeDelta::FromMicroseconds( params_.frames_per_buffer() * base::Time::kMicrosecondsPerSecond / @@ -38,29 +36,33 @@ } void RunOnAudioThread() { - ASSERT_TRUE(message_loop_.task_runner()->BelongsToCurrentThread()); + ASSERT_TRUE(scoped_task_environment_.GetMainThreadTaskRunner() + ->BelongsToCurrentThread()); fake_worker_.Start(base::BindRepeating( &FakeAudioWorkerTest::CalledByFakeWorker, base::Unretained(this))); } void RunOnceOnAudioThread() { - ASSERT_TRUE(message_loop_.task_runner()->BelongsToCurrentThread()); + ASSERT_TRUE(scoped_task_environment_.GetMainThreadTaskRunner() + ->BelongsToCurrentThread()); RunOnAudioThread(); // Start() should immediately post a task to run the callback, so we // should end up with only a single callback being run. - message_loop_.task_runner()->PostTask( + scoped_task_environment_.GetMainThreadTaskRunner()->PostTask( FROM_HERE, base::BindOnce(&FakeAudioWorkerTest::EndTest, base::Unretained(this), 1)); } void StopStartOnAudioThread() { - ASSERT_TRUE(message_loop_.task_runner()->BelongsToCurrentThread()); + ASSERT_TRUE(scoped_task_environment_.GetMainThreadTaskRunner() + ->BelongsToCurrentThread()); fake_worker_.Stop(); RunOnAudioThread(); } void TimeCallbacksOnAudioThread(int callbacks) { - ASSERT_TRUE(message_loop_.task_runner()->BelongsToCurrentThread()); + ASSERT_TRUE(scoped_task_environment_.GetMainThreadTaskRunner() + ->BelongsToCurrentThread()); if (seen_callbacks_ == 0) { RunOnAudioThread(); @@ -69,7 +71,7 @@ // Keep going until we've seen the requested number of callbacks. if (seen_callbacks_ < callbacks) { - message_loop_.task_runner()->PostDelayedTask( + scoped_task_environment_.GetMainThreadTaskRunner()->PostDelayedTask( FROM_HERE, base::BindOnce(&FakeAudioWorkerTest::TimeCallbacksOnAudioThread, base::Unretained(this), callbacks), @@ -81,14 +83,15 @@ } void EndTest(int callbacks) { - ASSERT_TRUE(message_loop_.task_runner()->BelongsToCurrentThread()); + ASSERT_TRUE(scoped_task_environment_.GetMainThreadTaskRunner() + ->BelongsToCurrentThread()); fake_worker_.Stop(); EXPECT_LE(callbacks, seen_callbacks_); run_loop_.QuitWhenIdle(); } protected: - base::MessageLoop message_loop_; + base::test::ScopedTaskEnvironment scoped_task_environment_; base::RunLoop run_loop_; AudioParameters params_; FakeAudioWorker fake_worker_; @@ -109,7 +112,7 @@ #define MAYBE_FakeBasicCallback FakeBasicCallback #endif TEST_F(FakeAudioWorkerTest, MAYBE_FakeBasicCallback) { - message_loop_.task_runner()->PostTask( + scoped_task_environment_.GetMainThreadTaskRunner()->PostTask( FROM_HERE, base::BindOnce(&FakeAudioWorkerTest::RunOnceOnAudioThread, base::Unretained(this))); run_loop_.Run(); @@ -120,7 +123,7 @@ // TODO(https://crbug.com/960729): Test is flaky because its behavior depends on // real wallclock time. Need to mock time to fix this. TEST_F(FakeAudioWorkerTest, DISABLED_TimeBetweenCallbacks) { - message_loop_.task_runner()->PostTask( + scoped_task_environment_.GetMainThreadTaskRunner()->PostTask( FROM_HERE, base::BindOnce(&FakeAudioWorkerTest::TimeCallbacksOnAudioThread, base::Unretained(this), kTestCallbacks)); @@ -143,14 +146,14 @@ // Ensure Start()/Stop() on the worker doesn't generate too many callbacks. See // http://crbug.com/159049. TEST_F(FakeAudioWorkerTest, StartStopClearsCallbacks) { - message_loop_.task_runner()->PostTask( + scoped_task_environment_.GetMainThreadTaskRunner()->PostTask( FROM_HERE, base::BindOnce(&FakeAudioWorkerTest::TimeCallbacksOnAudioThread, base::Unretained(this), kTestCallbacks)); // Issue a Stop() / Start() in between expected callbacks to maximize the // chance of catching the worker doing the wrong thing. - message_loop_.task_runner()->PostDelayedTask( + scoped_task_environment_.GetMainThreadTaskRunner()->PostDelayedTask( FROM_HERE, base::BindOnce(&FakeAudioWorkerTest::StopStartOnAudioThread, base::Unretained(this)),
diff --git a/media/blink/cdm_session_adapter.cc b/media/blink/cdm_session_adapter.cc index d4872f2a..84447bcd 100644 --- a/media/blink/cdm_session_adapter.cc +++ b/media/blink/cdm_session_adapter.cc
@@ -87,7 +87,7 @@ const std::string& session_id, base::WeakPtr<WebContentDecryptionModuleSessionImpl> session) { // If this session ID is already registered, don't register it again. - if (base::ContainsKey(sessions_, session_id)) + if (base::Contains(sessions_, session_id)) return false; sessions_[session_id] = session; @@ -95,7 +95,7 @@ } void CdmSessionAdapter::UnregisterSession(const std::string& session_id) { - DCHECK(base::ContainsKey(sessions_, session_id)); + DCHECK(base::Contains(sessions_, session_id)); sessions_.erase(session_id); }
diff --git a/media/blink/new_session_cdm_result_promise.cc b/media/blink/new_session_cdm_result_promise.cc index e8c2300..5a4441c 100644 --- a/media/blink/new_session_cdm_result_promise.cc +++ b/media/blink/new_session_cdm_result_promise.cc
@@ -75,7 +75,7 @@ SessionInitStatus status = SessionInitStatus::UNKNOWN_STATUS; new_session_created_cb_.Run(session_id, &status); - if (!base::ContainsValue(expected_statuses_, status)) { + if (!base::Contains(expected_statuses_, status)) { reject(Exception::INVALID_STATE_ERROR, 0, "Cannot finish session initialization"); return;
diff --git a/media/blink/video_decode_stats_reporter_unittest.cc b/media/blink/video_decode_stats_reporter_unittest.cc index bc41f4c..29de734 100644 --- a/media/blink/video_decode_stats_reporter_unittest.cc +++ b/media/blink/video_decode_stats_reporter_unittest.cc
@@ -11,6 +11,7 @@ #include "base/optional.h" #include "base/single_thread_task_runner.h" #include "base/test/test_mock_time_task_runner.h" +#include "base/threading/thread_task_runner_handle.h" #include "base/time/time.h" #include "media/base/cdm_config.h" #include "media/base/media_util.h" @@ -108,7 +109,7 @@ void SetUp() override { // Do this first. Lots of pieces depend on the task runner. auto message_loop = base::MessageLoopCurrent::Get(); - original_task_runner_ = message_loop.task_runner(); + original_task_runner_ = base::ThreadTaskRunnerHandle::Get(); task_runner_ = new base::TestMockTimeTaskRunner(); message_loop.SetTaskRunner(task_runner_);
diff --git a/media/blink/watch_time_reporter_unittest.cc b/media/blink/watch_time_reporter_unittest.cc index 2c99e30..d7173d2 100644 --- a/media/blink/watch_time_reporter_unittest.cc +++ b/media/blink/watch_time_reporter_unittest.cc
@@ -10,6 +10,7 @@ #include "base/run_loop.h" #include "base/single_thread_task_runner.h" #include "base/test/test_mock_time_task_runner.h" +#include "base/threading/thread_task_runner_handle.h" #include "media/base/mock_media_log.h" #include "media/base/watch_time_keys.h" #include "media/blink/watch_time_reporter.h" @@ -258,7 +259,7 @@ fake_metrics_provider_(this) { // Do this first. Lots of pieces depend on the task runner. auto message_loop = base::MessageLoopCurrent::Get(); - original_task_runner_ = message_loop.task_runner(); + original_task_runner_ = base::ThreadTaskRunnerHandle::Get(); task_runner_ = new base::TestMockTimeTaskRunner(); message_loop.SetTaskRunner(task_runner_); }
diff --git a/media/capture/video/chromeos/request_manager.cc b/media/capture/video/chromeos/request_manager.cc index 3595473..4dc8634 100644 --- a/media/capture/video/chromeos/request_manager.cc +++ b/media/capture/video/chromeos/request_manager.cc
@@ -701,8 +701,8 @@ processing_buffer_ids_.erase(*pending_result.input_buffer_id); // If all reprocess tasks are done for this buffer, release the buffer. - if (!base::ContainsKey(buffer_id_reprocess_tasks_map_, - *pending_result.input_buffer_id)) { + if (!base::Contains(buffer_id_reprocess_tasks_map_, + *pending_result.input_buffer_id)) { stream_buffer_manager_->ReleaseBuffer( StreamType::kYUVOutput, *pending_result.input_buffer_id); }
diff --git a/media/capture/video/linux/OWNERS b/media/capture/video/linux/OWNERS index bf72e04..d46ea56 100644 --- a/media/capture/video/linux/OWNERS +++ b/media/capture/video/linux/OWNERS
@@ -1 +1,2 @@ -posciak@chromium.org +jcliang@chromium.org +shik@chromium.org
diff --git a/media/capture/video/linux/video_capture_device_factory_linux.cc b/media/capture/video/linux/video_capture_device_factory_linux.cc index e59b937b..aab89030 100644 --- a/media/capture/video/linux/video_capture_device_factory_linux.cc +++ b/media/capture/video/linux/video_capture_device_factory_linux.cc
@@ -264,7 +264,7 @@ v4l2_fmtdesc fmtdesc = {}; fmtdesc.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; for (; DoIoctl(fd, VIDIOC_ENUM_FMT, &fmtdesc) == 0; ++fmtdesc.index) { - if (base::ContainsValue(usable_fourccs, fmtdesc.pixelformat)) + if (base::Contains(usable_fourccs, fmtdesc.pixelformat)) return true; }
diff --git a/media/capture/video/video_capture_device_client.cc b/media/capture/video/video_capture_device_client.cc index 2ea5b30..daf7901 100644 --- a/media/capture/video/video_capture_device_client.cc +++ b/media/capture/video/video_capture_device_client.cc
@@ -479,7 +479,7 @@ DCHECK_NE(VideoCaptureBufferPool::kInvalidId, buffer_id); - if (!base::ContainsValue(buffer_ids_known_by_receiver_, buffer_id)) { + if (!base::Contains(buffer_ids_known_by_receiver_, buffer_id)) { media::mojom::VideoBufferHandlePtr buffer_handle = media::mojom::VideoBufferHandle::New(); switch (target_buffer_type_) {
diff --git a/media/capture/video/win/video_capture_device_factory_win.cc b/media/capture/video/win/video_capture_device_factory_win.cc index fdcd6a8..1570d4c 100644 --- a/media/capture/video/win/video_capture_device_factory_win.cc +++ b/media/capture/video/win/video_capture_device_factory_win.cc
@@ -111,7 +111,7 @@ bool IsDeviceBlacklistedForMediaFoundationByModelId( const std::string& model_id) { - return base::ContainsValue(kModelIdsBlacklistedForMediaFoundation, model_id); + return base::Contains(kModelIdsBlacklistedForMediaFoundation, model_id); } bool LoadMediaFoundationDlls() {
diff --git a/media/cast/sender/h264_vt_encoder_unittest.cc b/media/cast/sender/h264_vt_encoder_unittest.cc index 60e02b31..1156796 100644 --- a/media/cast/sender/h264_vt_encoder_unittest.cc +++ b/media/cast/sender/h264_vt_encoder_unittest.cc
@@ -9,11 +9,11 @@ #include "base/containers/queue.h" #include "base/macros.h" #include "base/memory/ref_counted.h" -#include "base/message_loop/message_loop.h" #include "base/power_monitor/power_monitor.h" #include "base/run_loop.h" #include "base/test/launcher/unit_test_launcher.h" #include "base/test/power_monitor_test_base.h" +#include "base/test/scoped_task_environment.h" #include "base/test/simple_test_tick_clock.h" #include "base/test/test_suite.h" #include "media/base/cdm_context.h" @@ -217,8 +217,9 @@ std::unique_ptr<TestPowerSource>(power_source_))); cast_environment_ = new CastEnvironment( - &clock_, message_loop_.task_runner(), message_loop_.task_runner(), - message_loop_.task_runner()); + &clock_, scoped_task_environment_.GetMainThreadTaskRunner(), + scoped_task_environment_.GetMainThreadTaskRunner(), + scoped_task_environment_.GetMainThreadTaskRunner()); encoder_.reset(new H264VideoToolboxEncoder( cast_environment_, video_sender_config_, base::Bind(&SaveOperationalStatus, &operational_status_))); @@ -254,7 +255,7 @@ static FrameSenderConfig video_sender_config_; base::SimpleTestTickClock clock_; - base::MessageLoop message_loop_; + base::test::ScopedTaskEnvironment scoped_task_environment_; scoped_refptr<CastEnvironment> cast_environment_; std::unique_ptr<VideoEncoder> encoder_; OperationalStatus operational_status_;
diff --git a/media/cast/test/end2end_unittest.cc b/media/cast/test/end2end_unittest.cc index fd90386..bf67267 100644 --- a/media/cast/test/end2end_unittest.cc +++ b/media/cast/test/end2end_unittest.cc
@@ -23,9 +23,9 @@ #include "base/bind.h" #include "base/bind_helpers.h" #include "base/memory/ptr_util.h" -#include "base/message_loop/message_loop.h" #include "base/strings/string_number_conversions.h" #include "base/sys_byteorder.h" +#include "base/test/scoped_task_environment.h" #include "base/test/simple_test_tick_clock.h" #include "base/time/tick_clock.h" #include "media/base/audio_bus.h" @@ -879,7 +879,7 @@ std::vector<std::pair<base::TimeTicks, base::TimeTicks> > video_ticks_; // |transport_sender_| has a RepeatingTimer which needs a MessageLoop. - base::MessageLoop message_loop_; + base::test::ScopedTaskEnvironment scoped_task_environment_; }; namespace {
diff --git a/media/cdm/player_tracker_impl.cc b/media/cdm/player_tracker_impl.cc index 3bfae54..72c27974 100644 --- a/media/cdm/player_tracker_impl.cc +++ b/media/cdm/player_tracker_impl.cc
@@ -29,7 +29,7 @@ const base::Closure& cdm_unset_cb) { base::AutoLock lock(lock_); int registration_id = next_registration_id_++; - DCHECK(!base::ContainsKey(player_callbacks_map_, registration_id)); + DCHECK(!base::Contains(player_callbacks_map_, registration_id)); player_callbacks_map_.insert(std::make_pair( registration_id, PlayerCallbacks(new_key_cb, cdm_unset_cb))); return registration_id; @@ -37,7 +37,7 @@ void PlayerTrackerImpl::UnregisterPlayer(int registration_id) { base::AutoLock lock(lock_); - DCHECK(base::ContainsKey(player_callbacks_map_, registration_id)) + DCHECK(base::Contains(player_callbacks_map_, registration_id)) << registration_id; player_callbacks_map_.erase(registration_id); }
diff --git a/media/gpu/test/video_player/frame_renderer_thumbnail.cc b/media/gpu/test/video_player/frame_renderer_thumbnail.cc index f2e32ec..5588e0a 100644 --- a/media/gpu/test/video_player/frame_renderer_thumbnail.cc +++ b/media/gpu/test/video_player/frame_renderer_thumbnail.cc
@@ -236,8 +236,7 @@ // Calculate the thumbnail's checksum and compare it to golden values. std::string md5_string = base::MD5String( base::StringPiece(reinterpret_cast<char*>(&rgb[0]), rgb.size())); - bool is_valid_thumbnail = - base::ContainsValue(thumbnail_checksums_, md5_string); + bool is_valid_thumbnail = base::Contains(thumbnail_checksums_, md5_string); return is_valid_thumbnail; }
diff --git a/media/gpu/vaapi/vaapi_jpeg_decoder.cc b/media/gpu/vaapi/vaapi_jpeg_decoder.cc index 86ed8cd..f7af7fd 100644 --- a/media/gpu/vaapi/vaapi_jpeg_decoder.cc +++ b/media/gpu/vaapi/vaapi_jpeg_decoder.cc
@@ -210,6 +210,13 @@ return kInvalidVaRtFormat; } +VaapiJpegDecoder::~VaapiJpegDecoder() { + if (vaapi_wrapper_) { + vaapi_wrapper_->DestroyContextAndSurfaces( + std::vector<VASurfaceID>({va_surface_id_})); + } +} + bool VaapiJpegDecoder::Initialize(const base::RepeatingClosure& error_uma_cb) { vaapi_wrapper_ = VaapiWrapper::Create(VaapiWrapper::kDecode, VAProfileJPEGBaseline, error_uma_cb); @@ -260,7 +267,8 @@ base::strict_cast<int>(parse_result.frame_header.coded_height)); if (new_coded_size != coded_size_ || va_surface_id_ == VA_INVALID_SURFACE || picture_va_rt_format != va_rt_format_) { - vaapi_wrapper_->DestroyContextAndSurfaces(); + vaapi_wrapper_->DestroyContextAndSurfaces( + std::vector<VASurfaceID>({va_surface_id_})); va_surface_id_ = VA_INVALID_SURFACE; va_rt_format_ = picture_va_rt_format;
diff --git a/media/gpu/vaapi/vaapi_jpeg_decoder.h b/media/gpu/vaapi/vaapi_jpeg_decoder.h index 4dfe28333..e4e27a7 100644 --- a/media/gpu/vaapi/vaapi_jpeg_decoder.h +++ b/media/gpu/vaapi/vaapi_jpeg_decoder.h
@@ -27,7 +27,7 @@ class VaapiJpegDecoder : public VaapiImageDecoder { public: VaapiJpegDecoder() = default; - ~VaapiJpegDecoder() override = default; + ~VaapiJpegDecoder() override; // VaapiImageDecoder implementation. bool Initialize(const base::RepeatingClosure& error_uma_cb) override;
diff --git a/media/gpu/vaapi/vaapi_jpeg_decoder_unittest.cc b/media/gpu/vaapi/vaapi_jpeg_decoder_unittest.cc index 5ff8df1..57b21568 100644 --- a/media/gpu/vaapi/vaapi_jpeg_decoder_unittest.cc +++ b/media/gpu/vaapi/vaapi_jpeg_decoder_unittest.cc
@@ -45,6 +45,9 @@ constexpr const char* kYuv422Filename = "pixel-1280x720.jpg"; constexpr const char* kYuv420Filename = "pixel-1280x720-yuv420.jpg"; constexpr const char* kYuv444Filename = "pixel-1280x720-yuv444.jpg"; +constexpr const char* kOddHeightImageFilename = "peach_pi-40x23.jpg"; +constexpr const char* kOddWidthImageFilename = "peach_pi-41x22.jpg"; +constexpr const char* kOddDimensionsImageFilename = "peach_pi-41x23.jpg"; struct TestParam { const char* test_name; @@ -55,10 +58,12 @@ {"YUV422", kYuv422Filename}, {"YUV420", kYuv420Filename}, {"YUV444", kYuv444Filename}, + {"OddHeightImage40x23", kOddHeightImageFilename}, + {"OddWidthImage41x22", kOddWidthImageFilename}, + {"OddDimensionsImage41x23", kOddDimensionsImageFilename}, }; -// Any number above 99.5% should do, experimentally we like a wee higher. -constexpr double kMinSsim = 0.997; +constexpr double kMinSsim = 0.995; // This file is not supported by the VAAPI, so we don't define expectations on // the decode result. @@ -96,41 +101,25 @@ const uint16_t width = parse_result.frame_header.visible_width; const uint16_t height = parse_result.frame_header.visible_height; - const uint16_t even_width = (width + 1) / 2; - const uint16_t even_height = (height + 1) / 2; + const uint16_t half_width = (width + 1) / 2; + const uint16_t half_height = (height + 1) / 2; - auto ref_y = std::make_unique<uint8_t[]>(width * height); - auto ref_u = std::make_unique<uint8_t[]>(even_width * even_height); - auto ref_v = std::make_unique<uint8_t[]>(even_width * even_height); + auto libyuv_y_plane = std::make_unique<uint8_t[]>(width * height); + auto libyuv_u_plane = std::make_unique<uint8_t[]>(half_width * half_height); + auto libyuv_v_plane = std::make_unique<uint8_t[]>(half_width * half_height); - const int conversion_result = libyuv::ConvertToI420( - encoded_image.data(), encoded_image.size(), ref_y.get(), width, - ref_u.get(), even_width, ref_v.get(), even_width, 0, 0, width, height, - width, height, libyuv::kRotate0, libyuv::FOURCC_MJPG); + int conversion_result = libyuv::ConvertToI420( + encoded_image.data(), encoded_image.size(), libyuv_y_plane.get(), width, + libyuv_u_plane.get(), half_width, libyuv_v_plane.get(), half_width, 0, 0, + width, height, width, height, libyuv::kRotate0, libyuv::FOURCC_MJPG); if (conversion_result != 0) { DLOG(ERROR) << "libyuv conversion error"; return false; } const uint32_t va_fourcc = decoded_image->image()->format.fourcc; - uint32_t libyuv_fourcc = 0; - switch (va_fourcc) { - case VA_FOURCC_I420: - libyuv_fourcc = libyuv::FOURCC_I420; - break; - case VA_FOURCC_NV12: - libyuv_fourcc = libyuv::FOURCC_NV12; - break; - case VA_FOURCC_YUY2: - case VA_FOURCC('Y', 'U', 'Y', 'V'): - libyuv_fourcc = libyuv::FOURCC_YUY2; - break; - default: - DLOG(ERROR) << "Not supported FourCC: " << FourccToString(va_fourcc); - return false; - } - - if (libyuv_fourcc == libyuv::FOURCC_I420) { + double ssim = 0; + if (va_fourcc == VA_FOURCC_I420) { const auto* decoded_data_y = static_cast<const uint8_t*>(decoded_image->va_buffer()->data()) + decoded_image->image()->offsets[0]; @@ -141,88 +130,70 @@ static_cast<const uint8_t*>(decoded_image->va_buffer()->data()) + decoded_image->image()->offsets[2]; - const double ssim = libyuv::I420Ssim( - ref_y.get(), width, ref_u.get(), even_width, ref_v.get(), even_width, - decoded_data_y, + ssim = libyuv::I420Ssim( + libyuv_y_plane.get(), width, libyuv_u_plane.get(), half_width, + libyuv_v_plane.get(), half_width, decoded_data_y, base::checked_cast<int>(decoded_image->image()->pitches[0]), decoded_data_u, base::checked_cast<int>(decoded_image->image()->pitches[1]), decoded_data_v, base::checked_cast<int>(decoded_image->image()->pitches[2]), width, height); - if (ssim < kMinSsim) { - DLOG(ERROR) << "Too low SSIM: " << ssim << " < " << kMinSsim; - return false; - } - } else if (libyuv_fourcc == libyuv::FOURCC_NV12) { - const auto* decoded_data_y = - static_cast<const uint8_t*>(decoded_image->va_buffer()->data()) + - decoded_image->image()->offsets[0]; - const auto* decoded_data_uv = - static_cast<const uint8_t*>(decoded_image->va_buffer()->data()) + - decoded_image->image()->offsets[1]; - + } else if (va_fourcc == VA_FOURCC_NV12 || va_fourcc == VA_FOURCC_YUY2 || + va_fourcc == VA_FOURCC('Y', 'U', 'Y', 'V')) { + // Temporary planes to hold intermediate conversions to I420 (i.e. NV12 to + // I420 or YUYV/2 to I420). auto temp_y = std::make_unique<uint8_t[]>(width * height); - auto temp_u = std::make_unique<uint8_t[]>(even_width * even_height); - auto temp_v = std::make_unique<uint8_t[]>(even_width * even_height); + auto temp_u = std::make_unique<uint8_t[]>(half_width * half_height); + auto temp_v = std::make_unique<uint8_t[]>(half_width * half_height); - const int conversion_result = libyuv::NV12ToI420( - decoded_data_y, - base::checked_cast<int>(decoded_image->image()->pitches[0]), - decoded_data_uv, - base::checked_cast<int>(decoded_image->image()->pitches[1]), - temp_y.get(), width, temp_u.get(), even_width, temp_v.get(), even_width, - width, height); + if (va_fourcc == VA_FOURCC_NV12) { + const auto* decoded_data_y = + static_cast<const uint8_t*>(decoded_image->va_buffer()->data()) + + decoded_image->image()->offsets[0]; + const auto* decoded_data_uv = + static_cast<const uint8_t*>(decoded_image->va_buffer()->data()) + + decoded_image->image()->offsets[1]; + + conversion_result = libyuv::NV12ToI420( + decoded_data_y, + base::checked_cast<int>(decoded_image->image()->pitches[0]), + decoded_data_uv, + base::checked_cast<int>(decoded_image->image()->pitches[1]), + temp_y.get(), width, temp_u.get(), half_width, temp_v.get(), + half_width, width, height); + } else { + // |va_fourcc| is YUY2 or YUYV, which are handled the same. + const auto* decoded_data_yuyv = + static_cast<const uint8_t*>(decoded_image->va_buffer()->data()) + + decoded_image->image()->offsets[0]; + + // TODO(crbug.com/868400): support other formats/planarities/pitches. + conversion_result = libyuv::YUY2ToI420( + decoded_data_yuyv, + base::checked_cast<int>(decoded_image->image()->pitches[0]), + temp_y.get(), width, temp_u.get(), half_width, temp_v.get(), + half_width, width, height); + } if (conversion_result != 0) { DLOG(ERROR) << "libyuv conversion error"; return false; } - const double ssim = libyuv::I420Ssim( - ref_y.get(), width, ref_u.get(), even_width, ref_v.get(), even_width, - temp_y.get(), width, temp_u.get(), even_width, temp_v.get(), even_width, - width, height); - if (ssim < kMinSsim) { - DLOG(ERROR) << "Too low SSIM: " << ssim << " < " << kMinSsim; - return false; - } + ssim = libyuv::I420Ssim(libyuv_y_plane.get(), width, libyuv_u_plane.get(), + half_width, libyuv_v_plane.get(), half_width, + temp_y.get(), width, temp_u.get(), half_width, + temp_v.get(), half_width, width, height); } else { - auto temp_y = std::make_unique<uint8_t[]>(width * height); - auto temp_u = std::make_unique<uint8_t[]>(even_width * even_height); - auto temp_v = std::make_unique<uint8_t[]>(even_width * even_height); - - // TODO(crbug.com/868400): support other formats/planarities/pitches. - constexpr uint32_t kNumPlanesYuv422 = 1u; - constexpr uint32_t kBytesPerPixelYuv422 = 2u; - if (decoded_image->image()->num_planes != kNumPlanesYuv422 || - decoded_image->image()->pitches[0] != (width * kBytesPerPixelYuv422)) { - DLOG(ERROR) << "Too many planes (got " - << decoded_image->image()->num_planes << ", expected " - << kNumPlanesYuv422 << ") or rows not tightly packed (got " - << decoded_image->image()->pitches[0] << ", expected " - << (width * kBytesPerPixelYuv422) << "), aborting test"; - return false; - } - - const int conversion_result = libyuv::ConvertToI420( - static_cast<const uint8_t*>(decoded_image->va_buffer()->data()), - base::strict_cast<size_t>(decoded_image->image()->data_size), - temp_y.get(), width, temp_u.get(), even_width, temp_v.get(), even_width, - 0, 0, width, height, width, height, libyuv::kRotate0, libyuv_fourcc); - if (conversion_result != 0) { - DLOG(ERROR) << "libyuv conversion error"; - return false; - } - - const double ssim = libyuv::I420Ssim( - ref_y.get(), width, ref_u.get(), even_width, ref_v.get(), even_width, - temp_y.get(), width, temp_u.get(), even_width, temp_v.get(), even_width, - width, height); - if (ssim < kMinSsim) { - DLOG(ERROR) << "Too low SSIM: " << ssim << " < " << kMinSsim; - return false; - } + DLOG(ERROR) << "FourCC not supported: " << FourccToString(va_fourcc); + return false; } + + if (ssim < kMinSsim) { + DLOG(ERROR) << "SSIM too low: " << ssim << " < " << kMinSsim; + return false; + } + return true; }
diff --git a/media/gpu/vaapi/vaapi_jpeg_encode_accelerator.cc b/media/gpu/vaapi/vaapi_jpeg_encode_accelerator.cc index 2c67d19..03e3dcc 100644 --- a/media/gpu/vaapi/vaapi_jpeg_encode_accelerator.cc +++ b/media/gpu/vaapi/vaapi_jpeg_encode_accelerator.cc
@@ -160,8 +160,8 @@ return; } va_surface_id_ = va_surface->id(); + vaapi_wrapper_->DestroyContext(); - vaapi_wrapper_->DestroyContextAndSurfaces(); const bool success = vaapi_wrapper_->CreateContext( VaapiWrapper::BufferFormatToVARTFormat(buffer_format), input_size); if (!success) { @@ -275,7 +275,8 @@ // Recreate VASurface if the video frame's size changed. if (input_size != surface_size_ || va_surface_id_ == VA_INVALID_SURFACE) { - vaapi_wrapper_->DestroyContextAndSurfaces(); + vaapi_wrapper_->DestroyContextAndSurfaces( + std::vector<VASurfaceID>({va_surface_id_})); va_surface_id_ = VA_INVALID_SURFACE; surface_size_ = gfx::Size();
diff --git a/media/gpu/vaapi/vaapi_utils_unittest.cc b/media/gpu/vaapi/vaapi_utils_unittest.cc index f019f6a..d3016e86 100644 --- a/media/gpu/vaapi/vaapi_utils_unittest.cc +++ b/media/gpu/vaapi/vaapi_utils_unittest.cc
@@ -74,6 +74,7 @@ EXPECT_TRUE(scoped_image->va_buffer()->IsValid()); EXPECT_TRUE(scoped_image->va_buffer()->data()); } + vaapi_wrapper_->DestroyContextAndSurfaces(va_surfaces); } // This test exercises creation of a ScopedVAImage with a bad VASurfaceID.
diff --git a/media/gpu/vaapi/vaapi_video_decode_accelerator.cc b/media/gpu/vaapi/vaapi_video_decode_accelerator.cc index ac0c9e1..5a4fdbf 100644 --- a/media/gpu/vaapi/vaapi_video_decode_accelerator.cc +++ b/media/gpu/vaapi/vaapi_video_decode_accelerator.cc
@@ -249,7 +249,7 @@ } } picture = pictures_[picture_buffer_id].get(); - DCHECK(base::ContainsValue(available_picture_buffers_, picture_buffer_id)); + DCHECK(base::Contains(available_picture_buffers_, picture_buffer_id)); base::Erase(available_picture_buffers_, picture_buffer_id); } @@ -564,8 +564,13 @@ // All surfaces released, destroy them and dismiss all PictureBuffers. awaiting_va_surfaces_recycle_ = false; + if (buffer_allocation_mode_ != BufferAllocationMode::kNone) { + vaapi_wrapper_->DestroyContextAndSurfaces(std::vector<VASurfaceID>( + available_va_surfaces_.begin(), available_va_surfaces_.end())); + } else { + vaapi_wrapper_->DestroyContext(); + } available_va_surfaces_.clear(); - vaapi_wrapper_->DestroyContextAndSurfaces(); for (auto iter = pictures_.begin(); iter != pictures_.end(); ++iter) { VLOGF(2) << "Dismissing picture id: " << iter->first; @@ -668,7 +673,7 @@ va_surface_ids.push_back(va_surface_id); } - DCHECK(!base::ContainsKey(pictures_, buffers[i].id())); + DCHECK(!base::Contains(pictures_, buffers[i].id())); pictures_[buffers[i].id()] = std::move(picture); surfaces_available_.Signal(); @@ -948,7 +953,14 @@ base::AutoUnlock auto_unlock(lock_); decoder_thread_.Stop(); } - + if (vaapi_wrapper_) { + if (buffer_allocation_mode_ != BufferAllocationMode::kNone) { + vaapi_wrapper_->DestroyContextAndSurfaces(std::vector<VASurfaceID>( + available_va_surfaces_.begin(), available_va_surfaces_.end())); + } else { + vaapi_wrapper_->DestroyContext(); + } + } state_ = kUninitialized; } @@ -1022,8 +1034,7 @@ for (const VASurfaceID va_surface_id : available_va_surfaces_) { for (const auto& id_and_picture : pictures_) { if (id_and_picture.second->va_surface_id() == va_surface_id && - base::ContainsValue(available_picture_buffers_, - id_and_picture.first)) { + base::Contains(available_picture_buffers_, id_and_picture.first)) { // Remove |va_surface_id| from the list of availables, and use the id // to return a new VASurface. base::Erase(available_va_surfaces_, va_surface_id);
diff --git a/media/gpu/vaapi/vaapi_video_decode_accelerator_unittest.cc b/media/gpu/vaapi/vaapi_video_decode_accelerator_unittest.cc index ebff5f27..728a94d8 100644 --- a/media/gpu/vaapi/vaapi_video_decode_accelerator_unittest.cc +++ b/media/gpu/vaapi/vaapi_video_decode_accelerator_unittest.cc
@@ -72,7 +72,7 @@ CreateContextAndSurfaces, bool(unsigned int, const gfx::Size&, size_t, std::vector<VASurfaceID>*)); MOCK_METHOD2(CreateContext, bool(unsigned int, const gfx::Size&)); - MOCK_METHOD0(DestroyContextAndSurfaces, void()); + MOCK_METHOD1(DestroyContextAndSurfaces, void(std::vector<VASurfaceID>)); private: ~MockVaapiWrapper() override = default; @@ -229,7 +229,12 @@ const size_t kNumReferenceFrames = num_pictures / 2; EXPECT_CALL(*mock_decoder_, GetNumReferenceFrames()) .WillOnce(Return(kNumReferenceFrames)); - EXPECT_CALL(*mock_vaapi_wrapper_, DestroyContextAndSurfaces()); + if (vda_.buffer_allocation_mode_ != + VaapiVideoDecodeAccelerator::BufferAllocationMode::kNone) { + EXPECT_CALL(*mock_vaapi_wrapper_, DestroyContextAndSurfaces(_)); + } else { + // TODO(crbug.com/971891): Make virtual and expect DestroyContext(). + } if (expect_dismiss_picture_buffers) { EXPECT_CALL(*this, DismissPictureBuffer(_))
diff --git a/media/gpu/vaapi/vaapi_video_encode_accelerator.cc b/media/gpu/vaapi/vaapi_video_encode_accelerator.cc index ea93b9b..48a703d6 100644 --- a/media/gpu/vaapi/vaapi_video_encode_accelerator.cc +++ b/media/gpu/vaapi/vaapi_video_encode_accelerator.cc
@@ -765,7 +765,8 @@ DCHECK(encoder_thread_task_runner_->BelongsToCurrentThread()); // Clean up members that are to be accessed on the encoder thread only. - available_va_surface_ids_.clear(); + if (vaapi_wrapper_) + vaapi_wrapper_->DestroyContextAndSurfaces(available_va_surface_ids_); available_va_buffer_ids_.clear(); while (!available_bitstream_buffers_.empty())
diff --git a/media/gpu/vaapi/vaapi_wrapper.cc b/media/gpu/vaapi/vaapi_wrapper.cc index f66ede4e..e1d29a9 100644 --- a/media/gpu/vaapi/vaapi_wrapper.cc +++ b/media/gpu/vaapi/vaapi_wrapper.cc
@@ -164,7 +164,7 @@ base::StartsWith(va_vendor_string, info.va_driver, base::CompareCase::SENSITIVE) && va_vendor_string.find(info.cpu_family) != std::string::npos && - base::ContainsValue(info.va_profiles, va_profile)) { + base::Contains(info.va_profiles, va_profile)) { return true; } } @@ -644,7 +644,7 @@ return false; } - return base::ContainsValue(supported_entrypoints, entrypoint); + return base::Contains(supported_entrypoints, entrypoint); } bool VASupportedProfiles::AreAttribsSupported_Locked( @@ -1213,39 +1213,29 @@ const gfx::Size& size, size_t num_surfaces, std::vector<VASurfaceID>* va_surfaces) { - { - base::AutoLock auto_lock(*va_lock_); - DVLOG(2) << "Creating " << num_surfaces << " surfaces"; - DCHECK(va_surfaces->empty()); + DVLOG(2) << "Creating " << num_surfaces << " surfaces"; + DCHECK(va_surfaces->empty()); - if (!va_surface_ids_.empty() || va_surface_format_ != 0u) { - LOG(ERROR) << "Surfaces should be destroyed before creating new surfaces"; - return false; - } - - // Allocate surfaces in driver. - va_surface_ids_.resize(num_surfaces); - VAStatus va_res = - vaCreateSurfaces(va_display_, va_format, size.width(), size.height(), - &va_surface_ids_[0], va_surface_ids_.size(), NULL, 0); - - VA_LOG_ON_ERROR(va_res, "vaCreateSurfaces failed"); - if (va_res != VA_STATUS_SUCCESS) { - va_surface_ids_.clear(); - return false; - } + if (va_surface_format_ != 0u) { + LOG(ERROR) << "Surfaces should be destroyed before creating new surfaces"; + return false; } - // And create a context associated with them. - const bool success = CreateContext(va_format, size); - if (success) - *va_surfaces = va_surface_ids_; - else - DestroyContextAndSurfaces(); + if (!CreateSurfaces(va_format, size, num_surfaces, va_surfaces)) + return false; + const bool success = CreateContext(va_format, size); + if (!success) + DestroyContextAndSurfaces(*va_surfaces); return success; } +void VaapiWrapper::DestroyContextAndSurfaces( + std::vector<VASurfaceID> va_surfaces) { + DestroyContext(); + DestroySurfaces(va_surfaces); +} + bool VaapiWrapper::CreateContext(unsigned int va_format, const gfx::Size& size) { base::AutoLock auto_lock(*va_lock_); @@ -1267,26 +1257,6 @@ return va_res == VA_STATUS_SUCCESS; } -void VaapiWrapper::DestroyContextAndSurfaces() { - base::AutoLock auto_lock(*va_lock_); - DVLOG(2) << "Destroying " << va_surface_ids_.size() << " surfaces"; - - if (va_context_id_ != VA_INVALID_ID) { - VAStatus va_res = vaDestroyContext(va_display_, va_context_id_); - VA_LOG_ON_ERROR(va_res, "vaDestroyContext failed"); - } - - if (!va_surface_ids_.empty()) { - VAStatus va_res = vaDestroySurfaces(va_display_, &va_surface_ids_[0], - va_surface_ids_.size()); - VA_LOG_ON_ERROR(va_res, "vaDestroySurfaces failed"); - } - - va_surface_ids_.clear(); - va_context_id_ = VA_INVALID_ID; - va_surface_format_ = 0; -} - scoped_refptr<VASurface> VaapiWrapper::CreateVASurfaceForPixmap( const scoped_refptr<gfx::NativePixmap>& pixmap) { const gfx::BufferFormat buffer_format = pixmap->GetBufferFormat(); @@ -1749,7 +1719,7 @@ VaapiWrapper::~VaapiWrapper() { DestroyPendingBuffers(); DestroyVABuffers(); - DestroyContextAndSurfaces(); + DestroyContext(); Deinitialize(); } @@ -1828,10 +1798,59 @@ return true; } -void VaapiWrapper::DestroySurface(VASurfaceID va_surface_id) { +void VaapiWrapper::DestroyContext() { base::AutoLock auto_lock(*va_lock_); + DVLOG(2) << "Destroying context"; - VAStatus va_res = vaDestroySurfaces(va_display_, &va_surface_id, 1); + if (va_context_id_ != VA_INVALID_ID) { + const VAStatus va_res = vaDestroyContext(va_display_, va_context_id_); + VA_LOG_ON_ERROR(va_res, "vaDestroyContext failed"); + } + + va_context_id_ = VA_INVALID_ID; + va_surface_format_ = 0; +} + +bool VaapiWrapper::CreateSurfaces(unsigned int va_format, + const gfx::Size& size, + size_t num_surfaces, + std::vector<VASurfaceID>* va_surfaces) { + DVLOG(2) << "Creating " << num_surfaces << " " << size.ToString() + << " surfaces "; + DCHECK_NE(va_format, 0u); + DCHECK(va_surfaces->empty()); + + va_surfaces->resize(num_surfaces); + VAStatus va_res; + { + base::AutoLock auto_lock(*va_lock_); + va_res = + vaCreateSurfaces(va_display_, va_format, size.width(), size.height(), + va_surfaces->data(), num_surfaces, NULL, 0); + } + VA_LOG_ON_ERROR(va_res, "vaCreateSurfaces failed"); + return va_res == VA_STATUS_SUCCESS; +} + +void VaapiWrapper::DestroySurfaces(std::vector<VASurfaceID> va_surfaces) { + DVLOG(2) << "Destroying " << va_surfaces.size() << " surfaces"; + + if (va_surfaces.empty()) + return; + // vaDestroySurfaces() makes no guarantees about VA_INVALID_SURFACE. + base::Erase(va_surfaces, VA_INVALID_SURFACE); + + base::AutoLock auto_lock(*va_lock_); + const VAStatus va_res = + vaDestroySurfaces(va_display_, va_surfaces.data(), va_surfaces.size()); + VA_LOG_ON_ERROR(va_res, "vaDestroySurfaces failed"); +} + +void VaapiWrapper::DestroySurface(VASurfaceID va_surface_id) { + if (va_surface_id == VA_INVALID_SURFACE) + return; + base::AutoLock auto_lock(*va_lock_); + const VAStatus va_res = vaDestroySurfaces(va_display_, &va_surface_id, 1); VA_LOG_ON_ERROR(va_res, "vaDestroySurfaces on surface failed"); }
diff --git a/media/gpu/vaapi/vaapi_wrapper.h b/media/gpu/vaapi/vaapi_wrapper.h index c2d0cda..0f27d76 100644 --- a/media/gpu/vaapi/vaapi_wrapper.h +++ b/media/gpu/vaapi/vaapi_wrapper.h
@@ -142,30 +142,28 @@ static uint32_t BufferFormatToVARTFormat(gfx::BufferFormat fmt); - // Creates |num_surfaces| backing surfaces in driver for VASurfaces of - // |va_format|, each of size |size| and initializes |va_context_id_| with - // |format| and |size|. Returns true when successful, with the created IDs in - // |va_surfaces| to be managed and later wrapped in VASurfaces. The client - // must DestroyContextAndSurfaces() each time before calling this method again - // to free the allocated surfaces first, but is not required to do so at - // destruction time, as this will be done automatically from the destructor. + // Creates |num_surfaces| VASurfaceIDs of |va_format| and |size| and, if + // successful, creates a |va_context_id_| of the same format and size. Returns + // true if successful, with the created IDs in |va_surfaces|. The client is + // responsible for destroying |va_surfaces| via DestroyContextAndSurfaces() to + // free the allocated surfaces. virtual bool CreateContextAndSurfaces(unsigned int va_format, const gfx::Size& size, size_t num_surfaces, std::vector<VASurfaceID>* va_surfaces); - // Creates a VA Context associated with |format| and |size|, and sets - // |va_context_id_|. The |va_context_id_| will be destroyed by - // DestroyContextAndSurfaces(). + // Releases the |va_surfaces| and destroys |va_context_id_|. + virtual void DestroyContextAndSurfaces(std::vector<VASurfaceID> va_surfaces); + + // Creates a VA Context of |va_format| and |size|, and sets |va_context_id_|. + // The client is responsible for releasing it via DestroyContext() or + // DestroyContextAndSurfaces(), or it will be released on dtor. virtual bool CreateContext(unsigned int va_format, const gfx::Size& size); + // Destroys the context identified by |va_context_id_| and clears the local + // associated |va_surface_format_|. + void DestroyContext(); - // Frees all memory allocated in CreateContextAndSurfaces() and destroys - // |va_context_id_|. - virtual void DestroyContextAndSurfaces(); - - // Create a VASurface for |pixmap|. The ownership of the surface is - // transferred to the caller. It differs from surfaces created using - // CreateContextAndSurfaces(), where VaapiWrapper is the owner of the - // surfaces. + // Creates a self-releasing VASurface from |pixmap|. The ownership of the + // surface is transferred to the caller. scoped_refptr<VASurface> CreateVASurfaceForPixmap( const scoped_refptr<gfx::NativePixmap>& pixmap); @@ -268,7 +266,7 @@ // Initialize static data before sandbox is enabled. static void PreSandboxInitialization(); - // Get the created surfaces format. + // Get the created surfaces format. TODO(crbug.com/971891): remove. unsigned int va_surface_format() const { return va_surface_format_; } protected: @@ -286,7 +284,14 @@ void Deinitialize(); bool VaInitialize(const base::Closure& report_error_to_uma_cb); - // Destroys a |va_surface_id|. + // Tries to allocate |num_surfaces| VASurfaceIDs of |size| and |va_format|. + // Fills |va_surfaces| and returns true if successful, or returns false. + bool CreateSurfaces(unsigned int va_format, + const gfx::Size& size, + size_t num_surfaces, + std::vector<VASurfaceID>* va_surfaces); + // vaDestroySurfaces() a vector or a single VASurfaceID. + void DestroySurfaces(std::vector<VASurfaceID> va_surfaces); void DestroySurface(VASurfaceID va_surface_id); // Execute pending job in hardware and destroy pending buffers. Return false @@ -304,10 +309,7 @@ // the lifetime of VaapiWrapper. base::Lock* va_lock_; - // Allocated ids for VASurfaces. - std::vector<VASurfaceID> va_surface_ids_; - - // VA format of surfaces with va_surface_ids_. + // VA format of allocated surfaces. TODO(crbug.com/971891): remove. unsigned int va_surface_format_; // VA handles. @@ -315,7 +317,7 @@ VADisplay va_display_ GUARDED_BY(va_lock_); VAConfigID va_config_id_; // Created in CreateContext() or CreateContextAndSurfaces() and valid until - // DestroyContextAndSurfaces(). + // DestroyContext() or DestroyContextAndSurfaces(). VAContextID va_context_id_; // Data queued up for HW codec, to be committed on next execution.
diff --git a/media/gpu/video_decode_accelerator_unittest.cc b/media/gpu/video_decode_accelerator_unittest.cc index f9b2361..ca68be0 100644 --- a/media/gpu/video_decode_accelerator_unittest.cc +++ b/media/gpu/video_decode_accelerator_unittest.cc
@@ -1399,7 +1399,7 @@ base::FilePath filepath(test_video_files_[0]->file_name); auto golden_md5s = media::test::ReadGoldenThumbnailMD5s( filepath.AddExtension(FILE_PATH_LITERAL(".md5"))); - bool is_valid_thumbnail = base::ContainsValue(golden_md5s, md5_string); + bool is_valid_thumbnail = base::Contains(golden_md5s, md5_string); // Convert raw RGBA into PNG for export. std::vector<unsigned char> png;
diff --git a/media/gpu/windows/dxva_video_decode_accelerator_win.cc b/media/gpu/windows/dxva_video_decode_accelerator_win.cc index 5519620..0be64d5 100644 --- a/media/gpu/windows/dxva_video_decode_accelerator_win.cc +++ b/media/gpu/windows/dxva_video_decode_accelerator_win.cc
@@ -736,8 +736,7 @@ main_thread_task_runner_ = base::ThreadTaskRunnerHandle::Get(); if (!config.supported_output_formats.empty() && - !base::ContainsValue(config.supported_output_formats, - PIXEL_FORMAT_NV12)) { + !base::Contains(config.supported_output_formats, PIXEL_FORMAT_NV12)) { DisableSharedTextureSupport(); support_copy_nv12_textures_ = false; }
diff --git a/media/renderers/video_resource_updater.cc b/media/renderers/video_resource_updater.cc index acba960..a5ace70 100644 --- a/media/renderers/video_resource_updater.cc +++ b/media/renderers/video_resource_updater.cc
@@ -939,8 +939,7 @@ return false; return resource->resource_format() != output_resource_format || - !base::ContainsValue(outplane_plane_sizes, - resource->resource_size()); + !base::Contains(outplane_plane_sizes, resource->resource_size()); }; base::EraseIf(all_resources_, can_delete_resource_fn);
diff --git a/mojo/core/channel_mac_fuzzer.cc b/mojo/core/channel_mac_fuzzer.cc index 924b9d1f..d633929 100644 --- a/mojo/core/channel_mac_fuzzer.cc +++ b/mojo/core/channel_mac_fuzzer.cc
@@ -6,8 +6,8 @@ #include "base/logging.h" #include "base/mac/mach_logging.h" -#include "base/message_loop/message_loop.h" #include "base/run_loop.h" +#include "base/task/single_thread_task_executor.h" #include "base/test/scoped_feature_list.h" #include "mojo/core/channel.h" #include "mojo/core/entrypoints.h"
diff --git a/mojo/core/data_pipe_unittest.cc b/mojo/core/data_pipe_unittest.cc index 0ce3f1e..4e7c9b0 100644 --- a/mojo/core/data_pipe_unittest.cc +++ b/mojo/core/data_pipe_unittest.cc
@@ -10,9 +10,9 @@ #include "base/bind.h" #include "base/location.h" #include "base/logging.h" -#include "base/message_loop/message_loop.h" #include "base/run_loop.h" #include "base/stl_util.h" +#include "base/test/scoped_task_environment.h" #include "build/build_config.h" #include "mojo/core/embedder/embedder.h" #include "mojo/core/test/mojo_test_base.h" @@ -1972,7 +1972,7 @@ EXPECT_EQ(MOJO_RESULT_OK, WaitForSignals(consumers[0], MOJO_HANDLE_SIGNAL_PEER_CLOSED)); - base::MessageLoop message_loop; + base::test::ScopedTaskEnvironment scoped_task_environment; // Wait on producer 1 and consumer 1 using SimpleWatchers. {
diff --git a/mojo/core/multiprocess_message_pipe_unittest.cc b/mojo/core/multiprocess_message_pipe_unittest.cc index ea06608..60332c07 100644 --- a/mojo/core/multiprocess_message_pipe_unittest.cc +++ b/mojo/core/multiprocess_message_pipe_unittest.cc
@@ -18,10 +18,10 @@ #include "base/files/scoped_file.h" #include "base/files/scoped_temp_dir.h" #include "base/logging.h" -#include "base/message_loop/message_loop.h" #include "base/run_loop.h" #include "base/stl_util.h" #include "base/strings/string_split.h" +#include "base/test/scoped_task_environment.h" #include "build/build_config.h" #include "mojo/core/handle_signals_state.h" #include "mojo/core/test/mojo_test_base.h" @@ -1274,7 +1274,7 @@ EXPECT_EQ(MOJO_RESULT_OK, WaitForSignals(handles[0], MOJO_HANDLE_SIGNAL_PEER_CLOSED)); - base::MessageLoop message_loop; + base::test::ScopedTaskEnvironment scoped_task_environment; // Wait on handle 1 using a SimpleWatcher. {
diff --git a/mojo/public/cpp/bindings/tests/BUILD.gn b/mojo/public/cpp/bindings/tests/BUILD.gn index 73c5ba4..789872b 100644 --- a/mojo/public/cpp/bindings/tests/BUILD.gn +++ b/mojo/public/cpp/bindings/tests/BUILD.gn
@@ -98,6 +98,7 @@ ] deps = [ + "//base/test:test_support", "//mojo/public/cpp/bindings", "//mojo/public/cpp/system", "//mojo/public/interfaces/bindings/tests:test_export_blink_component",
diff --git a/mojo/public/cpp/bindings/tests/bind_task_runner_unittest.cc b/mojo/public/cpp/bindings/tests/bind_task_runner_unittest.cc index 1705ea4..fb7f778 100644 --- a/mojo/public/cpp/bindings/tests/bind_task_runner_unittest.cc +++ b/mojo/public/cpp/bindings/tests/bind_task_runner_unittest.cc
@@ -7,11 +7,11 @@ #include "base/bind.h" #include "base/callback.h" #include "base/containers/queue.h" -#include "base/message_loop/message_loop.h" #include "base/sequenced_task_runner.h" #include "base/synchronization/lock.h" #include "base/synchronization/waitable_event.h" #include "base/test/bind_test_util.h" +#include "base/test/scoped_task_environment.h" #include "base/threading/platform_thread.h" #include "mojo/public/cpp/bindings/associated_receiver.h" #include "mojo/public/cpp/bindings/associated_remote.h" @@ -197,7 +197,7 @@ impl_.reset(new ImplType(std::move(receiver), receiver_task_runner_)); } - base::MessageLoop loop_; + base::test::ScopedTaskEnvironment scoped_task_environment_; scoped_refptr<TestTaskRunner> receiver_task_runner_; scoped_refptr<TestTaskRunner> remote_task_runner_; @@ -235,7 +235,7 @@ void QuitTaskRunner() { connection_receiver_task_runner_->Quit(); } - base::MessageLoop loop_; + base::test::ScopedTaskEnvironment scoped_task_environment_; scoped_refptr<TestTaskRunner> connection_receiver_task_runner_; scoped_refptr<TestTaskRunner> connection_remote_task_runner_; scoped_refptr<TestTaskRunner> sender_receiver_task_runner_;
diff --git a/mojo/public/cpp/bindings/tests/bindings_perftest.cc b/mojo/public/cpp/bindings/tests/bindings_perftest.cc index c5b5047..be70f08e 100644 --- a/mojo/public/cpp/bindings/tests/bindings_perftest.cc +++ b/mojo/public/cpp/bindings/tests/bindings_perftest.cc
@@ -6,8 +6,8 @@ #include <utility> #include "base/bind.h" -#include "base/message_loop/message_loop.h" #include "base/run_loop.h" +#include "base/test/scoped_task_environment.h" #include "base/threading/thread_task_runner_handle.h" #include "base/time/time.h" #include "mojo/public/cpp/bindings/interface_endpoint_client.h" @@ -93,7 +93,7 @@ MojoBindingsPerftest() = default; protected: - base::MessageLoop loop_; + base::test::ScopedTaskEnvironment scoped_task_environment_; }; TEST_F(MojoBindingsPerftest, InProcessPingPong) {
diff --git a/mojo/public/cpp/bindings/tests/connector_unittest.cc b/mojo/public/cpp/bindings/tests/connector_unittest.cc index b5690c56..b4e4438 100644 --- a/mojo/public/cpp/bindings/tests/connector_unittest.cc +++ b/mojo/public/cpp/bindings/tests/connector_unittest.cc
@@ -11,9 +11,9 @@ #include "base/bind.h" #include "base/callback.h" -#include "base/message_loop/message_loop.h" #include "base/run_loop.h" #include "base/stl_util.h" +#include "base/test/scoped_task_environment.h" #include "base/threading/thread.h" #include "base/threading/thread_task_runner_handle.h" #include "mojo/public/cpp/bindings/message.h" @@ -109,7 +109,7 @@ ScopedMessagePipeHandle handle1_; private: - base::MessageLoop loop_; + base::test::ScopedTaskEnvironment scoped_task_environment_; }; TEST_F(ConnectorTest, Basic) {
diff --git a/mojo/public/cpp/bindings/tests/data_view_unittest.cc b/mojo/public/cpp/bindings/tests/data_view_unittest.cc index 97c0353..99c860f 100644 --- a/mojo/public/cpp/bindings/tests/data_view_unittest.cc +++ b/mojo/public/cpp/bindings/tests/data_view_unittest.cc
@@ -7,7 +7,7 @@ #include <unordered_map> #include <vector> -#include "base/message_loop/message_loop.h" +#include "base/test/scoped_task_environment.h" #include "mojo/public/cpp/bindings/lib/fixed_buffer.h" #include "mojo/public/cpp/bindings/lib/serialization.h" #include "mojo/public/cpp/bindings/pending_remote.h" @@ -23,7 +23,7 @@ class DataViewTest : public testing::Test { private: - base::MessageLoop message_loop_; + base::test::ScopedTaskEnvironment scoped_task_environment_; }; struct DataViewHolder {
diff --git a/mojo/public/cpp/bindings/tests/e2e_perftest.cc b/mojo/public/cpp/bindings/tests/e2e_perftest.cc index 3fae17f5..7c7d600 100644 --- a/mojo/public/cpp/bindings/tests/e2e_perftest.cc +++ b/mojo/public/cpp/bindings/tests/e2e_perftest.cc
@@ -8,11 +8,11 @@ #include "base/bind.h" #include "base/callback.h" #include "base/memory/ptr_util.h" -#include "base/message_loop/message_loop.h" #include "base/message_loop/message_loop_current.h" #include "base/run_loop.h" #include "base/strings/stringprintf.h" #include "base/test/perf_time_logger.h" +#include "base/test/scoped_task_environment.h" #include "base/threading/thread_task_runner_handle.h" #include "mojo/core/embedder/embedder.h" #include "mojo/core/test/mojo_test_base.h" @@ -130,7 +130,7 @@ } protected: - base::MessageLoop message_loop_; + base::test::ScopedTaskEnvironment scoped_task_environment_; private: void RunTests(MojoHandle client_mp, const std::string& test_name) { @@ -175,8 +175,8 @@ base::BindOnce( &CreateAndRunService, std::move(receiver), base::BindOnce(base::IgnoreResult(&base::TaskRunner::PostTask), - message_loop_.task_runner(), FROM_HERE, - run_loop.QuitClosure()))); + scoped_task_environment_.GetMainThreadTaskRunner(), + FROM_HERE, run_loop.QuitClosure()))); run_loop.Run(); } @@ -185,8 +185,9 @@ MojoHandle client_mp, service_mp; CreateMessagePipe(&client_mp, &service_mp); WriteMessageWithHandles(mp, "hello", &service_mp, 1); - RunTestOnTaskRunner(message_loop_.task_runner().get(), client_mp, - "MultiProcessEchoMainThread"); + RunTestOnTaskRunner( + scoped_task_environment_.GetMainThreadTaskRunner().get(), client_mp, + "MultiProcessEchoMainThread"); }); }
diff --git a/mojo/public/cpp/bindings/tests/multiplex_router_unittest.cc b/mojo/public/cpp/bindings/tests/multiplex_router_unittest.cc index 883bdd3..7da9906 100644 --- a/mojo/public/cpp/bindings/tests/multiplex_router_unittest.cc +++ b/mojo/public/cpp/bindings/tests/multiplex_router_unittest.cc
@@ -9,8 +9,8 @@ #include "base/bind.h" #include "base/memory/ptr_util.h" #include "base/memory/ref_counted.h" -#include "base/message_loop/message_loop.h" #include "base/run_loop.h" +#include "base/test/scoped_task_environment.h" #include "base/threading/thread_task_runner_handle.h" #include "mojo/public/cpp/bindings/interface_endpoint_client.h" #include "mojo/public/cpp/bindings/message.h" @@ -61,7 +61,7 @@ ScopedInterfaceEndpointHandle endpoint1_; private: - base::MessageLoop loop_; + base::test::ScopedTaskEnvironment scoped_task_environment_; }; TEST_F(MultiplexRouterTest, BasicRequestResponse) {
diff --git a/mojo/public/cpp/bindings/tests/pickle_unittest.cc b/mojo/public/cpp/bindings/tests/pickle_unittest.cc index 8049c54..d3015d20 100644 --- a/mojo/public/cpp/bindings/tests/pickle_unittest.cc +++ b/mojo/public/cpp/bindings/tests/pickle_unittest.cc
@@ -8,8 +8,8 @@ #include "base/bind.h" #include "base/callback.h" #include "base/logging.h" -#include "base/message_loop/message_loop.h" #include "base/run_loop.h" +#include "base/test/scoped_task_environment.h" #include "mojo/public/cpp/bindings/pending_receiver.h" #include "mojo/public/cpp/bindings/receiver_set.h" #include "mojo/public/cpp/bindings/remote.h" @@ -191,7 +191,7 @@ }; private: - base::MessageLoop loop_; + base::test::ScopedTaskEnvironment scoped_task_environment_; ChromiumPicklePasserImpl chromium_service_; ReceiverSet<PicklePasser> chromium_receivers_; BlinkPicklePasserImpl blink_service_;
diff --git a/mojo/public/cpp/bindings/tests/receiver_callback_unittest.cc b/mojo/public/cpp/bindings/tests/receiver_callback_unittest.cc index 38880d1..5a4200e 100644 --- a/mojo/public/cpp/bindings/tests/receiver_callback_unittest.cc +++ b/mojo/public/cpp/bindings/tests/receiver_callback_unittest.cc
@@ -7,10 +7,10 @@ #include "base/bind.h" #include "base/callback.h" #include "base/logging.h" -#include "base/message_loop/message_loop.h" #include "base/run_loop.h" #include "base/test/bind_test_util.h" #include "base/test/gtest_util.h" +#include "base/test/scoped_task_environment.h" #include "build/build_config.h" #include "mojo/public/cpp/bindings/receiver.h" #include "mojo/public/cpp/bindings/remote.h" @@ -109,7 +109,7 @@ void PumpMessages() { base::RunLoop().RunUntilIdle(); } private: - base::MessageLoop loop_; + base::test::ScopedTaskEnvironment scoped_task_environment_; }; // Tests that the Remote and the Receiver can communicate with each other
diff --git a/mojo/public/cpp/bindings/tests/remote_unittest.cc b/mojo/public/cpp/bindings/tests/remote_unittest.cc index 1d82458..7ddb8d908 100644 --- a/mojo/public/cpp/bindings/tests/remote_unittest.cc +++ b/mojo/public/cpp/bindings/tests/remote_unittest.cc
@@ -9,7 +9,6 @@ #include "base/bind_helpers.h" #include "base/callback.h" #include "base/memory/ptr_util.h" -#include "base/message_loop/message_loop.h" #include "base/run_loop.h" #include "base/sequenced_task_runner.h" #include "base/task/post_task.h" @@ -498,7 +497,7 @@ }; TEST(StrongConnectorTest, Math) { - base::MessageLoop loop; + base::test::ScopedTaskEnvironment scoped_task_environment; bool disconnected = false; bool destroyed = false; @@ -574,7 +573,7 @@ }; TEST(WeakConnectorTest, Math) { - base::MessageLoop loop; + base::test::ScopedTaskEnvironment scoped_task_environment; bool disconnected = false; bool destroyed = false;
diff --git a/mojo/public/cpp/bindings/tests/struct_traits_unittest.cc b/mojo/public/cpp/bindings/tests/struct_traits_unittest.cc index e01441fa..2ae29a9 100644 --- a/mojo/public/cpp/bindings/tests/struct_traits_unittest.cc +++ b/mojo/public/cpp/bindings/tests/struct_traits_unittest.cc
@@ -6,8 +6,8 @@ #include "base/callback.h" #include "base/logging.h" #include "base/memory/ptr_util.h" -#include "base/message_loop/message_loop.h" #include "base/run_loop.h" +#include "base/test/scoped_task_environment.h" #include "mojo/public/cpp/bindings/pending_receiver.h" #include "mojo/public/cpp/bindings/receiver_set.h" #include "mojo/public/cpp/bindings/remote.h" @@ -188,7 +188,7 @@ std::move(callback).Run(std::move(u)); } - base::MessageLoop loop_; + base::test::ScopedTaskEnvironment scoped_task_environment_; ChromiumRectServiceImpl chromium_service_; ReceiverSet<RectService> chromium_receivers_;
diff --git a/mojo/public/cpp/bindings/tests/union_unittest.cc b/mojo/public/cpp/bindings/tests/union_unittest.cc index 29889db..9d5406f 100644 --- a/mojo/public/cpp/bindings/tests/union_unittest.cc +++ b/mojo/public/cpp/bindings/tests/union_unittest.cc
@@ -9,8 +9,8 @@ #include "base/bind.h" #include "base/containers/flat_map.h" -#include "base/message_loop/message_loop.h" #include "base/run_loop.h" +#include "base/test/scoped_task_environment.h" #include "mojo/public/cpp/bindings/lib/array_internal.h" #include "mojo/public/cpp/bindings/lib/fixed_buffer.h" #include "mojo/public/cpp/bindings/lib/serialization.h" @@ -1148,7 +1148,7 @@ }; TEST(UnionTest, InterfaceInUnion) { - base::MessageLoop message_loop; + base::test::ScopedTaskEnvironment scoped_task_environment; base::RunLoop run_loop; SmallCacheImpl impl(run_loop.QuitClosure()); Remote<SmallCache> remote; @@ -1164,7 +1164,7 @@ } TEST(UnionTest, InterfaceInUnionFactoryFunction) { - base::MessageLoop message_loop; + base::test::ScopedTaskEnvironment scoped_task_environment; base::RunLoop run_loop; SmallCacheImpl impl(run_loop.QuitClosure()); Remote<SmallCache> remote; @@ -1178,7 +1178,7 @@ } TEST(UnionTest, InterfaceInUnionSerialization) { - base::MessageLoop message_loop; + base::test::ScopedTaskEnvironment scoped_task_environment; base::RunLoop run_loop; SmallCacheImpl impl(run_loop.QuitClosure()); Remote<SmallCache> remote; @@ -1215,7 +1215,7 @@ }; TEST(UnionTest, UnionInInterface) { - base::MessageLoop message_loop; + base::test::ScopedTaskEnvironment scoped_task_environment; UnionInterfaceImpl impl; Remote<UnionInterface> remote; Receiver<UnionInterface> receiver(&impl, remote.BindNewPipeAndPassReceiver());
diff --git a/mojo/public/cpp/bindings/tests/validation_unittest.cc b/mojo/public/cpp/bindings/tests/validation_unittest.cc index 86da0ab..4809df9 100644 --- a/mojo/public/cpp/bindings/tests/validation_unittest.cc +++ b/mojo/public/cpp/bindings/tests/validation_unittest.cc
@@ -11,9 +11,9 @@ #include <vector> #include "base/macros.h" -#include "base/message_loop/message_loop.h" #include "base/numerics/safe_math.h" #include "base/run_loop.h" +#include "base/test/scoped_task_environment.h" #include "base/threading/thread_task_runner_handle.h" #include "mojo/public/c/system/macros.h" #include "mojo/public/cpp/bindings/connector.h" @@ -220,7 +220,7 @@ ValidationTest() {} protected: - base::MessageLoop loop_; + base::test::ScopedTaskEnvironment scoped_task_environment_; }; class ValidationIntegrationTest : public ValidationTest {
diff --git a/mojo/public/cpp/bindings/tests/wtf_types_unittest.cc b/mojo/public/cpp/bindings/tests/wtf_types_unittest.cc index 2abd36b..770b8c85 100644 --- a/mojo/public/cpp/bindings/tests/wtf_types_unittest.cc +++ b/mojo/public/cpp/bindings/tests/wtf_types_unittest.cc
@@ -3,9 +3,9 @@ // found in the LICENSE file. #include "base/bind.h" -#include "base/message_loop/message_loop.h" #include "base/run_loop.h" #include "base/stl_util.h" +#include "base/test/scoped_task_environment.h" #include "mojo/public/cpp/bindings/lib/fixed_buffer.h" #include "mojo/public/cpp/bindings/lib/serialization.h" #include "mojo/public/cpp/bindings/lib/wtf_serialization.h" @@ -59,7 +59,7 @@ WTFTypesTest() {} private: - base::MessageLoop loop_; + base::test::ScopedTaskEnvironment scoped_task_environment_; }; WTF::Vector<WTF::String> ConstructStringArray() {
diff --git a/mojo/public/cpp/system/tests/data_pipe_drainer_unittest.cc b/mojo/public/cpp/system/tests/data_pipe_drainer_unittest.cc index 6215712..b1f97d79 100644 --- a/mojo/public/cpp/system/tests/data_pipe_drainer_unittest.cc +++ b/mojo/public/cpp/system/tests/data_pipe_drainer_unittest.cc
@@ -5,8 +5,8 @@ #include "mojo/public/cpp/system/data_pipe_drainer.h" #include "base/bind.h" #include "base/callback.h" -#include "base/message_loop/message_loop.h" #include "base/run_loop.h" +#include "base/test/scoped_task_environment.h" #include "base/values.h" #include "testing/gtest/include/gtest/gtest.h" @@ -37,7 +37,7 @@ void OnDataComplete() override { completion_callback_.Run(); } - base::MessageLoop message_loop_; + base::test::ScopedTaskEnvironment scoped_task_environment_; std::string data_; std::unique_ptr<DataPipeDrainer> drainer_;
diff --git a/mojo/public/cpp/system/tests/simple_watcher_unittest.cc b/mojo/public/cpp/system/tests/simple_watcher_unittest.cc index a946084..c2e0fed2 100644 --- a/mojo/public/cpp/system/tests/simple_watcher_unittest.cc +++ b/mojo/public/cpp/system/tests/simple_watcher_unittest.cc
@@ -9,8 +9,8 @@ #include "base/bind.h" #include "base/callback.h" #include "base/macros.h" -#include "base/message_loop/message_loop.h" #include "base/run_loop.h" +#include "base/test/scoped_task_environment.h" #include "base/threading/thread_task_runner_handle.h" #include "mojo/public/c/system/types.h" #include "mojo/public/cpp/system/data_pipe.h" @@ -40,7 +40,7 @@ ~SimpleWatcherTest() override {} private: - base::MessageLoop message_loop_; + base::test::ScopedTaskEnvironment scoped_task_environment_; DISALLOW_COPY_AND_ASSIGN(SimpleWatcherTest); };
diff --git a/net/BUILD.gn b/net/BUILD.gn index b10fa57..795e948 100644 --- a/net/BUILD.gn +++ b/net/BUILD.gn
@@ -1001,8 +1001,6 @@ "quic/platform/impl/quic_hostname_utils_impl.cc", "quic/platform/impl/quic_hostname_utils_impl.h", "quic/platform/impl/quic_iovec_impl.h", - "quic/platform/impl/quic_ip_address_impl.cc", - "quic/platform/impl/quic_ip_address_impl.h", "quic/platform/impl/quic_logging_impl.h", "quic/platform/impl/quic_macros_impl.h", "quic/platform/impl/quic_map_util_impl.h", @@ -3082,6 +3080,31 @@ } } +if (use_external_gssapi) { + # In order for the tests to be reliable, these two targets cannot depend on a + # valid GSSAPI library. This is easy to achieve on most platforms. But on + # macOS care must be taken to not depend directly or indirectly on + # GSS.framework. This is suprisingly easy to get wrong since + # Security.framework is such a common dependency and it indirectly depends on + # GSS. + shared_library("test_gssapi") { + testonly = true + sources = [ + "tools/gssapi/gss_import_name.cc", + "tools/gssapi/gss_methods.cc", + "tools/gssapi/gss_types.h", + ] + } + + shared_library("test_badgssapi") { + testonly = true + sources = [ + "tools/gssapi/gss_methods.cc", + "tools/gssapi/gss_types.h", + ] + } +} + if (is_linux || is_mac) { executable("cachetool") { testonly = true @@ -5774,6 +5797,10 @@ "http/mock_gssapi_library_posix.cc", "http/mock_gssapi_library_posix.h", ] + data_deps += [ + ":test_gssapi", + ":test_badgssapi", + ] } if (!use_kerberos) {
diff --git a/net/http/http_auth_gssapi_posix.cc b/net/http/http_auth_gssapi_posix.cc index 6306ab6..e0e3563 100644 --- a/net/http/http_auth_gssapi_posix.cc +++ b/net/http/http_auth_gssapi_posix.cc
@@ -8,6 +8,7 @@ #include <string> #include "base/base64.h" +#include "base/compiler_specific.h" #include "base/files/file_path.h" #include "base/format_macros.h" #include "base/logging.h" @@ -20,12 +21,9 @@ #include "net/http/http_auth_multi_round_parse.h" #include "net/net_buildflags.h" -// These are defined for the GSSAPI library: -// Paraphrasing the comments from gssapi.h: -// "The implementation must reserve static storage for a -// gss_OID_desc object for each constant. That constant -// should be initialized to point to that gss_OID_desc." -// These are encoded using ASN.1 BER encoding. +// Based on RFC 2744 Appendix A (https://tools.ietf.org/html/rfc2744#appendix-A) +// These constants are defined here for use in diagnostics without adding a +// dependency on an external library. namespace { static gss_OID_desc GSS_C_NT_USER_NAME_VAL = { @@ -396,18 +394,7 @@ } // namespace GSSAPISharedLibrary::GSSAPISharedLibrary(const std::string& gssapi_library_name) - : initialized_(false), - gssapi_library_name_(gssapi_library_name), - gssapi_library_(nullptr), - import_name_(nullptr), - release_name_(nullptr), - release_buffer_(nullptr), - display_name_(nullptr), - display_status_(nullptr), - init_sec_context_(nullptr), - wrap_size_limit_(nullptr), - delete_sec_context_(nullptr), - inquire_context_(nullptr) {} + : gssapi_library_name_(gssapi_library_name) {} GSSAPISharedLibrary::~GSSAPISharedLibrary() { if (gssapi_library_) { @@ -474,52 +461,79 @@ base::UnloadNativeLibrary(lib); } else { // If this is the only library available, log the reason for failure. - LOG_IF(WARNING, num_lib_names == 1) << load_error.ToString(); + DLOG_IF(WARNING, num_lib_names == 1) << load_error.ToString(); } } - LOG(WARNING) << "Unable to find a compatible GSSAPI library"; + DLOG(WARNING) << "Unable to find a compatible GSSAPI library"; return nullptr; } #if BUILDFLAG(DLOPEN_KERBEROS) -#define BIND(lib, x) \ - DCHECK(lib); \ - gss_##x##_type x = reinterpret_cast<gss_##x##_type>( \ - base::GetFunctionPointerFromNativeLibrary(lib, "gss_" #x)); \ - if (x == nullptr) { \ - LOG(WARNING) << "Unable to bind function \"" \ - << "gss_" #x << "\""; \ - return false; \ + +namespace { + +template <typename T> +bool BindGssMethod(base::NativeLibrary lib, const char* method, T* receiver) { + *receiver = reinterpret_cast<T>( + base::GetFunctionPointerFromNativeLibrary(lib, method)); + if (*receiver == nullptr) { + DLOG(WARNING) << "Unable to bind function \"" << method << "\""; + return false; } -#else -#define BIND(lib, x) gss_##x##_type x = gss_##x -#endif - -bool GSSAPISharedLibrary::BindMethods(base::NativeLibrary lib) { - BIND(lib, import_name); - BIND(lib, release_name); - BIND(lib, release_buffer); - BIND(lib, display_name); - BIND(lib, display_status); - BIND(lib, init_sec_context); - BIND(lib, wrap_size_limit); - BIND(lib, delete_sec_context); - BIND(lib, inquire_context); - - import_name_ = import_name; - release_name_ = release_name; - release_buffer_ = release_buffer; - display_name_ = display_name; - display_status_ = display_status; - init_sec_context_ = init_sec_context; - wrap_size_limit_ = wrap_size_limit; - delete_sec_context_ = delete_sec_context; - inquire_context_ = inquire_context; - return true; } -#undef BIND +} // namespace + +bool GSSAPISharedLibrary::BindMethods(base::NativeLibrary lib) { + bool rv = true; + // It's unlikely for BindMethods() to fail if LoadNativeLibrary() succeeded. + // A failure in this function indicates an interoperability issue whose + // diagnosis requires knowing all the methods that are missing. Hence |rv| is + // updated in a manner that prevents short-circuiting the BindGssMethod() + // invocations. + rv = BindGssMethod(lib, "gss_delete_sec_context", &delete_sec_context_) && rv; + rv = BindGssMethod(lib, "gss_display_name", &display_name_) && rv; + rv = BindGssMethod(lib, "gss_display_status", &display_status_) && rv; + rv = BindGssMethod(lib, "gss_import_name", &import_name_) && rv; + rv = BindGssMethod(lib, "gss_init_sec_context", &init_sec_context_) && rv; + rv = BindGssMethod(lib, "gss_inquire_context", &inquire_context_) && rv; + rv = BindGssMethod(lib, "gss_release_buffer", &release_buffer_) && rv; + rv = BindGssMethod(lib, "gss_release_name", &release_name_) && rv; + rv = BindGssMethod(lib, "gss_wrap_size_limit", &wrap_size_limit_) && rv; + + if (LIKELY(rv)) + return true; + + delete_sec_context_ = nullptr; + display_name_ = nullptr; + display_status_ = nullptr; + import_name_ = nullptr; + init_sec_context_ = nullptr; + inquire_context_ = nullptr; + release_buffer_ = nullptr; + release_name_ = nullptr; + wrap_size_limit_ = nullptr; + return false; +} + +#else // DLOPEN_KERBEROS + +bool GSSAPISharedLibrary::BindMethods(base::NativeLibrary lib) { + // When not using dlopen(), statically bind to libgssapi methods. + import_name_ = gss_import_name; + release_name_ = gss_release_name; + release_buffer_ = gss_release_buffer; + display_name_ = gss_display_name; + display_status_ = gss_display_status; + init_sec_context_ = gss_init_sec_context; + wrap_size_limit_ = gss_wrap_size_limit; + delete_sec_context_ = gss_delete_sec_context; + inquire_context_ = gss_inquire_context; + return true; +} + +#endif // DLOPEN_KERBEROS OM_uint32 GSSAPISharedLibrary::import_name( OM_uint32* minor_status,
diff --git a/net/http/http_auth_gssapi_posix.h b/net/http/http_auth_gssapi_posix.h index eba04bbd..5284312 100644 --- a/net/http/http_auth_gssapi_posix.h +++ b/net/http/http_auth_gssapi_posix.h
@@ -167,16 +167,6 @@ const std::string& GetLibraryNameForTesting() override; private: - typedef decltype(&gss_import_name) gss_import_name_type; - typedef decltype(&gss_release_name) gss_release_name_type; - typedef decltype(&gss_release_buffer) gss_release_buffer_type; - typedef decltype(&gss_display_name) gss_display_name_type; - typedef decltype(&gss_display_status) gss_display_status_type; - typedef decltype(&gss_init_sec_context) gss_init_sec_context_type; - typedef decltype(&gss_wrap_size_limit) gss_wrap_size_limit_type; - typedef decltype(&gss_delete_sec_context) gss_delete_sec_context_type; - typedef decltype(&gss_inquire_context) gss_inquire_context_type; - FRIEND_TEST_ALL_PREFIXES(HttpAuthGSSAPIPOSIXTest, GSSAPIStartup); bool InitImpl(); @@ -186,22 +176,22 @@ base::NativeLibrary LoadSharedLibrary(); bool BindMethods(base::NativeLibrary lib); - bool initialized_; + bool initialized_ = false; std::string gssapi_library_name_; // Need some way to invalidate the library. - base::NativeLibrary gssapi_library_; + base::NativeLibrary gssapi_library_ = nullptr; // Function pointers - gss_import_name_type import_name_; - gss_release_name_type release_name_; - gss_release_buffer_type release_buffer_; - gss_display_name_type display_name_; - gss_display_status_type display_status_; - gss_init_sec_context_type init_sec_context_; - gss_wrap_size_limit_type wrap_size_limit_; - gss_delete_sec_context_type delete_sec_context_; - gss_inquire_context_type inquire_context_; + decltype(&gss_import_name) import_name_ = nullptr; + decltype(&gss_release_name) release_name_ = nullptr; + decltype(&gss_release_buffer) release_buffer_ = nullptr; + decltype(&gss_display_name) display_name_ = nullptr; + decltype(&gss_display_status) display_status_ = nullptr; + decltype(&gss_init_sec_context) init_sec_context_ = nullptr; + decltype(&gss_wrap_size_limit) wrap_size_limit_ = nullptr; + decltype(&gss_delete_sec_context) delete_sec_context_ = nullptr; + decltype(&gss_inquire_context) inquire_context_ = nullptr; }; // ScopedSecurityContext releases a gss_ctx_id_t when it goes out of
diff --git a/net/http/http_auth_gssapi_posix_unittest.cc b/net/http/http_auth_gssapi_posix_unittest.cc index 26d90f3..8a557f8 100644 --- a/net/http/http_auth_gssapi_posix_unittest.cc +++ b/net/http/http_auth_gssapi_posix_unittest.cc
@@ -6,9 +6,11 @@ #include <memory> +#include "base/base_paths.h" #include "base/bind.h" #include "base/logging.h" #include "base/native_library.h" +#include "base/path_service.h" #include "base/stl_util.h" #include "net/base/net_errors.h" #include "net/http/http_auth_challenge_tokenizer.h" @@ -92,11 +94,42 @@ } #if BUILDFLAG(DLOPEN_KERBEROS) -TEST(HttpAuthGSSAPIPOSIXTest, GSSAPILoadCustomLibrary) { +TEST(HttpAuthGSSAPIPOSIXTest, CustomLibraryMissing) { std::unique_ptr<GSSAPILibrary> gssapi( new GSSAPISharedLibrary("/this/library/does/not/exist")); EXPECT_FALSE(gssapi.get()->Init()); } + +TEST(HttpAuthGSSAPIPOSIXTest, CustomLibraryExists) { + base::FilePath module; + ASSERT_TRUE(base::PathService::Get(base::DIR_MODULE, &module)); + auto basename = base::GetNativeLibraryName("test_gssapi"); + module = module.AppendASCII(basename); + auto gssapi = std::make_unique<GSSAPISharedLibrary>(module.value()); + EXPECT_TRUE(gssapi.get()->Init()); +} + +TEST(HttpAuthGSSAPIPOSIXTest, CustomLibraryMethodsMissing) { + base::FilePath module; + ASSERT_TRUE(base::PathService::Get(base::DIR_MODULE, &module)); + auto basename = base::GetNativeLibraryName("test_badgssapi"); + module = module.AppendASCII(basename); + auto gssapi = std::make_unique<GSSAPISharedLibrary>(module.value()); + + // Are you here because this test mysteriously passed even though the library + // doesn't actually have all the methods we need? This could be because the + // test library (//net:test_badgssapi) inadvertently depends on a valid GSSAPI + // library. On macOS this can happen because it's pretty easy to end up + // depending on GSS.framework. + // + // To resolve this issue, make sure that //net:test_badgssapi target in + // //net/BUILD.gn should have an empty `deps` and an empty `libs`. + EXPECT_FALSE(gssapi.get()->Init()); + + // Logs something like "gss_import_name" during loading process. + // TODO(asanka): Once GSSAPI library loading starts emitting NetLogs verify + // that the missing method is correctly identified. +} #endif // DLOPEN_KERBEROS TEST(HttpAuthGSSAPIPOSIXTest, GSSAPICycle) {
diff --git a/net/quic/bidirectional_stream_quic_impl_unittest.cc b/net/quic/bidirectional_stream_quic_impl_unittest.cc index 718cf5b..44a6697 100644 --- a/net/quic/bidirectional_stream_quic_impl_unittest.cc +++ b/net/quic/bidirectional_stream_quic_impl_unittest.cc
@@ -555,28 +555,18 @@ return server_maker_.GetResponseHeaders(response_code); } - std::unique_ptr<quic::QuicReceivedPacket> ConstructDataPacket( - uint64_t packet_number, - bool should_include_version, - bool fin, - quic::QuicStreamOffset offset, - quic::QuicStringPiece data, - QuicTestPacketMaker* maker) { - std::unique_ptr<quic::QuicReceivedPacket> packet(maker->MakeDataPacket( - packet_number, stream_id_, should_include_version, fin, offset, data)); - DVLOG(2) << "packet(" << packet_number << "): " << std::endl - << quic::QuicTextUtils::HexDump(packet->AsStringPiece()); - return packet; - } std::unique_ptr<quic::QuicReceivedPacket> ConstructServerDataPacket( uint64_t packet_number, bool should_include_version, bool fin, - quic::QuicStreamOffset offset, quic::QuicStringPiece data) { - return ConstructDataPacket(packet_number, should_include_version, fin, - offset, data, &server_maker_); + std::unique_ptr<quic::QuicReceivedPacket> packet( + server_maker_.MakeDataPacket(packet_number, stream_id_, + should_include_version, fin, data)); + DVLOG(2) << "packet(" << packet_number << "): " << std::endl + << quic::QuicTextUtils::HexDump(packet->AsStringPiece()); + return packet; } // Construct a data packet with multiple data frames @@ -585,12 +575,11 @@ uint64_t packet_number, bool should_include_version, bool fin, - quic::QuicStreamOffset offset, const std::vector<std::string>& data_writes) { std::unique_ptr<quic::QuicReceivedPacket> packet( client_maker_.MakeMultipleDataFramesPacket(packet_number, stream_id_, should_include_version, fin, - offset, data_writes)); + data_writes)); DVLOG(2) << "packet(" << packet_number << "): " << std::endl << quic::QuicTextUtils::HexDump(packet->AsStringPiece()); return packet; @@ -735,13 +724,12 @@ uint64_t smallest_received, uint64_t least_unacked, bool fin, - quic::QuicStreamOffset offset, quic::QuicStringPiece data, QuicTestPacketMaker* maker) { std::unique_ptr<quic::QuicReceivedPacket> packet( maker->MakeAckAndDataPacket( packet_number, should_include_version, stream_id_, largest_received, - smallest_received, least_unacked, fin, offset, data)); + smallest_received, least_unacked, fin, data)); DVLOG(2) << "packet(" << packet_number << "): " << std::endl << quic::QuicTextUtils::HexDump(packet->AsStringPiece()); return packet; @@ -755,12 +743,11 @@ uint64_t smallest_received, uint64_t least_unacked, bool fin, - quic::QuicStreamOffset offset, const std::vector<std::string> data_writes) { std::unique_ptr<quic::QuicReceivedPacket> packet( client_maker_.MakeAckAndMultipleDataFramesPacket( packet_number, should_include_version, stream_id_, largest_received, - smallest_received, least_unacked, fin, offset, data_writes)); + smallest_received, least_unacked, fin, data_writes)); DVLOG(2) << "packet(" << packet_number << "): " << std::endl << quic::QuicTextUtils::HexDump(packet->AsStringPiece()); return packet; @@ -912,7 +899,7 @@ const char kResponseBody[] = "Hello world!"; // Server sends data. std::string header = ConstructDataHeader(strlen(kResponseBody)); - ProcessPacket(ConstructServerDataPacket(3, !kIncludeVersion, !kFin, 0, + ProcessPacket(ConstructServerDataPacket(3, !kIncludeVersion, !kFin, header + kResponseBody)); EXPECT_EQ(12, cb.WaitForResult()); @@ -1050,10 +1037,10 @@ &spdy_request_headers_frame_length)); if (version_.transport_version != quic::QUIC_VERSION_99) { AddWrite(ConstructClientMultipleDataFramesPacket(3, kIncludeVersion, !kFin, - 0, {kBody1, kBody2})); + {kBody1, kBody2})); } else { AddWrite(ConstructClientMultipleDataFramesPacket( - 3, kIncludeVersion, !kFin, 0, {header, kBody1, header2, kBody2})); + 3, kIncludeVersion, !kFin, {header, kBody1, header2, kBody2})); } // Ack server's data packet. @@ -1064,14 +1051,12 @@ std::string header3 = ConstructDataHeader(strlen(kBody3)); std::string header4 = ConstructDataHeader(strlen(kBody4)); std::string header5 = ConstructDataHeader(strlen(kBody5)); - quic::QuicStreamOffset data_offset = - strlen(kBody1) + strlen(kBody2) + header.length() + header2.length(); if (version_.transport_version != quic::QUIC_VERSION_99) { - AddWrite(ConstructClientMultipleDataFramesPacket( - 5, !kIncludeVersion, kFin, data_offset, {kBody3, kBody4, kBody5})); + AddWrite(ConstructClientMultipleDataFramesPacket(5, !kIncludeVersion, kFin, + {kBody3, kBody4, kBody5})); } else { AddWrite(ConstructClientMultipleDataFramesPacket( - 5, !kIncludeVersion, kFin, data_offset, + 5, !kIncludeVersion, kFin, {header3, kBody3, header4, kBody4, header5, kBody5})); } @@ -1126,7 +1111,7 @@ const char kResponseBody[] = "Hello world!"; std::string header6 = ConstructDataHeader(strlen(kResponseBody)); // Server sends data. - ProcessPacket(ConstructServerDataPacket(3, !kIncludeVersion, !kFin, 0, + ProcessPacket(ConstructServerDataPacket(3, !kIncludeVersion, !kFin, header6 + kResponseBody)); EXPECT_EQ(static_cast<int>(strlen(kResponseBody)), cb.WaitForResult()); @@ -1195,13 +1180,12 @@ AddWrite(ConstructClientAckPacket(3, 3, 1, 2)); const char kBody2[] = "really small"; std::string header2 = ConstructDataHeader(strlen(kBody2)); - quic::QuicStreamOffset data_offset = strlen(kBody1) + header.length(); if (version_.transport_version == quic::QUIC_VERSION_99) { - AddWrite(ConstructClientMultipleDataFramesPacket( - 4, !kIncludeVersion, kFin, data_offset, {header2, kBody2})); + AddWrite(ConstructClientMultipleDataFramesPacket(4, !kIncludeVersion, kFin, + {header2, kBody2})); } else { AddWrite(ConstructClientMultipleDataFramesPacket(4, !kIncludeVersion, kFin, - data_offset, {kBody2})); + {kBody2})); } Initialize(); @@ -1247,7 +1231,7 @@ const char kResponseBody[] = "Hello world!"; // Server sends data. std::string header3 = ConstructDataHeader(strlen(kResponseBody)); - ProcessPacket(ConstructServerDataPacket(3, !kIncludeVersion, !kFin, 0, + ProcessPacket(ConstructServerDataPacket(3, !kIncludeVersion, !kFin, header3 + kResponseBody)); EXPECT_EQ(static_cast<int>(strlen(kResponseBody)), cb.WaitForResult()); @@ -1316,15 +1300,13 @@ std::string header3 = ConstructDataHeader(strlen(kBody3)); std::string header4 = ConstructDataHeader(strlen(kBody4)); std::string header5 = ConstructDataHeader(strlen(kBody5)); - quic::QuicStreamOffset data_offset = - strlen(kBody1) + strlen(kBody2) + header.length() + header2.length(); if (version_.transport_version == quic::QUIC_VERSION_99) { AddWrite(ConstructClientMultipleDataFramesPacket( - 4, !kIncludeVersion, kFin, data_offset, + 4, !kIncludeVersion, kFin, {header3, kBody3, header4, kBody4, header5, kBody5})); } else { - AddWrite(ConstructClientMultipleDataFramesPacket( - 4, !kIncludeVersion, kFin, data_offset, {kBody3, kBody4, kBody5})); + AddWrite(ConstructClientMultipleDataFramesPacket(4, !kIncludeVersion, kFin, + {kBody3, kBody4, kBody5})); } Initialize(); @@ -1373,7 +1355,7 @@ const char kResponseBody[] = "Hello world!"; std::string header6 = ConstructDataHeader(strlen(kResponseBody)); // Server sends data. - ProcessPacket(ConstructServerDataPacket(3, !kIncludeVersion, !kFin, 0, + ProcessPacket(ConstructServerDataPacket(3, !kIncludeVersion, !kFin, header6 + kResponseBody)); EXPECT_EQ(static_cast<int>(strlen(kResponseBody)), cb.WaitForResult()); @@ -1503,10 +1485,10 @@ std::string header = ConstructDataHeader(strlen(kUploadData)); if (version_.transport_version == quic::QUIC_VERSION_99) { AddWrite(ConstructClientMultipleDataFramesPacket(3, kIncludeVersion, kFin, - 0, {header, kUploadData})); + {header, kUploadData})); } else { AddWrite(ConstructClientMultipleDataFramesPacket(3, kIncludeVersion, kFin, - 0, {kUploadData})); + {kUploadData})); } AddWrite(ConstructClientAckPacket(4, 3, 1, 2)); @@ -1553,7 +1535,7 @@ const char kResponseBody[] = "Hello world!"; std::string header2 = ConstructDataHeader(strlen(kResponseBody)); // Server sends data. - ProcessPacket(ConstructServerDataPacket(3, !kIncludeVersion, !kFin, 0, + ProcessPacket(ConstructServerDataPacket(3, !kIncludeVersion, !kFin, header2 + kResponseBody)); EXPECT_EQ(static_cast<int>(strlen(kResponseBody)), cb.WaitForResult()); @@ -1594,10 +1576,10 @@ std::string header = ConstructDataHeader(strlen(kUploadData)); if (version_.transport_version == quic::QUIC_VERSION_99) { AddWrite(ConstructClientMultipleDataFramesPacket(3, kIncludeVersion, kFin, - 0, {header, kUploadData})); + {header, kUploadData})); } else { AddWrite(ConstructClientMultipleDataFramesPacket(3, kIncludeVersion, kFin, - 0, {kUploadData})); + {kUploadData})); } AddWrite(ConstructClientAckPacket(4, 3, 1, 2)); @@ -1645,7 +1627,7 @@ const char kResponseBody[] = "Hello world!"; // Server sends data. std::string header2 = ConstructDataHeader(strlen(kResponseBody)); - ProcessPacket(ConstructServerDataPacket(3, !kIncludeVersion, !kFin, 0, + ProcessPacket(ConstructServerDataPacket(3, !kIncludeVersion, !kFin, header2 + kResponseBody)); EXPECT_EQ(static_cast<int>(strlen(kResponseBody)), cb.WaitForResult()); @@ -1686,17 +1668,15 @@ std::string header = ConstructDataHeader(strlen(kUploadData)); if (version_.transport_version != quic::QUIC_VERSION_99) { - AddWrite(ConstructAckAndDataPacket(3, !kIncludeVersion, 2, 1, 2, !kFin, 0, + AddWrite(ConstructAckAndDataPacket(3, !kIncludeVersion, 2, 1, 2, !kFin, kUploadData, &client_maker_)); AddWrite(ConstructAckAndDataPacket(4, !kIncludeVersion, 3, 3, 3, kFin, - strlen(kUploadData), kUploadData, - &client_maker_)); + kUploadData, &client_maker_)); } else { AddWrite(ConstructAckAndMultipleDataFramesPacket( - 3, !kIncludeVersion, 2, 1, 1, !kFin, 0, {header, kUploadData})); + 3, !kIncludeVersion, 2, 1, 1, !kFin, {header, kUploadData})); AddWrite(ConstructAckAndMultipleDataFramesPacket( - 4, !kIncludeVersion, 3, 3, 3, kFin, - strlen(kUploadData) + header.length(), {header, kUploadData})); + 4, !kIncludeVersion, 3, 3, 3, kFin, {header, kUploadData})); } Initialize(); @@ -1743,7 +1723,7 @@ std::string header2 = ConstructDataHeader(strlen(kResponseBody)); // Server sends a data packet. ProcessPacket(ConstructAckAndDataPacket(3, !kIncludeVersion, 2, 1, 1, !kFin, - 0, header2 + kResponseBody, + header2 + kResponseBody, &server_maker_)); EXPECT_EQ(static_cast<int64_t>(strlen(kResponseBody)), cb.WaitForResult()); @@ -1756,10 +1736,10 @@ TestCompletionCallback cb2; rv = delegate->ReadData(cb2.callback()); EXPECT_THAT(rv, IsError(ERR_IO_PENDING)); - ProcessPacket( - ConstructAckAndDataPacket(4, !kIncludeVersion, 3, 1, 1, kFin, - strlen(kResponseBody) + header2.length(), - header2 + kResponseBody, &server_maker_)); + ProcessPacket(ConstructAckAndDataPacket(4, !kIncludeVersion, 3, 1, 1, kFin, + + header2 + kResponseBody, + &server_maker_)); EXPECT_EQ(static_cast<int64_t>(strlen(kResponseBody)), cb2.WaitForResult()); @@ -2204,7 +2184,7 @@ const char kResponseBody[] = "Hello world!"; std::string header = ConstructDataHeader(strlen(kResponseBody)); // Server sends data. - ProcessPacket(ConstructServerDataPacket(3, !kIncludeVersion, !kFin, 0, + ProcessPacket(ConstructServerDataPacket(3, !kIncludeVersion, !kFin, header + kResponseBody)); EXPECT_EQ(static_cast<int64_t>(strlen(kResponseBody)), cb.WaitForResult()); @@ -2225,10 +2205,10 @@ std::string header = ConstructDataHeader(strlen(kBody)); if (version_.transport_version == quic::QUIC_VERSION_99) { AddWrite(ConstructClientMultipleDataFramesPacket(3, kIncludeVersion, kFin, - 0, {header, kBody})); + {header, kBody})); } else { AddWrite(ConstructClientMultipleDataFramesPacket(3, kIncludeVersion, kFin, - 0, {kBody})); + {kBody})); } AddWrite(ConstructClientAckPacket(4, 3, 1, 2)); @@ -2280,7 +2260,7 @@ // Server sends data with the fin set, which should result in the stream // being closed and hence no RST_STREAM will be sent. - ProcessPacket(ConstructServerDataPacket(3, !kIncludeVersion, kFin, 0, + ProcessPacket(ConstructServerDataPacket(3, !kIncludeVersion, kFin, header2 + kResponseBody)); EXPECT_EQ(static_cast<int64_t>(strlen(kResponseBody)), cb.WaitForResult()); @@ -2338,7 +2318,7 @@ // Server sends data. std::string header = ConstructDataHeader(strlen(kResponseBody)); - ProcessPacket(ConstructServerDataPacket(3, !kIncludeVersion, !kFin, 0, + ProcessPacket(ConstructServerDataPacket(3, !kIncludeVersion, !kFin, header + kResponseBody)); EXPECT_EQ(static_cast<int64_t>(strlen(kResponseBody)), cb.WaitForResult());
diff --git a/net/quic/platform/impl/quic_ip_address_impl.cc b/net/quic/platform/impl/quic_ip_address_impl.cc deleted file mode 100644 index 37fa742..0000000 --- a/net/quic/platform/impl/quic_ip_address_impl.cc +++ /dev/null
@@ -1,153 +0,0 @@ -// Copyright (c) 2016 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 "net/quic/platform/impl/quic_ip_address_impl.h" - -#include "build/build_config.h" -#include "net/base/address_family.h" -#include "net/third_party/quiche/src/quic/platform/api/quic_bug_tracker.h" - -#if defined(OS_WIN) -#include <winsock2.h> -#include <ws2bth.h> -#elif defined(OS_POSIX) || defined(OS_FUCHSIA) -#include <netinet/in.h> -#endif - -using std::string; - -namespace quic { - -QuicIpAddressImpl QuicIpAddressImpl::Loopback4() { - return QuicIpAddressImpl(net::IPAddress::IPv4Localhost()); -} - -QuicIpAddressImpl QuicIpAddressImpl::Loopback6() { - return QuicIpAddressImpl(net::IPAddress::IPv6Localhost()); -} - -QuicIpAddressImpl QuicIpAddressImpl::Any4() { - return QuicIpAddressImpl(net::IPAddress::IPv4AllZeros()); -} - -QuicIpAddressImpl QuicIpAddressImpl::Any6() { - return QuicIpAddressImpl(net::IPAddress::IPv6AllZeros()); -} - -QuicIpAddressImpl::QuicIpAddressImpl(const net::IPAddress& addr) - : ip_address_(addr) {} - -static_assert(sizeof(in_addr) == 32 / 8, "in_addr must be 32-bit long"); -QuicIpAddressImpl::QuicIpAddressImpl(const in_addr& ipv4_address) - : ip_address_(reinterpret_cast<const uint8_t*>(&ipv4_address), - sizeof(in_addr)) {} - -static_assert(sizeof(in6_addr) == 128 / 8, "in6_addr must be 128-bit long"); -QuicIpAddressImpl::QuicIpAddressImpl(const in6_addr& ipv6_address) - : ip_address_(reinterpret_cast<const uint8_t*>(&ipv6_address), - sizeof(in6_addr)) {} - -bool operator==(QuicIpAddressImpl lhs, QuicIpAddressImpl rhs) { - return lhs.ip_address_ == rhs.ip_address_; -} - -bool operator!=(QuicIpAddressImpl lhs, QuicIpAddressImpl rhs) { - return !(lhs == rhs); -} - -bool QuicIpAddressImpl::IsInitialized() const { - return net::GetAddressFamily(ip_address_) != net::ADDRESS_FAMILY_UNSPECIFIED; -} - -IpAddressFamily QuicIpAddressImpl::address_family() const { - switch (net::GetAddressFamily(ip_address_)) { - case net::ADDRESS_FAMILY_IPV4: - return IpAddressFamily::IP_V4; - case net::ADDRESS_FAMILY_IPV6: - return IpAddressFamily::IP_V6; - case net::ADDRESS_FAMILY_UNSPECIFIED: - break; - default: - QUIC_BUG << "Invalid address family " - << net::GetAddressFamily(ip_address_); - } - return IpAddressFamily::IP_UNSPEC; -} - -int QuicIpAddressImpl::AddressFamilyToInt() const { - switch (ip_address_.size()) { - case net::IPAddress::kIPv4AddressSize: - return AF_INET; - case net::IPAddress::kIPv6AddressSize: - return AF_INET6; - default: - NOTREACHED() << "Bad IP address"; - return AF_UNSPEC; - } -} - -string QuicIpAddressImpl::ToPackedString() const { - return net::IPAddressToPackedString(ip_address_); -} - -string QuicIpAddressImpl::ToString() const { - if (!IsInitialized()) { - return "Uninitialized address"; - } - return ip_address_.ToString(); -} - -QuicIpAddressImpl QuicIpAddressImpl::Normalized() const { - if (ip_address_.IsIPv4MappedIPv6()) { - return QuicIpAddressImpl(ConvertIPv4MappedIPv6ToIPv4(ip_address_)); - } - return QuicIpAddressImpl(ip_address_); -} - -QuicIpAddressImpl QuicIpAddressImpl::DualStacked() const { - if (ip_address_.IsIPv4()) { - return QuicIpAddressImpl(ConvertIPv4ToIPv4MappedIPv6(ip_address_)); - } - return QuicIpAddressImpl(ip_address_); -} - -bool QuicIpAddressImpl::FromPackedString(const char* data, size_t length) { - if (length != net::IPAddress::kIPv4AddressSize && - length != net::IPAddress::kIPv6AddressSize) { - QUIC_BUG << "Invalid packed IP address of length " << length; - return false; - } - ip_address_ = net::IPAddress(reinterpret_cast<const uint8_t*>(data), length); - return true; -} - -bool QuicIpAddressImpl::FromString(string str) { - return ip_address_.AssignFromIPLiteral(str); -} - -bool QuicIpAddressImpl::IsIPv4() const { - return ip_address_.IsIPv4(); -} - -bool QuicIpAddressImpl::IsIPv6() const { - return ip_address_.IsIPv6(); -} - -bool QuicIpAddressImpl::InSameSubnet(const QuicIpAddressImpl& other, - int subnet_length) { - return net::IPAddressMatchesPrefix(ip_address_, other.ip_address(), - subnet_length); -} - -in_addr QuicIpAddressImpl::GetIPv4() const { - DCHECK_EQ(sizeof(in_addr), ip_address_.bytes().size()); - return *(reinterpret_cast<const in_addr*>(ip_address_.bytes().data())); -} - -in6_addr QuicIpAddressImpl::GetIPv6() const { - DCHECK_EQ(sizeof(in6_addr), ip_address_.bytes().size()); - return *(reinterpret_cast<const in6_addr*>(ip_address_.bytes().data())); -} - -} // namespace quic
diff --git a/net/quic/platform/impl/quic_ip_address_impl.h b/net/quic/platform/impl/quic_ip_address_impl.h deleted file mode 100644 index 84579fe..0000000 --- a/net/quic/platform/impl/quic_ip_address_impl.h +++ /dev/null
@@ -1,71 +0,0 @@ -// Copyright (c) 2016 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 NET_QUIC_PLATFORM_IMPL_QUIC_IP_ADDRESS_IMPL_H_ -#define NET_QUIC_PLATFORM_IMPL_QUIC_IP_ADDRESS_IMPL_H_ - -#include "build/build_config.h" - -#include <string> - -#if defined(_WIN32) -#include <winsock2.h> -#include <ws2tcpip.h> -#else -#include <netinet/in.h> -#include <sys/socket.h> -#include <sys/types.h> -#endif - -#include "net/base/ip_address.h" -#include "net/third_party/quiche/src/quic/platform/api/quic_export.h" -#include "net/third_party/quiche/src/quic/platform/api/quic_ip_address_family.h" - -namespace quic { - -class QUIC_EXPORT_PRIVATE QuicIpAddressImpl { - public: - enum : size_t { - kIPv4AddressSize = net::IPAddress::kIPv4AddressSize, - kIPv6AddressSize = net::IPAddress::kIPv6AddressSize - }; - static QuicIpAddressImpl Loopback4(); - static QuicIpAddressImpl Loopback6(); - static QuicIpAddressImpl Any4(); - static QuicIpAddressImpl Any6(); - - QuicIpAddressImpl() = default; - QuicIpAddressImpl(const QuicIpAddressImpl& other) = default; - explicit QuicIpAddressImpl(const net::IPAddress& addr); - explicit QuicIpAddressImpl(const in_addr& ipv4_address); - explicit QuicIpAddressImpl(const in6_addr& ipv6_address); - QuicIpAddressImpl& operator=(const QuicIpAddressImpl& other) = default; - QuicIpAddressImpl& operator=(QuicIpAddressImpl&& other) = default; - friend bool operator==(QuicIpAddressImpl lhs, QuicIpAddressImpl rhs); - friend bool operator!=(QuicIpAddressImpl lhs, QuicIpAddressImpl rhs); - - bool IsInitialized() const; - IpAddressFamily address_family() const; - int AddressFamilyToInt() const; - std::string ToPackedString() const; - std::string ToString() const; - QuicIpAddressImpl Normalized() const; - QuicIpAddressImpl DualStacked() const; - bool FromPackedString(const char* data, size_t length); - bool FromString(std::string str); - bool IsIPv4() const; - bool IsIPv6() const; - bool InSameSubnet(const QuicIpAddressImpl& other, int subnet_length); - - in_addr GetIPv4() const; - in6_addr GetIPv6() const; - const net::IPAddress& ip_address() const { return ip_address_; } - - private: - net::IPAddress ip_address_; -}; - -} // namespace quic - -#endif // NET_QUIC_PLATFORM_IMPL_QUIC_IP_ADDRESS_IMPL_H_
diff --git a/net/quic/platform/impl/quic_socket_address_impl.cc b/net/quic/platform/impl/quic_socket_address_impl.cc index 952a182..b511ab3 100644 --- a/net/quic/platform/impl/quic_socket_address_impl.cc +++ b/net/quic/platform/impl/quic_socket_address_impl.cc
@@ -78,8 +78,8 @@ return QuicSocketAddressImpl(); } -QuicIpAddressImpl QuicSocketAddressImpl::host() const { - return QuicIpAddressImpl(socket_address_.address()); +QuicIpAddress QuicSocketAddressImpl::host() const { + return ToQuicIpAddress(socket_address_.address()); } uint16_t QuicSocketAddressImpl::port() const {
diff --git a/net/quic/platform/impl/quic_socket_address_impl.h b/net/quic/platform/impl/quic_socket_address_impl.h index a6fa5439..056501c 100644 --- a/net/quic/platform/impl/quic_socket_address_impl.h +++ b/net/quic/platform/impl/quic_socket_address_impl.h
@@ -32,7 +32,7 @@ int FromSocket(int fd); QuicSocketAddressImpl Normalized() const; - QuicIpAddressImpl host() const; + QuicIpAddress host() const; uint16_t port() const; sockaddr_storage generic_address() const;
diff --git a/net/quic/platform/impl/quic_test_loopback_impl.cc b/net/quic/platform/impl/quic_test_loopback_impl.cc index 878a31f..f339bf1a 100644 --- a/net/quic/platform/impl/quic_test_loopback_impl.cc +++ b/net/quic/platform/impl/quic_test_loopback_impl.cc
@@ -11,20 +11,22 @@ } QuicIpAddress TestLoopback4Impl() { - return QuicIpAddress(QuicIpAddressImpl(net::IPAddress::IPv4Localhost())); + return QuicIpAddress::Loopback4(); } QuicIpAddress TestLoopback6Impl() { - return QuicIpAddress(QuicIpAddressImpl(net::IPAddress::IPv6Localhost())); + return QuicIpAddress::Loopback6(); } QuicIpAddress TestLoopbackImpl() { - return QuicIpAddress(QuicIpAddressImpl(net::IPAddress::IPv4Localhost())); + return QuicIpAddress::Loopback4(); } QuicIpAddress TestLoopbackImpl(int index) { - const uint8_t kLocalhostIPv4[] = {127, 0, 0, index}; - return QuicIpAddress(QuicIpAddressImpl(net::IPAddress(kLocalhostIPv4))); + const char kLocalhostIPv4[] = {127, 0, 0, index}; + QuicIpAddress address; + address.FromPackedString(kLocalhostIPv4, 4); + return address; } } // namespace quic
diff --git a/net/quic/quic_chromium_client_session.cc b/net/quic/quic_chromium_client_session.cc index be2baea..d808a2a 100644 --- a/net/quic/quic_chromium_client_session.cc +++ b/net/quic/quic_chromium_client_session.cc
@@ -1427,13 +1427,14 @@ void QuicChromiumClientSession::CloseStream(quic::QuicStreamId stream_id) { most_recent_stream_close_time_ = tick_clock_->NowTicks(); - quic::QuicStream* stream = GetOrCreateStream(stream_id); - if (stream) { - logger_->UpdateReceivedFrameCounts(stream_id, stream->num_frames_received(), - stream->num_duplicate_frames_received()); + auto it = dynamic_streams().find(stream_id); + if (it != dynamic_streams().end()) { + logger_->UpdateReceivedFrameCounts( + stream_id, it->second->num_frames_received(), + it->second->num_duplicate_frames_received()); if (quic::QuicUtils::IsServerInitiatedStreamId( connection()->transport_version(), stream_id)) { - bytes_pushed_count_ += stream->stream_bytes_read(); + bytes_pushed_count_ += it->second->stream_bytes_read(); } } quic::QuicSpdySession::CloseStream(stream_id);
diff --git a/net/quic/quic_chromium_client_session_test.cc b/net/quic/quic_chromium_client_session_test.cc index 79cf49c..bcf7bed 100644 --- a/net/quic/quic_chromium_client_session_test.cc +++ b/net/quic/quic_chromium_client_session_test.cc
@@ -1037,6 +1037,34 @@ session_->OnRstStream(rst); } +// Regression test for crbug.com/971361. +TEST_P(QuicChromiumClientSessionTest, ClosePendingStream) { + if (!quic::VersionHasStreamType(version_.transport_version)) + return; + + MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)}; + std::unique_ptr<quic::QuicEncryptedPacket> settings_packet( + client_maker_.MakeInitialSettingsPacket(1)); + std::unique_ptr<quic::QuicEncryptedPacket> client_rst( + client_maker_.MakeRstPacket( + 2, true, GetNthServerInitiatedUnidirectionalStreamId(0), + quic::QUIC_RST_ACKNOWLEDGEMENT)); + + MockWrite writes[] = { + MockWrite(ASYNC, settings_packet->data(), settings_packet->length(), 1), + MockWrite(ASYNC, client_rst->data(), client_rst->length(), 2)}; + socket_data_.reset(new SequencedSocketData(reads, writes)); + + Initialize(); + CompleteCryptoHandshake(); + + quic::QuicStreamId id = GetNthServerInitiatedUnidirectionalStreamId(0); + quic::QuicStreamFrame data(id, false, 1, quic::QuicStringPiece("SP")); + session_->OnStreamFrame(data); + EXPECT_EQ(0u, session_->GetNumOpenIncomingStreams()); + session_->CloseStream(id); +} + TEST_P(QuicChromiumClientSessionTest, CancelPushWhenPendingValidation) { MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)}; std::unique_ptr<quic::QuicEncryptedPacket> settings_packet( @@ -1486,7 +1514,7 @@ std::unique_ptr<quic::QuicEncryptedPacket> ack_and_data_out; client_ping = client_maker_.MakeAckAndPingPacket(2, false, 1, 1, 1); ack_and_data_out = client_maker_.MakeDataPacket( - 3, GetNthClientInitiatedBidirectionalStreamId(0), false, false, 0, + 3, GetNthClientInitiatedBidirectionalStreamId(0), false, false, quic::QuicStringPiece(data)); std::unique_ptr<quic::QuicEncryptedPacket> server_ping( server_maker_.MakePingPacket(1, /*include_version=*/false));
diff --git a/net/quic/quic_flags_list.h b/net/quic/quic_flags_list.h index 9f68e2cf..d8c39d4 100644 --- a/net/quic/quic_flags_list.h +++ b/net/quic/quic_flags_list.h
@@ -25,11 +25,6 @@ // no configured limit. QUIC_FLAG(int64_t, FLAGS_quic_time_wait_list_max_connections, 600000) -// Enables server-side support for QUIC stateless rejects. -QUIC_FLAG(bool, - FLAGS_quic_reloadable_flag_enable_quic_stateless_reject_support, - false) - // If true, require handshake confirmation for QUIC connections, functionally // disabling 0-rtt handshakes. // TODO(rtenneti): Enable this flag after CryptoServerTest's are fixed. @@ -43,12 +38,6 @@ // If true, enforce that QUIC CHLOs fit in one packet. QUIC_FLAG(bool, FLAGS_quic_enforce_single_packet_chlo, true) -// If true, QUIC will use cheap stateless rejects without creating a full -// connection. -QUIC_FLAG(bool, - FLAGS_quic_reloadable_flag_quic_use_cheap_stateless_rejects, - false) - // If true, allows packets to be buffered in anticipation of a future CHLO, and // allow CHLO packets to be buffered until next iteration of the event loop. QUIC_FLAG(bool, FLAGS_quic_allow_chlo_buffering, true) @@ -227,7 +216,7 @@ // reconnection. QUIC_FLAG(bool, FLAGS_quic_reloadable_flag_quic_no_client_conn_ver_negotiation, - false) + true) // If true, public reset packets sent from GFE will include a kEPID tag. QUIC_FLAG(bool, FLAGS_quic_reloadable_flag_quic_fix_spurious_ack_alarm, false) @@ -252,17 +241,6 @@ // If true, use one loss algorithm per encryption level. QUIC_FLAG(bool, FLAGS_quic_reloadable_flag_quic_use_uber_loss_algorithm, true) -// If true, QuicStreamSequencerBuffer will switch to a new -// QuicIntervalSet::AddOptimizedForAppend method in OnStreamData(). -QUIC_FLAG( - bool, - FLAGS_quic_reloadable_flag_quic_faster_interval_add_in_sequence_buffer, - true) - -// If true, GFE time wait list will send termination packets based on current -// packet's encryption level. -QUIC_FLAG(bool, FLAGS_quic_reloadable_flag_quic_fix_termination_packets, true) - // If true, stop using AckBundling mode to send ACK, also deprecate ack_queued // from QuicConnection. QUIC_FLAG(bool, @@ -309,12 +287,6 @@ FLAGS_quic_reloadable_flag_quic_no_lumpy_pacing_at_low_bw, false) -// If true, in BbrSender, always get a bandwidth sample when a packet is acked, -// even if packet.bytes_acked is zero. -QUIC_FLAG(bool, - FLAGS_quic_reloadable_flag_quic_always_get_bw_sample_when_acked, - true) - // If true, ignore TLPR for retransmission delay when sending pings from ping // alarm. QUIC_FLAG(bool, @@ -329,11 +301,6 @@ FLAGS_quic_reloadable_flag_quic_terminate_gquic_connection_as_ietf, true) -// If true, disable QUIC trial decryption in V44 and above. -QUIC_FLAG(bool, - FLAGS_quic_reloadable_flag_quic_v44_disable_trial_decryption, - false) - // In v44 and above, where STOP_WAITING is never sent, close the connection if // it's received. QUIC_FLAG(bool, @@ -348,13 +315,13 @@ // When true, QUIC server will drop IETF QUIC Version Negotiation packets. QUIC_FLAG(bool, FLAGS_quic_restart_flag_quic_server_drop_version_negotiation, - false) + true) // When true, version negotiation packets sent by the server will set the fixed // bit. QUIC_FLAG(bool, FLAGS_quic_reloadable_flag_quic_send_version_negotiation_fixed_bit, - false) + true) // When true, allow variable length QUIC connection IDs for unsupported // versions. This allows performing version negotiation when the client-chosen @@ -362,7 +329,7 @@ QUIC_FLAG( bool, FLAGS_quic_restart_flag_quic_allow_variable_length_connection_id_for_negotiation, - false) + true) // If true, set burst token to 2 in cwnd bootstrapping experiment. QUIC_FLAG(bool, FLAGS_quic_reloadable_flag_quic_conservative_bursts, false) @@ -370,7 +337,7 @@ // If true, make QuicDispatcher no longer have an instance of QuicFramer. QUIC_FLAG(bool, FLAGS_quic_restart_flag_quic_no_framer_object_in_dispatcher, - false) + true) // When true, QuicFramer will not override connection IDs in headers and will // instead respect the source/destination direction as expected by IETF QUIC. @@ -383,3 +350,13 @@ // If true, export number of packets written per write operation histogram.") QUIC_FLAG(bool, FLAGS_quic_export_server_num_packets_per_write_histogram, false) + +// If true, uses conservative cwnd gain and pacing gain. +QUIC_FLAG(bool, + FLAGS_quic_reloadable_flag_quic_conservative_cwnd_and_pacing_gains, + false) + +// If true, check whether connection is connected before flush. +QUIC_FLAG(bool, + FLAGS_quic_reloadable_flag_quic_check_connected_before_flush, + false)
diff --git a/net/quic/quic_http_stream.cc b/net/quic/quic_http_stream.cc index d8db488..740f229 100644 --- a/net/quic/quic_http_stream.cc +++ b/net/quic/quic_http_stream.cc
@@ -84,6 +84,8 @@ return HttpResponseInfo::CONNECTION_INFO_QUIC_39; case quic::QUIC_VERSION_43: return HttpResponseInfo::CONNECTION_INFO_QUIC_43; + case quic::QUIC_VERSION_44: + return HttpResponseInfo::CONNECTION_INFO_QUIC_44; case quic::QUIC_VERSION_46: return HttpResponseInfo::CONNECTION_INFO_QUIC_46; case quic::QUIC_VERSION_47:
diff --git a/net/quic/quic_http_stream_test.cc b/net/quic/quic_http_stream_test.cc index 4bf09a6..7205e90 100644 --- a/net/quic/quic_http_stream_test.cc +++ b/net/quic/quic_http_stream_test.cc
@@ -378,22 +378,19 @@ quic::QuicStreamId stream_id, bool should_include_version, bool fin, - quic::QuicStreamOffset offset, quic::QuicStringPiece data, QuicTestPacketMaker* maker) { return maker->MakeDataPacket(packet_number, stream_id, - should_include_version, fin, offset, data); + should_include_version, fin, data); } std::unique_ptr<quic::QuicReceivedPacket> ConstructClientDataPacket( uint64_t packet_number, bool should_include_version, bool fin, - quic::QuicStreamOffset offset, quic::QuicStringPiece data) { - return InnerConstructDataPacket(packet_number, stream_id_, - should_include_version, fin, offset, data, - &client_maker_); + return client_maker_.MakeDataPacket(packet_number, stream_id_, + should_include_version, fin, data); } std::unique_ptr<quic::QuicReceivedPacket> @@ -401,21 +398,18 @@ uint64_t packet_number, bool should_include_version, bool fin, - quic::QuicStreamOffset offset, const std::vector<std::string>& data) { return client_maker_.MakeMultipleDataFramesPacket( - packet_number, stream_id_, should_include_version, fin, offset, data); + packet_number, stream_id_, should_include_version, fin, data); } std::unique_ptr<quic::QuicReceivedPacket> ConstructServerDataPacket( uint64_t packet_number, bool should_include_version, bool fin, - quic::QuicStreamOffset offset, quic::QuicStringPiece data) { - return InnerConstructDataPacket(packet_number, stream_id_, - should_include_version, fin, offset, data, - &server_maker_); + return server_maker_.MakeDataPacket(packet_number, stream_id_, + should_include_version, fin, data); } std::unique_ptr<quic::QuicReceivedPacket> InnerConstructRequestHeadersPacket( @@ -923,8 +917,8 @@ // Send the response body. const char kResponseBody[] = "Hello world!"; std::string header = ConstructDataHeader(strlen(kResponseBody)); - ProcessPacket(ConstructServerDataPacket(3, false, !kFin, /*offset=*/0, - header + kResponseBody)); + ProcessPacket( + ConstructServerDataPacket(3, false, !kFin, header + kResponseBody)); spdy::SpdyHeaderBlock trailers; size_t spdy_trailers_frame_length; trailers["foo"] = "bar"; @@ -1262,7 +1256,7 @@ const char kResponseBody[] = "Hello world!"; std::string header2 = ConstructDataHeader(strlen(kResponseBody)); ProcessPacket( - ConstructServerDataPacket(3, false, kFin, 0, header2 + kResponseBody)); + ConstructServerDataPacket(3, false, kFin, header2 + kResponseBody)); // Since the body has already arrived, this should return immediately. EXPECT_EQ(static_cast<int>(strlen(kResponseBody)), stream_->ReadResponseBody(read_buffer_.get(), read_buffer_->size(), @@ -1342,13 +1336,12 @@ const char kResponseBody[] = "Hello world!"; std::string header2 = ConstructDataHeader(strlen(kResponseBody)); ProcessPacket( - ConstructServerDataPacket(3, false, !kFin, 0, header2 + kResponseBody)); + ConstructServerDataPacket(3, false, !kFin, header2 + kResponseBody)); // Since the body has already arrived, this should return immediately. EXPECT_EQ(static_cast<int>(strlen(kResponseBody)), stream_->ReadResponseBody(read_buffer_.get(), read_buffer_->size(), callback_.callback())); - ProcessPacket(ConstructServerDataPacket( - 4, false, kFin, base::size(kResponseBody) - 1 + header2.length(), "")); + ProcessPacket(ConstructServerDataPacket(4, false, kFin, "")); EXPECT_EQ(0, stream_->ReadResponseBody(read_buffer_.get(), read_buffer_->size(), callback_.callback())); @@ -1377,16 +1370,14 @@ 2, GetNthClientInitiatedBidirectionalStreamId(0), kIncludeVersion, !kFin, DEFAULT_PRIORITY, 0, &spdy_request_headers_frame_length, {header, kUploadData})); - AddWrite(ConstructClientMultipleDataFramesPacket( - 3, kIncludeVersion, kFin, header.length() + chunk_size, - {header, kUploadData})); + AddWrite(ConstructClientMultipleDataFramesPacket(3, kIncludeVersion, kFin, + {header, kUploadData})); } else { AddWrite(ConstructRequestHeadersAndDataFramesPacket( 2, GetNthClientInitiatedBidirectionalStreamId(0), kIncludeVersion, !kFin, DEFAULT_PRIORITY, 0, &spdy_request_headers_frame_length, {kUploadData})); - AddWrite(ConstructClientDataPacket(3, kIncludeVersion, kFin, chunk_size, - kUploadData)); + AddWrite(ConstructClientDataPacket(3, kIncludeVersion, kFin, kUploadData)); } AddWrite(ConstructClientAckPacket(4, 3, 1, 2)); @@ -1430,8 +1421,8 @@ // Send the response body. const char kResponseBody[] = "Hello world!"; std::string header2 = ConstructDataHeader(strlen(kResponseBody)); - ProcessPacket(ConstructServerDataPacket( - 3, false, kFin, response_data_.length(), header2 + kResponseBody)); + ProcessPacket( + ConstructServerDataPacket(3, false, kFin, header2 + kResponseBody)); // Since the body has already arrived, this should return immediately. ASSERT_EQ(static_cast<int>(strlen(kResponseBody)), @@ -1469,8 +1460,7 @@ !kFin, DEFAULT_PRIORITY, 0, &spdy_request_headers_frame_length, {header, kUploadData})); } - AddWrite(ConstructClientDataPacket(3, kIncludeVersion, kFin, - chunk_size + header.length(), "")); + AddWrite(ConstructClientDataPacket(3, kIncludeVersion, kFin, "")); AddWrite(ConstructClientAckPacket(4, 3, 1, 2)); Initialize(); @@ -1511,8 +1501,8 @@ // Send the response body. const char kResponseBody[] = "Hello world!"; std::string header2 = ConstructDataHeader(strlen(kResponseBody)); - ProcessPacket(ConstructServerDataPacket( - 3, false, kFin, response_data_.length(), header2 + kResponseBody)); + ProcessPacket( + ConstructServerDataPacket(3, false, kFin, header2 + kResponseBody)); // The body has arrived, but it is delivered asynchronously ASSERT_EQ(static_cast<int>(strlen(kResponseBody)), @@ -1538,7 +1528,7 @@ AddWrite(InnerConstructRequestHeadersPacket( 2, GetNthClientInitiatedBidirectionalStreamId(0), kIncludeVersion, !kFin, DEFAULT_PRIORITY, &spdy_request_headers_frame_length)); - AddWrite(ConstructClientDataPacket(3, kIncludeVersion, kFin, 0, "")); + AddWrite(ConstructClientDataPacket(3, kIncludeVersion, kFin, "")); AddWrite(ConstructClientAckPacket(4, 3, 1, 2)); Initialize(); @@ -1578,8 +1568,8 @@ // Send the response body. const char kResponseBody[] = "Hello world!"; std::string header = ConstructDataHeader(strlen(kResponseBody)); - ProcessPacket(ConstructServerDataPacket( - 3, false, kFin, response_data_.length(), header + kResponseBody)); + ProcessPacket( + ConstructServerDataPacket(3, false, kFin, header + kResponseBody)); // The body has arrived, but it is delivered asynchronously ASSERT_EQ(static_cast<int>(strlen(kResponseBody)), @@ -1927,8 +1917,8 @@ // Receive the promised response body. const char kResponseBody[] = "Hello world!"; std::string header = ConstructDataHeader(strlen(kResponseBody)); - ProcessPacket(InnerConstructDataPacket( - 2, promise_id_, false, kFin, 0, header + kResponseBody, &server_maker_)); + ProcessPacket(server_maker_.MakeDataPacket(2, promise_id_, false, kFin, + header + kResponseBody)); // Now sending a matching request will have successful rendezvous // with the promised stream. @@ -1999,8 +1989,8 @@ // Receive the promised response body. const char kResponseBody[] = "Hello world!"; std::string header = ConstructDataHeader(strlen(kResponseBody)); - ProcessPacket(InnerConstructDataPacket( - 2, promise_id_, false, kFin, 0, header + kResponseBody, &server_maker_)); + ProcessPacket(server_maker_.MakeDataPacket(2, promise_id_, false, kFin, + header + kResponseBody)); base::RunLoop().RunUntilIdle(); @@ -2115,8 +2105,8 @@ // Receive the promised response body. const char kResponseBody[] = "Hello world!"; std::string header = ConstructDataHeader(strlen(kResponseBody)); - ProcessPacket(InnerConstructDataPacket( - 2, promise_id_, false, kFin, 0, header + kResponseBody, &server_maker_)); + ProcessPacket(server_maker_.MakeDataPacket(2, promise_id_, false, kFin, + header + kResponseBody)); // Now sending a matching request will have successful rendezvous // with the promised stream. @@ -2215,8 +2205,8 @@ // Receive the promised response body. const char kResponseBody[] = "Hello world!"; std::string header = ConstructDataHeader(strlen(kResponseBody)); - ProcessPacket(InnerConstructDataPacket( - 2, promise_id_, false, kFin, 0, header + kResponseBody, &server_maker_)); + ProcessPacket(server_maker_.MakeDataPacket(2, promise_id_, false, kFin, + header + kResponseBody)); base::RunLoop().RunUntilIdle();
diff --git a/net/quic/quic_network_transaction_unittest.cc b/net/quic/quic_network_transaction_unittest.cc index 0497c7f1..7ccfbe7 100644 --- a/net/quic/quic_network_transaction_unittest.cc +++ b/net/quic/quic_network_transaction_unittest.cc
@@ -483,10 +483,9 @@ quic::QuicStreamId stream_id, bool should_include_version, bool fin, - quic::QuicStreamOffset offset, quic::QuicStringPiece data) { - return server_maker_.MakeDataPacket( - packet_number, stream_id, should_include_version, fin, offset, data); + return server_maker_.MakeDataPacket(packet_number, stream_id, + should_include_version, fin, data); } std::unique_ptr<quic::QuicEncryptedPacket> ConstructClientDataPacket( @@ -494,10 +493,9 @@ quic::QuicStreamId stream_id, bool should_include_version, bool fin, - quic::QuicStreamOffset offset, quic::QuicStringPiece data) { - return client_maker_.MakeDataPacket( - packet_number, stream_id, should_include_version, fin, offset, data); + return client_maker_.MakeDataPacket(packet_number, stream_id, + should_include_version, fin, data); } std::unique_ptr<quic::QuicEncryptedPacket> @@ -506,11 +504,9 @@ quic::QuicStreamId stream_id, bool should_include_version, bool fin, - quic::QuicStreamOffset offset, const std::vector<std::string> data_writes) { - return client_maker_.MakeMultipleDataFramesPacket(packet_number, stream_id, - should_include_version, - fin, offset, data_writes); + return client_maker_.MakeMultipleDataFramesPacket( + packet_number, stream_id, should_include_version, fin, data_writes); } std::unique_ptr<quic::QuicEncryptedPacket> ConstructClientAckAndDataPacket( @@ -521,11 +517,10 @@ uint64_t smallest_received, uint64_t least_unacked, bool fin, - quic::QuicStreamOffset offset, quic::QuicStringPiece data) { return client_maker_.MakeAckAndDataPacket( packet_number, include_version, stream_id, largest_received, - smallest_received, least_unacked, fin, offset, data); + smallest_received, least_unacked, fin, data); } std::unique_ptr<quic::QuicEncryptedPacket> @@ -537,11 +532,10 @@ uint64_t smallest_received, uint64_t least_unacked, bool fin, - quic::QuicStreamOffset offset, const std::vector<std::string> data_writes) { return client_maker_.MakeAckAndMultipleDataFramesPacket( packet_number, include_version, stream_id, largest_received, - smallest_received, least_unacked, fin, offset, data_writes); + smallest_received, least_unacked, fin, data_writes); } std::unique_ptr<quic::QuicEncryptedPacket> ConstructClientForceHolDataPacket( @@ -1049,7 +1043,7 @@ mock_quic_data.AddRead( ASYNC, ConstructServerDataPacket( 2, GetNthClientInitiatedBidirectionalStreamId(0), false, true, - 0, header + "hello!")); + header + "hello!")); mock_quic_data.AddWrite(SYNCHRONOUS, ConstructClientAckPacket(3, 2, 1, 1)); mock_quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // No more data to read @@ -1083,7 +1077,7 @@ mock_quic_data.AddRead( ASYNC, ConstructServerDataPacket( 2, GetNthClientInitiatedBidirectionalStreamId(0), false, true, - 0, header + "hello!")); + header + "hello!")); mock_quic_data.AddWrite(SYNCHRONOUS, ConstructClientAckPacket(3, 2, 1, 1)); mock_quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // No more data to read @@ -1117,7 +1111,7 @@ mock_quic_data.AddRead( ASYNC, ConstructServerDataPacket( 2, GetNthClientInitiatedBidirectionalStreamId(0), false, true, - 0, header + "hello!")); + header + "hello!")); mock_quic_data.AddWrite(SYNCHRONOUS, ConstructClientAckPacket(3, 2, 1, 1)); mock_quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // No more data to read @@ -1202,15 +1196,14 @@ ConstructServerDataPacket( packet_number++, quic::QuicUtils::GetHeadersStreamId(version_.transport_version), - false, false, offset, - base::StringPiece(spdy_frame.data() + offset, len))); + false, false, base::StringPiece(spdy_frame.data() + offset, len))); } std::string header = ConstructDataHeader(6); mock_quic_data.AddRead( ASYNC, ConstructServerDataPacket( packet_number, GetNthClientInitiatedBidirectionalStreamId(0), - false, true, 0, header + "hello!")); + false, true, header + "hello!")); mock_quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // No more data to read mock_quic_data.AddWrite(ASYNC, ConstructClientAckPacket(3, 2, 1, 1)); mock_quic_data.AddWrite(ASYNC, @@ -1262,8 +1255,7 @@ ConstructServerDataPacket( packet_number++, quic::QuicUtils::GetHeadersStreamId(version_.transport_version), - false, false, offset, - base::StringPiece(spdy_frame.data() + offset, len))); + false, false, base::StringPiece(spdy_frame.data() + offset, len))); } std::string header = ConstructDataHeader(6); @@ -1271,7 +1263,7 @@ mock_quic_data.AddRead( ASYNC, ConstructServerDataPacket( packet_number, GetNthClientInitiatedBidirectionalStreamId(0), - false, true, 0, header + "hello!")); + false, true, header + "hello!")); mock_quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // No more data to read mock_quic_data.AddWrite(ASYNC, ConstructClientAckPacket(3, 2, 1, 1)); mock_quic_data.AddWrite( @@ -1309,7 +1301,7 @@ mock_quic_data.AddRead( ASYNC, ConstructServerDataPacket( 2, GetNthClientInitiatedBidirectionalStreamId(0), false, true, - 0, header + "hello!")); + header + "hello!")); mock_quic_data.AddWrite(SYNCHRONOUS, ConstructClientAckPacket(3, 2, 1, 1)); mock_quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // No more data to read @@ -1341,7 +1333,7 @@ mock_quic_data.AddRead( ASYNC, ConstructServerDataPacket( 2, GetNthClientInitiatedBidirectionalStreamId(0), false, true, - 0, header + "hello!")); + header + "hello!")); mock_quic_data.AddWrite(SYNCHRONOUS, ConstructClientAckPacket(3, 2, 1, 1)); mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read mock_quic_data.AddRead(ASYNC, 0); // EOF @@ -1387,7 +1379,7 @@ mock_quic_data.AddRead( ASYNC, ConstructServerDataPacket( 2, GetNthClientInitiatedBidirectionalStreamId(0), false, true, - 0, header + "hello!")); + header + "hello!")); mock_quic_data.AddWrite(SYNCHRONOUS, ConstructClientAckPacket(3, 2, 1, 1)); mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read mock_quic_data.AddRead(ASYNC, 0); @@ -1446,7 +1438,7 @@ mock_quic_data.AddRead( ASYNC, ConstructServerDataPacket( 2, GetNthClientInitiatedBidirectionalStreamId(0), false, true, - 0, header + "hello!")); + header + "hello!")); mock_quic_data.AddWrite(SYNCHRONOUS, ConstructClientAckPacket(3, 2, 1, 1)); mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read mock_quic_data.AddRead(ASYNC, 0); @@ -1536,7 +1528,7 @@ mock_quic_data.AddRead( ASYNC, ConstructServerDataPacket( 2, GetNthClientInitiatedBidirectionalStreamId(0), false, true, - 0, header + "hello!")); + header + "hello!")); mock_quic_data.AddWrite(SYNCHRONOUS, ConstructClientAckPacket(3, 2, 1, 1)); mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read mock_quic_data.AddRead(ASYNC, 0); // EOF @@ -1725,7 +1717,7 @@ mock_quic_data.AddRead( ASYNC, ConstructServerDataPacket( 2, GetNthClientInitiatedBidirectionalStreamId(0), false, true, - 0, header + "hello!")); + header + "hello!")); mock_quic_data.AddWrite(SYNCHRONOUS, ConstructClientAckPacket(3, 2, 1, 1)); mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read mock_quic_data.AddRead(ASYNC, 0); // EOF @@ -1789,7 +1781,7 @@ mock_quic_data.AddRead( ASYNC, ConstructServerDataPacket( 2, GetNthClientInitiatedBidirectionalStreamId(0), false, true, - 0, header + "hello!")); + header + "hello!")); mock_quic_data.AddWrite(SYNCHRONOUS, ConstructClientAckPacket(3, 2, 1, 1)); mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read mock_quic_data.AddRead(ASYNC, 0); // EOF @@ -1849,7 +1841,7 @@ mock_quic_data.AddRead( ASYNC, ConstructServerDataPacket( 2, GetNthClientInitiatedBidirectionalStreamId(0), false, true, - 0, header + "hello!")); + header + "hello!")); mock_quic_data.AddWrite(SYNCHRONOUS, ConstructClientAckPacket(3, 2, 1, 1)); mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read mock_quic_data.AddRead(ASYNC, 0); // EOF @@ -1891,7 +1883,7 @@ mock_quic_data.AddRead( ASYNC, ConstructServerDataPacket( 2, GetNthClientInitiatedBidirectionalStreamId(0), false, true, - 0, header + "hello!")); + header + "hello!")); mock_quic_data.AddWrite(SYNCHRONOUS, ConstructClientAckPacket(3, 2, 1, 1)); mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read mock_quic_data.AddRead(ASYNC, 0); // EOF @@ -2017,7 +2009,7 @@ mock_quic_data.AddRead( ASYNC, ConstructServerDataPacket( 2, GetNthClientInitiatedBidirectionalStreamId(0), false, true, - 0, header + "hello!")); + header + "hello!")); mock_quic_data.AddWrite(SYNCHRONOUS, ConstructClientAckPacket(3, 2, 1, 1)); mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read mock_quic_data.AddRead(ASYNC, 0); // EOF @@ -2079,7 +2071,7 @@ mock_quic_data.AddRead( ASYNC, ConstructServerDataPacket( 2, GetNthClientInitiatedBidirectionalStreamId(0), false, true, - 0, header + "hello!")); + header + "hello!")); mock_quic_data.AddWrite(SYNCHRONOUS, ConstructClientAckPacket(3, 2, 1, 1)); mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read mock_quic_data.AddRead(ASYNC, 0); // EOF @@ -2119,7 +2111,7 @@ mock_quic_data.AddRead( SYNCHRONOUS, ConstructServerDataPacket( 3, GetNthClientInitiatedBidirectionalStreamId(0), false, - true, 0, header + "hello!")); + true, header + "hello!")); mock_quic_data.AddWrite(SYNCHRONOUS, ConstructClientAckAndRstPacket( 4, GetNthClientInitiatedBidirectionalStreamId(0), @@ -2468,7 +2460,7 @@ quic_data2.AddRead( ASYNC, ConstructServerDataPacket( 2, GetNthClientInitiatedBidirectionalStreamId(0), false, true, - 0, header + body)); + header + body)); quic_data2.AddWrite(SYNCHRONOUS, ConstructClientAckPacket(4, 2, 1, 1)); quic_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // No more data to read quic_data2.AddSocketDataToFactory(&socket_factory_); @@ -3786,7 +3778,7 @@ mock_quic_data.AddRead( ASYNC, ConstructServerDataPacket( 2, GetNthClientInitiatedBidirectionalStreamId(0), false, true, - 0, header + "hello!")); + header + "hello!")); mock_quic_data.AddWrite(SYNCHRONOUS, ConstructClientAckPacket(3, 2, 1, 1)); mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read mock_quic_data.AddRead(ASYNC, 0); // EOF @@ -3858,7 +3850,7 @@ mock_quic_data.AddRead( ASYNC, ConstructServerDataPacket( 2, GetNthClientInitiatedBidirectionalStreamId(0), false, true, - 0, header + "hello!")); + header + "hello!")); mock_quic_data.AddWrite(SYNCHRONOUS, ConstructClientAckPacket(3, 2, 1, 1)); // Second request will go over the pooled QUIC connection, but will be @@ -4003,7 +3995,7 @@ mock_quic_data.AddRead( ASYNC, ConstructServerDataPacket( 2, GetNthClientInitiatedBidirectionalStreamId(0), false, true, - 0, header + "hello!")); + header + "hello!")); mock_quic_data.AddWrite(SYNCHRONOUS, ConstructClientAckPacket(3, 2, 1, 1)); // Second QUIC request data. @@ -4021,7 +4013,7 @@ mock_quic_data.AddRead( ASYNC, ConstructServerDataPacket( 4, GetNthClientInitiatedBidirectionalStreamId(1), false, true, - 0, header + "hello!")); + header + "hello!")); mock_quic_data.AddWrite( SYNCHRONOUS, ConstructClientAckAndConnectionClosePacket(5, 4, 3, 1)); mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read @@ -4066,7 +4058,7 @@ mock_quic_data.AddRead( ASYNC, ConstructServerDataPacket( 2, GetNthClientInitiatedBidirectionalStreamId(0), false, true, - 0, header + "hello!")); + header + "hello!")); mock_quic_data.AddWrite(SYNCHRONOUS, ConstructClientAckPacket(3, 2, 1, 1)); // Second QUIC request data. @@ -4084,7 +4076,7 @@ mock_quic_data.AddRead( ASYNC, ConstructServerDataPacket( 4, GetNthClientInitiatedBidirectionalStreamId(1), false, true, - 0, header + "hello!")); + header + "hello!")); mock_quic_data.AddWrite( SYNCHRONOUS, ConstructClientAckAndConnectionClosePacket(5, 4, 3, 1)); mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read @@ -4143,7 +4135,7 @@ mock_quic_data.AddRead( ASYNC, ConstructServerDataPacket( 2, GetNthClientInitiatedBidirectionalStreamId(0), false, true, - 0, header + "hello!")); + header + "hello!")); mock_quic_data.AddWrite(SYNCHRONOUS, ConstructClientAckPacket(3, 2, 1, 1)); // Second request. @@ -4159,7 +4151,7 @@ mock_quic_data.AddRead( ASYNC, ConstructServerDataPacket( 4, GetNthClientInitiatedBidirectionalStreamId(1), false, true, - 0, header + "hello!")); + header + "hello!")); mock_quic_data.AddWrite( SYNCHRONOUS, ConstructClientAckAndConnectionClosePacket(5, 4, 3, 1)); mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read @@ -4223,7 +4215,7 @@ mock_quic_data.AddRead( ASYNC, ConstructServerDataPacket( 2, GetNthClientInitiatedBidirectionalStreamId(0), false, true, - 0, header + "hello!")); + header + "hello!")); mock_quic_data.AddWrite(SYNCHRONOUS, ConstructClientAckPacket(3, 2, 1, 1)); // Second request. @@ -4247,7 +4239,7 @@ mock_quic_data.AddRead( ASYNC, ConstructServerDataPacket( 4, GetNthClientInitiatedBidirectionalStreamId(1), false, true, - 0, header + "hello!")); + header + "hello!")); mock_quic_data.AddWrite( SYNCHRONOUS, ConstructClientAckAndConnectionClosePacket(5, 4, 3, 1)); mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read @@ -4357,7 +4349,7 @@ mock_quic_data.AddRead( ASYNC, ConstructServerDataPacket( 2, GetNthClientInitiatedBidirectionalStreamId(0), false, true, - 0, header + "hello from mail QUIC!")); + header + "hello from mail QUIC!")); mock_quic_data.AddWrite(SYNCHRONOUS, ConstructClientAckPacket(3, 2, 1, 1)); // Second QUIC request data. mock_quic_data.AddWrite( @@ -4373,7 +4365,7 @@ mock_quic_data.AddRead( ASYNC, ConstructServerDataPacket( 4, GetNthClientInitiatedBidirectionalStreamId(1), false, true, - 0, header + "hello from mail QUIC!")); + header + "hello from mail QUIC!")); mock_quic_data.AddWrite( SYNCHRONOUS, ConstructClientAckAndConnectionClosePacket(5, 4, 3, 1)); mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read @@ -4459,7 +4451,7 @@ mock_quic_data.AddRead( ASYNC, ConstructServerDataPacket( 2, GetNthClientInitiatedBidirectionalStreamId(0), false, true, - 0, header + "hello!")); + header + "hello!")); mock_quic_data.AddWrite(SYNCHRONOUS, ConstructClientAckPacket(3, 2, 1, 1)); mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read mock_quic_data.AddRead(ASYNC, 0); // EOF @@ -4513,7 +4505,7 @@ mock_quic_data.AddRead( ASYNC, ConstructServerDataPacket( 2, GetNthClientInitiatedBidirectionalStreamId(0), false, true, - 0, header + "hello!")); + header + "hello!")); mock_quic_data.AddWrite(SYNCHRONOUS, ConstructClientAckPacket(3, 2, 1, 1)); mock_quic_data.AddRead(SYNCHRONOUS, 0); // EOF @@ -4547,7 +4539,7 @@ mock_quic_data.AddRead( ASYNC, ConstructServerDataPacket( 2, GetNthClientInitiatedBidirectionalStreamId(0), false, true, - 0, header + "hello!")); + header + "hello!")); mock_quic_data.AddWrite(SYNCHRONOUS, ConstructClientAckPacket(3, 2, 1, 1)); mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read mock_quic_data.AddRead(ASYNC, 0); // EOF @@ -4647,7 +4639,7 @@ mock_quic_data.AddRead( ASYNC, ConstructServerDataPacket( 2, GetNthClientInitiatedBidirectionalStreamId(0), false, true, - 0, header + "hello!")); + header + "hello!")); mock_quic_data.AddWrite(SYNCHRONOUS, ConstructClientAckPacket(2, 2, 1, 1)); mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read mock_quic_data.AddRead(ASYNC, 0); // EOF @@ -4682,7 +4674,7 @@ mock_quic_data.AddRead( ASYNC, ConstructServerDataPacket( 2, GetNthClientInitiatedBidirectionalStreamId(0), false, true, - 0, header + "hello!")); + header + "hello!")); mock_quic_data.AddWrite(SYNCHRONOUS, ConstructClientAckPacket(2, 2, 1, 1)); mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read mock_quic_data.AddRead(ASYNC, 0); // EOF @@ -4747,7 +4739,7 @@ mock_quic_data.AddRead( ASYNC, ConstructServerDataPacket( 2, GetNthClientInitiatedBidirectionalStreamId(0), false, true, - 0, header + "hello!")); + header + "hello!")); mock_quic_data.AddWrite(SYNCHRONOUS, ConstructClientAckPacket(3, 2, 1, 1)); mock_quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // No more data to read mock_quic_data.AddSocketDataToFactory(&socket_factory_); @@ -4816,7 +4808,7 @@ mock_quic_data.AddRead( ASYNC, ConstructServerDataPacket( 3, GetNthClientInitiatedBidirectionalStreamId(1), false, true, - 0, header + "hello!")); + header + "hello!")); mock_quic_data.AddWrite( SYNCHRONOUS, ConstructClientAckAndConnectionClosePacket(5, 3, 1, 1)); mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read @@ -5254,7 +5246,7 @@ mock_quic_data.AddRead( ASYNC, ConstructServerDataPacket( 2, GetNthClientInitiatedBidirectionalStreamId(0), false, true, - 0, header + "hello!")); + header + "hello!")); mock_quic_data.AddWrite(SYNCHRONOUS, ConstructClientAckPacket(2, 2, 1, 1)); mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read mock_quic_data.AddRead(ASYNC, 0); // EOF @@ -5311,7 +5303,7 @@ mock_quic_data.AddRead( ASYNC, ConstructServerDataPacket( 2, GetNthClientInitiatedBidirectionalStreamId(0), false, true, - 0, header + "hello!")); + header + "hello!")); mock_quic_data.AddWrite(SYNCHRONOUS, ConstructClientAckPacket(3, 2, 1, 1)); mock_quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // No more data to read mock_quic_data.AddSocketDataToFactory(&socket_factory_); @@ -5594,7 +5586,7 @@ mock_quic_data.AddRead( ASYNC, ConstructServerDataPacket( 2, GetNthClientInitiatedBidirectionalStreamId(0), false, true, - 0, header + "hello!")); + header + "hello!")); mock_quic_data.AddWrite(SYNCHRONOUS, ConstructClientAckPacket(3, 2, 1, 1)); mock_quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // No more read data. mock_quic_data.AddSocketDataToFactory(&socket_factory_); @@ -5755,7 +5747,7 @@ socket_data.AddRead( ASYNC, ConstructServerDataPacket( 2, GetNthClientInitiatedBidirectionalStreamId(0), false, true, - 0, header + "hello!")); + header + "hello!")); socket_data.AddWrite(SYNCHRONOUS, ConstructClientAckPacket(3, 2, 1, 1)); socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // No more data to read socket_data.AddWrite( @@ -5790,7 +5782,7 @@ socket_data.AddRead( ASYNC, ConstructServerDataPacket( 2, GetNthClientInitiatedBidirectionalStreamId(0), false, true, - 0, header + "hello!")); + header + "hello!")); socket_data.AddWrite(SYNCHRONOUS, ConstructClientAckPacket(3, 2, 1, 1)); socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // No more data to read socket_data.AddWrite( @@ -5952,14 +5944,14 @@ mock_quic_data.AddRead( ASYNC, ConstructServerDataPacket( 4, GetNthClientInitiatedBidirectionalStreamId(0), false, true, - 0, header + "hello!")); + header + "hello!")); mock_quic_data.AddWrite( SYNCHRONOUS, ConstructClientAckPacket(client_packet_number++, 4, 3, 1)); std::string header2 = ConstructDataHeader(10); mock_quic_data.AddRead( ASYNC, ConstructServerDataPacket( 5, GetNthServerInitiatedUnidirectionalStreamId(0), false, true, - 0, header2 + "and hello!")); + header2 + "and hello!")); mock_quic_data.AddWrite(SYNCHRONOUS, ConstructClientAckAndRstPacket( client_packet_number++, @@ -6041,7 +6033,7 @@ mock_quic_data.AddRead( ASYNC, ConstructServerDataPacket( 3, GetNthClientInitiatedBidirectionalStreamId(0), false, true, - 0, header + "hello!")); + header + "hello!")); // Write error for the third request. mock_quic_data.AddWrite(SYNCHRONOUS, ERR_FAILED); mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read @@ -6121,7 +6113,7 @@ mock_quic_data.AddRead( ASYNC, ConstructServerDataPacket( 2, GetNthClientInitiatedBidirectionalStreamId(0), false, true, - 0, header2 + "hello!")); + header2 + "hello!")); mock_quic_data.AddWrite( SYNCHRONOUS, ConstructClientAckPacket(write_packet_index++, 2, 1, 1)); @@ -6203,7 +6195,7 @@ mock_quic_data.AddRead( ASYNC, ConstructServerDataPacket( 2, GetNthClientInitiatedBidirectionalStreamId(0), false, true, - 0, "Main Resource Data")); + "Main Resource Data")); mock_quic_data.AddWrite(SYNCHRONOUS, ConstructClientAckPacket(3, 2, 1, 1)); mock_quic_data.AddRead(ASYNC, 0); // EOF @@ -6298,7 +6290,7 @@ mock_quic_data.AddRead( ASYNC, ConstructServerDataPacket( 4, GetNthServerInitiatedUnidirectionalStreamId(0), false, true, - 0, header + "Pushed Resource Data")); + header + "Pushed Resource Data")); mock_quic_data.AddWrite( SYNCHRONOUS, ConstructClientAckPacket(client_packet_number++, 4, 3, 1)); @@ -6306,7 +6298,7 @@ mock_quic_data.AddRead( ASYNC, ConstructServerDataPacket( 5, GetNthClientInitiatedBidirectionalStreamId(0), false, true, - 0, header2 + "Main Resource Data")); + header2 + "Main Resource Data")); mock_quic_data.AddRead(ASYNC, ConstructServerConnectionClosePacket(6)); @@ -6374,7 +6366,7 @@ mock_quic_data.AddRead( ASYNC, ConstructServerDataPacket( 2, GetNthClientInitiatedBidirectionalStreamId(0), false, true, - 0, header + "hello!")); + header + "hello!")); mock_quic_data.AddWrite(SYNCHRONOUS, ConstructClientAckPacket(3, 2, 1, 1)); mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read mock_quic_data.AddRead(ASYNC, 0); // EOF @@ -6544,7 +6536,7 @@ auto header_length = encoder.SerializeDataFrameHeader(5, &buffer); header = std::string(buffer.get(), header_length); } - return maker->MakeDataPacket(packet_number, stream_id, false, true, 0, + return maker->MakeDataPacket(packet_number, stream_id, false, true, header + "hello"); } @@ -6933,7 +6925,7 @@ mock_quic_data.AddRead( ASYNC, ConstructServerDataPacket( 4, GetNthClientInitiatedBidirectionalStreamId(0), false, true, - 0, header + "hello!")); + header + "hello!")); mock_quic_data.AddWrite( SYNCHRONOUS, ConstructClientAckPacket(client_packet_number++, 4, 3, 1)); @@ -6941,7 +6933,7 @@ mock_quic_data.AddRead( ASYNC, ConstructServerDataPacket( 5, GetNthServerInitiatedUnidirectionalStreamId(0), false, true, - 0, header2 + "and hello!")); + header2 + "and hello!")); // Because the matching request has a body, we will see the push // stream get cancelled, and the matching request go out on the @@ -6981,7 +6973,7 @@ mock_quic_data.AddRead( ASYNC, ConstructServerDataPacket( 7, GetNthClientInitiatedBidirectionalStreamId(1), false, true, - 0, header2 + "and hello!")); + header2 + "and hello!")); mock_quic_data.AddWrite( SYNCHRONOUS, ConstructClientAckPacket(client_packet_number++, 7, 6, 1)); @@ -7050,7 +7042,7 @@ mock_quic_data.AddRead( ASYNC, ConstructServerDataPacket( 4, GetNthClientInitiatedBidirectionalStreamId(0), false, true, - 0, header + "hello!")); + header + "hello!")); mock_quic_data.AddWrite(SYNCHRONOUS, ConstructClientAckPacket(5, 4, 3, 1)); mock_quic_data.AddRead(ASYNC, 0); @@ -7098,13 +7090,13 @@ SYNCHRONOUS, ConstructClientAckAndDataPacket( 3, false, GetNthClientInitiatedBidirectionalStreamId(0), 1, 1, 1, - false, 0, quic::QuicStringPiece(get_request))); + false, quic::QuicStringPiece(get_request))); } else { mock_quic_data.AddWrite( SYNCHRONOUS, ConstructClientAckAndMultipleDataFramesPacket( 3, false, GetNthClientInitiatedBidirectionalStreamId(0), 1, 1, 1, - false, 0, {header, std::string(get_request)})); + false, {header, std::string(get_request)})); } const char get_response[] = @@ -7114,13 +7106,12 @@ mock_quic_data.AddRead( ASYNC, ConstructServerDataPacket( 2, GetNthClientInitiatedBidirectionalStreamId(0), false, false, - 0, header2 + std::string(get_response))); + header2 + std::string(get_response))); std::string header3 = ConstructDataHeader(10); mock_quic_data.AddRead( SYNCHRONOUS, ConstructServerDataPacket( 3, GetNthClientInitiatedBidirectionalStreamId(0), false, - false, strlen(get_response) + header2.length(), - header3 + std::string("0123456789"))); + false, header3 + std::string("0123456789"))); mock_quic_data.AddWrite(SYNCHRONOUS, ConstructClientAckPacket(4, 3, 2, 1)); mock_quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // No more data to read @@ -7188,24 +7179,21 @@ SYNCHRONOUS, ConstructClientAckAndDataPacket( 3, false, GetNthClientInitiatedBidirectionalStreamId(0), 1, 1, 1, - false, 0, - quic::QuicStringPiece(get_frame.data(), get_frame.size()))); + false, quic::QuicStringPiece(get_frame.data(), get_frame.size()))); } else { mock_quic_data.AddWrite( SYNCHRONOUS, ConstructClientAckAndMultipleDataFramesPacket( 3, false, GetNthClientInitiatedBidirectionalStreamId(0), 1, 1, 1, - false, 0, - {header, std::string(get_frame.data(), get_frame.size())})); + false, {header, std::string(get_frame.data(), get_frame.size())})); } spdy::SpdySerializedFrame resp_frame = spdy_util.ConstructSpdyGetReply(nullptr, 0, 1); std::string header2 = ConstructDataHeader(resp_frame.size()); mock_quic_data.AddRead( - ASYNC, - ConstructServerDataPacket( - 2, GetNthClientInitiatedBidirectionalStreamId(0), false, false, 0, - header2 + std::string(resp_frame.data(), resp_frame.size()))); + ASYNC, ConstructServerDataPacket( + 2, GetNthClientInitiatedBidirectionalStreamId(0), false, false, + header2 + std::string(resp_frame.data(), resp_frame.size()))); spdy::SpdySerializedFrame data_frame = spdy_util.ConstructSpdyDataFrame(1, "0123456789", true); @@ -7214,7 +7202,6 @@ SYNCHRONOUS, ConstructServerDataPacket( 3, GetNthClientInitiatedBidirectionalStreamId(0), false, false, - resp_frame.size() + header2.length(), header3 + std::string(data_frame.data(), data_frame.size()))); mock_quic_data.AddWrite(SYNCHRONOUS, ConstructClientAckPacket(4, 3, 2, 1)); mock_quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // No more data to read @@ -7287,18 +7274,16 @@ std::string header = ConstructDataHeader(strlen(get_request_1)); if (version_.transport_version != quic::QUIC_VERSION_99) { mock_quic_data.AddWrite( - SYNCHRONOUS, - ConstructClientAckAndDataPacket( - write_packet_index++, false, - GetNthClientInitiatedBidirectionalStreamId(0), 1, 1, 1, false, - client_data_offset, quic::QuicStringPiece(get_request_1))); + SYNCHRONOUS, ConstructClientAckAndDataPacket( + write_packet_index++, false, + GetNthClientInitiatedBidirectionalStreamId(0), 1, 1, 1, + false, quic::QuicStringPiece(get_request_1))); } else { mock_quic_data.AddWrite( - SYNCHRONOUS, - ConstructClientAckAndMultipleDataFramesPacket( - write_packet_index++, false, - GetNthClientInitiatedBidirectionalStreamId(0), 1, 1, 1, false, - client_data_offset, {header, std::string(get_request_1)})); + SYNCHRONOUS, ConstructClientAckAndMultipleDataFramesPacket( + write_packet_index++, false, + GetNthClientInitiatedBidirectionalStreamId(0), 1, 1, 1, + false, {header, std::string(get_request_1)})); } client_data_offset += strlen(get_request_1) + header.length(); @@ -7310,15 +7295,14 @@ mock_quic_data.AddRead( ASYNC, ConstructServerDataPacket( 2, GetNthClientInitiatedBidirectionalStreamId(0), false, false, - server_data_offset, header2 + std::string(get_response_1))); + header2 + std::string(get_response_1))); server_data_offset += strlen(get_response_1) + header2.length(); std::string header3 = ConstructDataHeader(10); mock_quic_data.AddRead( - SYNCHRONOUS, - ConstructServerDataPacket( - 3, GetNthClientInitiatedBidirectionalStreamId(0), false, false, - server_data_offset, header3 + std::string("0123456789"))); + SYNCHRONOUS, ConstructServerDataPacket( + 3, GetNthClientInitiatedBidirectionalStreamId(0), false, + false, header3 + std::string("0123456789"))); server_data_offset += 10 + header3.length(); mock_quic_data.AddWrite( @@ -7334,16 +7318,14 @@ SYNCHRONOUS, ConstructClientMultipleDataFramesPacket( write_packet_index++, GetNthClientInitiatedBidirectionalStreamId(0), - false, false, client_data_offset, - {header4, std::string(get_request_2)})); + false, false, {header4, std::string(get_request_2)})); client_data_offset += header4.length() + strlen(get_request_2); } else { mock_quic_data.AddWrite( SYNCHRONOUS, - ConstructClientDataPacket(write_packet_index++, - GetNthClientInitiatedBidirectionalStreamId(0), - false, false, client_data_offset, - quic::QuicStringPiece(get_request_2))); + ConstructClientDataPacket( + write_packet_index++, GetNthClientInitiatedBidirectionalStreamId(0), + false, false, quic::QuicStringPiece(get_request_2))); client_data_offset += strlen(get_request_2); } @@ -7354,15 +7336,14 @@ mock_quic_data.AddRead( ASYNC, ConstructServerDataPacket( 4, GetNthClientInitiatedBidirectionalStreamId(0), false, false, - server_data_offset, header5 + std::string(get_response_2))); + header5 + std::string(get_response_2))); server_data_offset += strlen(get_response_2) + header5.length(); std::string header6 = ConstructDataHeader(7); mock_quic_data.AddRead( - SYNCHRONOUS, - ConstructServerDataPacket( - 5, GetNthClientInitiatedBidirectionalStreamId(0), false, false, - server_data_offset, header6 + std::string("0123456"))); + SYNCHRONOUS, ConstructServerDataPacket( + 5, GetNthClientInitiatedBidirectionalStreamId(0), false, + false, header6 + std::string("0123456"))); server_data_offset += 7 + header6.length(); mock_quic_data.AddWrite( @@ -7450,13 +7431,13 @@ SYNCHRONOUS, ConstructClientAckAndDataPacket( 3, false, GetNthClientInitiatedBidirectionalStreamId(0), 1, 1, 1, - false, 0, quic::QuicStringPiece(get_request))); + false, quic::QuicStringPiece(get_request))); } else { mock_quic_data.AddWrite( SYNCHRONOUS, ConstructClientAckAndMultipleDataFramesPacket( 3, false, GetNthClientInitiatedBidirectionalStreamId(0), 1, 1, 1, - false, 0, {header, std::string(get_request)})); + false, {header, std::string(get_request)})); } const char get_response[] = @@ -7466,13 +7447,12 @@ mock_quic_data.AddRead( ASYNC, ConstructServerDataPacket( 2, GetNthClientInitiatedBidirectionalStreamId(0), false, false, - 0, header2 + std::string(get_response))); + header2 + std::string(get_response))); std::string header3 = ConstructDataHeader(10); mock_quic_data.AddRead( SYNCHRONOUS, ConstructServerDataPacket( 3, GetNthClientInitiatedBidirectionalStreamId(0), false, - false, strlen(get_response) + header2.length(), - header3 + std::string("0123456789"))); + false, header3 + std::string("0123456789"))); mock_quic_data.AddWrite(SYNCHRONOUS, ConstructClientAckPacket(4, 3, 2, 1)); // CONNECT request and response for second request @@ -7497,25 +7477,22 @@ SYNCHRONOUS, ConstructClientAckAndDataPacket( 6, false, GetNthClientInitiatedBidirectionalStreamId(1), 4, 4, 1, - false, 0, - quic::QuicStringPiece(get_frame.data(), get_frame.size()))); + false, quic::QuicStringPiece(get_frame.data(), get_frame.size()))); } else { mock_quic_data.AddWrite( SYNCHRONOUS, ConstructClientAckAndMultipleDataFramesPacket( 6, false, GetNthClientInitiatedBidirectionalStreamId(1), 4, 4, 1, - false, 0, - {header4, std::string(get_frame.data(), get_frame.size())})); + false, {header4, std::string(get_frame.data(), get_frame.size())})); } spdy::SpdySerializedFrame resp_frame = spdy_util.ConstructSpdyGetReply(nullptr, 0, 1); std::string header5 = ConstructDataHeader(resp_frame.size()); mock_quic_data.AddRead( - ASYNC, - ConstructServerDataPacket( - 5, GetNthClientInitiatedBidirectionalStreamId(1), false, false, 0, - header5 + std::string(resp_frame.data(), resp_frame.size()))); + ASYNC, ConstructServerDataPacket( + 5, GetNthClientInitiatedBidirectionalStreamId(1), false, false, + header5 + std::string(resp_frame.data(), resp_frame.size()))); spdy::SpdySerializedFrame data_frame = spdy_util.ConstructSpdyDataFrame(1, "0123456", true); @@ -7523,7 +7500,6 @@ mock_quic_data.AddRead( ASYNC, ConstructServerDataPacket( 6, GetNthClientInitiatedBidirectionalStreamId(1), false, false, - resp_frame.size() + header5.length(), header6 + std::string(data_frame.data(), data_frame.size()))); mock_quic_data.AddWrite(SYNCHRONOUS, ConstructClientAckPacket(7, 6, 5, 1)); @@ -7711,13 +7687,13 @@ SYNCHRONOUS, ConstructClientAckAndDataPacket( 5, false, GetNthClientInitiatedBidirectionalStreamId(1), 2, 2, 1, - false, 0, quic::QuicStringPiece(get_request))); + false, quic::QuicStringPiece(get_request))); } else { mock_quic_data.AddWrite( SYNCHRONOUS, ConstructClientAckAndMultipleDataFramesPacket( 5, false, GetNthClientInitiatedBidirectionalStreamId(1), 2, 2, 1, - false, 0, {header, std::string(get_request)})); + false, {header, std::string(get_request)})); } const char get_response[] = "HTTP/1.1 200 OK\r\n" @@ -7726,14 +7702,13 @@ mock_quic_data.AddRead( ASYNC, ConstructServerDataPacket( 3, GetNthClientInitiatedBidirectionalStreamId(1), false, false, - 0, header2 + std::string(get_response))); + header2 + std::string(get_response))); std::string header3 = ConstructDataHeader(10); mock_quic_data.AddRead( SYNCHRONOUS, ConstructServerDataPacket( 4, GetNthClientInitiatedBidirectionalStreamId(1), false, - false, strlen(get_response) + header2.length(), - header3 + std::string("0123456789"))); + false, header3 + std::string("0123456789"))); mock_quic_data.AddWrite(SYNCHRONOUS, ConstructClientAckPacket(6, 4, 3, 1)); mock_quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // No more data to read @@ -7987,12 +7962,12 @@ mock_quic_data.AddRead( ASYNC, server_maker->MakeDataPacket( 2, GetNthClientInitiatedBidirectionalStreamId(0), false, - false, server_data_offset, "0123456789")); + false, "0123456789")); } else { mock_quic_data.AddRead( SYNCHRONOUS, server_maker->MakeDataPacket( 2, GetNthClientInitiatedBidirectionalStreamId(0), - false, false, server_data_offset, "0123456789")); + false, false, "0123456789")); } server_data_offset += 10; @@ -8201,22 +8176,22 @@ // Server sends data for the three requests and the two push promises. std::string header = ConstructDataHeader(8); mock_quic_data.AddRead( - ASYNC, ConstructServerDataPacket(8, client_stream_0, false, true, 0, + ASYNC, ConstructServerDataPacket(8, client_stream_0, false, true, header + "hello 0!")); mock_quic_data.AddRead( - SYNCHRONOUS, ConstructServerDataPacket(9, client_stream_1, false, true, 0, + SYNCHRONOUS, ConstructServerDataPacket(9, client_stream_1, false, true, header + "hello 1!")); mock_quic_data.AddWrite(SYNCHRONOUS, ConstructClientAckPacket(10, 9, 8, 1)); mock_quic_data.AddRead( - ASYNC, ConstructServerDataPacket(10, client_stream_2, false, true, 0, + ASYNC, ConstructServerDataPacket(10, client_stream_2, false, true, header + "hello 2!")); std::string header2 = ConstructDataHeader(12); mock_quic_data.AddRead( - SYNCHRONOUS, ConstructServerDataPacket(11, push_stream_0, false, true, 0, + SYNCHRONOUS, ConstructServerDataPacket(11, push_stream_0, false, true, header2 + "and hello 0!")); mock_quic_data.AddWrite(SYNCHRONOUS, ConstructClientAckPacket(11, 11, 10, 1)); mock_quic_data.AddRead( - ASYNC, ConstructServerDataPacket(12, push_stream_1, false, true, 0, + ASYNC, ConstructServerDataPacket(12, push_stream_1, false, true, header2 + "and hello 1!")); mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read @@ -8360,7 +8335,7 @@ unpartitioned_mock_quic_data.AddRead( ASYNC, server_maker1.MakeDataPacket( 2, GetNthClientInitiatedBidirectionalStreamId(0), false, - true, 0, ConstructDataHeader(1) + "1")); + true, ConstructDataHeader(1) + "1")); unpartitioned_mock_quic_data.AddWrite( SYNCHRONOUS, ConstructClientAckPacket(3, 2, 1, 1)); @@ -8377,7 +8352,7 @@ unpartitioned_mock_quic_data.AddRead( ASYNC, server_maker1.MakeDataPacket( 4, GetNthClientInitiatedBidirectionalStreamId(1), false, - true, 0, ConstructDataHeader(1) + "2")); + true, ConstructDataHeader(1) + "2")); unpartitioned_mock_quic_data.AddWrite( SYNCHRONOUS, ConstructClientAckAndConnectionClosePacket(5, 4, 3, 1)); @@ -8394,7 +8369,7 @@ unpartitioned_mock_quic_data.AddRead( ASYNC, server_maker1.MakeDataPacket( 6, GetNthClientInitiatedBidirectionalStreamId(2), false, - true, 0, ConstructDataHeader(1) + "3")); + true, ConstructDataHeader(1) + "3")); unpartitioned_mock_quic_data.AddWrite( SYNCHRONOUS, ConstructClientAckAndConnectionClosePacket(7, 6, 5, 1)); @@ -8429,7 +8404,7 @@ partitioned_mock_quic_data1.AddRead( ASYNC, server_maker2.MakeDataPacket( 2, GetNthClientInitiatedBidirectionalStreamId(0), false, - true, 0, ConstructDataHeader(1) + "1")); + true, ConstructDataHeader(1) + "1")); partitioned_mock_quic_data1.AddWrite( SYNCHRONOUS, client_maker2.MakeAckPacket(3, 2, 1, 1, true)); @@ -8446,7 +8421,7 @@ partitioned_mock_quic_data1.AddRead( ASYNC, server_maker2.MakeDataPacket( 4, GetNthClientInitiatedBidirectionalStreamId(1), false, - true, 0, ConstructDataHeader(1) + "3")); + true, ConstructDataHeader(1) + "3")); partitioned_mock_quic_data1.AddWrite( SYNCHRONOUS, client_maker2.MakeAckPacket(5, 4, 3, 1, true)); @@ -8479,7 +8454,7 @@ partitioned_mock_quic_data2.AddRead( ASYNC, server_maker3.MakeDataPacket( 2, GetNthClientInitiatedBidirectionalStreamId(0), false, - true, 0, ConstructDataHeader(1) + "2")); + true, ConstructDataHeader(1) + "2")); partitioned_mock_quic_data2.AddWrite( SYNCHRONOUS, client_maker3.MakeAckPacket(3, 2, 1, 1, true)); @@ -8602,25 +8577,25 @@ SYNCHRONOUS, client_maker.MakeAckAndDataPacket( 3, false, GetNthClientInitiatedBidirectionalStreamId(0), 1, 1, 1, - false, 0, quic::QuicStringPiece(kGetRequest))); + false, quic::QuicStringPiece(kGetRequest))); } else { mock_quic_data[index]->AddWrite( SYNCHRONOUS, client_maker.MakeAckAndMultipleDataFramesPacket( 3, false, GetNthClientInitiatedBidirectionalStreamId(0), 1, 1, 1, - false, 0, {header, std::string(kGetRequest)})); + false, {header, std::string(kGetRequest)})); } std::string header2 = ConstructDataHeader(strlen(kGetResponse)); mock_quic_data[index]->AddRead( ASYNC, server_maker.MakeDataPacket( 2, GetNthClientInitiatedBidirectionalStreamId(0), false, - false, 0, header2 + std::string(kGetResponse))); + false, header2 + std::string(kGetResponse))); mock_quic_data[index]->AddRead( - SYNCHRONOUS, server_maker.MakeDataPacket( - 3, GetNthClientInitiatedBidirectionalStreamId(0), - false, false, strlen(kGetResponse) + header2.length(), - ConstructDataHeader(10) + std::string("0123456789"))); + SYNCHRONOUS, + server_maker.MakeDataPacket( + 3, GetNthClientInitiatedBidirectionalStreamId(0), false, false, + ConstructDataHeader(10) + std::string("0123456789"))); mock_quic_data[index]->AddWrite( SYNCHRONOUS, client_maker.MakeAckPacket(4, 3, 2, 1, true)); mock_quic_data[index]->AddRead(SYNCHRONOUS,
diff --git a/net/quic/quic_proxy_client_socket_unittest.cc b/net/quic/quic_proxy_client_socket_unittest.cc index 571af998..ad8a08c 100644 --- a/net/quic/quic_proxy_client_socket_unittest.cc +++ b/net/quic/quic_proxy_client_socket_unittest.cc
@@ -353,18 +353,16 @@ std::unique_ptr<quic::QuicReceivedPacket> ConstructDataPacket( uint64_t packet_number, - quic::QuicStreamOffset offset, quic::QuicStringPiece data) { return client_maker_.MakeDataPacket(packet_number, client_data_stream_id1_, - !kIncludeVersion, !kFin, offset, data); + !kIncludeVersion, !kFin, data); } std::unique_ptr<quic::QuicReceivedPacket> ConstructMultipleDataFramesPacket( uint64_t packet_number, - quic::QuicStreamOffset offset, const std::vector<std::string> data_writes) { return client_maker_.MakeMultipleDataFramesPacket( - packet_number, client_data_stream_id1_, !kIncludeVersion, !kFin, offset, + packet_number, client_data_stream_id1_, !kIncludeVersion, !kFin, data_writes); } @@ -373,12 +371,10 @@ uint64_t largest_received, uint64_t smallest_received, uint64_t least_unacked, - quic::QuicStreamOffset offset, quic::QuicStringPiece data) { return client_maker_.MakeAckAndDataPacket( packet_number, !kIncludeVersion, client_data_stream_id1_, - largest_received, smallest_received, least_unacked, !kFin, offset, - data); + largest_received, smallest_received, least_unacked, !kFin, data); } std::unique_ptr<quic::QuicReceivedPacket> @@ -387,12 +383,10 @@ uint64_t largest_received, uint64_t smallest_received, uint64_t least_unacked, - quic::QuicStreamOffset offset, const std::vector<std::string> data_writes) { return client_maker_.MakeAckAndMultipleDataFramesPacket( packet_number, !kIncludeVersion, client_data_stream_id1_, - largest_received, smallest_received, least_unacked, !kFin, offset, - data_writes); + largest_received, smallest_received, least_unacked, !kFin, data_writes); } std::unique_ptr<quic::QuicReceivedPacket> ConstructAckPacket( @@ -419,18 +413,16 @@ std::unique_ptr<quic::QuicReceivedPacket> ConstructServerDataPacket( uint64_t packet_number, - quic::QuicStreamOffset offset, quic::QuicStringPiece data) { return server_maker_.MakeDataPacket(packet_number, client_data_stream_id1_, - !kIncludeVersion, !kFin, offset, data); + !kIncludeVersion, !kFin, data); } std::unique_ptr<quic::QuicReceivedPacket> ConstructServerDataFinPacket( uint64_t packet_number, - quic::QuicStreamOffset offset, quic::QuicStringPiece data) { return server_maker_.MakeDataPacket(packet_number, client_data_stream_id1_, - !kIncludeVersion, kFin, offset, data); + !kIncludeVersion, kFin, data); } std::unique_ptr<quic::QuicReceivedPacket> ConstructServerConnectReplyPacket( @@ -762,8 +754,8 @@ mock_quic_data_.AddRead(ASYNC, ERR_IO_PENDING); // Pause std::string header = ConstructDataHeader(kLen1); - mock_quic_data_.AddRead(ASYNC, ConstructServerDataPacket( - 2, 0, header + std::string(kMsg1, kLen1))); + mock_quic_data_.AddRead( + ASYNC, ConstructServerDataPacket(2, header + std::string(kMsg1, kLen1))); mock_quic_data_.AddWrite(SYNCHRONOUS, ConstructAckPacket(3, 2, 1, 1)); mock_quic_data_.AddRead(SYNCHRONOUS, ERR_IO_PENDING); mock_quic_data_.AddWrite( @@ -796,7 +788,7 @@ std::string header = ConstructDataHeader(kLen333); mock_quic_data_.AddRead( ASYNC, - ConstructServerDataPacket(2, 0, header + std::string(kMsg333, kLen333))); + ConstructServerDataPacket(2, header + std::string(kMsg333, kLen333))); mock_quic_data_.AddWrite(SYNCHRONOUS, ConstructAckPacket(3, 2, 1, 1)); mock_quic_data_.AddRead(SYNCHRONOUS, ERR_IO_PENDING); mock_quic_data_.AddWrite( @@ -855,12 +847,11 @@ std::string header = ConstructDataHeader(kLen1); mock_quic_data_.AddWrite( SYNCHRONOUS, ConstructAckAndMultipleDataFramesPacket( - 3, 1, 1, 1, 0, {header, std::string(kMsg1, kLen1)})); + 3, 1, 1, 1, {header, std::string(kMsg1, kLen1)})); std::string header2 = ConstructDataHeader(kLen2); - mock_quic_data_.AddWrite( - SYNCHRONOUS, - ConstructMultipleDataFramesPacket( - 4, kLen1 + header.length(), {header2, std::string(kMsg2, kLen2)})); + mock_quic_data_.AddWrite(SYNCHRONOUS, + ConstructMultipleDataFramesPacket( + 4, {header2, std::string(kMsg2, kLen2)})); mock_quic_data_.AddWrite( SYNCHRONOUS, ConstructRstPacket(5, quic::QUIC_STREAM_CANCELLED, @@ -868,9 +859,9 @@ } else { mock_quic_data_.AddWrite( SYNCHRONOUS, - ConstructAckAndDataPacket(3, 1, 1, 1, 0, std::string(kMsg1, kLen1))); - mock_quic_data_.AddWrite( - SYNCHRONOUS, ConstructDataPacket(4, kLen1, std::string(kMsg2, kLen2))); + ConstructAckAndDataPacket(3, 1, 1, 1, std::string(kMsg1, kLen1))); + mock_quic_data_.AddWrite(SYNCHRONOUS, + ConstructDataPacket(4, std::string(kMsg2, kLen2))); mock_quic_data_.AddWrite( SYNCHRONOUS, ConstructRstPacket(5, quic::QUIC_STREAM_CANCELLED, kLen1 + kLen2)); @@ -895,12 +886,12 @@ std::string header = ConstructDataHeader(kLen1); if (version_.transport_version != quic::QUIC_VERSION_99) { mock_quic_data_.AddWrite( - SYNCHRONOUS, ConstructAckAndDataPacket(write_packet_index++, 1, 1, 1, 0, + SYNCHRONOUS, ConstructAckAndDataPacket(write_packet_index++, 1, 1, 1, std::string(kMsg1, kLen1))); } else { mock_quic_data_.AddWrite(SYNCHRONOUS, ConstructAckAndMultipleDataFramesPacket( - write_packet_index++, 1, 1, 1, 0, + write_packet_index++, 1, 1, 1, {header, std::string(kMsg1, kLen1)})); } @@ -924,20 +915,20 @@ std::string header2 = ConstructDataHeader(3973); mock_quic_data_.AddWrite( SYNCHRONOUS, ConstructMultipleDataFramesPacket( - write_packet_index++, offset, + write_packet_index++, {header2, std::string(data.c_str(), max_packet_data_length - 7)})); offset += max_packet_data_length - header2.length() - 1; } else if (version_.transport_version == quic::QUIC_VERSION_99 && i == numDataPackets - 1) { mock_quic_data_.AddWrite( - SYNCHRONOUS, ConstructDataPacket(write_packet_index++, offset, + SYNCHRONOUS, ConstructDataPacket(write_packet_index++, std::string(data.c_str(), 7))); offset += 7; } else { mock_quic_data_.AddWrite( SYNCHRONOUS, ConstructDataPacket( - write_packet_index++, offset, + write_packet_index++, std::string(data.c_str(), max_packet_data_length))); offset += max_packet_data_length; } @@ -973,8 +964,8 @@ mock_quic_data_.AddRead(ASYNC, ERR_IO_PENDING); // Pause std::string header = ConstructDataHeader(kLen1); - mock_quic_data_.AddRead(ASYNC, ConstructServerDataPacket( - 2, 0, header + std::string(kMsg1, kLen1))); + mock_quic_data_.AddRead( + ASYNC, ConstructServerDataPacket(2, header + std::string(kMsg1, kLen1))); mock_quic_data_.AddWrite(SYNCHRONOUS, ConstructAckPacket(3, 2, 1, 1)); mock_quic_data_.AddRead(SYNCHRONOUS, ERR_IO_PENDING); mock_quic_data_.AddWrite( @@ -995,15 +986,14 @@ mock_quic_data_.AddRead(ASYNC, ERR_IO_PENDING); // Pause std::string header = ConstructDataHeader(kLen1); - mock_quic_data_.AddRead(ASYNC, ConstructServerDataPacket( - 2, 0, header + std::string(kMsg1, kLen1))); + mock_quic_data_.AddRead( + ASYNC, ConstructServerDataPacket(2, header + std::string(kMsg1, kLen1))); mock_quic_data_.AddWrite(SYNCHRONOUS, ConstructAckPacket(3, 2, 1, 1)); mock_quic_data_.AddRead(ASYNC, ERR_IO_PENDING); // Pause std::string header2 = ConstructDataHeader(kLen2); mock_quic_data_.AddRead( - ASYNC, ConstructServerDataPacket(3, kLen1 + header.length(), - header2 + std::string(kMsg2, kLen2))); + ASYNC, ConstructServerDataPacket(3, header2 + std::string(kMsg2, kLen2))); mock_quic_data_.AddRead(SYNCHRONOUS, ERR_IO_PENDING); mock_quic_data_.AddWrite( @@ -1028,13 +1018,12 @@ mock_quic_data_.AddRead(ASYNC, ERR_IO_PENDING); // Pause std::string header = ConstructDataHeader(kLen1); - mock_quic_data_.AddRead(ASYNC, ConstructServerDataPacket( - 2, 0, header + std::string(kMsg1, kLen1))); + mock_quic_data_.AddRead( + ASYNC, ConstructServerDataPacket(2, header + std::string(kMsg1, kLen1))); mock_quic_data_.AddWrite(SYNCHRONOUS, ConstructAckPacket(3, 2, 1, 1)); std::string header2 = ConstructDataHeader(kLen2); mock_quic_data_.AddRead( - ASYNC, ConstructServerDataPacket(3, kLen1 + header.length(), - header2 + std::string(kMsg2, kLen2))); + ASYNC, ConstructServerDataPacket(3, header2 + std::string(kMsg2, kLen2))); mock_quic_data_.AddRead(SYNCHRONOUS, ERR_IO_PENDING); mock_quic_data_.AddWrite( @@ -1059,13 +1048,12 @@ mock_quic_data_.AddRead(ASYNC, ERR_IO_PENDING); // Pause std::string header = ConstructDataHeader(kLen3); - mock_quic_data_.AddRead(ASYNC, ConstructServerDataPacket( - 2, 0, header + std::string(kMsg3, kLen3))); + mock_quic_data_.AddRead( + ASYNC, ConstructServerDataPacket(2, header + std::string(kMsg3, kLen3))); mock_quic_data_.AddWrite(SYNCHRONOUS, ConstructAckPacket(3, 2, 1, 1)); std::string header2 = ConstructDataHeader(kLen3); mock_quic_data_.AddRead( - ASYNC, ConstructServerDataPacket(3, kLen3 + header.length(), - header2 + std::string(kMsg3, kLen3))); + ASYNC, ConstructServerDataPacket(3, header2 + std::string(kMsg3, kLen3))); mock_quic_data_.AddRead(SYNCHRONOUS, ERR_IO_PENDING); mock_quic_data_.AddWrite( @@ -1093,26 +1081,22 @@ std::string header = ConstructDataHeader(kLen1); mock_quic_data_.AddRead( - ASYNC, - ConstructServerDataPacket(2, offset, header + std::string(kMsg1, kLen1))); + ASYNC, ConstructServerDataPacket(2, header + std::string(kMsg1, kLen1))); offset += kLen1 + header.length(); mock_quic_data_.AddWrite(SYNCHRONOUS, ConstructAckPacket(3, 2, 1, 1)); std::string header2 = ConstructDataHeader(kLen3); mock_quic_data_.AddRead( - ASYNC, ConstructServerDataPacket(3, offset, - header2 + std::string(kMsg3, kLen3))); + ASYNC, ConstructServerDataPacket(3, header2 + std::string(kMsg3, kLen3))); offset += kLen3 + header2.length(); mock_quic_data_.AddRead( - ASYNC, ConstructServerDataPacket(4, offset, - header2 + std::string(kMsg3, kLen3))); + ASYNC, ConstructServerDataPacket(4, header2 + std::string(kMsg3, kLen3))); offset += kLen3 + header2.length(); mock_quic_data_.AddWrite(SYNCHRONOUS, ConstructAckPacket(4, 4, 3, 1)); std::string header3 = ConstructDataHeader(kLen2); mock_quic_data_.AddRead( - ASYNC, ConstructServerDataPacket(5, offset, - header3 + std::string(kMsg2, kLen2))); + ASYNC, ConstructServerDataPacket(5, header3 + std::string(kMsg2, kLen2))); offset += kLen2 + header3.length(); mock_quic_data_.AddRead(SYNCHRONOUS, ERR_IO_PENDING); @@ -1141,13 +1125,12 @@ mock_quic_data_.AddRead(ASYNC, ERR_IO_PENDING); // Pause std::string header = ConstructDataHeader(kLen1); - mock_quic_data_.AddRead(ASYNC, ConstructServerDataPacket( - 2, 0, header + std::string(kMsg1, kLen1))); + mock_quic_data_.AddRead( + ASYNC, ConstructServerDataPacket(2, header + std::string(kMsg1, kLen1))); mock_quic_data_.AddWrite(SYNCHRONOUS, ConstructAckPacket(3, 2, 1, 1)); std::string header2 = ConstructDataHeader(kLen33); - mock_quic_data_.AddRead( - ASYNC, ConstructServerDataPacket(3, kLen1 + header.length(), - header2 + std::string(kMsg33, kLen33))); + mock_quic_data_.AddRead(ASYNC, ConstructServerDataPacket( + 3, header2 + std::string(kMsg33, kLen33))); mock_quic_data_.AddRead(SYNCHRONOUS, ERR_IO_PENDING); mock_quic_data_.AddWrite( @@ -1177,7 +1160,7 @@ std::string header = ConstructDataHeader(kLen333); mock_quic_data_.AddRead( ASYNC, - ConstructServerDataPacket(2, 0, header + std::string(kMsg333, kLen333))); + ConstructServerDataPacket(2, header + std::string(kMsg333, kLen333))); mock_quic_data_.AddWrite(SYNCHRONOUS, ConstructAckPacket(3, 2, 1, 1)); mock_quic_data_.AddRead(SYNCHRONOUS, ERR_IO_PENDING); @@ -1211,13 +1194,12 @@ mock_quic_data_.AddRead(ASYNC, ERR_IO_PENDING); // Pause std::string header = ConstructDataHeader(kLen1); - mock_quic_data_.AddRead(ASYNC, ConstructServerDataPacket( - 2, 0, header + std::string(kMsg1, kLen1))); + mock_quic_data_.AddRead( + ASYNC, ConstructServerDataPacket(2, header + std::string(kMsg1, kLen1))); mock_quic_data_.AddWrite(SYNCHRONOUS, ConstructAckPacket(3, 2, 1, 1)); std::string header2 = ConstructDataHeader(kLen2); mock_quic_data_.AddRead( - ASYNC, ConstructServerDataPacket(3, kLen1 + header.length(), - header2 + std::string(kMsg2, kLen2))); + ASYNC, ConstructServerDataPacket(3, header2 + std::string(kMsg2, kLen2))); mock_quic_data_.AddRead(SYNCHRONOUS, ERR_IO_PENDING); mock_quic_data_.AddWrite( @@ -1243,13 +1225,12 @@ std::string header = ConstructDataHeader(kLen1); mock_quic_data_.AddRead( SYNCHRONOUS, - ConstructServerDataPacket(2, 0, header + std::string(kMsg1, kLen1))); + ConstructServerDataPacket(2, header + std::string(kMsg1, kLen1))); mock_quic_data_.AddWrite(SYNCHRONOUS, ConstructAckPacket(3, 2, 1, 1)); std::string header2 = ConstructDataHeader(kLen2); mock_quic_data_.AddRead( SYNCHRONOUS, - ConstructServerDataPacket(3, kLen1 + header.length(), - header2 + std::string(kMsg2, kLen2))); + ConstructServerDataPacket(3, header2 + std::string(kMsg2, kLen2))); mock_quic_data_.AddRead(SYNCHRONOUS, ERR_IO_PENDING); mock_quic_data_.AddWrite( @@ -1272,8 +1253,8 @@ mock_quic_data_.AddRead(ASYNC, ERR_IO_PENDING); // Pause std::string header = ConstructDataHeader(kLen1); - mock_quic_data_.AddRead(ASYNC, ConstructServerDataPacket( - 2, 0, header + std::string(kMsg1, kLen1))); + mock_quic_data_.AddRead( + ASYNC, ConstructServerDataPacket(2, header + std::string(kMsg1, kLen1))); mock_quic_data_.AddWrite(SYNCHRONOUS, ConstructAckPacket(write_packet_index++, 2, 1, 1)); @@ -1282,19 +1263,18 @@ mock_quic_data_.AddWrite( SYNCHRONOUS, ConstructMultipleDataFramesPacket( - write_packet_index++, 0, {header2, std::string(kMsg2, kLen2)})); + write_packet_index++, {header2, std::string(kMsg2, kLen2)})); } else { mock_quic_data_.AddWrite( - SYNCHRONOUS, ConstructDataPacket(write_packet_index++, header2.length(), - std::string(kMsg2, kLen2))); + SYNCHRONOUS, + ConstructDataPacket(write_packet_index++, std::string(kMsg2, kLen2))); } mock_quic_data_.AddRead(ASYNC, ERR_IO_PENDING); // Pause std::string header3 = ConstructDataHeader(kLen3); mock_quic_data_.AddRead( - ASYNC, ConstructServerDataPacket(3, kLen1 + header.length(), - header3 + std::string(kMsg3, kLen3))); + ASYNC, ConstructServerDataPacket(3, header3 + std::string(kMsg3, kLen3))); mock_quic_data_.AddRead(SYNCHRONOUS, ERR_IO_PENDING); mock_quic_data_.AddWrite( @@ -1329,32 +1309,31 @@ mock_quic_data_.AddRead(ASYNC, ERR_IO_PENDING); // Pause std::string header = ConstructDataHeader(kLen1); - mock_quic_data_.AddRead(ASYNC, ConstructServerDataPacket( - 2, 0, header + std::string(kMsg1, kLen1))); + mock_quic_data_.AddRead( + ASYNC, ConstructServerDataPacket(2, header + std::string(kMsg1, kLen1))); mock_quic_data_.AddWrite(SYNCHRONOUS, ConstructAckPacket(3, 2, 1, 1)); mock_quic_data_.AddRead(ASYNC, ERR_IO_PENDING); // Pause std::string header2 = ConstructDataHeader(kLen3); mock_quic_data_.AddRead( - ASYNC, ConstructServerDataPacket(3, kLen1 + header.length(), - header2 + std::string(kMsg3, kLen3))); + ASYNC, ConstructServerDataPacket(3, header2 + std::string(kMsg3, kLen3))); mock_quic_data_.AddRead(SYNCHRONOUS, ERR_IO_PENDING); mock_quic_data_.AddWrite(ASYNC, ERR_IO_PENDING); // Pause std::string header3 = ConstructDataHeader(kLen2); if (version_.transport_version != quic::QUIC_VERSION_99) { + mock_quic_data_.AddWrite(ASYNC, + ConstructDataPacket(4, std::string(kMsg2, kLen2))); mock_quic_data_.AddWrite( - ASYNC, ConstructDataPacket(4, 0, std::string(kMsg2, kLen2))); - mock_quic_data_.AddWrite( - SYNCHRONOUS, ConstructAckAndDataPacket(5, 3, 3, 1, kLen2, - std::string(kMsg2, kLen2))); + SYNCHRONOUS, + ConstructAckAndDataPacket(5, 3, 3, 1, std::string(kMsg2, kLen2))); } else { mock_quic_data_.AddWrite(ASYNC, ConstructMultipleDataFramesPacket( - 4, 0, {header3, std::string(kMsg2, kLen2)})); + 4, {header3, std::string(kMsg2, kLen2)})); mock_quic_data_.AddWrite( - ASYNC, ConstructAckAndDataPacket(5, 3, 3, 1, header3.length() + kLen2, + ASYNC, ConstructAckAndDataPacket(5, 3, 3, 1, header3 + std::string(kMsg2, kLen2))); } @@ -1460,7 +1439,7 @@ std::string header = ConstructDataHeader(kLen1); mock_quic_data_.AddRead(ASYNC, ConstructServerDataFinPacket( - 2, 0, header + std::string(kMsg1, kLen1))); + 2, header + std::string(kMsg1, kLen1))); mock_quic_data_.AddWrite(SYNCHRONOUS, ConstructAckPacket(3, 2, 1, 1)); mock_quic_data_.AddRead(SYNCHRONOUS, ERR_IO_PENDING); mock_quic_data_.AddWrite( @@ -1625,16 +1604,15 @@ mock_quic_data_.AddRead(SYNCHRONOUS, ERR_IO_PENDING); std::string header = ConstructDataHeader(kLen2); if (version_.transport_version != quic::QUIC_VERSION_99) { - mock_quic_data_.AddWrite( - ASYNC, - ConstructAckAndDataPacket(3, 1, 1, 1, 0, std::string(kMsg2, kLen2))); + mock_quic_data_.AddWrite(ASYNC, ConstructAckAndDataPacket( + 3, 1, 1, 1, std::string(kMsg2, kLen2))); mock_quic_data_.AddWrite( SYNCHRONOUS, ConstructAckAndRstPacket(4, quic::QUIC_RST_ACKNOWLEDGEMENT, 2, 2, 1, kLen2)); } else { mock_quic_data_.AddWrite( ASYNC, ConstructAckAndMultipleDataFramesPacket( - 3, 1, 1, 1, 0, {header, std::string(kMsg2, kLen2)})); + 3, 1, 1, 1, {header, std::string(kMsg2, kLen2)})); mock_quic_data_.AddWrite(SYNCHRONOUS, ConstructAckAndRstOnlyPacket( 4, quic::QUIC_STREAM_CANCELLED, 2, 2, 1, header.length() + kLen2)); @@ -1672,8 +1650,8 @@ mock_quic_data_.AddRead(ASYNC, ERR_IO_PENDING); // Pause std::string header = ConstructDataHeader(kLen1); - mock_quic_data_.AddRead(ASYNC, ConstructServerDataPacket( - 2, 0, header + std::string(kMsg1, kLen1))); + mock_quic_data_.AddRead( + ASYNC, ConstructServerDataPacket(2, header + std::string(kMsg1, kLen1))); mock_quic_data_.AddWrite(SYNCHRONOUS, ConstructAckPacket(3, 2, 1, 1)); mock_quic_data_.AddRead(SYNCHRONOUS, ERR_IO_PENDING); mock_quic_data_.AddWrite( @@ -1757,9 +1735,8 @@ ASYNC, ConstructServerRstPacket(2, quic::QUIC_STREAM_CANCELLED, 0)); mock_quic_data_.AddRead(SYNCHRONOUS, ERR_IO_PENDING); if (version_.transport_version != quic::QUIC_VERSION_99) { - mock_quic_data_.AddWrite( - ASYNC, - ConstructAckAndDataPacket(3, 1, 1, 1, 0, std::string(kMsg1, kLen1))); + mock_quic_data_.AddWrite(ASYNC, ConstructAckAndDataPacket( + 3, 1, 1, 1, std::string(kMsg1, kLen1))); mock_quic_data_.AddWrite( SYNCHRONOUS, ConstructAckAndRstPacket(4, quic::QUIC_RST_ACKNOWLEDGEMENT, 2, 2, 1, kLen1)); @@ -1767,7 +1744,7 @@ std::string header = ConstructDataHeader(kLen1); mock_quic_data_.AddWrite( ASYNC, ConstructAckAndMultipleDataFramesPacket( - 3, 1, 1, 1, 0, {header, std::string(kMsg1, kLen1)})); + 3, 1, 1, 1, {header, std::string(kMsg1, kLen1)})); mock_quic_data_.AddWrite(SYNCHRONOUS, ConstructAckAndRstOnlyPacket( 4, quic::QUIC_STREAM_CANCELLED, 2, 2, 1, header.length() + kLen1));
diff --git a/net/quic/quic_stream_factory.cc b/net/quic/quic_stream_factory.cc index cb11203..45f6e1e 100644 --- a/net/quic/quic_stream_factory.cc +++ b/net/quic/quic_stream_factory.cc
@@ -490,7 +490,6 @@ const bool retry_on_alternate_network_before_handshake_; const bool race_stale_dns_on_connection_; const NetLogWithSource net_log_; - int num_sent_client_hellos_; bool host_resolution_finished_; bool connection_retried_; QuicChromiumClientSession* session_; @@ -536,7 +535,6 @@ net_log_( NetLogWithSource::Make(net_log.net_log(), NetLogSourceType::QUIC_STREAM_FACTORY_JOB)), - num_sent_client_hellos_(0), host_resolution_finished_(false), connection_retried_(false), session_(nullptr), @@ -850,17 +848,6 @@ UMA_HISTOGRAM_TIMES("Net.QuicSession.TimeFromResolveHostToConfirmConnection", base::TimeTicks::Now() - dns_resolution_start_time_); net_log_.EndEvent(NetLogEventType::QUIC_STREAM_FACTORY_JOB_CONNECT); - if (session_ && - session_->error() == quic::QUIC_CRYPTO_HANDSHAKE_STATELESS_REJECT) { - num_sent_client_hellos_ += session_->GetNumSentClientHellos(); - if (num_sent_client_hellos_ >= - quic::QuicCryptoClientStream::kMaxClientHellos) - return ERR_QUIC_HANDSHAKE_FAILED; - // The handshake was rejected statelessly, so create another connection - // to resume the handshake. - io_state_ = STATE_CONNECT; - return OK; - } if (was_alternative_service_recently_broken_) UMA_HISTOGRAM_BOOLEAN("Net.QuicSession.ConnectAfterBroken", rv == OK);
diff --git a/net/quic/quic_stream_factory_test.cc b/net/quic/quic_stream_factory_test.cc index 30463dc..57852190 100644 --- a/net/quic/quic_stream_factory_test.cc +++ b/net/quic/quic_stream_factory_test.cc
@@ -808,10 +808,9 @@ quic::QuicStreamId stream_id, bool should_include_version, bool fin, - quic::QuicStreamOffset offset, quic::QuicStringPiece data) { - return server_maker_.MakeDataPacket( - packet_number, stream_id, should_include_version, fin, offset, data); + return server_maker_.MakeDataPacket(packet_number, stream_id, + should_include_version, fin, data); } quic::QuicStreamId GetNthServerInitiatedUnidirectionalStreamId(int n) { @@ -7233,8 +7232,7 @@ server_maker_.MakeDataPacket( packet_number++, quic::QuicUtils::GetHeadersStreamId(version_.transport_version), - false, false, offset, - base::StringPiece(spdy_frame.data() + offset, len))); + false, false, base::StringPiece(spdy_frame.data() + offset, len))); } // Read an ACK from server which acks all client data. socket_data1.AddRead(SYNCHRONOUS, @@ -7247,7 +7245,7 @@ socket_data1.AddRead( ASYNC, ConstructServerDataPacket( 3, GetNthClientInitiatedBidirectionalStreamId(0), false, true, - 0, header + "hello!")); + header + "hello!")); socket_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // No more data to read. socket_data1.AddWrite( SYNCHRONOUS, client_maker_.MakeRstPacket( @@ -7391,8 +7389,7 @@ server_maker_.MakeDataPacket( packet_number++, quic::QuicUtils::GetHeadersStreamId(version_.transport_version), - false, false, offset, - base::StringPiece(spdy_frame.data() + offset, len))); + false, false, base::StringPiece(spdy_frame.data() + offset, len))); } // Read an ACK from server which acks all client data. socket_data1.AddRead(SYNCHRONOUS, @@ -7405,7 +7402,7 @@ socket_data1.AddRead( ASYNC, ConstructServerDataPacket( 3, GetNthClientInitiatedBidirectionalStreamId(0), false, true, - 0, header + "hello!")); + header + "hello!")); socket_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // No more data to read. socket_data1.AddWrite( SYNCHRONOUS, client_maker_.MakeRstPacket( @@ -7538,8 +7535,7 @@ server_maker_.MakeDataPacket( packet_number++, quic::QuicUtils::GetHeadersStreamId(version_.transport_version), - false, false, offset, - base::StringPiece(spdy_frame.data() + offset, len))); + false, false, base::StringPiece(spdy_frame.data() + offset, len))); } // Read an ACK from server which acks all client data. socket_data1.AddRead(SYNCHRONOUS, @@ -7552,7 +7548,7 @@ socket_data1.AddRead( ASYNC, ConstructServerDataPacket( 3, GetNthClientInitiatedBidirectionalStreamId(0), false, true, - 0, header + "hello!")); + header + "hello!")); socket_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // No more data to read. socket_data1.AddWrite( SYNCHRONOUS, client_maker_.MakeRstPacket( @@ -7674,8 +7670,7 @@ server_maker_.MakeDataPacket( packet_number++, quic::QuicUtils::GetHeadersStreamId(version_.transport_version), - false, false, offset, - base::StringPiece(spdy_frame.data() + offset, len))); + false, false, base::StringPiece(spdy_frame.data() + offset, len))); } // Read an ACK from server which acks all client data. socket_data1.AddRead(SYNCHRONOUS, @@ -7685,7 +7680,7 @@ socket_data1.AddRead( ASYNC, ConstructServerDataPacket( 3, GetNthClientInitiatedBidirectionalStreamId(0), false, true, - 0, header + "hello!")); + header + "hello!")); socket_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // No more data to read. socket_data1.AddWrite( SYNCHRONOUS, client_maker_.MakeRstPacket( @@ -7810,8 +7805,7 @@ server_maker_.MakeDataPacket( packet_number++, quic::QuicUtils::GetHeadersStreamId(version_.transport_version), - false, false, offset, - base::StringPiece(spdy_frame.data() + offset, len))); + false, false, base::StringPiece(spdy_frame.data() + offset, len))); } // Read an ACK from server which acks all client data. socket_data1.AddRead(SYNCHRONOUS, @@ -7824,7 +7818,7 @@ socket_data1.AddRead( ASYNC, ConstructServerDataPacket( 3, GetNthClientInitiatedBidirectionalStreamId(0), false, true, - 0, header + "hello!")); + header + "hello!")); socket_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // No more data to read. socket_data1.AddWrite( SYNCHRONOUS, client_maker_.MakeRstPacket( @@ -7948,8 +7942,7 @@ server_maker_.MakeDataPacket( packet_number++, quic::QuicUtils::GetHeadersStreamId(version_.transport_version), - false, false, offset, - base::StringPiece(spdy_frame.data() + offset, len))); + false, false, base::StringPiece(spdy_frame.data() + offset, len))); } // Read an ACK from server which acks all client data. socket_data1.AddRead(SYNCHRONOUS, @@ -7959,7 +7952,7 @@ socket_data1.AddRead( ASYNC, ConstructServerDataPacket( 3, GetNthClientInitiatedBidirectionalStreamId(0), false, true, - 0, header + "hello!")); + header + "hello!")); socket_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // No more data to read. socket_data1.AddWrite( SYNCHRONOUS, client_maker_.MakeRstPacket(
diff --git a/net/quic/quic_test_packet_maker.cc b/net/quic/quic_test_packet_maker.cc index 679cc06..b552c33c 100644 --- a/net/quic/quic_test_packet_maker.cc +++ b/net/quic/quic_test_packet_maker.cc
@@ -40,13 +40,14 @@ host_(host), spdy_request_framer_(spdy::SpdyFramer::ENABLE_COMPRESSION), spdy_response_framer_(spdy::SpdyFramer::ENABLE_COMPRESSION), - header_stream_offset_(0), perspective_(perspective), encryption_level_(quic::ENCRYPTION_FORWARD_SECURE), long_header_type_(quic::INVALID_PACKET_TYPE), client_headers_include_h2_stream_dependency_( client_headers_include_h2_stream_dependency && version.transport_version >= quic::QUIC_VERSION_43) { + stream_offsets_[quic::QuicUtils::GetHeadersStreamId( + version_.transport_version)] = 0; DCHECK(!(perspective_ == quic::Perspective::IS_SERVER && client_headers_include_h2_stream_dependency_)); } @@ -348,11 +349,9 @@ if (spdy_headers_frame_length) { *spdy_headers_frame_length = spdy_frame.size(); } - quic::QuicStreamFrame headers_frame( + quic::QuicStreamFrame headers_frame = GenerateNextStreamFrame( quic::QuicUtils::GetHeadersStreamId(version_.transport_version), false, - header_stream_offset_, quic::QuicStringPiece(spdy_frame.data(), spdy_frame.size())); - header_stream_offset_ += spdy_frame.size(); quic::QuicFrames frames; frames.push_back(quic::QuicFrame(&rst_frame)); @@ -752,18 +751,17 @@ return MakeDataPacket( packet_number, quic::QuicUtils::GetHeadersStreamId(version_.transport_version), - should_include_version, fin, header_stream_offset_, data); + should_include_version, fin, data); } -// Returns a newly created packet to send kData on stream 1. + std::unique_ptr<quic::QuicReceivedPacket> QuicTestPacketMaker::MakeDataPacket( uint64_t packet_number, quic::QuicStreamId stream_id, bool should_include_version, bool fin, - quic::QuicStreamOffset offset, quic::QuicStringPiece data) { InitializeHeader(packet_number, should_include_version); - quic::QuicStreamFrame frame(stream_id, fin, offset, data); + quic::QuicStreamFrame frame = GenerateNextStreamFrame(stream_id, fin, data); DVLOG(1) << "Adding frame: " << frame; return MakePacket(header_, quic::QuicFrame(frame)); } @@ -774,17 +772,15 @@ quic::QuicStreamId stream_id, bool should_include_version, bool fin, - quic::QuicStreamOffset offset, const std::vector<std::string>& data_writes) { InitializeHeader(packet_number, should_include_version); quic::QuicFrames data_frames; for (size_t i = 0; i < data_writes.size(); ++i) { bool is_fin = fin && (i == data_writes.size() - 1); - quic::QuicFrame quic_frame(quic::QuicStreamFrame( - stream_id, is_fin, offset, quic::QuicStringPiece(data_writes[i]))); + quic::QuicFrame quic_frame( + GenerateNextStreamFrame(stream_id, is_fin, data_writes[i])); DVLOG(1) << "Adding frame: " << quic_frame; data_frames.push_back(quic_frame); - offset += data_writes[i].length(); } return MakeMultipleFramesPacket(header_, data_frames, nullptr); } @@ -797,7 +793,6 @@ uint64_t smallest_received, uint64_t least_unacked, bool fin, - quic::QuicStreamOffset offset, quic::QuicStringPiece data) { InitializeHeader(packet_number, include_version); @@ -816,7 +811,7 @@ DVLOG(1) << "Adding frame: " << frames.back(); frames.push_back( - quic::QuicFrame(quic::QuicStreamFrame(stream_id, fin, offset, data))); + quic::QuicFrame(GenerateNextStreamFrame(stream_id, fin, data))); DVLOG(1) << "Adding frame: " << frames.back(); return MakeMultipleFramesPacket(header_, frames, nullptr); @@ -831,7 +826,6 @@ uint64_t smallest_received, uint64_t least_unacked, bool fin, - quic::QuicStreamOffset offset, const std::vector<std::string>& data_writes) { InitializeHeader(packet_number, include_version); @@ -851,11 +845,10 @@ for (size_t i = 0; i < data_writes.size(); ++i) { bool is_fin = fin && (i == data_writes.size() - 1); - quic::QuicFrame quic_frame(quic::QuicStreamFrame( - stream_id, is_fin, offset, quic::QuicStringPiece(data_writes[i]))); + quic::QuicFrame quic_frame(GenerateNextStreamFrame( + stream_id, is_fin, quic::QuicStringPiece(data_writes[i]))); DVLOG(1) << "Adding frame: " << quic_frame; frames.push_back(quic_frame); - offset += data_writes[i].length(); } return MakeMultipleFramesPacket(header_, frames, nullptr); } @@ -879,26 +872,22 @@ if (spdy_headers_frame_length) { *spdy_headers_frame_length = spdy_frame.size(); } - quic::QuicFrames frames; - quic::QuicStreamFrame frame( + quic::QuicStreamFrame frame = GenerateNextStreamFrame( quic::QuicUtils::GetHeadersStreamId(version_.transport_version), false, - header_stream_offset_, quic::QuicStringPiece(spdy_frame.data(), spdy_frame.size())); + quic::QuicFrames frames; frames.push_back(quic::QuicFrame(frame)); DVLOG(1) << "Adding frame: " << frames.back(); - header_stream_offset_ += spdy_frame.size(); - quic::QuicStreamOffset offset = 0; // quic::QuicFrame takes a raw pointer. Use a std::vector here so we keep // StreamFrames alive until MakeMultipleFramesPacket is done. std::vector<std::unique_ptr<quic::QuicStreamFrame>> stream_frames; for (size_t i = 0; i < data_writes.size(); ++i) { bool is_fin = fin && (i == data_writes.size() - 1); - quic::QuicFrame quic_frame(quic::QuicStreamFrame( - stream_id, is_fin, offset, quic::QuicStringPiece(data_writes[i]))); + quic::QuicFrame quic_frame(GenerateNextStreamFrame( + stream_id, is_fin, quic::QuicStringPiece(data_writes[i]))); DVLOG(1) << "Adding frame: " << quic_frame; frames.push_back(quic_frame); - offset += data_writes[i].length(); } return MakeMultipleFramesPacket(header_, frames, nullptr); } @@ -939,11 +928,9 @@ if (spdy_headers_frame_length) *spdy_headers_frame_length = spdy_frame.size(); - quic::QuicStreamFrame frame( + quic::QuicStreamFrame frame = GenerateNextStreamFrame( quic::QuicUtils::GetHeadersStreamId(version_.transport_version), false, - header_stream_offset_, quic::QuicStringPiece(spdy_frame.data(), spdy_frame.size())); - header_stream_offset_ += spdy_frame.size(); return MakePacket(header_, quic::QuicFrame(frame)); } @@ -964,11 +951,9 @@ if (spdy_headers_frame_length) { *spdy_headers_frame_length = spdy_frame.size(); } - quic::QuicStreamFrame headers_frame( + quic::QuicStreamFrame headers_frame = GenerateNextStreamFrame( quic::QuicUtils::GetHeadersStreamId(version_.transport_version), false, - header_stream_offset_, quic::QuicStringPiece(spdy_frame.data(), spdy_frame.size())); - header_stream_offset_ += spdy_frame.size(); quic::QuicRstStreamFrame rst_frame(1, stream_id, error_code, bytes_written); @@ -1030,11 +1015,9 @@ if (spdy_headers_frame_length) { *spdy_headers_frame_length = spdy_frame.size(); } - quic::QuicStreamFrame frame( + quic::QuicStreamFrame frame = GenerateNextStreamFrame( quic::QuicUtils::GetHeadersStreamId(version_.transport_version), false, - header_stream_offset_, quic::QuicStringPiece(spdy_frame.data(), spdy_frame.size())); - header_stream_offset_ += spdy_frame.size(); return MakePacket(header_, quic::QuicFrame(frame)); } @@ -1076,11 +1059,9 @@ if (spdy_headers_frame_length) { *spdy_headers_frame_length = spdy_frame.size(); } - quic::QuicStreamFrame frame( + quic::QuicStreamFrame frame = GenerateNextStreamFrame( quic::QuicUtils::GetHeadersStreamId(version_.transport_version), false, - header_stream_offset_, quic::QuicStringPiece(spdy_frame.data(), spdy_frame.size())); - header_stream_offset_ += spdy_frame.size(); return MakePacket(header_, quic::QuicFrame(frame)); } @@ -1213,11 +1194,9 @@ spdy::SpdySerializedFrame spdy_frame( spdy_request_framer_.SerializeFrame(settings_frame)); InitializeHeader(packet_number, should_include_version); - quic::QuicStreamFrame quic_frame( + quic::QuicStreamFrame quic_frame = GenerateNextStreamFrame( quic::QuicUtils::GetHeadersStreamId(version_.transport_version), false, - header_stream_offset_, quic::QuicStringPiece(spdy_frame.data(), spdy_frame.size())); - header_stream_offset_ += spdy_frame.size(); return MakePacket(header_, quic::QuicFrame(quic_frame)); } @@ -1232,11 +1211,9 @@ spdy_request_framer_.SerializeFrame(settings_frame)); InitializeHeader(packet_number, /*should_include_version*/ true); *stream_data = std::string(spdy_frame.data(), spdy_frame.size()); - quic::QuicStreamFrame quic_frame( + quic::QuicStreamFrame quic_frame = GenerateNextStreamFrame( quic::QuicUtils::GetHeadersStreamId(version_.transport_version), false, - header_stream_offset_, quic::QuicStringPiece(spdy_frame.data(), spdy_frame.size())); - header_stream_offset_ += spdy_frame.size(); return MakePacket(header_, quic::QuicFrame(quic_frame)); } @@ -1255,11 +1232,9 @@ spdy::SpdySerializedFrame spdy_frame( spdy_request_framer_.SerializeFrame(priority_frame)); - quic::QuicStreamFrame quic_frame( + quic::QuicStreamFrame quic_frame = GenerateNextStreamFrame( quic::QuicUtils::GetHeadersStreamId(version_.transport_version), false, - header_stream_offset_, quic::QuicStringPiece(spdy_frame.data(), spdy_frame.size())); - header_stream_offset_ += spdy_frame.size(); DVLOG(1) << "Adding frame: " << quic::QuicFrame(quic_frame); InitializeHeader(packet_number, should_include_version); return MakePacket(header_, quic::QuicFrame(quic_frame)); @@ -1299,11 +1274,9 @@ spdy_request_framer_.SerializeFrame(priority_frame))); spdy::SpdySerializedFrame* spdy_frame = spdy_frames.back().get(); - quic::QuicStreamFrame stream_frame( + quic::QuicStreamFrame stream_frame = GenerateNextStreamFrame( quic::QuicUtils::GetHeadersStreamId(version_.transport_version), false, - header_stream_offset_, quic::QuicStringPiece(spdy_frame->data(), spdy_frame->size())); - header_stream_offset_ += spdy_frame->size(); frames.push_back(quic::QuicFrame(stream_frame)); DVLOG(1) << "Adding frame: " << frames.back(); @@ -1338,6 +1311,15 @@ return include_version; } +quic::QuicStreamFrame QuicTestPacketMaker::GenerateNextStreamFrame( + quic::QuicStreamId stream_id, + bool fin, + quic::QuicStringPiece data) { + quic::QuicStreamFrame frame(stream_id, fin, stream_offsets_[stream_id], data); + stream_offsets_[stream_id] += data.length(); + return frame; +} + quic::QuicPacketNumberLength QuicTestPacketMaker::GetPacketNumberLength() const { if (version_.transport_version > quic::QUIC_VERSION_43 && @@ -1368,7 +1350,9 @@ } void QuicTestPacketMaker::Reset() { - header_stream_offset_ = 0; + for (const auto& kv : stream_offsets_) { + stream_offsets_[kv.first] = 0; + } } } // namespace test
diff --git a/net/quic/quic_test_packet_maker.h b/net/quic/quic_test_packet_maker.h index 5ebdb79..06ebb9c9 100644 --- a/net/quic/quic_test_packet_maker.h +++ b/net/quic/quic_test_packet_maker.h
@@ -17,6 +17,7 @@ #include "net/base/request_priority.h" #include "net/third_party/quiche/src/quic/core/quic_packets.h" #include "net/third_party/quiche/src/quic/core/quic_stream_frame_data_producer.h" +#include "net/third_party/quiche/src/quic/core/quic_utils.h" #include "net/third_party/quiche/src/quic/platform/api/quic_string_piece.h" #include "net/third_party/quiche/src/quic/test_tools/mock_clock.h" #include "net/third_party/quiche/src/quic/test_tools/mock_random.h" @@ -184,7 +185,6 @@ quic::QuicStreamId stream_id, bool should_include_version, bool fin, - quic::QuicStreamOffset offset, quic::QuicStringPiece data); std::unique_ptr<quic::QuicReceivedPacket> MakeHeadersDataPacket( uint64_t packet_number, @@ -203,7 +203,6 @@ quic::QuicStreamId stream_id, bool should_include_version, bool fin, - quic::QuicStreamOffset offset, const std::vector<std::string>& data_writes); std::unique_ptr<quic::QuicReceivedPacket> MakeAckAndDataPacket( uint64_t packet_number, @@ -213,7 +212,6 @@ uint64_t smallest_received, uint64_t least_unacked, bool fin, - quic::QuicStreamOffset offset, quic::QuicStringPiece data); std::unique_ptr<quic::QuicReceivedPacket> MakeAckAndMultipleDataFramesPacket( uint64_t packet_number, @@ -223,7 +221,6 @@ uint64_t smallest_received, uint64_t least_unacked, bool fin, - quic::QuicStreamOffset offset, const std::vector<std::string>& data); std::unique_ptr<quic::QuicReceivedPacket> @@ -344,12 +341,14 @@ void Reset(); - quic::QuicStreamOffset header_stream_offset() const { - return header_stream_offset_; + quic::QuicStreamOffset header_stream_offset() { + return stream_offsets_[quic::QuicUtils::GetHeadersStreamId( + version_.transport_version)]; } void set_header_stream_offset(quic::QuicStreamOffset offset) { - header_stream_offset_ = offset; + stream_offsets_[quic::QuicUtils::GetHeadersStreamId( + version_.transport_version)] = offset; } private: @@ -372,6 +371,10 @@ bool ShouldIncludeVersion(bool include_version) const; + quic::QuicStreamFrame GenerateNextStreamFrame(quic::QuicStreamId stream_id, + bool fin, + quic::QuicStringPiece data); + quic::QuicPacketNumberLength GetPacketNumberLength() const; quic::QuicConnectionIdIncluded HasDestinationConnectionId() const; @@ -384,7 +387,7 @@ spdy::SpdyFramer spdy_request_framer_; spdy::SpdyFramer spdy_response_framer_; quic::test::MockRandom random_generator_; - quic::QuicStreamOffset header_stream_offset_; + std::map<quic::QuicStreamId, quic::QuicStreamOffset> stream_offsets_; quic::QuicPacketHeader header_; quic::Perspective perspective_; quic::EncryptionLevel encryption_level_;
diff --git a/net/quic/quic_test_packet_printer.cc b/net/quic/quic_test_packet_printer.cc index 6db02a56..b748544 100644 --- a/net/quic/quic_test_packet_printer.cc +++ b/net/quic/quic_test_packet_printer.cc
@@ -78,21 +78,21 @@ } bool OnAckFrameStart(QuicPacketNumber largest_acked, QuicTime::Delta /*ack_delay_time*/) override { - *output_ << "OnAckFrameStart, largest_acked: " << largest_acked; + *output_ << "OnAckFrameStart, largest_acked: " << largest_acked << "\n"; return true; } bool OnAckRange(QuicPacketNumber start, QuicPacketNumber end) override { - *output_ << "OnAckRange: [" << start << ", " << end << ")"; + *output_ << "OnAckRange: [" << start << ", " << end << ")\n"; return true; } bool OnAckTimestamp(QuicPacketNumber packet_number, QuicTime timestamp) override { *output_ << "OnAckTimestamp: [" << packet_number << ", " - << timestamp.ToDebuggingValue() << ")"; + << timestamp.ToDebuggingValue() << ")\n"; return true; } bool OnAckFrameEnd(QuicPacketNumber start) override { - *output_ << "OnAckFrameEnd, start: " << start; + *output_ << "OnAckFrameEnd, start: " << start << "\n"; return true; } bool OnStopWaitingFrame(const QuicStopWaitingFrame& frame) override {
diff --git a/net/tools/gssapi/README.md b/net/tools/gssapi/README.md new file mode 100644 index 0000000..23c7075 --- /dev/null +++ b/net/tools/gssapi/README.md
@@ -0,0 +1,5 @@ +# Fake GSSAPI Library + +This directory has the pieces necessary to build a fake GSSAPI library that +looks like the real thing to `//net`'s GSSAPI support. It's used for smoke +testing the library loading logic.
diff --git a/net/tools/gssapi/gss_import_name.cc b/net/tools/gssapi/gss_import_name.cc new file mode 100644 index 0000000..fd5a8ec --- /dev/null +++ b/net/tools/gssapi/gss_import_name.cc
@@ -0,0 +1,25 @@ +// 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 "net/tools/gssapi/gss_types.h" + +// These two imports follow the same pattern as those in gss_methods.cc but are +// separated out so that we can build a GSSAPI library that's missing a couple +// of imports. + +extern "C" GSS_EXPORT OM_uint32 +gss_import_name(OM_uint32* minor_status, + const gss_buffer_t input_name_buffer, + const gss_OID input_name_type, + gss_name_t* output_name) { + return 0; +} + +extern "C" GSS_EXPORT OM_uint32 gss_release_name(OM_uint32* minor_status, + gss_name_t* input_name) { + *minor_status = 0; + delete *input_name; + *input_name = nullptr; + return 0; +}
diff --git a/net/tools/gssapi/gss_methods.cc b/net/tools/gssapi/gss_methods.cc new file mode 100644 index 0000000..6a1647e --- /dev/null +++ b/net/tools/gssapi/gss_methods.cc
@@ -0,0 +1,80 @@ +// 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 <cstring> + +#include "net/tools/gssapi/gss_types.h" + +// Only the GSSAPI exports used by //net are defined here and in +// gss_import_name.cc. + +extern "C" GSS_EXPORT OM_uint32 gss_release_buffer(OM_uint32* minor_status, + gss_buffer_t buffer) { + *minor_status = 0; + return 0; +} + +extern "C" GSS_EXPORT OM_uint32 +gss_display_name(OM_uint32* minor_status, + const gss_name_t input_name, + gss_buffer_t output_name_buffer, + gss_OID* output_name_type) { + return 0; +} + +extern "C" GSS_EXPORT OM_uint32 gss_display_status(OM_uint32* minor_status, + OM_uint32 status_value, + int status_type, + const gss_OID mech_type, + OM_uint32* message_contex, + gss_buffer_t status_string) { + return 0; +} + +extern "C" GSS_EXPORT OM_uint32 +gss_init_sec_context(OM_uint32* minor_status, + const gss_cred_id_t initiator_cred_handle, + gss_ctx_id_t* context_handle, + const gss_name_t target_name, + const gss_OID mech_type, + OM_uint32 req_flags, + OM_uint32 time_req, + const gss_channel_bindings_t input_chan_bindings, + const gss_buffer_t input_token, + gss_OID* actual_mech_type, + gss_buffer_t output_token, + OM_uint32* ret_flags, + OM_uint32* time_rec) { + return 0; +} + +extern "C" GSS_EXPORT OM_uint32 +gss_wrap_size_limit(OM_uint32* minor_status, + const gss_ctx_id_t context_handle, + int conf_req_flag, + gss_qop_t qop_req, + OM_uint32 req_output_size, + OM_uint32* max_input_size) { + return 0; +} + +extern "C" GSS_EXPORT OM_uint32 +gss_delete_sec_context(OM_uint32* minor_status, + gss_ctx_id_t* context_handle, + gss_buffer_t output_token) { + return 0; +} + +extern "C" GSS_EXPORT OM_uint32 +gss_inquire_context(OM_uint32* minor_status, + const gss_ctx_id_t context_handle, + gss_name_t* src_name, + gss_name_t* targ_name, + OM_uint32* lifetime_rec, + gss_OID* mech_type, + OM_uint32* ctx_flags, + int* locally_initiated, + int* open) { + return 0; +}
diff --git a/net/tools/gssapi/gss_types.h b/net/tools/gssapi/gss_types.h new file mode 100644 index 0000000..5774b49 --- /dev/null +++ b/net/tools/gssapi/gss_types.h
@@ -0,0 +1,67 @@ +// 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 NET_TOOLS_GSSAPI_GSS_TYPES_H_ +#define NET_TOOLS_GSSAPI_GSS_TYPES_H_ + +#include <cstdint> +#include <string> +#include <vector> + +// Define a minimal subset of the definitions needed to build a loadable fake +// GSSAPI library. The bindings follow RFC 2744. The code follows the RFC +// faithfully with the possible exception of `const` qualifiers for some +// function arguments. +// +// Note that //net/http/http_auth_gssapi_posix* functions depend on the gssapi.h +// as found on the host platform. For test purposes file does not depend on the +// system gssapi.h in order to reduce sensitivity to the host environment. +// +// These declarations follow RFC 2744 Appendix A with the exception of using +// C++isms in some places. + +using OM_uint32 = uint32_t; +using gss_qop_t = uint32_t; + +struct gss_buffer_desc_struct { + size_t length; + void* value; +}; +using gss_buffer_desc = gss_buffer_desc_struct; +using gss_buffer_t = gss_buffer_desc_struct*; + +struct gss_OID_desc_struct { + OM_uint32 length; + void* elements; +}; +using gss_OID_desc = gss_OID_desc_struct; +using gss_OID = gss_OID_desc_struct*; + +struct gss_channel_bindings_struct { + OM_uint32 initiator_addrtype; + gss_buffer_desc initiator_address; + OM_uint32 acceptor_addrtype; + gss_buffer_desc acceptor_address; + gss_buffer_desc application_data; +}; +using gss_channel_bindings_t = gss_channel_bindings_struct*; + +// Following structures are defined as <implementation-specific>. + +struct FakeGssName {}; +using gss_name_t = FakeGssName*; + +struct FakeGssCredId {}; +using gss_cred_id_t = FakeGssCredId*; + +struct FakeGssCtxId {}; +using gss_ctx_id_t = FakeGssCtxId*; + +#if defined(WIN32) +#define GSS_EXPORT __declspec(dllexport) +#else +#define GSS_EXPORT __attribute__((visibility("default"))) +#endif + +#endif // NET_TOOLS_GSSAPI_GSS_TYPES_H_
diff --git a/pdf/pdfium/pdfium_engine.cc b/pdf/pdfium/pdfium_engine.cc index bced612..613950e3 100644 --- a/pdf/pdfium/pdfium_engine.cc +++ b/pdf/pdfium/pdfium_engine.cc
@@ -2409,7 +2409,7 @@ FPDFBookmark_GetFirstChild(doc(), bookmark); child_bookmark; child_bookmark = FPDFBookmark_GetNextSibling(doc(), child_bookmark)) { - if (base::ContainsKey(seen_bookmarks, child_bookmark)) + if (base::Contains(seen_bookmarks, child_bookmark)) break; seen_bookmarks.insert(child_bookmark); @@ -2913,7 +2913,7 @@ } bool PDFiumEngine::IsPageVisible(int index) const { - return base::ContainsValue(visible_pages_, index); + return base::Contains(visible_pages_, index); } void PDFiumEngine::ScrollToPage(int page) { @@ -2934,7 +2934,7 @@ FX_DOWNLOADHINTS& download_hints = document_->download_hints(); if (!FPDFAvail_IsPageAvail(fpdf_availability(), index, &download_hints)) { - if (!base::ContainsValue(*pending, index)) + if (!base::Contains(*pending, index)) pending->push_back(index); return false; }
diff --git a/ppapi/proxy/ppapi_proxy_test.h b/ppapi/proxy/ppapi_proxy_test.h index 01ac6a7..3f39598 100644 --- a/ppapi/proxy/ppapi_proxy_test.h +++ b/ppapi/proxy/ppapi_proxy_test.h
@@ -14,9 +14,9 @@ #include "base/compiler_specific.h" #include "base/macros.h" #include "base/memory/ref_counted.h" -#include "base/message_loop/message_loop.h" #include "base/synchronization/waitable_event.h" #include "base/task_runner.h" +#include "base/test/scoped_task_environment.h" #include "base/threading/simple_thread.h" #include "base/threading/thread.h" #include "ppapi/c/pp_instance.h" @@ -202,7 +202,7 @@ virtual void SetUp(); virtual void TearDown(); private: - base::MessageLoop message_loop_; + base::test::ScopedTaskEnvironment scoped_task_environment_; }; // This class provides support for multi-thread testing. A secondary thread is @@ -334,7 +334,7 @@ virtual void SetUp(); virtual void TearDown(); private: - base::MessageLoop message_loop_; + base::test::ScopedTaskEnvironment scoped_task_environment_; }; // Use this base class to test both sides of a proxy. @@ -372,7 +372,7 @@ // The plugin side of the proxy runs on its own thread. base::Thread plugin_thread_; // The message loop for the main (host) thread. - base::MessageLoop message_loop_; + base::test::ScopedTaskEnvironment scoped_task_environment_; // Aliases for the host and plugin harnesses; if we're testing a PPP // interface, remote_harness will point to plugin_, and local_harness
diff --git a/ppapi/proxy/raw_var_data_unittest.cc b/ppapi/proxy/raw_var_data_unittest.cc index 712ee67..59c56641 100644 --- a/ppapi/proxy/raw_var_data_unittest.cc +++ b/ppapi/proxy/raw_var_data_unittest.cc
@@ -12,7 +12,7 @@ #include "base/bind.h" #include "base/logging.h" #include "base/memory/ref_counted.h" -#include "base/message_loop/message_loop.h" +#include "base/test/scoped_task_environment.h" #include "base/values.h" #include "ppapi/c/pp_bool.h" #include "ppapi/c/pp_var.h" @@ -52,7 +52,8 @@ } private: - base::MessageLoop message_loop_; // Required to receive callbacks. + base::test::ScopedTaskEnvironment + scoped_task_environment_; // Required to receive callbacks. TestGlobals globals_; };
diff --git a/remoting/base/oauth_token_exchanger.cc b/remoting/base/oauth_token_exchanger.cc index 090af451..c08c8aa4 100644 --- a/remoting/base/oauth_token_exchanger.cc +++ b/remoting/base/oauth_token_exchanger.cc
@@ -191,6 +191,15 @@ return; } + // When offline mode is used, this class will return a new refresh token + // as well as an access token. It doesn't make sense to continue exchanging + // tokens every hour in this case. OAuthTokenGetterImpl remembers the new + // refresh token and uses that for fetching new access tokens every hour. So + // there's no need for further token-exchanges after the first successful one. + if (offline_mode_) { + need_token_exchange_ = false; + } + // The redirect_uri parameter is required for GetTokensFromAuthCode(), but // "oob" (out of band) can be used for robot accounts. gaia::OAuthClientInfo client_info = {
diff --git a/remoting/base/oauth_token_exchanger.h b/remoting/base/oauth_token_exchanger.h index 8abda96d7..74bc931 100644 --- a/remoting/base/oauth_token_exchanger.h +++ b/remoting/base/oauth_token_exchanger.h
@@ -77,7 +77,7 @@ base::queue<TokenCallback> pending_callbacks_; std::string oauth_access_token_; - bool offline_mode_ = false; + bool offline_mode_ = true; // True if the OAuth refresh token is lacking required scopes and the // token-exchange service is needed to provide a new access-token.
diff --git a/remoting/resources/remoting_strings_am.xtb b/remoting/resources/remoting_strings_am.xtb index 15cfaaf..835d4fb 100644 --- a/remoting/resources/remoting_strings_am.xtb +++ b/remoting/resources/remoting_strings_am.xtb
@@ -284,6 +284,7 @@ <translation id="7116737094673640201">እንኳን ወደ Chrome የርቀት ዴስክቶፕ በደህና መጡ</translation> <translation id="7144878232160441200">እንደገና ሞክር</translation> <translation id="7149517134817561223">ለChrome የርቀት ዴስክቶፕ አስተናጋጅ ትዕዛዞችን የሚሰጥ መተግበሪያ።</translation> +<translation id="7213491505512310433">የማረጋገያ ማሻሻያዎች እና የሳንካ ጥገናዎች።</translation> <translation id="7215059001581613786">እባክዎ ስድስት ወይም ከዚያ በላይ የሆነ አኃዝ ያለው ፒን ያስገቡ።</translation> <translation id="7312846573060934304">አስተናጋጅ ከመስመር ውጪ ነው።</translation> <translation id="7319983568955948908">ማጋራት አቁም</translation>
diff --git a/remoting/resources/remoting_strings_bg.xtb b/remoting/resources/remoting_strings_bg.xtb index 4884ddb1..5271881 100644 --- a/remoting/resources/remoting_strings_bg.xtb +++ b/remoting/resources/remoting_strings_bg.xtb
@@ -284,6 +284,7 @@ <translation id="7116737094673640201">Добре дошли в Отдалечен работен плот на Chrome</translation> <translation id="7144878232160441200">Нов опит</translation> <translation id="7149517134817561223">Приложение, което да издава команди към хоста на отдалечения работен плот на Chrome.</translation> +<translation id="7213491505512310433">Подобрения в стабилността и отстранени програмни грешки.</translation> <translation id="7215059001581613786">Моля, въведете ПИН код, състоящ се от шест или повече цифри.</translation> <translation id="7312846573060934304">Хостът е офлайн.</translation> <translation id="7319983568955948908">Спиране на споделянето</translation>
diff --git a/remoting/resources/remoting_strings_bn.xtb b/remoting/resources/remoting_strings_bn.xtb index adef27b..2af63b8 100644 --- a/remoting/resources/remoting_strings_bn.xtb +++ b/remoting/resources/remoting_strings_bn.xtb
@@ -284,6 +284,7 @@ <translation id="7116737094673640201">Chrome রিমোট ডেস্কটপে স্বাগত</translation> <translation id="7144878232160441200">আবার চেষ্টা করুন</translation> <translation id="7149517134817561223">Chrome রিমোট ডেস্কটপ হোস্টের জন্য কম্যান্ড ইস্যু করে যে অ্যাপ।</translation> +<translation id="7213491505512310433">স্থিতিশীলতার উন্নতি ও সমস্যার সমাধান।</translation> <translation id="7215059001581613786">ছয়টি অথবা তার বেশি সংখ্যার একটি পিন লিখুন৷</translation> <translation id="7312846573060934304">হোস্ট এখন অফলাইনে।</translation> <translation id="7319983568955948908">শেয়ার করা বন্ধ করুন</translation>
diff --git a/remoting/resources/remoting_strings_ca.xtb b/remoting/resources/remoting_strings_ca.xtb index a74565db..fbd41e7 100644 --- a/remoting/resources/remoting_strings_ca.xtb +++ b/remoting/resources/remoting_strings_ca.xtb
@@ -284,6 +284,7 @@ <translation id="7116737094673640201">Et donem la benvinguda a Escriptori remot de Chrome</translation> <translation id="7144878232160441200">Torna-ho a provar</translation> <translation id="7149517134817561223">Aplicació que ha d'emetre les ordres per a l'amfitrió de l'escriptori remot de Chrome.</translation> +<translation id="7213491505512310433">Millores d'estabilitat i correcció d'errors.</translation> <translation id="7215059001581613786">Introduïu un PIN que tingui sis dígits o més.</translation> <translation id="7312846573060934304">L'amfitrió no està connectat</translation> <translation id="7319983568955948908">Deixa de compartir</translation> @@ -320,7 +321,7 @@ <translation id="811307782653349804">Accediu al vostre ordinador des de qualsevol lloc.</translation> <translation id="8116630183974937060">S'ha produït un error de xarxa. Comproveu que el dispositiu estigui en línia i torneu-ho a provar.</translation> <translation id="8123581458650016326">Permet que els usuaris remots controlin aquest ordinador</translation> -<translation id="8178433417677596899">Pantalla compartida entre usuaris, una opció perfecta per a l'assistència tècnica remota.</translation> +<translation id="8178433417677596899">Compartició de pantalla entre usuaris, una opció perfecta per a l'assistència tècnica remota.</translation> <translation id="8187079423890319756">Copyright 2013 Els autors de Chromium. Tots els drets reservats.</translation> <translation id="8196755618196986400">La vostra adreça electrònica s'inclourà en tots els suggeriments que envieu perquè us puguem escriure i proporcionar-vos més informació.</translation> <translation id="8244400547700556338">Més informació</translation>
diff --git a/remoting/resources/remoting_strings_cs.xtb b/remoting/resources/remoting_strings_cs.xtb index 37f542c..0b2b5b5 100644 --- a/remoting/resources/remoting_strings_cs.xtb +++ b/remoting/resources/remoting_strings_cs.xtb
@@ -284,6 +284,7 @@ <translation id="7116737094673640201">Vítá vás Vzdálená plocha Chrome</translation> <translation id="7144878232160441200">Opakovat</translation> <translation id="7149517134817561223">Aplikace, která vydává příkazy hostiteli vzdálené plochy Chrome.</translation> +<translation id="7213491505512310433">Vylepšení stability a opravy chyb.</translation> <translation id="7215059001581613786">Zadejte kód PIN obsahující 6 nebo více číslic.</translation> <translation id="7312846573060934304">Hostitel je offline.</translation> <translation id="7319983568955948908">Ukončit sdílení</translation>
diff --git a/remoting/resources/remoting_strings_el.xtb b/remoting/resources/remoting_strings_el.xtb index c3125db..c58f168 100644 --- a/remoting/resources/remoting_strings_el.xtb +++ b/remoting/resources/remoting_strings_el.xtb
@@ -284,6 +284,7 @@ <translation id="7116737094673640201">Καλώς ήρθατε στην Απομακρυσμένη επιφάνεια εργασίας Chrome</translation> <translation id="7144878232160441200">Δοκιμάστε ξανά</translation> <translation id="7149517134817561223">Εφαρμογή για έκδοση εντολών στον κεντρικό υπολογιστή απομακρυσμένης επιφάνειας εργασίας Chrome.</translation> +<translation id="7213491505512310433">Βελτιώσεις σταθερότητας και διορθώσεις σφαλμάτων.</translation> <translation id="7215059001581613786">Εισαγάγετε ένα PIN που να αποτελείται από έξι ή περισσότερα ψηφία.</translation> <translation id="7312846573060934304">Ο κεντρικός υπολογιστής είναι εκτός σύνδεσης.</translation> <translation id="7319983568955948908">Διακοπή κοινής χρήσης</translation>
diff --git a/remoting/resources/remoting_strings_en-GB.xtb b/remoting/resources/remoting_strings_en-GB.xtb index b665a8e..6126109 100644 --- a/remoting/resources/remoting_strings_en-GB.xtb +++ b/remoting/resources/remoting_strings_en-GB.xtb
@@ -284,6 +284,7 @@ <translation id="7116737094673640201">Welcome to Chrome Remote Desktop</translation> <translation id="7144878232160441200">Retry</translation> <translation id="7149517134817561223">Application to issue commands to Chrome remote desktop host.</translation> +<translation id="7213491505512310433">Stability improvements and bug fixes.</translation> <translation id="7215059001581613786">Please enter a PIN consisting of six or more digits.</translation> <translation id="7312846573060934304">Host is offline.</translation> <translation id="7319983568955948908">Stop Sharing</translation>
diff --git a/remoting/resources/remoting_strings_et.xtb b/remoting/resources/remoting_strings_et.xtb index 2fe4d7b..5de72257 100644 --- a/remoting/resources/remoting_strings_et.xtb +++ b/remoting/resources/remoting_strings_et.xtb
@@ -284,6 +284,7 @@ <translation id="7116737094673640201">Tere tulemast kasutama Chrome Remote Desktopi!</translation> <translation id="7144878232160441200">Proovi uuesti</translation> <translation id="7149517134817561223">Rakendus, millega saate Chrome Remote Desktopi hostile käske saata.</translation> +<translation id="7213491505512310433">Stabiilsuse täiustused ja veaparandused</translation> <translation id="7215059001581613786">Sisestage vähemalt kuuest numbrist koosnev PIN-kood.</translation> <translation id="7312846573060934304">Host pole võrgus.</translation> <translation id="7319983568955948908">Lõpeta jagamine</translation>
diff --git a/remoting/resources/remoting_strings_fi.xtb b/remoting/resources/remoting_strings_fi.xtb index 71d44ab..6d4f7c7 100644 --- a/remoting/resources/remoting_strings_fi.xtb +++ b/remoting/resources/remoting_strings_fi.xtb
@@ -284,6 +284,7 @@ <translation id="7116737094673640201">Tervetuloa Chrome-etäkäyttöön</translation> <translation id="7144878232160441200">Yritä uudelleen</translation> <translation id="7149517134817561223">Sovellus, joka antaa komentoja Chromen etätyöpöytäisännälle.</translation> +<translation id="7213491505512310433">Vakausparannuksia ja virheenkorjauksia</translation> <translation id="7215059001581613786">Anna PIN-koodi, jossa on vähintään kuusi numeroa.</translation> <translation id="7312846573060934304">Isäntä on offline-tilassa.</translation> <translation id="7319983568955948908">Lopeta jakaminen</translation>
diff --git a/remoting/resources/remoting_strings_fr.xtb b/remoting/resources/remoting_strings_fr.xtb index 8545852..cf09aae9 100644 --- a/remoting/resources/remoting_strings_fr.xtb +++ b/remoting/resources/remoting_strings_fr.xtb
@@ -284,6 +284,7 @@ <translation id="7116737094673640201">Bienvenue dans le bureau à distance Chrome</translation> <translation id="7144878232160441200">Réessayer</translation> <translation id="7149517134817561223">Demande pour émettre des commandes à l'hôte du Bureau à distance Chrome</translation> +<translation id="7213491505512310433">Amélioration de la stabilité et correction de bugs.</translation> <translation id="7215059001581613786">Veuillez saisir un code d'accès composé d'au moins six chiffres.</translation> <translation id="7312846573060934304">L'hôte est hors ligne</translation> <translation id="7319983568955948908">Arrêter le partage</translation>
diff --git a/remoting/resources/remoting_strings_hr.xtb b/remoting/resources/remoting_strings_hr.xtb index e074f21..05773d2 100644 --- a/remoting/resources/remoting_strings_hr.xtb +++ b/remoting/resources/remoting_strings_hr.xtb
@@ -284,6 +284,7 @@ <translation id="7116737094673640201">Dobro došli na Udaljenu radnu površinu Chrome</translation> <translation id="7144878232160441200">Pokušaj ponovo</translation> <translation id="7149517134817561223">Aplikacija za izdavanje naredbi hostu Udaljene radne površine Chrome.</translation> +<translation id="7213491505512310433">Poboljšanja stabilnosti i ispravci programskih pogrešaka.</translation> <translation id="7215059001581613786">Unesite PIN koji se sastoji od šest ili više znamenki.</translation> <translation id="7312846573060934304">Host je izvan mreže.</translation> <translation id="7319983568955948908">Zaustavi dijeljenje</translation>
diff --git a/remoting/resources/remoting_strings_hu.xtb b/remoting/resources/remoting_strings_hu.xtb index 7007e88..823adb7 100644 --- a/remoting/resources/remoting_strings_hu.xtb +++ b/remoting/resources/remoting_strings_hu.xtb
@@ -284,6 +284,7 @@ <translation id="7116737094673640201">Üdvözli a Chrome távoliasztal-szolgáltatás</translation> <translation id="7144878232160441200">Újra</translation> <translation id="7149517134817561223">Alkalmazás parancsok kiadására a Chrome távoliasztal-szolgáltatás gazdagépének.</translation> +<translation id="7213491505512310433">Stabilitási fejlesztések és programhiba-javítások.</translation> <translation id="7215059001581613786">Kérjük, legalább hat számjegyből álló PIN kódot adjon meg.</translation> <translation id="7312846573060934304">A gazdagép offline állapotban van.</translation> <translation id="7319983568955948908">Megosztás leállítása</translation>
diff --git a/remoting/resources/remoting_strings_it.xtb b/remoting/resources/remoting_strings_it.xtb index 4cc48e3..61d353e 100644 --- a/remoting/resources/remoting_strings_it.xtb +++ b/remoting/resources/remoting_strings_it.xtb
@@ -284,6 +284,7 @@ <translation id="7116737094673640201">Benvenuto in Chrome Remote Desktop</translation> <translation id="7144878232160441200">Riprova</translation> <translation id="7149517134817561223">Applicazione per fornire comandi all'host Chrome Remote Desktop.</translation> +<translation id="7213491505512310433">Stabilità migliorata e correzioni di bug.</translation> <translation id="7215059001581613786">Inserisci un PIN formato da almeno sei cifre.</translation> <translation id="7312846573060934304">L'host è offline.</translation> <translation id="7319983568955948908">Interrompi condivisione</translation>
diff --git a/remoting/resources/remoting_strings_lt.xtb b/remoting/resources/remoting_strings_lt.xtb index 44db64aa..4c0041f 100644 --- a/remoting/resources/remoting_strings_lt.xtb +++ b/remoting/resources/remoting_strings_lt.xtb
@@ -284,6 +284,7 @@ <translation id="7116737094673640201">Sveiki, tai – „Chrome“ nuotolinis kompiuterio valdymas!</translation> <translation id="7144878232160441200">Bandyti dar kartą</translation> <translation id="7149517134817561223">Programa, skirta komandoms perduoti į „Chrome“ nuotolinio kompiuterio valdymo prieglobą.</translation> +<translation id="7213491505512310433">Stabilumo patobulinimai ir riktų pataisymai.</translation> <translation id="7215059001581613786">Įveskite PIN kodą, sudarytą iš šešių ar daugiau skaitmenų.</translation> <translation id="7312846573060934304">Prieglobos kompiuteris neprisijungęs.</translation> <translation id="7319983568955948908">Stabdyti bendrinimą</translation>
diff --git a/remoting/resources/remoting_strings_lv.xtb b/remoting/resources/remoting_strings_lv.xtb index fdc8aea..e31286b 100644 --- a/remoting/resources/remoting_strings_lv.xtb +++ b/remoting/resources/remoting_strings_lv.xtb
@@ -284,6 +284,7 @@ <translation id="7116737094673640201">Laipni lūdzam Chrome attālajā darbvirsmā!</translation> <translation id="7144878232160441200">Mēģināt vēlreiz</translation> <translation id="7149517134817561223">Lietojumprogramma, kas paredzēta komandu sniegšanai Chrome attālās darbvirsmas saimniekdatoram.</translation> +<translation id="7213491505512310433">Stabilitātes uzlabojumi un kļūdu labojumi</translation> <translation id="7215059001581613786">Lūdzu, ievadiet PIN, kura garums ir vismaz seši cipari.</translation> <translation id="7312846573060934304">Saimniekdators darbojas bezsaistes režīmā.</translation> <translation id="7319983568955948908">Pārtraukt koplietošanu</translation>
diff --git a/remoting/resources/remoting_strings_no.xtb b/remoting/resources/remoting_strings_no.xtb index 09586c2..d963cc92 100644 --- a/remoting/resources/remoting_strings_no.xtb +++ b/remoting/resources/remoting_strings_no.xtb
@@ -284,6 +284,7 @@ <translation id="7116737094673640201">Velkommen til Chrome Eksternt skrivebord</translation> <translation id="7144878232160441200">Prøv på nytt</translation> <translation id="7149517134817561223">Program som brukes til å sende kommandoer til verten for Chrome Eksternt skriverbord.</translation> +<translation id="7213491505512310433">Stabilitetsforbedringer og feilrettinger.</translation> <translation id="7215059001581613786">Skriv inn en PIN-kode på seks sifre eller fler.</translation> <translation id="7312846573060934304">Verten er uten nett.</translation> <translation id="7319983568955948908">Stopp deling</translation>
diff --git a/remoting/resources/remoting_strings_pl.xtb b/remoting/resources/remoting_strings_pl.xtb index aa893ac..a6149b8 100644 --- a/remoting/resources/remoting_strings_pl.xtb +++ b/remoting/resources/remoting_strings_pl.xtb
@@ -284,6 +284,7 @@ <translation id="7116737094673640201">Witamy w Pulpicie zdalnym Chrome</translation> <translation id="7144878232160441200">Ponów próbę</translation> <translation id="7149517134817561223">Aplikacja do wysyłania poleceń do hosta Pulpitu zdalnego Chrome.</translation> +<translation id="7213491505512310433">Większa stabilność i poprawki błędów.</translation> <translation id="7215059001581613786">Wpisz PIN złożony z co najmniej sześciu cyfr.</translation> <translation id="7312846573060934304">Host jest offline.</translation> <translation id="7319983568955948908">Zatrzymaj udostępnianie</translation>
diff --git a/remoting/resources/remoting_strings_pt-PT.xtb b/remoting/resources/remoting_strings_pt-PT.xtb index fc3854a..d217925f 100644 --- a/remoting/resources/remoting_strings_pt-PT.xtb +++ b/remoting/resources/remoting_strings_pt-PT.xtb
@@ -284,6 +284,7 @@ <translation id="7116737094673640201">Bem-vindo ao Ambiente de Trabalho Remoto do Chrome</translation> <translation id="7144878232160441200">Repetir</translation> <translation id="7149517134817561223">Aplicação para emitir comandos para o anfitrião do Ambiente de Trabalho Remoto do Chrome.</translation> +<translation id="7213491505512310433">Melhorias de estabilidade e correção de erros.</translation> <translation id="7215059001581613786">Introduza um PIN com seis ou mais dígitos.</translation> <translation id="7312846573060934304">O anfitrião está offline.</translation> <translation id="7319983568955948908">Terminar Partilha</translation>
diff --git a/remoting/resources/remoting_strings_ro.xtb b/remoting/resources/remoting_strings_ro.xtb index 0ddc86e5..ac385acc 100644 --- a/remoting/resources/remoting_strings_ro.xtb +++ b/remoting/resources/remoting_strings_ro.xtb
@@ -284,6 +284,7 @@ <translation id="7116737094673640201">Bun venit la Desktop la distanță Chrome</translation> <translation id="7144878232160441200">Reîncearcă</translation> <translation id="7149517134817561223">Aplicație pentru emiterea de comenzi către gazda Desktop la distanță Chrome.</translation> +<translation id="7213491505512310433">Stabilitate îmbunătățită și erori remediate.</translation> <translation id="7215059001581613786">Introduceți un cod PIN format din cel puțin șase cifre.</translation> <translation id="7312846573060934304">Gazda este offline.</translation> <translation id="7319983568955948908">Opriți permiterea accesului</translation>
diff --git a/remoting/resources/remoting_strings_sk.xtb b/remoting/resources/remoting_strings_sk.xtb index d399c65e..7efe87b6 100644 --- a/remoting/resources/remoting_strings_sk.xtb +++ b/remoting/resources/remoting_strings_sk.xtb
@@ -284,6 +284,7 @@ <translation id="7116737094673640201">Predstavujeme Vzdialenú plochu Chrome</translation> <translation id="7144878232160441200">Skúsiť znova</translation> <translation id="7149517134817561223">Aplikácia na zadávanie príkazov hostiteľovi Vzdialenej plochy Chrome.</translation> +<translation id="7213491505512310433">Zlepšenia stability a opravy chýb.</translation> <translation id="7215059001581613786">Zadajte kód PIN obsahujúci 6 alebo viac číslic.</translation> <translation id="7312846573060934304">Hostiteľ je v režime offline.</translation> <translation id="7319983568955948908">Prestať zdieľať</translation>
diff --git a/remoting/resources/remoting_strings_sl.xtb b/remoting/resources/remoting_strings_sl.xtb index ee9cafc..7d7c0cdae 100644 --- a/remoting/resources/remoting_strings_sl.xtb +++ b/remoting/resources/remoting_strings_sl.xtb
@@ -272,6 +272,7 @@ <translation id="7116737094673640201">Pozdravljeni v Oddaljenem namizju za Chrome</translation> <translation id="7144878232160441200">Poskusi znova</translation> <translation id="7149517134817561223">Aplikacija naj pošilja ukaze gostitelju Oddaljenega namizja za Chrome.</translation> +<translation id="7213491505512310433">Izboljšave stabilnosti in popravki napak.</translation> <translation id="7215059001581613786">Vnesite kodo PIN, ki mora biti vsaj šestmestna.</translation> <translation id="7312846573060934304">Gostitelj ni dosegljiv.</translation> <translation id="7319983568955948908">Prekliči skupno rabo</translation>
diff --git a/remoting/resources/remoting_strings_sr.xtb b/remoting/resources/remoting_strings_sr.xtb index ee7b00c..260a7a02 100644 --- a/remoting/resources/remoting_strings_sr.xtb +++ b/remoting/resources/remoting_strings_sr.xtb
@@ -284,6 +284,7 @@ <translation id="7116737094673640201">Добро дошли у Chrome удаљени рачунар</translation> <translation id="7144878232160441200">Пробај поново</translation> <translation id="7149517134817561223">Апликација издаје команде хосту за Chrome удаљени рачунар.</translation> +<translation id="7213491505512310433">Побољшања стабилности и исправке грешака.</translation> <translation id="7215059001581613786">Унесите PIN који се састоји од шест или више цифара.</translation> <translation id="7312846573060934304">Хост је офлајн.</translation> <translation id="7319983568955948908">Заустави дељење</translation>
diff --git a/remoting/resources/remoting_strings_sw.xtb b/remoting/resources/remoting_strings_sw.xtb index ae7630f..b8b2509 100644 --- a/remoting/resources/remoting_strings_sw.xtb +++ b/remoting/resources/remoting_strings_sw.xtb
@@ -284,6 +284,7 @@ <translation id="7116737094673640201">Karibu kwenye Programu ya Chrome ya Ufikiaji wa Kompyuta kutoka Mbali</translation> <translation id="7144878232160441200">Jaribu tena</translation> <translation id="7149517134817561223">Programu ya kupeleka amri kwa mpangishi wa kompyuta ya mbali kwenye Chrome.</translation> +<translation id="7213491505512310433">Kurekebishwa kwa hitilafu na kuboresha uthabiti.</translation> <translation id="7215059001581613786">Tafadhali ingiza PIN iliyo na tarakimu sita au zaidi.</translation> <translation id="7312846573060934304">Seva pangishi iko nje ya mtandao.</translation> <translation id="7319983568955948908">Acha Kushiriki</translation>
diff --git a/remoting/resources/remoting_strings_th.xtb b/remoting/resources/remoting_strings_th.xtb index ad40d4e..926480f 100644 --- a/remoting/resources/remoting_strings_th.xtb +++ b/remoting/resources/remoting_strings_th.xtb
@@ -284,6 +284,7 @@ <translation id="7116737094673640201">ยินดีต้อนรับสู่ Chrome Remote Desktop</translation> <translation id="7144878232160441200">ลองอีกครั้ง</translation> <translation id="7149517134817561223">แอปพลิเคชันที่จะออกคำสั่งให้โฮสต์ของ Chrome Remote Desktop</translation> +<translation id="7213491505512310433">ปรับปรุงความเสถียรและแก้ไขข้อบกพร่อง</translation> <translation id="7215059001581613786">โปรดป้อน PIN ที่ประกอบด้วยตัวเลขอย่างน้อยหกหลัก</translation> <translation id="7312846573060934304">โฮสต์ออฟไลน์</translation> <translation id="7319983568955948908">หยุดการแชร์</translation>
diff --git a/services/BUILD.gn b/services/BUILD.gn index d3e9aaf..1c26629 100644 --- a/services/BUILD.gn +++ b/services/BUILD.gn
@@ -12,6 +12,12 @@ # To add tests for a new service, please define a "tests" source_set in the # service subdirectory and add it as a dependency here. test("services_unittests") { + # The tracing unittests require this for testing unwinding. See + # stack_unwinder_android_unittest.cc. + if (is_android && can_unwind_with_cfi_table && is_official_build) { + add_unwind_tables_in_apk = true + } + # If your service does not run on iOS, its tests should go in the !iOS # section below. If you are unsure, contact blundell@chromium.org. deps = [ @@ -57,6 +63,7 @@ "//services/device:java", "//services/identity:java", "//services/media_session/public/cpp/android:media_session_java", + "//services/tracing:tracing_test_helper_java", # Some tests make network requests. "//net/android:net_java",
diff --git a/services/media_session/audio_focus_manager.cc b/services/media_session/audio_focus_manager.cc index ebb27d4..0e63a06 100644 --- a/services/media_session/audio_focus_manager.cc +++ b/services/media_session/audio_focus_manager.cc
@@ -111,8 +111,10 @@ MaybeUpdateActiveSession(); // Notify observers that we lost audio focus. - observers_.ForAllPtrs([&row](mojom::AudioFocusObserver* observer) { - observer->OnFocusLost(row->ToAudioFocusRequestState()); + mojom::AudioFocusRequestStatePtr session_state = + row->ToAudioFocusRequestState(); + observers_.ForAllPtrs([&session_state](mojom::AudioFocusObserver* observer) { + observer->OnFocusLost(session_state.Clone()); }); if (!was_top_most_session || audio_focus_stack_.empty())
diff --git a/services/network/BUILD.gn b/services/network/BUILD.gn index 8b69d3b..ba81fa45 100644 --- a/services/network/BUILD.gn +++ b/services/network/BUILD.gn
@@ -128,8 +128,8 @@ "resource_scheduler_params_manager.h", "restricted_cookie_manager.cc", "restricted_cookie_manager.h", - "sec_fetch_site.cc", - "sec_fetch_site.h", + "sec_header_helpers.cc", + "sec_header_helpers.h", "session_cleanup_cookie_store.cc", "session_cleanup_cookie_store.h", "socket_data_pump.cc", @@ -325,6 +325,7 @@ "resource_scheduler_params_manager_unittest.cc", "resource_scheduler_unittest.cc", "restricted_cookie_manager_unittest.cc", + "sec_header_helpers_unittest.cc", "session_cleanup_cookie_store_unittest.cc", "socket_data_pump_unittest.cc", "ssl_config_service_mojo_unittest.cc",
diff --git a/services/network/OWNERS b/services/network/OWNERS index 51949fa..a8476f61 100644 --- a/services/network/OWNERS +++ b/services/network/OWNERS
@@ -16,9 +16,9 @@ per-file cross_origin_read_blocking*=lukasza@chromium.org per-file cross_origin_resource_policy*=creis@chromium.org per-file cross_origin_resource_policy*=lukasza@chromium.org -per-file sec_fetch_site*=creis@chromium.org -per-file sec_fetch_site*=lukasza@chromium.org -per-file sec_fetch_site*=mkwst@chromium.org +per-file sec_header_helpers*=creis@chromium.org +per-file sec_header_helpers*=lukasza@chromium.org +per-file sec_header_helpers*=mkwst@chromium.org per-file expect_ct_reporter*=estark@chromium.org
diff --git a/services/network/sec_fetch_site.cc b/services/network/sec_header_helpers.cc similarity index 74% rename from services/network/sec_fetch_site.cc rename to services/network/sec_header_helpers.cc index 2355697d..bb55cce 100644 --- a/services/network/sec_fetch_site.cc +++ b/services/network/sec_header_helpers.cc
@@ -2,13 +2,14 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "services/network/sec_fetch_site.h" +#include "services/network/sec_header_helpers.h" #include <algorithm> #include <string> #include "base/feature_list.h" #include "net/base/registry_controlled_domains/registry_controlled_domain.h" +#include "net/http/http_request_headers.h" #include "net/url_request/url_request.h" #include "services/network/initiator_lock_compatibility.h" #include "services/network/public/cpp/features.h" @@ -115,4 +116,32 @@ kHeaderName, GetHeaderString(header_value), /* overwrite = */ true); } +void MaybeRemoveSecHeaders(net::URLRequest* request, + const GURL& pending_redirect_url) { + DCHECK(request); + + if (!base::FeatureList::IsEnabled(features::kFetchMetadata)) + return; + + // If our redirect destination is not trusted it would not have had sec-ch- or + // sec-fetch- prefixed headers added to it. Our previous hops may have added + // these headers if the current url is trustworthy though so we should try to + // remove these now. + if (IsUrlPotentiallyTrustworthy(request->url()) && + !IsUrlPotentiallyTrustworthy(pending_redirect_url)) { + // Check each of our request headers and if it is a "sec-ch-" or + // "sec-fetch-" prefixed header we'll remove it. + const net::HttpRequestHeaders::HeaderVector request_headers = + request->extra_request_headers().GetHeaderVector(); + for (const auto& header : request_headers) { + if (StartsWith(header.key, "sec-ch-", + base::CompareCase::INSENSITIVE_ASCII) || + StartsWith(header.key, "sec-fetch-", + base::CompareCase::INSENSITIVE_ASCII)) { + request->RemoveRequestHeaderByName(header.key); + } + } + } +} + } // namespace network
diff --git a/services/network/sec_fetch_site.h b/services/network/sec_header_helpers.h similarity index 71% rename from services/network/sec_fetch_site.h rename to services/network/sec_header_helpers.h index 61a6a76..3cb972c4 100644 --- a/services/network/sec_fetch_site.h +++ b/services/network/sec_header_helpers.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 SERVICES_NETWORK_SEC_FETCH_SITE_H_ -#define SERVICES_NETWORK_SEC_FETCH_SITE_H_ +#ifndef SERVICES_NETWORK_SEC_HEADER_HELPERS_H_ +#define SERVICES_NETWORK_SEC_HEADER_HELPERS_H_ #include "base/component_export.h" #include "url/gurl.h" @@ -33,6 +33,12 @@ const GURL* pending_redirect_url, const mojom::URLLoaderFactoryParams& factory_params); +// Removes any sec-ch- or sec-fetch- prefixed request headers on the |request| +// if the |pending_redirect_url| is not trustworthy and the current url is. +COMPONENT_EXPORT(NETWORK_SERVICE) +void MaybeRemoveSecHeaders(net::URLRequest* request, + const GURL& pending_redirect_url); + } // namespace network -#endif // SERVICES_NETWORK_SEC_FETCH_SITE_H_ +#endif // SERVICES_NETWORK_SEC_HEADER_HELPERS_H_
diff --git a/services/network/sec_header_helpers_unittest.cc b/services/network/sec_header_helpers_unittest.cc new file mode 100644 index 0000000..6dd79a9f --- /dev/null +++ b/services/network/sec_header_helpers_unittest.cc
@@ -0,0 +1,155 @@ +// 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 "services/network/sec_header_helpers.h" + +#include "base/test/scoped_task_environment.h" +#include "net/traffic_annotation/network_traffic_annotation_test_helper.h" +#include "net/url_request/url_request.h" +#include "net/url_request/url_request_context.h" +#include "net/url_request/url_request_test_util.h" +#include "testing/gtest/include/gtest/gtest.h" +#include "testing/platform_test.h" +#include "url/gurl.h" + +namespace { + +constexpr char kSecureSite[] = "https://site.tld"; +constexpr char kInsecureSite[] = "http://othersite.tld"; + +constexpr char kKnownSecChHeader[] = "Sec-CH-UA"; +constexpr char kKnownSecFetchHeader[] = "Sec-Fetch-Site"; +constexpr char kOtherSecHeader[] = "sec-other-info-header"; +constexpr char kOtherHeader[] = "Other-Header"; + +constexpr char kHeaderValue[] = "testdata"; + +} // namespace + +namespace network { + +class SecHeaderHelpersTest : public PlatformTest { + public: + SecHeaderHelpersTest() + : scoped_task_environment_( + base::test::ScopedTaskEnvironment::MainThreadType::IO), + url_request_(context_.CreateRequest(GURL(kSecureSite), + net::DEFAULT_PRIORITY, + /*request_delegate=*/nullptr, + TRAFFIC_ANNOTATION_FOR_TESTS)) {} + + net::URLRequest* url_request() const { return url_request_.get(); } + + private: + base::test::ScopedTaskEnvironment scoped_task_environment_; + net::TestURLRequestContext context_; + std::unique_ptr<net::URLRequest> url_request_; +}; + +// Validate that Sec- prefixed headers are all removed when a request is +// downgraded from trustworthy to not such as when an https => http redirect +// occurs. We should only remove sec-ch- and sec-fetch- prefixed headers. Others +// should remain as they may be valid in an insecure context. +TEST_F(SecHeaderHelpersTest, SecHeadersRemovedOnDowngrade) { + net::URLRequest* current_url_request = url_request(); + + current_url_request->SetExtraRequestHeaderByName(kKnownSecChHeader, + kHeaderValue, + /*overwrite=*/false); + current_url_request->SetExtraRequestHeaderByName(kKnownSecFetchHeader, + kHeaderValue, + /*overwrite=*/false); + current_url_request->SetExtraRequestHeaderByName(kOtherSecHeader, + kHeaderValue, + /*overwrite=*/false); + current_url_request->SetExtraRequestHeaderByName(kOtherHeader, kHeaderValue, + /*overwrite=*/false); + ASSERT_EQ(4, static_cast<int>(current_url_request->extra_request_headers() + .GetHeaderVector() + .size())); + + MaybeRemoveSecHeaders(current_url_request, GURL(kInsecureSite)); + ASSERT_EQ(2, static_cast<int>(current_url_request->extra_request_headers() + .GetHeaderVector() + .size())); + + std::string header_value; + ASSERT_FALSE(current_url_request->extra_request_headers().GetHeader( + kKnownSecChHeader, &header_value)); + ASSERT_FALSE(current_url_request->extra_request_headers().GetHeader( + kKnownSecFetchHeader, &header_value)); + ASSERT_TRUE(current_url_request->extra_request_headers().GetHeader( + kOtherSecHeader, &header_value)); + ASSERT_TRUE(current_url_request->extra_request_headers().GetHeader( + kOtherHeader, &header_value)); +} + +// Validate that if no downgrade occurs any Sec- prefixed headers remain on the +// provided request. +TEST_F(SecHeaderHelpersTest, SecHeadersRemainOnSecureRedirect) { + net::URLRequest* current_url_request = url_request(); + + current_url_request->SetExtraRequestHeaderByName(kKnownSecChHeader, + kHeaderValue, + /*overwrite=*/false); + current_url_request->SetExtraRequestHeaderByName(kKnownSecFetchHeader, + kHeaderValue, + /*overwrite=*/false); + current_url_request->SetExtraRequestHeaderByName(kOtherSecHeader, + kHeaderValue, + /*overwrite=*/false); + current_url_request->SetExtraRequestHeaderByName(kOtherHeader, kHeaderValue, + /*overwrite=*/false); + ASSERT_EQ(4, static_cast<int>(current_url_request->extra_request_headers() + .GetHeaderVector() + .size())); + + MaybeRemoveSecHeaders(current_url_request, GURL(kSecureSite)); + ASSERT_EQ(4, static_cast<int>(current_url_request->extra_request_headers() + .GetHeaderVector() + .size())); + + std::string header_value; + ASSERT_TRUE(current_url_request->extra_request_headers().GetHeader( + kKnownSecChHeader, &header_value)); + ASSERT_TRUE(current_url_request->extra_request_headers().GetHeader( + kKnownSecFetchHeader, &header_value)); + ASSERT_TRUE(current_url_request->extra_request_headers().GetHeader( + kOtherSecHeader, &header_value)); + ASSERT_TRUE(current_url_request->extra_request_headers().GetHeader( + kOtherHeader, &header_value)); +} + +// Validate that if Sec- headers exist as the first or last entries we properly +// remove them also. +TEST_F(SecHeaderHelpersTest, SecHeadersRemoveFirstLast) { + net::URLRequest* current_url_request = url_request(); + + current_url_request->SetExtraRequestHeaderByName(kKnownSecFetchHeader, + kHeaderValue, + /*overwrite=*/false); + current_url_request->SetExtraRequestHeaderByName(kOtherHeader, kHeaderValue, + /*overwrite=*/false); + current_url_request->SetExtraRequestHeaderByName(kKnownSecChHeader, + kHeaderValue, + /*overwrite=*/false); + ASSERT_EQ(3, static_cast<int>(current_url_request->extra_request_headers() + .GetHeaderVector() + .size())); + + MaybeRemoveSecHeaders(current_url_request, GURL(kInsecureSite)); + ASSERT_EQ(1, static_cast<int>(current_url_request->extra_request_headers() + .GetHeaderVector() + .size())); + + std::string header_value; + ASSERT_FALSE(current_url_request->extra_request_headers().GetHeader( + kKnownSecFetchHeader, &header_value)); + ASSERT_TRUE(current_url_request->extra_request_headers().GetHeader( + kOtherHeader, &header_value)); + ASSERT_FALSE(current_url_request->extra_request_headers().GetHeader( + kKnownSecChHeader, &header_value)); +} + +} // namespace network
diff --git a/services/network/url_loader.cc b/services/network/url_loader.cc index e6b31f98..ddd35b8 100644 --- a/services/network/url_loader.cc +++ b/services/network/url_loader.cc
@@ -50,7 +50,7 @@ #include "services/network/public/cpp/resource_response.h" #include "services/network/public/mojom/url_loader_factory.mojom.h" #include "services/network/resource_scheduler_client.h" -#include "services/network/sec_fetch_site.h" +#include "services/network/sec_header_helpers.h" #include "services/network/throttling/scoped_throttling_token.h" namespace network { @@ -739,6 +739,9 @@ return; } + // We may need to clear out old Sec- prefixed request headers. We'll attempt + // to do this before we re-add any. + MaybeRemoveSecHeaders(url_request_.get(), redirect_info.new_url); SetSecFetchSiteHeader(url_request_.get(), &redirect_info.new_url, *factory_params_);
diff --git a/services/network/url_loader_unittest.cc b/services/network/url_loader_unittest.cc index 95aa7d8a..b9e599ab 100644 --- a/services/network/url_loader_unittest.cc +++ b/services/network/url_loader_unittest.cc
@@ -38,6 +38,7 @@ #include "net/base/load_flags.h" #include "net/base/mime_sniffer.h" #include "net/base/net_errors.h" +#include "net/dns/mock_host_resolver.h" #include "net/http/http_response_info.h" #include "net/ssl/client_cert_identity_test_util.h" #include "net/test/cert_test_util.h" @@ -100,6 +101,8 @@ constexpr char kTestAuthURL[] = "/auth-basic?password=PASS&realm=REALM"; +constexpr char kInsecureHost[] = "othersite.test"; + static ResourceRequest CreateResourceRequest(const char* method, const GURL& url) { ResourceRequest request; @@ -399,6 +402,14 @@ test_server_.RegisterRequestMonitor( base::Bind(&URLLoaderTest::Monitor, base::Unretained(this))); ASSERT_TRUE(test_server_.Start()); + + // Set up a scoped host resolver so that |kInsecureHost| will resolve to + // the loopback address and will let us access |test_server_|. + scoped_refptr<net::RuleBasedHostResolverProc> mock_resolver_proc = + base::MakeRefCounted<net::RuleBasedHostResolverProc>(nullptr); + mock_resolver_proc->AddRule(kInsecureHost, "127.0.0.1"); + mock_host_resolver_ = std::make_unique<net::ScopedDefaultHostResolverProc>( + mock_resolver_proc.get()); } // Attempts to load |url| and returns the resulting error code. If |body| is @@ -700,6 +711,7 @@ base::test::ScopedTaskEnvironment scoped_task_environment_; net::EmbeddedTestServer test_server_; + std::unique_ptr<net::ScopedDefaultHostResolverProc> mock_host_resolver_; std::unique_ptr<net::URLRequestContext> context_; ResourceScheduler resource_scheduler_; scoped_refptr<ResourceSchedulerClient> resource_scheduler_client_; @@ -1925,6 +1937,170 @@ EXPECT_EQ("Value2", request_headers2.find("Header2")->second); } +// Validate Sec- prefixed headers are handled properly when redirecting from +// insecure => secure urls. The Sec-Fetch-Site header should be re-added on the +// secure url. +TEST_F(URLLoaderTest, UpgradeAddsSecHeaders) { + // Set up a redirect to signal we will go from insecure => secure. + GURL url = test_server()->GetURL( + kInsecureHost, + "/server-redirect?" + test_server()->GetURL("/echo").spec()); + ResourceRequest request = CreateResourceRequest("GET", url); + + base::RunLoop delete_run_loop; + mojom::URLLoaderPtr loader; + std::unique_ptr<URLLoader> url_loader; + mojom::URLLoaderFactoryParams params; + params.process_id = mojom::kBrowserProcessId; + url_loader = std::make_unique<URLLoader>( + context(), nullptr /* network_service_client */, + DeleteLoaderCallback(&delete_run_loop, &url_loader), + mojo::MakeRequest(&loader), mojom::kURLLoadOptionNone, request, + client()->CreateInterfacePtr(), TRAFFIC_ANNOTATION_FOR_TESTS, ¶ms, + 0 /* request_id */, resource_scheduler_client(), nullptr, + nullptr /* network_usage_accumulator */, nullptr /* header_client */); + + client()->RunUntilRedirectReceived(); + + // The initial request is received when the redirect before it has been + // followed. It should have no added Sec- headers as it is not trustworthy. + const auto& request_headers1 = sent_request().headers; + EXPECT_EQ(request_headers1.end(), request_headers1.find("Sec-Fetch-Site")); + + // Now follow the redirect to the final destination and validate again. + loader->FollowRedirect({}, {}, base::nullopt); + client()->RunUntilComplete(); + delete_run_loop.Run(); + + // The Sec-Fetch-Site header should have been added again since we are now on + // a trustworthy url again. + const auto& request_headers2 = sent_request().headers; + EXPECT_EQ("cross-site", request_headers2.find("Sec-Fetch-Site")->second); +} + +// Validate Sec- prefixed headers are properly handled when redirecting from +// secure => insecure urls. All Sec-CH- and Sec-Fetch- prefixed +// headers should be removed. +TEST_F(URLLoaderTest, DowngradeRemovesSecHeaders) { + // Set up a redirect to signal we will go from secure => insecure. + GURL url = test_server()->GetURL( + "/server-redirect?" + + test_server()->GetURL(kInsecureHost, "/echo").spec()); + + // Add some initial headers to ensure the right ones are removed and + // everything else is left alone. + ResourceRequest request = CreateResourceRequest("GET", url); + request.headers.SetHeader("Sec-CH-UA", "Value1"); + request.headers.SetHeader("Sec-Other-Type", "Value2"); + request.headers.SetHeader("Other-Header", "Value3"); + + base::RunLoop delete_run_loop; + mojom::URLLoaderPtr loader; + std::unique_ptr<URLLoader> url_loader; + mojom::URLLoaderFactoryParams params; + params.process_id = mojom::kBrowserProcessId; + url_loader = std::make_unique<URLLoader>( + context(), nullptr /* network_service_client */, + DeleteLoaderCallback(&delete_run_loop, &url_loader), + mojo::MakeRequest(&loader), mojom::kURLLoadOptionNone, request, + client()->CreateInterfacePtr(), TRAFFIC_ANNOTATION_FOR_TESTS, ¶ms, + 0 /* request_id */, resource_scheduler_client(), nullptr, + nullptr /* network_usage_accumulator */, nullptr /* header_client */); + + client()->RunUntilRedirectReceived(); + + // The initial request is received when the redirect before it has been + // followed. It should have all the Sec- headers as it is trustworthy. It + // should also have added a Sec-Fetch-Site header + const auto& request_headers1 = sent_request().headers; + EXPECT_EQ("Value1", request_headers1.find("Sec-CH-UA")->second); + EXPECT_EQ("Value2", request_headers1.find("Sec-Other-Type")->second); + EXPECT_EQ("Value3", request_headers1.find("Other-Header")->second); + EXPECT_EQ("same-origin", request_headers1.find("Sec-Fetch-Site")->second); + + // Now follow the redirect to the final destination and validate again. + loader->FollowRedirect({}, {}, base::nullopt); + client()->RunUntilComplete(); + delete_run_loop.Run(); + + // We should have removed our special Sec-CH- and Sec-Fetch- prefixed headers + // and left the others. We are now operating on an un-trustworthy context. + const auto& request_headers2 = sent_request().headers; + EXPECT_EQ(request_headers2.end(), request_headers2.find("Sec-CH-UA")); + EXPECT_EQ("Value2", request_headers2.find("Sec-Other-Type")->second); + EXPECT_EQ("Value3", request_headers2.find("Other-Header")->second); + EXPECT_EQ(request_headers2.end(), request_headers2.find("Sec-Fetch-Site")); +} + +// Validate Sec- prefixed headers are properly handled when redirecting from +// secure => insecure => secure urls.The headers on insecure +// urls should be removed and Sec-Fetch-Site should be re-added on secure ones. +TEST_F(URLLoaderTest, RedirectChainRemovesAndAddsSecHeaders) { + // Set up a redirect to signal we will go from secure => insecure => secure. + GURL insecure_upgrade_url = test_server()->GetURL( + kInsecureHost, + "/server-redirect?" + test_server()->GetURL("/echo").spec()); + GURL url = + test_server()->GetURL("/server-redirect?" + insecure_upgrade_url.spec()); + + // Add some initial headers to ensure the right ones are removed and + // everything else is left alone. + ResourceRequest request = CreateResourceRequest("GET", url); + request.headers.SetHeader("Sec-CH-UA", "Value1"); + request.headers.SetHeader("Sec-Other-Type", "Value2"); + request.headers.SetHeader("Other-Header", "Value3"); + + base::RunLoop delete_run_loop; + mojom::URLLoaderPtr loader; + std::unique_ptr<URLLoader> url_loader; + mojom::URLLoaderFactoryParams params; + params.process_id = mojom::kBrowserProcessId; + url_loader = std::make_unique<URLLoader>( + context(), nullptr /* network_service_client */, + DeleteLoaderCallback(&delete_run_loop, &url_loader), + mojo::MakeRequest(&loader), mojom::kURLLoadOptionNone, request, + client()->CreateInterfacePtr(), TRAFFIC_ANNOTATION_FOR_TESTS, ¶ms, + 0 /* request_id */, resource_scheduler_client(), nullptr, + nullptr /* network_usage_accumulator */, nullptr /* header_client */); + + client()->RunUntilRedirectReceived(); + + // The initial request is received when the redirect before it has been + // followed. It should have all the Sec- headers as it is trustworthy. It + // should also have added a Sec-Fetch-Site header + const auto& request_headers1 = sent_request().headers; + EXPECT_EQ("Value1", request_headers1.find("Sec-CH-UA")->second); + EXPECT_EQ("Value2", request_headers1.find("Sec-Other-Type")->second); + EXPECT_EQ("Value3", request_headers1.find("Other-Header")->second); + EXPECT_EQ("same-origin", request_headers1.find("Sec-Fetch-Site")->second); + + // Follow our redirect and then verify again. + loader->FollowRedirect({}, {}, base::nullopt); + client()->ClearHasReceivedRedirect(); + client()->RunUntilRedirectReceived(); + + // Special Sec-CH- and Sec-Fetch- prefixed headers should have been removed + // and the others left alone. We are now operating on an un-trustworthy + // context. + const auto& request_headers2 = sent_request().headers; + EXPECT_EQ(request_headers2.end(), request_headers2.find("Sec-CH-UA")); + EXPECT_EQ("Value2", request_headers2.find("Sec-Other-Type")->second); + EXPECT_EQ("Value3", request_headers2.find("Other-Header")->second); + EXPECT_EQ(request_headers2.end(), request_headers2.find("Sec-Fetch-Site")); + + // Now follow the final redirect back to a trustworthy destination and + // re-validate. + loader->FollowRedirect({}, {}, base::nullopt); + client()->RunUntilComplete(); + delete_run_loop.Run(); + + const auto& request_headers3 = sent_request().headers; + EXPECT_EQ(request_headers3.end(), request_headers3.find("Sec-CH-UA")); + EXPECT_EQ("Value2", request_headers3.find("Sec-Other-Type")->second); + EXPECT_EQ("Value3", request_headers3.find("Other-Header")->second); + EXPECT_EQ("cross-site", request_headers3.find("Sec-Fetch-Site")->second); +} + // A mock URLRequestJob which simulates an HTTPS request with a certificate // error. class MockHTTPSURLRequestJob : public net::URLRequestTestJob {
diff --git a/services/tracing/BUILD.gn b/services/tracing/BUILD.gn index e0c20c7..63bdc249 100644 --- a/services/tracing/BUILD.gn +++ b/services/tracing/BUILD.gn
@@ -5,6 +5,13 @@ # There should be only one tracing service. It is currently # in the browser process. So, only //content/browser should link to this target. # Others modules should only need the public targets. + +import("//build/config/compiler/compiler.gni") + +if (is_android) { + import("//build/config/android/rules.gni") +} + source_set("lib") { sources = [ "agent_registry.cc", @@ -119,6 +126,7 @@ "public/cpp/perfetto/task_runner_unittest.cc", "public/cpp/perfetto/trace_event_data_source_unittest.cc", "public/cpp/perfetto/traced_value_proto_writer_unittest.cc", + "public/cpp/stack_sampling/tracing_sampler_profiler_unittest.cc", ] } @@ -159,4 +167,32 @@ "//third_party/perfetto/protos/perfetto/trace/track_event:lite", ] } + + if (is_android && can_unwind_with_cfi_table && is_official_build) { + sources += + [ "public/cpp/stack_sampling/stack_unwinder_android_unittest.cc" ] + deps += [ + ":jni_headers", + ":tracing_test_helper_java", + ] + } +} + +if (is_android) { + generate_jni("jni_headers") { + testonly = true + sources = [ + "android/test/src/org/chromium/tracing/UnwindTestHelper.java", + ] + jni_package = "tracing" + } + + android_library("tracing_test_helper_java") { + testonly = true + deps = [ + "//base:base_java", + ] + java_files = + [ "android/test/src/org/chromium/tracing/UnwindTestHelper.java" ] + } }
diff --git a/services/tracing/DEPS b/services/tracing/DEPS index f8c03d2..82fb24d 100644 --- a/services/tracing/DEPS +++ b/services/tracing/DEPS
@@ -5,3 +5,9 @@ "+third_party/perfetto/protos/perfetto", "+third_party/protobuf/src/google/protobuf/io/zero_copy_stream.h", ] + +specific_include_rules = { + 'stack_unwinder_android_unittest.cc': [ + "+jni", + ], +}
diff --git a/components/tracing/android/test/src/org/chromium/tracing/UnwindTestHelper.java b/services/tracing/android/test/src/org/chromium/tracing/UnwindTestHelper.java similarity index 100% rename from components/tracing/android/test/src/org/chromium/tracing/UnwindTestHelper.java rename to services/tracing/android/test/src/org/chromium/tracing/UnwindTestHelper.java
diff --git a/services/tracing/perfetto/privacy_filtered_fields-inl.h b/services/tracing/perfetto/privacy_filtered_fields-inl.h index 9ec0233..be4f493 100644 --- a/services/tracing/perfetto/privacy_filtered_fields-inl.h +++ b/services/tracing/perfetto/privacy_filtered_fields-inl.h
@@ -82,14 +82,52 @@ constexpr int kThreadDescriptorIndices[] = {1, 2, 4, 6, 7, -1}; constexpr MessageInfo kThreadDescriptor = {kThreadDescriptorIndices, nullptr}; +// Proto Message: HistogramRule +constexpr int kHistogramRuleIndices[] = {1, 2, 3, -1}; +constexpr MessageInfo kHistogramRule = {kHistogramRuleIndices, nullptr}; + +// Proto Message: NamedRule +constexpr int kNamedRuleIndices[] = {1, -1}; +constexpr MessageInfo kNamedRule = {kNamedRuleIndices, nullptr}; + +// Proto Message: TriggerRule +constexpr int kTriggerRuleIndices[] = {1, 2, 3, -1}; +constexpr MessageInfo const* kTriggerRuleComplexMessages[] = { + nullptr, &kHistogramRule, &kNamedRule}; +constexpr MessageInfo kTriggerRule = {kTriggerRuleIndices, + kTriggerRuleComplexMessages}; + +// Proto Message: TraceMetadata +constexpr int kTraceMetadataIndices[] = {1, 2, -1}; +constexpr MessageInfo const* kTraceMetadataComplexMessages[] = {&kTriggerRule, + &kTriggerRule}; +constexpr MessageInfo kTraceMetadata = {kTraceMetadataIndices, + kTraceMetadataComplexMessages}; + +// Proto Message: ChromeMetadataPacket +constexpr int kChromeMetadataPacketIndices[] = {1, -1}; +constexpr MessageInfo const* kChromeMetadataPacketComplexMessages[] = { + &kTraceMetadata}; +constexpr MessageInfo kChromeMetadataPacket = { + kChromeMetadataPacketIndices, kChromeMetadataPacketComplexMessages}; + // EDIT: Contains field numbers: {3} which are not autogenerated. // Proto Message: TracePacket constexpr int kTracePacketIndices[] = {3, 10, 11, 12, 35, 36, - 41, 42, 43, 44, -1}; + 41, 42, 43, 44, 51, -1}; constexpr MessageInfo const* kTracePacketComplexMessages[] = { - nullptr, nullptr, &kTrackEvent, &kInternedData, &kTraceStats, - nullptr, nullptr, nullptr, &kProcessDescriptor, &kThreadDescriptor}; + nullptr, + nullptr, + &kTrackEvent, + &kInternedData, + &kTraceStats, + nullptr, + nullptr, + nullptr, + &kProcessDescriptor, + &kThreadDescriptor, + &kChromeMetadataPacket}; constexpr MessageInfo kTracePacket = {kTracePacketIndices, kTracePacketComplexMessages};
diff --git a/services/tracing/public/cpp/BUILD.gn b/services/tracing/public/cpp/BUILD.gn index 90ed03c..ff441fe 100644 --- a/services/tracing/public/cpp/BUILD.gn +++ b/services/tracing/public/cpp/BUILD.gn
@@ -3,6 +3,11 @@ # found in the LICENSE file. import("//build/config/chromecast_build.gni") +import("//build/config/compiler/compiler.gni") + +config("wrap_find_exidx") { + ldflags = [ "-Wl,-wrap,dl_unwind_find_exidx" ] +} source_set("traced_process") { sources = [ @@ -51,6 +56,8 @@ "perfetto/traced_value_proto_writer.h", "perfetto/track_event_thread_local_event_sink.cc", "perfetto/track_event_thread_local_event_sink.h", + "stack_sampling/tracing_sampler_profiler.cc", + "stack_sampling/tracing_sampler_profiler.h", "trace_event_agent.cc", "trace_event_agent.h", "trace_event_args_whitelist.cc", @@ -84,5 +91,19 @@ if (is_chromecast) { defines += [ "IS_CHROMECAST" ] } + + if (is_android && can_unwind_with_cfi_table && is_official_build) { + sources += [ + "stack_sampling/stack_sampler_android.cc", + "stack_sampling/stack_sampler_android.h", + "stack_sampling/stack_unwinder_android.cc", + "stack_sampling/stack_unwinder_android.h", + ] + deps += [ "//buildtools/third_party/libunwind" ] + include_dirs = [ "//buildtools/third_party/libunwind/trunk/include" ] + + # stack_unwinder_android.cc overrides the dl_unwind_find_exidx function. + all_dependent_configs = [ ":wrap_find_exidx" ] + } } } # !is_nacl && !is_ios
diff --git a/services/tracing/public/cpp/perfetto/trace_event_data_source.cc b/services/tracing/public/cpp/perfetto/trace_event_data_source.cc index 157ebe42..56c4fd4 100644 --- a/services/tracing/public/cpp/perfetto/trace_event_data_source.cc +++ b/services/tracing/public/cpp/perfetto/trace_event_data_source.cc
@@ -12,6 +12,7 @@ #include "base/bind.h" #include "base/bind_helpers.h" #include "base/command_line.h" +#include "base/debug/leak_annotations.h" #include "base/json/json_writer.h" #include "base/memory/ref_counted_memory.h" #include "base/metrics/histogram_samples.h" @@ -20,6 +21,7 @@ #include "base/pickle.h" #include "base/trace_event/trace_event.h" #include "components/tracing/common/tracing_switches.h" +#include "services/tracing/public/cpp/perfetto/perfetto_traced_process.h" #include "services/tracing/public/cpp/perfetto/thread_local_event_sink.h" #include "services/tracing/public/cpp/perfetto/traced_value_proto_writer.h" #include "services/tracing/public/cpp/perfetto/track_event_thread_local_event_sink.h" @@ -29,6 +31,7 @@ #include "third_party/perfetto/include/perfetto/ext/tracing/core/startup_trace_writer.h" #include "third_party/perfetto/include/perfetto/ext/tracing/core/startup_trace_writer_registry.h" #include "third_party/perfetto/include/perfetto/ext/tracing/core/trace_writer.h" +#include "third_party/perfetto/protos/perfetto/trace/chrome/chrome_metadata.pbzero.h" #include "third_party/perfetto/protos/perfetto/trace/chrome/chrome_trace_event.pbzero.h" #include "third_party/perfetto/protos/perfetto/trace/trace_packet.pbzero.h" @@ -37,13 +40,24 @@ using TraceConfig = base::trace_event::TraceConfig; namespace tracing { +namespace { +TraceEventMetadataSource* g_trace_event_metadata_source_for_testing = nullptr; +} // namespace using ChromeEventBundleHandle = protozero::MessageHandle<perfetto::protos::pbzero::ChromeEventBundle>; +// static +TraceEventMetadataSource* TraceEventMetadataSource::GetInstance() { + static base::NoDestructor<TraceEventMetadataSource> instance; + return instance.get(); +} + TraceEventMetadataSource::TraceEventMetadataSource() : DataSourceBase(mojom::kMetaDataSourceName), origin_task_runner_(base::SequencedTaskRunnerHandle::Get()) { + g_trace_event_metadata_source_for_testing = this; + PerfettoTracedProcess::Get()->AddDataSource(this); AddGeneratorFunction(base::BindRepeating( &TraceEventMetadataSource::GenerateTraceConfigMetadataDict, base::Unretained(this))); @@ -52,6 +66,12 @@ TraceEventMetadataSource::~TraceEventMetadataSource() = default; void TraceEventMetadataSource::AddGeneratorFunction( + JsonMetadataGeneratorFunction generator) { + DCHECK(origin_task_runner_->RunsTasksInCurrentSequence()); + json_generator_functions_.push_back(generator); +} + +void TraceEventMetadataSource::AddGeneratorFunction( MetadataGeneratorFunction generator) { DCHECK(origin_task_runner_->RunsTasksInCurrentSequence()); generator_functions_.push_back(generator); @@ -83,15 +103,23 @@ void TraceEventMetadataSource::GenerateMetadata( std::unique_ptr<perfetto::TraceWriter> trace_writer) { + DCHECK(origin_task_runner_->RunsTasksInCurrentSequence()); + auto trace_packet = trace_writer->NewTracePacket(); + auto* chrome_metadata = trace_packet->set_chrome_metadata(); + for (auto& generator : generator_functions_) { + generator.Run(chrome_metadata); + } + trace_packet = perfetto::TraceWriter::TracePacketHandle(); + if (privacy_filtering_enabled_) { return; } - DCHECK(origin_task_runner_->RunsTasksInCurrentSequence()); - auto trace_packet = trace_writer->NewTracePacket(); - ChromeEventBundleHandle event_bundle(trace_packet->set_chrome_events()); + auto legacy_trace_packet = trace_writer->NewTracePacket(); + ChromeEventBundleHandle event_bundle( + legacy_trace_packet->set_chrome_events()); - for (auto& generator : generator_functions_) { + for (auto& generator : json_generator_functions_) { std::unique_ptr<base::DictionaryValue> metadata_dict = generator.Run(); if (!metadata_dict) { continue; @@ -130,7 +158,7 @@ void TraceEventMetadataSource::StopTracing( base::OnceClosure stop_complete_callback) { - if (trace_writer_ && !privacy_filtering_enabled_) { + if (trace_writer_) { // Write metadata at the end of tracing to make it less likely that it is // overridden by other trace data in perfetto's ring buffer. origin_task_runner_->PostTaskAndReply( @@ -151,6 +179,13 @@ std::move(flush_complete_callback)); } +void TraceEventMetadataSource::ResetForTesting() { + if (!g_trace_event_metadata_source_for_testing) + return; + g_trace_event_metadata_source_for_testing->~TraceEventMetadataSource(); + new (g_trace_event_metadata_source_for_testing) TraceEventMetadataSource; +} + namespace { base::ThreadLocalStorage::Slot* ThreadLocalEventSinkSlot() { @@ -512,22 +547,22 @@ // ThreadLocalEventSink gets deleted on thread shutdown and we can't safely // call TaskRunnerHandle::Get() at that point (which can happen as the // TraceWriter destructor might make a Mojo call and trigger it). + auto* trace_writer_raw = trace_writer.release(); + ANNOTATE_LEAKING_OBJECT_PTR(trace_writer_raw); PerfettoTracedProcess::GetTaskRunner()->GetOrCreateTaskRunner()->PostTask( FROM_HERE, base::BindOnce( // Pass writer as raw pointer so that we leak it if task posting fails // (during shutdown). - [](perfetto::StartupTraceWriter* raw_trace_writer) { - std::unique_ptr<perfetto::StartupTraceWriter> trace_writer( - raw_trace_writer); + [](perfetto::StartupTraceWriter* trace_writer) { // May destroy |trace_writer|. If the writer is still unbound, the // registry will keep it alive until it was bound and its buffered // data was copied. This ensures that we don't lose data from // threads that are shut down during startup. perfetto::StartupTraceWriter::ReturnToRegistry( - std::move(trace_writer)); + base::WrapUnique<perfetto::StartupTraceWriter>(trace_writer)); }, - trace_writer.release())); + trace_writer_raw)); } } // namespace tracing
diff --git a/services/tracing/public/cpp/perfetto/trace_event_data_source.h b/services/tracing/public/cpp/perfetto/trace_event_data_source.h index 308364f..de921efc 100644 --- a/services/tracing/public/cpp/perfetto/trace_event_data_source.h +++ b/services/tracing/public/cpp/perfetto/trace_event_data_source.h
@@ -18,6 +18,7 @@ #include "base/trace_event/trace_config.h" #include "services/tracing/public/cpp/perfetto/perfetto_traced_process.h" #include "services/tracing/public/cpp/perfetto/producer_client.h" +#include "third_party/perfetto/protos/perfetto/trace/chrome/chrome_metadata.pbzero.h" namespace perfetto { class StartupTraceWriter; @@ -49,12 +50,17 @@ class COMPONENT_EXPORT(TRACING_CPP) TraceEventMetadataSource : public PerfettoTracedProcess::DataSourceBase { public: - TraceEventMetadataSource(); - ~TraceEventMetadataSource() override; + static TraceEventMetadataSource* GetInstance(); - using MetadataGeneratorFunction = + using JsonMetadataGeneratorFunction = base::RepeatingCallback<std::unique_ptr<base::DictionaryValue>()>; + + using MetadataGeneratorFunction = base::RepeatingCallback<void( + perfetto::protos::pbzero::ChromeMetadataPacket*)>; + // Any callbacks passed here will be called when tracing starts. + void AddGeneratorFunction(JsonMetadataGeneratorFunction generator); + // Same as above, but for filling in proto format. void AddGeneratorFunction(MetadataGeneratorFunction generator); // PerfettoTracedProcess::DataSourceBase implementation, called by @@ -65,10 +71,18 @@ void StopTracing(base::OnceClosure stop_complete_callback) override; void Flush(base::RepeatingClosure flush_complete_callback) override; + void ResetForTesting(); + private: + friend class base::NoDestructor<TraceEventMetadataSource>; + + TraceEventMetadataSource(); + ~TraceEventMetadataSource() override; + void GenerateMetadata(std::unique_ptr<perfetto::TraceWriter> trace_writer); std::unique_ptr<base::DictionaryValue> GenerateTraceConfigMetadataDict(); + std::vector<JsonMetadataGeneratorFunction> json_generator_functions_; std::vector<MetadataGeneratorFunction> generator_functions_; scoped_refptr<base::SequencedTaskRunner> origin_task_runner_; std::unique_ptr<perfetto::TraceWriter> trace_writer_;
diff --git a/services/tracing/public/cpp/perfetto/trace_event_data_source_unittest.cc b/services/tracing/public/cpp/perfetto/trace_event_data_source_unittest.cc index e4a55a6..2efd501 100644 --- a/services/tracing/public/cpp/perfetto/trace_event_data_source_unittest.cc +++ b/services/tracing/public/cpp/perfetto/trace_event_data_source_unittest.cc
@@ -66,7 +66,9 @@ EXPECT_TRUE(proto->ParseFromArray(buffer.begin, message_size)); if (proto->has_chrome_events() && proto->chrome_events().metadata().size() > 0) { - metadata_packets_.push_back(std::move(proto)); + legacy_metadata_packets_.push_back(std::move(proto)); + } else if (proto->has_chrome_metadata()) { + proto_metadata_packets_.push_back(std::move(proto)); } else { finalized_packets_.push_back(std::move(proto)); } @@ -97,20 +99,30 @@ const google::protobuf::RepeatedPtrField<perfetto::protos::ChromeMetadata> GetChromeMetadata(size_t packet_index = 0) { FlushPacketIfPossible(); - if (metadata_packets_.empty()) { + if (legacy_metadata_packets_.empty()) { return google::protobuf::RepeatedPtrField< perfetto::protos::ChromeMetadata>(); } - EXPECT_GT(metadata_packets_.size(), packet_index); + EXPECT_GT(legacy_metadata_packets_.size(), packet_index); - auto event_bundle = metadata_packets_[packet_index]->chrome_events(); + auto event_bundle = legacy_metadata_packets_[packet_index]->chrome_events(); return event_bundle.metadata(); } + const perfetto::protos::ChromeMetadataPacket* GetProtoChromeMetadata( + size_t packet_index = 0) { + FlushPacketIfPossible(); + EXPECT_GT(proto_metadata_packets_.size(), packet_index); + return &proto_metadata_packets_[packet_index]->chrome_metadata(); + } + private: std::vector<std::unique_ptr<perfetto::protos::TracePacket>> finalized_packets_; - std::vector<std::unique_ptr<perfetto::protos::TracePacket>> metadata_packets_; + std::vector<std::unique_ptr<perfetto::protos::TracePacket>> + legacy_metadata_packets_; + std::vector<std::unique_ptr<perfetto::protos::TracePacket>> + proto_metadata_packets_; perfetto::protos::pbzero::TracePacket trace_packet_; protozero::ScatteredStreamWriterNullDelegate delegate_; protozero::ScatteredStreamWriter stream_; @@ -192,6 +204,7 @@ producer_client_ = std::make_unique<MockProducerClient>(std::move(perfetto_wrapper)); base::ThreadIdNameManager::GetInstance()->SetName(kTestThread); + TraceEventMetadataSource::GetInstance()->ResetForTesting(); } void TearDown() override { @@ -407,9 +420,10 @@ } protected: - std::unique_ptr<MockProducerClient> producer_client_; + // Should be the first member. base::test::ScopedTaskEnvironment scoped_task_environment_; + std::unique_ptr<MockProducerClient> producer_client_; int64_t last_timestamp_ = 0; int64_t last_thread_time_ = 0; }; @@ -458,7 +472,7 @@ } TEST_F(TraceEventDataSourceTest, MetadataSourceBasicTypes) { - auto metadata_source = std::make_unique<TraceEventMetadataSource>(); + auto* metadata_source = TraceEventMetadataSource::GetInstance(); metadata_source->AddGeneratorFunction(base::BindRepeating([]() { auto metadata = std::make_unique<base::DictionaryValue>(); metadata->SetInteger("foo_int", 42); @@ -989,7 +1003,7 @@ } TEST_F(TraceEventDataSourceTest, FilteringMetadataSource) { - auto metadata_source = std::make_unique<TraceEventMetadataSource>(); + auto* metadata_source = TraceEventMetadataSource::GetInstance(); metadata_source->AddGeneratorFunction(base::BindRepeating([]() { auto metadata = std::make_unique<base::DictionaryValue>(); metadata->SetInteger("foo_int", 42); @@ -1014,6 +1028,37 @@ EXPECT_EQ(0, metadata.size()); } +TEST_F(TraceEventDataSourceTest, ProtoMetadataSource) { + auto* metadata_source = TraceEventMetadataSource::GetInstance(); + metadata_source->AddGeneratorFunction(base::BindRepeating( + [](perfetto::protos::pbzero::ChromeMetadataPacket* metadata) { + auto* field1 = metadata->set_background_tracing_metadata(); + auto* rule = field1->set_triggered_rule(); + rule->set_trigger_type( + perfetto::protos::pbzero::BackgroundTracingMetadata::TriggerRule:: + MONITOR_AND_DUMP_WHEN_SPECIFIC_HISTOGRAM_AND_VALUE); + rule->set_histogram_rule()->set_histogram_min_trigger(123); + })); + + CreateTraceEventDataSource(); + + perfetto::DataSourceConfig config; + config.mutable_chrome_config()->set_privacy_filtering_enabled(true); + metadata_source->StartTracing(producer_client(), config); + + base::RunLoop wait_for_stop; + metadata_source->StopTracing(wait_for_stop.QuitClosure()); + wait_for_stop.Run(); + + const auto* metadata = producer_client()->GetProtoChromeMetadata(); + EXPECT_TRUE(metadata->has_background_tracing_metadata()); + const auto& rule = metadata->background_tracing_metadata().triggered_rule(); + EXPECT_EQ(perfetto::protos::BackgroundTracingMetadata::TriggerRule:: + MONITOR_AND_DUMP_WHEN_SPECIFIC_HISTOGRAM_AND_VALUE, + rule.trigger_type()); + EXPECT_EQ(123, rule.histogram_rule().histogram_min_trigger()); +} + class TraceEventDataSourceNoInterningTest : public TraceEventDataSourceTest { public: void SetUp() override {
diff --git a/components/tracing/common/stack_sampler_android.cc b/services/tracing/public/cpp/stack_sampling/stack_sampler_android.cc similarity index 94% rename from components/tracing/common/stack_sampler_android.cc rename to services/tracing/public/cpp/stack_sampling/stack_sampler_android.cc index 83a0096..f88a86e 100644 --- a/components/tracing/common/stack_sampler_android.cc +++ b/services/tracing/public/cpp/stack_sampling/stack_sampler_android.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/tracing/common/stack_sampler_android.h" +#include "services/tracing/public/cpp/stack_sampling/stack_sampler_android.h" #include "base/profiler/profile_builder.h" #include "base/profiler/unwinder.h"
diff --git a/components/tracing/common/stack_sampler_android.h b/services/tracing/public/cpp/stack_sampling/stack_sampler_android.h similarity index 79% rename from components/tracing/common/stack_sampler_android.h rename to services/tracing/public/cpp/stack_sampling/stack_sampler_android.h index a38b465..e39d996a 100644 --- a/components/tracing/common/stack_sampler_android.h +++ b/services/tracing/public/cpp/stack_sampling/stack_sampler_android.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 COMPONENTS_TRACING_COMMON_STACK_SAMPLER_ANDROID_H_ -#define COMPONENTS_TRACING_COMMON_STACK_SAMPLER_ANDROID_H_ +#ifndef SERVICES_TRACING_PUBLIC_CPP_STACK_SAMPLING_STACK_SAMPLER_ANDROID_H_ +#define SERVICES_TRACING_PUBLIC_CPP_STACK_SAMPLING_STACK_SAMPLER_ANDROID_H_ #include "base/profiler/stack_sampler.h" #include "base/threading/platform_thread.h" -#include "components/tracing/common/stack_unwinder_android.h" +#include "services/tracing/public/cpp/stack_sampling/stack_unwinder_android.h" namespace tracing { @@ -36,4 +36,4 @@ } // namespace tracing -#endif // COMPONENTS_TRACING_COMMON_STACK_SAMPLER_ANDROID_H_ +#endif // SERVICES_TRACING_PUBLIC_CPP_STACK_SAMPLING_STACK_SAMPLER_ANDROID_H_
diff --git a/components/tracing/common/stack_unwinder_android.cc b/services/tracing/public/cpp/stack_sampling/stack_unwinder_android.cc similarity index 99% rename from components/tracing/common/stack_unwinder_android.cc rename to services/tracing/public/cpp/stack_sampling/stack_unwinder_android.cc index 63d3f50..19290bb2 100644 --- a/components/tracing/common/stack_unwinder_android.cc +++ b/services/tracing/public/cpp/stack_sampling/stack_unwinder_android.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/tracing/common/stack_unwinder_android.h" +#include "services/tracing/public/cpp/stack_sampling/stack_unwinder_android.h" #include <linux/futex.h> #include <sys/mman.h> @@ -23,8 +23,8 @@ #include "base/trace_event/cfi_backtrace_android.h" #include "libunwind.h" -using base::trace_event::CFIBacktraceAndroid; using base::debug::MappedMemoryRegion; +using base::trace_event::CFIBacktraceAndroid; namespace {
diff --git a/components/tracing/common/stack_unwinder_android.h b/services/tracing/public/cpp/stack_sampling/stack_unwinder_android.h similarity index 90% rename from components/tracing/common/stack_unwinder_android.h rename to services/tracing/public/cpp/stack_sampling/stack_unwinder_android.h index adc211f..a970d1c 100644 --- a/components/tracing/common/stack_unwinder_android.h +++ b/services/tracing/public/cpp/stack_sampling/stack_unwinder_android.h
@@ -2,18 +2,18 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef COMPONENTS_TRACING_COMMON_STACK_UNWINDER_ANDROID_H_ -#define COMPONENTS_TRACING_COMMON_STACK_UNWINDER_ANDROID_H_ +#ifndef SERVICES_TRACING_PUBLIC_CPP_STACK_SAMPLING_STACK_UNWINDER_ANDROID_H_ +#define SERVICES_TRACING_PUBLIC_CPP_STACK_SAMPLING_STACK_UNWINDER_ANDROID_H_ #include <ucontext.h> #include <map> #include <vector> +#include "base/component_export.h" #include "base/debug/proc_maps_linux.h" #include "base/profiler/stack_sampler.h" #include "base/threading/platform_thread.h" -#include "components/tracing/tracing_export.h" namespace jni_generator { struct JniJavaCallContextUnchecked; @@ -30,7 +30,7 @@ // to use multiple instances of this class at the same time due to signal // handling. So, the client must ensure synchronization between multiple // instances of this class. -class TRACING_EXPORT StackUnwinderAndroid { +class COMPONENT_EXPORT(TRACING_CPP) StackUnwinderAndroid { public: using JniMarker = jni_generator::JniJavaCallContextUnchecked; @@ -95,4 +95,4 @@ } // namespace tracing -#endif // COMPONENTS_TRACING_COMMON_STACK_UNWINDER_ANDROID_H_ +#endif // SERVICES_TRACING_PUBLIC_CPP_STACK_SAMPLING_STACK_UNWINDER_ANDROID_H_
diff --git a/components/tracing/common/stack_unwinder_android_unittest.cc b/services/tracing/public/cpp/stack_sampling/stack_unwinder_android_unittest.cc similarity index 98% rename from components/tracing/common/stack_unwinder_android_unittest.cc rename to services/tracing/public/cpp/stack_sampling/stack_unwinder_android_unittest.cc index 359d316..11abc10 100644 --- a/components/tracing/common/stack_unwinder_android_unittest.cc +++ b/services/tracing/public/cpp/stack_sampling/stack_unwinder_android_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/tracing/common/stack_unwinder_android.h" +#include "services/tracing/public/cpp/stack_sampling/stack_unwinder_android.h" #include "base/android/jni_generator/jni_generator_helper.h" #include "base/bind.h"
diff --git a/components/tracing/common/tracing_sampler_profiler.cc b/services/tracing/public/cpp/stack_sampling/tracing_sampler_profiler.cc similarity index 79% rename from components/tracing/common/tracing_sampler_profiler.cc rename to services/tracing/public/cpp/stack_sampling/tracing_sampler_profiler.cc index f295b55..a3e4717 100644 --- a/components/tracing/common/tracing_sampler_profiler.cc +++ b/services/tracing/public/cpp/stack_sampling/tracing_sampler_profiler.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/tracing/common/tracing_sampler_profiler.h" +#include "services/tracing/public/cpp/stack_sampling/tracing_sampler_profiler.h" #include <cinttypes> @@ -27,7 +27,7 @@ #include <dlfcn.h> #include "base/trace_event/cfi_backtrace_android.h" -#include "components/tracing/common/stack_sampler_android.h" +#include "services/tracing/public/cpp/stack_sampling/stack_sampler_android.h" #endif namespace tracing { @@ -87,30 +87,30 @@ std::string module_id; #if defined(OS_ANDROID) && BUILDFLAG(CAN_UNWIND_WITH_CFI_TABLE) && \ defined(OFFICIAL_BUILD) - 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 (base::trace_event::CFIBacktraceAndroid::is_chrome_address( - frame.instruction_pointer)) { - frame_name = GetFrameNameFromOffsetAddr( - frame.instruction_pointer - - base::trace_event::CFIBacktraceAndroid::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 no module is available, then name it unknown. Adding PC would be - // useless anyway. - if (frame_name.empty()) - frame_name = "Unknown"; + 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 (base::trace_event::CFIBacktraceAndroid::is_chrome_address( + frame.instruction_pointer)) { + frame_name = GetFrameNameFromOffsetAddr( + frame.instruction_pointer - + base::trace_event::CFIBacktraceAndroid::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 no module is available, then name it unknown. Adding PC would be + // useless anyway. + if (frame_name.empty()) + frame_name = "Unknown"; #else if (frame.module) { module_name = frame.module->GetDebugBasename().MaybeAsASCII(); @@ -122,13 +122,13 @@ frame_name = "Unknown"; } #endif - base::StringAppendF(&result, "%s - %s [%s]\n", frame_name.c_str(), - module_name.c_str(), module_id.c_str()); + base::StringAppendF(&result, "%s - %s [%s]\n", frame_name.c_str(), + module_name.c_str(), module_id.c_str()); } - TRACE_EVENT_INSTANT2(TRACE_DISABLED_BY_DEFAULT("cpu_profiler"), - "StackCpuSampling", TRACE_EVENT_SCOPE_THREAD, "frames", - result, "thread_id", sampled_thread_id_); + TRACE_EVENT_INSTANT2(TRACE_DISABLED_BY_DEFAULT("cpu_profiler"), + "StackCpuSampling", TRACE_EVENT_SCOPE_THREAD, "frames", + result, "thread_id", sampled_thread_id_); } // static
diff --git a/components/tracing/common/tracing_sampler_profiler.h b/services/tracing/public/cpp/stack_sampling/tracing_sampler_profiler.h similarity index 85% rename from components/tracing/common/tracing_sampler_profiler.h rename to services/tracing/public/cpp/stack_sampling/tracing_sampler_profiler.h index d15a7f2..c6ac53e 100644 --- a/components/tracing/common/tracing_sampler_profiler.h +++ b/services/tracing/public/cpp/stack_sampling/tracing_sampler_profiler.h
@@ -2,16 +2,16 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef COMPONENTS_TRACING_COMMON_TRACING_SAMPLER_PROFILER_H_ -#define COMPONENTS_TRACING_COMMON_TRACING_SAMPLER_PROFILER_H_ +#ifndef SERVICES_TRACING_PUBLIC_CPP_STACK_SAMPLING_TRACING_SAMPLER_PROFILER_H_ +#define SERVICES_TRACING_PUBLIC_CPP_STACK_SAMPLING_TRACING_SAMPLER_PROFILER_H_ +#include "base/component_export.h" #include "base/macros.h" #include "base/memory/weak_ptr.h" #include "base/profiler/stack_sampling_profiler.h" #include "base/sequence_checker.h" #include "base/threading/platform_thread.h" #include "base/trace_event/trace_log.h" -#include "components/tracing/tracing_export.h" namespace tracing { @@ -24,12 +24,13 @@ // The TracingSamplerProfiler must be created and destroyed on the sampled // thread. The tracelog observers can be called on any thread which force the // field |profiler_| to be thread-safe. -class TRACING_EXPORT TracingSamplerProfiler +class COMPONENT_EXPORT(TRACING_CPP) TracingSamplerProfiler : public base::trace_event::TraceLog::EnabledStateObserver { public: // This class will receive the sampling profiler stackframes and output them // to the chrome trace via an event. Exposed for testing. - class TRACING_EXPORT TracingProfileBuilder : public base::ProfileBuilder { + class COMPONENT_EXPORT(TRACING_CPP) TracingProfileBuilder + : public base::ProfileBuilder { public: TracingProfileBuilder(base::PlatformThreadId sampled_thread_id); @@ -74,4 +75,4 @@ } // namespace tracing -#endif // COMPONENTS_TRACING_COMMON_TRACING_SAMPLER_PROFILER_H_ +#endif // SERVICES_TRACING_PUBLIC_CPP_STACK_SAMPLING_TRACING_SAMPLER_PROFILER_H_
diff --git a/components/tracing/common/tracing_sampler_profiler_unittest.cc b/services/tracing/public/cpp/stack_sampling/tracing_sampler_profiler_unittest.cc similarity index 98% rename from components/tracing/common/tracing_sampler_profiler_unittest.cc rename to services/tracing/public/cpp/stack_sampling/tracing_sampler_profiler_unittest.cc index ab68dbc..b4288aa0 100644 --- a/components/tracing/common/tracing_sampler_profiler_unittest.cc +++ b/services/tracing/public/cpp/stack_sampling/tracing_sampler_profiler_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/tracing/common/tracing_sampler_profiler.h" +#include "services/tracing/public/cpp/stack_sampling/tracing_sampler_profiler.h" #include "base/at_exit.h" #include "base/bind.h"
diff --git a/services/tracing/public/cpp/trace_event_agent.cc b/services/tracing/public/cpp/trace_event_agent.cc index 684355d..3fa269f8 100644 --- a/services/tracing/public/cpp/trace_event_agent.cc +++ b/services/tracing/public/cpp/trace_event_agent.cc
@@ -74,15 +74,7 @@ DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); metadata_generator_functions_.push_back(generator); - // Instantiate and register the metadata data source on the first - // call. - static TraceEventMetadataSource* metadata_source = []() { - static base::NoDestructor<TraceEventMetadataSource> instance; - PerfettoTracedProcess::Get()->AddDataSource(instance.get()); - return instance.get(); - }(); - - metadata_source->AddGeneratorFunction(generator); + TraceEventMetadataSource::GetInstance()->AddGeneratorFunction(generator); } void TraceEventAgent::StartTracing(const std::string& config,
diff --git a/storage/browser/blob/blob_registry_impl.cc b/storage/browser/blob/blob_registry_impl.cc index aa81ace..1630806 100644 --- a/storage/browser/blob/blob_registry_impl.cc +++ b/storage/browser/blob/blob_registry_impl.cc
@@ -507,7 +507,7 @@ } if (uuid.empty() || context_->registry().HasEntry(uuid) || - base::ContainsKey(blobs_under_construction_, uuid)) { + base::Contains(blobs_under_construction_, uuid)) { bindings_.ReportBadMessage("Invalid UUID passed to BlobRegistry::Register"); return; }
diff --git a/storage/browser/fileapi/copy_or_move_operation_delegate_unittest.cc b/storage/browser/fileapi/copy_or_move_operation_delegate_unittest.cc index 698a36e9d..b1a80d6 100644 --- a/storage/browser/fileapi/copy_or_move_operation_delegate_unittest.cc +++ b/storage/browser/fileapi/copy_or_move_operation_delegate_unittest.cc
@@ -337,7 +337,7 @@ base::FilePath relative; root.virtual_path().AppendRelativePath(url.virtual_path(), &relative); relative = relative.NormalizePathSeparators(); - ASSERT_TRUE(base::ContainsKey(test_case_map, relative)); + ASSERT_TRUE(base::Contains(test_case_map, relative)); if (entries[i].type == filesystem::mojom::FsFileType::DIRECTORY) { EXPECT_TRUE(test_case_map[relative]->is_directory); directories.push(url);
diff --git a/storage/browser/fileapi/file_system_context.cc b/storage/browser/fileapi/file_system_context.cc index cc449776b..e34edd52 100644 --- a/storage/browser/fileapi/file_system_context.cc +++ b/storage/browser/fileapi/file_system_context.cc
@@ -185,8 +185,8 @@ // Chrome OS the additional backend chromeos::FileSystemBackend handles these // types. isolated_backend_.reset(new IsolatedFileSystemBackend( - !base::ContainsKey(backend_map_, kFileSystemTypeNativeLocal), - !base::ContainsKey(backend_map_, kFileSystemTypeNativeForPlatformApp))); + !base::Contains(backend_map_, kFileSystemTypeNativeLocal), + !base::Contains(backend_map_, kFileSystemTypeNativeForPlatformApp))); RegisterBackend(isolated_backend_.get()); if (quota_manager_proxy) {
diff --git a/storage/browser/fileapi/file_system_operation_runner.cc b/storage/browser/fileapi/file_system_operation_runner.cc index da431451..d9b52d6c4 100644 --- a/storage/browser/fileapi/file_system_operation_runner.cc +++ b/storage/browser/fileapi/file_system_operation_runner.cc
@@ -329,8 +329,8 @@ void FileSystemOperationRunner::Cancel(OperationID id, StatusCallback callback) { - if (base::ContainsKey(finished_operations_, id)) { - DCHECK(!base::ContainsKey(stray_cancel_callbacks_, id)); + if (base::Contains(finished_operations_, id)) { + DCHECK(!base::Contains(stray_cancel_callbacks_, id)); stray_cancel_callbacks_[id] = std::move(callback); return; }
diff --git a/storage/browser/fileapi/file_system_usage_cache.cc b/storage/browser/fileapi/file_system_usage_cache.cc index 599456d..a94d963 100644 --- a/storage/browser/fileapi/file_system_usage_cache.cc +++ b/storage/browser/fileapi/file_system_usage_cache.cc
@@ -148,7 +148,7 @@ TRACE_EVENT0("FileSystem", "UsageCache::Exists"); DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); if (is_incognito_) - return base::ContainsKey(incognito_usages_, usage_file_path); + return base::Contains(incognito_usages_, usage_file_path); return base::PathExists(usage_file_path); } @@ -157,7 +157,7 @@ DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); CloseCacheFiles(); if (is_incognito_) { - if (!base::ContainsKey(incognito_usages_, usage_file_path)) + if (!base::Contains(incognito_usages_, usage_file_path)) return false; incognito_usages_.erase(incognito_usages_.find(usage_file_path)); return true; @@ -262,7 +262,7 @@ int64_t buffer_size) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); if (is_incognito_) { - if (!base::ContainsKey(incognito_usages_, file_path)) + if (!base::Contains(incognito_usages_, file_path)) return false; memcpy(buffer, incognito_usages_[file_path].data(), buffer_size); return true; @@ -278,7 +278,7 @@ int64_t buffer_size) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); if (is_incognito_) { - if (!base::ContainsKey(incognito_usages_, file_path)) + if (!base::Contains(incognito_usages_, file_path)) incognito_usages_[file_path] = std::vector<uint8_t>(buffer_size); memcpy(incognito_usages_[file_path].data(), buffer, buffer_size); return true; @@ -293,7 +293,7 @@ TRACE_EVENT0("FileSystem", "UsageCache::FlushFile"); DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); if (is_incognito_) - return base::ContainsKey(incognito_usages_, file_path); + return base::Contains(incognito_usages_, file_path); base::File* file = GetFile(file_path); if (!file) return false; @@ -316,7 +316,7 @@ bool FileSystemUsageCache::HasCacheFileHandle(const base::FilePath& file_path) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); DCHECK_LE(cache_files_.size(), kMaxHandleCacheSize); - return base::ContainsKey(cache_files_, file_path); + return base::Contains(cache_files_, file_path); } } // namespace storage
diff --git a/storage/browser/fileapi/obfuscated_file_util.cc b/storage/browser/fileapi/obfuscated_file_util.cc index 949377c..bdb9c54f 100644 --- a/storage/browser/fileapi/obfuscated_file_util.cc +++ b/storage/browser/fileapi/obfuscated_file_util.cc
@@ -1009,7 +1009,7 @@ for (size_t i = 0; i < type_strings_to_prepopulate.size(); ++i) { const std::string type_string = type_strings_to_prepopulate[i]; // Only handles known types. - if (!base::ContainsKey(known_type_strings_, type_string)) + if (!base::Contains(known_type_strings_, type_string)) continue; base::File::Error error = base::File::FILE_ERROR_FAILED; base::FilePath path = GetDirectoryForOriginAndType(
diff --git a/storage/browser/fileapi/plugin_private_file_system_backend.cc b/storage/browser/fileapi/plugin_private_file_system_backend.cc index 6dbc0ba..d1e6a5d 100644 --- a/storage/browser/fileapi/plugin_private_file_system_backend.cc +++ b/storage/browser/fileapi/plugin_private_file_system_backend.cc
@@ -51,7 +51,7 @@ const std::string& plugin_id) { DCHECK(task_runner_->RunsTasksInCurrentSequence()); DCHECK(!filesystem_id.empty()); - DCHECK(!base::ContainsKey(map_, filesystem_id)) << filesystem_id; + DCHECK(!base::Contains(map_, filesystem_id)) << filesystem_id; map_[filesystem_id] = plugin_id; }
diff --git a/storage/browser/fileapi/sandbox_file_system_backend_delegate.cc b/storage/browser/fileapi/sandbox_file_system_backend_delegate.cc index 728ac2ee..f67bace 100644 --- a/storage/browser/fileapi/sandbox_file_system_backend_delegate.cc +++ b/storage/browser/fileapi/sandbox_file_system_backend_delegate.cc
@@ -417,8 +417,7 @@ // Don't use usage cache and return recalculated usage for sticky invalidated // origins. - if (base::ContainsKey(sticky_dirty_origins_, - std::make_pair(origin_url, type))) + if (base::Contains(sticky_dirty_origins_, std::make_pair(origin_url, type))) return RecalculateUsage(file_system_context, origin_url, type); base::FilePath base_path =
diff --git a/storage/browser/quota/client_usage_tracker.cc b/storage/browser/quota/client_usage_tracker.cc index a682cf7..36e7f4d6 100644 --- a/storage/browser/quota/client_usage_tracker.cc +++ b/storage/browser/quota/client_usage_tracker.cc
@@ -45,7 +45,7 @@ const std::string& host, const url::Origin& origin) { auto itr = origins.find(host); - return itr != origins.end() && base::ContainsKey(itr->second, origin); + return itr != origins.end() && base::Contains(itr->second, origin); } void DidGetGlobalClientUsageForLimitedGlobalClientUsage( @@ -127,9 +127,9 @@ void ClientUsageTracker::GetHostUsage(const std::string& host, UsageCallback callback) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - if (base::ContainsKey(cached_hosts_, host) && - !base::ContainsKey(non_cached_limited_origins_by_host_, host) && - !base::ContainsKey(non_cached_unlimited_origins_by_host_, host)) { + if (base::Contains(cached_hosts_, host) && + !base::Contains(non_cached_limited_origins_by_host_, host) && + !base::Contains(non_cached_unlimited_origins_by_host_, host)) { // TODO(kinuko): Drop host_usage_map_ cache periodically. std::move(callback).Run(GetCachedHostUsage(host)); return; @@ -148,7 +148,7 @@ int64_t delta) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); std::string host = net::GetHostOrSpecFromURL(origin.GetURL()); - if (base::ContainsKey(cached_hosts_, host)) { + if (base::Contains(cached_hosts_, host)) { if (!IsUsageCacheEnabledForOrigin(origin)) return;
diff --git a/storage/browser/quota/quota_callbacks.h b/storage/browser/quota/quota_callbacks.h index 995ceb755..28f02c7 100644 --- a/storage/browser/quota/quota_callbacks.h +++ b/storage/browser/quota/quota_callbacks.h
@@ -90,7 +90,7 @@ } bool HasCallbacks(const Key& key) const { - return base::ContainsKey(callback_map_, key); + return base::Contains(callback_map_, key); } bool HasAnyCallbacks() const { return !callback_map_.empty(); }
diff --git a/storage/browser/quota/quota_database.cc b/storage/browser/quota/quota_database.cc index 3ac3f75..c67b532 100644 --- a/storage/browser/quota/quota_database.cc +++ b/storage/browser/quota/quota_database.cc
@@ -464,7 +464,7 @@ while (statement.Step()) { url::Origin read_origin = url::Origin::Create(GURL(statement.ColumnString(0))); - if (base::ContainsKey(exceptions, read_origin)) + if (base::Contains(exceptions, read_origin)) continue; if (special_storage_policy &&
diff --git a/storage/browser/quota/quota_manager.cc b/storage/browser/quota/quota_manager.cc index 26193c1..f6271fc 100644 --- a/storage/browser/quota/quota_manager.cc +++ b/storage/browser/quota/quota_manager.cc
@@ -1572,8 +1572,8 @@ // and has not been accessed since we posted the task. DCHECK(!origin.has_value() || !origin->GetURL().is_empty()); if (origin.has_value() && - (base::ContainsKey(origins_in_use_, *origin) || - base::ContainsKey(access_notified_origins_, *origin))) { + (base::Contains(origins_in_use_, *origin) || + base::Contains(access_notified_origins_, *origin))) { std::move(callback).Run(base::nullopt); } else { std::move(callback).Run(origin);
diff --git a/storage/browser/quota/quota_manager.h b/storage/browser/quota/quota_manager.h index 649edf36..c2852e6 100644 --- a/storage/browser/quota/quota_manager.h +++ b/storage/browser/quota/quota_manager.h
@@ -181,7 +181,7 @@ void NotifyOriginNoLongerInUse(const url::Origin& origin); bool IsOriginInUse(const url::Origin& origin) const { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - return base::ContainsKey(origins_in_use_, origin); + return base::Contains(origins_in_use_, origin); } void SetUsageCacheEnabled(QuotaClient::ID client_id,
diff --git a/storage/browser/quota/quota_manager_unittest.cc b/storage/browser/quota/quota_manager_unittest.cc index c14e76fd..8d32f73 100644 --- a/storage/browser/quota/quota_manager_unittest.cc +++ b/storage/browser/quota/quota_manager_unittest.cc
@@ -2022,7 +2022,7 @@ for (size_t i = 0; i < base::size(kData); ++i) { if (kData[i].type == kTemp) - EXPECT_TRUE(base::ContainsKey(origins, ToOrigin(kData[i].origin))); + EXPECT_TRUE(base::Contains(origins, ToOrigin(kData[i].origin))); } }
diff --git a/storage/browser/quota/quota_task.cc b/storage/browser/quota/quota_task.cc index b7266c4..a937c4b 100644 --- a/storage/browser/quota/quota_task.cc +++ b/storage/browser/quota/quota_task.cc
@@ -69,7 +69,7 @@ } void QuotaTaskObserver::UnregisterTask(QuotaTask* task) { - DCHECK(base::ContainsKey(running_quota_tasks_, task)); + DCHECK(base::Contains(running_quota_tasks_, task)); running_quota_tasks_.erase(task); }
diff --git a/storage/browser/quota/quota_temporary_storage_evictor_unittest.cc b/storage/browser/quota/quota_temporary_storage_evictor_unittest.cc index 7f1fe5f..74eedd2 100644 --- a/storage/browser/quota/quota_temporary_storage_evictor_unittest.cc +++ b/storage/browser/quota/quota_temporary_storage_evictor_unittest.cc
@@ -127,7 +127,7 @@ private: int64_t EnsureOriginRemoved(const url::Origin& origin) { int64_t origin_usage; - if (!base::ContainsKey(origins_, origin)) + if (!base::Contains(origins_, origin)) return -1; else origin_usage = origins_[origin];
diff --git a/storage/browser/quota/storage_monitor.cc b/storage/browser/quota/storage_monitor.cc index 406845f..ab9735a7 100644 --- a/storage/browser/quota/storage_monitor.cc +++ b/storage/browser/quota/storage_monitor.cc
@@ -118,7 +118,7 @@ } void StorageObserverList::ScheduleUpdateForObserver(StorageObserver* observer) { - DCHECK(base::ContainsKey(observer_state_map_, observer)); + DCHECK(base::Contains(observer_state_map_, observer)); observer_state_map_[observer].requires_update = true; }
diff --git a/storage/browser/quota/storage_monitor_unittest.cc b/storage/browser/quota/storage_monitor_unittest.cc index 92c821f..75378f2 100644 --- a/storage/browser/quota/storage_monitor_unittest.cc +++ b/storage/browser/quota/storage_monitor_unittest.cc
@@ -144,7 +144,7 @@ void SetLastNotificationTime(StorageObserverList& observer_list, StorageObserver* observer) { - ASSERT_TRUE(base::ContainsKey(observer_list.observer_state_map_, observer)); + ASSERT_TRUE(base::Contains(observer_list.observer_state_map_, observer)); StorageObserverList::ObserverState& state = observer_list.observer_state_map_[observer]; state.last_notification_time = base::TimeTicks::Now() - state.rate;
diff --git a/storage/browser/test/mock_special_storage_policy.cc b/storage/browser/test/mock_special_storage_policy.cc index fc2dc4301..37521ea4 100644 --- a/storage/browser/test/mock_special_storage_policy.cc +++ b/storage/browser/test/mock_special_storage_policy.cc
@@ -14,17 +14,17 @@ MockSpecialStoragePolicy::MockSpecialStoragePolicy() : all_unlimited_(false) {} bool MockSpecialStoragePolicy::IsStorageProtected(const GURL& origin) { - return base::ContainsKey(protected_, origin); + return base::Contains(protected_, origin); } bool MockSpecialStoragePolicy::IsStorageUnlimited(const GURL& origin) { if (all_unlimited_) return true; - return base::ContainsKey(unlimited_, origin); + return base::Contains(unlimited_, origin); } bool MockSpecialStoragePolicy::IsStorageSessionOnly(const GURL& origin) { - return base::ContainsKey(session_only_, origin); + return base::Contains(session_only_, origin); } network::SessionCleanupCookieStore::DeleteCookiePredicate @@ -42,7 +42,7 @@ } bool MockSpecialStoragePolicy::HasIsolatedStorage(const GURL& origin) { - return base::ContainsKey(isolated_, origin); + return base::Contains(isolated_, origin); } bool MockSpecialStoragePolicy::HasSessionOnlyOrigins() { @@ -50,7 +50,7 @@ } bool MockSpecialStoragePolicy::IsStorageDurable(const GURL& origin) { - return base::ContainsKey(durable_, origin); + return base::Contains(durable_, origin); } MockSpecialStoragePolicy::~MockSpecialStoragePolicy() = default;
diff --git a/styleguide/c++/c++11.html b/styleguide/c++/c++11.html index 3ea1f3ef..17973a0 100644 --- a/styleguide/c++/c++11.html +++ b/styleguide/c++/c++11.html
@@ -286,6 +286,20 @@ </tr> <tr> +<td>Ref-qualified Member Functions</td> +<td><code>class T {<br /> + void f() & {}<br /> + void f() && {}<br /> +};<br /> +t.f(); // first<br /> +T().f(); // second<br /> +std::move(t).f(); // second</code></td> +<td>Allows class member functions to only bind to |this| as an rvalue or lvalue.</td> +<td><a href="http://en.cppreference.com/w/cpp/language/member_functions#const-.2C_volatile-.2C_and_ref-qualified_member_functions">const-, volatile-, and ref-qualified member functions</a></td> +<td>Use sparingly, since this feature may not be understood well by all developers. Consult with <code>styleguide/c++/OWNERS</code> when in doubt. <a href="https://groups.google.com/a/chromium.org/forum/#!topic/cxx/gowclr2LPQA">Discussion Thread</a></td> +</tr> + +<tr> <td>Rvalue References</td> <td><code>T(T&& t)</code> and <code>T& operator=(T&& t)<br/><br/> template <typename T><br/>void Function(T&& t) { ... }</code></td> @@ -779,20 +793,6 @@ </tr> <tr> -<td>Ref-qualified Member Functions</td> -<td><code>class T {<br /> - void f() & {}<br /> - void f() && {}<br /> -};<br /> -t.f(); // first<br /> -T().f(); // second<br /> -std::move(t).f(); // second</code></td> -<td>Allows class member functions to only bind to |this| as an rvalue or lvalue.</td> -<td><a href="http://en.cppreference.com/w/cpp/language/member_functions#const-.2C_volatile-.2C_and_ref-qualified_member_functions">const-, volatile-, and ref-qualified member functions</a></td> -<td>Banned in the <a href="https://google.github.io/styleguide/cppguide.html#C++11">Google Style Guide</a>. May only be used in Chromium with explicit approval from <code>styleguide/c++/OWNERS</code>. <a href="https://groups.google.com/a/chromium.org/forum/#!topic/cxx/gowclr2LPQA">Discussion Thread</a></td> -</tr> - -<tr> <td>User-Defined Literals</td> <td><code><i>type</i> <i>var</i> = <i>literal_value</i>_<i>type</i></code></td> <td>Allows user-defined literal expressions</td>
diff --git a/testing/buildbot/chromium.fyi.json b/testing/buildbot/chromium.fyi.json index 57a9145..2fd98fe 100644 --- a/testing/buildbot/chromium.fyi.json +++ b/testing/buildbot/chromium.fyi.json
@@ -3461,9 +3461,3257 @@ ] }, "android-code-coverage": { + "gtest_tests": [ + { + "args": [ + "--gs-results-bucket=chromium-result-details", + "--recover-devices" + ], + "isolate_coverage_data": true, + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "android_webview_unittests" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/luci/logdog/butler/${platform}", + "location": "bin", + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" + } + ], + "dimension_sets": [ + { + "device_os": "KTU84P", + "device_os_type": "userdebug", + "device_type": "hammerhead", + "os": "Android" + } + ], + "output_links": [ + { + "link": [ + "https://luci-logdog.appspot.com/v/?s", + "=android%2Fswarming%2Flogcats%2F", + "${TASK_ID}%2F%2B%2Funified_logcats" + ], + "name": "shard #${SHARD_INDEX} logcats" + } + ] + }, + "test": "android_webview_unittests" + }, + { + "args": [ + "--gs-results-bucket=chromium-result-details", + "--recover-devices" + ], + "isolate_coverage_data": true, + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "angle_unittests" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/luci/logdog/butler/${platform}", + "location": "bin", + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" + } + ], + "dimension_sets": [ + { + "device_os": "KTU84P", + "device_os_type": "userdebug", + "device_type": "hammerhead", + "os": "Android" + } + ], + "output_links": [ + { + "link": [ + "https://luci-logdog.appspot.com/v/?s", + "=android%2Fswarming%2Flogcats%2F", + "${TASK_ID}%2F%2B%2Funified_logcats" + ], + "name": "shard #${SHARD_INDEX} logcats" + } + ] + }, + "test": "angle_unittests" + }, + { + "args": [ + "--gs-results-bucket=chromium-result-details", + "--recover-devices" + ], + "isolate_coverage_data": true, + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "base_unittests" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/luci/logdog/butler/${platform}", + "location": "bin", + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" + } + ], + "dimension_sets": [ + { + "device_os": "KTU84P", + "device_os_type": "userdebug", + "device_type": "hammerhead", + "os": "Android" + } + ], + "output_links": [ + { + "link": [ + "https://luci-logdog.appspot.com/v/?s", + "=android%2Fswarming%2Flogcats%2F", + "${TASK_ID}%2F%2B%2Funified_logcats" + ], + "name": "shard #${SHARD_INDEX} logcats" + } + ] + }, + "test": "base_unittests" + }, + { + "args": [ + "--gs-results-bucket=chromium-result-details", + "--recover-devices" + ], + "isolate_coverage_data": true, + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "base_util_unittests" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/luci/logdog/butler/${platform}", + "location": "bin", + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" + } + ], + "dimension_sets": [ + { + "device_os": "KTU84P", + "device_os_type": "userdebug", + "device_type": "hammerhead", + "os": "Android" + } + ], + "output_links": [ + { + "link": [ + "https://luci-logdog.appspot.com/v/?s", + "=android%2Fswarming%2Flogcats%2F", + "${TASK_ID}%2F%2B%2Funified_logcats" + ], + "name": "shard #${SHARD_INDEX} logcats" + } + ] + }, + "test": "base_util_unittests" + }, + { + "args": [ + "--gs-results-bucket=chromium-result-details", + "--recover-devices" + ], + "isolate_coverage_data": true, + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "blink_common_unittests" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/luci/logdog/butler/${platform}", + "location": "bin", + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" + } + ], + "dimension_sets": [ + { + "device_os": "KTU84P", + "device_os_type": "userdebug", + "device_type": "hammerhead", + "os": "Android" + } + ], + "output_links": [ + { + "link": [ + "https://luci-logdog.appspot.com/v/?s", + "=android%2Fswarming%2Flogcats%2F", + "${TASK_ID}%2F%2B%2Funified_logcats" + ], + "name": "shard #${SHARD_INDEX} logcats" + } + ] + }, + "test": "blink_common_unittests" + }, + { + "args": [ + "--gs-results-bucket=chromium-result-details", + "--recover-devices" + ], + "isolate_coverage_data": true, + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "blink_heap_unittests" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/luci/logdog/butler/${platform}", + "location": "bin", + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" + } + ], + "dimension_sets": [ + { + "device_os": "KTU84P", + "device_os_type": "userdebug", + "device_type": "hammerhead", + "os": "Android" + } + ], + "output_links": [ + { + "link": [ + "https://luci-logdog.appspot.com/v/?s", + "=android%2Fswarming%2Flogcats%2F", + "${TASK_ID}%2F%2B%2Funified_logcats" + ], + "name": "shard #${SHARD_INDEX} logcats" + } + ] + }, + "test": "blink_heap_unittests" + }, + { + "args": [ + "--gs-results-bucket=chromium-result-details", + "--recover-devices" + ], + "isolate_coverage_data": true, + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "blink_platform_unittests" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/luci/logdog/butler/${platform}", + "location": "bin", + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" + } + ], + "dimension_sets": [ + { + "device_os": "KTU84P", + "device_os_type": "userdebug", + "device_type": "hammerhead", + "os": "Android" + } + ], + "output_links": [ + { + "link": [ + "https://luci-logdog.appspot.com/v/?s", + "=android%2Fswarming%2Flogcats%2F", + "${TASK_ID}%2F%2B%2Funified_logcats" + ], + "name": "shard #${SHARD_INDEX} logcats" + } + ] + }, + "test": "blink_platform_unittests" + }, + { + "args": [ + "--gs-results-bucket=chromium-result-details", + "--recover-devices" + ], + "isolate_coverage_data": true, + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "webkit_unit_tests" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "name": "webkit_unit_tests", + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/luci/logdog/butler/${platform}", + "location": "bin", + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" + } + ], + "dimension_sets": [ + { + "device_os": "KTU84P", + "device_os_type": "userdebug", + "device_type": "hammerhead", + "os": "Android" + } + ], + "output_links": [ + { + "link": [ + "https://luci-logdog.appspot.com/v/?s", + "=android%2Fswarming%2Flogcats%2F", + "${TASK_ID}%2F%2B%2Funified_logcats" + ], + "name": "shard #${SHARD_INDEX} logcats" + } + ], + "shards": 2 + }, + "test": "blink_unittests" + }, + { + "args": [ + "--gs-results-bucket=chromium-result-details", + "--recover-devices" + ], + "isolate_coverage_data": true, + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "boringssl_crypto_tests" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/luci/logdog/butler/${platform}", + "location": "bin", + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" + } + ], + "dimension_sets": [ + { + "device_os": "KTU84P", + "device_os_type": "userdebug", + "device_type": "hammerhead", + "os": "Android" + } + ], + "output_links": [ + { + "link": [ + "https://luci-logdog.appspot.com/v/?s", + "=android%2Fswarming%2Flogcats%2F", + "${TASK_ID}%2F%2B%2Funified_logcats" + ], + "name": "shard #${SHARD_INDEX} logcats" + } + ] + }, + "test": "boringssl_crypto_tests" + }, + { + "args": [ + "--gs-results-bucket=chromium-result-details", + "--recover-devices" + ], + "isolate_coverage_data": true, + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "boringssl_ssl_tests" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/luci/logdog/butler/${platform}", + "location": "bin", + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" + } + ], + "dimension_sets": [ + { + "device_os": "KTU84P", + "device_os_type": "userdebug", + "device_type": "hammerhead", + "os": "Android" + } + ], + "output_links": [ + { + "link": [ + "https://luci-logdog.appspot.com/v/?s", + "=android%2Fswarming%2Flogcats%2F", + "${TASK_ID}%2F%2B%2Funified_logcats" + ], + "name": "shard #${SHARD_INDEX} logcats" + } + ] + }, + "test": "boringssl_ssl_tests" + }, + { + "args": [ + "--gs-results-bucket=chromium-result-details", + "--recover-devices" + ], + "isolate_coverage_data": true, + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "breakpad_unittests" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/luci/logdog/butler/${platform}", + "location": "bin", + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" + } + ], + "dimension_sets": [ + { + "device_os": "KTU84P", + "device_os_type": "userdebug", + "device_type": "hammerhead", + "os": "Android" + } + ], + "output_links": [ + { + "link": [ + "https://luci-logdog.appspot.com/v/?s", + "=android%2Fswarming%2Flogcats%2F", + "${TASK_ID}%2F%2B%2Funified_logcats" + ], + "name": "shard #${SHARD_INDEX} logcats" + } + ] + }, + "test": "breakpad_unittests" + }, + { + "args": [ + "--gs-results-bucket=chromium-result-details", + "--recover-devices" + ], + "isolate_coverage_data": true, + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "cacheinvalidation_unittests" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/luci/logdog/butler/${platform}", + "location": "bin", + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" + } + ], + "dimension_sets": [ + { + "device_os": "KTU84P", + "device_os_type": "userdebug", + "device_type": "hammerhead", + "os": "Android" + } + ], + "output_links": [ + { + "link": [ + "https://luci-logdog.appspot.com/v/?s", + "=android%2Fswarming%2Flogcats%2F", + "${TASK_ID}%2F%2B%2Funified_logcats" + ], + "name": "shard #${SHARD_INDEX} logcats" + } + ] + }, + "test": "cacheinvalidation_unittests" + }, + { + "args": [ + "--gtest_filter=-*UsingRealWebcam*", + "--gs-results-bucket=chromium-result-details", + "--recover-devices" + ], + "isolate_coverage_data": true, + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "capture_unittests" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/luci/logdog/butler/${platform}", + "location": "bin", + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" + } + ], + "dimension_sets": [ + { + "device_os": "KTU84P", + "device_os_type": "userdebug", + "device_type": "hammerhead", + "os": "Android" + } + ], + "output_links": [ + { + "link": [ + "https://luci-logdog.appspot.com/v/?s", + "=android%2Fswarming%2Flogcats%2F", + "${TASK_ID}%2F%2B%2Funified_logcats" + ], + "name": "shard #${SHARD_INDEX} logcats" + } + ] + }, + "test": "capture_unittests" + }, + { + "args": [ + "--gs-results-bucket=chromium-result-details", + "--recover-devices" + ], + "isolate_coverage_data": true, + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "cast_unittests" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/luci/logdog/butler/${platform}", + "location": "bin", + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" + } + ], + "dimension_sets": [ + { + "device_os": "KTU84P", + "device_os_type": "userdebug", + "device_type": "hammerhead", + "os": "Android" + } + ], + "output_links": [ + { + "link": [ + "https://luci-logdog.appspot.com/v/?s", + "=android%2Fswarming%2Flogcats%2F", + "${TASK_ID}%2F%2B%2Funified_logcats" + ], + "name": "shard #${SHARD_INDEX} logcats" + } + ] + }, + "test": "cast_unittests" + }, + { + "args": [ + "--gs-results-bucket=chromium-result-details", + "--recover-devices" + ], + "isolate_coverage_data": true, + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "cc_unittests" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/luci/logdog/butler/${platform}", + "location": "bin", + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" + } + ], + "dimension_sets": [ + { + "device_os": "KTU84P", + "device_os_type": "userdebug", + "device_type": "hammerhead", + "os": "Android" + } + ], + "output_links": [ + { + "link": [ + "https://luci-logdog.appspot.com/v/?s", + "=android%2Fswarming%2Flogcats%2F", + "${TASK_ID}%2F%2B%2Funified_logcats" + ], + "name": "shard #${SHARD_INDEX} logcats" + } + ] + }, + "test": "cc_unittests" + }, + { + "args": [ + "--gs-results-bucket=chromium-result-details", + "--recover-devices" + ], + "isolate_coverage_data": true, + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "chrome_public_test_apk" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/luci/logdog/butler/${platform}", + "location": "bin", + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" + } + ], + "dimension_sets": [ + { + "device_os": "KTU84P", + "device_os_type": "userdebug", + "device_type": "hammerhead", + "os": "Android" + } + ], + "output_links": [ + { + "link": [ + "https://luci-logdog.appspot.com/v/?s", + "=android%2Fswarming%2Flogcats%2F", + "${TASK_ID}%2F%2B%2Funified_logcats" + ], + "name": "shard #${SHARD_INDEX} logcats" + } + ], + "shards": 20 + }, + "test": "chrome_public_test_apk" + }, + { + "args": [ + "--disable-features=NetworkServiceInProcess", + "--gtest_filter=-org.chromium.chrome.browser.FeaturesAnnotationsTest#testFeaturesSetExistingFlags", + "--gs-results-bucket=chromium-result-details", + "--recover-devices" + ], + "isolate_coverage_data": true, + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "network_service_out_of_process_chrome_public_test_apk" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "name": "network_service_out_of_process_chrome_public_test_apk", + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/luci/logdog/butler/${platform}", + "location": "bin", + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" + } + ], + "dimension_sets": [ + { + "device_os": "KTU84P", + "device_os_type": "userdebug", + "device_type": "hammerhead", + "os": "Android" + } + ], + "output_links": [ + { + "link": [ + "https://luci-logdog.appspot.com/v/?s", + "=android%2Fswarming%2Flogcats%2F", + "${TASK_ID}%2F%2B%2Funified_logcats" + ], + "name": "shard #${SHARD_INDEX} logcats" + } + ], + "shards": 20 + }, + "test": "chrome_public_test_apk" + }, + { + "args": [ + "--shared-prefs-file=//chrome/android/shared_preference_files/test/vr_cardboard_skipdon_setupcomplete.json", + "--additional-apk=//third_party/gvr-android-sdk/test-apks/vr_services/vr_services_current.apk", + "--gs-results-bucket=chromium-result-details", + "--recover-devices" + ], + "isolate_coverage_data": true, + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "chrome_public_test_vr_apk" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/luci/logdog/butler/${platform}", + "location": "bin", + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" + } + ], + "dimension_sets": [ + { + "device_os": "KTU84P", + "device_os_type": "userdebug", + "device_type": "hammerhead", + "os": "Android" + } + ], + "output_links": [ + { + "link": [ + "https://luci-logdog.appspot.com/v/?s", + "=android%2Fswarming%2Flogcats%2F", + "${TASK_ID}%2F%2B%2Funified_logcats" + ], + "name": "shard #${SHARD_INDEX} logcats" + } + ], + "shards": 2 + }, + "test": "chrome_public_test_vr_apk" + }, + { + "args": [ + "--gs-results-bucket=chromium-result-details", + "--recover-devices" + ], + "isolate_coverage_data": true, + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "components_browsertests" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/luci/logdog/butler/${platform}", + "location": "bin", + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" + } + ], + "dimension_sets": [ + { + "device_os": "KTU84P", + "device_os_type": "userdebug", + "device_type": "hammerhead", + "os": "Android" + } + ], + "output_links": [ + { + "link": [ + "https://luci-logdog.appspot.com/v/?s", + "=android%2Fswarming%2Flogcats%2F", + "${TASK_ID}%2F%2B%2Funified_logcats" + ], + "name": "shard #${SHARD_INDEX} logcats" + } + ] + }, + "test": "components_browsertests" + }, + { + "args": [ + "--disable-features=NetworkServiceInProcess", + "--gs-results-bucket=chromium-result-details", + "--recover-devices" + ], + "isolate_coverage_data": true, + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "network_service_out_of_process_components_browsertests" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "name": "network_service_out_of_process_components_browsertests", + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/luci/logdog/butler/${platform}", + "location": "bin", + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" + } + ], + "dimension_sets": [ + { + "device_os": "KTU84P", + "device_os_type": "userdebug", + "device_type": "hammerhead", + "os": "Android" + } + ], + "output_links": [ + { + "link": [ + "https://luci-logdog.appspot.com/v/?s", + "=android%2Fswarming%2Flogcats%2F", + "${TASK_ID}%2F%2B%2Funified_logcats" + ], + "name": "shard #${SHARD_INDEX} logcats" + } + ] + }, + "test": "components_browsertests" + }, + { + "args": [ + "--gs-results-bucket=chromium-result-details", + "--recover-devices" + ], + "isolate_coverage_data": true, + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "components_unittests" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/luci/logdog/butler/${platform}", + "location": "bin", + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" + } + ], + "dimension_sets": [ + { + "device_os": "KTU84P", + "device_os_type": "userdebug", + "device_type": "hammerhead", + "os": "Android" + } + ], + "output_links": [ + { + "link": [ + "https://luci-logdog.appspot.com/v/?s", + "=android%2Fswarming%2Flogcats%2F", + "${TASK_ID}%2F%2B%2Funified_logcats" + ], + "name": "shard #${SHARD_INDEX} logcats" + } + ], + "shards": 4 + }, + "test": "components_unittests" + }, + { + "args": [ + "--gs-results-bucket=chromium-result-details", + "--recover-devices" + ], + "isolate_coverage_data": true, + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "content_browsertests" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/luci/logdog/butler/${platform}", + "location": "bin", + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" + } + ], + "dimension_sets": [ + { + "device_os": "KTU84P", + "device_os_type": "userdebug", + "device_type": "hammerhead", + "os": "Android" + } + ], + "output_links": [ + { + "link": [ + "https://luci-logdog.appspot.com/v/?s", + "=android%2Fswarming%2Flogcats%2F", + "${TASK_ID}%2F%2B%2Funified_logcats" + ], + "name": "shard #${SHARD_INDEX} logcats" + } + ], + "shards": 9 + }, + "test": "content_browsertests" + }, + { + "args": [ + "--disable-features=NetworkServiceInProcess", + "--gs-results-bucket=chromium-result-details", + "--recover-devices" + ], + "isolate_coverage_data": true, + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "network_service_out_of_process_content_browsertests" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "name": "network_service_out_of_process_content_browsertests", + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/luci/logdog/butler/${platform}", + "location": "bin", + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" + } + ], + "dimension_sets": [ + { + "device_os": "KTU84P", + "device_os_type": "userdebug", + "device_type": "hammerhead", + "os": "Android" + } + ], + "output_links": [ + { + "link": [ + "https://luci-logdog.appspot.com/v/?s", + "=android%2Fswarming%2Flogcats%2F", + "${TASK_ID}%2F%2B%2Funified_logcats" + ], + "name": "shard #${SHARD_INDEX} logcats" + } + ], + "shards": 5 + }, + "test": "content_browsertests" + }, + { + "args": [ + "--disable-features=NetworkService", + "--gs-results-bucket=chromium-result-details", + "--recover-devices" + ], + "isolate_coverage_data": true, + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "non_network_service_content_browsertests" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "name": "non_network_service_content_browsertests", + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/luci/logdog/butler/${platform}", + "location": "bin", + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" + } + ], + "dimension_sets": [ + { + "device_os": "KTU84P", + "device_os_type": "userdebug", + "device_type": "hammerhead", + "os": "Android" + } + ], + "output_links": [ + { + "link": [ + "https://luci-logdog.appspot.com/v/?s", + "=android%2Fswarming%2Flogcats%2F", + "${TASK_ID}%2F%2B%2Funified_logcats" + ], + "name": "shard #${SHARD_INDEX} logcats" + } + ], + "shards": 5 + }, + "test": "content_browsertests" + }, + { + "args": [ + "--disable-perfetto", + "--gtest_filter=TracingControllerTest.*:BackgroundTracingManagerBrowserTest.*", + "--gs-results-bucket=chromium-result-details", + "--recover-devices" + ], + "isolate_coverage_data": true, + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "nonperfetto_content_browsertests" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "name": "nonperfetto_content_browsertests", + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/luci/logdog/butler/${platform}", + "location": "bin", + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" + } + ], + "dimension_sets": [ + { + "device_os": "KTU84P", + "device_os_type": "userdebug", + "device_type": "hammerhead", + "os": "Android" + } + ], + "output_links": [ + { + "link": [ + "https://luci-logdog.appspot.com/v/?s", + "=android%2Fswarming%2Flogcats%2F", + "${TASK_ID}%2F%2B%2Funified_logcats" + ], + "name": "shard #${SHARD_INDEX} logcats" + } + ] + }, + "test": "content_browsertests" + }, + { + "args": [ + "--gs-results-bucket=chromium-result-details", + "--recover-devices" + ], + "isolate_coverage_data": true, + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "content_shell_test_apk" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/luci/logdog/butler/${platform}", + "location": "bin", + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" + } + ], + "dimension_sets": [ + { + "device_os": "KTU84P", + "device_os_type": "userdebug", + "device_type": "hammerhead", + "os": "Android" + } + ], + "output_links": [ + { + "link": [ + "https://luci-logdog.appspot.com/v/?s", + "=android%2Fswarming%2Flogcats%2F", + "${TASK_ID}%2F%2B%2Funified_logcats" + ], + "name": "shard #${SHARD_INDEX} logcats" + } + ], + "shards": 3 + }, + "test": "content_shell_test_apk" + }, + { + "args": [ + "--disable-features=NetworkServiceInProcess", + "--gs-results-bucket=chromium-result-details", + "--recover-devices" + ], + "isolate_coverage_data": true, + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "network_service_out_of_process_content_shell_test_apk" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "name": "network_service_out_of_process_content_shell_test_apk", + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/luci/logdog/butler/${platform}", + "location": "bin", + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" + } + ], + "dimension_sets": [ + { + "device_os": "KTU84P", + "device_os_type": "userdebug", + "device_type": "hammerhead", + "os": "Android" + } + ], + "output_links": [ + { + "link": [ + "https://luci-logdog.appspot.com/v/?s", + "=android%2Fswarming%2Flogcats%2F", + "${TASK_ID}%2F%2B%2Funified_logcats" + ], + "name": "shard #${SHARD_INDEX} logcats" + } + ], + "shards": 5 + }, + "test": "content_shell_test_apk" + }, + { + "args": [ + "--disable-features=NetworkService", + "--gs-results-bucket=chromium-result-details", + "--recover-devices" + ], + "isolate_coverage_data": true, + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "non_network_service_content_shell_test_apk" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "name": "non_network_service_content_shell_test_apk", + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/luci/logdog/butler/${platform}", + "location": "bin", + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" + } + ], + "dimension_sets": [ + { + "device_os": "KTU84P", + "device_os_type": "userdebug", + "device_type": "hammerhead", + "os": "Android" + } + ], + "output_links": [ + { + "link": [ + "https://luci-logdog.appspot.com/v/?s", + "=android%2Fswarming%2Flogcats%2F", + "${TASK_ID}%2F%2B%2Funified_logcats" + ], + "name": "shard #${SHARD_INDEX} logcats" + } + ], + "shards": 5 + }, + "test": "content_shell_test_apk" + }, + { + "args": [ + "--gs-results-bucket=chromium-result-details", + "--recover-devices" + ], + "isolate_coverage_data": true, + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "content_unittests" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/luci/logdog/butler/${platform}", + "location": "bin", + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" + } + ], + "dimension_sets": [ + { + "device_os": "KTU84P", + "device_os_type": "userdebug", + "device_type": "hammerhead", + "os": "Android" + } + ], + "output_links": [ + { + "link": [ + "https://luci-logdog.appspot.com/v/?s", + "=android%2Fswarming%2Flogcats%2F", + "${TASK_ID}%2F%2B%2Funified_logcats" + ], + "name": "shard #${SHARD_INDEX} logcats" + } + ], + "shards": 3 + }, + "test": "content_unittests" + }, + { + "args": [ + "--gs-results-bucket=chromium-result-details", + "--recover-devices" + ], + "isolate_coverage_data": true, + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "crypto_unittests" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/luci/logdog/butler/${platform}", + "location": "bin", + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" + } + ], + "dimension_sets": [ + { + "device_os": "KTU84P", + "device_os_type": "userdebug", + "device_type": "hammerhead", + "os": "Android" + } + ], + "output_links": [ + { + "link": [ + "https://luci-logdog.appspot.com/v/?s", + "=android%2Fswarming%2Flogcats%2F", + "${TASK_ID}%2F%2B%2Funified_logcats" + ], + "name": "shard #${SHARD_INDEX} logcats" + } + ] + }, + "test": "crypto_unittests" + }, + { + "args": [ + "--gs-results-bucket=chromium-result-details", + "--recover-devices" + ], + "isolate_coverage_data": true, + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "device_unittests" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/luci/logdog/butler/${platform}", + "location": "bin", + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" + } + ], + "dimension_sets": [ + { + "device_os": "KTU84P", + "device_os_type": "userdebug", + "device_type": "hammerhead", + "os": "Android" + } + ], + "output_links": [ + { + "link": [ + "https://luci-logdog.appspot.com/v/?s", + "=android%2Fswarming%2Flogcats%2F", + "${TASK_ID}%2F%2B%2Funified_logcats" + ], + "name": "shard #${SHARD_INDEX} logcats" + } + ] + }, + "test": "device_unittests" + }, + { + "args": [ + "--gs-results-bucket=chromium-result-details", + "--recover-devices" + ], + "isolate_coverage_data": true, + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "display_unittests" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/luci/logdog/butler/${platform}", + "location": "bin", + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" + } + ], + "dimension_sets": [ + { + "device_os": "KTU84P", + "device_os_type": "userdebug", + "device_type": "hammerhead", + "os": "Android" + } + ], + "output_links": [ + { + "link": [ + "https://luci-logdog.appspot.com/v/?s", + "=android%2Fswarming%2Flogcats%2F", + "${TASK_ID}%2F%2B%2Funified_logcats" + ], + "name": "shard #${SHARD_INDEX} logcats" + } + ] + }, + "test": "display_unittests" + }, + { + "args": [ + "--gs-results-bucket=chromium-result-details", + "--recover-devices" + ], + "isolate_coverage_data": true, + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "events_unittests" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/luci/logdog/butler/${platform}", + "location": "bin", + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" + } + ], + "dimension_sets": [ + { + "device_os": "KTU84P", + "device_os_type": "userdebug", + "device_type": "hammerhead", + "os": "Android" + } + ], + "output_links": [ + { + "link": [ + "https://luci-logdog.appspot.com/v/?s", + "=android%2Fswarming%2Flogcats%2F", + "${TASK_ID}%2F%2B%2Funified_logcats" + ], + "name": "shard #${SHARD_INDEX} logcats" + } + ] + }, + "test": "events_unittests" + }, + { + "args": [ + "--gs-results-bucket=chromium-result-details", + "--recover-devices" + ], + "isolate_coverage_data": true, + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "gcm_unit_tests" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/luci/logdog/butler/${platform}", + "location": "bin", + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" + } + ], + "dimension_sets": [ + { + "device_os": "KTU84P", + "device_os_type": "userdebug", + "device_type": "hammerhead", + "os": "Android" + } + ], + "output_links": [ + { + "link": [ + "https://luci-logdog.appspot.com/v/?s", + "=android%2Fswarming%2Flogcats%2F", + "${TASK_ID}%2F%2B%2Funified_logcats" + ], + "name": "shard #${SHARD_INDEX} logcats" + } + ] + }, + "test": "gcm_unit_tests" + }, + { + "args": [ + "--gs-results-bucket=chromium-result-details", + "--recover-devices" + ], + "isolate_coverage_data": true, + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "gfx_unittests" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/luci/logdog/butler/${platform}", + "location": "bin", + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" + } + ], + "dimension_sets": [ + { + "device_os": "KTU84P", + "device_os_type": "userdebug", + "device_type": "hammerhead", + "os": "Android" + } + ], + "output_links": [ + { + "link": [ + "https://luci-logdog.appspot.com/v/?s", + "=android%2Fswarming%2Flogcats%2F", + "${TASK_ID}%2F%2B%2Funified_logcats" + ], + "name": "shard #${SHARD_INDEX} logcats" + } + ] + }, + "test": "gfx_unittests" + }, + { + "args": [ + "--gs-results-bucket=chromium-result-details", + "--recover-devices" + ], + "isolate_coverage_data": true, + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "gin_unittests" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/luci/logdog/butler/${platform}", + "location": "bin", + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" + } + ], + "dimension_sets": [ + { + "device_os": "KTU84P", + "device_os_type": "userdebug", + "device_type": "hammerhead", + "os": "Android" + } + ], + "output_links": [ + { + "link": [ + "https://luci-logdog.appspot.com/v/?s", + "=android%2Fswarming%2Flogcats%2F", + "${TASK_ID}%2F%2B%2Funified_logcats" + ], + "name": "shard #${SHARD_INDEX} logcats" + } + ] + }, + "test": "gin_unittests" + }, + { + "args": [ + "--gs-results-bucket=chromium-result-details", + "--recover-devices" + ], + "isolate_coverage_data": true, + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "gl_tests" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/luci/logdog/butler/${platform}", + "location": "bin", + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" + } + ], + "dimension_sets": [ + { + "device_os": "KTU84P", + "device_os_type": "userdebug", + "device_type": "hammerhead", + "os": "Android" + } + ], + "output_links": [ + { + "link": [ + "https://luci-logdog.appspot.com/v/?s", + "=android%2Fswarming%2Flogcats%2F", + "${TASK_ID}%2F%2B%2Funified_logcats" + ], + "name": "shard #${SHARD_INDEX} logcats" + } + ] + }, + "test": "gl_tests" + }, + { + "args": [ + "--gs-results-bucket=chromium-result-details", + "--recover-devices" + ], + "isolate_coverage_data": true, + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "gl_unittests" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/luci/logdog/butler/${platform}", + "location": "bin", + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" + } + ], + "dimension_sets": [ + { + "device_os": "KTU84P", + "device_os_type": "userdebug", + "device_type": "hammerhead", + "os": "Android" + } + ], + "output_links": [ + { + "link": [ + "https://luci-logdog.appspot.com/v/?s", + "=android%2Fswarming%2Flogcats%2F", + "${TASK_ID}%2F%2B%2Funified_logcats" + ], + "name": "shard #${SHARD_INDEX} logcats" + } + ] + }, + "test": "gl_unittests" + }, + { + "args": [ + "--gs-results-bucket=chromium-result-details", + "--recover-devices" + ], + "isolate_coverage_data": true, + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "google_apis_unittests" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/luci/logdog/butler/${platform}", + "location": "bin", + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" + } + ], + "dimension_sets": [ + { + "device_os": "KTU84P", + "device_os_type": "userdebug", + "device_type": "hammerhead", + "os": "Android" + } + ], + "output_links": [ + { + "link": [ + "https://luci-logdog.appspot.com/v/?s", + "=android%2Fswarming%2Flogcats%2F", + "${TASK_ID}%2F%2B%2Funified_logcats" + ], + "name": "shard #${SHARD_INDEX} logcats" + } + ] + }, + "test": "google_apis_unittests" + }, + { + "args": [ + "--gs-results-bucket=chromium-result-details", + "--recover-devices" + ], + "isolate_coverage_data": true, + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "gpu_unittests" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/luci/logdog/butler/${platform}", + "location": "bin", + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" + } + ], + "dimension_sets": [ + { + "device_os": "KTU84P", + "device_os_type": "userdebug", + "device_type": "hammerhead", + "os": "Android" + } + ], + "output_links": [ + { + "link": [ + "https://luci-logdog.appspot.com/v/?s", + "=android%2Fswarming%2Flogcats%2F", + "${TASK_ID}%2F%2B%2Funified_logcats" + ], + "name": "shard #${SHARD_INDEX} logcats" + } + ] + }, + "test": "gpu_unittests" + }, + { + "args": [ + "--gs-results-bucket=chromium-result-details", + "--recover-devices" + ], + "isolate_coverage_data": true, + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "ipc_tests" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/luci/logdog/butler/${platform}", + "location": "bin", + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" + } + ], + "dimension_sets": [ + { + "device_os": "KTU84P", + "device_os_type": "userdebug", + "device_type": "hammerhead", + "os": "Android" + } + ], + "output_links": [ + { + "link": [ + "https://luci-logdog.appspot.com/v/?s", + "=android%2Fswarming%2Flogcats%2F", + "${TASK_ID}%2F%2B%2Funified_logcats" + ], + "name": "shard #${SHARD_INDEX} logcats" + } + ] + }, + "test": "ipc_tests" + }, + { + "args": [ + "--gs-results-bucket=chromium-result-details", + "--recover-devices" + ], + "isolate_coverage_data": true, + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "jingle_unittests" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/luci/logdog/butler/${platform}", + "location": "bin", + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" + } + ], + "dimension_sets": [ + { + "device_os": "KTU84P", + "device_os_type": "userdebug", + "device_type": "hammerhead", + "os": "Android" + } + ], + "output_links": [ + { + "link": [ + "https://luci-logdog.appspot.com/v/?s", + "=android%2Fswarming%2Flogcats%2F", + "${TASK_ID}%2F%2B%2Funified_logcats" + ], + "name": "shard #${SHARD_INDEX} logcats" + } + ] + }, + "test": "jingle_unittests" + }, + { + "args": [ + "--gs-results-bucket=chromium-result-details", + "--recover-devices" + ], + "isolate_coverage_data": true, + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "latency_unittests" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/luci/logdog/butler/${platform}", + "location": "bin", + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" + } + ], + "dimension_sets": [ + { + "device_os": "KTU84P", + "device_os_type": "userdebug", + "device_type": "hammerhead", + "os": "Android" + } + ], + "output_links": [ + { + "link": [ + "https://luci-logdog.appspot.com/v/?s", + "=android%2Fswarming%2Flogcats%2F", + "${TASK_ID}%2F%2B%2Funified_logcats" + ], + "name": "shard #${SHARD_INDEX} logcats" + } + ] + }, + "test": "latency_unittests" + }, + { + "args": [ + "--gs-results-bucket=chromium-result-details", + "--recover-devices" + ], + "isolate_coverage_data": true, + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "libjingle_xmpp_unittests" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/luci/logdog/butler/${platform}", + "location": "bin", + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" + } + ], + "dimension_sets": [ + { + "device_os": "KTU84P", + "device_os_type": "userdebug", + "device_type": "hammerhead", + "os": "Android" + } + ], + "output_links": [ + { + "link": [ + "https://luci-logdog.appspot.com/v/?s", + "=android%2Fswarming%2Flogcats%2F", + "${TASK_ID}%2F%2B%2Funified_logcats" + ], + "name": "shard #${SHARD_INDEX} logcats" + } + ] + }, + "test": "libjingle_xmpp_unittests" + }, + { + "args": [ + "--gs-results-bucket=chromium-result-details", + "--recover-devices" + ], + "isolate_coverage_data": true, + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "media_blink_unittests" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/luci/logdog/butler/${platform}", + "location": "bin", + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" + } + ], + "dimension_sets": [ + { + "device_os": "KTU84P", + "device_os_type": "userdebug", + "device_type": "hammerhead", + "os": "Android" + } + ], + "output_links": [ + { + "link": [ + "https://luci-logdog.appspot.com/v/?s", + "=android%2Fswarming%2Flogcats%2F", + "${TASK_ID}%2F%2B%2Funified_logcats" + ], + "name": "shard #${SHARD_INDEX} logcats" + } + ] + }, + "test": "media_blink_unittests" + }, + { + "args": [ + "--gs-results-bucket=chromium-result-details", + "--recover-devices" + ], + "isolate_coverage_data": true, + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "media_service_unittests" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/luci/logdog/butler/${platform}", + "location": "bin", + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" + } + ], + "dimension_sets": [ + { + "device_os": "KTU84P", + "device_os_type": "userdebug", + "device_type": "hammerhead", + "os": "Android" + } + ], + "output_links": [ + { + "link": [ + "https://luci-logdog.appspot.com/v/?s", + "=android%2Fswarming%2Flogcats%2F", + "${TASK_ID}%2F%2B%2Funified_logcats" + ], + "name": "shard #${SHARD_INDEX} logcats" + } + ] + }, + "test": "media_service_unittests" + }, + { + "args": [ + "--gs-results-bucket=chromium-result-details", + "--recover-devices" + ], + "isolate_coverage_data": true, + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "media_unittests" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/luci/logdog/butler/${platform}", + "location": "bin", + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" + } + ], + "dimension_sets": [ + { + "device_os": "KTU84P", + "device_os_type": "userdebug", + "device_type": "hammerhead", + "os": "Android" + } + ], + "output_links": [ + { + "link": [ + "https://luci-logdog.appspot.com/v/?s", + "=android%2Fswarming%2Flogcats%2F", + "${TASK_ID}%2F%2B%2Funified_logcats" + ], + "name": "shard #${SHARD_INDEX} logcats" + } + ] + }, + "test": "media_unittests" + }, + { + "args": [ + "--gs-results-bucket=chromium-result-details", + "--recover-devices" + ], + "isolate_coverage_data": true, + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "midi_unittests" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/luci/logdog/butler/${platform}", + "location": "bin", + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" + } + ], + "dimension_sets": [ + { + "device_os": "KTU84P", + "device_os_type": "userdebug", + "device_type": "hammerhead", + "os": "Android" + } + ], + "output_links": [ + { + "link": [ + "https://luci-logdog.appspot.com/v/?s", + "=android%2Fswarming%2Flogcats%2F", + "${TASK_ID}%2F%2B%2Funified_logcats" + ], + "name": "shard #${SHARD_INDEX} logcats" + } + ] + }, + "test": "midi_unittests" + }, + { + "args": [ + "--gs-results-bucket=chromium-result-details", + "--recover-devices" + ], + "isolate_coverage_data": true, + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "mojo_test_apk" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/luci/logdog/butler/${platform}", + "location": "bin", + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" + } + ], + "dimension_sets": [ + { + "device_os": "KTU84P", + "device_os_type": "userdebug", + "device_type": "hammerhead", + "os": "Android" + } + ], + "output_links": [ + { + "link": [ + "https://luci-logdog.appspot.com/v/?s", + "=android%2Fswarming%2Flogcats%2F", + "${TASK_ID}%2F%2B%2Funified_logcats" + ], + "name": "shard #${SHARD_INDEX} logcats" + } + ] + }, + "test": "mojo_test_apk" + }, + { + "args": [ + "--gs-results-bucket=chromium-result-details", + "--recover-devices" + ], + "isolate_coverage_data": true, + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "mojo_unittests" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/luci/logdog/butler/${platform}", + "location": "bin", + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" + } + ], + "dimension_sets": [ + { + "device_os": "KTU84P", + "device_os_type": "userdebug", + "device_type": "hammerhead", + "os": "Android" + } + ], + "output_links": [ + { + "link": [ + "https://luci-logdog.appspot.com/v/?s", + "=android%2Fswarming%2Flogcats%2F", + "${TASK_ID}%2F%2B%2Funified_logcats" + ], + "name": "shard #${SHARD_INDEX} logcats" + } + ] + }, + "test": "mojo_unittests" + }, + { + "args": [ + "--gs-results-bucket=chromium-result-details", + "--recover-devices" + ], + "isolate_coverage_data": true, + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "net_unittests" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/luci/logdog/butler/${platform}", + "location": "bin", + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" + } + ], + "dimension_sets": [ + { + "device_os": "KTU84P", + "device_os_type": "userdebug", + "device_type": "hammerhead", + "os": "Android" + } + ], + "output_links": [ + { + "link": [ + "https://luci-logdog.appspot.com/v/?s", + "=android%2Fswarming%2Flogcats%2F", + "${TASK_ID}%2F%2B%2Funified_logcats" + ], + "name": "shard #${SHARD_INDEX} logcats" + } + ], + "shards": 3 + }, + "test": "net_unittests" + }, + { + "args": [ + "--gs-results-bucket=chromium-result-details", + "--recover-devices" + ], + "isolate_coverage_data": true, + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "perfetto_unittests" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/luci/logdog/butler/${platform}", + "location": "bin", + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" + } + ], + "dimension_sets": [ + { + "device_os": "KTU84P", + "device_os_type": "userdebug", + "device_type": "hammerhead", + "os": "Android" + } + ], + "output_links": [ + { + "link": [ + "https://luci-logdog.appspot.com/v/?s", + "=android%2Fswarming%2Flogcats%2F", + "${TASK_ID}%2F%2B%2Funified_logcats" + ], + "name": "shard #${SHARD_INDEX} logcats" + } + ] + }, + "test": "perfetto_unittests" + }, + { + "args": [ + "--gs-results-bucket=chromium-result-details", + "--recover-devices" + ], + "isolate_coverage_data": true, + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "sandbox_linux_unittests" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/luci/logdog/butler/${platform}", + "location": "bin", + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" + } + ], + "dimension_sets": [ + { + "device_os": "KTU84P", + "device_os_type": "userdebug", + "device_type": "hammerhead", + "os": "Android" + } + ], + "output_links": [ + { + "link": [ + "https://luci-logdog.appspot.com/v/?s", + "=android%2Fswarming%2Flogcats%2F", + "${TASK_ID}%2F%2B%2Funified_logcats" + ], + "name": "shard #${SHARD_INDEX} logcats" + } + ] + }, + "test": "sandbox_linux_unittests" + }, + { + "args": [ + "--gs-results-bucket=chromium-result-details", + "--recover-devices" + ], + "isolate_coverage_data": true, + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "services_unittests" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/luci/logdog/butler/${platform}", + "location": "bin", + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" + } + ], + "dimension_sets": [ + { + "device_os": "KTU84P", + "device_os_type": "userdebug", + "device_type": "hammerhead", + "os": "Android" + } + ], + "output_links": [ + { + "link": [ + "https://luci-logdog.appspot.com/v/?s", + "=android%2Fswarming%2Flogcats%2F", + "${TASK_ID}%2F%2B%2Funified_logcats" + ], + "name": "shard #${SHARD_INDEX} logcats" + } + ] + }, + "test": "services_unittests" + }, + { + "args": [ + "--gs-results-bucket=chromium-result-details", + "--recover-devices" + ], + "isolate_coverage_data": true, + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "shell_dialogs_unittests" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/luci/logdog/butler/${platform}", + "location": "bin", + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" + } + ], + "dimension_sets": [ + { + "device_os": "KTU84P", + "device_os_type": "userdebug", + "device_type": "hammerhead", + "os": "Android" + } + ], + "output_links": [ + { + "link": [ + "https://luci-logdog.appspot.com/v/?s", + "=android%2Fswarming%2Flogcats%2F", + "${TASK_ID}%2F%2B%2Funified_logcats" + ], + "name": "shard #${SHARD_INDEX} logcats" + } + ] + }, + "test": "shell_dialogs_unittests" + }, + { + "args": [ + "--gs-results-bucket=chromium-result-details", + "--recover-devices" + ], + "isolate_coverage_data": true, + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "skia_unittests" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/luci/logdog/butler/${platform}", + "location": "bin", + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" + } + ], + "dimension_sets": [ + { + "device_os": "KTU84P", + "device_os_type": "userdebug", + "device_type": "hammerhead", + "os": "Android" + } + ], + "output_links": [ + { + "link": [ + "https://luci-logdog.appspot.com/v/?s", + "=android%2Fswarming%2Flogcats%2F", + "${TASK_ID}%2F%2B%2Funified_logcats" + ], + "name": "shard #${SHARD_INDEX} logcats" + } + ] + }, + "test": "skia_unittests" + }, + { + "args": [ + "--gs-results-bucket=chromium-result-details", + "--recover-devices" + ], + "isolate_coverage_data": true, + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "sql_unittests" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/luci/logdog/butler/${platform}", + "location": "bin", + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" + } + ], + "dimension_sets": [ + { + "device_os": "KTU84P", + "device_os_type": "userdebug", + "device_type": "hammerhead", + "os": "Android" + } + ], + "output_links": [ + { + "link": [ + "https://luci-logdog.appspot.com/v/?s", + "=android%2Fswarming%2Flogcats%2F", + "${TASK_ID}%2F%2B%2Funified_logcats" + ], + "name": "shard #${SHARD_INDEX} logcats" + } + ] + }, + "test": "sql_unittests" + }, + { + "args": [ + "--gs-results-bucket=chromium-result-details", + "--recover-devices" + ], + "isolate_coverage_data": true, + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "storage_unittests" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/luci/logdog/butler/${platform}", + "location": "bin", + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" + } + ], + "dimension_sets": [ + { + "device_os": "KTU84P", + "device_os_type": "userdebug", + "device_type": "hammerhead", + "os": "Android" + } + ], + "output_links": [ + { + "link": [ + "https://luci-logdog.appspot.com/v/?s", + "=android%2Fswarming%2Flogcats%2F", + "${TASK_ID}%2F%2B%2Funified_logcats" + ], + "name": "shard #${SHARD_INDEX} logcats" + } + ] + }, + "test": "storage_unittests" + }, + { + "args": [ + "--gs-results-bucket=chromium-result-details", + "--recover-devices" + ], + "isolate_coverage_data": true, + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "ui_android_unittests" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/luci/logdog/butler/${platform}", + "location": "bin", + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" + } + ], + "dimension_sets": [ + { + "device_os": "KTU84P", + "device_os_type": "userdebug", + "device_type": "hammerhead", + "os": "Android" + } + ], + "output_links": [ + { + "link": [ + "https://luci-logdog.appspot.com/v/?s", + "=android%2Fswarming%2Flogcats%2F", + "${TASK_ID}%2F%2B%2Funified_logcats" + ], + "name": "shard #${SHARD_INDEX} logcats" + } + ] + }, + "test": "ui_android_unittests" + }, + { + "args": [ + "--gs-results-bucket=chromium-result-details", + "--recover-devices" + ], + "isolate_coverage_data": true, + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "ui_base_unittests" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/luci/logdog/butler/${platform}", + "location": "bin", + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" + } + ], + "dimension_sets": [ + { + "device_os": "KTU84P", + "device_os_type": "userdebug", + "device_type": "hammerhead", + "os": "Android" + } + ], + "output_links": [ + { + "link": [ + "https://luci-logdog.appspot.com/v/?s", + "=android%2Fswarming%2Flogcats%2F", + "${TASK_ID}%2F%2B%2Funified_logcats" + ], + "name": "shard #${SHARD_INDEX} logcats" + } + ] + }, + "test": "ui_base_unittests" + }, + { + "args": [ + "--gs-results-bucket=chromium-result-details", + "--recover-devices" + ], + "isolate_coverage_data": true, + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "ui_touch_selection_unittests" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/luci/logdog/butler/${platform}", + "location": "bin", + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" + } + ], + "dimension_sets": [ + { + "device_os": "KTU84P", + "device_os_type": "userdebug", + "device_type": "hammerhead", + "os": "Android" + } + ], + "output_links": [ + { + "link": [ + "https://luci-logdog.appspot.com/v/?s", + "=android%2Fswarming%2Flogcats%2F", + "${TASK_ID}%2F%2B%2Funified_logcats" + ], + "name": "shard #${SHARD_INDEX} logcats" + } + ] + }, + "test": "ui_touch_selection_unittests" + }, + { + "args": [ + "--gs-results-bucket=chromium-result-details", + "--recover-devices" + ], + "isolate_coverage_data": true, + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "unit_tests" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/luci/logdog/butler/${platform}", + "location": "bin", + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" + } + ], + "dimension_sets": [ + { + "device_os": "KTU84P", + "device_os_type": "userdebug", + "device_type": "hammerhead", + "os": "Android" + } + ], + "output_links": [ + { + "link": [ + "https://luci-logdog.appspot.com/v/?s", + "=android%2Fswarming%2Flogcats%2F", + "${TASK_ID}%2F%2B%2Funified_logcats" + ], + "name": "shard #${SHARD_INDEX} logcats" + } + ], + "shards": 10 + }, + "test": "unit_tests" + }, + { + "args": [ + "--gs-results-bucket=chromium-result-details", + "--recover-devices" + ], + "isolate_coverage_data": true, + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "url_unittests" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/luci/logdog/butler/${platform}", + "location": "bin", + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" + } + ], + "dimension_sets": [ + { + "device_os": "KTU84P", + "device_os_type": "userdebug", + "device_type": "hammerhead", + "os": "Android" + } + ], + "output_links": [ + { + "link": [ + "https://luci-logdog.appspot.com/v/?s", + "=android%2Fswarming%2Flogcats%2F", + "${TASK_ID}%2F%2B%2Funified_logcats" + ], + "name": "shard #${SHARD_INDEX} logcats" + } + ] + }, + "test": "url_unittests" + }, + { + "args": [ + "--gs-results-bucket=chromium-result-details", + "--recover-devices" + ], + "isolate_coverage_data": true, + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "viz_unittests" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/luci/logdog/butler/${platform}", + "location": "bin", + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" + } + ], + "dimension_sets": [ + { + "device_os": "KTU84P", + "device_os_type": "userdebug", + "device_type": "hammerhead", + "os": "Android" + } + ], + "output_links": [ + { + "link": [ + "https://luci-logdog.appspot.com/v/?s", + "=android%2Fswarming%2Flogcats%2F", + "${TASK_ID}%2F%2B%2Funified_logcats" + ], + "name": "shard #${SHARD_INDEX} logcats" + } + ] + }, + "test": "viz_unittests" + }, + { + "args": [ + "--gs-results-bucket=chromium-result-details", + "--recover-devices" + ], + "isolate_coverage_data": true, + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "vr_android_unittests" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/luci/logdog/butler/${platform}", + "location": "bin", + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" + } + ], + "dimension_sets": [ + { + "device_os": "KTU84P", + "device_os_type": "userdebug", + "device_type": "hammerhead", + "os": "Android" + } + ], + "output_links": [ + { + "link": [ + "https://luci-logdog.appspot.com/v/?s", + "=android%2Fswarming%2Flogcats%2F", + "${TASK_ID}%2F%2B%2Funified_logcats" + ], + "name": "shard #${SHARD_INDEX} logcats" + } + ] + }, + "test": "vr_android_unittests" + }, + { + "args": [ + "--gs-results-bucket=chromium-result-details", + "--recover-devices" + ], + "isolate_coverage_data": true, + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "vr_common_unittests" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/luci/logdog/butler/${platform}", + "location": "bin", + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" + } + ], + "dimension_sets": [ + { + "device_os": "KTU84P", + "device_os_type": "userdebug", + "device_type": "hammerhead", + "os": "Android" + } + ], + "output_links": [ + { + "link": [ + "https://luci-logdog.appspot.com/v/?s", + "=android%2Fswarming%2Flogcats%2F", + "${TASK_ID}%2F%2B%2Funified_logcats" + ], + "name": "shard #${SHARD_INDEX} logcats" + } + ] + }, + "test": "vr_common_unittests" + }, + { + "args": [ + "--gs-results-bucket=chromium-result-details", + "--recover-devices" + ], + "isolate_coverage_data": true, + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "vr_pixeltests" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/luci/logdog/butler/${platform}", + "location": "bin", + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" + } + ], + "dimension_sets": [ + { + "device_os": "KTU84P", + "device_os_type": "userdebug", + "device_type": "hammerhead", + "os": "Android" + } + ], + "output_links": [ + { + "link": [ + "https://luci-logdog.appspot.com/v/?s", + "=android%2Fswarming%2Flogcats%2F", + "${TASK_ID}%2F%2B%2Funified_logcats" + ], + "name": "shard #${SHARD_INDEX} logcats" + } + ] + }, + "test": "vr_pixeltests" + }, + { + "args": [ + "--gs-results-bucket=chromium-result-details", + "--recover-devices" + ], + "isolate_coverage_data": true, + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "webview_instrumentation_test_apk" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/luci/logdog/butler/${platform}", + "location": "bin", + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" + } + ], + "dimension_sets": [ + { + "device_os": "KTU84P", + "device_os_type": "userdebug", + "device_type": "hammerhead", + "os": "Android" + } + ], + "output_links": [ + { + "link": [ + "https://luci-logdog.appspot.com/v/?s", + "=android%2Fswarming%2Flogcats%2F", + "${TASK_ID}%2F%2B%2Funified_logcats" + ], + "name": "shard #${SHARD_INDEX} logcats" + } + ], + "shards": 7 + }, + "test": "webview_instrumentation_test_apk" + }, + { + "args": [ + "--enable-features=NetworkService,NetworkServiceInProcess", + "--test-launcher-filter-file=../../testing/buildbot/filters/mojo.fyi.network_webview_instrumentation_test_apk.filter", + "--gs-results-bucket=chromium-result-details", + "--recover-devices" + ], + "isolate_coverage_data": true, + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "network_service_webview_instrumentation_test_apk" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "name": "network_service_webview_instrumentation_test_apk", + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/luci/logdog/butler/${platform}", + "location": "bin", + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" + } + ], + "dimension_sets": [ + { + "device_os": "KTU84P", + "device_os_type": "userdebug", + "device_type": "hammerhead", + "os": "Android" + } + ], + "output_links": [ + { + "link": [ + "https://luci-logdog.appspot.com/v/?s", + "=android%2Fswarming%2Flogcats%2F", + "${TASK_ID}%2F%2B%2Funified_logcats" + ], + "name": "shard #${SHARD_INDEX} logcats" + } + ], + "shards": 20 + }, + "test": "webview_instrumentation_test_apk" + }, + { + "args": [ + "--gs-results-bucket=chromium-result-details", + "--recover-devices" + ], + "isolate_coverage_data": true, + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "wtf_unittests" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/luci/logdog/butler/${platform}", + "location": "bin", + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" + } + ], + "dimension_sets": [ + { + "device_os": "KTU84P", + "device_os_type": "userdebug", + "device_type": "hammerhead", + "os": "Android" + } + ], + "output_links": [ + { + "link": [ + "https://luci-logdog.appspot.com/v/?s", + "=android%2Fswarming%2Flogcats%2F", + "${TASK_ID}%2F%2B%2Funified_logcats" + ], + "name": "shard #${SHARD_INDEX} logcats" + } + ] + }, + "test": "wtf_unittests" + } + ], "junit_tests": [ { "test": "base_junit_tests" + }, + { + "test": "chrome_junit_tests" + }, + { + "test": "components_background_task_scheduler_junit_tests" + }, + { + "test": "components_gcm_driver_junit_tests" + }, + { + "test": "components_invalidation_impl_junit_tests" + }, + { + "test": "components_policy_junit_tests" + }, + { + "test": "components_signin_junit_tests" + }, + { + "test": "components_variations_junit_tests" + }, + { + "test": "content_junit_tests" + }, + { + "test": "device_junit_tests" + }, + { + "test": "junit_unit_tests" + }, + { + "test": "keyboard_accessory_junit_tests" + }, + { + "test": "media_base_junit_tests" + }, + { + "test": "media_router_junit_tests" + }, + { + "test": "net_junit_tests" + }, + { + "test": "service_junit_tests" + }, + { + "test": "ui_junit_tests" + }, + { + "test": "webapk_client_junit_tests" + }, + { + "test": "webapk_shell_apk_h2o_junit_tests" + }, + { + "test": "webapk_shell_apk_junit_tests" } ] }, @@ -4742,6 +7990,16 @@ "swarming": { "can_use_on_swarming_builders": true }, + "test": "web_engine_integration_tests" + }, + { + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true + }, "test": "web_engine_unittests" }, { @@ -5203,6 +8461,22 @@ } ] }, + "test": "web_engine_integration_tests" + }, + { + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "kvm": "1", + "os": "Ubuntu-16.04" + } + ] + }, "test": "web_engine_unittests" }, { @@ -5689,6 +8963,22 @@ } ] }, + "test": "web_engine_integration_tests" + }, + { + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "kvm": "1", + "os": "Ubuntu-16.04" + } + ] + }, "test": "web_engine_unittests" }, {
diff --git a/testing/buildbot/chromium.gpu.fyi.json b/testing/buildbot/chromium.gpu.fyi.json index 3f19edd..770c5c91 100644 --- a/testing/buildbot/chromium.gpu.fyi.json +++ b/testing/buildbot/chromium.gpu.fyi.json
@@ -9920,8 +9920,8 @@ "--test-launcher-filter-file=../../testing/buildbot/filters/vulkan.content_browsertests.filter", "--enable-features=VizDisplayCompositor,UseSkiaRenderer,UiGpuRasterization", "--use-gl=any", + "--use-vulkan=native", "--enable-oop-rasterization", - "--enable-vulkan", "--enable-gpu-rasterization", "--enable-raster-to-sk-image", "--force-gpu-rasterization", @@ -20070,8 +20070,8 @@ "--test-launcher-filter-file=../../testing/buildbot/filters/vulkan.content_browsertests.filter", "--enable-features=VizDisplayCompositor,UseSkiaRenderer,UiGpuRasterization", "--use-gl=any", + "--use-vulkan=native", "--enable-oop-rasterization", - "--enable-vulkan", "--enable-gpu-rasterization", "--enable-raster-to-sk-image", "--force-gpu-rasterization", @@ -20362,8 +20362,8 @@ "--test-launcher-filter-file=../../testing/buildbot/filters/vulkan.content_browsertests.filter", "--enable-features=VizDisplayCompositor,UseSkiaRenderer,UiGpuRasterization", "--use-gl=any", + "--use-vulkan=native", "--enable-oop-rasterization", - "--enable-vulkan", "--enable-gpu-rasterization", "--enable-raster-to-sk-image", "--force-gpu-rasterization",
diff --git a/testing/buildbot/chromium.memory.json b/testing/buildbot/chromium.memory.json index 8f0ee98..cb3fe60ac 100644 --- a/testing/buildbot/chromium.memory.json +++ b/testing/buildbot/chromium.memory.json
@@ -14738,54 +14738,6 @@ }, { "args": [ - "--disable-features=NetworkServiceInProcess", - "--gtest_filter=-org.chromium.chrome.browser.FeaturesAnnotationsTest#testFeaturesSetExistingFlags", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "network_service_out_of_process_chrome_public_test_apk" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "network_service_out_of_process_chrome_public_test_apk", - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/luci/logdog/butler/${platform}", - "location": "bin", - "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" - } - ], - "dimension_sets": [ - { - "device_os": "MMB29Q", - "device_os_type": "userdebug", - "device_type": "bullhead", - "os": "Android" - } - ], - "output_links": [ - { - "link": [ - "https://luci-logdog.appspot.com/v/?s", - "=android%2Fswarming%2Flogcats%2F", - "${TASK_ID}%2F%2B%2Funified_logcats" - ], - "name": "shard #${SHARD_INDEX} logcats" - } - ], - "shards": 20 - }, - "test": "chrome_public_test_apk" - }, - { - "args": [ "--gs-results-bucket=chromium-result-details", "--recover-devices" ], @@ -14830,52 +14782,6 @@ }, { "args": [ - "--disable-features=NetworkServiceInProcess", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "network_service_out_of_process_components_browsertests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "network_service_out_of_process_components_browsertests", - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/luci/logdog/butler/${platform}", - "location": "bin", - "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" - } - ], - "dimension_sets": [ - { - "device_os": "MMB29Q", - "device_os_type": "userdebug", - "device_type": "bullhead", - "os": "Android" - } - ], - "output_links": [ - { - "link": [ - "https://luci-logdog.appspot.com/v/?s", - "=android%2Fswarming%2Flogcats%2F", - "${TASK_ID}%2F%2B%2Funified_logcats" - ], - "name": "shard #${SHARD_INDEX} logcats" - } - ] - }, - "test": "components_browsertests" - }, - { - "args": [ "--gs-results-bucket=chromium-result-details", "--recover-devices" ], @@ -14966,241 +14872,6 @@ }, { "args": [ - "--disable-features=NetworkServiceInProcess", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "network_service_out_of_process_content_browsertests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "network_service_out_of_process_content_browsertests", - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/luci/logdog/butler/${platform}", - "location": "bin", - "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" - } - ], - "dimension_sets": [ - { - "device_os": "MMB29Q", - "device_os_type": "userdebug", - "device_type": "bullhead", - "os": "Android" - } - ], - "output_links": [ - { - "link": [ - "https://luci-logdog.appspot.com/v/?s", - "=android%2Fswarming%2Flogcats%2F", - "${TASK_ID}%2F%2B%2Funified_logcats" - ], - "name": "shard #${SHARD_INDEX} logcats" - } - ], - "shards": 5 - }, - "test": "content_browsertests" - }, - { - "args": [ - "--disable-features=NetworkService", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "non_network_service_content_browsertests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "non_network_service_content_browsertests", - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/luci/logdog/butler/${platform}", - "location": "bin", - "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" - } - ], - "dimension_sets": [ - { - "device_os": "MMB29Q", - "device_os_type": "userdebug", - "device_type": "bullhead", - "os": "Android" - } - ], - "output_links": [ - { - "link": [ - "https://luci-logdog.appspot.com/v/?s", - "=android%2Fswarming%2Flogcats%2F", - "${TASK_ID}%2F%2B%2Funified_logcats" - ], - "name": "shard #${SHARD_INDEX} logcats" - } - ], - "shards": 5 - }, - "test": "content_browsertests" - }, - { - "args": [ - "--disable-perfetto", - "--gtest_filter=TracingControllerTest.*:BackgroundTracingManagerBrowserTest.*", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "nonperfetto_content_browsertests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "nonperfetto_content_browsertests", - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/luci/logdog/butler/${platform}", - "location": "bin", - "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" - } - ], - "dimension_sets": [ - { - "device_os": "MMB29Q", - "device_os_type": "userdebug", - "device_type": "bullhead", - "os": "Android" - } - ], - "output_links": [ - { - "link": [ - "https://luci-logdog.appspot.com/v/?s", - "=android%2Fswarming%2Flogcats%2F", - "${TASK_ID}%2F%2B%2Funified_logcats" - ], - "name": "shard #${SHARD_INDEX} logcats" - } - ] - }, - "test": "content_browsertests" - }, - { - "args": [ - "--disable-features=NetworkServiceInProcess", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "network_service_out_of_process_content_shell_test_apk" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "network_service_out_of_process_content_shell_test_apk", - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/luci/logdog/butler/${platform}", - "location": "bin", - "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" - } - ], - "dimension_sets": [ - { - "device_os": "MMB29Q", - "device_os_type": "userdebug", - "device_type": "bullhead", - "os": "Android" - } - ], - "output_links": [ - { - "link": [ - "https://luci-logdog.appspot.com/v/?s", - "=android%2Fswarming%2Flogcats%2F", - "${TASK_ID}%2F%2B%2Funified_logcats" - ], - "name": "shard #${SHARD_INDEX} logcats" - } - ], - "shards": 5 - }, - "test": "content_shell_test_apk" - }, - { - "args": [ - "--disable-features=NetworkService", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "non_network_service_content_shell_test_apk" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "non_network_service_content_shell_test_apk", - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/luci/logdog/butler/${platform}", - "location": "bin", - "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" - } - ], - "dimension_sets": [ - { - "device_os": "MMB29Q", - "device_os_type": "userdebug", - "device_type": "bullhead", - "os": "Android" - } - ], - "output_links": [ - { - "link": [ - "https://luci-logdog.appspot.com/v/?s", - "=android%2Fswarming%2Flogcats%2F", - "${TASK_ID}%2F%2B%2Funified_logcats" - ], - "name": "shard #${SHARD_INDEX} logcats" - } - ], - "shards": 5 - }, - "test": "content_shell_test_apk" - }, - { - "args": [ "--gs-results-bucket=chromium-result-details", "--recover-devices" ],
diff --git a/testing/buildbot/chromium.perf.fyi.json b/testing/buildbot/chromium.perf.fyi.json index 5bfc783a..77da67d 100644 --- a/testing/buildbot/chromium.perf.fyi.json +++ b/testing/buildbot/chromium.perf.fyi.json
@@ -90,7 +90,7 @@ } ] }, - "win_laptop_low_end-perf_HP-Candidate": { + "win-10_laptop_low_end-perf_HP-Candidate": { "isolated_scripts": [ { "args": [ @@ -98,7 +98,7 @@ "--browser=release_x64", "--upload-results", "--run-ref-build", - "--test-shard-map-filename=win_laptop_low_end-perf_HP-Candidate_map.json" + "--test-shard-map-filename=win-10_laptop_low_end-perf_HP-Candidate_map.json" ], "isolate_name": "performance_test_suite", "merge": { @@ -112,6 +112,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { + "gpu": null, "id": "build370-a7", "pool": "chrome.tests.perf-fyi" }
diff --git a/testing/buildbot/gn_isolate_map.pyl b/testing/buildbot/gn_isolate_map.pyl index 5692bf0..619b094 100644 --- a/testing/buildbot/gn_isolate_map.pyl +++ b/testing/buildbot/gn_isolate_map.pyl
@@ -2821,6 +2821,10 @@ "label": "//fuchsia/engine:web_engine_browsertests", "type": "console_test_launcher", }, + "web_engine_integration_tests": { + "label": "//fuchsia/runners:web_engine_integration_tests", + "type": "console_test_launcher", + }, "web_engine_unittests": { "label": "//fuchsia/engine:web_engine_unittests", "type": "console_test_launcher",
diff --git a/testing/buildbot/mixins.pyl b/testing/buildbot/mixins.pyl index 1fe38a1..79f07c6 100644 --- a/testing/buildbot/mixins.pyl +++ b/testing/buildbot/mixins.pyl
@@ -212,6 +212,13 @@ 'kitkat': { 'swarming': { 'dimensions': { + 'device_os': 'KTU84P', + }, + }, + }, + 'kitkat_generic': { + 'swarming': { + 'dimensions': { 'device_os': 'K', }, },
diff --git a/testing/buildbot/test_suite_exceptions.pyl b/testing/buildbot/test_suite_exceptions.pyl index 2e14e87..356db40 100644 --- a/testing/buildbot/test_suite_exceptions.pyl +++ b/testing/buildbot/test_suite_exceptions.pyl
@@ -1036,29 +1036,37 @@ }, }, 'network_service_out_of_process_chrome_public_test_apk': { - # Don't run on trybots; waterfall is enough. 'remove_from': [ + # chromium.android + 'android-asan', + # Don't run on trybots; waterfall is enough. 'android-kitkat-arm-rel', 'android-marshmallow-arm64-rel' ], }, 'network_service_out_of_process_components_browsertests': { - # Don't run on trybots; waterfall is enough. 'remove_from': [ + # chromium.android + 'android-asan', + # Don't run on trybots; waterfall is enough. 'android-kitkat-arm-rel', 'android-marshmallow-arm64-rel' ], }, 'network_service_out_of_process_content_browsertests': { - # Don't run on trybots; waterfall is enough. 'remove_from': [ + # chromium.android + 'android-asan', + # Don't run on trybots; waterfall is enough. 'android-kitkat-arm-rel', 'android-marshmallow-arm64-rel' ], }, 'network_service_out_of_process_content_shell_test_apk': { - # Don't run on trybots; waterfall is enough. 'remove_from': [ + # chromium.android + 'android-asan', + # Don't run on trybots; waterfall is enough. 'android-kitkat-arm-rel', 'android-marshmallow-arm64-rel' ], @@ -1082,15 +1090,19 @@ ], }, 'non_network_service_content_browsertests': { - # Don't run on trybots; waterfall is enough. 'remove_from': [ + # chromium.android + 'android-asan', + # Don't run on trybots; waterfall is enough. 'android-kitkat-arm-rel', 'android-marshmallow-arm64-rel' ], }, 'non_network_service_content_shell_test_apk': { - # Don't run on trybots; waterfall is enough. 'remove_from': [ + # chromium.android + 'android-asan', + # Don't run on trybots; waterfall is enough. 'android-kitkat-arm-rel', 'android-marshmallow-arm64-rel' ], @@ -1122,6 +1134,11 @@ }, }, }, + 'nonperfetto_content_browsertests': { + 'remove_from': [ + 'android-asan', + ], + }, 'not_site_per_process_webkit_layout_tests': { 'remove_from': [ # chromium.linux @@ -1581,6 +1598,12 @@ 'linux-chromeos-dbg', # https://crbug.com/859307 ], }, + 'web_engine_integration_tests': { + 'remove_from': [ + # chromium.linux + 'Fuchsia x64', # https://crbug.com/971927 + ], + }, 'webdriver_tests_suite': { 'remove_from': [ 'Linux Tests', # https://crbug.com/929689, https://crbug.com/936557
diff --git a/testing/buildbot/test_suites.pyl b/testing/buildbot/test_suites.pyl index a997b7a8..0d68436 100644 --- a/testing/buildbot/test_suites.pyl +++ b/testing/buildbot/test_suites.pyl
@@ -24,10 +24,6 @@ 'monochrome_public_test_ar_apk': {}, }, - 'android_code_coverage_junit_tests': { - 'base_junit_tests': {}, - }, - 'android_ddready_vr_gtests': { 'chrome_public_test_vr_apk-ddready-cardboard': { 'args': [ @@ -2686,6 +2682,7 @@ ], }, 'web_engine_browsertests': {}, + 'web_engine_integration_tests': {}, 'web_engine_unittests': {}, 'web_runner_integration_tests': {}, }, @@ -3309,8 +3306,8 @@ '--test-launcher-filter-file=../../testing/buildbot/filters/vulkan.content_browsertests.filter', '--enable-features=VizDisplayCompositor,UseSkiaRenderer,UiGpuRasterization', '--use-gl=any', + '--use-vulkan=native', '--enable-oop-rasterization', - '--enable-vulkan', '--enable-gpu-rasterization', '--enable-raster-to-sk-image', '--force-gpu-rasterization',
diff --git a/testing/buildbot/waterfalls.pyl b/testing/buildbot/waterfalls.pyl index 5a046ba..d832a6a 100644 --- a/testing/buildbot/waterfalls.pyl +++ b/testing/buildbot/waterfalls.pyl
@@ -196,18 +196,13 @@ }, }, 'KitKat Phone Tester (dbg)': { + 'mixins': [ + 'kitkat', + 'hammerhead', + ], 'test_suites': { 'gtest_tests': 'chromium_android_gtests', }, - 'swarming': { - 'dimension_sets': [ - { - 'device_os': 'KTU84P', - 'device_type': 'hammerhead', - 'os': 'Android', - }, - ], - }, 'os_type': 'android', }, 'KitKat Tablet Tester': { @@ -322,6 +317,10 @@ }, }, 'android-cronet-arm-dbg': { + 'mixins': [ + 'kitkat', + 'hammerhead', + ], 'additional_compile_targets': [ 'cronet_package', 'cronet_perf_test_apk', @@ -330,15 +329,6 @@ 'gtest_tests': 'cronet_gtests', 'isolated_scripts': 'cronet_dbg_isolated_scripts', }, - 'swarming': { - 'dimension_sets': [ - { - 'device_os': 'KTU84P', - 'device_type': 'hammerhead', - 'os': 'Android', - }, - ], - }, 'os_type': 'android', }, 'android-cronet-arm-rel': { @@ -382,6 +372,10 @@ }, }, 'android-cronet-asan-arm-rel': { + 'mixins': [ + 'kitkat', + 'hammerhead', + ], 'additional_compile_targets': [ 'cronet_package', 'cronet_perf_test_apk', @@ -389,30 +383,16 @@ 'test_suites': { 'gtest_tests': 'cronet_gtests', }, - 'swarming': { - 'dimension_sets': [ - { - 'device_os': 'KTU84P', - 'device_type': 'hammerhead', - 'os': 'Android', - }, - ], - }, 'os_type': 'android', }, 'android-cronet-kitkat-arm-rel': { + 'mixins': [ + 'kitkat', + 'hammerhead', + ], 'test_suites': { 'gtest_tests': 'cronet_gtests', }, - 'swarming': { - 'dimension_sets': [ - { - 'device_os': 'KTU84P', - 'device_type': 'hammerhead', - 'os': 'Android', - }, - ], - }, 'os_type': 'android', }, 'android-cronet-lollipop-arm-rel': {}, @@ -484,6 +464,10 @@ ] }, 'android-kitkat-arm-rel': { + 'mixins': [ + 'kitkat', + 'hammerhead', + ], 'additional_compile_targets': [ 'cronet_test_instrumentation_apk', 'monochrome_static_initializers', @@ -493,15 +477,6 @@ 'junit_tests': 'chromium_junit_tests', 'isolated_scripts': 'monochrome_apk_checker_isolated_script', }, - 'swarming': { - 'dimension_sets': [ - { - 'device_os': 'KTU84P', - 'device_type': 'hammerhead', - 'os': 'Android', - }, - ], - }, 'os_type': 'android', }, 'android-marshmallow-arm64-rel': { @@ -566,14 +541,11 @@ 'os_type': 'android', }, 'Memory Infra Tester': { + 'mixins': [ + 'kitkat', + 'hammerhead', + ], 'swarming': { - 'dimension_sets': [ - { - 'device_os': 'KTU84P', - 'device_type': 'hammerhead', - 'os': 'Android', - }, - ], 'expiration': 36000, 'hard_timeout': 10800, 'ignore_task_failure': False, @@ -755,6 +727,10 @@ }, }, 'ToTAndroid': { + 'mixins': [ + 'kitkat', + 'hammerhead', + ], 'additional_compile_targets': [ 'all', ], @@ -764,15 +740,6 @@ 'junit_tests': 'chromium_junit_tests', 'isolated_scripts': 'monochrome_apk_checker_isolated_script', }, - 'swarming': { - 'dimension_sets': [ - { - 'device_os': 'KTU84P', - 'device_type': 'hammerhead', - 'os': 'Android', - }, - ], - }, 'os_type': 'android', }, 'ToTAndroid x64': { @@ -1601,10 +1568,14 @@ 'android-code-coverage': { 'mixins': [ 'code-coverage', + 'kitkat', + 'hammerhead', ], 'test_suites': { - 'junit_tests': 'android_code_coverage_junit_tests', - } + 'gtest_tests': 'chromium_android_gtests', + 'junit_tests': 'chromium_junit_tests', + }, + 'os_type': 'android', }, 'android-mojo-webview-rel': { 'swarming': { @@ -3843,17 +3814,14 @@ 'name': 'chromium.swarm', 'machines': { 'Android N5 Swarm': { + 'mixins': [ + 'kitkat', + 'hammerhead', + ], 'test_suites': { 'gtest_tests': 'chromium_swarm_android_gtests', }, 'swarming': { - 'dimension_sets': [ - { - 'device_os': 'KTU84P', - 'device_type': 'hammerhead', - 'os': 'Android', - }, - ], 'expiration': 10800, }, 'os_type': 'android', @@ -4029,7 +3997,7 @@ 'WebRTC Chromium FYI Android Tests (dbg) (K Nexus5)': { 'os_type': 'android', 'mixins': [ - 'kitkat', + 'kitkat_generic', 'hammerhead', ], 'test_suites': { @@ -4374,19 +4342,14 @@ 'name': 'tryserver.chromium.android', 'machines': { 'android_blink_rel': { + 'mixins': [ + 'kitkat', + 'hammerhead', + ], 'test_suites': { 'gtest_tests': 'chromium_android_webkit_gtests', 'isolated_scripts': 'chromium_webkit_isolated_scripts', }, - 'swarming': { - 'dimension_sets': [ - { - 'device_os': 'KTU84P', - 'device_type': 'hammerhead', - 'os': 'Android', - }, - ], - }, 'os_type': 'android', }, },
diff --git a/testing/variations/fieldtrial_testing_config.json b/testing/variations/fieldtrial_testing_config.json index cb4ff6b0..0f444d5 100644 --- a/testing/variations/fieldtrial_testing_config.json +++ b/testing/variations/fieldtrial_testing_config.json
@@ -1734,6 +1734,24 @@ ] } ], + "DefaultSearchShortcut": [ + { + "platforms": [ + "chromeos", + "linux", + "mac", + "windows" + ], + "experiments": [ + { + "name": "Enabled", + "enable_features": [ + "DefaultSearchShortcut" + ] + } + ] + } + ], "DialMediaRouteProvider": [ { "platforms": [ @@ -2207,32 +2225,6 @@ ] } ], - "FirstContentfulPaintPlusPlus": [ - { - "platforms": [ - "android", - "chromeos", - "linux", - "mac", - "windows", - "ios" - ], - "experiments": [ - { - "name": "Enabled", - "enable_features": [ - "FirstContentfulPaintPlusPlus" - ] - }, - { - "name": "Disabled", - "disable_features": [ - "FirstContentfulPaintPlusPlus" - ] - } - ] - } - ], "ForbidSyncXHRInPageDismissal": [ { "platforms": [ @@ -6182,6 +6174,24 @@ ] } ], + "WebRTC-Bwe-MaxRttLimit": [ + { + "platforms": [ + "windows", + "mac", + "chromeos", + "linux", + "ios", + "android", + "android_webview" + ], + "experiments": [ + { + "name": "persist,limit:3s,fraction:.8,interval:1s" + } + ] + } + ], "WebRTC-BweAllocProbingOnlyInAlr": [ { "platforms": [
diff --git a/third_party/blink/common/feature_policy/feature_policy.cc b/third_party/blink/common/feature_policy/feature_policy.cc index 3485204b..092dc3b 100644 --- a/third_party/blink/common/feature_policy/feature_policy.cc +++ b/third_party/blink/common/feature_policy/feature_policy.cc
@@ -170,8 +170,8 @@ PolicyValue FeaturePolicy::GetFeatureValueForOrigin( mojom::FeaturePolicyFeature feature, const url::Origin& origin) const { - DCHECK(base::ContainsKey(feature_list_, feature)); - DCHECK(base::ContainsKey(inherited_policies_, feature)); + DCHECK(base::Contains(feature_list_, feature)); + DCHECK(base::Contains(inherited_policies_, feature)); auto inherited_value = inherited_policies_.at(feature); auto allowlist = allowlists_.find(feature); @@ -194,8 +194,8 @@ const FeaturePolicy::Allowlist FeaturePolicy::GetAllowlistForFeature( mojom::FeaturePolicyFeature feature) const { - DCHECK(base::ContainsKey(feature_list_, feature)); - DCHECK(base::ContainsKey(inherited_policies_, feature)); + DCHECK(base::Contains(feature_list_, feature)); + DCHECK(base::Contains(inherited_policies_, feature)); mojom::PolicyValueType type = feature_list_.at(feature).second; // Return an empty allowlist when disabled through inheritance. if (inherited_policies_.at(feature) <=
diff --git a/third_party/blink/common/features.cc b/third_party/blink/common/features.cc index 3ab319e..c0df04c 100644 --- a/third_party/blink/common/features.cc +++ b/third_party/blink/common/features.cc
@@ -46,7 +46,7 @@ // Enable FCP++ by experiment. See https://crbug.com/869924 const base::Feature kFirstContentfulPaintPlusPlus{ - "FirstContentfulPaintPlusPlus", base::FEATURE_DISABLED_BY_DEFAULT}; + "FirstContentfulPaintPlusPlus", base::FEATURE_ENABLED_BY_DEFAULT}; // Perform memory purges after freezing only if all pages are frozen. const base::Feature kFreezePurgeMemoryAllPagesFrozen{
diff --git a/third_party/blink/common/manifest/manifest_icon_selector.cc b/third_party/blink/common/manifest/manifest_icon_selector.cc index e462e7b..da5cbbc 100644 --- a/third_party/blink/common/manifest/manifest_icon_selector.cc +++ b/third_party/blink/common/manifest/manifest_icon_selector.cc
@@ -49,7 +49,7 @@ } // Check for icon purpose. - if (!base::ContainsValue(icon.purpose, purpose)) + if (!base::Contains(icon.purpose, purpose)) continue; // Check for size constraints.
diff --git a/third_party/blink/public/common/BUILD.gn b/third_party/blink/public/common/BUILD.gn index 6073b80..550c28f 100644 --- a/third_party/blink/public/common/BUILD.gn +++ b/third_party/blink/public/common/BUILD.gn
@@ -43,6 +43,7 @@ "cache_storage/cache_storage_utils.h", "client_hints/client_hints.h", "common_export.h", + "css/forced_colors.h", "css/preferred_color_scheme.h", "device_memory/approximated_device_memory.h", "dom_storage/session_storage_namespace_id.h",
diff --git a/third_party/blink/public/common/css/forced_colors.h b/third_party/blink/public/common/css/forced_colors.h new file mode 100644 index 0000000..fac2270 --- /dev/null +++ b/third_party/blink/public/common/css/forced_colors.h
@@ -0,0 +1,18 @@ +// 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 THIRD_PARTY_BLINK_PUBLIC_COMMON_CSS_FORCED_COLORS_H_ +#define THIRD_PARTY_BLINK_PUBLIC_COMMON_CSS_FORCED_COLORS_H_ + +namespace blink { + +// Use for passing forced colors from the OS to the renderer. +enum class ForcedColors { + kNone, + kActive, +}; + +} // namespace blink + +#endif // THIRD_PARTY_BLINK_PUBLIC_COMMON_CSS_FORCED_COLORS_H_
diff --git a/third_party/blink/public/mojom/page/spatial_navigation.mojom b/third_party/blink/public/mojom/page/spatial_navigation.mojom index 51538fc..8358e7eb 100644 --- a/third_party/blink/public/mojom/page/spatial_navigation.mojom +++ b/third_party/blink/public/mojom/page/spatial_navigation.mojom
@@ -11,6 +11,8 @@ bool can_exit_focus; // True if Spatial Navigation has a target that can be selected. bool can_select_element; + // True if the currently focused element is a form element. + bool is_form_focused; // True if the currently focused element is a form element, and there is a // next form element available to move to. bool has_next_form_element;
diff --git a/third_party/blink/public/platform/modules/mediastream/media_stream_audio_deliverer.h b/third_party/blink/public/platform/modules/mediastream/media_stream_audio_deliverer.h index d6ba436b..35338088 100644 --- a/third_party/blink/public/platform/modules/mediastream/media_stream_audio_deliverer.h +++ b/third_party/blink/public/platform/modules/mediastream/media_stream_audio_deliverer.h
@@ -46,8 +46,8 @@ DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); DCHECK(consumer); base::AutoLock auto_lock(consumers_lock_); - DCHECK(!base::ContainsValue(consumers_, consumer)); - DCHECK(!base::ContainsValue(pending_consumers_, consumer)); + DCHECK(!base::Contains(consumers_, consumer)); + DCHECK(!base::Contains(pending_consumers_, consumer)); pending_consumers_.push_back(consumer); }
diff --git a/third_party/blink/public/platform/modules/mediastream/secure_display_link_tracker.h b/third_party/blink/public/platform/modules/mediastream/secure_display_link_tracker.h index 50742ac..995879f9 100644 --- a/third_party/blink/public/platform/modules/mediastream/secure_display_link_tracker.h +++ b/third_party/blink/public/platform/modules/mediastream/secure_display_link_tracker.h
@@ -34,7 +34,7 @@ template <typename T> void SecureDisplayLinkTracker<T>::Add(T* link, bool is_link_secure) { - DCHECK(!base::ContainsValue(insecure_links_, link)); + DCHECK(!base::Contains(insecure_links_, link)); if (!is_link_secure) insecure_links_.push_back(link);
diff --git a/third_party/blink/public/platform/task_type.h b/third_party/blink/public/platform/task_type.h index c9f2c5f..c3a709b 100644 --- a/third_party/blink/public/platform/task_type.h +++ b/third_party/blink/public/platform/task_type.h
@@ -213,6 +213,9 @@ // Legacy IPCs that are freezable. kInternalFreezableIPC = 64, + // Task used to split a script loading task for cooperative scheduling + kInternalContinueScriptLoading = 65, + /////////////////////////////////////// // The following task types are only for thread-local queues. /////////////////////////////////////// @@ -236,7 +239,7 @@ kWorkerThreadTaskQueueV8 = 47, kWorkerThreadTaskQueueCompositor = 48, - kCount = 65, + kCount = 66, }; } // namespace blink
diff --git a/third_party/blink/public/web/modules/mediastream/media_stream_constraints_util_sets.h b/third_party/blink/public/web/modules/mediastream/media_stream_constraints_util_sets.h index 5bbd567..53bbc9d 100644 --- a/third_party/blink/public/web/modules/mediastream/media_stream_constraints_util_sets.h +++ b/third_party/blink/public/web/modules/mediastream/media_stream_constraints_util_sets.h
@@ -165,7 +165,7 @@ ~DiscreteSet() = default; bool Contains(const T& value) const { - return is_universal_ || base::ContainsValue(elements_, value); + return is_universal_ || base::Contains(elements_, value); } bool IsEmpty() const { return !is_universal_ && elements_.empty(); } @@ -183,7 +183,7 @@ // Both sets have explicit elements. std::vector<T> intersection; for (const auto& entry : elements_) { - if (base::ContainsValue(other.elements_, entry)) + if (base::Contains(other.elements_, entry)) intersection.push_back(entry); } return DiscreteSet(std::move(intersection));
diff --git a/third_party/blink/public/web/web_settings.h b/third_party/blink/public/web/web_settings.h index 88ac9e36..09437c5d 100644 --- a/third_party/blink/public/web/web_settings.h +++ b/third_party/blink/public/web/web_settings.h
@@ -33,6 +33,7 @@ #include <unicode/uscript.h> +#include "third_party/blink/public/common/css/forced_colors.h" #include "third_party/blink/public/common/css/preferred_color_scheme.h" #include "third_party/blink/public/platform/pointer_properties.h" #include "third_party/blink/public/platform/web_common.h" @@ -289,6 +290,7 @@ virtual void SetLazyImageLoadingDistanceThresholdPx4G(int) = 0; virtual void SetForceDarkModeEnabled(bool) = 0; virtual void SetPreferredColorScheme(PreferredColorScheme) = 0; + virtual void SetForcedColors(ForcedColors) = 0; protected: ~WebSettings() = default;
diff --git a/third_party/blink/public/web/web_widget_client.h b/third_party/blink/public/web/web_widget_client.h index 0aa157a..b2b05be 100644 --- a/third_party/blink/public/web/web_widget_client.h +++ b/third_party/blink/public/web/web_widget_client.h
@@ -99,6 +99,7 @@ // Show or hide compositor debug visualizations. virtual void SetShowFPSCounter(bool) {} virtual void SetShowPaintRects(bool) {} + virtual void SetShowLayoutShiftRegions(bool) {} virtual void SetShowDebugBorders(bool) {} virtual void SetShowScrollBottleneckRects(bool) {} virtual void SetShowHitTestBorders(bool) {}
diff --git a/third_party/blink/renderer/build/scripts/gperf.py b/third_party/blink/renderer/build/scripts/gperf.py index a917ceb0..ad15e688 100644 --- a/third_party/blink/renderer/build/scripts/gperf.py +++ b/third_party/blink/renderer/build/scripts/gperf.py
@@ -3,7 +3,7 @@ # found in the LICENSE file. # Invokes gperf for the GN build. -# Usage: gperf.py [--developer_dir PATH_TO_XCODE] gperf ... +# Usage: gperf.py gperf ... import argparse import os @@ -68,11 +68,8 @@ def main(): parser = argparse.ArgumentParser() - parser.add_argument("--developer_dir", required=False) parser.add_argument("--output-file") args, unknownargs = parser.parse_known_args() - if args.developer_dir: - os.environ['DEVELOPER_DIR'] = args.developer_dir gperf_path, gperf_args = unknownargs[0], unknownargs[1:] infile = None
diff --git a/third_party/blink/renderer/build/scripts/in_generator.py b/third_party/blink/renderer/build/scripts/in_generator.py index 56f50974..34e0c97 100644 --- a/third_party/blink/renderer/build/scripts/in_generator.py +++ b/third_party/blink/renderer/build/scripts/in_generator.py
@@ -98,14 +98,9 @@ parser = optparse.OptionParser() parser.add_option("--gperf", default="gperf") - parser.add_option("--developer_dir", - help='Path to Xcode.') parser.add_option("--output_dir", default=os.getcwd()) options, args = parser.parse_args() - if options.developer_dir: - os.environ['DEVELOPER_DIR'] = options.developer_dir - writer = self._writer_class(args) writer.set_gperf_path(options.gperf) writer.write_files(options.output_dir)
diff --git a/third_party/blink/renderer/build/scripts/json5_generator.py b/third_party/blink/renderer/build/scripts/json5_generator.py index 5aa6b64..fa03672 100644 --- a/third_party/blink/renderer/build/scripts/json5_generator.py +++ b/third_party/blink/renderer/build/scripts/json5_generator.py
@@ -288,13 +288,9 @@ parser.add_argument("files", nargs="+") parser.add_argument("--gperf", default="gperf") - parser.add_argument("--developer_dir", help="Path to Xcode.") parser.add_argument("--output_dir", default=os.getcwd()) args = parser.parse_args() - if args.developer_dir: - os.environ["DEVELOPER_DIR"] = args.developer_dir - writer = self._writer_class(args.files, args.output_dir) writer.set_gperf_path(args.gperf) writer.write_files(args.output_dir)
diff --git a/third_party/blink/renderer/build/scripts/rule_bison.py b/third_party/blink/renderer/build/scripts/rule_bison.py index 9e88f1c..2fd397c8 100755 --- a/third_party/blink/renderer/build/scripts/rule_bison.py +++ b/third_party/blink/renderer/build/scripts/rule_bison.py
@@ -32,7 +32,7 @@ # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. -# usage: rule_bison.py INPUT_FILE OUTPUT_DIR BISON_EXE [DEVELOPER_DIR] +# usage: rule_bison.py INPUT_FILE OUTPUT_DIR BISON_EXE # INPUT_FILE is a path to either XPathGrammar.y. # OUTPUT_DIR is where the bison-generated .cpp and .h files should be placed. @@ -49,8 +49,6 @@ inputFile = sys.argv[1] outputDir = sys.argv[2] bisonExe = sys.argv[3] -if len(sys.argv) > 4: - os.environ['DEVELOPER_DIR'] = sys.argv[4] pathToBison = os.path.split(bisonExe)[0] if pathToBison:
diff --git a/third_party/blink/renderer/build/scripts/scripts.gni b/third_party/blink/renderer/build/scripts/scripts.gni index f5b360f..8736078 100644 --- a/third_party/blink/renderer/build/scripts/scripts.gni +++ b/third_party/blink/renderer/build/scripts/scripts.gni
@@ -5,6 +5,10 @@ import("//build/toolchain/toolchain.gni") import("//third_party/blink/renderer/config.gni") +if (is_mac) { + import("//build/config/mac/mac_sdk.gni") +} + # All paths in this file should be absolute so targets in any directory can use # them without worrying about the current directory. _scripts_dir = "//third_party/blink/renderer/build/scripts" @@ -68,6 +72,9 @@ if (host_os == "win") { gperf_exe = rebase_path("//third_party/gperf/bin/gperf.exe", root_build_dir) bison_exe = rebase_path("//third_party/bison/bin/bison.exe", root_build_dir) +} else if (is_mac) { + gperf_exe = mac_bin_path + "gperf" + bison_exe = mac_bin_path + "bison" } else { gperf_exe = "gperf" bison_exe = "bison" @@ -143,12 +150,6 @@ "--output_dir", rebase_path(output_dir, root_build_dir), ] - if (is_mac && !use_system_xcode) { - args += [ - "--developer_dir", - hermetic_xcode_path, - ] - } if (defined(invoker.other_args)) { args += invoker.other_args } @@ -189,12 +190,6 @@ "--output_dir", rebase_path(output_dir, root_build_dir), ] - if (is_mac && !use_system_xcode) { - args += [ - "--developer_dir", - hermetic_xcode_path, - ] - } if (defined(invoker.other_args)) { args += invoker.other_args }
diff --git a/third_party/blink/renderer/core/BUILD.gn b/third_party/blink/renderer/core/BUILD.gn index 5728950..dc2ce36 100644 --- a/third_party/blink/renderer/core/BUILD.gn +++ b/third_party/blink/renderer/core/BUILD.gn
@@ -1435,12 +1435,6 @@ "--output_dir", "$rel_blink_core_gen_dir/css", ] - if (is_mac && !use_system_xcode) { - args += [ - "--developer_dir", - hermetic_xcode_path, - ] - } deps = make_core_generated_deps } @@ -1464,12 +1458,6 @@ "--output_dir", "$rel_blink_core_gen_dir/css", ] - if (is_mac && !use_system_xcode) { - args += [ - "--developer_dir", - hermetic_xcode_path, - ] - } deps = make_core_generated_deps } @@ -1493,12 +1481,6 @@ "--output_dir", "$rel_blink_core_gen_dir/feature_policy", ] - if (is_mac && !use_system_xcode) { - args += [ - "--developer_dir", - hermetic_xcode_path, - ] - } } blink_python_runner("make_core_generated_html_element_lookup_trie") { @@ -1522,12 +1504,6 @@ "--output_dir", rel_blink_core_gen_dir, ] - if (is_mac && !use_system_xcode) { - args += [ - "--developer_dir", - hermetic_xcode_path, - ] - } deps = make_core_generated_deps } @@ -1549,12 +1525,6 @@ "--output_dir", "$rel_blink_core_gen_dir/origin_trials", ] - if (is_mac && !use_system_xcode) { - args += [ - "--developer_dir", - hermetic_xcode_path, - ] - } } blink_python_runner("make_core_generated_web_origin_trials") { script = "../build/scripts/make_web_origin_trials.py" @@ -1573,12 +1543,6 @@ "--output_dir", "$rel_blink_core_gen_dir/exported", ] - if (is_mac && !use_system_xcode) { - args += [ - "--developer_dir", - hermetic_xcode_path, - ] - } } action_foreach("make_core_generated_bison") { @@ -1595,9 +1559,6 @@ rel_blink_core_gen_dir, bison_exe, ] - if (is_mac && !use_system_xcode) { - args += [ hermetic_xcode_path ] - } deps = make_core_generated_deps }
diff --git a/third_party/blink/renderer/core/animation/filter_interpolation_functions.cc b/third_party/blink/renderer/core/animation/filter_interpolation_functions.cc index 607e90a..a1da642 100644 --- a/third_party/blink/renderer/core/animation/filter_interpolation_functions.cc +++ b/third_party/blink/renderer/core/animation/filter_interpolation_functions.cc
@@ -48,26 +48,6 @@ namespace { -double DefaultParameter(FilterOperation::OperationType type) { - switch (type) { - case FilterOperation::BRIGHTNESS: - case FilterOperation::GRAYSCALE: - case FilterOperation::SATURATE: - case FilterOperation::SEPIA: - return 1; - - case FilterOperation::CONTRAST: - case FilterOperation::HUE_ROTATE: - case FilterOperation::INVERT: - case FilterOperation::OPACITY: - return 0; - - default: - NOTREACHED(); - return 0; - } -} - double ClampParameter(double value, FilterOperation::OperationType type) { switch (type) { case FilterOperation::BRIGHTNESS: @@ -110,26 +90,11 @@ case FilterOperation::INVERT: case FilterOperation::OPACITY: case FilterOperation::SATURATE: - case FilterOperation::SEPIA: { - double amount = DefaultParameter(type); - if (filter.length() == 1) { - const CSSPrimitiveValue& first_value = - To<CSSPrimitiveValue>(filter.Item(0)); - amount = first_value.GetDoubleValue(); - if (first_value.IsPercentage()) - amount /= 100; - } - result.interpolable_value = std::make_unique<InterpolableNumber>(amount); + case FilterOperation::SEPIA: + case FilterOperation::HUE_ROTATE: + result.interpolable_value = std::make_unique<InterpolableNumber>( + FilterOperationResolver::ResolveNumericArgumentForFunction(filter)); break; - } - - case FilterOperation::HUE_ROTATE: { - double angle = DefaultParameter(type); - if (filter.length() == 1) - angle = To<CSSPrimitiveValue>(filter.Item(0)).ComputeDegrees(); - result.interpolable_value = std::make_unique<InterpolableNumber>(angle); - break; - } case FilterOperation::BLUR: { if (filter.length() == 0)
diff --git a/third_party/blink/renderer/core/css/css.dict b/third_party/blink/renderer/core/css/css.dict index 350336a4..9ace694 100644 --- a/third_party/blink/renderer/core/css/css.dict +++ b/third_party/blink/renderer/core/css/css.dict
@@ -910,6 +910,7 @@ "no-preference" "light" "dark" +"active" # at-rules "@charset"
diff --git a/third_party/blink/renderer/core/css/css_paint_value.cc b/third_party/blink/renderer/core/css/css_paint_value.cc index e19c886..2881677 100644 --- a/third_party/blink/renderer/core/css/css_paint_value.cc +++ b/third_party/blink/renderer/core/css/css_paint_value.cc
@@ -10,6 +10,7 @@ #include "third_party/blink/renderer/core/css/cssom/paint_worklet_deferred_image.h" #include "third_party/blink/renderer/core/css/cssom/paint_worklet_input.h" #include "third_party/blink/renderer/core/css/cssom/style_value_factory.h" +#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h" #include "third_party/blink/renderer/core/layout/layout_object.h" #include "third_party/blink/renderer/platform/graphics/image.h" #include "third_party/blink/renderer/platform/wtf/text/string_builder.h" @@ -79,16 +80,28 @@ PaintWorkletStylePropertyMap::BuildCrossThreadData( document, style, layout_object.GetNode(), native_properties, custom_properties); + Vector<std::unique_ptr<CrossThreadStyleValue>> cross_thread_input_arguments; + BuildInputArgumentValues(cross_thread_input_arguments); scoped_refptr<PaintWorkletInput> input = - base::MakeRefCounted<PaintWorkletInput>(GetName(), target_size, zoom, - generator_->WorkletId(), - std::move(style_data)); + base::MakeRefCounted<PaintWorkletInput>( + GetName(), target_size, zoom, generator_->WorkletId(), + std::move(style_data), std::move(cross_thread_input_arguments)); return PaintWorkletDeferredImage::Create(std::move(input), target_size); } return generator_->Paint(client, target_size, parsed_input_arguments_); } +void CSSPaintValue::BuildInputArgumentValues( + Vector<std::unique_ptr<CrossThreadStyleValue>>& + cross_thread_input_arguments) { + for (const auto& style_value : *parsed_input_arguments_) { + std::unique_ptr<CrossThreadStyleValue> cross_thread_style = + ComputedStyleUtils::CrossThreadStyleValueFromCSSStyleValue(style_value); + cross_thread_input_arguments.push_back(std::move(cross_thread_style)); + } +} + bool CSSPaintValue::ParseInputArguments(const Document& document) { if (input_arguments_invalid_) return false;
diff --git a/third_party/blink/renderer/core/css/css_paint_value.h b/third_party/blink/renderer/core/css/css_paint_value.h index 9c95307..78f0115e 100644 --- a/third_party/blink/renderer/core/css/css_paint_value.h +++ b/third_party/blink/renderer/core/css/css_paint_value.h
@@ -16,6 +16,8 @@ namespace blink { +class CrossThreadStyleValue; + class CORE_EXPORT CSSPaintValue : public CSSImageGeneratorValue { public: explicit CSSPaintValue(CSSCustomIdentValue* name); @@ -74,6 +76,9 @@ bool ParseInputArguments(const Document&); + void BuildInputArgumentValues( + Vector<std::unique_ptr<CrossThreadStyleValue>>&); + bool input_arguments_invalid_ = false; Member<CSSCustomIdentValue> name_;
diff --git a/third_party/blink/renderer/core/css/css_value_keywords.json5 b/third_party/blink/renderer/core/css/css_value_keywords.json5 index 81e0c3a..f92c9f1e 100644 --- a/third_party/blink/renderer/core/css/css_value_keywords.json5 +++ b/third_party/blink/renderer/core/css/css_value_keywords.json5
@@ -1188,5 +1188,9 @@ // (prefers-reduced-motion:) media feature "reduce", + + // (forced-colors:) media feature + // none + "active", ], }
diff --git a/third_party/blink/renderer/core/css/cssom/cross_thread_keyword_value.cc b/third_party/blink/renderer/core/css/cssom/cross_thread_keyword_value.cc index aa2676bb..94d6a0a 100644 --- a/third_party/blink/renderer/core/css/cssom/cross_thread_keyword_value.cc +++ b/third_party/blink/renderer/core/css/cssom/cross_thread_keyword_value.cc
@@ -9,7 +9,7 @@ namespace blink { CSSStyleValue* CrossThreadKeywordValue::ToCSSStyleValue() { - return CSSKeywordValue::Create(keyword_value_); + return CSSKeywordValue::Create(std::move(keyword_value_.IsolatedCopy())); } bool CrossThreadKeywordValue::operator==(
diff --git a/third_party/blink/renderer/core/css/cssom/cross_thread_unsupported_value.cc b/third_party/blink/renderer/core/css/cssom/cross_thread_unsupported_value.cc index 6a25865..657fc347 100644 --- a/third_party/blink/renderer/core/css/cssom/cross_thread_unsupported_value.cc +++ b/third_party/blink/renderer/core/css/cssom/cross_thread_unsupported_value.cc
@@ -9,7 +9,7 @@ namespace blink { CSSStyleValue* CrossThreadUnsupportedValue::ToCSSStyleValue() { - return CSSUnsupportedStyleValue::Create(value_); + return CSSUnsupportedStyleValue::Create(std::move(value_.IsolatedCopy())); } bool CrossThreadUnsupportedValue::operator==(
diff --git a/third_party/blink/renderer/core/css/cssom/paint_worklet_input.cc b/third_party/blink/renderer/core/css/cssom/paint_worklet_input.cc index 15cf35c..4c52ae9 100644 --- a/third_party/blink/renderer/core/css/cssom/paint_worklet_input.cc +++ b/third_party/blink/renderer/core/css/cssom/paint_worklet_input.cc
@@ -13,11 +13,13 @@ const FloatSize& container_size, float effective_zoom, int worklet_id, - PaintWorkletStylePropertyMap::CrossThreadData data) + PaintWorkletStylePropertyMap::CrossThreadData data, + Vector<std::unique_ptr<CrossThreadStyleValue>> parsed_input_arguments) : name_(name.IsolatedCopy()), container_size_(container_size), effective_zoom_(effective_zoom), worklet_id_(worklet_id), - style_map_data_(std::move(data)) {} + style_map_data_(std::move(data)), + parsed_input_arguments_(std::move(parsed_input_arguments)) {} } // namespace blink
diff --git a/third_party/blink/renderer/core/css/cssom/paint_worklet_input.h b/third_party/blink/renderer/core/css/cssom/paint_worklet_input.h index c4cec29..5e2f9ab 100644 --- a/third_party/blink/renderer/core/css/cssom/paint_worklet_input.h +++ b/third_party/blink/renderer/core/css/cssom/paint_worklet_input.h
@@ -36,11 +36,13 @@ // contains will die. class CORE_EXPORT PaintWorkletInput : public cc::PaintWorkletInput { public: - PaintWorkletInput(const String& name, - const FloatSize& container_size, - float effective_zoom, - int worklet_id, - PaintWorkletStylePropertyMap::CrossThreadData values); + PaintWorkletInput( + const String& name, + const FloatSize& container_size, + float effective_zoom, + int worklet_id, + PaintWorkletStylePropertyMap::CrossThreadData values, + Vector<std::unique_ptr<CrossThreadStyleValue>> parsed_input_args); ~PaintWorkletInput() override = default; @@ -53,6 +55,10 @@ // These accessors are safe on any thread. const FloatSize& ContainerSize() const { return container_size_; } float EffectiveZoom() const { return effective_zoom_; } + const Vector<std::unique_ptr<CrossThreadStyleValue>>& ParsedInputArguments() + const { + return parsed_input_arguments_; + } // These should only be accessed on the PaintWorklet thread. String NameCopy() const { return name_.IsolatedCopy(); } @@ -66,6 +72,7 @@ const float effective_zoom_; const int worklet_id_; PaintWorkletStylePropertyMap::CrossThreadData style_map_data_; + Vector<std::unique_ptr<CrossThreadStyleValue>> parsed_input_arguments_; }; } // namespace blink
diff --git a/third_party/blink/renderer/core/css/cssom/paint_worklet_style_property_map_test.cc b/third_party/blink/renderer/core/css/cssom/paint_worklet_style_property_map_test.cc index 80cc92d..a0b53ec5 100644 --- a/third_party/blink/renderer/core/css/cssom/paint_worklet_style_property_map_test.cc +++ b/third_party/blink/renderer/core/css/cssom/paint_worklet_style_property_map_test.cc
@@ -183,13 +183,15 @@ UpdateAllLifecyclePhasesForTest(); Node* node = PageNode(); + Vector<std::unique_ptr<CrossThreadStyleValue>> input_arguments; PaintWorkletStylePropertyMap::CrossThreadData data = PaintWorkletStylePropertyMap::BuildCrossThreadData( GetDocument(), node->ComputedStyleRef(), node, native_properties, custom_properties); scoped_refptr<PaintWorkletInput> input = base::MakeRefCounted<PaintWorkletInput>("test", FloatSize(100, 100), 1.0f, - 1, std::move(data)); + 1, std::move(data), + std::move(input_arguments)); DCHECK(input); thread_ = std::make_unique<WebThreadSupportingGC>(
diff --git a/third_party/blink/renderer/core/css/media_feature_names.json5 b/third_party/blink/renderer/core/css/media_feature_names.json5 index 976f70d..ad3352a2 100644 --- a/third_party/blink/renderer/core/css/media_feature_names.json5 +++ b/third_party/blink/renderer/core/css/media_feature_names.json5
@@ -10,6 +10,7 @@ "color", "color-index", "color-gamut", + "forced-colors", "grid", "monochrome", "height",
diff --git a/third_party/blink/renderer/core/css/media_query_evaluator.cc b/third_party/blink/renderer/core/css/media_query_evaluator.cc index a3bf96d..b07a8ed5 100644 --- a/third_party/blink/renderer/core/css/media_query_evaluator.cc +++ b/third_party/blink/renderer/core/css/media_query_evaluator.cc
@@ -29,6 +29,7 @@ #include "third_party/blink/renderer/core/css/media_query_evaluator.h" +#include "third_party/blink/public/common/css/forced_colors.h" #include "third_party/blink/public/common/css/preferred_color_scheme.h" #include "third_party/blink/public/common/manifest/web_display_mode.h" #include "third_party/blink/public/platform/pointer_properties.h" @@ -847,6 +848,24 @@ value.id == CSSValueID::kLight); } +static bool ForcedColorsMediaFeatureEval(const MediaQueryExpValue& value, + MediaFeaturePrefix, + const MediaValues& media_values) { + ForcedColors forced_colors = media_values.GetForcedColors(); + + if (!value.IsValid()) + return forced_colors != ForcedColors::kNone; + + if (!value.is_id) + return false; + + // Check the forced colors against value.id. + return (forced_colors == ForcedColors::kNone && + value.id == CSSValueID::kNone) || + (forced_colors != ForcedColors::kNone && + value.id == CSSValueID::kActive); +} + void MediaQueryEvaluator::Init() { // Create the table. g_function_map = new FunctionMap;
diff --git a/third_party/blink/renderer/core/css/media_query_evaluator_test.cc b/third_party/blink/renderer/core/css/media_query_evaluator_test.cc index 07ef2cb..1a00fa9 100644 --- a/third_party/blink/renderer/core/css/media_query_evaluator_test.cc +++ b/third_party/blink/renderer/core/css/media_query_evaluator_test.cc
@@ -15,6 +15,7 @@ #include "third_party/blink/renderer/core/frame/settings.h" #include "third_party/blink/renderer/core/media_type_names.h" #include "third_party/blink/renderer/core/testing/dummy_page_holder.h" +#include "third_party/blink/renderer/platform/testing/runtime_enabled_features_test_helpers.h" #include "third_party/blink/renderer/platform/wtf/text/string_builder.h" namespace blink { @@ -173,6 +174,18 @@ {nullptr, 0} // Do not remove the terminator line. }; +MediaQueryEvaluatorTestCase g_forcedcolors_active_cases[] = { + {"(forced-colors: active)", 1}, + {"(forced-colors: none)", 0}, + {nullptr, 0} // Do not remove the terminator line. +}; + +MediaQueryEvaluatorTestCase g_forcedcolors_none_cases[] = { + {"(forced-colors: active)", 0}, + {"(forced-colors: none)", 1}, + {nullptr, 0} // Do not remove the terminator line. +}; + void TestMQEvaluator(MediaQueryEvaluatorTestCase* test_cases, const MediaQueryEvaluator& media_query_evaluator, CSSParserMode mode) { @@ -326,4 +339,24 @@ TestMQEvaluator(g_immersive_test_cases, media_query_evaluator, kUASheetMode); } +TEST(MediaQueryEvaluatorTest, CachedForcedColors) { + ScopedForcedColorsForTest scoped_feature(true); + + MediaValuesCached::MediaValuesCachedData data; + data.forced_colors = ForcedColors::kNone; + MediaValues* media_values = MakeGarbageCollected<MediaValuesCached>(data); + + // Forced colors - none. + MediaQueryEvaluator media_query_evaluator(*media_values); + TestMQEvaluator(g_forcedcolors_none_cases, media_query_evaluator); + + // Forced colors - active. + { + data.forced_colors = ForcedColors::kActive; + MediaValues* media_values = MakeGarbageCollected<MediaValuesCached>(data); + MediaQueryEvaluator media_query_evaluator(*media_values); + TestMQEvaluator(g_forcedcolors_active_cases, media_query_evaluator); + } +} + } // namespace blink
diff --git a/third_party/blink/renderer/core/css/media_query_exp.cc b/third_party/blink/renderer/core/css/media_query_exp.cc index 89f5eca7..695792e 100644 --- a/third_party/blink/renderer/core/css/media_query_exp.cc +++ b/third_party/blink/renderer/core/css/media_query_exp.cc
@@ -85,6 +85,12 @@ if (media_feature == kPrefersReducedMotionMediaFeature) return ident == CSSValueID::kNoPreference || ident == CSSValueID::kReduce; + if (RuntimeEnabledFeatures::ForcedColorsEnabled()) { + if (media_feature == kForcedColorsMediaFeature) { + return ident == CSSValueID::kNone || ident == CSSValueID::kActive; + } + } + return false; } @@ -201,7 +207,8 @@ media_feature == kColorGamutMediaFeature || media_feature == kImmersiveMediaFeature || media_feature == kPrefersColorSchemeMediaFeature || - media_feature == kPrefersReducedMotionMediaFeature; + media_feature == kPrefersReducedMotionMediaFeature || + media_feature == kForcedColorsMediaFeature; } bool MediaQueryExp::IsViewportDependent() const {
diff --git a/third_party/blink/renderer/core/css/media_values.cc b/third_party/blink/renderer/core/css/media_values.cc index c1d76bf..260f7c6 100644 --- a/third_party/blink/renderer/core/css/media_values.cc +++ b/third_party/blink/renderer/core/css/media_values.cc
@@ -190,6 +190,12 @@ return frame->GetSettings()->GetPrefersReducedMotion(); } +ForcedColors MediaValues::CalculateForcedColors(LocalFrame* frame) { + DCHECK(frame); + DCHECK(frame->GetSettings()); + return frame->GetSettings()->GetForcedColors(); +} + bool MediaValues::ComputeLengthImpl(double value, CSSPrimitiveValue::UnitType type, unsigned default_font_size,
diff --git a/third_party/blink/renderer/core/css/media_values.h b/third_party/blink/renderer/core/css/media_values.h index 6920db0e..445c19b 100644 --- a/third_party/blink/renderer/core/css/media_values.h +++ b/third_party/blink/renderer/core/css/media_values.h
@@ -19,6 +19,7 @@ class LocalFrame; enum class ColorSpaceGamut; enum class PreferredColorScheme; +enum class ForcedColors; class CORE_EXPORT MediaValues : public GarbageCollectedFinalized<MediaValues> { public: @@ -79,6 +80,7 @@ virtual ColorSpaceGamut ColorGamut() const = 0; virtual PreferredColorScheme GetPreferredColorScheme() const = 0; virtual bool PrefersReducedMotion() const = 0; + virtual ForcedColors GetForcedColors() const = 0; protected: static double CalculateViewportWidth(LocalFrame*); @@ -102,6 +104,7 @@ static ColorSpaceGamut CalculateColorGamut(LocalFrame*); static PreferredColorScheme CalculatePreferredColorScheme(LocalFrame*); static bool CalculatePrefersReducedMotion(LocalFrame*); + static ForcedColors CalculateForcedColors(LocalFrame*); }; } // namespace blink
diff --git a/third_party/blink/renderer/core/css/media_values_cached.cc b/third_party/blink/renderer/core/css/media_values_cached.cc index 58b9b3c4..7da0eaf 100644 --- a/third_party/blink/renderer/core/css/media_values_cached.cc +++ b/third_party/blink/renderer/core/css/media_values_cached.cc
@@ -4,6 +4,7 @@ #include "third_party/blink/renderer/core/css/media_values_cached.h" +#include "third_party/blink/public/common/css/forced_colors.h" #include "third_party/blink/public/common/css/preferred_color_scheme.h" #include "third_party/blink/renderer/core/css/css_primitive_value.h" #include "third_party/blink/renderer/core/dom/document.h" @@ -33,7 +34,8 @@ display_shape(kDisplayShapeRect), color_gamut(ColorSpaceGamut::kUnknown), preferred_color_scheme(PreferredColorScheme::kNoPreference), - prefers_reduced_motion(false) {} + prefers_reduced_motion(false), + forced_colors(ForcedColors::kNone) {} MediaValuesCached::MediaValuesCachedData::MediaValuesCachedData( Document& document) @@ -74,6 +76,7 @@ color_gamut = MediaValues::CalculateColorGamut(frame); preferred_color_scheme = MediaValues::CalculatePreferredColorScheme(frame); prefers_reduced_motion = MediaValues::CalculatePrefersReducedMotion(frame); + forced_colors = MediaValues::CalculateForcedColors(frame); } } @@ -196,4 +199,8 @@ return data_.prefers_reduced_motion; } +ForcedColors MediaValuesCached::GetForcedColors() const { + return data_.forced_colors; +} + } // namespace blink
diff --git a/third_party/blink/renderer/core/css/media_values_cached.h b/third_party/blink/renderer/core/css/media_values_cached.h index 1dc843b..3d123a7 100644 --- a/third_party/blink/renderer/core/css/media_values_cached.h +++ b/third_party/blink/renderer/core/css/media_values_cached.h
@@ -38,6 +38,7 @@ ColorSpaceGamut color_gamut; PreferredColorScheme preferred_color_scheme; bool prefers_reduced_motion; + ForcedColors forced_colors; MediaValuesCachedData(); explicit MediaValuesCachedData(Document&); @@ -65,6 +66,7 @@ data.color_gamut = color_gamut; data.preferred_color_scheme = preferred_color_scheme; data.prefers_reduced_motion = prefers_reduced_motion; + data.forced_colors = forced_colors; return data; } }; @@ -103,6 +105,7 @@ ColorSpaceGamut ColorGamut() const override; PreferredColorScheme GetPreferredColorScheme() const override; bool PrefersReducedMotion() const override; + ForcedColors GetForcedColors() const override; void OverrideViewportDimensions(double width, double height) override;
diff --git a/third_party/blink/renderer/core/css/media_values_dynamic.cc b/third_party/blink/renderer/core/css/media_values_dynamic.cc index 54ef0444..59488e7 100644 --- a/third_party/blink/renderer/core/css/media_values_dynamic.cc +++ b/third_party/blink/renderer/core/css/media_values_dynamic.cc
@@ -4,6 +4,7 @@ #include "third_party/blink/renderer/core/css/media_values_dynamic.h" +#include "third_party/blink/public/common/css/forced_colors.h" #include "third_party/blink/public/common/css/preferred_color_scheme.h" #include "third_party/blink/renderer/core/css/css_primitive_value.h" #include "third_party/blink/renderer/core/css/css_resolution_units.h" @@ -150,6 +151,10 @@ return CalculatePrefersReducedMotion(frame_); } +ForcedColors MediaValuesDynamic::GetForcedColors() const { + return CalculateForcedColors(frame_); +} + Document* MediaValuesDynamic::GetDocument() const { return frame_->GetDocument(); }
diff --git a/third_party/blink/renderer/core/css/media_values_dynamic.h b/third_party/blink/renderer/core/css/media_values_dynamic.h index 5bdddf7..95c454e 100644 --- a/third_party/blink/renderer/core/css/media_values_dynamic.h +++ b/third_party/blink/renderer/core/css/media_values_dynamic.h
@@ -50,6 +50,7 @@ ColorSpaceGamut ColorGamut() const override; PreferredColorScheme GetPreferredColorScheme() const override; bool PrefersReducedMotion() const override; + ForcedColors GetForcedColors() const override; Document* GetDocument() const override; bool HasValues() const override; void OverrideViewportDimensions(double width, double height) override;
diff --git a/third_party/blink/renderer/core/css/properties/computed_style_utils.cc b/third_party/blink/renderer/core/css/properties/computed_style_utils.cc index 56eabb9..3b32a8c 100644 --- a/third_party/blink/renderer/core/css/properties/computed_style_utils.cc +++ b/third_party/blink/renderer/core/css/properties/computed_style_utils.cc
@@ -25,6 +25,11 @@ #include "third_party/blink/renderer/core/css/css_value.h" #include "third_party/blink/renderer/core/css/css_value_list.h" #include "third_party/blink/renderer/core/css/css_value_pair.h" +#include "third_party/blink/renderer/core/css/cssom/cross_thread_keyword_value.h" +#include "third_party/blink/renderer/core/css/cssom/cross_thread_unit_value.h" +#include "third_party/blink/renderer/core/css/cssom/cross_thread_unsupported_value.h" +#include "third_party/blink/renderer/core/css/cssom/css_keyword_value.h" +#include "third_party/blink/renderer/core/css/cssom/css_unit_value.h" #include "third_party/blink/renderer/core/css/style_color.h" #include "third_party/blink/renderer/core/layout/layout_block.h" #include "third_party/blink/renderer/core/layout/layout_box.h" @@ -2396,4 +2401,22 @@ return ZoomAdjustedPixelValueForLength(gap_length.GetLength(), style); } +std::unique_ptr<CrossThreadStyleValue> +ComputedStyleUtils::CrossThreadStyleValueFromCSSStyleValue( + CSSStyleValue* style_value) { + switch (style_value->GetType()) { + case CSSStyleValue::StyleValueType::kKeywordType: + return std::make_unique<CrossThreadKeywordValue>( + To<CSSKeywordValue>(style_value)->value().IsolatedCopy()); + case CSSStyleValue::StyleValueType::kUnitType: + return std::make_unique<CrossThreadUnitValue>( + To<CSSUnitValue>(style_value)->value(), + To<CSSUnitValue>(style_value)->GetInternalUnit()); + default: + // Make an isolated copy to ensure that it is safe to pass cross thread. + return std::make_unique<CrossThreadUnsupportedValue>( + style_value->toString().IsolatedCopy()); + } +} + } // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/computed_style_utils.h b/third_party/blink/renderer/core/css/properties/computed_style_utils.h index 909160c..3e20bdf 100644 --- a/third_party/blink/renderer/core/css/properties/computed_style_utils.h +++ b/third_party/blink/renderer/core/css/properties/computed_style_utils.h
@@ -20,6 +20,7 @@ using namespace cssvalue; class ComputedStyle; +class CSSStyleValue; class CSSValue; class StyleColor; class StylePropertyShorthand; @@ -203,6 +204,8 @@ static CSSValue* ScrollCustomizationFlagsToCSSValue( scroll_customization::ScrollDirection); static CSSValue* ValueForGapLength(const GapLength&, const ComputedStyle&); + static std::unique_ptr<CrossThreadStyleValue> + CrossThreadStyleValueFromCSSStyleValue(CSSStyleValue* style_value); }; } // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/css_property.cc b/third_party/blink/renderer/core/css/properties/css_property.cc index 7493852..ac9a241 100644 --- a/third_party/blink/renderer/core/css/properties/css_property.cc +++ b/third_party/blink/renderer/core/css/properties/css_property.cc
@@ -5,13 +5,9 @@ #include "third_party/blink/renderer/core/css/properties/css_property.h" #include "base/stl_util.h" -#include "third_party/blink/renderer/core/css/cssom/cross_thread_keyword_value.h" -#include "third_party/blink/renderer/core/css/cssom/cross_thread_style_value.h" -#include "third_party/blink/renderer/core/css/cssom/cross_thread_unit_value.h" #include "third_party/blink/renderer/core/css/cssom/cross_thread_unsupported_value.h" -#include "third_party/blink/renderer/core/css/cssom/css_keyword_value.h" -#include "third_party/blink/renderer/core/css/cssom/css_unit_value.h" #include "third_party/blink/renderer/core/css/cssom/style_value_factory.h" +#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h" #include "third_party/blink/renderer/core/style/computed_style.h" #include "third_party/blink/renderer/core/style/svg_computed_style.h" #include "third_party/blink/renderer/core/style_property_shorthand.h" @@ -42,19 +38,8 @@ StyleValueFactory::CssValueToStyleValue(GetCSSPropertyName(), *css_value); if (!style_value) return std::make_unique<CrossThreadUnsupportedValue>(""); - switch (style_value->GetType()) { - case CSSStyleValue::StyleValueType::kKeywordType: - return std::make_unique<CrossThreadKeywordValue>( - To<CSSKeywordValue>(style_value)->value().IsolatedCopy()); - case CSSStyleValue::StyleValueType::kUnitType: - return std::make_unique<CrossThreadUnitValue>( - To<CSSUnitValue>(style_value)->value(), - To<CSSUnitValue>(style_value)->GetInternalUnit()); - default: - // Make an isolated copy to ensure that it is safe to pass cross thread. - return std::make_unique<CrossThreadUnsupportedValue>( - css_value->CssText().IsolatedCopy()); - } + return ComputedStyleUtils::CrossThreadStyleValueFromCSSStyleValue( + style_value); } const CSSValue* CSSProperty::CSSValueFromComputedStyle(
diff --git a/third_party/blink/renderer/core/css/resolver/filter_operation_resolver.cc b/third_party/blink/renderer/core/css/resolver/filter_operation_resolver.cc index 5844500..157bf28 100644 --- a/third_party/blink/renderer/core/css/resolver/filter_operation_resolver.cc +++ b/third_party/blink/renderer/core/css/resolver/filter_operation_resolver.cc
@@ -120,8 +120,8 @@ document.CountUse(feature); } -static double ResolveFirstArgumentForFunction(const CSSFunctionValue& filter, - const CSSPrimitiveValue* value) { +double FilterOperationResolver::ResolveNumericArgumentForFunction( + const CSSFunctionValue& filter) { switch (filter.FunctionType()) { case CSSValueID::kGrayscale: case CSSValueID::kSepia: @@ -130,21 +130,21 @@ case CSSValueID::kBrightness: case CSSValueID::kContrast: case CSSValueID::kOpacity: { - double amount = (filter.FunctionType() == CSSValueID::kBrightness || - filter.FunctionType() == CSSValueID::kInvert) - ? 0 - : 1; + double amount = 1; if (filter.length() == 1) { - amount = value->GetDoubleValue(); - if (value->IsPercentage()) + const CSSPrimitiveValue& value = To<CSSPrimitiveValue>(filter.Item(0)); + amount = value.GetDoubleValue(); + if (value.IsPercentage()) amount /= 100; } return amount; } case CSSValueID::kHueRotate: { double angle = 0; - if (filter.length() == 1) - angle = value->ComputeDegrees(); + if (filter.length() == 1) { + const CSSPrimitiveValue& value = To<CSSPrimitiveValue>(filter.Item(0)); + angle = value.ComputeDegrees(); + } return angle; } default: @@ -185,14 +185,6 @@ FilterOperationForType(filter_value->FunctionType()); CountFilterUse(operation_type, state.GetDocument()); DCHECK_LE(filter_value->length(), 1u); - - const CSSPrimitiveValue* first_value = nullptr; - if (filter_value->length()) - first_value = DynamicTo<CSSPrimitiveValue>(filter_value->Item(0)); - - double first_number = - ResolveFirstArgumentForFunction(*filter_value, first_value); - switch (filter_value->FunctionType()) { case CSSValueID::kGrayscale: case CSSValueID::kSepia: @@ -200,7 +192,8 @@ case CSSValueID::kHueRotate: { operations.Operations().push_back( MakeGarbageCollected<BasicColorMatrixFilterOperation>( - first_number, operation_type)); + ResolveNumericArgumentForFunction(*filter_value), + operation_type)); break; } case CSSValueID::kInvert: @@ -209,12 +202,15 @@ case CSSValueID::kOpacity: { operations.Operations().push_back( MakeGarbageCollected<BasicComponentTransferFilterOperation>( - first_number, operation_type)); + ResolveNumericArgumentForFunction(*filter_value), + operation_type)); break; } case CSSValueID::kBlur: { Length std_deviation = Length::Fixed(0); if (filter_value->length() >= 1) { + const CSSPrimitiveValue* first_value = + DynamicTo<CSSPrimitiveValue>(filter_value->Item(0)); std_deviation = first_value->ConvertToLength(conversion_data); } operations.Operations().push_back( @@ -269,14 +265,6 @@ // so we can have workers using UseCounter as well. // countFilterUse(operationType, state.document()); DCHECK_LE(filter_value->length(), 1u); - - const CSSPrimitiveValue* first_value = nullptr; - if (filter_value->length()) - first_value = DynamicTo<CSSPrimitiveValue>(filter_value->Item(0)); - - double first_number = - ResolveFirstArgumentForFunction(*filter_value, first_value); - switch (filter_value->FunctionType()) { case CSSValueID::kGrayscale: case CSSValueID::kSepia: @@ -284,7 +272,8 @@ case CSSValueID::kHueRotate: { operations.Operations().push_back( MakeGarbageCollected<BasicColorMatrixFilterOperation>( - first_number, operation_type)); + ResolveNumericArgumentForFunction(*filter_value), + operation_type)); break; } case CSSValueID::kInvert: @@ -293,12 +282,15 @@ case CSSValueID::kOpacity: { operations.Operations().push_back( MakeGarbageCollected<BasicComponentTransferFilterOperation>( - first_number, operation_type)); + ResolveNumericArgumentForFunction(*filter_value), + operation_type)); break; } case CSSValueID::kBlur: { Length std_deviation = Length::Fixed(0); if (filter_value->length() >= 1) { + const CSSPrimitiveValue* first_value = + DynamicTo<CSSPrimitiveValue>(filter_value->Item(0)); std_deviation = first_value->ConvertToLength(conversion_data); } operations.Operations().push_back(
diff --git a/third_party/blink/renderer/core/css/resolver/filter_operation_resolver.h b/third_party/blink/renderer/core/css/resolver/filter_operation_resolver.h index 39920cbb..dc9a930 100644 --- a/third_party/blink/renderer/core/css/resolver/filter_operation_resolver.h +++ b/third_party/blink/renderer/core/css/resolver/filter_operation_resolver.h
@@ -30,6 +30,7 @@ namespace blink { +class CSSFunctionValue; class CSSValue; class StyleResolverState; @@ -42,6 +43,8 @@ const CSSValue&); static FilterOperations CreateOffscreenFilterOperations(const CSSValue&, const Font&); + static double ResolveNumericArgumentForFunction( + const CSSFunctionValue& filter); }; } // namespace blink
diff --git a/third_party/blink/renderer/core/css/style_engine_test.cc b/third_party/blink/renderer/core/css/style_engine_test.cc index dbed68e..8176d57 100644 --- a/third_party/blink/renderer/core/css/style_engine_test.cc +++ b/third_party/blink/renderer/core/css/style_engine_test.cc
@@ -7,6 +7,7 @@ #include <memory> #include "testing/gtest/include/gtest/gtest.h" +#include "third_party/blink/public/common/css/forced_colors.h" #include "third_party/blink/public/common/css/preferred_color_scheme.h" #include "third_party/blink/public/platform/web_float_rect.h" #include "third_party/blink/renderer/bindings/core/v8/v8_binding_for_core.h" @@ -1558,6 +1559,32 @@ GetCSSPropertyColor())); } +TEST_F(StyleEngineTest, MediaQueriesChangeForcedColors) { + ScopedForcedColorsForTest scoped_feature(true); + GetDocument().body()->SetInnerHTMLFromString(R"HTML( + <style> + @media (forced-colors: none) { + body { color: red } + } + @media (forced-colors: active) { + body { color: green } + } + </style> + <body></body> + )HTML"); + + UpdateAllLifecyclePhases(); + EXPECT_EQ(MakeRGB(255, 0, 0), + GetDocument().body()->GetComputedStyle()->VisitedDependentColor( + GetCSSPropertyColor())); + + GetDocument().GetSettings()->SetForcedColors(ForcedColors::kActive); + UpdateAllLifecyclePhases(); + EXPECT_EQ(MakeRGB(0, 128, 0), + GetDocument().body()->GetComputedStyle()->VisitedDependentColor( + GetCSSPropertyColor())); +} + TEST_F(StyleEngineTest, ShadowRootStyleRecalcCrash) { GetDocument().body()->SetInnerHTMLFromString("<div id=host></div>"); auto* host = To<HTMLElement>(GetDocument().getElementById("host"));
diff --git a/third_party/blink/renderer/core/display_lock/display_lock_budget.cc b/third_party/blink/renderer/core/display_lock/display_lock_budget.cc index 9cdd3da..e0843ec2 100644 --- a/third_party/blink/renderer/core/display_lock/display_lock_budget.cc +++ b/third_party/blink/renderer/core/display_lock/display_lock_budget.cc
@@ -38,4 +38,13 @@ return false; } +void DisplayLockBudget::MarkPhaseAsDirty(Phase marking_phase) { + // Mark the next phase we're scheduled to run. + for (auto phase = static_cast<unsigned>(marking_phase); + phase <= static_cast<unsigned>(Phase::kLast); ++phase) { + if (MarkAncestorsDirtyForPhaseIfNeeded(static_cast<Phase>(phase))) + break; + } +} + } // namespace blink
diff --git a/third_party/blink/renderer/core/display_lock/display_lock_budget.h b/third_party/blink/renderer/core/display_lock/display_lock_budget.h index f715ab2..f39072b0 100644 --- a/third_party/blink/renderer/core/display_lock/display_lock_budget.h +++ b/third_party/blink/renderer/core/display_lock/display_lock_budget.h
@@ -15,6 +15,8 @@ namespace blink { class DisplayLockContext; +struct LifecycleData; + class CORE_EXPORT DisplayLockBudget { public: enum class Phase : unsigned { @@ -30,14 +32,14 @@ // Returns true if the given phase is allowed to proceed under the current // budget. - virtual bool ShouldPerformPhase(Phase) const = 0; + virtual bool ShouldPerformPhase(Phase, const LifecycleData&) = 0; + + // Called just before any calls to ShouldPerformPhase for a new lifecycle. + virtual void OnLifecycleChange(const LifecycleData&) = 0; // Notifies the budget that the given phase was completed. virtual void DidPerformPhase(Phase) = 0; - // Notifies the budget that a new lifecycle update phase is going to start. - virtual void WillStartLifecycleUpdate() = 0; - // Returns true if according to this budget, we still need a lifecycle update. // For example, if a budget blocked a needed phase, then it this will return // true indicating that another frame is needed. @@ -48,13 +50,15 @@ void SetTickClockForTesting(const base::TickClock* clock) { clock_ = clock; } protected: + // Returns true if there is likely to be work for the given phase. + bool IsElementDirtyForPhase(Phase) const; + + void MarkPhaseAsDirty(Phase marking_phase); + // Marks the ancestor chain dirty for the given phase if it's needed. Returns // true if the ancestors were marked dirty and false otherwise. bool MarkAncestorsDirtyForPhaseIfNeeded(Phase); - // Returns true if there is likely to be work for the given phase. - bool IsElementDirtyForPhase(Phase) const; - const base::TickClock* clock_; private:
diff --git a/third_party/blink/renderer/core/display_lock/display_lock_budget_test.cc b/third_party/blink/renderer/core/display_lock/display_lock_budget_test.cc index b372b973..053b863 100644 --- a/third_party/blink/renderer/core/display_lock/display_lock_budget_test.cc +++ b/third_party/blink/renderer/core/display_lock/display_lock_budget_test.cc
@@ -27,13 +27,16 @@ test_task_runner_ = base::MakeRefCounted<base::TestMockTimeTaskRunner>(); } - double GetBudgetMs(const YieldingDisplayLockBudget& budget) const { - return budget.GetCurrentBudgetMs(); + double GetBudgetMs(const YieldingDisplayLockBudget& budget, + const LifecycleData& lifecycle_data) const { + return budget.GetCurrentBudgetMs(lifecycle_data); } - void ResetDeadlineForTesting(YieldingDisplayLockBudget& budget) { - budget.deadline_ = CurrentTimeTicks() + TimeDelta::FromMillisecondsD( - budget.GetCurrentBudgetMs()); + void ResetDeadlineForTesting(YieldingDisplayLockBudget& budget, + const LifecycleData& lifecycle_data) { + budget.deadline_ = + CurrentTimeTicks() + + TimeDelta::FromMillisecondsD(budget.GetCurrentBudgetMs(lifecycle_data)); } void ResetBudget(std::unique_ptr<DisplayLockBudget> budget, @@ -76,16 +79,20 @@ // need an update. EXPECT_TRUE(budget.NeedsLifecycleUpdates()); + LifecycleData lifecycle_data; + // Check everything twice since it shouldn't matter how many times we ask the // unyielding budget, the results should always be the same. for (int i = 0; i < 2; ++i) { - budget.WillStartLifecycleUpdate(); // Note that although we only dirtied layout, all phases "should" complete, // since the budget should never be responsible for blocking phases for any // reason other than we're out of budget. - EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kStyle)); - EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kLayout)); - EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kPrePaint)); + EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kStyle, + lifecycle_data)); + EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kLayout, + lifecycle_data)); + EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kPrePaint, + lifecycle_data)); budget.DidPerformPhase(DisplayLockBudget::Phase::kStyle); budget.DidPerformPhase(DisplayLockBudget::Phase::kLayout); budget.DidPerformPhase(DisplayLockBudget::Phase::kPrePaint); @@ -119,79 +126,105 @@ // need an update. EXPECT_TRUE(budget.NeedsLifecycleUpdates()); + LifecycleData lifecycle_data; + { - budget.WillStartLifecycleUpdate(); // Initially all of the phase checks should return true, since we don't know // which phase the system wants to process next. - EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kStyle)); - EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kLayout)); - EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kPrePaint)); + EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kStyle, + lifecycle_data)); + EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kLayout, + lifecycle_data)); + EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kPrePaint, + lifecycle_data)); // Not doing anything should ensure that we schedule another animation by // returning true here. EXPECT_TRUE(budget.NeedsLifecycleUpdates()); } { - budget.WillStartLifecycleUpdate(); - EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kStyle)); - EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kLayout)); - EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kPrePaint)); + lifecycle_data.count++; + EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kStyle, + lifecycle_data)); + EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kLayout, + lifecycle_data)); + EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kPrePaint, + lifecycle_data)); // Once we perform a phase, its check should remain true, but the rest // will be false for this cycle. budget.DidPerformPhase(DisplayLockBudget::Phase::kStyle); - EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kStyle)); - EXPECT_FALSE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kLayout)); - EXPECT_FALSE( - budget.ShouldPerformPhase(DisplayLockBudget::Phase::kPrePaint)); + EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kStyle, + lifecycle_data)); + EXPECT_FALSE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kLayout, + lifecycle_data)); + EXPECT_FALSE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kPrePaint, + lifecycle_data)); + if (true) + return; // We would need at least one more run to finish everything. EXPECT_TRUE(budget.NeedsLifecycleUpdates()); } { - budget.WillStartLifecycleUpdate(); + lifecycle_data.count++; // Run the previous block again, now everything will always return true // since the phase we complete here (style) has already been completed // before, and we are open to complete a new phase. - EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kStyle)); - EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kLayout)); - EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kPrePaint)); + EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kStyle, + lifecycle_data)); + EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kLayout, + lifecycle_data)); + EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kPrePaint, + lifecycle_data)); // Since we already befored style before, no new phase has been processed // and all phases are allowed to finish. budget.DidPerformPhase(DisplayLockBudget::Phase::kStyle); - EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kStyle)); - EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kLayout)); - EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kPrePaint)); + EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kStyle, + lifecycle_data)); + EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kLayout, + lifecycle_data)); + EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kPrePaint, + lifecycle_data)); // We would need at least one more run to finish everything. EXPECT_TRUE(budget.NeedsLifecycleUpdates()); } { - budget.WillStartLifecycleUpdate(); + lifecycle_data.count++; // On the next run, the checks for phases completed before should always // return true, and as before since we haven't completed a new phase, the // remainder of the phases should return true for now. - EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kStyle)); - EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kLayout)); - EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kPrePaint)); + EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kStyle, + lifecycle_data)); + EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kLayout, + lifecycle_data)); + EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kPrePaint, + lifecycle_data)); // This check is the same as in the previous block, but is here to verify // that going through NeedsLifecycleUpdates() and then // WillStartLifecycleUpdate() again doesn't change the fact that we should // still perform all of the phases at this point. budget.DidPerformPhase(DisplayLockBudget::Phase::kStyle); - EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kStyle)); - EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kLayout)); - EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kPrePaint)); + EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kStyle, + lifecycle_data)); + EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kLayout, + lifecycle_data)); + EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kPrePaint, + lifecycle_data)); // Let's say layout was clean and we jumped and did prepaint instead, now // every phase before and including prepaint should be true, the rest are // locked from completing. budget.DidPerformPhase(DisplayLockBudget::Phase::kPrePaint); - EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kStyle)); - EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kLayout)); - EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kPrePaint)); + EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kStyle, + lifecycle_data)); + EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kLayout, + lifecycle_data)); + EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kPrePaint, + lifecycle_data)); // Note that since we processed everything, we no longer need lifecycle // updates. @@ -199,28 +232,40 @@ } { // Do one more run to ensure everything is still returning true. - budget.WillStartLifecycleUpdate(); + lifecycle_data.count++; // On the last run, we'll complete all phases. Since there is only one // remaining phase we haven't done, all of the checks should always return // true (it's either an old phase or a first uncompleted phase). - EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kStyle)); - EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kLayout)); - EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kPrePaint)); + EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kStyle, + lifecycle_data)); + EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kLayout, + lifecycle_data)); + EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kPrePaint, + lifecycle_data)); budget.DidPerformPhase(DisplayLockBudget::Phase::kStyle); - EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kStyle)); - EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kLayout)); - EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kPrePaint)); + EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kStyle, + lifecycle_data)); + EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kLayout, + lifecycle_data)); + EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kPrePaint, + lifecycle_data)); budget.DidPerformPhase(DisplayLockBudget::Phase::kLayout); - EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kStyle)); - EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kLayout)); - EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kPrePaint)); + EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kStyle, + lifecycle_data)); + EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kLayout, + lifecycle_data)); + EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kPrePaint, + lifecycle_data)); budget.DidPerformPhase(DisplayLockBudget::Phase::kPrePaint); - EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kStyle)); - EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kLayout)); - EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kPrePaint)); + EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kStyle, + lifecycle_data)); + EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kLayout, + lifecycle_data)); + EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kPrePaint, + lifecycle_data)); // Since we completed everything, we should now be returning false here (no // more updates needed). @@ -255,14 +300,18 @@ // When acquiring, we need to update the layout with the locked size, so we // need an update. EXPECT_TRUE(budget.NeedsLifecycleUpdates()); - budget.WillStartLifecycleUpdate(); - EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kLayout)); + LifecycleData lifecycle_data; + budget.OnLifecycleChange(lifecycle_data); + EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kLayout, + lifecycle_data)); budget.DidPerformPhase(DisplayLockBudget::Phase::kLayout); EXPECT_TRUE(budget.NeedsLifecycleUpdates()); - budget.WillStartLifecycleUpdate(); - EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kPrePaint)); + lifecycle_data.count++; + budget.OnLifecycleChange(lifecycle_data); + EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kPrePaint, + lifecycle_data)); budget.DidPerformPhase(DisplayLockBudget::Phase::kPrePaint); // Note that since the layout was indicated as done (from the budget @@ -299,13 +348,17 @@ // When acquiring, we need to update the layout with the locked size, so we // need an update. EXPECT_TRUE(budget.NeedsLifecycleUpdates()); + LifecycleData lifecycle_data; + budget.OnLifecycleChange(lifecycle_data); - budget.WillStartLifecycleUpdate(); // Initially all of the phase checks should return true, since we don't know // which phase the system wants to process next. - EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kStyle)); - EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kLayout)); - EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kPrePaint)); + EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kStyle, + lifecycle_data)); + EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kLayout, + lifecycle_data)); + EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kPrePaint, + lifecycle_data)); // Not doing anything should ensure that we schedule another animation by // returning true here. @@ -313,64 +366,94 @@ // Advancing the clock a bit will make us still want to the phases. test_task_runner_->FastForwardBy( - TimeDelta::FromMillisecondsD(GetBudgetMs(budget) / 2)); - EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kStyle)); - EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kLayout)); - EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kPrePaint)); + TimeDelta::FromMillisecondsD(GetBudgetMs(budget, lifecycle_data) / 2)); + EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kStyle, + lifecycle_data)); + EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kLayout, + lifecycle_data)); + EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kPrePaint, + lifecycle_data)); // However, once we're out of budget, we will only do the next phase. test_task_runner_->FastForwardBy( - TimeDelta::FromMillisecondsD(GetBudgetMs(budget))); + TimeDelta::FromMillisecondsD(GetBudgetMs(budget, lifecycle_data))); - EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kStyle)); - EXPECT_FALSE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kLayout)); - EXPECT_FALSE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kPrePaint)); + EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kStyle, + lifecycle_data)); + EXPECT_FALSE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kLayout, + lifecycle_data)); + EXPECT_FALSE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kPrePaint, + lifecycle_data)); // Starting a new lifecycle will reset the budget. - budget.WillStartLifecycleUpdate(); - EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kStyle)); - EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kLayout)); - EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kPrePaint)); + lifecycle_data.count++; + lifecycle_data.start_time = test_task_runner_->NowTicks(); + budget.OnLifecycleChange(lifecycle_data); + EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kStyle, + lifecycle_data)); + EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kLayout, + lifecycle_data)); + + EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kPrePaint, + lifecycle_data)); // Performing a phase still keeps the rest of the phases available for work // since we haven't advanced the clock. budget.DidPerformPhase(DisplayLockBudget::Phase::kStyle); - EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kStyle)); - EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kLayout)); - EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kPrePaint)); + EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kStyle, + lifecycle_data)); + EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kLayout, + lifecycle_data)); + EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kPrePaint, + lifecycle_data)); // Now that we're out of budget, phases performed previously should remain // true. test_task_runner_->FastForwardBy( - TimeDelta::FromMillisecondsD(GetBudgetMs(budget) * 2)); - EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kStyle)); - EXPECT_FALSE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kLayout)); - EXPECT_FALSE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kPrePaint)); + TimeDelta::FromMillisecondsD(GetBudgetMs(budget, lifecycle_data) * 2)); + EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kStyle, + lifecycle_data)); + EXPECT_FALSE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kLayout, + lifecycle_data)); + EXPECT_FALSE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kPrePaint, + lifecycle_data)); // Sanity check here: the element still needs layout. EXPECT_TRUE(budget.NeedsLifecycleUpdates()); // Resetting the budget, and advancing again should yield the same results as // before, except that we will process at least one more phase. - budget.WillStartLifecycleUpdate(); - EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kStyle)); - EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kLayout)); - EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kPrePaint)); + lifecycle_data.count++; + lifecycle_data.start_time = test_task_runner_->NowTicks(); + budget.OnLifecycleChange(lifecycle_data); + + EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kStyle, + lifecycle_data)); + EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kLayout, + lifecycle_data)); + EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kPrePaint, + lifecycle_data)); test_task_runner_->FastForwardBy( - TimeDelta::FromMillisecondsD(GetBudgetMs(budget) * 2)); - EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kStyle)); - EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kLayout)); - EXPECT_FALSE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kPrePaint)); + TimeDelta::FromMillisecondsD(GetBudgetMs(budget, lifecycle_data) * 2)); + EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kStyle, + lifecycle_data)); + EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kLayout, + lifecycle_data)); + EXPECT_FALSE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kPrePaint, + lifecycle_data)); // Eventually the budget becomes essentially infinite. - for (int i = 0; i < 60; ++i) - budget.WillStartLifecycleUpdate(); + lifecycle_data.count += 60; + budget.OnLifecycleChange(lifecycle_data); - EXPECT_GT(GetBudgetMs(budget), 1e6); + EXPECT_GT(GetBudgetMs(budget, lifecycle_data), 1e6); for (int i = 0; i < 60; ++i) { - EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kStyle)); - EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kLayout)); - EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kPrePaint)); + EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kStyle, + lifecycle_data)); + EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kLayout, + lifecycle_data)); + EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kPrePaint, + lifecycle_data)); test_task_runner_->FastForwardBy(TimeDelta::FromMillisecondsD(10000)); } } @@ -421,26 +504,40 @@ auto* parent = GetDocument().getElementById("parent"); EXPECT_TRUE(budget->NeedsLifecycleUpdates()); - element->GetDisplayLockContext()->WillStartLifecycleUpdate( - *GetDocument().GetFrame()->View()); + LifecycleData lifecycle_data; + budget->OnLifecycleChange(lifecycle_data); + + GetDocument().View()->SetInLifecycleUpdateForTest(true); + GetDocument().View()->SetLifecycleDataForTesting(lifecycle_data); // Initially all of the phase checks should return true, since we don't know // which phase the system wants to process next. - EXPECT_TRUE(budget->ShouldPerformPhase(DisplayLockBudget::Phase::kStyle)); - EXPECT_TRUE(budget->ShouldPerformPhase(DisplayLockBudget::Phase::kLayout)); - EXPECT_TRUE(budget->ShouldPerformPhase(DisplayLockBudget::Phase::kPrePaint)); + EXPECT_TRUE( + budget->ShouldPerformPhase(DisplayLockBudget::Phase::kStyle, + GetDocument().View()->CurrentLifecycleData())); + EXPECT_TRUE( + budget->ShouldPerformPhase(DisplayLockBudget::Phase::kLayout, + GetDocument().View()->CurrentLifecycleData())); + EXPECT_TRUE( + budget->ShouldPerformPhase(DisplayLockBudget::Phase::kPrePaint, + GetDocument().View()->CurrentLifecycleData())); EXPECT_TRUE(parent->NeedsStyleRecalc() || parent->ChildNeedsStyleRecalc()); EXPECT_TRUE(element->NeedsStyleRecalc() || element->ChildNeedsStyleRecalc()); - test_task_runner_->FastForwardBy( - TimeDelta::FromMillisecondsD(GetBudgetMs(*budget) * 2)); - EXPECT_TRUE(budget->ShouldPerformPhase(DisplayLockBudget::Phase::kStyle)); - EXPECT_FALSE(budget->ShouldPerformPhase(DisplayLockBudget::Phase::kLayout)); + test_task_runner_->FastForwardBy(TimeDelta::FromMillisecondsD( + GetBudgetMs(*budget, GetDocument().View()->CurrentLifecycleData()) * 2)); + EXPECT_TRUE( + budget->ShouldPerformPhase(DisplayLockBudget::Phase::kStyle, + GetDocument().View()->CurrentLifecycleData())); + EXPECT_FALSE( + budget->ShouldPerformPhase(DisplayLockBudget::Phase::kLayout, + GetDocument().View()->CurrentLifecycleData())); GetDocument().UpdateStyleAndLayoutTree(); - - EXPECT_FALSE(budget->ShouldPerformPhase(DisplayLockBudget::Phase::kLayout)); + EXPECT_FALSE( + budget->ShouldPerformPhase(DisplayLockBudget::Phase::kLayout, + GetDocument().View()->CurrentLifecycleData())); EXPECT_FALSE(parent->NeedsStyleRecalc() || parent->ChildNeedsStyleRecalc()); EXPECT_FALSE(element->NeedsStyleRecalc() || element->ChildNeedsStyleRecalc()); @@ -448,12 +545,17 @@ EXPECT_FALSE(parent->GetLayoutObject()->NeedsLayout()); EXPECT_TRUE(element->GetLayoutObject()->NeedsLayout()); - ResetDeadlineForTesting(*budget); + ResetDeadlineForTesting(*budget, + GetDocument().View()->CurrentLifecycleData()); budget->DidPerformPhase(DisplayLockBudget::Phase::kStyle); - EXPECT_TRUE(budget->ShouldPerformPhase(DisplayLockBudget::Phase::kLayout)); + EXPECT_TRUE( + budget->ShouldPerformPhase(DisplayLockBudget::Phase::kLayout, + GetDocument().View()->CurrentLifecycleData())); EXPECT_TRUE(parent->GetLayoutObject()->NeedsLayout()); EXPECT_TRUE(element->GetLayoutObject()->NeedsLayout()); + + GetDocument().View()->SetInLifecycleUpdateForTest(false); } TEST_F(DisplayLockBudgetTest, UpdateHappensInLifecycleOnly) { @@ -494,10 +596,16 @@ // need an update. EXPECT_TRUE(budget->NeedsLifecycleUpdates()); + LifecycleData lifecycle_data; + budget->OnLifecycleChange(lifecycle_data); + auto* context = element->GetDisplayLockContext(); - EXPECT_TRUE(budget->ShouldPerformPhase(DisplayLockBudget::Phase::kStyle)); - EXPECT_TRUE(budget->ShouldPerformPhase(DisplayLockBudget::Phase::kLayout)); - EXPECT_TRUE(budget->ShouldPerformPhase(DisplayLockBudget::Phase::kPrePaint)); + EXPECT_TRUE(budget->ShouldPerformPhase(DisplayLockBudget::Phase::kStyle, + lifecycle_data)); + EXPECT_TRUE(budget->ShouldPerformPhase(DisplayLockBudget::Phase::kLayout, + lifecycle_data)); + EXPECT_TRUE(budget->ShouldPerformPhase(DisplayLockBudget::Phase::kPrePaint, + lifecycle_data)); // Since we're not in a lifecycle, the budget itself should not want to do any // phases, even though the budget allows it. @@ -505,13 +613,13 @@ EXPECT_FALSE(context->ShouldLayout(DisplayLockContext::kChildren)); EXPECT_FALSE(context->ShouldPrePaint()); - context->WillStartLifecycleUpdate(*GetDocument().GetFrame()->View()); + GetDocument().GetFrame()->View()->SetInLifecycleUpdateForTest(true); EXPECT_TRUE(context->ShouldStyle(DisplayLockContext::kChildren)); EXPECT_TRUE(context->ShouldLayout(DisplayLockContext::kChildren)); EXPECT_TRUE(context->ShouldPrePaint()); - context->DidFinishLifecycleUpdate(*GetDocument().GetFrame()->View()); + GetDocument().GetFrame()->View()->SetInLifecycleUpdateForTest(false); EXPECT_FALSE(context->ShouldStyle(DisplayLockContext::kChildren)); EXPECT_FALSE(context->ShouldLayout(DisplayLockContext::kChildren));
diff --git a/third_party/blink/renderer/core/display_lock/display_lock_context.cc b/third_party/blink/renderer/core/display_lock/display_lock_context.cc index 3b09b764..a372a88 100644 --- a/third_party/blink/renderer/core/display_lock/display_lock_context.cc +++ b/third_party/blink/renderer/core/display_lock/display_lock_context.cc
@@ -208,8 +208,7 @@ return GetRejectedPromise(script_state, reason); } - acquire_resolver_ = - MakeGarbageCollected<ScriptPromiseResolver>(script_state); + MakeResolver(script_state, &acquire_resolver_); is_horizontal_writing_mode_ = true; if (auto* layout_object = element_->GetLayoutObject()) { layout_object->SetNeedsLayoutAndPrefWidthsRecalc( @@ -246,11 +245,26 @@ return update_resolver_->Promise(); } - update_resolver_ = MakeGarbageCollected<ScriptPromiseResolver>(script_state); + MakeResolver(script_state, &update_resolver_); StartUpdateIfNeeded(); return update_resolver_->Promise(); } +bool DisplayLockContext::CleanupAndRejectCommitIfNotConnected() { + // If we don't have an element or we're not connected, then the process of + // committing is the same as just unlocking the element. Early out if + // those conditions *don't* hold. + if (element_ && ConnectedToView()) + return false; + + state_ = kUnlocked; + update_budget_.reset(); + // Note that we reject the update, but resolve the commit. + FinishUpdateResolver(kReject, rejection_names::kElementIsDisconnected); + FinishCommitResolver(kResolve); + return true; +} + ScriptPromise DisplayLockContext::commit(ScriptState* script_state) { TRACE_EVENT0("blink", "DisplayLockContext::commit()"); // Resolve if we're already unlocked. @@ -268,12 +282,15 @@ return commit_resolver_->Promise(); } + if (CleanupAndRejectCommitIfNotConnected()) + return GetResolvedPromise(script_state); + // Note that we don't resolve the update promise here, since it should still // finish updating before resolution. That is, calling update() and commit() // together will still wait until the lifecycle is clean before resolving any // of the promises. - commit_resolver_ = MakeGarbageCollected<ScriptPromiseResolver>(script_state); + MakeResolver(script_state, &commit_resolver_); auto promise = commit_resolver_->Promise(); // It's possible we are already committing due to activation. If not, we // should start the commit. @@ -282,6 +299,17 @@ return promise; } +void DisplayLockContext::MakeResolver(ScriptState* script_state, + Member<ScriptPromiseResolver>* resolver) { + DCHECK(ConnectedToView()); + document_->View()->RegisterForLifecycleNotifications(this); + *resolver = MakeGarbageCollected<ScriptPromiseResolver>(script_state); +} + +bool DisplayLockContext::HasResolver() { + return acquire_resolver_ || update_resolver_ || commit_resolver_; +} + ScriptPromise DisplayLockContext::updateAndCommit(ScriptState* script_state) { TRACE_EVENT0("blink", "DisplayLockContext::updateAndCommit()"); @@ -304,7 +332,7 @@ } CancelTimeoutTask(); - commit_resolver_ = MakeGarbageCollected<ScriptPromiseResolver>(script_state); + MakeResolver(script_state, &commit_resolver_); StartUpdateIfNeeded(); return commit_resolver_->Promise(); } @@ -350,12 +378,24 @@ (*resolver)->Detach(); } *resolver = nullptr; + if (!HasResolver() && ConnectedToView()) + document_->View()->UnregisterFromLifecycleNotifications(this); +} + +bool DisplayLockContext::ShouldPerformUpdatePhase( + DisplayLockBudget::Phase phase) const { + DCHECK(document_); + if (state_ != kUpdating) + return false; + auto* view = document_->View(); + return view && view->InLifecycleUpdate() && + update_budget_->ShouldPerformPhase(phase, + view->CurrentLifecycleData()); } bool DisplayLockContext::ShouldStyle(LifecycleTarget target) const { return target == kSelf || update_forced_ || state_ > kUpdating || - (state_ == kUpdating && in_lifecycle_update_ && - update_budget_->ShouldPerformPhase(DisplayLockBudget::Phase::kStyle)); + ShouldPerformUpdatePhase(DisplayLockBudget::Phase::kStyle); } void DisplayLockContext::DidStyle(LifecycleTarget target) { @@ -387,9 +427,7 @@ bool DisplayLockContext::ShouldLayout(LifecycleTarget target) const { return target == kSelf || update_forced_ || state_ > kUpdating || - (state_ == kUpdating && in_lifecycle_update_ && - update_budget_->ShouldPerformPhase( - DisplayLockBudget::Phase::kLayout)); + ShouldPerformUpdatePhase(DisplayLockBudget::Phase::kLayout); } void DisplayLockContext::DidLayout(LifecycleTarget target) { @@ -402,9 +440,7 @@ bool DisplayLockContext::ShouldPrePaint() const { return update_forced_ || state_ > kUpdating || - (state_ == kUpdating && in_lifecycle_update_ && - update_budget_->ShouldPerformPhase( - DisplayLockBudget::Phase::kPrePaint)); + ShouldPerformUpdatePhase(DisplayLockBudget::Phase::kPrePaint); } void DisplayLockContext::DidPrePaint() { @@ -483,16 +519,8 @@ void DisplayLockContext::StartCommit() { // Since we are starting a commit, cancel the timeout task. CancelTimeoutTask(); - // If we don't have an element or we're not connected, then the process of - // committing is the same as just unlocking the element. - if (!element_ || !ConnectedToView()) { - state_ = kUnlocked; - update_budget_.reset(); - // Note that we reject the update, but resolve the commit. - FinishUpdateResolver(kReject, rejection_names::kElementIsDisconnected); - FinishCommitResolver(kResolve); + if (CleanupAndRejectCommitIfNotConnected()) return; - } // If we have an acquire resolver, it means that we haven't had a chance to // run the lifecycle yet to clear the painted output. However, we're being @@ -630,8 +658,13 @@ } bool DisplayLockContext::MarkPaintLayerNeedsRepaint() { + DCHECK(ConnectedToView()); if (auto* layout_object = element_->GetLayoutObject()) { layout_object->PaintingLayer()->SetNeedsRepaint(); + if (needs_graphics_layer_collection_) { + document_->View()->GraphicsLayersDidChange(); + needs_graphics_layer_collection_ = false; + } return true; } return false; @@ -671,10 +704,12 @@ // Since we're observing the lifecycle updates, ensure that we listen to the // right document's view. - if (old_document.View()) - old_document.View()->UnregisterFromLifecycleNotifications(this); - if (document_->View()) - document_->View()->RegisterForLifecycleNotifications(this); + if (HasResolver()) { + if (old_document.View()) + old_document.View()->UnregisterFromLifecycleNotifications(this); + if (document_->View()) + document_->View()->RegisterForLifecycleNotifications(this); + } if (!IsActivatable()) { old_document.RemoveActivationBlockingDisplayLock(); @@ -687,13 +722,11 @@ } void DisplayLockContext::WillStartLifecycleUpdate(const LocalFrameView& view) { - in_lifecycle_update_ = true; - if (state_ == kUpdating) - update_budget_->WillStartLifecycleUpdate(); + if (update_budget_) + update_budget_->OnLifecycleChange(view.CurrentLifecycleData()); } void DisplayLockContext::DidFinishLifecycleUpdate(const LocalFrameView& view) { - in_lifecycle_update_ = false; if (acquire_resolver_) { if (ForceUnlockIfNeeded()) return;
diff --git a/third_party/blink/renderer/core/display_lock/display_lock_context.h b/third_party/blink/renderer/core/display_lock/display_lock_context.h index feaab81..35794b9 100644 --- a/third_party/blink/renderer/core/display_lock/display_lock_context.h +++ b/third_party/blink/renderer/core/display_lock/display_lock_context.h
@@ -164,6 +164,12 @@ std::max(blocked_style_traversal_type_, type); } + // Inform the display lock that it needs a graphics layer collection when it + // needs to paint. + void NotifyNeedsGraphicsLayerCollection() { + needs_graphics_layer_collection_ = true; + } + // Notify this element will be disconnected. void NotifyWillDisconnect(); @@ -252,6 +258,8 @@ // Helper functions to resolve the update/commit promises. enum ResolverState { kResolve, kReject, kDetach }; + void MakeResolver(ScriptState*, Member<ScriptPromiseResolver>*); + bool HasResolver(); void FinishUpdateResolver(ResolverState, const char* reject_reason = nullptr); void FinishCommitResolver(ResolverState, const char* reject_reason = nullptr); void FinishAcquireResolver(ResolverState, @@ -277,6 +285,12 @@ // when acquiring this lock should immediately resolve the acquire promise. bool ConnectedToView() const; + bool ShouldPerformUpdatePhase(DisplayLockBudget::Phase phase) const; + + // During an attempt to commit, clean up state and reject pending resolver + // promises if the lock is not connected to the tree. + bool CleanupAndRejectCommitIfNotConnected(); + std::unique_ptr<DisplayLockBudget> update_budget_; Member<ScriptPromiseResolver> commit_resolver_; @@ -298,7 +312,6 @@ base::Optional<LayoutSize> locked_content_logical_size_; bool update_forced_ = false; - bool in_lifecycle_update_ = false; bool activatable_ = false; bool is_locked_after_connect_ = false; @@ -307,6 +320,7 @@ bool needs_effective_allowed_touch_action_update_ = false; bool needs_prepaint_subtree_walk_ = false; bool is_horizontal_writing_mode_ = true; + bool needs_graphics_layer_collection_ = false; TaskHandle timeout_task_handle_; };
diff --git a/third_party/blink/renderer/core/display_lock/display_lock_context_test.cc b/third_party/blink/renderer/core/display_lock/display_lock_context_test.cc index eb369f613..5acc5ee 100644 --- a/third_party/blink/renderer/core/display_lock/display_lock_context_test.cc +++ b/third_party/blink/renderer/core/display_lock/display_lock_context_test.cc
@@ -141,6 +141,10 @@ UpdateAllLifecyclePhasesForTest(); } + bool GraphicsLayerNeedsCollection(DisplayLockContext* context) const { + return context->needs_graphics_layer_collection_; + } + mojom::blink::FindOptionsPtr FindOptions(bool find_next = false) { auto find_options = mojom::blink::FindOptions::New(); find_options->run_synchronously_for_testing = true; @@ -1389,4 +1393,44 @@ EXPECT_TRUE(handler_object->InsideBlockingTouchEventHandler()); } +TEST_F(DisplayLockContextTest, + CompositedLayerLockCausesGraphicsLayersCollection) { + // This test only tests the BGPT path. + if (!RuntimeEnabledFeatures::BlinkGenPropertyTreesEnabled() || + RuntimeEnabledFeatures::CompositeAfterPaintEnabled()) { + return; + } + + ResizeAndFocus(); + GetDocument().GetSettings()->SetPreferCompositingToLCDTextEnabled(true); + + SetHtmlInnerHTML(R"HTML( + <style> + div { + width: 100px; + height: 100px; + contain: style layout; + will-change: transform; + } + </style> + <body> + <div id="container">testing</div></body> + </body> + )HTML"); + + // Check if the result is correct if we update the contents. + auto* container = GetDocument().getElementById("container"); + + // Ensure that we will gather graphics layer on the next update (after lock). + GetDocument().View()->GraphicsLayersDidChange(); + + LockElement(*container, false /* activatable */); + EXPECT_TRUE(container->GetDisplayLockContext()->IsLocked()); + EXPECT_TRUE(GraphicsLayerNeedsCollection(container->GetDisplayLockContext())); + + CommitElement(*container); + EXPECT_FALSE( + GraphicsLayerNeedsCollection(container->GetDisplayLockContext())); +} + } // namespace blink
diff --git a/third_party/blink/renderer/core/display_lock/strict_yielding_display_lock_budget.cc b/third_party/blink/renderer/core/display_lock/strict_yielding_display_lock_budget.cc index aca76e2..3f319b9 100644 --- a/third_party/blink/renderer/core/display_lock/strict_yielding_display_lock_budget.cc +++ b/third_party/blink/renderer/core/display_lock/strict_yielding_display_lock_budget.cc
@@ -5,6 +5,7 @@ #include "third_party/blink/renderer/core/display_lock/strict_yielding_display_lock_budget.h" #include <algorithm> +#include "third_party/blink/renderer/core/frame/local_frame_view.h" namespace blink { @@ -12,7 +13,9 @@ DisplayLockContext* context) : DisplayLockBudget(context) {} -bool StrictYieldingDisplayLockBudget::ShouldPerformPhase(Phase phase) const { +bool StrictYieldingDisplayLockBudget::ShouldPerformPhase( + Phase phase, + const LifecycleData& lifecycle_data) { // We should perform any phase earlier than the one we already completed. // Also, we should complete a new phase once per cycle. return (last_completed_phase_ && phase <= *last_completed_phase_) || @@ -36,7 +39,8 @@ #endif } -void StrictYieldingDisplayLockBudget::WillStartLifecycleUpdate() { +void StrictYieldingDisplayLockBudget::OnLifecycleChange( + const LifecycleData& lifecycle_data) { // Figure out the next phase we would run. If we had completed a phase before, // then we should try to complete the next one, otherwise we'll start with the // first phase. @@ -48,12 +52,7 @@ : Phase::kFirst; // Mark the next phase we're scheduled to run. - for (auto phase = static_cast<unsigned>(next_phase); - phase <= static_cast<unsigned>(Phase::kLast); ++phase) { - if (MarkAncestorsDirtyForPhaseIfNeeded(static_cast<Phase>(phase))) - break; - } - + MarkPhaseAsDirty(next_phase); completed_new_phase_this_cycle_ = false; }
diff --git a/third_party/blink/renderer/core/display_lock/strict_yielding_display_lock_budget.h b/third_party/blink/renderer/core/display_lock/strict_yielding_display_lock_budget.h index 77c6ca1f..c0b9cba 100644 --- a/third_party/blink/renderer/core/display_lock/strict_yielding_display_lock_budget.h +++ b/third_party/blink/renderer/core/display_lock/strict_yielding_display_lock_budget.h
@@ -21,9 +21,9 @@ StrictYieldingDisplayLockBudget(DisplayLockContext*); ~StrictYieldingDisplayLockBudget() override = default; - bool ShouldPerformPhase(Phase) const override; + bool ShouldPerformPhase(Phase, const LifecycleData&) override; void DidPerformPhase(Phase) override; - void WillStartLifecycleUpdate() override; + void OnLifecycleChange(const LifecycleData&) override; // Returns true if any of the lifecycles that have been previously blocked by // this budget need updates. Note that this does not check lifecycle phases // that have already completed by this budget even if they are now dirty
diff --git a/third_party/blink/renderer/core/display_lock/unyielding_display_lock_budget.cc b/third_party/blink/renderer/core/display_lock/unyielding_display_lock_budget.cc index bf0d00f3..6e585907 100644 --- a/third_party/blink/renderer/core/display_lock/unyielding_display_lock_budget.cc +++ b/third_party/blink/renderer/core/display_lock/unyielding_display_lock_budget.cc
@@ -4,19 +4,24 @@ #include "third_party/blink/renderer/core/display_lock/unyielding_display_lock_budget.h" +#include "third_party/blink/renderer/core/frame/local_frame_view.h" + namespace blink { UnyieldingDisplayLockBudget::UnyieldingDisplayLockBudget( DisplayLockContext* context) : DisplayLockBudget(context) {} -bool UnyieldingDisplayLockBudget::ShouldPerformPhase(Phase) const { +bool UnyieldingDisplayLockBudget::ShouldPerformPhase( + Phase, + const LifecycleData& lifecycle_data) { return true; } void UnyieldingDisplayLockBudget::DidPerformPhase(Phase) {} -void UnyieldingDisplayLockBudget::WillStartLifecycleUpdate() { +void UnyieldingDisplayLockBudget::OnLifecycleChange( + const LifecycleData& lifecycle_data) { // Mark all the phases dirty since we have no intention of yielding. for (auto phase = static_cast<unsigned>(Phase::kFirst); phase <= static_cast<unsigned>(Phase::kLast); ++phase) {
diff --git a/third_party/blink/renderer/core/display_lock/unyielding_display_lock_budget.h b/third_party/blink/renderer/core/display_lock/unyielding_display_lock_budget.h index aed8c3a..7b3351a 100644 --- a/third_party/blink/renderer/core/display_lock/unyielding_display_lock_budget.h +++ b/third_party/blink/renderer/core/display_lock/unyielding_display_lock_budget.h
@@ -18,9 +18,9 @@ UnyieldingDisplayLockBudget(DisplayLockContext*); ~UnyieldingDisplayLockBudget() override = default; - bool ShouldPerformPhase(Phase) const override; + bool ShouldPerformPhase(Phase, const LifecycleData&) override; void DidPerformPhase(Phase) override; - void WillStartLifecycleUpdate() override; + void OnLifecycleChange(const LifecycleData&) override; bool NeedsLifecycleUpdates() const override; };
diff --git a/third_party/blink/renderer/core/display_lock/yielding_display_lock_budget.cc b/third_party/blink/renderer/core/display_lock/yielding_display_lock_budget.cc index 7ffac6e6..5f76384a 100644 --- a/third_party/blink/renderer/core/display_lock/yielding_display_lock_budget.cc +++ b/third_party/blink/renderer/core/display_lock/yielding_display_lock_budget.cc
@@ -5,6 +5,7 @@ #include "third_party/blink/renderer/core/display_lock/yielding_display_lock_budget.h" #include "base/time/tick_clock.h" +#include "third_party/blink/renderer/core/frame/local_frame_view.h" #include "third_party/blink/renderer/platform/wtf/time.h" #include <algorithm> @@ -15,7 +16,9 @@ DisplayLockContext* context) : DisplayLockBudget(context) {} -bool YieldingDisplayLockBudget::ShouldPerformPhase(Phase phase) const { +bool YieldingDisplayLockBudget::ShouldPerformPhase( + Phase phase, + const LifecycleData& lifecycle_data) { // Always perform at least one more phase. if (phase <= next_phase_from_start_of_lifecycle_) return true; @@ -33,17 +36,16 @@ last_completed_phase_ = phase; // Mark the next phase as dirty so that we can reach it if we need to. - for (auto phase = static_cast<unsigned>(*last_completed_phase_) + 1; - phase <= static_cast<unsigned>(Phase::kLast); ++phase) { - if (MarkAncestorsDirtyForPhaseIfNeeded(static_cast<Phase>(phase))) - break; - } + MarkPhaseAsDirty( + static_cast<Phase>(static_cast<unsigned>(*last_completed_phase_) + 1)); } -void YieldingDisplayLockBudget::WillStartLifecycleUpdate() { - ++lifecycle_count_; - deadline_ = - clock_->NowTicks() + TimeDelta::FromMillisecondsD(GetCurrentBudgetMs()); +void YieldingDisplayLockBudget::OnLifecycleChange( + const LifecycleData& lifecycle_data) { + if (first_lifecycle_count_ == 0) + first_lifecycle_count_ = lifecycle_data.count; + deadline_ = lifecycle_data.start_time + + TimeDelta::FromMillisecondsD(GetCurrentBudgetMs(lifecycle_data)); // Figure out the next phase we would run. If we had completed a phase before, // then we should try to complete the next one, otherwise we'll start with the @@ -54,13 +56,7 @@ std::min(static_cast<unsigned>(*last_completed_phase_) + 1, static_cast<unsigned>(Phase::kLast))) : Phase::kFirst; - - // Mark the next phase we're scheduled to run. - for (auto phase = static_cast<unsigned>(next_phase_from_start_of_lifecycle_); - phase <= static_cast<unsigned>(Phase::kLast); ++phase) { - if (MarkAncestorsDirtyForPhaseIfNeeded(static_cast<Phase>(phase))) - break; - } + MarkPhaseAsDirty(next_phase_from_start_of_lifecycle_); } bool YieldingDisplayLockBudget::NeedsLifecycleUpdates() const { @@ -80,19 +76,21 @@ return false; } -double YieldingDisplayLockBudget::GetCurrentBudgetMs() const { +double YieldingDisplayLockBudget::GetCurrentBudgetMs( + const LifecycleData& lifecycle_data) const { + int lifecycle_count = lifecycle_data.count - first_lifecycle_count_ + 1; if (TimeTicks::IsHighResolution()) { - if (lifecycle_count_ < 3) + if (lifecycle_count < 3) return 4.; - if (lifecycle_count_ < 10) + if (lifecycle_count < 10) return 8.; - if (lifecycle_count_ < 60) + if (lifecycle_count < 60) return 16.; } else { // Without a high resolution clock, the resolution can be as bad as 15ms, so // increase the budgets accordingly to ensure we don't abort before doing // any phases. - if (lifecycle_count_ < 60) + if (lifecycle_count < 60) return 16.; } return 1e9;
diff --git a/third_party/blink/renderer/core/display_lock/yielding_display_lock_budget.h b/third_party/blink/renderer/core/display_lock/yielding_display_lock_budget.h index 17ee1a72..08e1a4db 100644 --- a/third_party/blink/renderer/core/display_lock/yielding_display_lock_budget.h +++ b/third_party/blink/renderer/core/display_lock/yielding_display_lock_budget.h
@@ -21,9 +21,9 @@ YieldingDisplayLockBudget(DisplayLockContext*); ~YieldingDisplayLockBudget() override = default; - bool ShouldPerformPhase(Phase) const override; + bool ShouldPerformPhase(Phase, const LifecycleData& lifecycle_data) override; void DidPerformPhase(Phase) override; - void WillStartLifecycleUpdate() override; + void OnLifecycleChange(const LifecycleData& lifecycle_data) override; // Returns true if any of the lifecycles that have been previously blocked by // this budget need updates. Note that this does not check lifecycle phases // that have already completed by this budget even if they are now dirty @@ -35,9 +35,10 @@ protected: friend class DisplayLockBudgetTest; - double GetCurrentBudgetMs() const; + double GetCurrentBudgetMs(const LifecycleData& lifecycle_data) const; - int lifecycle_count_ = 0; + private: + unsigned first_lifecycle_count_ = 0; TimeTicks deadline_; base::Optional<Phase> last_completed_phase_; Phase next_phase_from_start_of_lifecycle_ = Phase::kFirst;
diff --git a/third_party/blink/renderer/core/dom/document.cc b/third_party/blink/renderer/core/dom/document.cc index 69db86bf..056cd637 100644 --- a/third_party/blink/renderer/core/dom/document.cc +++ b/third_party/blink/renderer/core/dom/document.cc
@@ -1193,6 +1193,12 @@ return constructor_builder.BindingsReturnValue(); } +V0CustomElementRegistrationContext* Document::RegistrationContext() const { + if (RuntimeEnabledFeatures::CustomElementsV0Enabled(this)) + return registration_context_.Get(); + return nullptr; +} + V0CustomElementMicrotaskRunQueue* Document::CustomElementMicrotaskRunQueue() { if (!custom_element_microtask_run_queue_) { custom_element_microtask_run_queue_ =
diff --git a/third_party/blink/renderer/core/dom/document.h b/third_party/blink/renderer/core/dom/document.h index fcc62c0..2f8079e 100644 --- a/third_party/blink/renderer/core/dom/document.h +++ b/third_party/blink/renderer/core/dom/document.h
@@ -1202,9 +1202,7 @@ const AtomicString& name, const ElementRegistrationOptions*, ExceptionState&); - V0CustomElementRegistrationContext* RegistrationContext() const { - return registration_context_.Get(); - } + V0CustomElementRegistrationContext* RegistrationContext() const; V0CustomElementMicrotaskRunQueue* CustomElementMicrotaskRunQueue(); void ClearImportsController();
diff --git a/third_party/blink/renderer/core/dom/slot_assignment_engine.cc b/third_party/blink/renderer/core/dom/slot_assignment_engine.cc index d3eb721..f62c791 100644 --- a/third_party/blink/renderer/core/dom/slot_assignment_engine.cc +++ b/third_party/blink/renderer/core/dom/slot_assignment_engine.cc
@@ -40,6 +40,8 @@ } void SlotAssignmentEngine::RecalcSlotAssignments() { + TRACE_EVENT0("blink,benchmark", + "SlotAssignmentEngine::RecalcSlotAssignments"); for (auto& shadow_root : HeapHashSet<WeakMember<ShadowRoot>>(shadow_roots_needing_recalc_)) { DCHECK(shadow_root->isConnected());
diff --git a/third_party/blink/renderer/core/editing/editing_utilities.cc b/third_party/blink/renderer/core/editing/editing_utilities.cc index 38509593..6d11b16 100644 --- a/third_party/blink/renderer/core/editing/editing_utilities.cc +++ b/third_party/blink/renderer/core/editing/editing_utilities.cc
@@ -1333,10 +1333,7 @@ target_object = editable_object; } - // TODO(wangxianzhu): LayoutObject::PositionForPoint() still expects flipped - // coordinates. - return target_object->PositionForPoint( - target_object->FlipForWritingMode(selection_end_point)); + return target_object->PositionForPoint(selection_end_point); } Position ComputePositionForNodeRemoval(const Position& position,
diff --git a/third_party/blink/renderer/core/editing/frame_selection.cc b/third_party/blink/renderer/core/editing/frame_selection.cc index dd51aa0..1c973b8 100644 --- a/third_party/blink/renderer/core/editing/frame_selection.cc +++ b/third_party/blink/renderer/core/editing/frame_selection.cc
@@ -596,10 +596,7 @@ const PositionInFlatTreeWithAffinity pos_with_affinity = FromPositionInDOMTree<EditingInFlatTreeStrategy>( - // TODO(wangxianzhu): PositionForPoint still requires flipped - // coordinates. - inner_node->GetLayoutObject()->PositionForPoint( - result.FlippedLocalPoint())); + inner_node->GetLayoutObject()->PositionForPoint(result.LocalPoint())); if (pos_with_affinity.IsNull()) return false;
diff --git a/third_party/blink/renderer/core/editing/selection_controller.cc b/third_party/blink/renderer/core/editing/selection_controller.cc index cf5196c..2bd366b2 100644 --- a/third_party/blink/renderer/core/editing/selection_controller.cc +++ b/third_party/blink/renderer/core/editing/selection_controller.cc
@@ -124,7 +124,7 @@ const HitTestResult& hit_test_result) { return FromPositionInDOMTree<EditingInFlatTreeStrategy>( hit_test_result.InnerNode()->GetLayoutObject()->PositionForPoint( - hit_test_result.FlippedLocalPoint())); + hit_test_result.LocalPoint())); } DocumentMarker* SpellCheckMarkerAtPosition( @@ -1191,8 +1191,7 @@ if (!inner_node || !inner_node->GetLayoutObject()) return false; PositionWithAffinity pos_with_affinity = - inner_node->GetLayoutObject()->PositionForPoint( - result.FlippedLocalPoint()); + inner_node->GetLayoutObject()->PositionForPoint(result.LocalPoint()); if (pos_with_affinity.IsNull()) return false; // TODO(xiaochengh): Don't use |ParentAnchoredEquivalent()|.
diff --git a/third_party/blink/renderer/core/editing/selection_modifier_line.cc b/third_party/blink/renderer/core/editing/selection_modifier_line.cc index 85a41e0..b69cd33 100644 --- a/third_party/blink/renderer/core/editing/selection_modifier_line.cc +++ b/third_party/blink/renderer/core/editing/selection_modifier_line.cc
@@ -109,7 +109,7 @@ return AbstractLineBox(); } - LayoutPoint AbsoluteLineDirectionPointToLocalPointInBlock( + PhysicalOffset AbsoluteLineDirectionPointToLocalPointInBlock( LayoutUnit line_direction_point) { DCHECK(!IsNull()); const LayoutBlockFlow& containing_block = GetBlock(); @@ -121,31 +121,24 @@ PhysicalOffset(containing_block.ScrolledContentOffset()); } - if (containing_block.Style()->IsHorizontalWritingMode()) { - return LayoutPoint( - LayoutUnit(line_direction_point - absolute_block_point.left), - BlockDirectionPointInLine()); + if (containing_block.IsHorizontalWritingMode()) { + return PhysicalOffset(line_direction_point - absolute_block_point.left, + PhysicalBlockOffset()); } - - return LayoutPoint( - BlockDirectionPointInLine(), - LayoutUnit(line_direction_point - absolute_block_point.top)); + return PhysicalOffset(PhysicalBlockOffset(), + line_direction_point - absolute_block_point.top); } const LayoutObject* ClosestLeafChildForPoint( - const LayoutPoint& point, + const PhysicalOffset& point, bool only_editable_leaves) const { DCHECK(!IsNull()); if (IsOldLayout()) { - return GetRootInlineBox().ClosestLeafChildForPoint(point, - only_editable_leaves); + return GetRootInlineBox().ClosestLeafChildForPoint( + GetBlock().FlipForWritingMode(point), only_editable_leaves); } - const LayoutSize unit_square(1, 1); - const PhysicalRect physical_rect = - GetBlock().FlipForWritingMode(LayoutRect(point, unit_square)); - const PhysicalOffset physical_point = physical_rect.offset; const PhysicalOffset local_physical_point = - physical_point - ng_box_fragment_->Children()[ng_child_index_].offset; + point - ng_box_fragment_->Children()[ng_child_index_].offset; return GetLineBoxFragment().ClosestLeafChildForPoint(local_physical_point, only_editable_leaves); } @@ -173,17 +166,17 @@ return *To<LayoutBlockFlow>(ng_box_fragment_->GetLayoutObject()); } - LayoutUnit BlockDirectionPointInLine() const { + LayoutUnit PhysicalBlockOffset() const { DCHECK(!IsNull()); - if (IsOldLayout()) - return GetRootInlineBox().BlockDirectionPointInLine(); + if (IsOldLayout()) { + return GetBlock().FlipForWritingMode( + GetRootInlineBox().BlockDirectionPointInLine()); + } const PhysicalOffset physical_offset = ng_box_fragment_->Children()[ng_child_index_].offset; - const LogicalOffset logical_offset = physical_offset.ConvertToLogical( - ng_box_fragment_->Style().GetWritingMode(), - GetLineBoxFragment().BaseDirection(), ng_box_fragment_->Size(), - GetLineBoxFragment().Size()); - return logical_offset.block_offset; + return ng_box_fragment_->Style().IsHorizontalWritingMode() + ? physical_offset.top + : physical_offset.left; } bool IsOldLayout() const { return type_ == Type::kOldLayout; } @@ -425,7 +418,7 @@ if (!line.IsNull()) { // FIXME: Can be wrong for multi-column layout and with transforms. - LayoutPoint point_in_line = + PhysicalOffset point_in_line = line.AbsoluteLineDirectionPointToLocalPointInBlock( line_direction_point); const LayoutObject* closest_leaf_child = @@ -495,7 +488,7 @@ if (!line.IsNull()) { // FIXME: Can be wrong for multi-column layout and with transforms. - LayoutPoint point_in_line = + PhysicalOffset point_in_line = line.AbsoluteLineDirectionPointToLocalPointInBlock( line_direction_point); const LayoutObject* closest_leaf_child =
diff --git a/third_party/blink/renderer/core/exported/web_frame.cc b/third_party/blink/renderer/core/exported/web_frame.cc index d9a6112..a151099 100644 --- a/third_party/blink/renderer/core/exported/web_frame.cc +++ b/third_party/blink/renderer/core/exported/web_frame.cc
@@ -128,7 +128,8 @@ ToTraceValue(&local_frame)); } } else { - ToWebRemoteFrameImpl(frame)->InitializeCoreFrame(*page, owner, name); + ToWebRemoteFrameImpl(frame)->InitializeCoreFrame( + *page, owner, name, &old_frame->window_agent_factory()); } Frame* new_frame = ToCoreFrame(*frame);
diff --git a/third_party/blink/renderer/core/exported/web_frame_test.cc b/third_party/blink/renderer/core/exported/web_frame_test.cc index 8076238..ca49f8b 100644 --- a/third_party/blink/renderer/core/exported/web_frame_test.cc +++ b/third_party/blink/renderer/core/exported/web_frame_test.cc
@@ -6028,7 +6028,7 @@ } static int ComputeOffset(LayoutObject* layout_object, int x, int y) { - return layout_object->PositionForPoint(LayoutPoint(x, y)) + return layout_object->PositionForPoint(PhysicalOffset(x, y)) .GetPosition() .ComputeOffsetInContainerNode(); }
diff --git a/third_party/blink/renderer/core/exported/web_page_popup_impl.cc b/third_party/blink/renderer/core/exported/web_page_popup_impl.cc index 9b09c0ef7..cbded07 100644 --- a/third_party/blink/renderer/core/exported/web_page_popup_impl.cc +++ b/third_party/blink/renderer/core/exported/web_page_popup_impl.cc
@@ -298,8 +298,13 @@ ProvideContextFeaturesTo(*page_, std::make_unique<PagePopupFeaturesClient>()); DEFINE_STATIC_LOCAL(Persistent<LocalFrameClient>, empty_local_frame_client, (MakeGarbageCollected<EmptyLocalFrameClient>())); - auto* frame = MakeGarbageCollected<LocalFrame>(empty_local_frame_client, - *page_, nullptr); + // Creating new WindowAgentFactory because page popup content is owned by the + // user agent and should be isolated from the main frame. + auto* frame = + MakeGarbageCollected<LocalFrame>(empty_local_frame_client, *page_, + /* FrameOwner* */ nullptr, + /* WindowAgentFactory* */ nullptr, + /* InterfaceRegistry* */ nullptr); frame->SetPagePopupOwner(popup_client_->OwnerElement()); frame->SetView(MakeGarbageCollected<LocalFrameView>(*frame)); frame->Init();
diff --git a/third_party/blink/renderer/core/exported/web_remote_frame_impl.cc b/third_party/blink/renderer/core/exported/web_remote_frame_impl.cc index eadba9e..96e89a24 100644 --- a/third_party/blink/renderer/core/exported/web_remote_frame_impl.cc +++ b/third_party/blink/renderer/core/exported/web_remote_frame_impl.cc
@@ -88,7 +88,9 @@ // swapping path and instead directly overwrites the main frame. // TODO(dcheng): Remove the need for this and strongly enforce this condition // with a DCHECK. - frame->InitializeCoreFrame(page, nullptr, g_null_atom); + frame->InitializeCoreFrame( + page, nullptr, g_null_atom, + opener ? &ToCoreFrame(*opener)->window_agent_factory() : nullptr); return frame; } @@ -159,16 +161,20 @@ InsertAfter(child, previous_sibling); auto* owner = MakeGarbageCollected<RemoteFrameOwner>( frame_policy, frame_owner_properties, frame_owner_element_type); - child->InitializeCoreFrame(*GetFrame()->GetPage(), owner, name); + child->InitializeCoreFrame( + *GetFrame()->GetPage(), owner, name, + opener ? &ToCoreFrame(*opener)->window_agent_factory() : nullptr); DCHECK(child->GetFrame()); return child; } -void WebRemoteFrameImpl::InitializeCoreFrame(Page& page, - FrameOwner* owner, - const AtomicString& name) { - SetCoreFrame( - MakeGarbageCollected<RemoteFrame>(frame_client_.Get(), page, owner)); +void WebRemoteFrameImpl::InitializeCoreFrame( + Page& page, + FrameOwner* owner, + const AtomicString& name, + WindowAgentFactory* window_agent_factory) { + SetCoreFrame(MakeGarbageCollected<RemoteFrame>(frame_client_.Get(), page, + owner, window_agent_factory)); GetFrame()->CreateView(); frame_->Tree().SetName(name); } @@ -185,7 +191,9 @@ AppendChild(child); auto* owner = MakeGarbageCollected<RemoteFrameOwner>( frame_policy, WebFrameOwnerProperties(), frame_owner_element_type); - child->InitializeCoreFrame(*GetFrame()->GetPage(), owner, name); + child->InitializeCoreFrame( + *GetFrame()->GetPage(), owner, name, + opener ? &ToCoreFrame(*opener)->window_agent_factory() : nullptr); return child; }
diff --git a/third_party/blink/renderer/core/exported/web_remote_frame_impl.h b/third_party/blink/renderer/core/exported/web_remote_frame_impl.h index 0b5f67aa..87ef4329d 100644 --- a/third_party/blink/renderer/core/exported/web_remote_frame_impl.h +++ b/third_party/blink/renderer/core/exported/web_remote_frame_impl.h
@@ -25,6 +25,7 @@ class WebView; struct WebRect; struct WebScrollIntoViewParams; +class WindowAgentFactory; class CORE_EXPORT WebRemoteFrameImpl final : public GarbageCollectedFinalized<WebRemoteFrameImpl>, @@ -99,7 +100,10 @@ WebRect GetCompositingRect() override; void RenderFallbackContent() const override; - void InitializeCoreFrame(Page&, FrameOwner*, const AtomicString& name); + void InitializeCoreFrame(Page&, + FrameOwner*, + const AtomicString& name, + WindowAgentFactory*); RemoteFrame* GetFrame() const { return frame_.Get(); } WebRemoteFrameClient* Client() const { return client_; }
diff --git a/third_party/blink/renderer/core/exported/web_settings_impl.cc b/third_party/blink/renderer/core/exported/web_settings_impl.cc index 8312aab..ed21f4e 100644 --- a/third_party/blink/renderer/core/exported/web_settings_impl.cc +++ b/third_party/blink/renderer/core/exported/web_settings_impl.cc
@@ -755,6 +755,10 @@ settings_->SetPreferredColorScheme(color_scheme); } +void WebSettingsImpl::SetForcedColors(ForcedColors forced_colors) { + settings_->SetForcedColors(forced_colors); +} + STATIC_ASSERT_ENUM(WebSettings::ImageAnimationPolicy::kAllowed, kImageAnimationPolicyAllowed); STATIC_ASSERT_ENUM(WebSettings::ImageAnimationPolicy::kAnimateOnce,
diff --git a/third_party/blink/renderer/core/exported/web_settings_impl.h b/third_party/blink/renderer/core/exported/web_settings_impl.h index 6131c110..60113db0 100644 --- a/third_party/blink/renderer/core/exported/web_settings_impl.h +++ b/third_party/blink/renderer/core/exported/web_settings_impl.h
@@ -216,6 +216,7 @@ void SetForceDarkModeEnabled(bool) override; void SetPreferredColorScheme(PreferredColorScheme) override; + void SetForcedColors(ForcedColors) override; bool RenderVSyncNotificationEnabled() const { return render_v_sync_notification_enabled_;
diff --git a/third_party/blink/renderer/core/feature_policy/feature_policy_parser.cc b/third_party/blink/renderer/core/feature_policy/feature_policy_parser.cc index f1c9594c..bae91a17 100644 --- a/third_party/blink/renderer/core/feature_policy/feature_policy_parser.cc +++ b/third_party/blink/renderer/core/feature_policy/feature_policy_parser.cc
@@ -323,6 +323,13 @@ return value; } +void FeaturePolicyParser::ParseValueForFuzzer( + blink::mojom::PolicyValueType feature_type, + const WTF::String& value_string) { + bool ok; + ParseValueForType(feature_type, value_string, &ok); +} + bool IsFeatureDeclared(mojom::FeaturePolicyFeature feature, const ParsedFeaturePolicy& policy) { return std::any_of(policy.begin(), policy.end(),
diff --git a/third_party/blink/renderer/core/feature_policy/feature_policy_parser.h b/third_party/blink/renderer/core/feature_policy/feature_policy_parser.h index fd25d90..8aa73231 100644 --- a/third_party/blink/renderer/core/feature_policy/feature_policy_parser.h +++ b/third_party/blink/renderer/core/feature_policy/feature_policy_parser.h
@@ -16,9 +16,6 @@ #include "third_party/blink/renderer/platform/wtf/text/wtf_string.h" #include "third_party/blink/renderer/platform/wtf/vector.h" -// Forward declare for friendship. -void ParseValueForFuzzer(blink::mojom::PolicyValueType, const WTF::String&); - namespace blink { class Document; @@ -79,8 +76,10 @@ const FeatureNameMap& feature_names, ExecutionContext* execution_context = nullptr); + // Used for LLVM fuzzer test + static void ParseValueForFuzzer(mojom::PolicyValueType, const String&); + private: - friend void ::ParseValueForFuzzer(mojom::PolicyValueType, const String&); static PolicyValue GetFallbackValueForFeature( mojom::FeaturePolicyFeature feature); static PolicyValue ParseValueForType(mojom::PolicyValueType feature_type,
diff --git a/third_party/blink/renderer/core/feature_policy/feature_policy_value_fuzzer.cc b/third_party/blink/renderer/core/feature_policy/feature_policy_value_fuzzer.cc index 7f8e6aa..1455636 100644 --- a/third_party/blink/renderer/core/feature_policy/feature_policy_value_fuzzer.cc +++ b/third_party/blink/renderer/core/feature_policy/feature_policy_value_fuzzer.cc
@@ -13,19 +13,12 @@ #include "third_party/blink/renderer/platform/wtf/text/wtf_string.h" #include "third_party/blink/renderer/platform/wtf/vector.h" -void ParseValueForFuzzer(blink::mojom::PolicyValueType feature_type, - const WTF::String& value_string) { - bool ok; - blink::FeaturePolicyParser::ParseValueForType(feature_type, value_string, - &ok); -} - extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) { static blink::BlinkFuzzerTestSupport test_support = blink::BlinkFuzzerTestSupport(); - ParseValueForFuzzer(blink::mojom::PolicyValueType::kBool, - WTF::String(data, size)); - ParseValueForFuzzer(blink::mojom::PolicyValueType::kDecDouble, - WTF::String(data, size)); + blink::FeaturePolicyParser::ParseValueForFuzzer( + blink::mojom::PolicyValueType::kBool, WTF::String(data, size)); + blink::FeaturePolicyParser::ParseValueForFuzzer( + blink::mojom::PolicyValueType::kDecDouble, WTF::String(data, size)); return 0; }
diff --git a/third_party/blink/renderer/core/frame/ad_tracker_test.cc b/third_party/blink/renderer/core/frame/ad_tracker_test.cc index bc115e8..2a88349 100644 --- a/third_party/blink/renderer/core/frame/ad_tracker_test.cc +++ b/third_party/blink/renderer/core/frame/ad_tracker_test.cc
@@ -236,6 +236,10 @@ script.src = "vanilla_script.js"; document.body.appendChild(script); )SCRIPT"); + + // Wait for script to run. + base::RunLoop().RunUntilIdle(); + vanilla_script.Complete(""); EXPECT_TRUE(IsKnownAdScript(&GetDocument(), kAdUrl)); @@ -258,6 +262,9 @@ document.body.appendChild(frame); )SCRIPT"); + // Wait for script to run. + base::RunLoop().RunUntilIdle(); + // The child frame should be an ad subframe. auto* child_frame = To<LocalFrame>(GetDocument().GetFrame()->Tree().FirstChild()); @@ -306,6 +313,9 @@ document.body.appendChild(frame); )SCRIPT"); + // Wait for script to run. + base::RunLoop().RunUntilIdle(); + // The child frame should be an ad subframe. auto* child_frame = To<LocalFrame>(GetDocument().GetFrame()->Tree().FirstChild()); @@ -338,6 +348,9 @@ document.body.appendChild(frame); )SCRIPT"); + // Wait for script to run. + base::RunLoop().RunUntilIdle(); + // Verify that the new frame is an ad frame. EXPECT_TRUE(To<LocalFrame>(GetDocument().GetFrame()->Tree().FirstChild()) ->IsAdSubframe()); @@ -374,6 +387,10 @@ image.src = "vanilla_image.jpg"; document.body.appendChild(image); )SCRIPT"); + + // Wait for script to run. + base::RunLoop().RunUntilIdle(); + vanilla_image.Complete(""); EXPECT_TRUE(IsKnownAdScript(&GetDocument(), kAdUrl)); @@ -400,6 +417,10 @@ iframe.src = "vanilla_page.html"; document.body.appendChild(iframe); )SCRIPT"); + + // Wait for script to run. + base::RunLoop().RunUntilIdle(); + vanilla_page.Complete("<img src=vanilla_img.jpg></img>"); vanilla_image.Complete(""); @@ -466,6 +487,9 @@ document.body.appendChild(iframe); )SCRIPT"); + // Wait for script to run. + base::RunLoop().RunUntilIdle(); + iframe_resource.Complete("iframe data"); Frame* subframe = GetDocument().GetFrame()->Tree().FirstChild(); @@ -490,6 +514,9 @@ iframeDocument.close(); )SCRIPT"); + // Wait for script to run. + base::RunLoop().RunUntilIdle(); + Frame* subframe = GetDocument().GetFrame()->Tree().FirstChild(); auto* local_subframe = To<LocalFrame>(subframe); EXPECT_TRUE(local_subframe->IsAdSubframe());
diff --git a/third_party/blink/renderer/core/frame/frame.cc b/third_party/blink/renderer/core/frame/frame.cc index 7bf7cbc..2260fc9 100644 --- a/third_party/blink/renderer/core/frame/frame.cc +++ b/third_party/blink/renderer/core/frame/frame.cc
@@ -39,6 +39,7 @@ #include "third_party/blink/renderer/core/dom/events/event.h" #include "third_party/blink/renderer/core/dom/node_computed_style.h" #include "third_party/blink/renderer/core/dom/user_gesture_indicator.h" +#include "third_party/blink/renderer/core/execution_context/window_agent_factory.h" #include "third_party/blink/renderer/core/frame/local_dom_window.h" #include "third_party/blink/renderer/core/frame/settings.h" #include "third_party/blink/renderer/core/html/html_frame_element_base.h" @@ -69,6 +70,7 @@ visitor->Trace(dom_window_); visitor->Trace(client_); visitor->Trace(navigation_rate_limiter_); + visitor->Trace(window_agent_factory_); } void Frame::Detach(FrameDetachType type) { @@ -269,13 +271,17 @@ Frame::Frame(FrameClient* client, Page& page, FrameOwner* owner, - WindowProxyManager* window_proxy_manager) + WindowProxyManager* window_proxy_manager, + WindowAgentFactory* inheriting_agent_factory) : tree_node_(this), page_(&page), owner_(owner), client_(client), window_proxy_manager_(window_proxy_manager), navigation_rate_limiter_(*this), + window_agent_factory_(inheriting_agent_factory + ? inheriting_agent_factory + : MakeGarbageCollected<WindowAgentFactory>()), is_loading_(false), devtools_frame_token_(client->GetDevToolsFrameToken()), create_stack_(base::debug::StackTrace()) {
diff --git a/third_party/blink/renderer/core/frame/frame.h b/third_party/blink/renderer/core/frame/frame.h index 58fe978..b404b59c 100644 --- a/third_party/blink/renderer/core/frame/frame.h +++ b/third_party/blink/renderer/core/frame/frame.h
@@ -65,6 +65,7 @@ class WindowProxy; class WindowProxyManager; struct FrameLoadRequest; +class WindowAgentFactory; enum class FrameDetachType { kRemove, kSwap }; @@ -238,8 +239,21 @@ opener_feature_state_ = state; } + WindowAgentFactory& window_agent_factory() const { + return *window_agent_factory_; + } + protected: - Frame(FrameClient*, Page&, FrameOwner*, WindowProxyManager*); + // |inheriting_agent_factory| should basically be set to the parent frame or + // opener's WindowAgentFactory. Pass nullptr if the frame is isolated from + // other frames (i.e. if it and its child frames shall never be script + // accessible from other frames), and a new WindowAgentFactory will be + // created. + Frame(FrameClient*, + Page&, + FrameOwner*, + WindowProxyManager*, + WindowAgentFactory* inheriting_agent_factory); // Perform initialization that must happen after the constructor has run so // that vtables are initialized. @@ -285,6 +299,8 @@ // frames. FeaturePolicy::FeatureState opener_feature_state_; + Member<WindowAgentFactory> window_agent_factory_; + // TODO(sashab): Investigate if this can be represented with m_lifecycle. bool is_loading_; base::UnguessableToken devtools_frame_token_;
diff --git a/third_party/blink/renderer/core/frame/local_frame.cc b/third_party/blink/renderer/core/frame/local_frame.cc index d2153bea..2aab679 100644 --- a/third_party/blink/renderer/core/frame/local_frame.cc +++ b/third_party/blink/renderer/core/frame/local_frame.cc
@@ -841,7 +841,7 @@ if (!layout_object) return PositionWithAffinity(); const PositionWithAffinity position = - layout_object->PositionForPoint(result.FlippedLocalPoint()); + layout_object->PositionForPoint(result.LocalPoint()); if (position.IsNull()) return PositionWithAffinity(FirstPositionInOrBeforeNode(*node)); return position; @@ -893,11 +893,13 @@ LocalFrame::LocalFrame(LocalFrameClient* client, Page& page, FrameOwner* owner, + WindowAgentFactory* inheriting_agent_factory, InterfaceRegistry* interface_registry) : Frame(client, page, owner, - MakeGarbageCollected<LocalWindowProxyManager>(*this)), + MakeGarbageCollected<LocalWindowProxyManager>(*this), + inheriting_agent_factory), frame_scheduler_(page.GetPageScheduler()->CreateFrameScheduler( this, client->GetFrameBlameContext(),
diff --git a/third_party/blink/renderer/core/frame/local_frame.h b/third_party/blink/renderer/core/frame/local_frame.h index 48379e1..4bb941b 100644 --- a/third_party/blink/renderer/core/frame/local_frame.h +++ b/third_party/blink/renderer/core/frame/local_frame.h
@@ -119,10 +119,13 @@ USING_GARBAGE_COLLECTED_MIXIN(LocalFrame); public: + // For a description of |inheriting_agent_factory| go see the comment on the + // Frame constructor. LocalFrame(LocalFrameClient*, Page&, FrameOwner*, - InterfaceRegistry* = nullptr); + WindowAgentFactory* inheriting_agent_factory, + InterfaceRegistry*); void Init(); void SetView(LocalFrameView*);
diff --git a/third_party/blink/renderer/core/frame/local_frame_view.cc b/third_party/blink/renderer/core/frame/local_frame_view.cc index 92102b70..fb158280 100644 --- a/third_party/blink/renderer/core/frame/local_frame_view.cc +++ b/third_party/blink/renderer/core/frame/local_frame_view.cc
@@ -270,6 +270,7 @@ intersection_observation_state_(kNotNeeded), needs_forced_compositing_update_(false), needs_focus_on_fragment_(false), + in_lifecycle_update_(false), tracked_object_paint_invalidations_( base::WrapUnique(g_initial_track_all_paint_invalidations ? new Vector<ObjectPaintInvalidation> @@ -847,7 +848,6 @@ IntSize new_size(Size()); if (old_size != new_size) { - SetNeedsLayout(); MarkViewportConstrainedObjectsForLayout( old_size.Width() != new_size.Width(), old_size.Height() != new_size.Height()); @@ -2194,6 +2194,10 @@ return Lifecycle().GetState() == target_state; } + base::AutoReset<bool> in_lifecycle_scope(&in_lifecycle_update_, true); + lifecycle_data_.start_time = base::TimeTicks::Now(); + ++lifecycle_data_.count; + { TRACE_EVENT0("blink,benchmark", "LocalFrameView::WillStartLifecycleUpdate"); @@ -2562,8 +2566,16 @@ DCHECK(RuntimeEnabledFeatures::BlinkGenPropertyTreesEnabled()); if (!layer || layer->Client().ShouldThrottleRendering() || - layer->Client().IsUnderSVGHiddenContainer() || - layer->Client().PaintBlockedByDisplayLock()) { + layer->Client().IsUnderSVGHiddenContainer()) { + return; + } + + // TODO(crbug.com/966493): We can't currently collect display-locked elements + // as foreign layers. However, if we skip collecting them, then we need to + // ensure to notify the display lock context, because when we unlock we need + // to force recollecting of graphics layers. + if (layer->Client().PaintBlockedByDisplayLock()) { + layer->Client().NotifyDisplayLockNeedsGraphicsLayerCollection(); return; }
diff --git a/third_party/blink/renderer/core/frame/local_frame_view.h b/third_party/blink/renderer/core/frame/local_frame_view.h index 6f2a9c5..063eda35 100644 --- a/third_party/blink/renderer/core/frame/local_frame_view.h +++ b/third_party/blink/renderer/core/frame/local_frame_view.h
@@ -103,6 +103,16 @@ using LayerTreeFlags = unsigned; using MainThreadScrollingReasons = uint32_t; +struct LifecycleData { + LifecycleData() {} + LifecycleData(TimeTicks start_time_arg, int count_arg) + : start_time(start_time_arg), count(count_arg) {} + TimeTicks start_time; + // The number of lifecycles that have occcurred since the first one, + // inclusive, on a given LocalFrameRoot. + unsigned count = 0; +}; + class CORE_EXPORT LocalFrameView final : public GarbageCollectedFinalized<LocalFrameView>, public FrameView { @@ -358,6 +368,14 @@ // desired state. bool UpdateLifecycleToLayoutClean(); + bool InLifecycleUpdate() { return in_lifecycle_update_; } + void SetInLifecycleUpdateForTest(bool val) { in_lifecycle_update_ = val; } + void SetLifecycleDataForTesting(const LifecycleData& lifecycle_data) { + lifecycle_data_ = lifecycle_data; + } + + const LifecycleData& CurrentLifecycleData() const { return lifecycle_data_; } + // This for doing work that needs to run synchronously at the end of lifecyle // updates, but needs to happen outside of the lifecycle code. It's OK to // schedule another animation frame here, but the layout tree should not be @@ -937,6 +955,9 @@ bool needs_forced_compositing_update_; bool needs_focus_on_fragment_; + bool in_lifecycle_update_; + + LifecycleData lifecycle_data_; IntRect remote_viewport_intersection_;
diff --git a/third_party/blink/renderer/core/frame/remote_frame.cc b/third_party/blink/renderer/core/frame/remote_frame.cc index de161054..258fd82 100644 --- a/third_party/blink/renderer/core/frame/remote_frame.cc +++ b/third_party/blink/renderer/core/frame/remote_frame.cc
@@ -35,11 +35,13 @@ RemoteFrame::RemoteFrame(RemoteFrameClient* client, Page& page, - FrameOwner* owner) + FrameOwner* owner, + WindowAgentFactory* inheriting_agent_factory) : Frame(client, page, owner, - MakeGarbageCollected<RemoteWindowProxyManager>(*this)), + MakeGarbageCollected<RemoteWindowProxyManager>(*this), + inheriting_agent_factory), security_context_(MakeGarbageCollected<RemoteSecurityContext>()) { dom_window_ = MakeGarbageCollected<RemoteDOMWindow>(*this); UpdateInertIfPossible();
diff --git a/third_party/blink/renderer/core/frame/remote_frame.h b/third_party/blink/renderer/core/frame/remote_frame.h index fbdb476..60ed135 100644 --- a/third_party/blink/renderer/core/frame/remote_frame.h +++ b/third_party/blink/renderer/core/frame/remote_frame.h
@@ -24,7 +24,12 @@ class CORE_EXPORT RemoteFrame final : public Frame { public: - RemoteFrame(RemoteFrameClient*, Page&, FrameOwner*); + // For a description of |inheriting_agent_factory| go see the comment on the + // Frame constructor. + RemoteFrame(RemoteFrameClient*, + Page&, + FrameOwner*, + WindowAgentFactory* inheriting_agent_factory); ~RemoteFrame() override; // Frame overrides:
diff --git a/third_party/blink/renderer/core/frame/settings.h b/third_party/blink/renderer/core/frame/settings.h index ccba230..5c40911 100644 --- a/third_party/blink/renderer/core/frame/settings.h +++ b/third_party/blink/renderer/core/frame/settings.h
@@ -31,6 +31,7 @@ #include <memory> #include "base/macros.h" +#include "third_party/blink/public/common/css/forced_colors.h" #include "third_party/blink/public/common/css/preferred_color_scheme.h" #include "third_party/blink/public/common/manifest/web_display_mode.h" #include "third_party/blink/public/platform/pointer_properties.h"
diff --git a/third_party/blink/renderer/core/frame/settings.json5 b/third_party/blink/renderer/core/frame/settings.json5 index 90b072c6..b467de7 100644 --- a/third_party/blink/renderer/core/frame/settings.json5 +++ b/third_party/blink/renderer/core/frame/settings.json5
@@ -1030,5 +1030,13 @@ name: "DontSendKeyEventsToJavascript", initial: false, }, + // Forced colors from the OS/application passed to the renderer for + // evaluating the forced-colors media query. + { + name: "forcedColors", + initial: "ForcedColors::kNone", + invalidate: "MediaQuery", + type: "ForcedColors", + }, ], }
diff --git a/third_party/blink/renderer/core/frame/web_local_frame_impl.cc b/third_party/blink/renderer/core/frame/web_local_frame_impl.cc index 43394d7..3b7e586 100644 --- a/third_party/blink/renderer/core/frame/web_local_frame_impl.cc +++ b/third_party/blink/renderer/core/frame/web_local_frame_impl.cc
@@ -1633,7 +1633,9 @@ frame->SetOpener(opener); Page& page = *static_cast<WebViewImpl*>(web_view)->GetPage(); DCHECK(!page.MainFrame()); - frame->InitializeCoreFrame(page, nullptr, name); + frame->InitializeCoreFrame( + page, nullptr, name, + opener ? &ToCoreFrame(*opener)->window_agent_factory() : nullptr); if (RuntimeEnabledFeatures::FeaturePolicyForSandboxEnabled()) frame->GetFrame()->SetOpenerFeatureState(opener_feature_state); // Can't force sandbox flags until there's a core frame. @@ -1667,9 +1669,10 @@ // unscriptable. Once the provisional frame gets properly attached and is // observable, it will have the real FrameOwner, and any subsequent real // documents will correctly inherit sandbox flags from the owner. - web_frame->InitializeCoreFrame(*previous_frame->GetPage(), - MakeGarbageCollected<DummyFrameOwner>(), - previous_frame->Tree().GetName()); + web_frame->InitializeCoreFrame( + *previous_frame->GetPage(), MakeGarbageCollected<DummyFrameOwner>(), + previous_frame->Tree().GetName(), + &ToCoreFrame(*previous_web_frame)->window_agent_factory()); LocalFrame* new_frame = web_frame->GetFrame(); new_frame->SetOwner(previous_frame->Owner()); @@ -1744,11 +1747,14 @@ frame_ = frame; } -void WebLocalFrameImpl::InitializeCoreFrame(Page& page, - FrameOwner* owner, - const AtomicString& name) { +void WebLocalFrameImpl::InitializeCoreFrame( + Page& page, + FrameOwner* owner, + const AtomicString& name, + WindowAgentFactory* window_agent_factory) { SetCoreFrame(MakeGarbageCollected<LocalFrame>(local_frame_client_.Get(), page, - owner, interface_registry_)); + owner, window_agent_factory, + interface_registry_)); frame_->Tree().SetName(name); // We must call init() after frame_ is assigned because it is referenced // during init(). @@ -1797,7 +1803,8 @@ return nullptr; webframe_child->InitializeCoreFrame(*GetFrame()->GetPage(), owner_element, - name); + name, + &GetFrame()->window_agent_factory()); DCHECK(webframe_child->Parent()); return webframe_child->GetFrame(); @@ -1810,8 +1817,8 @@ auto pair = client_->CreatePortal(portal_receiver.PassHandle(), portal_client.PassHandle()); WebRemoteFrameImpl* portal_frame = ToWebRemoteFrameImpl(pair.first); - portal_frame->InitializeCoreFrame(*GetFrame()->GetPage(), portal, - g_null_atom); + portal_frame->InitializeCoreFrame(*GetFrame()->GetPage(), portal, g_null_atom, + &GetFrame()->window_agent_factory()); return std::pair<RemoteFrame*, base::UnguessableToken>( portal_frame->GetFrame(), pair.second); } @@ -1819,8 +1826,8 @@ RemoteFrame* WebLocalFrameImpl::AdoptPortal(HTMLPortalElement* portal) { WebRemoteFrameImpl* portal_frame = ToWebRemoteFrameImpl(client_->AdoptPortal(portal->GetToken())); - portal_frame->InitializeCoreFrame(*GetFrame()->GetPage(), portal, - g_null_atom); + portal_frame->InitializeCoreFrame(*GetFrame()->GetPage(), portal, g_null_atom, + &GetFrame()->window_agent_factory()); return portal_frame->GetFrame(); }
diff --git a/third_party/blink/renderer/core/frame/web_local_frame_impl.h b/third_party/blink/renderer/core/frame/web_local_frame_impl.h index 048175bd..be0a494 100644 --- a/third_party/blink/renderer/core/frame/web_local_frame_impl.h +++ b/third_party/blink/renderer/core/frame/web_local_frame_impl.h
@@ -82,6 +82,7 @@ enum class WebFrameLoadType; struct WebContentSecurityPolicyViolation; struct WebPrintParams; +class WindowAgentFactory; template <typename T> class WebVector; @@ -343,7 +344,10 @@ void WasHidden() override; void WasShown() override; - void InitializeCoreFrame(Page&, FrameOwner*, const AtomicString& name); + void InitializeCoreFrame(Page&, + FrameOwner*, + const AtomicString& name, + WindowAgentFactory*); LocalFrame* GetFrame() const { return frame_.Get(); } void WillBeDetached();
diff --git a/third_party/blink/renderer/core/html/canvas/html_canvas_element.cc b/third_party/blink/renderer/core/html/canvas/html_canvas_element.cc index cee6954..fc7da9da 100644 --- a/third_party/blink/renderer/core/html/canvas/html_canvas_element.cc +++ b/third_party/blink/renderer/core/html/canvas/html_canvas_element.cc
@@ -1010,6 +1010,11 @@ if (context_ && !Is2d()) return false; + // The command line flag --disable-accelerated-2d-canvas toggles this option + if (!RuntimeEnabledFeatures::Accelerated2dCanvasEnabled()) { + return false; + } + // The following is necessary for handling the special case of canvases in // the dev tools overlay, which run in a process that supports accelerated // 2d canvas but in a special compositing context that does not.
diff --git a/third_party/blink/renderer/core/html/parser/html_document_parser.cc b/third_party/blink/renderer/core/html/parser/html_document_parser.cc index 9d8e2c5..2cde1b90 100644 --- a/third_party/blink/renderer/core/html/parser/html_document_parser.cc +++ b/third_party/blink/renderer/core/html/parser/html_document_parser.cc
@@ -60,6 +60,7 @@ #include "third_party/blink/renderer/platform/instrumentation/tracing/trace_event.h" #include "third_party/blink/renderer/platform/loader/fetch/resource_fetcher.h" #include "third_party/blink/renderer/platform/runtime_enabled_features.h" +#include "third_party/blink/renderer/platform/scheduler/public/cooperative_scheduling_manager.h" #include "third_party/blink/renderer/platform/scheduler/public/thread.h" #include "third_party/blink/renderer/platform/scheduler/public/thread_scheduler.h" #include "third_party/blink/renderer/platform/shared_buffer.h" @@ -1071,6 +1072,10 @@ DCHECK(script_runner_); DCHECK(!IsExecutingScript()); + scheduler::CooperativeSchedulingManager::AllowedStackScope + whitelisted_stack_scope( + scheduler::CooperativeSchedulingManager::Instance()); + if (IsStopped()) { return; }
diff --git a/third_party/blink/renderer/core/input/keyboard_event_manager.cc b/third_party/blink/renderer/core/input/keyboard_event_manager.cc index 9c4c4fb..06c313c3 100644 --- a/third_party/blink/renderer/core/input/keyboard_event_manager.cc +++ b/third_party/blink/renderer/core/input/keyboard_event_manager.cc
@@ -340,6 +340,9 @@ DefaultEscapeEventHandler(event); } else if (event->key() == "Enter") { DefaultEnterEventHandler(event); + } else if (static_cast<int>(event->KeyEvent()->dom_key) == 0x00200310) { + // TODO(bokan): Cleanup magic numbers once https://crbug.com/949766 lands. + DefaultImeSubmitHandler(event); } else { // TODO(bokan): Seems odd to call the default _arrow_ event handler on // events that aren't necessarily arrow keys. @@ -511,6 +514,17 @@ } } +void KeyboardEventManager::DefaultImeSubmitHandler(KeyboardEvent* event) { + Page* page = frame_->GetPage(); + if (!page) + return; + + if (IsSpatialNavigationEnabled(frame_) && + !frame_->GetDocument()->InDesignMode()) { + page->GetSpatialNavigationController().HandleImeSubmitKeyboardEvent(event); + } +} + static OverrideCapsLockState g_override_caps_lock_state; void KeyboardEventManager::SetCurrentCapsLockState(
diff --git a/third_party/blink/renderer/core/input/keyboard_event_manager.h b/third_party/blink/renderer/core/input/keyboard_event_manager.h index 3d9afb6f..3f1b4c4 100644 --- a/third_party/blink/renderer/core/input/keyboard_event_manager.h +++ b/third_party/blink/renderer/core/input/keyboard_event_manager.h
@@ -56,6 +56,7 @@ void DefaultTabEventHandler(KeyboardEvent*); void DefaultEscapeEventHandler(KeyboardEvent*); void DefaultEnterEventHandler(KeyboardEvent*); + void DefaultImeSubmitHandler(KeyboardEvent*); void DefaultArrowEventHandler(KeyboardEvent*, Node*); bool DefaultSpatNavBackEventHandler(KeyboardEvent*);
diff --git a/third_party/blink/renderer/core/inspector/browser_protocol.pdl b/third_party/blink/renderer/core/inspector/browser_protocol.pdl index 4233ebe..30fbd53 100644 --- a/third_party/blink/renderer/core/inspector/browser_protocol.pdl +++ b/third_party/blink/renderer/core/inspector/browser_protocol.pdl
@@ -4843,6 +4843,12 @@ # True for showing paint rectangles boolean result + # Requests that backend shows layout shift regions + command setShowLayoutShiftRegions + parameters + # True for showing layout shift regions + boolean result + # Requests that backend shows scroll bottleneck rects command setShowScrollBottleneckRects parameters
diff --git a/third_party/blink/renderer/core/inspector/inspector_overlay_agent.cc b/third_party/blink/renderer/core/inspector/inspector_overlay_agent.cc index 9f68b58..70a371f 100644 --- a/third_party/blink/renderer/core/inspector/inspector_overlay_agent.cc +++ b/third_party/blink/renderer/core/inspector/inspector_overlay_agent.cc
@@ -331,6 +331,7 @@ show_debug_borders_(&agent_state_, false), show_fps_counter_(&agent_state_, false), show_paint_rects_(&agent_state_, false), + show_layout_shift_regions_(&agent_state_, false), show_scroll_bottleneck_rects_(&agent_state_, false), show_hit_test_borders_(&agent_state_, false), show_size_on_resize_(&agent_state_, false), @@ -360,6 +361,7 @@ setShowDebugBorders(show_debug_borders_.Get()); setShowFPSCounter(show_fps_counter_.Get()); setShowPaintRects(show_paint_rects_.Get()); + setShowLayoutShiftRegions(show_layout_shift_regions_.Get()); setShowScrollBottleneckRects(show_scroll_bottleneck_rects_.Get()); setShowHitTestBorders(show_hit_test_borders_.Get()); setShowViewportSizeOnResize(show_size_on_resize_.Get()); @@ -390,6 +392,7 @@ setShowDebugBorders(false); setShowFPSCounter(false); setShowPaintRects(false); + setShowLayoutShiftRegions(false); setShowScrollBottleneckRects(false); setShowHitTestBorders(false); setShowViewportSizeOnResize(false); @@ -468,6 +471,24 @@ return Response::OK(); } +Response InspectorOverlayAgent::setShowLayoutShiftRegions(bool show) { + show_layout_shift_regions_.Set(show); + if (show) { + Response response = CompositingEnabled(); + if (!response.isSuccess()) + return response; + } + WebFrameWidget* widget = frame_impl_->LocalRoot()->FrameWidget(); + WebFrameWidgetBase* widget_impl = static_cast<WebFrameWidgetBase*>(widget); + // While a frame is being detached the inspector will shutdown and + // turn off debug overlays, but the WebFrameWidget is already gone. + if (widget_impl) + widget_impl->Client()->SetShowLayoutShiftRegions(show); + if (!show && frame_impl_->GetFrameView()) + frame_impl_->GetFrameView()->Invalidate(); + return Response::OK(); +} + Response InspectorOverlayAgent::setShowScrollBottleneckRects(bool show) { show_scroll_bottleneck_rects_.Set(show); if (show) { @@ -847,8 +868,8 @@ DEFINE_STATIC_LOCAL(Persistent<LocalFrameClient>, dummy_local_frame_client, (MakeGarbageCollected<EmptyLocalFrameClient>())); - auto* frame = MakeGarbageCollected<LocalFrame>(dummy_local_frame_client, - *overlay_page_, nullptr); + auto* frame = MakeGarbageCollected<LocalFrame>( + dummy_local_frame_client, *overlay_page_, nullptr, nullptr, nullptr); frame->SetView(MakeGarbageCollected<LocalFrameView>(*frame)); frame->Init(); frame->View()->SetCanHaveScrollbars(false); @@ -863,8 +884,8 @@ DEFINE_STATIC_LOCAL(Persistent<LocalFrameClient>, dummy_local_frame_client, (MakeGarbageCollected<EmptyLocalFrameClient>())); - auto* frame = MakeGarbageCollected<LocalFrame>(dummy_local_frame_client, - *overlay_page_, nullptr); + auto* frame = MakeGarbageCollected<LocalFrame>( + dummy_local_frame_client, *overlay_page_, nullptr, nullptr, nullptr); frame->SetView(MakeGarbageCollected<LocalFrameView>(*frame)); frame->Init(); frame->View()->SetCanHaveScrollbars(false);
diff --git a/third_party/blink/renderer/core/inspector/inspector_overlay_agent.h b/third_party/blink/renderer/core/inspector/inspector_overlay_agent.h index 37e6802..8b987be 100644 --- a/third_party/blink/renderer/core/inspector/inspector_overlay_agent.h +++ b/third_party/blink/renderer/core/inspector/inspector_overlay_agent.h
@@ -122,6 +122,7 @@ protocol::Response disable() override; protocol::Response setShowAdHighlights(bool) override; protocol::Response setShowPaintRects(bool) override; + protocol::Response setShowLayoutShiftRegions(bool) override; protocol::Response setShowDebugBorders(bool) override; protocol::Response setShowFPSCounter(bool) override; protocol::Response setShowScrollBottleneckRects(bool) override; @@ -232,6 +233,7 @@ InspectorAgentState::Boolean show_debug_borders_; InspectorAgentState::Boolean show_fps_counter_; InspectorAgentState::Boolean show_paint_rects_; + InspectorAgentState::Boolean show_layout_shift_regions_; InspectorAgentState::Boolean show_scroll_bottleneck_rects_; InspectorAgentState::Boolean show_hit_test_borders_; InspectorAgentState::Boolean show_size_on_resize_;
diff --git a/third_party/blink/renderer/core/layout/api/line_layout_block_flow.h b/third_party/blink/renderer/core/layout/api/line_layout_block_flow.h index 4b1bcadb..0bda221 100644 --- a/third_party/blink/renderer/core/layout/api/line_layout_block_flow.h +++ b/third_party/blink/renderer/core/layout/api/line_layout_block_flow.h
@@ -122,6 +122,11 @@ *ToLayoutBox(box.GetLayoutObject())); } + FloatingObject* LastPlacedFloat( + FloatingObjectSetIterator* iterator = nullptr) const { + return ToBlockFlow()->LastPlacedFloat(iterator); + } + bool PlaceNewFloats(LayoutUnit logical_top_margin_edge, LineWidth* width) { return ToBlockFlow()->PlaceNewFloats(logical_top_margin_edge, width); }
diff --git a/third_party/blink/renderer/core/layout/api/line_layout_box.h b/third_party/blink/renderer/core/layout/api/line_layout_box.h index 797958a..4d2ff29 100644 --- a/third_party/blink/renderer/core/layout/api/line_layout_box.h +++ b/third_party/blink/renderer/core/layout/api/line_layout_box.h
@@ -55,12 +55,6 @@ return ToBox()->DeprecatedFlipForWritingMode(point); } - LayoutPoint FlipForWritingModeForChild(const LineLayoutBox& child, - LayoutPoint child_point) const { - return ToBox()->FlipForWritingModeForChild( - ToLayoutBox(child.GetLayoutObject()), child_point); - } - void MoveWithEdgeOfInlineContainerIfNecessary(bool is_horizontal) { ToBox()->MoveWithEdgeOfInlineContainerIfNecessary(is_horizontal); }
diff --git a/third_party/blink/renderer/core/layout/api/line_layout_item.h b/third_party/blink/renderer/core/layout/api/line_layout_item.h index d4304f14..1ef5c956 100644 --- a/third_party/blink/renderer/core/layout/api/line_layout_item.h +++ b/third_party/blink/renderer/core/layout/api/line_layout_item.h
@@ -256,7 +256,7 @@ // TODO(dgrogan/eae): Can we change this to GlobalToLocal and vice versa // instead of having 4 methods? See localToAbsoluteQuad below. - PositionWithAffinity PositionForPoint(const LayoutPoint& point) { + PositionWithAffinity PositionForPoint(const PhysicalOffset& point) { return layout_object_->PositionForPoint(point); }
diff --git a/third_party/blink/renderer/core/layout/hit_test_result.cc b/third_party/blink/renderer/core/layout/hit_test_result.cc index c1c5eaa..b8bcc9c3a 100644 --- a/third_party/blink/renderer/core/layout/hit_test_result.cc +++ b/third_party/blink/renderer/core/layout/hit_test_result.cc
@@ -144,7 +144,7 @@ return PositionWithAffinity(MostForwardCaretPosition( Position(inner_node_, PositionAnchorType::kBeforeChildren))); } - return layout_object->PositionForPoint(FlippedLocalPoint()); + return layout_object->PositionForPoint(LocalPoint()); } LayoutObject* HitTestResult::GetLayoutObject() const { @@ -502,10 +502,4 @@ return image_map_image_element; } -LayoutPoint HitTestResult::FlippedLocalPoint() const { - if (!inner_node_ || !inner_node_->GetLayoutObject()) - return local_point_.ToLayoutPoint(); - return inner_node_->GetLayoutObject()->FlipForWritingMode(local_point_); -} - } // namespace blink
diff --git a/third_party/blink/renderer/core/layout/hit_test_result.h b/third_party/blink/renderer/core/layout/hit_test_result.h index bac556785..1ad00ef 100644 --- a/third_party/blink/renderer/core/layout/hit_test_result.h +++ b/third_party/blink/renderer/core/layout/hit_test_result.h
@@ -112,9 +112,6 @@ // The hit-tested point in the coordinates of the inner node. const PhysicalOffset& LocalPoint() const { return local_point_; } - // TODO(wangxianzhu): This is used in PositionForPoint() where we still - // expect flipped blocks coordinates. - LayoutPoint FlippedLocalPoint() const; void SetNodeAndPosition(Node* node, const PhysicalOffset& p) { local_point_ = p; SetInnerNode(node);
diff --git a/third_party/blink/renderer/core/layout/jank_tracker.cc b/third_party/blink/renderer/core/layout/jank_tracker.cc index 1fda05d..7fd9bfae 100644 --- a/third_party/blink/renderer/core/layout/jank_tracker.cc +++ b/third_party/blink/renderer/core/layout/jank_tracker.cc
@@ -15,7 +15,6 @@ #include "third_party/blink/renderer/core/layout/layout_view.h" #include "third_party/blink/renderer/core/page/chrome_client.h" #include "third_party/blink/renderer/core/page/page.h" -#include "third_party/blink/renderer/core/paint/paint_layer.h" #include "third_party/blink/renderer/core/timing/dom_window_performance.h" #include "third_party/blink/renderer/core/timing/performance_entry.h" #include "third_party/blink/renderer/core/timing/window_performance.h" @@ -71,7 +70,8 @@ rect.Height() * granularity_scale < 0.5; } -static const PropertyTreeState PropertyTreeStateFor(LayoutObject& object) { +static const PropertyTreeState PropertyTreeStateFor( + const LayoutObject& object) { return object.FirstFragment().LocalBorderBoxProperties(); } @@ -119,7 +119,7 @@ observed_input_or_scroll_(false) {} void JankTracker::AccumulateJank(const LayoutObject& source, - const PaintLayer& painting_layer, + const PropertyTreeState& property_tree_state, FloatRect old_rect, FloatRect new_rect) { if (old_rect.IsEmpty() || new_rect.IsEmpty()) @@ -149,21 +149,19 @@ if (source.IsSVG()) return; - const auto local_state = - PropertyTreeStateFor(painting_layer.GetLayoutObject()); const auto root_state = PropertyTreeStateFor(*source.View()); FloatClipRect clip_rect = - GeometryMapper::LocalToAncestorClipRect(local_state, root_state); + GeometryMapper::LocalToAncestorClipRect(property_tree_state, root_state); // If the clip region is empty, then the resulting layout shift isn't visible // in the viewport so ignore it. if (!clip_rect.IsInfinite() && clip_rect.Rect().IsEmpty()) return; - GeometryMapper::SourceToDestinationRect(local_state.Transform(), + GeometryMapper::SourceToDestinationRect(property_tree_state.Transform(), root_state.Transform(), old_rect); - GeometryMapper::SourceToDestinationRect(local_state.Transform(), + GeometryMapper::SourceToDestinationRect(property_tree_state.Transform(), root_state.Transform(), new_rect); FloatRect clipped_old_rect(old_rect), clipped_new_rect(new_rect); @@ -209,24 +207,25 @@ } } -void JankTracker::NotifyObjectPrePaint(const LayoutObject& object, - const IntRect& old_visual_rect, - const PaintLayer& painting_layer) { +void JankTracker::NotifyObjectPrePaint( + const LayoutObject& object, + const PropertyTreeState& property_tree_state, + const IntRect& old_visual_rect, + const IntRect& new_visual_rect) { if (!IsActive()) return; - AccumulateJank(object, painting_layer, FloatRect(old_visual_rect), - FloatRect(object.FirstFragment().VisualRect())); + AccumulateJank(object, property_tree_state, FloatRect(old_visual_rect), + FloatRect(new_visual_rect)); } -void JankTracker::NotifyCompositedLayerMoved(const PaintLayer& paint_layer, +void JankTracker::NotifyCompositedLayerMoved(const LayoutObject& layout_object, FloatRect old_layer_rect, FloatRect new_layer_rect) { if (!IsActive()) return; // Make sure we can access a transform node. - LayoutObject& layout_object = paint_layer.GetLayoutObject(); if (!layout_object.FirstFragment().HasLocalBorderBoxProperties()) return; @@ -236,7 +235,8 @@ old_layer_rect.MoveBy(transform_parent_offset); new_layer_rect.MoveBy(transform_parent_offset); - AccumulateJank(layout_object, paint_layer, old_layer_rect, new_layer_rect); + AccumulateJank(layout_object, PropertyTreeStateFor(layout_object), + old_layer_rect, new_layer_rect); } double JankTracker::SubframeWeightingFactor() const {
diff --git a/third_party/blink/renderer/core/layout/jank_tracker.h b/third_party/blink/renderer/core/layout/jank_tracker.h index 92e30ff..92c9885 100644 --- a/third_party/blink/renderer/core/layout/jank_tracker.h +++ b/third_party/blink/renderer/core/layout/jank_tracker.h
@@ -17,7 +17,7 @@ class IntRect; class LayoutObject; class LocalFrameView; -class PaintLayer; +class PropertyTreeState; class TracedValue; class WebInputEvent; @@ -30,9 +30,10 @@ JankTracker(LocalFrameView*); ~JankTracker() {} void NotifyObjectPrePaint(const LayoutObject& object, + const PropertyTreeState& property_tree_state, const IntRect& old_visual_rect, - const PaintLayer& painting_layer); - void NotifyCompositedLayerMoved(const PaintLayer&, + const IntRect& new_visual_rect); + void NotifyCompositedLayerMoved(const LayoutObject& object, FloatRect old_layer_rect, FloatRect new_layer_rect); void NotifyPrePaintFinished(); @@ -48,7 +49,7 @@ private: void AccumulateJank(const LayoutObject&, - const PaintLayer&, + const PropertyTreeState&, FloatRect old_rect, FloatRect new_rect); void TimerFired(TimerBase*) {}
diff --git a/third_party/blink/renderer/core/layout/jank_tracker_test.cc b/third_party/blink/renderer/core/layout/jank_tracker_test.cc index 78959ec..b31c65c 100644 --- a/third_party/blink/renderer/core/layout/jank_tracker_test.cc +++ b/third_party/blink/renderer/core/layout/jank_tracker_test.cc
@@ -366,6 +366,32 @@ EXPECT_FLOAT_EQ(0.25, GetJankTracker().Score()); } +TEST_F(JankTrackerTest, ClipWithoutPaintLayer) { + SetBodyInnerHTML(R"HTML( + <style> + #scroller { overflow: scroll; width: 200px; height: 500px; } + #space { height: 1000px; margin-bottom: -500px; } + #j { width: 150px; height: 150px; background: yellow; } + </style> + <div id='scroller'> + <div id='space'></div> + <div id='j'></div> + </div> + )HTML"); + + // Increase j's top margin by 100px. Since j is clipped by the scroller, this + // should not generate jank. However, due to the issue in crbug/971639, this + // case was erroneously reported as janking, before that bug was fixed. This + // test ensures we do not regress this behavior. + GetDocument().getElementById("j")->setAttribute( + html_names::kStyleAttr, AtomicString("margin-top: 100px")); + + UpdateAllLifecyclePhases(); + // Make sure no jank score is reported, since the element that moved is fully + // clipped by the scroller. + EXPECT_FLOAT_EQ(0.0, GetJankTracker().Score()); +} + class JankTrackerSimTest : public SimTest {}; TEST_F(JankTrackerSimTest, SubframeWeighting) {
diff --git a/third_party/blink/renderer/core/layout/layout_block.cc b/third_party/blink/renderer/core/layout/layout_block.cc index 476b84d..4febfcd 100644 --- a/third_party/blink/renderer/core/layout/layout_block.cc +++ b/third_party/blink/renderer/core/layout/layout_block.cc
@@ -1310,15 +1310,13 @@ // prevent crossing editable boundaries. This would require many tests. PositionWithAffinity LayoutBlock::PositionForPointRespectingEditingBoundaries( LineLayoutBox child, - const LayoutPoint& point_in_parent_coordinates) const { - LayoutPoint child_location = child.Location(); + const PhysicalOffset& point_in_parent_coordinates) const { + PhysicalOffset child_location = child.PhysicalLocation(); if (child.IsInFlowPositioned()) - child_location += child.OffsetForInFlowPosition().ToLayoutPoint(); + child_location += child.OffsetForInFlowPosition(); - // FIXME: This is wrong if the child's writing-mode is different from the - // parent's. - LayoutPoint point_in_child_coordinates( - ToLayoutPoint(point_in_parent_coordinates - child_location)); + PhysicalOffset point_in_child_coordinates = + point_in_parent_coordinates - child_location; // If this is an anonymous layoutObject, we just recur normally const Node* child_node = child.NonPseudoNode(); @@ -1341,8 +1339,8 @@ // to the logical left or logical right of the child LayoutUnit child_middle = LogicalWidthForChildSize(child.Size()) / 2; LayoutUnit logical_left = IsHorizontalWritingMode() - ? point_in_child_coordinates.X() - : point_in_child_coordinates.Y(); + ? point_in_child_coordinates.left + : point_in_child_coordinates.top; if (logical_left < child_middle) return ancestor->CreatePositionWithAffinity(child_node->NodeIndex()); return ancestor->CreatePositionWithAffinity(child_node->NodeIndex() + 1, @@ -1350,27 +1348,18 @@ } PositionWithAffinity LayoutBlock::PositionForPointIfOutsideAtomicInlineLevel( - const LayoutPoint& point) const { + const PhysicalOffset& point) const { DCHECK(IsAtomicInlineLevel()); - // FIXME: This seems wrong when the object's writing-mode doesn't match the - // line's writing-mode. - LayoutUnit point_logical_left = - IsHorizontalWritingMode() ? point.X() : point.Y(); - LayoutUnit point_logical_top = - IsHorizontalWritingMode() ? point.Y() : point.X(); - - const bool is_ltr = IsLtr(ResolvedDirection()); - if (point_logical_left < 0) { - return CreatePositionWithAffinity(is_ltr ? CaretMinOffset() - : CaretMaxOffset()); - } - if (point_logical_left >= LogicalWidth()) { - return CreatePositionWithAffinity(is_ltr ? CaretMaxOffset() - : CaretMinOffset()); - } - if (point_logical_top < 0) + LogicalOffset logical_offset = + point.ConvertToLogical(StyleRef().GetWritingMode(), ResolvedDirection(), + PhysicalSize(Size()), PhysicalSize()); + if (logical_offset.inline_offset < 0) return CreatePositionWithAffinity(CaretMinOffset()); - if (point_logical_top >= LogicalHeight()) + if (logical_offset.inline_offset >= LogicalWidth()) + return CreatePositionWithAffinity(CaretMaxOffset()); + if (logical_offset.block_offset < 0) + return CreatePositionWithAffinity(CaretMinOffset()); + if (logical_offset.block_offset >= LogicalHeight()) return CreatePositionWithAffinity(CaretMaxOffset()); return PositionWithAffinity(); } @@ -1382,7 +1371,7 @@ } PositionWithAffinity LayoutBlock::PositionForPoint( - const LayoutPoint& point) const { + const PhysicalOffset& point) const { if (IsTable()) return LayoutBox::PositionForPoint(point); @@ -1393,9 +1382,9 @@ return position; } - LayoutPoint point_in_contents = point; + PhysicalOffset point_in_contents = point; OffsetForContents(point_in_contents); - LayoutPoint point_in_logical_contents(point_in_contents); + LayoutPoint point_in_logical_contents = FlipForWritingMode(point_in_contents); if (!IsHorizontalWritingMode()) point_in_logical_contents = point_in_logical_contents.TransposedPoint(); @@ -1436,15 +1425,6 @@ return LayoutBox::PositionForPoint(point); } -void LayoutBlock::OffsetForContents(LayoutPoint& offset) const { - offset = DeprecatedFlipForWritingMode(offset); - - if (HasOverflowClip()) - offset += LayoutSize(ScrolledContentOffset()); - - offset = DeprecatedFlipForWritingMode(offset); -} - void LayoutBlock::OffsetForContents(PhysicalOffset& offset) const { if (HasOverflowClip()) offset += PhysicalOffset(ScrolledContentOffset());
diff --git a/third_party/blink/renderer/core/layout/layout_block.h b/third_party/blink/renderer/core/layout/layout_block.h index 42b4f4d..a549156 100644 --- a/third_party/blink/renderer/core/layout/layout_block.h +++ b/third_party/blink/renderer/core/layout/layout_block.h
@@ -218,7 +218,7 @@ LayoutUnit TextIndentOffset() const; - PositionWithAffinity PositionForPoint(const LayoutPoint&) const override; + PositionWithAffinity PositionForPoint(const PhysicalOffset&) const override; static LayoutBlock* CreateAnonymousWithParentAndDisplay( const LayoutObject*, @@ -546,9 +546,9 @@ PositionWithAffinity PositionForPointRespectingEditingBoundaries( LineLayoutBox child, - const LayoutPoint& point_in_parent_coordinates) const; + const PhysicalOffset& point_in_parent_coordinates) const; PositionWithAffinity PositionForPointIfOutsideAtomicInlineLevel( - const LayoutPoint&) const; + const PhysicalOffset&) const; virtual bool UpdateLogicalWidthAndColumnWidth();
diff --git a/third_party/blink/renderer/core/layout/layout_block_flow.cc b/third_party/blink/renderer/core/layout/layout_block_flow.cc index ad4c52d..1ca9ecc 100644 --- a/third_party/blink/renderer/core/layout/layout_block_flow.cc +++ b/third_party/blink/renderer/core/layout/layout_block_flow.cc
@@ -2647,6 +2647,12 @@ floating_objects_->ClearLineBoxTreePointers(); line_boxes_.DeleteLineBoxTree(); + + // This function is called when children are moved to different parent. Clear + // NGPaintFragment now, because clearing NGPaintFragment clears associations + // between LayoutObject and NGPaintFragment. It needs to happen before moved + // children are laid out and associated. + SetPaintFragment(nullptr, nullptr); } int LayoutBlockFlow::LineCount( @@ -3798,6 +3804,26 @@ } } +FloatingObject* LayoutBlockFlow::LastPlacedFloat( + FloatingObjectSetIterator* iterator) const { + const FloatingObjectSet& floating_object_set = floating_objects_->Set(); + FloatingObjectSetIterator it = floating_object_set.end(); + --it; // Go to last item. + FloatingObjectSetIterator begin = floating_object_set.begin(); + FloatingObject* last_placed_floating_object = nullptr; + while (it != begin) { + --it; + if ((*it)->IsPlaced()) { + last_placed_floating_object = it->get(); + ++it; + break; + } + } + if (iterator) + *iterator = it; + return last_placed_floating_object; +} + bool LayoutBlockFlow::PlaceNewFloats(LayoutUnit logical_top_margin_edge, LineWidth* width) { if (!floating_objects_) @@ -3814,18 +3840,8 @@ // Move backwards through our floating object list until we find a float that // has already been positioned. Then we'll be able to move forward, // positioning all of the new floats that need it. - FloatingObjectSetIterator it = floating_object_set.end(); - --it; // Go to last item. - FloatingObjectSetIterator begin = floating_object_set.begin(); - FloatingObject* last_placed_floating_object = nullptr; - while (it != begin) { - --it; - if ((*it)->IsPlaced()) { - last_placed_floating_object = it->get(); - ++it; - break; - } - } + FloatingObjectSetIterator it; + FloatingObject* last_placed_floating_object = LastPlacedFloat(&it); // The float cannot start above the top position of the last positioned float. if (last_placed_floating_object) { @@ -4613,7 +4629,7 @@ } PositionWithAffinity LayoutBlockFlow::PositionForPoint( - const LayoutPoint& point) const { + const PhysicalOffset& point) const { if (IsAtomicInlineLevel()) { PositionWithAffinity position = PositionForPointIfOutsideAtomicInlineLevel(point); @@ -4623,9 +4639,9 @@ if (!ChildrenInline()) return LayoutBlock::PositionForPoint(point); - LayoutPoint point_in_contents = point; + PhysicalOffset point_in_contents = point; OffsetForContents(point_in_contents); - LayoutPoint point_in_logical_contents(point_in_contents); + LayoutPoint point_in_logical_contents = FlipForWritingMode(point_in_contents); if (!IsHorizontalWritingMode()) point_in_logical_contents = point_in_logical_contents.TransposedPoint(); @@ -4720,7 +4736,8 @@ if (!IsHorizontalWritingMode()) point = point.TransposedPoint(); return PositionForPointRespectingEditingBoundaries( - LineLayoutBox(closest_box->GetLineLayoutItem()), point); + LineLayoutBox(closest_box->GetLineLayoutItem()), + FlipForWritingMode(point)); } // pass the box a top position that is inside it @@ -4728,7 +4745,8 @@ closest_box->Root().BlockDirectionPointInLine()); if (!IsHorizontalWritingMode()) point = point.TransposedPoint(); - return closest_box->GetLineLayoutItem().PositionForPoint(point); + return closest_box->GetLineLayoutItem().PositionForPoint( + FlipForWritingMode(point)); } if (last_root_box_with_children) {
diff --git a/third_party/blink/renderer/core/layout/layout_block_flow.h b/third_party/blink/renderer/core/layout/layout_block_flow.h index c00fd3f1..9ae466b 100644 --- a/third_party/blink/renderer/core/layout/layout_block_flow.h +++ b/third_party/blink/renderer/core/layout/layout_block_flow.h
@@ -392,6 +392,11 @@ FloatingObject* InsertFloatingObject(LayoutBox&); + // Return the last placed float. If |iterator| is non-null, it will be set to + // the float right after said float. + FloatingObject* LastPlacedFloat( + FloatingObjectSetIterator* iterator = nullptr) const; + // Position and lay out all floats that have not yet been positioned. // // This will mark them as "placed", which means that they have found their @@ -424,7 +429,7 @@ bool RecalcInlineChildrenLayoutOverflow(); void RecalcInlineChildrenVisualOverflow(); - PositionWithAffinity PositionForPoint(const LayoutPoint&) const override; + PositionWithAffinity PositionForPoint(const PhysicalOffset&) const override; LayoutUnit LowestFloatLogicalBottom(EClear = EClear::kBoth) const;
diff --git a/third_party/blink/renderer/core/layout/layout_box.cc b/third_party/blink/renderer/core/layout/layout_box.cc index c5c3f81..8588667 100644 --- a/third_party/blink/renderer/core/layout/layout_box.cc +++ b/third_party/blink/renderer/core/layout/layout_box.cc
@@ -130,12 +130,7 @@ SetIsHTMLLegendElement(); } -LayoutBox::~LayoutBox() { -#if DCHECK_IS_ON() - if (IsInLayoutNGInlineFormattingContext()) - DCHECK(!first_paint_fragment_); -#endif -} +LayoutBox::~LayoutBox() = default; PaintLayerType LayoutBox::LayerTypeRequired() const { // hasAutoZIndex only returns true if the element is positioned or a flex-item @@ -167,6 +162,11 @@ ShapeOutsideInfo::RemoveInfo(*this); + if (!DocumentBeingDestroyed()) { + if (NGPaintFragment* first_inline_fragment = FirstInlineFragment()) + first_inline_fragment->LayoutObjectWillBeDestroyed(); + } + LayoutBoxModelObject::WillBeDestroyed(); } @@ -2274,9 +2274,7 @@ } void LayoutBox::DirtyLineBoxes(bool full_layout) { - if (IsInLayoutNGInlineFormattingContext()) { - SetFirstInlineFragment(nullptr); - } else if (inline_box_wrapper_) { + if (!IsInLayoutNGInlineFormattingContext() && inline_box_wrapper_) { if (full_layout) { inline_box_wrapper_->Destroy(); inline_box_wrapper_ = nullptr; @@ -2539,9 +2537,7 @@ } void LayoutBox::DeleteLineBoxWrapper() { - if (IsInLayoutNGInlineFormattingContext()) { - SetFirstInlineFragment(nullptr); - } else if (inline_box_wrapper_) { + if (!IsInLayoutNGInlineFormattingContext() && inline_box_wrapper_) { if (!DocumentBeingDestroyed()) inline_box_wrapper_->Remove(); inline_box_wrapper_->Destroy(); @@ -5223,7 +5219,7 @@ } PositionWithAffinity LayoutBox::PositionForPoint( - const LayoutPoint& point) const { + const PhysicalOffset& point) const { // no children...return this layout object's element, if there is one, and // offset 0 LayoutObject* first_child = SlowFirstChild(); @@ -5234,12 +5230,10 @@ if (IsTable() && NonPseudoNode()) { const Node& node = *NonPseudoNode(); - LayoutUnit right = Size().Width() - VerticalScrollbarWidth(); - LayoutUnit bottom = Size().Height() - HorizontalScrollbarHeight(); - - if (point.X() < 0 || point.X() > right || point.Y() < 0 || - point.Y() > bottom) { - if (point.X() <= right / 2) { + LayoutUnit x_in_block_direction = FlipForWritingMode(point.left); + if (x_in_block_direction < 0 || x_in_block_direction > Size().Width() || + point.top < 0 || point.top > Size().Height()) { + if (x_in_block_direction <= Size().Width() / 2) { return CreatePositionWithAffinity(FirstPositionInOrBeforeNode(node)); } return CreatePositionWithAffinity(LastPositionInOrAfterNode(node)); @@ -5249,9 +5243,9 @@ // Pass off to the closest child. LayoutUnit min_dist = LayoutUnit::Max(); LayoutBox* closest_layout_object = nullptr; - LayoutPoint adjusted_point = point; + PhysicalOffset adjusted_point = point; if (IsTableRow()) - adjusted_point.MoveBy(Location()); + adjusted_point += PhysicalLocation(); for (LayoutObject* layout_object = first_child; layout_object; layout_object = layout_object->NextSibling()) { @@ -5270,55 +5264,58 @@ LayoutUnit bottom = top + layout_box->ContentHeight(); LayoutUnit left = layout_box->BorderLeft() + layout_box->PaddingLeft() + - (IsTableRow() ? LayoutUnit() : layout_box->Location().X()); + (IsTableRow() ? LayoutUnit() : layout_box->PhysicalLocation().left); LayoutUnit right = left + layout_box->ContentWidth(); - if (point.X() <= right && point.X() >= left && point.Y() <= top && - point.Y() >= bottom) { - if (layout_box->IsTableRow()) + if (point.left <= right && point.left >= left && point.top <= top && + point.top >= bottom) { + if (layout_box->IsTableRow()) { return layout_box->PositionForPoint(point + adjusted_point - - layout_box->LocationOffset()); - return layout_box->PositionForPoint(point - layout_box->LocationOffset()); + layout_box->PhysicalLocation()); + } + return layout_box->PositionForPoint(point - + layout_box->PhysicalLocation()); } // Find the distance from (x, y) to the box. Split the space around the box // into 8 pieces and use a different compare depending on which piece (x, y) // is in. - LayoutPoint cmp; - if (point.X() > right) { - if (point.Y() < top) - cmp = LayoutPoint(right, top); - else if (point.Y() > bottom) - cmp = LayoutPoint(right, bottom); + PhysicalOffset cmp; + if (point.left > right) { + if (point.top < top) + cmp = PhysicalOffset(right, top); + else if (point.top > bottom) + cmp = PhysicalOffset(right, bottom); else - cmp = LayoutPoint(right, point.Y()); - } else if (point.X() < left) { - if (point.Y() < top) - cmp = LayoutPoint(left, top); - else if (point.Y() > bottom) - cmp = LayoutPoint(left, bottom); + cmp = PhysicalOffset(right, point.top); + } else if (point.left < left) { + if (point.top < top) + cmp = PhysicalOffset(left, top); + else if (point.top > bottom) + cmp = PhysicalOffset(left, bottom); else - cmp = LayoutPoint(left, point.Y()); + cmp = PhysicalOffset(left, point.top); } else { - if (point.Y() < top) - cmp = LayoutPoint(point.X(), top); + if (point.top < top) + cmp = PhysicalOffset(point.left, top); else - cmp = LayoutPoint(point.X(), bottom); + cmp = PhysicalOffset(point.left, bottom); } - LayoutSize difference = cmp - point; + PhysicalOffset difference = cmp - point; - LayoutUnit dist = difference.Width() * difference.Width() + - difference.Height() * difference.Height(); + LayoutUnit dist = + difference.left * difference.left + difference.top * difference.top; if (dist < min_dist) { closest_layout_object = layout_box; min_dist = dist; } } - if (closest_layout_object) + if (closest_layout_object) { return closest_layout_object->PositionForPoint( - adjusted_point - closest_layout_object->LocationOffset()); + adjusted_point - closest_layout_object->PhysicalLocation()); + } return CreatePositionWithAffinity( NonPseudoNode() ? FirstPositionInOrBeforeNode(*NonPseudoNode()) : Position()); @@ -5879,19 +5876,6 @@ return OffsetPoint(parent).top; } -LayoutPoint LayoutBox::FlipForWritingModeForChild( - const LayoutBox* child, - const LayoutPoint& point) const { - if (!StyleRef().IsFlippedBlocksWritingMode()) - return point; - - // The child is going to add in its x(), so we have to make sure it ends up in - // the right place. - return LayoutPoint(point.X() + Size().Width() - child->Size().Width() - - (2 * child->Location().X()), - point.Y()); -} - LayoutBox* LayoutBox::LocationContainer() const { // Location of a non-root SVG object derived from LayoutBox should not be // affected by writing-mode of the containing box (SVGRoot). @@ -5914,10 +5898,14 @@ } else { container_box = LocationContainer(); } - if (!container_box) + if (!container_box || !container_box->HasFlippedBlocksWritingMode()) return PhysicalOffset(Location()); + + // The child is going to add in its x(), so we have to make sure it ends up in + // the right place. return PhysicalOffset( - container_box->FlipForWritingModeForChild(this, Location())); + container_box->Size().Width() - Size().Width() - Location().X(), + Location().Y()); } bool LayoutBox::HasRelativeLogicalWidth() const {
diff --git a/third_party/blink/renderer/core/layout/layout_box.h b/third_party/blink/renderer/core/layout/layout_box.h index 391c62c..8f02ac4 100644 --- a/third_party/blink/renderer/core/layout/layout_box.h +++ b/third_party/blink/renderer/core/layout/layout_box.h
@@ -1232,7 +1232,7 @@ void LogicalExtentAfterUpdatingLogicalWidth(const LayoutUnit& logical_top, LogicalExtentComputedValues&); - PositionWithAffinity PositionForPoint(const LayoutPoint&) const override; + PositionWithAffinity PositionForPoint(const PhysicalOffset&) const override; void RemoveFloatingOrPositionedChildFromBlockLists(); @@ -1305,11 +1305,6 @@ LayoutUnit OffsetLeft(const Element*) const final; LayoutUnit OffsetTop(const Element*) const final; - // TODO(wangxianzhu): This should be also type-safe. Will do when converting - // hit testing geometry to use physical geometry types. - LayoutPoint FlipForWritingModeForChild(const LayoutBox* child, - const LayoutPoint&) const; - WARN_UNUSED_RESULT LayoutUnit FlipForWritingMode(LayoutUnit position, LayoutUnit width = LayoutUnit()) const {
diff --git a/third_party/blink/renderer/core/layout/layout_br.cc b/third_party/blink/renderer/core/layout/layout_br.cc index 094d44a8..c96e4cd 100644 --- a/third_party/blink/renderer/core/layout/layout_br.cc +++ b/third_party/blink/renderer/core/layout/layout_br.cc
@@ -56,7 +56,7 @@ return 1; } -PositionWithAffinity LayoutBR::PositionForPoint(const LayoutPoint&) const { +PositionWithAffinity LayoutBR::PositionForPoint(const PhysicalOffset&) const { return CreatePositionWithAffinity(0); }
diff --git a/third_party/blink/renderer/core/layout/layout_br.h b/third_party/blink/renderer/core/layout/layout_br.h index de9a9b93..1cf6f774 100644 --- a/third_party/blink/renderer/core/layout/layout_br.h +++ b/third_party/blink/renderer/core/layout/layout_br.h
@@ -68,7 +68,7 @@ int CaretMinOffset() const override; int CaretMaxOffset() const override; - PositionWithAffinity PositionForPoint(const LayoutPoint&) const final; + PositionWithAffinity PositionForPoint(const PhysicalOffset&) const final; Position PositionForCaretOffset(unsigned) const final; base::Optional<unsigned> CaretOffsetForPosition(const Position&) const final;
diff --git a/third_party/blink/renderer/core/layout/layout_file_upload_control.cc b/third_party/blink/renderer/core/layout/layout_file_upload_control.cc index f2786b5..3c4467b2 100644 --- a/third_party/blink/renderer/core/layout/layout_file_upload_control.cc +++ b/third_party/blink/renderer/core/layout/layout_file_upload_control.cc
@@ -153,7 +153,7 @@ } PositionWithAffinity LayoutFileUploadControl::PositionForPoint( - const LayoutPoint&) const { + const PhysicalOffset&) const { return PositionWithAffinity(); }
diff --git a/third_party/blink/renderer/core/layout/layout_file_upload_control.h b/third_party/blink/renderer/core/layout/layout_file_upload_control.h index 5232c77..bdd8d843 100644 --- a/third_party/blink/renderer/core/layout/layout_file_upload_control.h +++ b/third_party/blink/renderer/core/layout/layout_file_upload_control.h
@@ -70,7 +70,7 @@ int MaxFilenameWidth() const; - PositionWithAffinity PositionForPoint(const LayoutPoint&) const override; + PositionWithAffinity PositionForPoint(const PhysicalOffset&) const override; bool can_receive_dropped_files_; };
diff --git a/third_party/blink/renderer/core/layout/layout_inline.cc b/third_party/blink/renderer/core/layout/layout_inline.cc index 3ed1eba..bf04a3df 100644 --- a/third_party/blink/renderer/core/layout/layout_inline.cc +++ b/third_party/blink/renderer/core/layout/layout_inline.cc
@@ -91,9 +91,7 @@ LayoutInline::~LayoutInline() { #if DCHECK_IS_ON() - if (IsInLayoutNGInlineFormattingContext()) - DCHECK(!first_paint_fragment_); - else + if (!IsInLayoutNGInlineFormattingContext()) line_boxes_.AssertIsEmpty(); #endif } @@ -132,8 +130,11 @@ for (InlineFlowBox* box : *LineBoxes()) box->Remove(); } - } else if (Parent()) { - Parent()->DirtyLinesFromChangedChild(this); + } else { + if (NGPaintFragment* first_inline_fragment = FirstInlineFragment()) + first_inline_fragment->LayoutObjectWillBeDestroyed(); + if (Parent()) + Parent()->DirtyLinesFromChangedChild(this); } } @@ -143,9 +144,7 @@ } void LayoutInline::DeleteLineBoxes() { - if (IsInLayoutNGInlineFormattingContext()) - SetFirstInlineFragment(nullptr); - else + if (!IsInLayoutNGInlineFormattingContext()) MutableLineBoxes()->DeleteLineBoxes(); } @@ -1104,7 +1103,7 @@ } PositionWithAffinity LayoutInline::PositionForPoint( - const LayoutPoint& point) const { + const PhysicalOffset& point) const { // FIXME: Does not deal with relative positioned inlines (should it?) // If there are continuations, test them first because our containing block
diff --git a/third_party/blink/renderer/core/layout/layout_inline.h b/third_party/blink/renderer/core/layout/layout_inline.h index 1e1a2bb7..2219dc13 100644 --- a/third_party/blink/renderer/core/layout/layout_inline.h +++ b/third_party/blink/renderer/core/layout/layout_inline.h
@@ -358,7 +358,7 @@ TransformState&, VisualRectFlags = kDefaultVisualRectFlags) const final; - PositionWithAffinity PositionForPoint(const LayoutPoint&) const override; + PositionWithAffinity PositionForPoint(const PhysicalOffset&) const override; IntRect BorderBoundingBox() const final { IntRect bounding_box = EnclosingIntRect(PhysicalLinesBoundingBox());
diff --git a/third_party/blink/renderer/core/layout/layout_multi_column_set.cc b/third_party/blink/renderer/core/layout/layout_multi_column_set.cc index b17a217..e351e069 100644 --- a/third_party/blink/renderer/core/layout/layout_multi_column_set.cc +++ b/third_party/blink/renderer/core/layout/layout_multi_column_set.cc
@@ -475,15 +475,17 @@ } PositionWithAffinity LayoutMultiColumnSet::PositionForPoint( - const LayoutPoint& point) const { + const PhysicalOffset& point) const { + LayoutPoint flipped_point = FlipForWritingMode(point); // Convert the visual point to a flow thread point. const MultiColumnFragmentainerGroup& row = - FragmentainerGroupAtVisualPoint(point); + FragmentainerGroupAtVisualPoint(flipped_point); LayoutPoint flow_thread_point = row.VisualPointToFlowThreadPoint( - point + row.OffsetFromColumnSet(), + flipped_point + row.OffsetFromColumnSet(), MultiColumnFragmentainerGroup::kSnapToColumn); // Then drill into the flow thread, where we'll find the actual content. - return FlowThread()->PositionForPoint(flow_thread_point); + return FlowThread()->PositionForPoint( + FlowThread()->FlipForWritingMode(flow_thread_point)); } LayoutUnit LayoutMultiColumnSet::ColumnGap() const {
diff --git a/third_party/blink/renderer/core/layout/layout_multi_column_set.h b/third_party/blink/renderer/core/layout/layout_multi_column_set.h index 505e0bf..ed5ed54 100644 --- a/third_party/blink/renderer/core/layout/layout_multi_column_set.h +++ b/third_party/blink/renderer/core/layout/layout_multi_column_set.h
@@ -250,7 +250,7 @@ void ComputeLogicalHeight(LayoutUnit logical_height, LayoutUnit logical_top, LogicalExtentComputedValues&) const override; - PositionWithAffinity PositionForPoint(const LayoutPoint&) const override; + PositionWithAffinity PositionForPoint(const PhysicalOffset&) const override; void PaintObject(const PaintInfo&, const PhysicalOffset& paint_offset) const override;
diff --git a/third_party/blink/renderer/core/layout/layout_object.cc b/third_party/blink/renderer/core/layout/layout_object.cc index 844b4192..45a2cad4 100644 --- a/third_party/blink/renderer/core/layout/layout_object.cc +++ b/third_party/blink/renderer/core/layout/layout_object.cc
@@ -3273,7 +3273,8 @@ delete this; } -PositionWithAffinity LayoutObject::PositionForPoint(const LayoutPoint&) const { +PositionWithAffinity LayoutObject::PositionForPoint( + const PhysicalOffset&) const { return CreatePositionWithAffinity(CaretMinOffset()); }
diff --git a/third_party/blink/renderer/core/layout/layout_object.h b/third_party/blink/renderer/core/layout/layout_object.h index 0304386..c812777a 100644 --- a/third_party/blink/renderer/core/layout/layout_object.h +++ b/third_party/blink/renderer/core/layout/layout_object.h
@@ -1462,7 +1462,7 @@ const PhysicalOffset& accumulated_offset, HitTestAction); - virtual PositionWithAffinity PositionForPoint(const LayoutPoint&) const; + virtual PositionWithAffinity PositionForPoint(const PhysicalOffset&) const; PositionWithAffinity CreatePositionWithAffinity(int offset, TextAffinity) const; PositionWithAffinity CreatePositionWithAffinity(int offset) const;
diff --git a/third_party/blink/renderer/core/layout/layout_object_child_list.cc b/third_party/blink/renderer/core/layout/layout_object_child_list.cc index 1e3b8cf8..fb9db0a5 100644 --- a/third_party/blink/renderer/core/layout/layout_object_child_list.cc +++ b/third_party/blink/renderer/core/layout/layout_object_child_list.cc
@@ -31,6 +31,7 @@ #include "third_party/blink/renderer/core/layout/layout_inline.h" #include "third_party/blink/renderer/core/layout/layout_object.h" #include "third_party/blink/renderer/core/layout/layout_view.h" +#include "third_party/blink/renderer/core/paint/ng/ng_paint_fragment.h" #include "third_party/blink/renderer/core/paint/object_paint_invalidator.h" namespace blink { @@ -45,15 +46,8 @@ DCHECK(object->IsInLayoutNGInlineFormattingContext()); if (auto* layout_text = ToLayoutTextOrNull(object)) { - layout_text->SetFirstInlineFragment(nullptr); layout_text->InvalidateInlineItems(); - layout_text->SetIsInLayoutNGInlineFormattingContext(false); - return; - } - - if (auto* layout_inline = ToLayoutInlineOrNull(object)) { - layout_inline->SetFirstInlineFragment(nullptr); - + } else if (auto* layout_inline = ToLayoutInlineOrNull(object)) { // In some cases, only top-level objects are moved, when |SplitFlow()| moves // subtree, or when moving without |notify_layout_object|. Ensure to // invalidate all descendants in this inline formatting context. @@ -62,11 +56,14 @@ if (child->IsInLayoutNGInlineFormattingContext()) InvalidateInlineItems(child); } - layout_inline->SetIsInLayoutNGInlineFormattingContext(false); - return; } - object->SetFirstInlineFragment(nullptr); + if (NGPaintFragment* fragment = object->FirstInlineFragment()) { + // This LayoutObject is not technically destroyed, but further access should + // be prohibited when moved to different parent as if it were destroyed. + fragment->LayoutObjectWillBeDestroyed(); + object->SetFirstInlineFragment(nullptr); + } object->SetIsInLayoutNGInlineFormattingContext(false); }
diff --git a/third_party/blink/renderer/core/layout/layout_replaced.cc b/third_party/blink/renderer/core/layout/layout_replaced.cc index 0117955..ca21903 100644 --- a/third_party/blink/renderer/core/layout/layout_replaced.cc +++ b/third_party/blink/renderer/core/layout/layout_replaced.cc
@@ -955,17 +955,19 @@ } PositionWithAffinity LayoutReplaced::PositionForPoint( - const LayoutPoint& point) const { + const PhysicalOffset& point) const { LayoutUnit top; LayoutUnit bottom; std::tie(top, bottom) = SelectionTopAndBottom(*this); + LayoutPoint flipped_point_in_container = + LocationContainer()->FlipForWritingMode(point + PhysicalLocation()); LayoutUnit block_direction_position = IsHorizontalWritingMode() - ? point.Y() + Location().Y() - : point.X() + Location().X(); + ? flipped_point_in_container.Y() + : flipped_point_in_container.X(); LayoutUnit line_direction_position = IsHorizontalWritingMode() - ? point.X() + Location().X() - : point.Y() + Location().Y(); + ? flipped_point_in_container.X() + : flipped_point_in_container.Y(); if (block_direction_position < top) return CreatePositionWithAffinity(
diff --git a/third_party/blink/renderer/core/layout/layout_replaced.h b/third_party/blink/renderer/core/layout/layout_replaced.h index 8ced526..979a86e0c 100644 --- a/third_party/blink/renderer/core/layout/layout_replaced.h +++ b/third_party/blink/renderer/core/layout/layout_replaced.h
@@ -139,7 +139,7 @@ // CSS properties like 'zoom' or 'image-orientation'. virtual void IntrinsicSizeChanged(); - PositionWithAffinity PositionForPoint(const LayoutPoint&) const override; + PositionWithAffinity PositionForPoint(const PhysicalOffset&) const override; bool IsOfType(LayoutObjectType type) const override { return type == kLayoutObjectLayoutReplaced || LayoutBox::IsOfType(type);
diff --git a/third_party/blink/renderer/core/layout/layout_text.cc b/third_party/blink/renderer/core/layout/layout_text.cc index 2a2510f..bc19a3c 100644 --- a/third_party/blink/renderer/core/layout/layout_text.cc +++ b/third_party/blink/renderer/core/layout/layout_text.cc
@@ -128,6 +128,7 @@ has_tab_(false), lines_dirty_(false), valid_ng_items_(false), + has_bidi_control_items_(false), contains_reversed_text_(false), known_to_have_no_overflow_and_no_fallback_fonts_(false), contains_only_whitespace_or_nbsp_( @@ -219,9 +220,17 @@ } for (InlineTextBox* box : TextBoxes()) box->Remove(); - } else if (Parent()) { - Parent()->DirtyLinesFromChangedChild(this); + } else { + if (NGPaintFragment* first_inline_fragment = FirstInlineFragment()) { + first_inline_fragment->LayoutObjectWillBeDestroyed(); + SetFirstInlineFragment(nullptr); + } + if (Parent()) + Parent()->DirtyLinesFromChangedChild(this); } + } else if (NGPaintFragment* first_inline_fragment = FirstInlineFragment()) { + // Still do this to clear the global hash map in NGAbstractInlineTextBox. + SetFirstInlineFragment(nullptr); } DeleteTextBoxes(); } @@ -256,9 +265,7 @@ } void LayoutText::DeleteTextBoxes() { - if (IsInLayoutNGInlineFormattingContext()) - SetFirstInlineFragment(nullptr); - else + if (!IsInLayoutNGInlineFormattingContext()) MutableTextBoxes().DeleteLineBoxes(); } @@ -722,7 +729,7 @@ } // namespace PositionWithAffinity LayoutText::PositionForPoint( - const LayoutPoint& point) const { + const PhysicalOffset& point) const { if (const LayoutBlockFlow* ng_block_flow = ContainingNGBlockFlow()) return ng_block_flow->PositionForPoint(point); @@ -730,10 +737,11 @@ if (!FirstTextBox() || TextLength() == 0) return CreatePositionWithAffinity(0); + LayoutPoint flipped_point = FlipForWritingMode(point); LayoutUnit point_line_direction = - FirstTextBox()->IsHorizontal() ? point.X() : point.Y(); + IsHorizontalWritingMode() ? flipped_point.X() : flipped_point.Y(); LayoutUnit point_block_direction = - FirstTextBox()->IsHorizontal() ? point.Y() : point.X(); + IsHorizontalWritingMode() ? flipped_point.Y() : flipped_point.X(); bool blocks_are_flipped = StyleRef().IsFlippedBlocksWritingMode(); InlineTextBox* last_box = nullptr; @@ -2412,6 +2420,7 @@ } void LayoutText::ClearInlineItems() { + has_bidi_control_items_ = false; valid_ng_items_ = false; if (base::span<NGInlineItem>* items = GetNGInlineItems()) *items = base::span<NGInlineItem>();
diff --git a/third_party/blink/renderer/core/layout/layout_text.h b/third_party/blink/renderer/core/layout/layout_text.h index 3367b57..52258dc 100644 --- a/third_party/blink/renderer/core/layout/layout_text.h +++ b/third_party/blink/renderer/core/layout/layout_text.h
@@ -122,7 +122,7 @@ void LocalQuadsInFlippedBlocksDirection(Vector<FloatQuad>&, ClippingOption = kNoClipping) const; - PositionWithAffinity PositionForPoint(const LayoutPoint&) const override; + PositionWithAffinity PositionForPoint(const PhysicalOffset&) const override; bool Is8Bit() const { return text_.Is8Bit(); } const LChar* Characters8() const { return text_.Impl()->Characters8(); } @@ -320,6 +320,10 @@ // it was inserted/changed but also it was moved. void InvalidateInlineItems() { valid_ng_items_ = false; } + bool HasBidiControlInlineItems() const { return has_bidi_control_items_; } + void SetHasBidiControlInlineItems() { has_bidi_control_items_ = true; } + void ClearHasBidiControlInlineItems() { has_bidi_control_items_ = false; } + protected: virtual const base::span<NGInlineItem>* GetNGInlineItems() const { return nullptr; @@ -421,6 +425,10 @@ // Functionally the inverse equivalent of lines_dirty_ for LayoutNG. unsigned valid_ng_items_ : 1; + // Used by LayoutNGText. Whether there is any BidiControl type NGInlineItem + // associated with this object. Set after layout when associating items. + unsigned has_bidi_control_items_ : 1; + unsigned contains_reversed_text_ : 1; mutable unsigned known_to_have_no_overflow_and_no_fallback_fonts_ : 1; unsigned contains_only_whitespace_or_nbsp_ : 2;
diff --git a/third_party/blink/renderer/core/layout/layout_view_test.cc b/third_party/blink/renderer/core/layout/layout_view_test.cc index 1ec16e0..44988926 100644 --- a/third_party/blink/renderer/core/layout/layout_view_test.cc +++ b/third_party/blink/renderer/core/layout/layout_view_test.cc
@@ -13,31 +13,13 @@ namespace blink { -class LayoutViewTest : public testing::WithParamInterface<bool>, - private ScopedLayoutNGForTest, - public RenderingTest { +class LayoutViewTest : public RenderingTest { public: LayoutViewTest() - : ScopedLayoutNGForTest(LayoutNG()), - RenderingTest(MakeGarbageCollected<SingleChildLocalFrameClient>()) {} - - protected: - bool LayoutNG() { return GetParam(); } - bool LayoutNGOrAndroidOrWindows() { -#if defined(OS_WIN) || defined(OS_ANDROID) - // To deal with platform-specific editing behaviors. - return true; -#else - // TODO(crbug.com/971414): For now LayoutNG always uses Android/Windows - // behavior for ShouldMoveCaretToHorizontalBoundaryWhenPastTopOrBottom(). - return LayoutNG(); -#endif - } + : RenderingTest(MakeGarbageCollected<SingleChildLocalFrameClient>()) {} }; -INSTANTIATE_TEST_SUITE_P(All, LayoutViewTest, testing::Bool()); - -TEST_P(LayoutViewTest, UpdateCountersLayout) { +TEST_F(LayoutViewTest, UpdateCountersLayout) { SetBodyInnerHTML(R"HTML( <style> div.incX { counter-increment: x } @@ -60,7 +42,7 @@ EXPECT_TRUE(GetDocument().View()->NeedsLayout()); } -TEST_P(LayoutViewTest, DisplayNoneFrame) { +TEST_F(LayoutViewTest, DisplayNoneFrame) { SetBodyInnerHTML(R"HTML( <iframe id="iframe" style="display:none"></iframe> )HTML"); @@ -86,7 +68,52 @@ EXPECT_FALSE(div->GetComputedStyle()); } -TEST_P(LayoutViewTest, HitTestHorizontal) { +struct HitTestConfig { + bool layout_ng; + EditingBehaviorType editing_behavior; +}; + +class LayoutViewHitTestTest : public testing::WithParamInterface<HitTestConfig>, + private ScopedLayoutNGForTest, + public RenderingTest { + public: + LayoutViewHitTestTest() + : ScopedLayoutNGForTest(LayoutNG()), + RenderingTest(MakeGarbageCollected<SingleChildLocalFrameClient>()) {} + + protected: + bool LayoutNG() { return GetParam().layout_ng; } + bool IsAndroidOrWindowsEditingBehavior() { + // TODO(crbug.com/971414): For now LayoutNG always uses Android/Windows + // behavior for ShouldMoveCaretToHorizontalBoundaryWhenPastTopOrBottom(). + if (LayoutNG()) + return true; + return GetParam().editing_behavior == kEditingAndroidBehavior || + GetParam().editing_behavior == kEditingWindowsBehavior; + } + + void SetUp() override { + RenderingTest::SetUp(); + GetFrame().GetSettings()->SetEditingBehaviorType( + GetParam().editing_behavior); + } +}; + +INSTANTIATE_TEST_SUITE_P(All, + LayoutViewHitTestTest, + ::testing::Values( + // Legacy + HitTestConfig{false, kEditingMacBehavior}, + HitTestConfig{false, kEditingWindowsBehavior}, + HitTestConfig{false, kEditingUnixBehavior}, + HitTestConfig{false, kEditingAndroidBehavior}, + // LayoutNG + HitTestConfig{true, kEditingMacBehavior}, + HitTestConfig{true, kEditingWindowsBehavior}, + HitTestConfig{true, kEditingUnixBehavior}, + HitTestConfig{true, kEditingAndroidBehavior})); + +TEST_P(LayoutViewHitTestTest, HitTestHorizontal) { LoadAhem(); SetBodyInnerHTML(R"HTML( <style>body { margin: 0 }</style> @@ -165,7 +192,7 @@ EXPECT_EQ(GetDocument().documentElement(), result.InnerNode()); EXPECT_EQ(PhysicalOffset(51, 181), result.LocalPoint()); EXPECT_EQ( - LayoutNGOrAndroidOrWindows() + IsAndroidOrWindowsEditingBehavior() ? PositionWithAffinity(Position(text1, 0), TextAffinity::kDownstream) : PositionWithAffinity(Position(text2, 3), TextAffinity::kDownstream), result.GetPosition()); @@ -176,7 +203,7 @@ EXPECT_EQ(div, result.InnerNode()); EXPECT_EQ(PhysicalOffset(1, 79), result.LocalPoint()); EXPECT_EQ( - LayoutNGOrAndroidOrWindows() + IsAndroidOrWindowsEditingBehavior() ? PositionWithAffinity(Position(text1, 0), TextAffinity::kDownstream) : PositionWithAffinity(Position(text2, 3), TextAffinity::kDownstream), result.GetPosition()); @@ -187,7 +214,7 @@ EXPECT_EQ(div, result.InnerNode()); EXPECT_EQ(PhysicalOffset(1, 11), result.LocalPoint()); EXPECT_EQ( - LayoutNGOrAndroidOrWindows() + IsAndroidOrWindowsEditingBehavior() ? PositionWithAffinity(Position(text1, 0), TextAffinity::kDownstream) : PositionWithAffinity(Position(text2, 3), TextAffinity::kDownstream), result.GetPosition()); @@ -201,7 +228,7 @@ result.GetPosition()); } -TEST_P(LayoutViewTest, HitTestVerticalLR) { +TEST_P(LayoutViewHitTestTest, HitTestVerticalLR) { LoadAhem(); SetBodyInnerHTML(R"HTML( <style>body { margin: 0 }</style> @@ -251,7 +278,7 @@ EXPECT_EQ(GetDocument().documentElement(), result.InnerNode()); EXPECT_EQ(PhysicalOffset(251, 101), result.LocalPoint()); EXPECT_EQ( - LayoutNGOrAndroidOrWindows() + IsAndroidOrWindowsEditingBehavior() ? PositionWithAffinity(Position(text1, 0), TextAffinity::kDownstream) : PositionWithAffinity(Position(text2, 3), TextAffinity::kDownstream), result.GetPosition()); @@ -262,7 +289,7 @@ EXPECT_EQ(div, result.InnerNode()); EXPECT_EQ(PhysicalOffset(199, 1), result.LocalPoint()); EXPECT_EQ( - LayoutNGOrAndroidOrWindows() + IsAndroidOrWindowsEditingBehavior() ? PositionWithAffinity(Position(text1, 0), TextAffinity::kDownstream) : PositionWithAffinity(Position(text2, 3), TextAffinity::kDownstream), result.GetPosition()); @@ -281,7 +308,7 @@ EXPECT_EQ(div, result.InnerNode()); EXPECT_EQ(PhysicalOffset(11, 1), result.LocalPoint()); EXPECT_EQ( - LayoutNGOrAndroidOrWindows() + IsAndroidOrWindowsEditingBehavior() ? PositionWithAffinity(Position(text1, 0), TextAffinity::kDownstream) : PositionWithAffinity(Position(text2, 3), TextAffinity::kDownstream), result.GetPosition()); @@ -311,7 +338,7 @@ result.GetPosition()); } -TEST_P(LayoutViewTest, HitTestVerticalRL) { +TEST_P(LayoutViewHitTestTest, HitTestVerticalRL) { LoadAhem(); SetBodyInnerHTML(R"HTML( <style>body { margin: 0 }</style> @@ -341,11 +368,15 @@ HitTestResult result; // In body, but not in any descendants. + // XXX1 GetLayoutView().HitTest(HitTestLocation(PhysicalOffset(1, 1)), result); EXPECT_EQ(GetDocument().body(), result.InnerNode()); EXPECT_EQ(PhysicalOffset(1, 1), result.LocalPoint()); - EXPECT_EQ(PositionWithAffinity(Position(text1, 0), TextAffinity::kDownstream), - result.GetPosition()); + EXPECT_EQ( + IsAndroidOrWindowsEditingBehavior() + ? PositionWithAffinity(Position(text1, 0), TextAffinity::kDownstream) + : PositionWithAffinity(Position(text2, 3), TextAffinity::kDownstream), + result.GetPosition()); // Top-left corner of div. result = HitTestResult(); @@ -353,7 +384,7 @@ EXPECT_EQ(div, result.InnerNode()); EXPECT_EQ(PhysicalOffset(1, 1), result.LocalPoint()); EXPECT_EQ( - LayoutNGOrAndroidOrWindows() + IsAndroidOrWindowsEditingBehavior() ? PositionWithAffinity(Position(text1, 0), TextAffinity::kDownstream) : PositionWithAffinity(Position(text2, 3), TextAffinity::kDownstream), result.GetPosition()); @@ -363,11 +394,8 @@ GetLayoutView().HitTest(HitTestLocation(PhysicalOffset(251, 101)), result); EXPECT_EQ(GetDocument().documentElement(), result.InnerNode()); EXPECT_EQ(PhysicalOffset(251, 101), result.LocalPoint()); - EXPECT_EQ( - LayoutNGOrAndroidOrWindows() - ? PositionWithAffinity(Position(text1, 0), TextAffinity::kDownstream) - : PositionWithAffinity(Position(text2, 3), TextAffinity::kDownstream), - result.GetPosition()); + EXPECT_EQ(PositionWithAffinity(Position(text1, 0), TextAffinity::kDownstream), + result.GetPosition()); // Top-right corner (inside) of div and span1. result = HitTestResult(); @@ -394,12 +422,16 @@ result.GetPosition()); // Bottom-left corner (outside) of div. + // XXX2 result = HitTestResult(); GetLayoutView().HitTest(HitTestLocation(PhysicalOffset(51, 181)), result); EXPECT_EQ(GetDocument().documentElement(), result.InnerNode()); EXPECT_EQ(PhysicalOffset(51, 181), result.LocalPoint()); - EXPECT_EQ(PositionWithAffinity(Position(text2, 3), TextAffinity::kUpstream), - result.GetPosition()); + EXPECT_EQ( + IsAndroidOrWindowsEditingBehavior() + ? PositionWithAffinity(Position(text2, 3), TextAffinity::kUpstream) + : PositionWithAffinity(Position(text2, 3), TextAffinity::kDownstream), + result.GetPosition()); // Bottom-left corner (inside) of div. result = HitTestResult(); @@ -407,7 +439,7 @@ EXPECT_EQ(div, result.InnerNode()); EXPECT_EQ(PhysicalOffset(1, 79), result.LocalPoint()); EXPECT_EQ( - LayoutNGOrAndroidOrWindows() + IsAndroidOrWindowsEditingBehavior() ? PositionWithAffinity(Position(text2, 3), TextAffinity::kUpstream) : PositionWithAffinity(Position(text2, 3), TextAffinity::kDownstream), result.GetPosition()); @@ -429,7 +461,7 @@ result.GetPosition()); } -TEST_P(LayoutViewTest, HitTestVerticalRLRoot) { +TEST_P(LayoutViewHitTestTest, HitTestVerticalRLRoot) { LoadAhem(); SetBodyInnerHTML(R"HTML( <style> @@ -463,7 +495,7 @@ EXPECT_EQ(GetDocument().documentElement(), result.InnerNode()); EXPECT_EQ(PhysicalOffset(-599, 1), result.LocalPoint()); EXPECT_EQ( - LayoutNGOrAndroidOrWindows() + IsAndroidOrWindowsEditingBehavior() ? PositionWithAffinity(Position(text, 0), TextAffinity::kDownstream) : PositionWithAffinity(Position(text, 5), TextAffinity::kDownstream), result.GetPosition()); @@ -474,7 +506,7 @@ EXPECT_EQ(div, result.InnerNode()); EXPECT_EQ(PhysicalOffset(1, 1), result.LocalPoint()); EXPECT_EQ( - LayoutNGOrAndroidOrWindows() + IsAndroidOrWindowsEditingBehavior() ? PositionWithAffinity(Position(text, 0), TextAffinity::kDownstream) : PositionWithAffinity(Position(text, 5), TextAffinity::kDownstream), result.GetPosition()); @@ -485,7 +517,7 @@ EXPECT_EQ(GetDocument().documentElement(), result.InnerNode()); EXPECT_EQ(PhysicalOffset(201, 1), result.LocalPoint()); EXPECT_EQ( - LayoutNGOrAndroidOrWindows() + IsAndroidOrWindowsEditingBehavior() ? PositionWithAffinity(Position(text, 0), TextAffinity::kDownstream) : PositionWithAffinity(Position(text, 0), TextAffinity::kDownstream), result.GetPosition()); @@ -512,7 +544,7 @@ EXPECT_EQ(GetDocument().documentElement(), result.InnerNode()); EXPECT_EQ(PhysicalOffset(-1, 81), result.LocalPoint()); EXPECT_EQ( - LayoutNGOrAndroidOrWindows() + IsAndroidOrWindowsEditingBehavior() ? PositionWithAffinity(Position(text, 5), TextAffinity::kUpstream) : PositionWithAffinity(Position(text, 5), TextAffinity::kDownstream), result.GetPosition());
diff --git a/third_party/blink/renderer/core/layout/line/breaking_context_inline_headers.h b/third_party/blink/renderer/core/layout/line/breaking_context_inline_headers.h index bb4763cb..36e97d4f4 100644 --- a/third_party/blink/renderer/core/layout/line/breaking_context_inline_headers.h +++ b/third_party/blink/renderer/core/layout/line/breaking_context_inline_headers.h
@@ -533,8 +533,14 @@ // early by skipTrailingWhitespace(), and later on they all get placed by // the first float here in handleFloat(). Their position may then be wrong, // but it's too late to do anything about that now. See crbug.com/671577 - if (!floating_object->IsPlaced()) - block_.PositionAndLayoutFloat(*floating_object, block_.LogicalHeight()); + if (!floating_object->IsPlaced()) { + LayoutUnit logical_top = block_.LogicalHeight(); + if (const FloatingObject* last_placed_float = block_.LastPlacedFloat()) { + logical_top = std::max(logical_top, + block_.LogicalTopForFloat(*last_placed_float)); + } + block_.PositionAndLayoutFloat(*floating_object, logical_top); + } // Check if it fits in the current line; if it does, place it now, // otherwise, place it after moving to next line (in newLine() func).
diff --git a/third_party/blink/renderer/core/layout/ng/inline/ng_inline_items_builder.cc b/third_party/blink/renderer/core/layout/ng/inline/ng_inline_items_builder.cc index 7e73000..4fb3a30 100644 --- a/third_party/blink/renderer/core/layout/ng/inline/ng_inline_items_builder.cc +++ b/third_party/blink/renderer/core/layout/ng/inline/ng_inline_items_builder.cc
@@ -362,7 +362,7 @@ // We exit and then re-enter all bidi contexts around a forced break. So, We // must go through the full pipeline to ensure that we exit and enter the // correct bidi contexts the re-layout. - if (bidi_context_.size() || original_data.IsBidiEnabled()) { + if (bidi_context_.size() || layout_text->HasBidiControlInlineItems()) { if (layout_text->GetText().Contains(kNewlineCharacter)) return false; }
diff --git a/third_party/blink/renderer/core/layout/ng/inline/ng_inline_node.cc b/third_party/blink/renderer/core/layout/ng/inline/ng_inline_node.cc index 79ab401..f950521 100644 --- a/third_party/blink/renderer/core/layout/ng/inline/ng_inline_node.cc +++ b/third_party/blink/renderer/core/layout/ng/inline/ng_inline_node.cc
@@ -861,12 +861,18 @@ // Items split from a LayoutObject should be consecutive. DCHECK(associated_objects.insert(object).is_new_entry); #endif + layout_text->ClearHasBidiControlInlineItems(); + bool has_bidi_control = false; NGInlineItem* begin = item; for (++item; item != items.end(); ++item) { if (item->GetLayoutObject() != object) break; + if (item->Type() == NGInlineItem::kBidiControl) + has_bidi_control = true; } layout_text->SetInlineItems(begin, item); + if (has_bidi_control) + layout_text->SetHasBidiControlInlineItems(); continue; } ++item; @@ -914,9 +920,12 @@ LayoutObject* last_object = nullptr; for (unsigned i = start_index; i < items.size(); i++) { const NGInlineItem& item = items[i]; - if (item.Type() == NGInlineItem::kOutOfFlowPositioned || - item.Type() == NGInlineItem::kListMarker) + if (item.Type() == NGInlineItem::kFloating || + item.Type() == NGInlineItem::kOutOfFlowPositioned) { + // These items are not associated and that no need to clear. + DCHECK(!item.GetLayoutObject()->FirstInlineFragment()); continue; + } LayoutObject* object = item.GetLayoutObject(); if (!object || object == last_object) continue;
diff --git a/third_party/blink/renderer/core/layout/ng/inline/ng_inline_node_test.cc b/third_party/blink/renderer/core/layout/ng/inline/ng_inline_node_test.cc index 9666bfd..6f31c49 100644 --- a/third_party/blink/renderer/core/layout/ng/inline/ng_inline_node_test.cc +++ b/third_party/blink/renderer/core/layout/ng/inline/ng_inline_node_test.cc
@@ -1431,6 +1431,18 @@ EXPECT_EQ("foo\nbar", GetText()); } +TEST_F(NGInlineNodeTest, PreservedNewlineWithRemovedLtrDirAndRelayout) { + SetupHtml("container", + "<pre id=container>foo<span dir=ltr>\nbar</span></pre>"); + EXPECT_EQ(String(u"foo\u2066\u2069\n\u2066bar\u2069"), GetText()); + + GetDocument().QuerySelector("span")->removeAttribute(html_names::kDirAttr); + UpdateAllLifecyclePhasesForTest(); + + // The bidi control characters around '\n' should not preserve + EXPECT_EQ("foo\nbar", GetText()); +} + // https://crbug.com/969089 TEST_F(NGInlineNodeTest, InsertedWBRWithLineBreakInRelayout) { SetupHtml("container", "<div id=container><span>foo</span>\nbar</div>");
diff --git a/third_party/blink/renderer/core/layout/ng/layout_ng_mixin.cc b/third_party/blink/renderer/core/layout/ng/layout_ng_mixin.cc index 49241555..e7756633 100644 --- a/third_party/blink/renderer/core/layout/ng/layout_ng_mixin.cc +++ b/third_party/blink/renderer/core/layout/ng/layout_ng_mixin.cc
@@ -263,6 +263,9 @@ // |NGPaintFragment::Create()| calls |SlowSetPaintingLayerNeedsRepaint()|. } else if (*current) { DCHECK_EQ(this, (*current)->GetLayoutObject()); + // TODO(kojii): Pass break_token for LayoutObject that spans across block + // fragmentation boundaries. + (*current)->ClearAssociationWithLayoutObject(); *current = nullptr; ObjectPaintInvalidator(*this).SlowSetPaintingLayerNeedsRepaint(); } @@ -311,7 +314,7 @@ template <typename Base> PositionWithAffinity LayoutNGMixin<Base>::PositionForPoint( - const LayoutPoint& point) const { + const PhysicalOffset& point) const { if (Base::IsAtomicInlineLevel()) { const PositionWithAffinity atomic_inline_position = Base::PositionForPointIfOutsideAtomicInlineLevel(point); @@ -325,10 +328,8 @@ if (!PaintFragment()) return Base::CreatePositionWithAffinity(0); - // Flip because |point| is in flipped physical coordinates while - // NGPaintFragment::PositionForPoint() requires pure physical coordinates. const PositionWithAffinity ng_position = - PaintFragment()->PositionForPoint(Base::FlipForWritingMode(point)); + PaintFragment()->PositionForPoint(point); if (ng_position.IsNotNull()) return ng_position; return Base::CreatePositionWithAffinity(0);
diff --git a/third_party/blink/renderer/core/layout/ng/layout_ng_mixin.h b/third_party/blink/renderer/core/layout/ng/layout_ng_mixin.h index ff3f720e2..15e6d5a 100644 --- a/third_party/blink/renderer/core/layout/ng/layout_ng_mixin.h +++ b/third_party/blink/renderer/core/layout/ng/layout_ng_mixin.h
@@ -48,7 +48,7 @@ const PhysicalOffset& accumulated_offset, HitTestAction) final; - PositionWithAffinity PositionForPoint(const LayoutPoint&) const override; + PositionWithAffinity PositionForPoint(const PhysicalOffset&) const override; const NGPaintFragment* PaintFragment() const final { // TODO(layout-dev) crbug.com/963103
diff --git a/third_party/blink/renderer/core/layout/ng/list/layout_ng_inside_list_marker.cc b/third_party/blink/renderer/core/layout/ng/list/layout_ng_inside_list_marker.cc index 6938996..5cdeb8d 100644 --- a/third_party/blink/renderer/core/layout/ng/list/layout_ng_inside_list_marker.cc +++ b/third_party/blink/renderer/core/layout/ng/list/layout_ng_inside_list_marker.cc
@@ -25,7 +25,7 @@ } PositionWithAffinity LayoutNGInsideListMarker::PositionForPoint( - const LayoutPoint&) const { + const PhysicalOffset&) const { return CreatePositionWithAffinity(0); }
diff --git a/third_party/blink/renderer/core/layout/ng/list/layout_ng_inside_list_marker.h b/third_party/blink/renderer/core/layout/ng/list/layout_ng_inside_list_marker.h index 9197de75..ec19ee3 100644 --- a/third_party/blink/renderer/core/layout/ng/list/layout_ng_inside_list_marker.h +++ b/third_party/blink/renderer/core/layout/ng/list/layout_ng_inside_list_marker.h
@@ -30,7 +30,7 @@ private: bool IsOfType(LayoutObjectType) const override; - PositionWithAffinity PositionForPoint(const LayoutPoint&) const override; + PositionWithAffinity PositionForPoint(const PhysicalOffset&) const override; }; DEFINE_LAYOUT_OBJECT_TYPE_CASTS(LayoutNGInsideListMarker,
diff --git a/third_party/blink/renderer/core/layout/ng/list/layout_ng_list_marker.cc b/third_party/blink/renderer/core/layout/ng/list/layout_ng_list_marker.cc index bf9f409..71e648a4c6 100644 --- a/third_party/blink/renderer/core/layout/ng/list/layout_ng_list_marker.cc +++ b/third_party/blink/renderer/core/layout/ng/list/layout_ng_list_marker.cc
@@ -54,7 +54,7 @@ } PositionWithAffinity LayoutNGListMarker::PositionForPoint( - const LayoutPoint&) const { + const PhysicalOffset&) const { return CreatePositionWithAffinity(0); }
diff --git a/third_party/blink/renderer/core/layout/ng/list/layout_ng_list_marker.h b/third_party/blink/renderer/core/layout/ng/list/layout_ng_list_marker.h index 74eb29e..6b9ac9777 100644 --- a/third_party/blink/renderer/core/layout/ng/list/layout_ng_list_marker.h +++ b/third_party/blink/renderer/core/layout/ng/list/layout_ng_list_marker.h
@@ -32,7 +32,7 @@ private: bool IsOfType(LayoutObjectType) const override; - PositionWithAffinity PositionForPoint(const LayoutPoint&) const override; + PositionWithAffinity PositionForPoint(const PhysicalOffset&) const override; }; DEFINE_LAYOUT_OBJECT_TYPE_CASTS(LayoutNGListMarker, IsLayoutNGListMarker());
diff --git a/third_party/blink/renderer/core/layout/ng/ng_block_node.cc b/third_party/blink/renderer/core/layout/ng/ng_block_node.cc index 9f22728b..aee15ed 100644 --- a/third_party/blink/renderer/core/layout/ng/ng_block_node.cc +++ b/third_party/blink/renderer/core/layout/ng/ng_block_node.cc
@@ -950,7 +950,10 @@ To<LayoutBlock>(box_)->CreatesNewFormattingContext()); scoped_refptr<const NGLayoutResult> layout_result = - box_->GetCachedLayoutResult(); + box_->IsOutOfFlowPositioned() + ? CachedLayoutResultForOutOfFlowPositioned( + constraint_space.PercentageResolutionSize()) + : box_->GetCachedLayoutResult(); // We need to force a layout on the child if the constraint space given will // change the layout.
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 dbd703d..8f7494a5 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
@@ -364,7 +364,8 @@ // Make sure we don't end up with a rectangle with "negative" size. end_offset.inline_offset = std::max(end_offset.inline_offset, start_offset.inline_offset); - + end_offset.block_offset = + std::max(end_offset.block_offset, start_offset.block_offset); // Step 3 - determine the logical rectangle. // Determine the logical size of the containing block.
diff --git a/third_party/blink/renderer/core/layout/ng/ng_physical_fragment.h b/third_party/blink/renderer/core/layout/ng/ng_physical_fragment.h index 868db0e..74bdd1a3b 100644 --- a/third_party/blink/renderer/core/layout/ng/ng_physical_fragment.h +++ b/third_party/blink/renderer/core/layout/ng/ng_physical_fragment.h
@@ -103,6 +103,9 @@ bool IsInlineBox() const { return IsBox() && BoxType() == NGBoxType::kInlineBox; } + bool IsColumnBox() const { + return IsBox() && BoxType() == NGBoxType::kColumnBox; + } // An atomic inline is represented as a kFragmentBox, such as inline block and // replaced elements. bool IsAtomicInline() const {
diff --git a/third_party/blink/renderer/core/layout/svg/layout_svg_inline_text.cc b/third_party/blink/renderer/core/layout/svg/layout_svg_inline_text.cc index eca55d1..20cf37c 100644 --- a/third_party/blink/renderer/core/layout/svg/layout_svg_inline_text.cc +++ b/third_party/blink/renderer/core/layout/svg/layout_svg_inline_text.cc
@@ -151,7 +151,7 @@ } PositionWithAffinity LayoutSVGInlineText::PositionForPoint( - const LayoutPoint& point) const { + const PhysicalOffset& point) const { if (!HasTextBoxes() || !TextLength()) return CreatePositionWithAffinity(0);
diff --git a/third_party/blink/renderer/core/layout/svg/layout_svg_inline_text.h b/third_party/blink/renderer/core/layout/svg/layout_svg_inline_text.h index 47c881e..8714fa3 100644 --- a/third_party/blink/renderer/core/layout/svg/layout_svg_inline_text.h +++ b/third_party/blink/renderer/core/layout/svg/layout_svg_inline_text.h
@@ -70,7 +70,7 @@ LayoutText::IsOfType(type); } - PositionWithAffinity PositionForPoint(const LayoutPoint&) const override; + PositionWithAffinity PositionForPoint(const PhysicalOffset&) const override; LayoutRect LocalCaretRect( const InlineBox*, int caret_offset,
diff --git a/third_party/blink/renderer/core/layout/svg/layout_svg_root.cc b/third_party/blink/renderer/core/layout/svg/layout_svg_root.cc index b83ddd9..ee8582b 100644 --- a/third_party/blink/renderer/core/layout/svg/layout_svg_root.cc +++ b/third_party/blink/renderer/core/layout/svg/layout_svg_root.cc
@@ -387,7 +387,7 @@ } PositionWithAffinity LayoutSVGRoot::PositionForPoint( - const LayoutPoint& point) const { + const PhysicalOffset& point) const { FloatPoint absolute_point = FloatPoint(point); absolute_point = local_to_border_box_transform_.Inverse().MapPoint(absolute_point); @@ -410,7 +410,8 @@ absolute_point = transform.Inverse().MapPoint(absolute_point); - return closest_descendant->PositionForPoint(LayoutPoint(absolute_point)); + return closest_descendant->PositionForPoint( + PhysicalOffset::FromFloatPointRound(absolute_point)); } // LayoutBox methods will expect coordinates w/o any transforms in coordinates
diff --git a/third_party/blink/renderer/core/layout/svg/layout_svg_root.h b/third_party/blink/renderer/core/layout/svg/layout_svg_root.h index c1306d7..e88b67ce 100644 --- a/third_party/blink/renderer/core/layout/svg/layout_svg_root.h +++ b/third_party/blink/renderer/core/layout/svg/layout_svg_root.h
@@ -159,7 +159,7 @@ void UpdateCachedBoundaries(); SVGTransformChange BuildLocalToBorderBoxTransform(); - PositionWithAffinity PositionForPoint(const LayoutPoint&) const final; + PositionWithAffinity PositionForPoint(const PhysicalOffset&) const final; LayoutObjectChildList children_; IntSize container_size_;
diff --git a/third_party/blink/renderer/core/layout/svg/layout_svg_text.cc b/third_party/blink/renderer/core/layout/svg/layout_svg_text.cc index 0284720..48b5a8c8 100644 --- a/third_party/blink/renderer/core/layout/svg/layout_svg_text.cc +++ b/third_party/blink/renderer/core/layout/svg/layout_svg_text.cc
@@ -352,15 +352,15 @@ } PositionWithAffinity LayoutSVGText::PositionForPoint( - const LayoutPoint& point_in_contents) const { + const PhysicalOffset& point_in_contents) const { RootInlineBox* root_box = FirstRootBox(); if (!root_box) return CreatePositionWithAffinity(0); - LayoutPoint clipped_point_in_contents(point_in_contents); - clipped_point_in_contents.MoveBy(-root_box->Location()); + PhysicalOffset clipped_point_in_contents(point_in_contents); + clipped_point_in_contents -= root_box->PhysicalLocation(); clipped_point_in_contents.ClampNegativeToZero(); - clipped_point_in_contents.MoveBy(root_box->Location()); + clipped_point_in_contents += root_box->PhysicalLocation(); DCHECK(!root_box->NextRootBox()); DCHECK(ChildrenInline()); @@ -372,7 +372,7 @@ return CreatePositionWithAffinity(0); return closest_box->GetLineLayoutItem().PositionForPoint( - LayoutPoint(clipped_point_in_contents.X(), closest_box->Y())); + PhysicalOffset(clipped_point_in_contents.left, closest_box->Y())); } void LayoutSVGText::AbsoluteQuads(Vector<FloatQuad>& quads,
diff --git a/third_party/blink/renderer/core/layout/svg/layout_svg_text.h b/third_party/blink/renderer/core/layout/svg/layout_svg_text.h index 9a68bfb..7cd7a44 100644 --- a/third_party/blink/renderer/core/layout/svg/layout_svg_text.h +++ b/third_party/blink/renderer/core/layout/svg/layout_svg_text.h
@@ -78,7 +78,7 @@ const HitTestLocation& location_in_parent, const PhysicalOffset& accumulated_offset, HitTestAction) override; - PositionWithAffinity PositionForPoint(const LayoutPoint&) const override; + PositionWithAffinity PositionForPoint(const PhysicalOffset&) const override; void UpdateLayout() override;
diff --git a/third_party/blink/renderer/core/layout/svg/line/svg_root_inline_box.cc b/third_party/blink/renderer/core/layout/svg/line/svg_root_inline_box.cc index 926a0f5..cf7a017e 100644 --- a/third_party/blink/renderer/core/layout/svg/line/svg_root_inline_box.cc +++ b/third_party/blink/renderer/core/layout/svg/line/svg_root_inline_box.cc
@@ -112,7 +112,7 @@ } InlineBox* SVGRootInlineBox::ClosestLeafChildForPosition( - const LayoutPoint& point) { + const PhysicalOffset& point) { InlineBox* first_leaf = FirstLeafChild(); InlineBox* last_leaf = LastLeafChild(); if (first_leaf == last_leaf) @@ -123,13 +123,13 @@ for (InlineBox* leaf = first_leaf; leaf; leaf = leaf->NextLeafChild()) { if (!leaf->IsSVGInlineTextBox()) continue; - if (point.Y() < leaf->Y()) + if (point.top < leaf->Y()) continue; - if (point.Y() > leaf->Y() + leaf->VirtualLogicalHeight()) + if (point.left > leaf->Y() + leaf->VirtualLogicalHeight()) continue; closest_leaf = leaf; - if (point.X() < leaf->X() + leaf->LogicalWidth()) + if (point.left < leaf->X() + leaf->LogicalWidth()) return leaf; }
diff --git a/third_party/blink/renderer/core/layout/svg/line/svg_root_inline_box.h b/third_party/blink/renderer/core/layout/svg/line/svg_root_inline_box.h index addb9bc..e62b52c2 100644 --- a/third_party/blink/renderer/core/layout/svg/line/svg_root_inline_box.h +++ b/third_party/blink/renderer/core/layout/svg/line/svg_root_inline_box.h
@@ -45,7 +45,7 @@ void ComputePerCharacterLayoutInformation(); - InlineBox* ClosestLeafChildForPosition(const LayoutPoint&); + InlineBox* ClosestLeafChildForPosition(const PhysicalOffset&); bool NodeAtPoint(HitTestResult&, const HitTestLocation& location_in_container,
diff --git a/third_party/blink/renderer/core/page/focus_controller.cc b/third_party/blink/renderer/core/page/focus_controller.cc index 856562e..6a102415 100644 --- a/third_party/blink/renderer/core/page/focus_controller.cc +++ b/third_party/blink/renderer/core/page/focus_controller.cc
@@ -1160,9 +1160,12 @@ if (form_element->formOwner() != form_owner || form_element->IsDisabledOrReadOnly()) continue; - // Focusless spatial navigation supports all form types. + // Focusless spatial navigation supports all form types. However, submit + // buttons are explicitly excluded as moving to them isn't necessary - the + // IME should just submit instead. if (RuntimeEnabledFeatures::FocuslessSpatialNavigationEnabled() && - page_->GetSettings().GetSpatialNavigationEnabled()) { + page_->GetSettings().GetSpatialNavigationEnabled() && + !form_element->CanBeSuccessfulSubmitButton()) { return next_element; } LayoutObject* layout = next_element->GetLayoutObject();
diff --git a/third_party/blink/renderer/core/page/spatial_navigation_controller.cc b/third_party/blink/renderer/core/page/spatial_navigation_controller.cc index 7fb3c746..5c4f5ee 100644 --- a/third_party/blink/renderer/core/page/spatial_navigation_controller.cc +++ b/third_party/blink/renderer/core/page/spatial_navigation_controller.cc
@@ -17,6 +17,8 @@ #include "third_party/blink/renderer/core/frame/local_frame.h" #include "third_party/blink/renderer/core/frame/settings.h" #include "third_party/blink/renderer/core/frame/visual_viewport.h" +#include "third_party/blink/renderer/core/html/forms/html_form_control_element.h" +#include "third_party/blink/renderer/core/html/forms/html_form_element.h" #include "third_party/blink/renderer/core/html/html_frame_owner_element.h" #include "third_party/blink/renderer/core/html/media/html_video_element.h" #include "third_party/blink/renderer/core/input/event_handler.h" @@ -177,6 +179,19 @@ return true; } +bool SpatialNavigationController::HandleImeSubmitKeyboardEvent( + KeyboardEvent* event) { + DCHECK(page_->GetSettings().GetSpatialNavigationEnabled()); + + if (!IsHTMLFormControlElement(GetFocusedElement())) + return false; + + HTMLFormControlElement* element = + ToHTMLFormControlElement(GetFocusedElement()); + element->formOwner()->SubmitImplicitly(*event, true); + return true; +} + bool SpatialNavigationController::HandleEscapeKeyboardEvent( KeyboardEvent* event) { DCHECK(page_->GetSettings().GetSpatialNavigationEnabled()); @@ -520,6 +535,7 @@ bool change = false; change |= UpdateCanExitFocus(element); change |= UpdateCanSelectInterestedElement(element); + change |= UpdateIsFormFocused(element); change |= UpdateHasNextFormElement(element); change |= UpdateHasDefaultVideoControls(element); if (change) @@ -564,6 +580,15 @@ return true; } +bool SpatialNavigationController::UpdateIsFormFocused(Element* element) { + bool is_form_focused = IsFocused(element) && element->IsFormControlElement(); + + if (is_form_focused == spatial_navigation_state_->is_form_focused) + return false; + spatial_navigation_state_->is_form_focused = is_form_focused; + return true; +} + bool SpatialNavigationController::UpdateHasDefaultVideoControls( Element* element) { bool has_default_video_controls =
diff --git a/third_party/blink/renderer/core/page/spatial_navigation_controller.h b/third_party/blink/renderer/core/page/spatial_navigation_controller.h index f5e8eec2..d1ac834 100644 --- a/third_party/blink/renderer/core/page/spatial_navigation_controller.h +++ b/third_party/blink/renderer/core/page/spatial_navigation_controller.h
@@ -30,6 +30,7 @@ bool HandleArrowKeyboardEvent(KeyboardEvent* event); bool HandleEnterKeyboardEvent(KeyboardEvent* event); bool HandleEscapeKeyboardEvent(KeyboardEvent* event); + bool HandleImeSubmitKeyboardEvent(KeyboardEvent* event); // Returns the element that's currently interested. i.e. the Element that's // currently indicated to the user. @@ -95,6 +96,7 @@ bool UpdateCanExitFocus(Element* element); bool UpdateCanSelectInterestedElement(Element* element); bool UpdateHasNextFormElement(Element* element); + bool UpdateIsFormFocused(Element* element); bool UpdateHasDefaultVideoControls(Element* element); const mojom::blink::SpatialNavigationHostPtr& GetSpatialNavigationHost();
diff --git a/third_party/blink/renderer/core/page/validation_message_overlay_delegate.cc b/third_party/blink/renderer/core/page/validation_message_overlay_delegate.cc index a3696f2..8f73880 100644 --- a/third_party/blink/renderer/core/page/validation_message_overlay_delegate.cc +++ b/third_party/blink/renderer/core/page/validation_message_overlay_delegate.cc
@@ -149,7 +149,8 @@ main_settings.GetMinimumLogicalFontSize()); auto* frame = MakeGarbageCollected<LocalFrame>( - MakeGarbageCollected<EmptyLocalFrameClient>(), *page_, nullptr); + MakeGarbageCollected<EmptyLocalFrameClient>(), *page_, nullptr, nullptr, + nullptr); frame->SetView(MakeGarbageCollected<LocalFrameView>(*frame, view_size)); frame->Init(); frame->View()->SetCanHaveScrollbars(false);
diff --git a/third_party/blink/renderer/core/paint/compositing/composited_layer_mapping.cc b/third_party/blink/renderer/core/paint/compositing/composited_layer_mapping.cc index a0d066b..3f9a72e 100644 --- a/third_party/blink/renderer/core/paint/compositing/composited_layer_mapping.cc +++ b/third_party/blink/renderer/core/paint/compositing/composited_layer_mapping.cc
@@ -1316,7 +1316,7 @@ LocalFrameView* frame_view = layout_object.View()->GetFrameView(); frame_view->GetJankTracker().NotifyCompositedLayerMoved( - OwningLayer(), FloatRect(old_position, FloatSize(old_size)), + layout_object, FloatRect(old_position, FloatSize(old_size)), FloatRect(new_position, FloatSize(new_size))); } graphics_layer_->SetOffsetFromLayoutObject( @@ -3521,6 +3521,12 @@ return GetLayoutObject().PaintBlockedByDisplayLock(); } +void CompositedLayerMapping::NotifyDisplayLockNeedsGraphicsLayerCollection() { + auto* context = GetLayoutObject().GetDisplayLockContext(); + DCHECK(context); + context->NotifyNeedsGraphicsLayerCollection(); +} + #if DCHECK_IS_ON() void CompositedLayerMapping::VerifyNotPainting() { DCHECK(!GetLayoutObject().GetFrame()->GetPage() ||
diff --git a/third_party/blink/renderer/core/paint/compositing/composited_layer_mapping.h b/third_party/blink/renderer/core/paint/compositing/composited_layer_mapping.h index a7a67cba..77f0b9a 100644 --- a/third_party/blink/renderer/core/paint/compositing/composited_layer_mapping.h +++ b/third_party/blink/renderer/core/paint/compositing/composited_layer_mapping.h
@@ -218,6 +218,7 @@ void SetOverlayScrollbarsHidden(bool) override; void GraphicsLayersDidChange() override; bool PaintBlockedByDisplayLock() const override; + void NotifyDisplayLockNeedsGraphicsLayerCollection() override; #if DCHECK_IS_ON() void VerifyNotPainting() override;
diff --git a/third_party/blink/renderer/core/paint/image_paint_timing_detector.cc b/third_party/blink/renderer/core/paint/image_paint_timing_detector.cc index 11186d928..3b5c52c4 100644 --- a/third_party/blink/renderer/core/paint/image_paint_timing_detector.cc +++ b/third_party/blink/renderer/core/paint/image_paint_timing_detector.cc
@@ -207,7 +207,7 @@ void ImageRecordsManager::AssignPaintTimeToRegisteredQueuedNodes( const base::TimeTicks& timestamp, unsigned last_queued_frame_index) { - DCHECK(!images_queued_for_paint_time_.empty()); + // TODO(crbug.com/971419): should guarantee the queue not empty. while (!images_queued_for_paint_time_.empty()) { base::WeakPtr<ImageRecord>& record = images_queued_for_paint_time_.front(); if (record->frame_index > last_queued_frame_index)
diff --git a/third_party/blink/renderer/core/paint/link_highlight_impl.h b/third_party/blink/renderer/core/paint/link_highlight_impl.h index 3da6748..3085cb6 100644 --- a/third_party/blink/renderer/core/paint/link_highlight_impl.h +++ b/third_party/blink/renderer/core/paint/link_highlight_impl.h
@@ -102,15 +102,18 @@ } private: - void ReleaseResources(); - void ComputeQuads(const Node&, Vector<FloatQuad>&) const; + // TODO(crbug.com/967281): These NOINLINEs are for more accurate crash stack + // in the crash reports. + NOINLINE void ReleaseResources(); + NOINLINE void ComputeQuads(const Node&, Vector<FloatQuad>&) const; - void AttachLinkHighlightToCompositingLayer( + NOINLINE void AttachLinkHighlightToCompositingLayer( const LayoutBoxModelObject& paint_invalidation_container); - void ClearGraphicsLayerLinkHighlightPointer(); + NOINLINE void ClearGraphicsLayerLinkHighlightPointer(); // This function computes the highlight path, and returns true if it has // changed size since the last call to this function. - bool ComputeHighlightLayerPathAndPosition(const LayoutBoxModelObject&); + NOINLINE bool ComputeHighlightLayerPathAndPosition( + const LayoutBoxModelObject&); void SetPaintArtifactCompositorNeedsUpdate();
diff --git a/third_party/blink/renderer/core/paint/ng/ng_paint_fragment.cc b/third_party/blink/renderer/core/paint/ng/ng_paint_fragment.cc index 406d1a8e..03158ea 100644 --- a/third_party/blink/renderer/core/paint/ng/ng_paint_fragment.cc +++ b/third_party/blink/renderer/core/paint/ng/ng_paint_fragment.cc
@@ -133,12 +133,8 @@ const bool should_fallback = child.PhysicalFragment().IsBlockFlow() || child.PhysicalFragment().IsLegacyLayoutRoot(); const PositionWithAffinity result = - should_fallback - ? child.GetLayoutObject()->PositionForPoint( - // Flip because LayoutObject::PositionForPoint() requires - // flipped physical coordinates. - child.GetLayoutObject()->FlipForWritingMode(child_point)) - : child.PositionForPoint(child_point); + should_fallback ? child.GetLayoutObject()->PositionForPoint(child_point) + : child.PositionForPoint(child_point); if (result.IsNotNull()) return result; return base::nullopt; @@ -173,6 +169,7 @@ : physical_fragment_(std::move(fragment)), offset_(offset), parent_(parent), + is_layout_object_destroyed_(false), is_dirty_inline_(false) { // TODO(crbug.com/924449): Once we get the caller passes null physical // fragment, we'll change to DCHECK(). @@ -200,6 +197,14 @@ RemoveChildren(); } +void NGPaintFragment::CreateContext::SkipDestroyedPreviousInstances() { + while (UNLIKELY(previous_instance && + previous_instance->is_layout_object_destroyed_)) { + previous_instance = std::move(previous_instance->next_sibling_); + painting_layer_needs_repaint = true; + } +} + void NGPaintFragment::CreateContext::DestroyPreviousInstances() { if (previous_instance) { DestroyAll(previous_instance); @@ -257,6 +262,7 @@ // If the previous instance is given, check if it is re-usable. // Re-using NGPaintFragment allows the paint system to identify objects. + context->SkipDestroyedPreviousInstances(); if (context->previous_instance) { // Take the first instance of previous instances, leaving its following // siblings at |context->previous_instance|. There is a trade-off between @@ -291,6 +297,7 @@ previous_instance->physical_fragment_ = std::move(fragment); previous_instance->offset_ = offset; previous_instance->next_for_same_layout_object_ = nullptr; + CHECK(!previous_instance->is_layout_object_destroyed_); previous_instance->is_dirty_inline_ = false; // Destroy children of previous instances if the new instance doesn't have // any children. Otherwise keep them in case these previous children maybe @@ -376,12 +383,12 @@ } bool NGPaintFragment::HasSelfPaintingLayer() const { - return physical_fragment_->HasSelfPaintingLayer(); + return PhysicalFragment().HasSelfPaintingLayer(); } bool NGPaintFragment::ShouldClipOverflow() const { auto* box_physical_fragment = - DynamicTo<NGPhysicalBoxFragment>(physical_fragment_.get()); + DynamicTo<NGPhysicalBoxFragment>(&PhysicalFragment()); return box_physical_fragment && box_physical_fragment->ShouldClipOverflow(); } @@ -448,7 +455,16 @@ HashMap<const LayoutObject*, NGPaintFragment*>* last_fragment_map) { DCHECK(layout_object); DCHECK(!next_for_same_layout_object_); - DCHECK(layout_object->IsInline() || layout_object->IsFloating()); + DCHECK(layout_object->IsInline()); + DCHECK(PhysicalFragment().IsInline()); + +#if DCHECK_IS_ON() + // Check we don't add the same fragment twice. + for (const NGPaintFragment* fragment : + FragmentRange(layout_object->FirstInlineFragment())) { + DCHECK_NE(this, fragment); + } +#endif auto add_result = last_fragment_map->insert(layout_object, this); if (add_result.is_new_entry) { @@ -467,6 +483,34 @@ add_result.stored_value->value = this; } +// TODO(kojii): Consider unifying this with +// NGInlineNode::ClearAssociatedFragments. +void NGPaintFragment::ClearAssociationWithLayoutObject() { + // TODO(kojii): Support break_token for LayoutObject that spans across block + // fragmentation boundaries. + LayoutObject* last_object = nullptr; + for (NGPaintFragment* child : Children()) { + const NGPhysicalFragment& fragment = child->PhysicalFragment(); + if (fragment.IsInline()) { + LayoutObject* object = fragment.GetMutableLayoutObject(); + if (object && object != last_object) { + // |IsInLayoutNGInlineFormattingContext()| is cleared if its + // NGInlineItem was invalidted. + if (object->IsInLayoutNGInlineFormattingContext()) + object->SetFirstInlineFragment(nullptr); + last_object = object; + } + } + if (fragment.IsLineBox() || fragment.IsInlineBox() || + fragment.IsColumnBox()) { + child->ClearAssociationWithLayoutObject(); + } else { + DCHECK(fragment.IsText() || fragment.IsBlockFormattingContextRoot()); + DCHECK(child->Children().IsEmpty()); + } + } +} + const NGPaintFragment* NGPaintFragment::GetForInlineContainer( const LayoutObject* layout_object) { DCHECK(layout_object && layout_object->IsInline()); @@ -527,6 +571,13 @@ return fragment; } +void NGPaintFragment::LayoutObjectWillBeDestroyed() { + for (NGPaintFragment* fragment = this; fragment; + fragment = fragment->next_for_same_layout_object_) { + fragment->is_layout_object_destroyed_ = true; + } +} + NGPaintFragment::NGInkOverflowModel::NGInkOverflowModel( const PhysicalRect& self_ink_overflow, const PhysicalRect& contents_ink_overflow)
diff --git a/third_party/blink/renderer/core/paint/ng/ng_paint_fragment.h b/third_party/blink/renderer/core/paint/ng/ng_paint_fragment.h index ca39aee..7317732a 100644 --- a/third_party/blink/renderer/core/paint/ng/ng_paint_fragment.h +++ b/third_party/blink/renderer/core/paint/ng/ng_paint_fragment.h
@@ -50,6 +50,7 @@ scoped_refptr<NGPaintFragment> previous_instance = nullptr); const NGPhysicalFragment& PhysicalFragment() const { + CHECK(!is_layout_object_destroyed_); return *physical_fragment_; } @@ -115,7 +116,7 @@ public: static NGPaintFragment* Next(NGPaintFragment* current) { - return current->next_sibling_.get(); + return current->NextSibling(); } }; using ChildList = List<TraverseNextSibling>; @@ -124,9 +125,11 @@ // is not for NGPaint. In the first phase, this means that this is a root of // an inline formatting context. NGPaintFragment* Parent() const { return parent_; } - NGPaintFragment* FirstChild() const { return first_child_.get(); } - NGPaintFragment* NextSibling() const { return next_sibling_.get(); } - ChildList Children() const { return ChildList(first_child_.get()); } + NGPaintFragment* FirstChild() const { return FirstAlive(first_child_.get()); } + NGPaintFragment* NextSibling() const { + return FirstAlive(next_sibling_.get()); + } + ChildList Children() const { return ChildList(FirstChild()); } // Note, as the name implies, |IsDescendantOfNotSelf| returns false for the // same object. This is different from |LayoutObject::IsDescendant| but is @@ -269,6 +272,9 @@ const NGPaintFragment* LastForSameLayoutObject() const; NGPaintFragment* LastForSameLayoutObject(); + void LayoutObjectWillBeDestroyed(); + + void ClearAssociationWithLayoutObject(); // Called when lines containing |child| is dirty. static void DirtyLinesFromChangedChild(LayoutObject* child); @@ -288,6 +294,14 @@ static base::Optional<PhysicalRect> LocalVisualRectFor(const LayoutObject&); private: + // Returns the first "alive" fragment; i.e., fragment that doesn't have + // destroyed LayoutObject. + static NGPaintFragment* FirstAlive(NGPaintFragment* fragment) { + while (UNLIKELY(fragment && fragment->is_layout_object_destroyed_)) + fragment = fragment->next_sibling_.get(); + return fragment; + } + struct CreateContext { STACK_ALLOCATED(); @@ -301,6 +315,7 @@ last_fragment_map(parent_context->last_fragment_map), previous_instance(std::move(parent->first_child_)) {} + void SkipDestroyedPreviousInstances(); void DestroyPreviousInstances(); NGPaintFragment* parent = nullptr; @@ -372,6 +387,9 @@ }; std::unique_ptr<NGInkOverflowModel> ink_overflow_; + // Set when the corresponding LayoutObject is destroyed. + unsigned is_layout_object_destroyed_ : 1; + // For a line box, this indicates it is dirty. This helps to determine if the // fragment is re-usable when part of an inline formatting context is changed. // For an inline box, this flag helps to avoid traversing up to its line box
diff --git a/third_party/blink/renderer/core/paint/ng/ng_paint_fragment_test.cc b/third_party/blink/renderer/core/paint/ng/ng_paint_fragment_test.cc index e2d33a8..581f020 100644 --- a/third_party/blink/renderer/core/paint/ng/ng_paint_fragment_test.cc +++ b/third_party/blink/renderer/core/paint/ng/ng_paint_fragment_test.cc
@@ -696,6 +696,44 @@ EXPECT_FALSE(ToList(container.Children())[2]->IsDirty()); } +static const char* inline_child_data[] = { + "<span id='child'>XXX</span>", + "<span id='child' style='background: yellow'>XXX</span>", + "<span id='child' style='display: inline-block'>XXX</span>", +}; + +class InlineChildTest : public NGPaintFragmentTest, + public testing::WithParamInterface<const char*> {}; + +INSTANTIATE_TEST_SUITE_P(NGPaintFragmentTest, + InlineChildTest, + testing::ValuesIn(inline_child_data)); + +TEST_P(InlineChildTest, RemoveInlineChild) { + SetBodyInnerHTML(String(R"HTML( + <!DOCTYPE html> + <style> + </style> + <body> + <div id="container"> + 12345 + )HTML") + GetParam() + + R"HTML( + 67890 + </div> + </body> + )HTML"); + const NGPaintFragment* container = GetPaintFragmentByElementId("container"); + const NGPaintFragment& linebox = container->Children().front(); + EXPECT_EQ(linebox.Children().size(), 3u); + + Element* child = GetElementById("child"); + child->remove(); + + // Destroyed children should be eliminated immediately. + EXPECT_EQ(linebox.Children().size(), 2u); +} + TEST_F(NGPaintFragmentTest, MarkLineBoxesDirtyByRemoveChild) { if (!RuntimeEnabledFeatures::LayoutNGLineCacheEnabled()) return;
diff --git a/third_party/blink/renderer/core/paint/paint_invalidator.cc b/third_party/blink/renderer/core/paint/paint_invalidator.cc index e0b2fab..00a11989 100644 --- a/third_party/blink/renderer/core/paint/paint_invalidator.cc +++ b/third_party/blink/renderer/core/paint/paint_invalidator.cc
@@ -9,6 +9,7 @@ #include "third_party/blink/renderer/core/frame/local_frame.h" #include "third_party/blink/renderer/core/frame/local_frame_view.h" #include "third_party/blink/renderer/core/frame/settings.h" +#include "third_party/blink/renderer/core/layout/jank_tracker.h" #include "third_party/blink/renderer/core/layout/layout_block_flow.h" #include "third_party/blink/renderer/core/layout/layout_table.h" #include "third_party/blink/renderer/core/layout/layout_table_section.h" @@ -270,6 +271,13 @@ fragment_data.PaintOffset()); fragment_data.SetVisualRect(ComputeVisualRect(object, context)); + + object.GetFrameView()->GetJankTracker().NotifyObjectPrePaint( + object, + PropertyTreeState(*context.tree_builder_context_->current.transform, + *context.tree_builder_context_->current.clip, + *context.tree_builder_context_->current_effect), + context.old_visual_rect, fragment_data.VisualRect()); } void PaintInvalidator::UpdateEmptyVisualRectFlag(
diff --git a/third_party/blink/renderer/core/paint/pre_paint_tree_walk.cc b/third_party/blink/renderer/core/paint/pre_paint_tree_walk.cc index ad7db2f..0f5ee2a 100644 --- a/third_party/blink/renderer/core/paint/pre_paint_tree_walk.cc +++ b/third_party/blink/renderer/core/paint/pre_paint_tree_walk.cc
@@ -391,10 +391,6 @@ ToLayoutBoxModelObject(object).Layer()->SetNeedsRepaint(); CompositingLayerPropertyUpdater::Update(object); - - object.GetFrameView()->GetJankTracker().NotifyObjectPrePaint( - object, paint_invalidator_context.old_visual_rect, - *paint_invalidator_context.painting_layer); } void PrePaintTreeWalk::Walk(const LayoutObject& object) {
diff --git a/third_party/blink/renderer/core/paint/text_paint_timing_detector.cc b/third_party/blink/renderer/core/paint/text_paint_timing_detector.cc index 4ce711e..d179191 100644 --- a/third_party/blink/renderer/core/paint/text_paint_timing_detector.cc +++ b/third_party/blink/renderer/core/paint/text_paint_timing_detector.cc
@@ -179,6 +179,17 @@ Node* node = object.GetNode(); if (!node) return false; + // If we have finished recording Largest Text Paint and the element is a + // shadow element or has no elementtiming attribute, then we should not record + // its text. + if (!is_recording_ltp_) { + if (node->IsInShadowTree() || !node->IsElementNode() || + ToElement(node) + ->FastGetAttribute(html_names::kElementtimingAttr) + .IsEmpty()) { + return false; + } + } DOMNodeId node_id = DOMNodeIds::ExistingIdForNode(node); if (node_id == kInvalidDOMNodeId) return true;
diff --git a/third_party/blink/renderer/core/script/html_parser_script_runner.cc b/third_party/blink/renderer/core/script/html_parser_script_runner.cc index 2a22c04..52a1702 100644 --- a/third_party/blink/renderer/core/script/html_parser_script_runner.cc +++ b/third_party/blink/renderer/core/script/html_parser_script_runner.cc
@@ -299,7 +299,14 @@ return; } - host_->NotifyScriptLoaded(pending_script); + // Posting the script execution part to a new task so that we can allow + // yielding for cooperative scheduling. Cooperative scheduling requires that + // the Blink C++ stack be thin when it executes JavaScript. + document_->GetTaskRunner(TaskType::kInternalContinueScriptLoading) + ->PostTask(FROM_HERE, + WTF::Bind(&HTMLParserScriptRunnerHost::NotifyScriptLoaded, + WrapPersistent(host_.Get()), + WrapPersistent(pending_script))); } // <specdef href="https://html.spec.whatwg.org/C/#scriptEndTag">
diff --git a/third_party/blink/renderer/core/svg/graphics/svg_image.cc b/third_party/blink/renderer/core/svg/graphics/svg_image.cc index 943099a..1a9feed0 100644 --- a/third_party/blink/renderer/core/svg/graphics/svg_image.cc +++ b/third_party/blink/renderer/core/svg/graphics/svg_image.cc
@@ -789,7 +789,8 @@ TRACE_EVENT0("blink", "SVGImage::dataChanged::createFrame"); DCHECK(!frame_client_); frame_client_ = MakeGarbageCollected<SVGImageLocalFrameClient>(this); - frame = MakeGarbageCollected<LocalFrame>(frame_client_, *page, nullptr); + frame = MakeGarbageCollected<LocalFrame>(frame_client_, *page, nullptr, + nullptr, nullptr); frame->SetView(MakeGarbageCollected<LocalFrameView>(*frame)); frame->Init(); }
diff --git a/third_party/blink/renderer/core/testing/core_unit_test_helper.cc b/third_party/blink/renderer/core/testing/core_unit_test_helper.cc index ba94f888..844ae32 100644 --- a/third_party/blink/renderer/core/testing/core_unit_test_helper.cc +++ b/third_party/blink/renderer/core/testing/core_unit_test_helper.cc
@@ -23,7 +23,8 @@ auto* child_client = MakeGarbageCollected<LocalFrameClientWithParent>(parent_frame); child_ = MakeGarbageCollected<LocalFrame>( - child_client, *parent_frame->GetPage(), owner_element); + child_client, *parent_frame->GetPage(), owner_element, + &parent_frame->window_agent_factory(), nullptr); child_->CreateView(IntSize(500, 500), Color::kTransparent); child_->Init();
diff --git a/third_party/blink/renderer/core/testing/dummy_page_holder.cc b/third_party/blink/renderer/core/testing/dummy_page_holder.cc index 879592b3..902b9d87 100644 --- a/third_party/blink/renderer/core/testing/dummy_page_holder.cc +++ b/third_party/blink/renderer/core/testing/dummy_page_holder.cc
@@ -78,8 +78,11 @@ if (!local_frame_client_) local_frame_client_ = MakeGarbageCollected<DummyLocalFrameClient>(); + // Create new WindowAgentFactory as this page will be isolated from others. frame_ = MakeGarbageCollected<LocalFrame>(local_frame_client_.Get(), *page_, - nullptr); + /* FrameOwner* */ nullptr, + /* WindowAgentFactory* */ nullptr, + /* InterfaceRegistry* */ nullptr); frame_->SetView( MakeGarbageCollected<LocalFrameView>(*frame_, initial_view_size)); frame_->View()->GetPage()->GetVisualViewport().SetSize(initial_view_size);
diff --git a/third_party/blink/renderer/devtools/front_end/accessibility/AccessibilityNodeView.js b/third_party/blink/renderer/devtools/front_end/accessibility/AccessibilityNodeView.js index f7776e3e..a8991b0 100644 --- a/third_party/blink/renderer/devtools/front_end/accessibility/AccessibilityNodeView.js +++ b/third_party/blink/renderer/devtools/front_end/accessibility/AccessibilityNodeView.js
@@ -164,7 +164,7 @@ const nameElement = createElement('span'); const AXAttributes = Accessibility.AccessibilityStrings.AXAttributes; if (name in AXAttributes) { - nameElement.textContent = ls(AXAttributes[name].name); + nameElement.textContent = AXAttributes[name].name; nameElement.title = AXAttributes[name].description; nameElement.classList.add('ax-readable-name'); } else { @@ -392,8 +392,8 @@ if (source.nativeSource) { const AXNativeSourceTypes = Accessibility.AccessibilityStrings.AXNativeSourceTypes; const nativeSource = source.nativeSource; - nameElement.textContent = ls(AXNativeSourceTypes[nativeSource].name); - nameElement.title = ls(AXNativeSourceTypes[nativeSource].description); + nameElement.textContent = AXNativeSourceTypes[nativeSource].name; + nameElement.title = AXNativeSourceTypes[nativeSource].description; nameElement.classList.add('ax-readable-name'); break; } @@ -404,12 +404,12 @@ default: const AXSourceTypes = Accessibility.AccessibilityStrings.AXSourceTypes; if (type in AXSourceTypes) { - nameElement.textContent = ls(AXSourceTypes[type].name); - nameElement.title = ls(AXSourceTypes[type].description); + nameElement.textContent = AXSourceTypes[type].name; + nameElement.title = AXSourceTypes[type].description; nameElement.classList.add('ax-readable-name'); } else { console.warn(type, 'not in AXSourceTypes'); - nameElement.textContent = ls(type); + nameElement.textContent = type; } } this.listItemElement.appendChild(nameElement);
diff --git a/third_party/blink/renderer/devtools/front_end/accessibility/AccessibilityStrings.js b/third_party/blink/renderer/devtools/front_end/accessibility/AccessibilityStrings.js index a6f573b..f42870e 100644 --- a/third_party/blink/renderer/devtools/front_end/accessibility/AccessibilityStrings.js +++ b/third_party/blink/renderer/devtools/front_end/accessibility/AccessibilityStrings.js
@@ -5,186 +5,186 @@ Accessibility.AccessibilityStrings.AXAttributes = { 'disabled': { - name: 'Disabled', - description: 'If true, this element currently cannot be interacted with.', + name: ls`Disabled`, + description: ls`If true, this element currently cannot be interacted with.`, group: 'AXGlobalStates' }, 'invalid': { - name: 'Invalid user entry', - description: 'If true, this element\'s user-entered value does not conform to validation requirement.', + name: ls`Invalid user entry`, + description: ls`If true, this element's user-entered value does not conform to validation requirement.`, group: 'AXGlobalStates' }, - 'editable': {name: 'Editable', description: 'If and how this element can be edited.'}, - 'focusable': {name: 'Focusable', description: 'If true, this element can recieve focus.'}, - 'focused': {name: 'Focused', description: 'If true, this element currently has focus.'}, - 'settable': {name: 'Can set value', description: 'Whether the value of this element can be set.'}, + 'editable': {name: ls`Editable`, description: ls`If and how this element can be edited.`}, + 'focusable': {name: ls`Focusable`, description: ls`If true, this element can receive focus.`}, + 'focused': {name: ls`Focused`, description: ls`If true, this element currently has focus.`}, + 'settable': {name: ls`Can set value`, description: ls`Whether the value of this element can be set.`}, 'live': { - name: 'Live region', - description: 'Whether and what priority of live updates may be expected for this element.', + name: ls`Live region`, + description: ls`Whether and what priority of live updates may be expected for this element.`, group: 'AXLiveRegionAttributes' }, - 'atomic': { - name: 'Atomic (live regions)', - description: - 'If this element may receive live updates, whether the entire live region should be presented to the user on changes, or only changed nodes.', + 'atomic': {name: ls`Atomic (live regions)`, description: ls + `If this element may receive live updates, whether the entire live region should be presented to the user on changes, or only changed nodes.`, group: 'AXLiveRegionAttributes' }, 'relevant': { - name: 'Relevant (live regions)', - description: 'If this element may receive live updates, what type of updates should trigger a notification.', + name: ls`Relevant (live regions)`, + description: ls`If this element may receive live updates, what type of updates should trigger a notification.`, group: 'AXLiveRegionAttributes' }, 'busy': { - name: 'Busy (live regions)', - description: - 'Whether this element or its subtree are currently being updated (and thus may be in an inconsistent state).', + name: ls`Busy (live regions)`, + description: ls + `Whether this element or its subtree are currently being updated (and thus may be in an inconsistent state).`, group: 'AXLiveRegionAttributes' }, 'root': { - name: 'Live region root', - description: 'If this element may receive live updates, the root element of the containing live region.', + name: ls`Live region root`, + description: ls`If this element may receive live updates, the root element of the containing live region.`, group: 'AXLiveRegionAttributes' }, 'autocomplete': { - name: 'Has autocomplete', - description: 'Whether and what type of autocomplete suggestions are currently provided by this element.', + name: ls`Has autocomplete`, + description: ls`Whether and what type of autocomplete suggestions are currently provided by this element.`, group: 'AXWidgetAttributes' }, 'haspopup': { - name: 'Has popup', - description: 'Whether this element has caused some kind of pop-up (such as a menu) to appear.', + name: ls`Has popup`, + description: ls`Whether this element has caused some kind of pop-up (such as a menu) to appear.`, group: 'AXWidgetAttributes' }, - 'level': {name: 'Level', description: 'The hierarchical level of this element.', group: 'AXWidgetAttributes'}, + 'level': {name: ls`Level`, description: ls`The hierarchical level of this element.`, group: 'AXWidgetAttributes'}, 'multiselectable': { - name: 'Multi-selectable', - description: 'Whether a user may select more than one option from this widget.', + name: ls`Multi-selectable`, + description: ls`Whether a user may select more than one option from this widget.`, group: 'AXWidgetAttributes' }, 'orientation': { - name: 'Orientation', - description: 'Whether this linear element\'s orientation is horizontal or vertical.', + name: ls`Orientation`, + description: ls`Whether this linear element's orientation is horizontal or vertical.`, group: 'AXWidgetAttributes' }, 'multiline': { - name: 'Multi-line', - description: 'Whether this textbox may have more than one line.', + name: ls`Multi-line`, + description: ls`Whether this text box may have more than one line.`, group: 'AXWidgetAttributes' }, 'readonly': { - name: 'Read-only', - description: 'If true, this element may be interacted with, but its value cannot be changed.', + name: ls`Read-only`, + description: ls`If true, this element may be interacted with, but its value cannot be changed.`, group: 'AXWidgetAttributes' }, 'required': { - name: 'Required', - description: 'Whether this element is a required field in a form.', + name: ls`Required`, + description: ls`Whether this element is a required field in a form.`, group: 'AXWidgetAttributes' }, 'valuemin': { - name: 'Minimum value', - description: 'For a range widget, the minimum allowed value.', + name: ls`Minimum value`, + description: ls`For a range widget, the minimum allowed value.`, group: 'AXWidgetAttributes' }, 'valuemax': { - name: 'Maximum value', - description: 'For a range widget, the maximum allowed value.', + name: ls`Maximum value`, + description: ls`For a range widget, the maximum allowed value.`, group: 'AXWidgetAttributes' }, 'valuetext': { - name: 'Value description', - description: 'A human-readable version of the value of a range widget (where necessary).', + name: ls`Value description`, + description: ls`A human-readable version of the value of a range widget (where necessary).`, group: 'AXWidgetAttributes' }, 'checked': { - name: 'Checked', - description: - 'Whether this checkbox, radio button or tree item is checked, unchecked, or mixed (e.g. has both checked and un-checked children).', + name: ls`Checked`, + description: ls + `Whether this checkbox, radio button or tree item is checked, unchecked, or mixed (e.g. has both checked and un-checked children).`, group: 'AXWidgetStates' }, 'expanded': { - name: 'Expanded', - description: 'Whether this element, or another grouping element it controls, is expanded.', + name: ls`Expanded`, + description: ls`Whether this element, or another grouping element it controls, is expanded.`, group: 'AXWidgetStates' }, 'pressed': { - name: 'Pressed', - description: 'Whether this toggle button is currently in a pressed state.', + name: ls`Pressed`, + description: ls`Whether this toggle button is currently in a pressed state.`, group: 'AXWidgetStates' }, 'selected': { - name: 'Selected', - description: 'Whether the option represented by this element is currently selected.', + name: ls`Selected`, + description: ls`Whether the option represented by this element is currently selected.`, group: 'AXWidgetStates' }, 'activedescendant': { - name: 'Active descendant', - description: 'The descendant of this element which is active; i.e. the element to which focus should be delegated.', + name: ls`Active descendant`, + description: ls + `The descendant of this element which is active; i.e. the element to which focus should be delegated.`, group: 'AXRelationshipAttributes' }, 'flowto': { - name: 'Flows to', - description: - 'Element to which the user may choose to navigate after this one, instead of the next element in the DOM order.', + name: ls`Flows to`, + description: ls + `Element to which the user may choose to navigate after this one, instead of the next element in the DOM order.`, group: 'AXRelationshipAttributes' }, 'controls': { - name: 'Controls', - description: 'Element or elements whose content or presence is/are controlled by this widget.', + name: ls`Controls`, + description: ls`Element or elements whose content or presence is/are controlled by this widget.`, group: 'AXRelationshipAttributes' }, 'describedby': { - name: 'Described by', - description: 'Element or elements which form the description of this element.', + name: ls`Described by`, + description: ls`Element or elements which form the description of this element.`, group: 'AXRelationshipAttributes' }, 'labelledby': { - name: 'Labeled by', - description: 'Element or elements which may form the name of this element.', + name: ls`Labeled by`, + description: ls`Element or elements which may form the name of this element.`, group: 'AXRelationshipAttributes' }, 'owns': { - name: 'Owns', - description: - 'Element or elements which should be considered descendants of this element, despite not being descendants in the DOM.', + name: ls`Owns`, + description: ls + `Element or elements which should be considered descendants of this element, despite not being descendants in the DOM.`, group: 'AXRelationshipAttributes' }, - 'name': {name: 'Name', description: 'The computed name of this element.', group: 'Default'}, + 'name': {name: ls`Name`, description: ls`The computed name of this element.`, group: 'Default'}, 'role': { - name: 'Role', - description: - 'Indicates the purpose of this element, such as a user interface idiom for a widget, or structural role within a document.', + name: ls`Role`, + description: ls + `Indicates the purpose of this element, such as a user interface idiom for a widget, or structural role within a document.`, group: 'Default' }, 'value': { - name: 'Value', - description: - 'The value of this element; this may be user-provided or developer-provided, depending on the element.', + name: ls`Value`, + description: ls + `The value of this element; this may be user-provided or developer-provided, depending on the element.`, group: 'Default' }, - 'help': {name: 'Help', description: 'The computed help text for this element.', group: 'Default'}, - 'description': {name: 'Description', description: 'The accessible description for this element.', group: 'Default'} + 'help': {name: ls`Help`, description: ls`The computed help text for this element.`, group: 'Default'}, + 'description': + {name: ls`Description`, description: ls`The accessible description for this element.`, group: 'Default'} }; Accessibility.AccessibilityStrings.AXSourceTypes = { - 'attribute': {name: 'From attribute', description: 'Value from attribute.'}, + 'attribute': {name: ls`From attribute`, description: ls`Value from attribute.`}, 'implicit': { - name: 'Implicit', - description: 'Implicit value.', + name: ls`Implicit`, + description: ls`Implicit value.`, }, - 'style': {name: 'From style', description: 'Value from style.'}, - 'contents': {name: 'Contents', description: 'Value from element contents.'}, - 'placeholder': {name: 'From placeholder attribute', description: 'Value from placeholder attribute.'}, - 'relatedElement': {name: 'Related element', description: 'Value from related element.'} + 'style': {name: ls`From style`, description: ls`Value from style.`}, + 'contents': {name: ls`Contents`, description: ls`Value from element contents.`}, + 'placeholder': {name: ls`From placeholder attribute`, description: ls`Value from placeholder attribute.`}, + 'relatedElement': {name: ls`Related element`, description: ls`Value from related element.`} }; Accessibility.AccessibilityStrings.AXNativeSourceTypes = { - 'figcaption': {name: 'From caption', description: 'Value from figcaption element.'}, - 'label': {name: 'From label', description: 'Value from label element.'}, - 'labelfor': {name: 'From label (for)', description: 'Value from label element with for= attribute.'}, - 'labelwrapped': {name: 'From label (wrapped)', description: 'Value from label element wrapped.'}, - 'tablecaption': {name: 'From caption', description: 'Value from table caption.'}, - 'title': {'name': 'From title', 'description': 'Value from title attribute.'}, - 'other': {name: 'From native HTML', description: 'Value from native HTML (unknown source).'}, + 'figcaption': {name: ls`From caption`, description: ls`Value from figcaption element.`}, + 'label': {name: ls`From label`, description: ls`Value from label element.`}, + 'labelfor': {name: ls`From label (for)`, description: ls`Value from label element with for= attribute.`}, + 'labelwrapped': {name: ls`From label (wrapped)`, description: ls`Value from label element wrapped.`}, + 'tablecaption': {name: ls`From caption`, description: ls`Value from table caption.`}, + 'title': {name: ls`From title`, description: ls`Value from title attribute.`}, + 'other': {name: ls`From native HTML`, description: ls`Value from native HTML (unknown source).`}, };
diff --git a/third_party/blink/renderer/devtools/front_end/accessibility/accessibility_strings.grdp b/third_party/blink/renderer/devtools/front_end/accessibility/accessibility_strings.grdp index 4023c8c..eee68a7 100644 --- a/third_party/blink/renderer/devtools/front_end/accessibility/accessibility_strings.grdp +++ b/third_party/blink/renderer/devtools/front_end/accessibility/accessibility_strings.grdp
@@ -1,53 +1,236 @@ <?xml version="1.0" encoding="utf-8"?> <grit-part> + <message name="IDS_DEVTOOLS_04efed137e5da6d8b456e83d87915f16" desc="Tooltip text that appears when hovering over the 'Focusable' attribute name under the Computed Properties section in the Accessibility pane of the Elements pane"> + If true, this element can receive focus. + </message> + <message name="IDS_DEVTOOLS_05a2ce9620a54ad2ec5cbe28ee248342" desc="Accessibility attribute name that appears under the Computed Properties section in the Accessibility pane of the Elements pane"> + Related element + </message> + <message name="IDS_DEVTOOLS_068258ebffe95a5429c1ef2f382a8c07" desc="Tooltip text that appears when hovering over the 'Busy (live regions)' attribute name under the Computed Properties section in the Accessibility pane of the Elements pane"> + Whether this element or its subtree are currently being updated (and thus may be in an inconsistent state). + </message> + <message name="IDS_DEVTOOLS_07e01d7a96d9fd76cf08aa5916f7c788" desc="Accessibility attribute name that appears under the Computed Properties section in the Accessibility pane of the Elements pane"> + Implicit + </message> + <message name="IDS_DEVTOOLS_07eb2f589b3206baa27bc3e976a2ba9d" desc="Tooltip text that appears when hovering over the 'Role' attribute name under the Computed Properties section in the Accessibility pane of the Elements pane"> + Indicates the purpose of this element, such as a user interface idiom for a widget, or structural role within a document. + </message> + <message name="IDS_DEVTOOLS_0a61c3cc7c416744e68854704890b215" desc="Tooltip text that appears when hovering over the 'Invalid user entry' attribute name under the Computed Properties section in the Accessibility pane of the Elements pane"> + If true, this element's user-entered value does not conform to validation requirement. + </message> + <message name="IDS_DEVTOOLS_0bea30a92342d49e6268b53526807666" desc="Tooltip text that appears when hovering over the 'Live region root' attribute name under the Computed Properties section in the Accessibility pane of the Elements pane"> + If this element may receive live updates, the root element of the containing live region. + </message> + <message name="IDS_DEVTOOLS_0d2ff4b5c95c1e4a191e8f9b5215d76d" desc="Accessibility attribute name that appears under the Computed Properties section in the Accessibility pane of the Elements pane"> + Minimum value + </message> + <message name="IDS_DEVTOOLS_12f0fc80eecd7dc42385720176cf55ad" desc="Accessibility attribute name that appears under the Computed Properties section in the Accessibility pane of the Elements pane"> + Can set value + </message> + <message name="IDS_DEVTOOLS_13e64d6db61eb7bc90150fedcfb7ee9e" desc="Tooltip text that appears when hovering over the 'Flows to' attribute name under the Computed Properties section in the Accessibility pane of the Elements pane"> + Element to which the user may choose to navigate after this one, instead of the next element in the DOM order. + </message> + <message name="IDS_DEVTOOLS_15fb40082ce66f64f2025f64cb49c170" desc="Tooltip text that appears when hovering over the 'Active descendant' attribute name under the Computed Properties section in the Accessibility pane of the Elements pane"> + The descendant of this element which is active; i.e. the element to which focus should be delegated. + </message> <message name="IDS_DEVTOOLS_185551542d4a950d6ed4a90e0875dfde" desc=""> Computed Properties </message> <message name="IDS_DEVTOOLS_191abc41f8f74fb8c9671ca8f21b7433" desc=""> Element not interesting for accessibility. </message> + <message name="IDS_DEVTOOLS_1a759e882af91f6d006758443983681a" desc="Tooltip text that appears when hovering over the 'Multi-selectable' attribute name under the Computed Properties section in the Accessibility pane of the Elements pane"> + Whether a user may select more than one option from this widget. + </message> <message name="IDS_DEVTOOLS_1c2be4cda7b85620e6dca5fb505feedc" desc=""> Element has empty alt text. </message> + <message name="IDS_DEVTOOLS_1d95e5222e3708a525194a4a9a084275" desc="Tooltip text that appears when hovering over the 'Has autocomplete' attribute name under the Computed Properties section in the Accessibility pane of the Elements pane"> + Whether and what type of autocomplete suggestions are currently provided by this element. + </message> + <message name="IDS_DEVTOOLS_1e3c246d40f5f65d98e6865f989207bb" desc="Tooltip text that appears when hovering over the 'Live region' attribute name under the Computed Properties section in the Accessibility pane of the Elements pane"> + Whether and what priority of live updates may be expected for this element. + </message> + <message name="IDS_DEVTOOLS_24b44c7e76bab574ef8f632e607200c6" desc="Accessibility attribute name that appears under the Computed Properties section in the Accessibility pane of the Elements pane"> + From attribute + </message> + <message name="IDS_DEVTOOLS_24b6472fcfa59cddd3f7bbc326582b5f" desc="Accessibility attribute name that appears under the Computed Properties section in the Accessibility pane of the Elements pane"> + Controls + </message> + <message name="IDS_DEVTOOLS_2627637e263ef687fa978b576580b8b1" desc="Accessibility attribute name that appears under the Computed Properties section in the Accessibility pane of the Elements pane"> + Checked + </message> + <message name="IDS_DEVTOOLS_2708e98a9741358c94c4d311e4fe5ebd" desc="Tooltip text that appears when hovering over the 'Minimum value' attribute name under the Computed Properties section in the Accessibility pane of the Elements pane"> + For a range widget, the minimum allowed value. + </message> + <message name="IDS_DEVTOOLS_2c09e798bf8c5a82d211331c82893a0f" desc="Accessibility attribute name that appears under the Computed Properties section in the Accessibility pane of the Elements pane"> + Editable + </message> + <message name="IDS_DEVTOOLS_38448aeeec239421db05e4226971546f" desc="Accessibility attribute name that appears under the Computed Properties section in the Accessibility pane of the Elements pane"> + Value description + </message> + <message name="IDS_DEVTOOLS_38d37768a9274b6bca0dca4329513be5" desc="Tooltip text that appears when hovering over the 'From title' attribute name under the Computed Properties section in the Accessibility pane of the Elements pane"> + Value from title attribute. + </message> <message name="IDS_DEVTOOLS_3b1afa99cd297c96939424e1438e12f2" desc=""> Element inherits presentational role from </message> + <message name="IDS_DEVTOOLS_3cf113006fc26a6c1b47b15659b3f4eb" desc="Tooltip text that appears when hovering over the 'Labeled by' attribute name under the Computed Properties section in the Accessibility pane of the Elements pane"> + Element or elements which may form the name of this element. + </message> + <message name="IDS_DEVTOOLS_3cfcced512b6297b6f9f736c104e5358" desc="Tooltip text that appears when hovering over the 'Expanded' attribute name under the Computed Properties section in the Accessibility pane of the Elements pane"> + Whether this element, or another grouping element it controls, is expanded. + </message> + <message name="IDS_DEVTOOLS_3dbfe71b566f271669f4f19a530eb336" desc="Tooltip text that appears when hovering over the 'Focused' attribute name under the Computed Properties section in the Accessibility pane of the Elements pane"> + If true, this element currently has focus. + </message> + <message name="IDS_DEVTOOLS_3e52d529681b27fb768252be67f91c97" desc="Accessibility attribute name that appears under the Computed Properties section in the Accessibility pane of the Elements pane"> + From label (for) + </message> + <message name="IDS_DEVTOOLS_3f419458e82d6acd9c0d7f629c827145" desc="Accessibility attribute name that appears under the Computed Properties section in the Accessibility pane of the Elements pane"> + Labeled by + </message> + <message name="IDS_DEVTOOLS_422d799fbcb8be1e5165715fa83c4583" desc="Accessibility attribute name that appears under the Computed Properties section in the Accessibility pane of the Elements pane"> + Described by + </message> + <message name="IDS_DEVTOOLS_45ee38fb0d5ae40faaaefa51e5d54966" desc="Accessibility attribute name that appears under the Computed Properties section in the Accessibility pane of the Elements pane"> + Multi-selectable + </message> + <message name="IDS_DEVTOOLS_46a64c89d66d278297b6346c60f67e2c" desc="Tooltip text that appears when hovering over the 'Value description' attribute name under the Computed Properties section in the Accessibility pane of the Elements pane"> + A human-readable version of the value of a range widget (where necessary). + </message> <message name="IDS_DEVTOOLS_4ada42850cc2d4e41f3da5254ec2feee" desc=""> Element is inert. </message> + <message name="IDS_DEVTOOLS_4ecb3834878eb89dd33d5aa34ba17b3e" desc="Tooltip text that appears when hovering over the 'Orientation' attribute name under the Computed Properties section in the Accessibility pane of the Elements pane"> + Whether this linear element's orientation is horizontal or vertical. + </message> + <message name="IDS_DEVTOOLS_524c2f4506c117954fd1c95ec5247495" desc="Tooltip text that appears when hovering over the 'Level' attribute name under the Computed Properties section in the Accessibility pane of the Elements pane"> + The hierarchical level of this element. + </message> <message name="IDS_DEVTOOLS_52886045a6932b0bbb56620fe5c584bf" desc=""> Ancestor's children are all presentational: </message> + <message name="IDS_DEVTOOLS_54b1f0b8e6ab39d96897d1c05836db84" desc="Tooltip text that appears when hovering over the 'Relevant (live regions)' attribute name under the Computed Properties section in the Accessibility pane of the Elements pane"> + If this element may receive live updates, what type of updates should trigger a notification. + </message> + <message name="IDS_DEVTOOLS_56d1080a1e9e298e520e65be690efd93" desc="Tooltip text that appears when hovering over the 'Atomic (live regions)' attribute name under the Computed Properties section in the Accessibility pane of the Elements pane"> + If this element may receive live updates, whether the entire live region should be presented to the user on changes, or only changed nodes. + </message> + <message name="IDS_DEVTOOLS_570e629208d2b9a6e2a312dcd7fa855d" desc="Tooltip text that appears when hovering over the 'From label (for)' attribute name under the Computed Properties section in the Accessibility pane of the Elements pane"> + Value from label element with for= attribute. + </message> <message name="IDS_DEVTOOLS_5a51e4de1a235f3f67e816cb561d3d5a" desc=""> Element is <ph name="ARIAHIDDENSPAN">$1s</ph>. </message> + <message name="IDS_DEVTOOLS_5cb7a9a4a6eb6614869a518b7323a61d" desc="Tooltip text that appears when hovering over the 'Description' attribute name under the Computed Properties section in the Accessibility pane of the Elements pane"> + The accessible description for this element. + </message> <message name="IDS_DEVTOOLS_5cd2b4477fa05212ce32e073702b6938" desc=""> No ARIA attributes </message> <message name="IDS_DEVTOOLS_5d910721a6256ce42c8c6308dc60ff40" desc=""> Static text node is used as name for </message> + <message name="IDS_DEVTOOLS_5e2c648cec53676f6fa0acbf702eccfc" desc="Accessibility attribute name that appears under the Computed Properties section in the Accessibility pane of the Elements pane"> + From style + </message> <message name="IDS_DEVTOOLS_5f05a00053834655de812d3447545a17" desc=""> No node with this ID. </message> + <message name="IDS_DEVTOOLS_63f6baf1d88963b8c8210751c8530e94" desc="Accessibility attribute name that appears under the Computed Properties section in the Accessibility pane of the Elements pane"> + Expanded + </message> + <message name="IDS_DEVTOOLS_6444fb2d544ab7073a785759497fe5b8" desc="Accessibility attribute name that appears under the Computed Properties section in the Accessibility pane of the Elements pane"> + From native HTML + </message> + <message name="IDS_DEVTOOLS_674d8a03d6bb22d48dff01565c2b10a3" desc="Accessibility attribute name that appears under the Computed Properties section in the Accessibility pane of the Elements pane"> + Owns + </message> + <message name="IDS_DEVTOOLS_73f3b04d99cdbbfb2045ad2285986d77" desc="Accessibility attribute name that appears under the Computed Properties section in the Accessibility pane of the Elements pane"> + Maximum value + </message> + <message name="IDS_DEVTOOLS_7506ced399bb4ab929942493dffb8be9" desc="Tooltip text that appears when hovering over the 'From label (wrapped)' attribute name under the Computed Properties section in the Accessibility pane of the Elements pane"> + Value from label element wrapped. + </message> + <message name="IDS_DEVTOOLS_76d01b44b32289a65360a4ba164b329f" desc="Tooltip text that appears when hovering over the 'Required' attribute name under the Computed Properties section in the Accessibility pane of the Elements pane"> + Whether this element is a required field in a form. + </message> + <message name="IDS_DEVTOOLS_7882d6b9ff794f0ed72656149e7dd037" desc="Tooltip text that appears when hovering over the 'Implicit' attribute name under the Computed Properties section in the Accessibility pane of the Elements pane"> + Implicit value. + </message> <message name="IDS_DEVTOOLS_7d615068dd4fb142c11a29553b9b83bf" desc=""> Element is presentational. </message> + <message name="IDS_DEVTOOLS_7eedfa765b9cfe7345e3b7e20148738d" desc="Accessibility attribute name that appears under the Computed Properties section in the Accessibility pane of the Elements pane"> + From placeholder attribute + </message> + <message name="IDS_DEVTOOLS_806cb54fdaa10d7c21dc6c00d17e9a08" desc="Tooltip text that appears when hovering over the 'From native HTML' attribute name under the Computed Properties section in the Accessibility pane of the Elements pane"> + Value from native HTML (unknown source). + </message> <message name="IDS_DEVTOOLS_80c9f4e5b244cf617075b8ce23a3ed27" desc=""> ARIA Attributes </message> + <message name="IDS_DEVTOOLS_874b430cd4166d886a99f05d7fc14a81" desc="Accessibility attribute name that appears under the Computed Properties section in the Accessibility pane of the Elements pane"> + Has autocomplete + </message> + <message name="IDS_DEVTOOLS_88ac37355d818b18b26ec88d0e84adec" desc="Accessibility attribute name that appears under the Computed Properties section in the Accessibility pane of the Elements pane"> + Focusable + </message> + <message name="IDS_DEVTOOLS_8d1e218236bebc19ebbcc1c0008407c6" desc="Accessibility attribute name that appears under the Computed Properties section in the Accessibility pane of the Elements pane"> + Invalid user entry + </message> + <message name="IDS_DEVTOOLS_90d7af21ecb6385b5a5e16cfffd07e1d" desc="Tooltip text that appears when hovering over the 'Contents' attribute name under the Computed Properties section in the Accessibility pane of the Elements pane"> + Value from element contents. + </message> + <message name="IDS_DEVTOOLS_91b442d385b54e1418d81adc34871053" desc="Accessibility attribute name that appears under the Computed Properties section in the Accessibility pane of the Elements pane"> + Selected + </message> <message name="IDS_DEVTOOLS_939aaa05e0943b39eab3a34fd609384d" desc=""> Scroll into view </message> + <message name="IDS_DEVTOOLS_953f80ed9077d40149a8e68448f09e47" desc="Accessibility attribute name that appears under the Computed Properties section in the Accessibility pane of the Elements pane"> + From label (wrapped) + </message> + <message name="IDS_DEVTOOLS_954d1813cbd929582346898482fa370a" desc="Accessibility attribute name that appears under the Computed Properties section in the Accessibility pane of the Elements pane"> + Has popup + </message> + <message name="IDS_DEVTOOLS_95ed994edf3b74ebaa5c07378adb1b6a" desc="Tooltip text that appears when hovering over the 'Multi-line' attribute name under the Computed Properties section in the Accessibility pane of the Elements pane"> + Whether this text box may have more than one line. + </message> <message name="IDS_DEVTOOLS_970e14ef4e4d726d36b6ed0ea92bef83" desc=""> Accessibility node not exposed </message> <message name="IDS_DEVTOOLS_98b6f72f9b4c1883deddc61bc62d71eb" desc=""> Element is not visible. </message> + <message name="IDS_DEVTOOLS_98bd032b07fb2909f106262ffb0a6c4f" desc="Accessibility attribute name that appears under the Computed Properties section in the Accessibility pane of the Elements pane"> + Live region + </message> + <message name="IDS_DEVTOOLS_9a68c121520a792ecf2e08730cd7e1a9" desc="Tooltip text that appears when hovering over the 'Has popup' attribute name under the Computed Properties section in the Accessibility pane of the Elements pane"> + Whether this element has caused some kind of pop-up (such as a menu) to appear. + </message> + <message name="IDS_DEVTOOLS_9e8e28c5e23d1a212c6afc9cdffb9a0e" desc="Tooltip text that appears when hovering over the 'From caption' attribute name under the Computed Properties section in the Accessibility pane of the Elements pane"> + Value from table caption. + </message> + <message name="IDS_DEVTOOLS_a0db49ba470c1c9ae2128c3470339153" desc="Accessibility attribute name that appears under the Computed Properties section in the Accessibility pane of the Elements pane"> + Level + </message> + <message name="IDS_DEVTOOLS_a2e08e1fbbc3e1489d688eba112f7964" desc="Accessibility attribute name that appears under the Computed Properties section in the Accessibility pane of the Elements pane"> + Focused + </message> + <message name="IDS_DEVTOOLS_a38feabd83f0c880aee942fef26450a2" desc="Accessibility attribute name that appears under the Computed Properties section in the Accessibility pane of the Elements pane"> + From label + </message> <message name="IDS_DEVTOOLS_a4853b77c462337ed9fecc32e4d44d7b" desc=""> Accessibility Tree </message> + <message name="IDS_DEVTOOLS_a52f614f078fc6dc7273418b6b35b75a" desc="Tooltip text that appears when hovering over the 'Related element' attribute name under the Computed Properties section in the Accessibility pane of the Elements pane"> + Value from related element. + </message> + <message name="IDS_DEVTOOLS_a69a05e6fc6cc0de6eb9b43a720d6a2b" desc="Accessibility attribute name that appears under the Computed Properties section in the Accessibility pane of the Elements pane"> + From caption + </message> <message name="IDS_DEVTOOLS_a858dfbc32e2169e89668adf8e997f6f" desc=""> No accessibility node </message> @@ -57,34 +240,133 @@ <message name="IDS_DEVTOOLS_b05cf8cea038a89494e9e232e65af3f3" desc=""> Element is not rendered. </message> + <message name="IDS_DEVTOOLS_b0b4bb7fc3f54f770e2368651fc2b285" desc="Tooltip text that appears when hovering over the 'Can set value' attribute name under the Computed Properties section in the Accessibility pane of the Elements pane"> + Whether the value of this element can be set. + </message> + <message name="IDS_DEVTOOLS_b438066f384cd34d54da4c56f1e39cf9" desc="Accessibility attribute name that appears under the Computed Properties section in the Accessibility pane of the Elements pane"> + Multi-line + </message> + <message name="IDS_DEVTOOLS_b459bb2b480be9a5043f103bbc2f1d49" desc="Tooltip text that appears when hovering over the 'Checked' attribute name under the Computed Properties section in the Accessibility pane of the Elements pane"> + Whether this checkbox, radio button or tree item is checked, unchecked, or mixed (e.g. has both checked and un-checked children). + </message> + <message name="IDS_DEVTOOLS_b5a7adde1af5c87d7fd797b6245c2a39" desc="Accessibility attribute name that appears under the Computed Properties section in the Accessibility pane of the Elements pane"> + Description + </message> + <message name="IDS_DEVTOOLS_b651efdb98a5d6bd2b3935d0c3f4a5e2" desc="Accessibility attribute name that appears under the Computed Properties section in the Accessibility pane of the Elements pane"> + Required + </message> + <message name="IDS_DEVTOOLS_b7ccbbea68b73884ce03f7a3e1acdb81" desc="Tooltip text that appears when hovering over the 'From attribute' attribute name under the Computed Properties section in the Accessibility pane of the Elements pane"> + Value from attribute. + </message> + <message name="IDS_DEVTOOLS_b9db1026019a8730b64397052a61ded0" desc="Accessibility attribute name that appears under the Computed Properties section in the Accessibility pane of the Elements pane"> + Atomic (live regions) + </message> + <message name="IDS_DEVTOOLS_bb129d779ae1ffda5fda12070a4a142b" desc="Tooltip text that appears when hovering over the 'From caption' attribute name under the Computed Properties section in the Accessibility pane of the Elements pane"> + Value from figcaption element. + </message> + <message name="IDS_DEVTOOLS_bbbabdbe1b262f75d99d62880b953be1" desc="Accessibility attribute name that appears under the Computed Properties section in the Accessibility pane of the Elements pane"> + Role + </message> + <message name="IDS_DEVTOOLS_bf1cf93766b632e2d22d21959cb5eb2f" desc="Tooltip text that appears when hovering over the 'Editable' attribute name under the Computed Properties section in the Accessibility pane of the Elements pane"> + If and how this element can be edited. + </message> + <message name="IDS_DEVTOOLS_c108f35980e0df1e4a753232c5b66905" desc="Tooltip text that appears when hovering over the 'Selected' attribute name under the Computed Properties section in the Accessibility pane of the Elements pane"> + Whether the option represented by this element is currently selected. + </message> + <message name="IDS_DEVTOOLS_c1df1da7a1ce305a3b60af9d5733ac1d" desc="Accessibility attribute name that appears under the Computed Properties section in the Accessibility pane of the Elements pane"> + Contents + </message> + <message name="IDS_DEVTOOLS_c4aa9c650883f8b6e52f8dd962003164" desc="Accessibility attribute name that appears under the Computed Properties section in the Accessibility pane of the Elements pane"> + Relevant (live regions) + </message> + <message name="IDS_DEVTOOLS_c88f4050d75172dae8ef486f546d89fa" desc="Tooltip text that appears when hovering over the 'Help' attribute name under the Computed Properties section in the Accessibility pane of the Elements pane"> + The computed help text for this element. + </message> + <message name="IDS_DEVTOOLS_c9bbad3047af039c14d0e7ec957bb867" desc="Tooltip text that appears when hovering over the 'Disabled' attribute name under the Computed Properties section in the Accessibility pane of the Elements pane"> + If true, this element currently cannot be interacted with. + </message> <message name="IDS_DEVTOOLS_cd9da90ce06215f24f648786501e4073" desc=""> Element is hidden by active modal dialog: </message> <message name="IDS_DEVTOOLS_cfa5234b2737df4bc3dc737484605c39" desc=""> <ph name="ARIAHIDDENSPAN">$1s</ph> is <ph name="TRUESPAN">$2s</ph> on ancestor: </message> + <message name="IDS_DEVTOOLS_d3fd6a090f523416f156281b8735573b" desc="Accessibility attribute name that appears under the Computed Properties section in the Accessibility pane of the Elements pane"> + From title + </message> + <message name="IDS_DEVTOOLS_d4144214055f16d813e54cf2903a4174" desc="Accessibility attribute name that appears under the Computed Properties section in the Accessibility pane of the Elements pane"> + Busy (live regions) + </message> + <message name="IDS_DEVTOOLS_d671e7068cc85e3578dc7ed21488bdf3" desc="Tooltip text that appears when hovering over the 'Value' attribute name under the Computed Properties section in the Accessibility pane of the Elements pane"> + The value of this element; this may be user-provided or developer-provided, depending on the element. + </message> + <message name="IDS_DEVTOOLS_d78a68f6a85421ae121c2cb5b73a1040" desc="Accessibility attribute name that appears under the Computed Properties section in the Accessibility pane of the Elements pane"> + Pressed + </message> + <message name="IDS_DEVTOOLS_d7c640cc33c74791ecd8fd06e5158d34" desc="Tooltip text that appears when hovering over the 'Name' attribute name under the Computed Properties section in the Accessibility pane of the Elements pane"> + The computed name of this element. + </message> <message name="IDS_DEVTOOLS_d7dff47e75bfd5f107407eded09ee6f0" desc=""> Element has <ph name="ROLEPRESENTATIONSPAN">$1s</ph>. </message> + <message name="IDS_DEVTOOLS_d8bd6e60adcc01ce20f509ea6800de8f" desc="Accessibility attribute name that appears under the Computed Properties section in the Accessibility pane of the Elements pane"> + Read-only + </message> <message name="IDS_DEVTOOLS_d96143ba1b15645919cea00ec9d1be62" desc=""> Ignored </message> + <message name="IDS_DEVTOOLS_d98e6d7300cfa4e03c4ac9cf658449a7" desc="Accessibility attribute name that appears under the Computed Properties section in the Accessibility pane of the Elements pane"> + Live region root + </message> <message name="IDS_DEVTOOLS_dd3195ced9c1810388e28ca2b4eb921f" desc=""> Not specified </message> + <message name="IDS_DEVTOOLS_dfea140c0381b0207a499a890fde2e31" desc="Tooltip text that appears when hovering over the 'Described by' attribute name under the Computed Properties section in the Accessibility pane of the Elements pane"> + Element or elements which form the description of this element. + </message> <message name="IDS_DEVTOOLS_e0dcc9aef6db5e61e4102efdf5d54378" desc=""> Invalid source. </message> <message name="IDS_DEVTOOLS_e0e4fc6213e8b3593495a7260c3a4c2e" desc=""> Accessibility </message> + <message name="IDS_DEVTOOLS_e1312fc3ec5859447389668b721d932f" desc="Tooltip text that appears when hovering over the 'Pressed' attribute name under the Computed Properties section in the Accessibility pane of the Elements pane"> + Whether this toggle button is currently in a pressed state. + </message> + <message name="IDS_DEVTOOLS_e258b068a6cdb373c5cbc6a74c8bd0f2" desc="Tooltip text that appears when hovering over the 'Maximum value' attribute name under the Computed Properties section in the Accessibility pane of the Elements pane"> + For a range widget, the maximum allowed value. + </message> + <message name="IDS_DEVTOOLS_e57cf3a3ec9d309180d5af992a8141c8" desc="Tooltip text that appears when hovering over the 'Controls' attribute name under the Computed Properties section in the Accessibility pane of the Elements pane"> + Element or elements whose content or presence is/are controlled by this widget. + </message> + <message name="IDS_DEVTOOLS_e633854d55dfd9bbb2d91a63f09db7c5" desc="Accessibility attribute name that appears under the Computed Properties section in the Accessibility pane of the Elements pane"> + Flows to + </message> <message name="IDS_DEVTOOLS_e71c63b8e5a312662941ee8606e8c43a" desc=""> Label for </message> <message name="IDS_DEVTOOLS_e7be8f80bd8db0b8ca6bb2dee175b623" desc=""> Element is in an inert subtree from </message> + <message name="IDS_DEVTOOLS_e8ce1fb5b4c870b68d6f6e5c7037c61f" desc="Tooltip text that appears when hovering over the 'From style' attribute name under the Computed Properties section in the Accessibility pane of the Elements pane"> + Value from style. + </message> + <message name="IDS_DEVTOOLS_f36499431cc70b125fea5984d3d0d17c" desc="Accessibility attribute name that appears under the Computed Properties section in the Accessibility pane of the Elements pane"> + Active descendant + </message> + <message name="IDS_DEVTOOLS_f3ea3dc14c2b876598e7b3e8e5073403" desc="Tooltip text that appears when hovering over the 'Read-only' attribute name under the Computed Properties section in the Accessibility pane of the Elements pane"> + If true, this element may be interacted with, but its value cannot be changed. + </message> + <message name="IDS_DEVTOOLS_f94f9f1c2f3bda21d4a1d4dd222cbe9f" desc="Tooltip text that appears when hovering over the 'From placeholder attribute' attribute name under the Computed Properties section in the Accessibility pane of the Elements pane"> + Value from placeholder attribute. + </message> <message name="IDS_DEVTOOLS_fc6dc044799975f19c864e9b31e3bb76" desc=""> No text content. </message> + <message name="IDS_DEVTOOLS_feb0d74c82c7ade6758ced29e8ba7f13" desc="Tooltip text that appears when hovering over the 'From label' attribute name under the Computed Properties section in the Accessibility pane of the Elements pane"> + Value from label element. + </message> + <message name="IDS_DEVTOOLS_fec6d4d6f166d588401fc9ce7322a8f7" desc="Tooltip text that appears when hovering over the 'Owns' attribute name under the Computed Properties section in the Accessibility pane of the Elements pane"> + Element or elements which should be considered descendants of this element, despite not being descendants in the DOM. + </message> </grit-part> \ No newline at end of file
diff --git a/third_party/blink/renderer/devtools/front_end/inspector_main/RenderingOptions.js b/third_party/blink/renderer/devtools/front_end/inspector_main/RenderingOptions.js index 9c35be8f..596acee1 100644 --- a/third_party/blink/renderer/devtools/front_end/inspector_main/RenderingOptions.js +++ b/third_party/blink/renderer/devtools/front_end/inspector_main/RenderingOptions.js
@@ -38,6 +38,10 @@ Common.UIString('Highlights areas of the page (green) that need to be repainted'), Common.moduleSetting('showPaintRects')); this._appendCheckbox( + Common.UIString('Layout Shift Regions'), + Common.UIString('Highlights areas of the page (blue) that were shifted'), + Common.moduleSetting('showLayoutShiftRegions')); + this._appendCheckbox( Common.UIString('Layer borders'), Common.UIString('Shows layer borders (orange/olive) and tiles (cyan)'), Common.moduleSetting('showDebugBorders')); this._appendCheckbox(
diff --git a/third_party/blink/renderer/devtools/front_end/resources/ServiceWorkersView.js b/third_party/blink/renderer/devtools/front_end/resources/ServiceWorkersView.js index 7237643..28361a6ea 100644 --- a/third_party/blink/renderer/devtools/front_end/resources/ServiceWorkersView.js +++ b/third_party/blink/renderer/devtools/front_end/resources/ServiceWorkersView.js
@@ -233,7 +233,7 @@ _updateRegistration(registration, skipUpdate) { let section = this._sections.get(registration); if (!section) { - const title = Resources.ServiceWorkersView._displayScopeURL(registration.scopeURL); + const title = registration.scopeURL; const uiSection = this._getReportViewForOrigin(registration.securityOrigin).appendSection(title); uiSection[this._registrationSymbol] = registration; section = new Resources.ServiceWorkersView.Section( @@ -293,18 +293,6 @@ this._otherWorkersView.setHeaderVisible(false); } - /** - * @param {string} scopeURL - * @return {string} - */ - static _displayScopeURL(scopeURL) { - const parsedURL = scopeURL.asParsedURL(); - let path = parsedURL.path; - if (path.endsWith('/')) - path = path.substring(0, path.length - 1); - return parsedURL.domain() + path; - } - _updateListVisibility() { this.contentElement.classList.toggle('service-worker-list-empty', this._sections.size === 0); } @@ -468,7 +456,7 @@ this._toolbar.setEnabled(!this._registration.isDeleted); const versions = this._registration.versionsByMode(); - const scopeURL = Resources.ServiceWorkersView._displayScopeURL(this._registration.scopeURL); + const scopeURL = this._registration.scopeURL; const title = this._registration.isDeleted ? Common.UIString('%s - deleted', scopeURL) : scopeURL; this._section.setTitle(title);
diff --git a/third_party/blink/renderer/devtools/front_end/sdk/IsolateManager.js b/third_party/blink/renderer/devtools/front_end/sdk/IsolateManager.js index d24d9b3..992bcdb 100644 --- a/third_party/blink/renderer/devtools/front_end/sdk/IsolateManager.js +++ b/third_party/blink/renderer/devtools/front_end/sdk/IsolateManager.js
@@ -17,7 +17,7 @@ /** @type {!Set<!SDK.IsolateManager.Observer>} */ this._observers = new Set(); SDK.targetManager.observeModels(SDK.RuntimeModel, this); - this._poll(); + this._pollId = 0; } /** @@ -26,6 +26,8 @@ observeIsolates(observer) { if (this._observers.has(observer)) throw new Error('Observer can only be registered once'); + if (!this._observers.size) + this._poll(); this._observers.add(observer); for (const isolate of this._isolates.values()) observer.isolateAdded(isolate); @@ -36,6 +38,8 @@ */ unobserveIsolates(observer) { this._observers.delete(observer); + if (!this._observers.size) + ++this._pollId; // Stops the current polling loop. } /** @@ -113,7 +117,8 @@ } async _poll() { - while (true) { + const pollId = this._pollId; + while (pollId === this._pollId) { await Promise.all(Array.from(this.isolates(), isolate => isolate._update())); await new Promise(r => setTimeout(r, SDK.IsolateManager.PollIntervalMs)); }
diff --git a/third_party/blink/renderer/devtools/front_end/sdk/OverlayModel.js b/third_party/blink/renderer/devtools/front_end/sdk/OverlayModel.js index c49f750..f40c104 100644 --- a/third_party/blink/renderer/devtools/front_end/sdk/OverlayModel.js +++ b/third_party/blink/renderer/devtools/front_end/sdk/OverlayModel.js
@@ -34,6 +34,7 @@ this._highlighter = this._defaultHighlighter; this._showPaintRectsSetting = Common.moduleSetting('showPaintRects'); + this._showLayoutShiftRegionsSetting = Common.moduleSetting('showLayoutShiftRegions'); this._showAdHighlightsSetting = Common.moduleSetting('showAdHighlights'); this._showDebugBordersSetting = Common.moduleSetting('showDebugBorders'); this._showFPSCounterSetting = Common.moduleSetting('showFPSCounter'); @@ -77,6 +78,8 @@ this._registeredListeners = [ this._showPaintRectsSetting.addChangeListener( () => this._overlayAgent.setShowPaintRects(this._showPaintRectsSetting.get())), + this._showLayoutShiftRegionsSetting.addChangeListener( + () => this._overlayAgent.setShowLayoutShiftRegions(this._showLayoutShiftRegionsSetting.get())), this._showAdHighlightsSetting.addChangeListener( () => this._overlayAgent.setShowAdHighlights(this._showAdHighlightsSetting.get())), this._showDebugBordersSetting.addChangeListener( @@ -91,6 +94,8 @@ if (this._showPaintRectsSetting.get()) this._overlayAgent.setShowPaintRects(true); + if (this._showLayoutShiftRegionsSetting.get()) + this._overlayAgent.setShowLayoutShiftRegions(true); if (this._showAdHighlightsSetting.get()) this._overlayAgent.setShowAdHighlights(true); if (this._showDebugBordersSetting.get())
diff --git a/third_party/blink/renderer/devtools/front_end/sdk/module.json b/third_party/blink/renderer/devtools/front_end/sdk/module.json index c268885..1fd3f4f 100644 --- a/third_party/blink/renderer/devtools/front_end/sdk/module.json +++ b/third_party/blink/renderer/devtools/front_end/sdk/module.json
@@ -135,6 +135,24 @@ { "type": "setting", "category": "Rendering", + "settingName": "showLayoutShiftRegions", + "settingType": "boolean", + "storageType": "session", + "options": [ + { + "value": true, + "title": "Show layout shift regions" + }, + { + "value": false, + "title": "Hide layout shift regions" + } + ], + "defaultValue": false + }, + { + "type": "setting", + "category": "Rendering", "settingName": "showAdHighlights", "settingType": "boolean", "storageType": "session",
diff --git a/third_party/blink/renderer/modules/csspaint/paint_worklet_proxy_client.cc b/third_party/blink/renderer/modules/csspaint/paint_worklet_proxy_client.cc index db8a2fbe..8b37010 100644 --- a/third_party/blink/renderer/modules/csspaint/paint_worklet_proxy_client.cc +++ b/third_party/blink/renderer/modules/csspaint/paint_worklet_proxy_client.cc
@@ -7,6 +7,7 @@ #include <memory> #include "base/single_thread_task_runner.h" +#include "third_party/blink/renderer/core/css/cssom/css_style_value.h" #include "third_party/blink/renderer/core/css/cssom/paint_worklet_input.h" #include "third_party/blink/renderer/core/dom/document.h" #include "third_party/blink/renderer/core/frame/web_frame_widget_base.h" @@ -171,8 +172,14 @@ PaintWorkletStylePropertyMap* style_map = MakeGarbageCollected<PaintWorkletStylePropertyMap>(input->StyleMapData()); - sk_sp<PaintRecord> result = definition->Paint( - FloatSize(input->GetSize()), input->EffectiveZoom(), style_map, nullptr); + CSSStyleValueVector paint_arguments; + for (const auto& style_value : input->ParsedInputArguments()) { + paint_arguments.push_back(style_value->ToCSSStyleValue()); + } + + sk_sp<PaintRecord> result = + definition->Paint(FloatSize(input->GetSize()), input->EffectiveZoom(), + style_map, &paint_arguments); // CSSPaintDefinition::Paint returns nullptr if it fails, but for // OffThread-PaintWorklet we prefer to insert empty PaintRecords into the
diff --git a/third_party/blink/renderer/modules/csspaint/paint_worklet_proxy_client_test.cc b/third_party/blink/renderer/modules/csspaint/paint_worklet_proxy_client_test.cc index b78227a..d38fe56c 100644 --- a/third_party/blink/renderer/modules/csspaint/paint_worklet_proxy_client_test.cc +++ b/third_party/blink/renderer/modules/csspaint/paint_worklet_proxy_client_test.cc
@@ -12,6 +12,7 @@ #include "testing/gtest/include/gtest/gtest.h" #include "third_party/blink/renderer/bindings/core/v8/script_source_code.h" #include "third_party/blink/renderer/bindings/core/v8/worker_or_worklet_script_controller.h" +#include "third_party/blink/renderer/core/css/cssom/cross_thread_style_value.h" #include "third_party/blink/renderer/core/css/cssom/paint_worklet_input.h" #include "third_party/blink/renderer/core/testing/core_unit_test_helper.h" #include "third_party/blink/renderer/core/workers/worker_reporting_proxy.h" @@ -186,9 +187,11 @@ } PaintWorkletStylePropertyMap::CrossThreadData data; + Vector<std::unique_ptr<CrossThreadStyleValue>> input_arguments; scoped_refptr<PaintWorkletInput> input = base::MakeRefCounted<PaintWorkletInput>("foo", FloatSize(100, 100), 1.0f, - 1, std::move(data)); + 1, std::move(data), + std::move(input_arguments)); sk_sp<PaintRecord> record = proxy_client->Paint(input.get()); EXPECT_NE(record, nullptr);
diff --git a/third_party/blink/renderer/modules/mediastream/media_stream_constraints_util_video_device.cc b/third_party/blink/renderer/modules/mediastream/media_stream_constraints_util_video_device.cc index bac7a0bf..b9086a6 100644 --- a/third_party/blink/renderer/modules/mediastream/media_stream_constraints_util_video_device.cc +++ b/third_party/blink/renderer/modules/mediastream/media_stream_constraints_util_video_device.cc
@@ -309,12 +309,12 @@ } if (basic_constraint_set.resize_mode.HasIdeal()) { - if (!base::ContainsValue(basic_constraint_set.resize_mode.Ideal(), - WebMediaStreamTrack::kResizeModeNone)) { + if (!base::Contains(basic_constraint_set.resize_mode.Ideal(), + WebMediaStreamTrack::kResizeModeNone)) { track_fitness_without_rescale += 1.0; } - if (!base::ContainsValue(basic_constraint_set.resize_mode.Ideal(), - WebMediaStreamTrack::kResizeModeRescale)) { + if (!base::Contains(basic_constraint_set.resize_mode.Ideal(), + WebMediaStreamTrack::kResizeModeRescale)) { track_fitness_with_rescale += 1.0; } }
diff --git a/third_party/blink/renderer/modules/mediastream/media_stream_video_source.cc b/third_party/blink/renderer/modules/mediastream/media_stream_video_source.cc index 5424274..734db38 100644 --- a/third_party/blink/renderer/modules/mediastream/media_stream_video_source.cc +++ b/third_party/blink/renderer/modules/mediastream/media_stream_video_source.cc
@@ -54,7 +54,7 @@ const VideoTrackFormatCallback& format_callback, const ConstraintsCallback& callback) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - DCHECK(!base::ContainsValue(tracks_, track)); + DCHECK(!base::Contains(tracks_, track)); tracks_.push_back(track); secure_tracker_.Add(track, true);
diff --git a/third_party/blink/renderer/modules/mediastream/media_stream_video_track.cc b/third_party/blink/renderer/modules/mediastream/media_stream_video_track.cc index 9c10a16c..98e3b4d7 100644 --- a/third_party/blink/renderer/modules/mediastream/media_stream_video_track.cc +++ b/third_party/blink/renderer/modules/mediastream/media_stream_video_track.cc
@@ -370,7 +370,7 @@ const VideoCaptureDeliverFrameCB& callback, bool is_sink_secure) { DCHECK_CALLED_ON_VALID_THREAD(main_render_thread_checker_); - DCHECK(!base::ContainsValue(sinks_, sink)); + DCHECK(!base::Contains(sinks_, sink)); sinks_.push_back(sink); frame_deliverer_->AddCallback(sink, callback); secure_tracker_.Add(sink, is_sink_secure);
diff --git a/third_party/blink/renderer/modules/service_worker/service_worker.cc b/third_party/blink/renderer/modules/service_worker/service_worker.cc index c1888cc..7948462 100644 --- a/third_party/blink/renderer/modules/service_worker/service_worker.cc +++ b/third_party/blink/renderer/modules/service_worker/service_worker.cc
@@ -91,12 +91,6 @@ if (exception_state.HadException()) return; - if (state_ == mojom::blink::ServiceWorkerState::kRedundant) { - exception_state.ThrowDOMException(DOMExceptionCode::kInvalidStateError, - "ServiceWorker is in redundant state."); - return; - } - host_->PostMessageToServiceWorker(std::move(msg)); }
diff --git a/third_party/blink/renderer/modules/webgl/webgl2_rendering_context_base.cc b/third_party/blink/renderer/modules/webgl/webgl2_rendering_context_base.cc index e424312d..0a2e104 100644 --- a/third_party/blink/renderer/modules/webgl/webgl2_rendering_context_base.cc +++ b/third_party/blink/renderer/modules/webgl/webgl2_rendering_context_base.cc
@@ -77,6 +77,28 @@ return true; } +class PointableStringArray { + public: + PointableStringArray(const Vector<String>& strings) + : data_(std::make_unique<std::string[]>(strings.size())), + pointers_(strings.size()) { + DCHECK(strings.size() < std::numeric_limits<GLsizei>::max()); + for (wtf_size_t i = 0; i < strings.size(); ++i) { + // Strings must never move once they are stored in data_... + data_[i] = strings[i].Ascii(); + // ... so that the c_str() remains valid. + pointers_[i] = data_[i].c_str(); + } + } + + GLsizei size() const { return pointers_.size(); } + char const* const* data() const { return pointers_.data(); } + + private: + std::unique_ptr<std::string[]> data_; + Vector<const char*> pointers_; +}; + } // namespace // These enums are from manual pages for glTexStorage2D/glTexStorage3D. @@ -4444,17 +4466,7 @@ return; } - Vector<std::string> keep_alive; // Must keep these instances alive while - // looking at their data - // keep_alive MUST be pre-reserved, so that the std::strings do not move. - // TODO(kainino): Use a data structure that makes this more fool-proof. - keep_alive.ReserveInitialCapacity(varyings.size()); - Vector<const char*> varying_strings; - varying_strings.ReserveInitialCapacity(varyings.size()); - for (const String& varying : varyings) { - keep_alive.push_back(varying.Ascii()); - varying_strings.push_back(keep_alive.back().c_str()); - } + PointableStringArray varying_strings(varyings); program->SetRequiredTransformFeedbackBufferCount( buffer_mode == GL_INTERLEAVED_ATTRIBS ? 1 : varyings.size()); @@ -4675,17 +4687,7 @@ if (!ValidateWebGLProgramOrShader("getUniformIndices", program)) return result; - Vector<std::string> keep_alive; // Must keep these instances alive while - // looking at their data - // keep_alive MUST be pre-reserved, so that the std::strings do not move. - // TODO(kainino): Use a data structure that makes this more fool-proof. - keep_alive.ReserveInitialCapacity(uniform_names.size()); - Vector<const char*> uniform_strings; - uniform_strings.ReserveInitialCapacity(uniform_names.size()); - for (const String& uniform_name : uniform_names) { - keep_alive.push_back(uniform_name.Ascii()); - uniform_strings.push_back(keep_alive.back().c_str()); - } + PointableStringArray uniform_strings(uniform_names); result.resize(uniform_names.size()); ContextGL()->GetUniformIndices(ObjectOrZero(program), uniform_strings.size(),
diff --git a/third_party/blink/renderer/modules/webgpu/dawn_conversions.cc b/third_party/blink/renderer/modules/webgpu/dawn_conversions.cc index bc03d99..6596c24a 100644 --- a/third_party/blink/renderer/modules/webgpu/dawn_conversions.cc +++ b/third_party/blink/renderer/modules/webgpu/dawn_conversions.cc
@@ -577,18 +577,24 @@ return dawn_origin; } -std::tuple<DawnPipelineStageDescriptor, CString> AsDawnType( +OwnedPipelineStageDescriptor AsDawnType( const GPUPipelineStageDescriptor* webgpu_stage) { DCHECK(webgpu_stage); - CString entry_point_string(webgpu_stage->entryPoint().Ascii().c_str()); + std::string entry_point = webgpu_stage->entryPoint().Ascii(); + // length() is in bytes (not utf-8 characters or something), so this is ok. + size_t byte_size = entry_point.length() + 1; + + std::unique_ptr<char[]> entry_point_keepalive = + std::make_unique<char[]>(byte_size); + char* entry_point_ptr = entry_point_keepalive.get(); + memcpy(entry_point_ptr, entry_point.c_str(), byte_size); + DawnPipelineStageDescriptor dawn_stage; dawn_stage.module = webgpu_stage->module()->GetHandle(); - dawn_stage.entryPoint = entry_point_string.data(); + dawn_stage.entryPoint = entry_point_ptr; - // CString holds a scoped_refptr to the string data so it is valid to move - // it into the return value without invalidating the entryPoint. - return std::make_tuple(dawn_stage, std::move(entry_point_string)); + return std::make_tuple(dawn_stage, std::move(entry_point_keepalive)); } } // namespace blink
diff --git a/third_party/blink/renderer/modules/webgpu/dawn_conversions.h b/third_party/blink/renderer/modules/webgpu/dawn_conversions.h index a5d2ce50..816c18d 100644 --- a/third_party/blink/renderer/modules/webgpu/dawn_conversions.h +++ b/third_party/blink/renderer/modules/webgpu/dawn_conversions.h
@@ -40,8 +40,10 @@ DawnColor AsDawnType(const GPUColor*); DawnExtent3D AsDawnType(const GPUExtent3D*); DawnOrigin3D AsDawnType(const GPUOrigin3D*); -std::tuple<DawnPipelineStageDescriptor, CString> AsDawnType( - const GPUPipelineStageDescriptor*); + +using OwnedPipelineStageDescriptor = + std::tuple<DawnPipelineStageDescriptor, std::unique_ptr<char[]>>; +OwnedPipelineStageDescriptor AsDawnType(const GPUPipelineStageDescriptor*); // WebGPU objects are converted to Dawn objects by getting the opaque handle // which can be passed to Dawn.
diff --git a/third_party/blink/renderer/modules/webgpu/gpu_render_pipeline.cc b/third_party/blink/renderer/modules/webgpu/gpu_render_pipeline.cc index 0459577..ab52a396 100644 --- a/third_party/blink/renderer/modules/webgpu/gpu_render_pipeline.cc +++ b/third_party/blink/renderer/modules/webgpu/gpu_render_pipeline.cc
@@ -209,13 +209,12 @@ dawn_desc.nextInChain = nullptr; dawn_desc.layout = AsDawnType(webgpu_desc->layout()); - using PipelineStageInfo = std::tuple<DawnPipelineStageDescriptor, CString>; - - PipelineStageInfo vertex_stage_info = AsDawnType(webgpu_desc->vertexStage()); + OwnedPipelineStageDescriptor vertex_stage_info = + AsDawnType(webgpu_desc->vertexStage()); dawn_desc.vertexStage = &std::get<0>(vertex_stage_info); // TODO(crbug.com/dawn/136): Support vertex-only pipelines. - PipelineStageInfo fragment_stage_info = + OwnedPipelineStageDescriptor fragment_stage_info = AsDawnType(webgpu_desc->fragmentStage()); dawn_desc.fragmentStage = &std::get<0>(fragment_stage_info);
diff --git a/third_party/blink/renderer/modules/xr/xr.cc b/third_party/blink/renderer/modules/xr/xr.cc index 304ec3a..cb1e5d2 100644 --- a/third_party/blink/renderer/modules/xr/xr.cc +++ b/third_party/blink/renderer/modules/xr/xr.cc
@@ -86,13 +86,75 @@ } // namespace -XR::PendingSessionQuery::PendingSessionQuery( +XR::PendingSupportsSessionQuery::PendingSupportsSessionQuery( ScriptPromiseResolver* resolver, XRSession::SessionMode session_mode) - : resolver(resolver), mode(session_mode) {} + : resolver_(resolver), mode_(session_mode) {} -void XR::PendingSessionQuery::Trace(blink::Visitor* visitor) { - visitor->Trace(resolver); +void XR::PendingSupportsSessionQuery::Trace(blink::Visitor* visitor) { + visitor->Trace(resolver_); +} + +void XR::PendingSupportsSessionQuery::Resolve() { + resolver_->Resolve(); +} + +void XR::PendingSupportsSessionQuery::Reject(DOMException* exception) { + resolver_->Reject(exception); +} + +void XR::PendingSupportsSessionQuery::Reject(v8::Local<v8::Value> value) { + resolver_->Reject(value); +} + +XRSession::SessionMode XR::PendingSupportsSessionQuery::mode() const { + return mode_; +} + +XR::PendingRequestSessionQuery::PendingRequestSessionQuery( + int64_t ukm_source_id, + ScriptPromiseResolver* resolver, + XRSession::SessionMode session_mode) + : resolver_(resolver), mode_(session_mode), ukm_source_id_(ukm_source_id) {} + +void XR::PendingRequestSessionQuery::Resolve(XRSession* session) { + ReportRequestSessionResult(SessionRequestStatus::kSuccess); + resolver_->Resolve(session); +} + +void XR::PendingRequestSessionQuery::Reject(DOMException* exception) { + ReportRequestSessionResult(SessionRequestStatus::kOtherError); + resolver_->Reject(exception); +} + +void XR::PendingRequestSessionQuery::Reject(v8::Local<v8::Value> value) { + ReportRequestSessionResult(SessionRequestStatus::kOtherError); + resolver_->Reject(value); +} + +XRSession::SessionMode XR::PendingRequestSessionQuery::mode() const { + return mode_; +} + +ScriptState* XR::PendingRequestSessionQuery::GetScriptState() const { + return resolver_->GetScriptState(); +} + +void XR::PendingRequestSessionQuery::Trace(blink::Visitor* visitor) { + visitor->Trace(resolver_); +} + +void XR::PendingRequestSessionQuery::ReportRequestSessionResult( + SessionRequestStatus status) { + Document* doc = + resolver_->GetFrame() ? resolver_->GetFrame()->GetDocument() : nullptr; + if (!doc) + return; + + ukm::builders::XR_WebXR_SessionRequest(ukm_source_id_) + .SetMode(static_cast<int64_t>(mode_)) + .SetStatus(static_cast<int64_t>(status)) + .Record(doc->UkmRecorder()); } XR::XR(LocalFrame& frame, int64_t ukm_source_id) @@ -180,35 +242,34 @@ Document* doc = frame->GetDocument(); XRSession::SessionMode session_mode = stringToSessionMode(mode); + auto* resolver = MakeGarbageCollected<ScriptPromiseResolver>(script_state); + ScriptPromise promise = resolver->Promise(); + + PendingSupportsSessionQuery* query = + MakeGarbageCollected<PendingSupportsSessionQuery>(resolver, session_mode); + if (session_mode == XRSession::kModeImmersiveAR && !AreArRuntimeFeaturesEnabled(doc)) { - return ScriptPromise::Reject( - script_state, V8ThrowException::CreateTypeError( - script_state->GetIsolate(), - String::Format(kImmersiveArModeNotValid, __func__))); + query->Reject(V8ThrowException::CreateTypeError( + script_state->GetIsolate(), + String::Format(kImmersiveArModeNotValid, __func__))); + return promise; } if (!doc->IsFeatureEnabled(mojom::FeaturePolicyFeature::kWebVr, ReportOptions::kReportOnFailure)) { // Only allow the call to be made if the appropriate feature policy is in // place. - return ScriptPromise::RejectWithDOMException( - script_state, - MakeGarbageCollected<DOMException>(DOMExceptionCode::kSecurityError, - kFeaturePolicyBlocked)); + query->Reject(MakeGarbageCollected<DOMException>( + DOMExceptionCode::kSecurityError, kFeaturePolicyBlocked)); + return promise; } - auto* resolver = MakeGarbageCollected<ScriptPromiseResolver>(script_state); - ScriptPromise promise = resolver->Promise(); - if (session_mode == XRSession::kModeInline) { // `inline` sessions are always supported if not blocked by feature policy. - resolver->Resolve(); + query->Resolve(); } else { // For all other modes we need to check with the service. - PendingSessionQuery* query = - MakeGarbageCollected<PendingSessionQuery>(resolver, session_mode); - if (!device_) { pending_mode_queries_.push_back(query); @@ -222,17 +283,17 @@ return promise; } -void XR::DispatchSupportsSession(PendingSessionQuery* query) { +void XR::DispatchSupportsSession(PendingSupportsSessionQuery* query) { if (!device_) { // If we don't have a device by the time we reach this call it indicates // that there's no WebXR hardware. Reject as not supported. - query->resolver->Reject(MakeGarbageCollected<DOMException>( + query->Reject(MakeGarbageCollected<DOMException>( DOMExceptionCode::kNotSupportedError, kSessionNotSupported)); return; } device::mojom::blink::XRSessionOptionsPtr session_options = - convertModeToMojo(query->mode); + convertModeToMojo(query->mode()); outstanding_support_queries_.insert(query); device_->SupportsSession( @@ -262,13 +323,20 @@ Document* doc = frame->GetDocument(); XRSession::SessionMode session_mode = stringToSessionMode(mode); + auto* resolver = MakeGarbageCollected<ScriptPromiseResolver>(script_state); + ScriptPromise promise = resolver->Promise(); + + PendingRequestSessionQuery* query = + MakeGarbageCollected<PendingRequestSessionQuery>(GetSourceId(), resolver, + session_mode); + if (session_mode == XRSession::kModeImmersiveAR && !AreArRuntimeFeaturesEnabled(doc)) { - ReportRequestSessionResult(session_mode, SessionRequestStatus::kOtherError); - return ScriptPromise::Reject( - script_state, V8ThrowException::CreateTypeError( - script_state->GetIsolate(), - String::Format(kImmersiveArModeNotValid, __func__))); + query->Reject(V8ThrowException::CreateTypeError( + script_state->GetIsolate(), + String::Format(kImmersiveArModeNotValid, __func__))); + + return promise; } bool is_immersive = session_mode == XRSession::kModeImmersiveVR || @@ -285,30 +353,24 @@ ReportOptions::kReportOnFailure)) { // Only allow the call to be made if the appropriate feature policy is in // place. - ReportRequestSessionResult(session_mode, SessionRequestStatus::kOtherError); - return ScriptPromise::RejectWithDOMException( - script_state, - MakeGarbageCollected<DOMException>(DOMExceptionCode::kSecurityError, - kFeaturePolicyBlocked)); + query->Reject(MakeGarbageCollected<DOMException>( + DOMExceptionCode::kSecurityError, kFeaturePolicyBlocked)); + return promise; } // Only one immersive session can be active at a time. if (is_immersive && frameProvider()->immersive_session()) { - ReportRequestSessionResult(session_mode, SessionRequestStatus::kOtherError); - return ScriptPromise::RejectWithDOMException( - script_state, - MakeGarbageCollected<DOMException>(DOMExceptionCode::kInvalidStateError, - kActiveImmersiveSession)); + query->Reject(MakeGarbageCollected<DOMException>( + DOMExceptionCode::kInvalidStateError, kActiveImmersiveSession)); + return promise; } // All immersive sessions require a user gesture. bool has_user_activation = LocalFrame::HasTransientUserActivation(frame); if (is_immersive && !has_user_activation) { - ReportRequestSessionResult(session_mode, SessionRequestStatus::kOtherError); - return ScriptPromise::RejectWithDOMException( - script_state, - MakeGarbageCollected<DOMException>(DOMExceptionCode::kSecurityError, - kRequestRequiresUserActivation)); + query->Reject(MakeGarbageCollected<DOMException>( + DOMExceptionCode::kSecurityError, kRequestRequiresUserActivation)); + return promise; } // TODO(https://crbug.com/962991): The error handling here is not spec @@ -318,19 +380,11 @@ // it was for an inline mode. In which case, we'll end up creating the // session in OnRequestSessionReturned. if (!service_ && session_mode != XRSession::kModeInline) { - ReportRequestSessionResult(session_mode, SessionRequestStatus::kOtherError); - return ScriptPromise::RejectWithDOMException( - script_state, - MakeGarbageCollected<DOMException>(DOMExceptionCode::kNotSupportedError, - kNoDevicesMessage)); + query->Reject(MakeGarbageCollected<DOMException>( + DOMExceptionCode::kNotSupportedError, kNoDevicesMessage)); + return promise; } - auto* resolver = MakeGarbageCollected<ScriptPromiseResolver>(script_state); - ScriptPromise promise = resolver->Promise(); - - PendingSessionQuery* query = - MakeGarbageCollected<PendingSessionQuery>(resolver, session_mode); - if (!device_) { pending_session_requests_.push_back(query); @@ -343,7 +397,7 @@ return promise; } -void XR::DispatchRequestSession(PendingSessionQuery* query) { +void XR::DispatchRequestSession(PendingRequestSessionQuery* query) { // TODO(https://crbug.com/968622): Make sure we don't forget to call // metrics-related methods when the promise gets resolved/rejected. @@ -352,25 +406,23 @@ // hardware. Attempt to create a sensorless session. // TODO(https://crbug.com/944987): When device_ is eliminated, unify with // OnRequestSessionReturned() and inline CreateSensorlessInlineSession(). - if (query->mode == XRSession::kModeInline) { + if (query->mode() == XRSession::kModeInline) { XRSession* session = CreateSensorlessInlineSession(); - ReportRequestSessionResult(query->mode, SessionRequestStatus::kSuccess); - query->resolver->Resolve(session); + query->Resolve(session); return; } - ReportRequestSessionResult(query->mode, SessionRequestStatus::kOtherError); // TODO(https://crbug.com/962991): The spec says to reject with null. // Clarify/fix the spec. In other places where we have no device or no // service we return kNotSupportedError. - query->resolver->Reject(MakeGarbageCollected<DOMException>( + query->Reject(MakeGarbageCollected<DOMException>( DOMExceptionCode::kNotSupportedError, kSessionNotSupported)); return; } device::mojom::blink::XRSessionOptionsPtr session_options = - convertModeToMojo(query->mode); + convertModeToMojo(query->mode()); outstanding_request_queries_.insert(query); device_->RequestSession( @@ -439,7 +491,7 @@ pending_session_requests_.clear(); } -void XR::OnSupportsSessionReturned(PendingSessionQuery* query, +void XR::OnSupportsSessionReturned(PendingSupportsSessionQuery* query, bool supports_session) { // The session query has returned and we're about to resolve or reject the // promise, so remove it from our outstanding list. @@ -447,13 +499,13 @@ outstanding_support_queries_.erase(query); supports_session - ? query->resolver->Resolve() - : query->resolver->Reject(MakeGarbageCollected<DOMException>( + ? query->Resolve() + : query->Reject(MakeGarbageCollected<DOMException>( DOMExceptionCode::kNotSupportedError, kSessionNotSupported)); } void XR::OnRequestSessionReturned( - PendingSessionQuery* query, + PendingRequestSessionQuery* query, device::mojom::blink::XRSessionPtr session_ptr) { // The session query has returned and we're about to resolve or reject the // promise, so remove it from our outstanding list. @@ -467,23 +519,20 @@ // sensorless session. // TODO(https://crbug.com/944987): When device_ is eliminated, unify with // DispatchRequestSession() and inline CreateSensorlessInlineSession(). - if (query->mode == XRSession::kModeInline) { + if (query->mode() == XRSession::kModeInline) { XRSession* session = CreateSensorlessInlineSession(); - ReportRequestSessionResult(query->mode, SessionRequestStatus::kSuccess); - - query->resolver->Resolve(session); + query->Resolve(session); return; } - ReportRequestSessionResult(query->mode, SessionRequestStatus::kOtherError); auto* exception = MakeGarbageCollected<DOMException>( DOMExceptionCode::kNotSupportedError, kSessionNotSupported); - query->resolver->Reject(exception); + query->Reject(exception); return; } - bool environment_integration = query->mode == XRSession::kModeImmersiveAR; + bool environment_integration = query->mode() == XRSession::kModeImmersiveAR; // immersive sessions must supply display info. DCHECK(session_ptr->display_info); @@ -502,12 +551,12 @@ if (environment_integration) blend_mode = XRSession::kBlendModeAlphaBlend; - XRSession* session = CreateSession(query->mode, blend_mode, + XRSession* session = CreateSession(query->mode(), blend_mode, std::move(session_ptr->client_request), std::move(session_ptr->display_info)); - if (query->mode == XRSession::kModeImmersiveVR || - query->mode == XRSession::kModeImmersiveAR) { + if (query->mode() == XRSession::kModeImmersiveVR || + query->mode() == XRSession::kModeImmersiveAR) { frameProvider()->BeginImmersiveSession(session, std::move(session_ptr)); if (environment_integration) { // See Task Sources spreadsheet for more information: @@ -525,11 +574,10 @@ &XR::OnMagicWindowProviderDisconnect, WrapWeakPersistent(this))); } - UseCounter::Count(ExecutionContext::From(query->resolver->GetScriptState()), + UseCounter::Count(ExecutionContext::From(query->GetScriptState()), WebFeature::kWebXrSessionCreated); - ReportRequestSessionResult(query->mode, SessionRequestStatus::kSuccess); - query->resolver->Resolve(session); + query->Resolve(session); } void XR::ReportImmersiveSupported(bool supported) { @@ -542,18 +590,6 @@ } } -void XR::ReportRequestSessionResult(XRSession::SessionMode session_mode, - SessionRequestStatus status) { - Document* doc = GetFrame() ? GetFrame()->GetDocument() : nullptr; - if (!doc) - return; - - ukm::builders::XR_WebXR_SessionRequest(GetSourceId()) - .SetMode(static_cast<int64_t>(session_mode)) - .SetStatus(static_cast<int64_t>(status)) - .Record(doc->UkmRecorder()); -} - void XR::AddedEventListener(const AtomicString& event_type, RegisteredEventListener& registered_listener) { EventTargetWithInlineData::AddedEventListener(event_type, @@ -632,14 +668,14 @@ device_ = nullptr; - HeapHashSet<Member<PendingSessionQuery>> support_queries = + HeapHashSet<Member<PendingSupportsSessionQuery>> support_queries = outstanding_support_queries_; for (const auto& query : support_queries) { OnSupportsSessionReturned(query, false); } DCHECK(outstanding_support_queries_.IsEmpty()); - HeapHashSet<Member<PendingSessionQuery>> request_queries = + HeapHashSet<Member<PendingRequestSessionQuery>> request_queries = outstanding_request_queries_; for (const auto& query : request_queries) { // We had a device, so rejecting the session request as though the mode
diff --git a/third_party/blink/renderer/modules/xr/xr.h b/third_party/blink/renderer/modules/xr/xr.h index 50953a6..986c90e 100644 --- a/third_party/blink/renderer/modules/xr/xr.h +++ b/third_party/blink/renderer/modules/xr/xr.h
@@ -86,30 +86,81 @@ kMaxValue = kOtherError, }; - class PendingSessionQuery final - : public GarbageCollected<PendingSessionQuery> { - DISALLOW_COPY_AND_ASSIGN(PendingSessionQuery); + // Encapsulates blink-side `XR::requestSession()` call. It is a wrapper around + // ScriptPromiseResolver that allows us to add additional logic as certain + // things related to promise's life cycle happen. + class PendingRequestSessionQuery final + : public GarbageCollected<PendingRequestSessionQuery> { + DISALLOW_COPY_AND_ASSIGN(PendingRequestSessionQuery); public: - PendingSessionQuery(ScriptPromiseResolver*, XRSession::SessionMode); - virtual ~PendingSessionQuery() = default; + PendingRequestSessionQuery(int64_t ukm_source_id, + ScriptPromiseResolver* resolver, + XRSession::SessionMode mode); + virtual ~PendingRequestSessionQuery() = default; + + // Resolves underlying promise with passed in XR session. + void Resolve(XRSession* session); + // Rejects underlying promise with passed in DOM exception. + void Reject(DOMException* exception); + // Rejects underlying promise with passed in v8 value. Used to raise + // TypeError which is not a DOM exception. + void Reject(v8::Local<v8::Value> value); + + XRSession::SessionMode mode() const; + + // Returns underlying resolver's script state. + ScriptState* GetScriptState() const; virtual void Trace(blink::Visitor*); - Member<ScriptPromiseResolver> resolver; - const XRSession::SessionMode mode; - bool has_user_activation = false; + private: + void ReportRequestSessionResult(SessionRequestStatus status); + + Member<ScriptPromiseResolver> resolver_; + const XRSession::SessionMode mode_; + + const int64_t ukm_source_id_; + }; + + // Encapsulates blink-side `XR::supportsSession()` call. It is a wrapper + // around ScriptPromiseResolver that allows us to add additional logic as + // certain things related to promise's life cycle happen. + class PendingSupportsSessionQuery final + : public GarbageCollected<PendingSupportsSessionQuery> { + DISALLOW_COPY_AND_ASSIGN(PendingSupportsSessionQuery); + + public: + PendingSupportsSessionQuery(ScriptPromiseResolver*, XRSession::SessionMode); + virtual ~PendingSupportsSessionQuery() = default; + + // Resolves underlying promise. + void Resolve(); + // Rejects underlying promise with passed in DOM exception. + void Reject(DOMException* exception); + // Rejects underlying promise with passed in v8 value. Used to raise + // TypeError which is not a DOM exception. + void Reject(v8::Local<v8::Value> value); + + XRSession::SessionMode mode() const; + + virtual void Trace(blink::Visitor*); + + private: + Member<ScriptPromiseResolver> resolver_; + const XRSession::SessionMode mode_; }; void OnRequestDeviceReturned(device::mojom::blink::XRDevicePtr device); void DispatchPendingSessionCalls(); - void DispatchRequestSession(PendingSessionQuery*); - void OnRequestSessionReturned(PendingSessionQuery*, + void DispatchRequestSession(PendingRequestSessionQuery*); + void OnRequestSessionReturned(PendingRequestSessionQuery*, device::mojom::blink::XRSessionPtr); - void DispatchSupportsSession(PendingSessionQuery*); - void OnSupportsSessionReturned(PendingSessionQuery*, bool supports_session); + void DispatchSupportsSession(PendingSupportsSessionQuery*); + void OnSupportsSessionReturned(PendingSupportsSessionQuery*, + bool supports_session); void EnsureDevice(); void ReportImmersiveSupported(bool supported); @@ -148,11 +199,11 @@ // Track calls that were made prior to the internal device successfully being // queried. Can be removed once the service has been updated to allow the // respective calls to be made directly. - HeapVector<Member<PendingSessionQuery>> pending_mode_queries_; - HeapVector<Member<PendingSessionQuery>> pending_session_requests_; + HeapVector<Member<PendingSupportsSessionQuery>> pending_mode_queries_; + HeapVector<Member<PendingRequestSessionQuery>> pending_session_requests_; - HeapHashSet<Member<PendingSessionQuery>> outstanding_support_queries_; - HeapHashSet<Member<PendingSessionQuery>> outstanding_request_queries_; + HeapHashSet<Member<PendingSupportsSessionQuery>> outstanding_support_queries_; + HeapHashSet<Member<PendingRequestSessionQuery>> outstanding_request_queries_; Vector<EnvironmentProviderErrorCallback> environment_provider_error_callbacks_;
diff --git a/third_party/blink/renderer/platform/BUILD.gn b/third_party/blink/renderer/platform/BUILD.gn index a29cb66..c8a9070 100644 --- a/third_party/blink/renderer/platform/BUILD.gn +++ b/third_party/blink/renderer/platform/BUILD.gn
@@ -72,15 +72,7 @@ output_file, ] - args = [] - if (is_mac && !use_system_xcode) { - args += [ - "--developer_dir", - hermetic_xcode_path, - ] - } - - args += [ + args = [ gperf_exe, "--key-positions=*", "-D",
diff --git a/third_party/blink/renderer/platform/fonts/shaping/harfbuzz_shaper.cc b/third_party/blink/renderer/platform/fonts/shaping/harfbuzz_shaper.cc index fb73b182..11baf4df 100644 --- a/third_party/blink/renderer/platform/fonts/shaping/harfbuzz_shaper.cc +++ b/third_party/blink/renderer/platform/fonts/shaping/harfbuzz_shaper.cc
@@ -613,9 +613,12 @@ } } - static hb_feature_t hwid = CreateFeature(HB_TAG('h', 'w', 'i', 'd'), 1); - static hb_feature_t twid = CreateFeature(HB_TAG('t', 'w', 'i', 'd'), 1); - static hb_feature_t qwid = CreateFeature(HB_TAG('q', 'w', 'i', 'd'), 1); + static constexpr hb_feature_t hwid = + CreateFeature(HB_TAG('h', 'w', 'i', 'd'), 1); + static constexpr hb_feature_t twid = + CreateFeature(HB_TAG('t', 'w', 'i', 'd'), 1); + static constexpr hb_feature_t qwid = + CreateFeature(HB_TAG('q', 'w', 'i', 'd'), 1); switch (description.WidthVariant()) { case kHalfWidth: features->push_back(hwid); @@ -633,12 +636,18 @@ // font-variant-east-asian: const FontVariantEastAsian east_asian = description.VariantEastAsian(); if (UNLIKELY(!east_asian.IsAllNormal())) { - static hb_feature_t jp78 = CreateFeature(HB_TAG('j', 'p', '7', '8'), 1); - static hb_feature_t jp83 = CreateFeature(HB_TAG('j', 'p', '8', '3'), 1); - static hb_feature_t jp90 = CreateFeature(HB_TAG('j', 'p', '9', '0'), 1); - static hb_feature_t jp04 = CreateFeature(HB_TAG('j', 'p', '0', '4'), 1); - static hb_feature_t smpl = CreateFeature(HB_TAG('s', 'm', 'p', 'l'), 1); - static hb_feature_t trad = CreateFeature(HB_TAG('t', 'r', 'a', 'd'), 1); + static constexpr hb_feature_t jp78 = + CreateFeature(HB_TAG('j', 'p', '7', '8'), 1); + static constexpr hb_feature_t jp83 = + CreateFeature(HB_TAG('j', 'p', '8', '3'), 1); + static constexpr hb_feature_t jp90 = + CreateFeature(HB_TAG('j', 'p', '9', '0'), 1); + static constexpr hb_feature_t jp04 = + CreateFeature(HB_TAG('j', 'p', '0', '4'), 1); + static constexpr hb_feature_t smpl = + CreateFeature(HB_TAG('s', 'm', 'p', 'l'), 1); + static constexpr hb_feature_t trad = + CreateFeature(HB_TAG('t', 'r', 'a', 'd'), 1); switch (east_asian.Form()) { case FontVariantEastAsian::kNormalForm: break; @@ -663,8 +672,10 @@ default: NOTREACHED(); } - static hb_feature_t fwid = CreateFeature(HB_TAG('f', 'w', 'i', 'd'), 1); - static hb_feature_t pwid = CreateFeature(HB_TAG('p', 'w', 'i', 'd'), 1); + static constexpr hb_feature_t fwid = + CreateFeature(HB_TAG('f', 'w', 'i', 'd'), 1); + static constexpr hb_feature_t pwid = + CreateFeature(HB_TAG('p', 'w', 'i', 'd'), 1); switch (east_asian.Width()) { case FontVariantEastAsian::kNormalWidth: break; @@ -677,46 +688,55 @@ default: NOTREACHED(); } - static hb_feature_t ruby = CreateFeature(HB_TAG('r', 'u', 'b', 'y'), 1); + static constexpr hb_feature_t ruby = + CreateFeature(HB_TAG('r', 'u', 'b', 'y'), 1); if (east_asian.Ruby()) features->push_back(ruby); } // font-variant-numeric: - static hb_feature_t lnum = CreateFeature(HB_TAG('l', 'n', 'u', 'm'), 1); + static constexpr hb_feature_t lnum = + CreateFeature(HB_TAG('l', 'n', 'u', 'm'), 1); if (description.VariantNumeric().NumericFigureValue() == FontVariantNumeric::kLiningNums) features->push_back(lnum); - static hb_feature_t onum = CreateFeature(HB_TAG('o', 'n', 'u', 'm'), 1); + static constexpr hb_feature_t onum = + CreateFeature(HB_TAG('o', 'n', 'u', 'm'), 1); if (description.VariantNumeric().NumericFigureValue() == FontVariantNumeric::kOldstyleNums) features->push_back(onum); - static hb_feature_t pnum = CreateFeature(HB_TAG('p', 'n', 'u', 'm'), 1); + static constexpr hb_feature_t pnum = + CreateFeature(HB_TAG('p', 'n', 'u', 'm'), 1); if (description.VariantNumeric().NumericSpacingValue() == FontVariantNumeric::kProportionalNums) features->push_back(pnum); - static hb_feature_t tnum = CreateFeature(HB_TAG('t', 'n', 'u', 'm'), 1); + static constexpr hb_feature_t tnum = + CreateFeature(HB_TAG('t', 'n', 'u', 'm'), 1); if (description.VariantNumeric().NumericSpacingValue() == FontVariantNumeric::kTabularNums) features->push_back(tnum); - static hb_feature_t afrc = CreateFeature(HB_TAG('a', 'f', 'r', 'c'), 1); + static constexpr hb_feature_t afrc = + CreateFeature(HB_TAG('a', 'f', 'r', 'c'), 1); if (description.VariantNumeric().NumericFractionValue() == FontVariantNumeric::kStackedFractions) features->push_back(afrc); - static hb_feature_t frac = CreateFeature(HB_TAG('f', 'r', 'a', 'c'), 1); + static constexpr hb_feature_t frac = + CreateFeature(HB_TAG('f', 'r', 'a', 'c'), 1); if (description.VariantNumeric().NumericFractionValue() == FontVariantNumeric::kDiagonalFractions) features->push_back(frac); - static hb_feature_t ordn = CreateFeature(HB_TAG('o', 'r', 'd', 'n'), 1); + static constexpr hb_feature_t ordn = + CreateFeature(HB_TAG('o', 'r', 'd', 'n'), 1); if (description.VariantNumeric().OrdinalValue() == FontVariantNumeric::kOrdinalOn) features->push_back(ordn); - static hb_feature_t zero = CreateFeature(HB_TAG('z', 'e', 'r', 'o'), 1); + static constexpr hb_feature_t zero = + CreateFeature(HB_TAG('z', 'e', 'r', 'o'), 1); if (description.VariantNumeric().SlashedZeroValue() == FontVariantNumeric::kSlashedZeroOn) features->push_back(zero); @@ -775,12 +795,18 @@ void CapsFeatureSettingsScopedOverlay::OverlayCapsFeatures( FontDescription::FontVariantCaps variant_caps) { - static hb_feature_t smcp = CreateFeature(HB_TAG('s', 'm', 'c', 'p'), 1); - static hb_feature_t pcap = CreateFeature(HB_TAG('p', 'c', 'a', 'p'), 1); - static hb_feature_t c2sc = CreateFeature(HB_TAG('c', '2', 's', 'c'), 1); - static hb_feature_t c2pc = CreateFeature(HB_TAG('c', '2', 'p', 'c'), 1); - static hb_feature_t unic = CreateFeature(HB_TAG('u', 'n', 'i', 'c'), 1); - static hb_feature_t titl = CreateFeature(HB_TAG('t', 'i', 't', 'l'), 1); + static constexpr hb_feature_t smcp = + CreateFeature(HB_TAG('s', 'm', 'c', 'p'), 1); + static constexpr hb_feature_t pcap = + CreateFeature(HB_TAG('p', 'c', 'a', 'p'), 1); + static constexpr hb_feature_t c2sc = + CreateFeature(HB_TAG('c', '2', 's', 'c'), 1); + static constexpr hb_feature_t c2pc = + CreateFeature(HB_TAG('c', '2', 'p', 'c'), 1); + static constexpr hb_feature_t unic = + CreateFeature(HB_TAG('u', 'n', 'i', 'c'), 1); + static constexpr hb_feature_t titl = + CreateFeature(HB_TAG('t', 'i', 't', 'l'), 1); if (variant_caps == FontDescription::kSmallCaps || variant_caps == FontDescription::kAllSmallCaps) { PrependCounting(smcp);
diff --git a/third_party/blink/renderer/platform/graphics/compositing/paint_chunks_to_cc_layer.cc b/third_party/blink/renderer/platform/graphics/compositing/paint_chunks_to_cc_layer.cc index aa75fdb4a..fb00041 100644 --- a/third_party/blink/renderer/platform/graphics/compositing/paint_chunks_to_cc_layer.cc +++ b/third_party/blink/renderer/platform/graphics/compositing/paint_chunks_to_cc_layer.cc
@@ -202,6 +202,9 @@ const EffectPaintPropertyNode* effect; // See ConversionContext::previous_transform_. const TransformPaintPropertyNode* previous_transform; +#if DCHECK_IS_ON() + bool has_pre_cap_effect_hierarchy_issue = false; +#endif }; void PushState(StateEntry::PairedType, int saved_count); void PopState(); @@ -426,6 +429,16 @@ current_transform_ = &local_transform; } +bool HasRealEffects(const EffectPaintPropertyNode& current, + const EffectPaintPropertyNode& ancestor) { + for (const auto* node = ¤t; node != &ancestor; + node = SafeUnalias(node->Parent())) { + if (node->HasRealEffects()) + return true; + } + return false; +} + void ConversionContext::SwitchToEffect( const EffectPaintPropertyNode& target_effect_arg) { const auto& target_effect = target_effect_arg.Unalias(); @@ -435,6 +448,11 @@ // Step 1: Exit all effects until the lowest common ancestor is found. const auto& lca_effect = LowestCommonAncestor(target_effect, *current_effect_).Unalias(); + +#if DCHECK_IS_ON() + bool has_pre_cap_effect_hierarchy_issue = false; +#endif + while (current_effect_ != &lca_effect) { // This EndClips() and the later EndEffect() pop to the parent effect. EndClips(); @@ -448,9 +466,16 @@ << target_effect.ToTreeString().Utf8().data() << "current_effect_:\n" << current_effect_->ToTreeString().Utf8().data(); + has_pre_cap_effect_hierarchy_issue = true; #endif if (RuntimeEnabledFeatures::CompositeAfterPaintEnabled()) NOTREACHED(); + // In pre-CompositeAfterPaint, we may squash one layer into another, but + // the squashing layer may create more effect nodes not for real effects, + // causing squashed layer's effect to escape the squashing layer's effect. + // We can continue because the extra effects are noop. + if (!HasRealEffects(*current_effect_, lca_effect)) + break; return; } EndEffect(); @@ -459,7 +484,7 @@ // Step 2: Collect all effects between the target effect and the current // effect. At this point the current effect must be an ancestor of the target. Vector<const EffectPaintPropertyNode*, 1u> pending_effects; - for (const auto* effect = &target_effect; effect != current_effect_; + for (const auto* effect = &target_effect; effect != &lca_effect; effect = SafeUnalias(effect->Parent())) { // This should never happen unless the DCHECK in step 1 failed. if (!effect) @@ -470,8 +495,17 @@ // Step 3: Now apply the list of effects in top-down order. for (size_t i = pending_effects.size(); i--;) { const EffectPaintPropertyNode* sub_effect = pending_effects[i]; - DCHECK_EQ(current_effect_, SafeUnalias(sub_effect->Parent())); +#if DCHECK_IS_ON() + if (!has_pre_cap_effect_hierarchy_issue) + DCHECK_EQ(current_effect_, SafeUnalias(sub_effect->Parent())); +#endif StartEffect(*sub_effect); +#if DCHECK_IS_ON() + state_stack_.back().has_pre_cap_effect_hierarchy_issue = + has_pre_cap_effect_hierarchy_issue; + // This applies only to the first new effect. + has_pre_cap_effect_hierarchy_issue = false; +#endif } } @@ -575,10 +609,13 @@ } void ConversionContext::EndEffect() { +#if DCHECK_IS_ON() const auto& previous_state = state_stack_.back(); DCHECK_EQ(previous_state.type, StateEntry::kEffect); - DCHECK_EQ(SafeUnalias(current_effect_->Parent()), previous_state.effect); + if (!previous_state.has_pre_cap_effect_hierarchy_issue) + DCHECK_EQ(SafeUnalias(current_effect_->Parent()), previous_state.effect); DCHECK_EQ(current_clip_, previous_state.clip); +#endif DCHECK(effect_bounds_stack_.size()); const auto& bounds_info = effect_bounds_stack_.back();
diff --git a/third_party/blink/renderer/platform/graphics/compositing/paint_chunks_to_cc_layer_test.cc b/third_party/blink/renderer/platform/graphics/compositing/paint_chunks_to_cc_layer_test.cc index bd0eed3..e7aaa29 100644 --- a/third_party/blink/renderer/platform/graphics/compositing/paint_chunks_to_cc_layer_test.cc +++ b/third_party/blink/renderer/platform/graphics/compositing/paint_chunks_to_cc_layer_test.cc
@@ -20,6 +20,7 @@ #include "third_party/blink/renderer/platform/graphics/paint/transform_paint_property_node.h" #include "third_party/blink/renderer/platform/testing/fake_display_item_client.h" #include "third_party/blink/renderer/platform/testing/paint_property_test_helpers.h" +#include "third_party/blink/renderer/platform/testing/paint_test_configurations.h" #include "third_party/blink/renderer/platform/testing/runtime_enabled_features_test_helpers.h" void PrintTo(const Vector<cc::PaintOpType>& ops, std::ostream* os) { @@ -51,10 +52,9 @@ namespace { class PaintChunksToCcLayerTest : public testing::Test, - private ScopedCompositeAfterPaintForTest { - protected: - PaintChunksToCcLayerTest() : ScopedCompositeAfterPaintForTest(true) {} -}; + public PaintTestConfigurations {}; + +INSTANTIATE_PAINT_TEST_SUITE_P(PaintChunksToCcLayerTest); // Matches PaintOpTypes in a PaintRecord. class PaintRecordMatcher @@ -183,7 +183,7 @@ } }; -TEST_F(PaintChunksToCcLayerTest, EffectGroupingSimple) { +TEST_P(PaintChunksToCcLayerTest, EffectGroupingSimple) { // This test verifies effects are applied as a group. auto e1 = CreateOpacityEffect(e0(), 0.5f); TestChunks chunks; @@ -204,7 +204,7 @@ EXPECT_EFFECT_BOUNDS(0, 0, 90, 90, *output, 0); } -TEST_F(PaintChunksToCcLayerTest, EffectGroupingNested) { +TEST_P(PaintChunksToCcLayerTest, EffectGroupingNested) { // This test verifies nested effects are grouped properly. auto e1 = CreateOpacityEffect(e0(), 0.5f); auto e2 = CreateOpacityEffect(*e1, 0.5f); @@ -233,7 +233,7 @@ EXPECT_EFFECT_BOUNDS(111, 222, 333, 444, *output, 4); } -TEST_F(PaintChunksToCcLayerTest, EffectFilterGroupingNestedWithTransforms) { +TEST_P(PaintChunksToCcLayerTest, EffectFilterGroupingNestedWithTransforms) { // This test verifies nested effects with transforms are grouped properly. auto t1 = CreateTransform(t0(), TransformationMatrix().Scale(2.f)); auto t2 = CreateTransform(*t1, TransformationMatrix().Translate(-50, -50)); @@ -282,7 +282,7 @@ *output, 9); } -TEST_F(PaintChunksToCcLayerTest, InterleavedClipEffect) { +TEST_P(PaintChunksToCcLayerTest, InterleavedClipEffect) { // This test verifies effects are enclosed by their output clips. // It is the same as the example made in the class comments of // ConversionContext. @@ -335,7 +335,7 @@ EXPECT_EFFECT_BOUNDS(0, 0, 50, 50, *output, 10); } -TEST_F(PaintChunksToCcLayerTest, ClipSpaceInversion) { +TEST_P(PaintChunksToCcLayerTest, ClipSpaceInversion) { // This test verifies chunks that have a shallower transform state than // its clip can still be painted. The infamous CSS corner case: // <div style="position:absolute; clip:rect(...)"> @@ -361,7 +361,7 @@ cc::PaintOpType::Restore})); // </c1 t1> } -TEST_F(PaintChunksToCcLayerTest, OpacityEffectSpaceInversion) { +TEST_P(PaintChunksToCcLayerTest, OpacityEffectSpaceInversion) { // This test verifies chunks that have a shallower transform state than // its effect can still be painted. The infamous CSS corner case: // <div style="overflow:scroll"> @@ -395,7 +395,7 @@ EXPECT_TRANSFORM_MATRIX(t1->Matrix().Inverse(), *output, 4); } -TEST_F(PaintChunksToCcLayerTest, FilterEffectSpaceInversion) { +TEST_P(PaintChunksToCcLayerTest, FilterEffectSpaceInversion) { // This test verifies chunks that have a shallower transform state than // its effect can still be painted. The infamous CSS corner case: // <div style="overflow:scroll"> @@ -435,7 +435,7 @@ EXPECT_TRANSFORM_MATRIX(t1->Matrix().Inverse(), *output, 7); } -TEST_F(PaintChunksToCcLayerTest, NonRootLayerSimple) { +TEST_P(PaintChunksToCcLayerTest, NonRootLayerSimple) { // This test verifies a layer with composited property state does not // apply properties again internally. auto t1 = CreateTransform(t0(), TransformationMatrix().Scale(2.f)); @@ -452,7 +452,7 @@ EXPECT_THAT(*output, PaintRecordMatcher::Make({cc::PaintOpType::DrawRecord})); } -TEST_F(PaintChunksToCcLayerTest, NonRootLayerTransformEscape) { +TEST_P(PaintChunksToCcLayerTest, NonRootLayerTransformEscape) { // This test verifies chunks that have a shallower transform state than the // layer can still be painted. auto t1 = CreateTransform(t0(), TransformationMatrix().Scale(2.f)); @@ -473,7 +473,7 @@ cc::PaintOpType::Restore})); // </t1^-1> } -TEST_F(PaintChunksToCcLayerTest, EffectWithNoOutputClip) { +TEST_P(PaintChunksToCcLayerTest, EffectWithNoOutputClip) { // This test verifies effect with no output clip can be correctly processed. auto c1 = CreateClip(c0(), t0(), FloatRoundedRect(0.f, 0.f, 1.f, 1.f)); auto c2 = CreateClip(*c1, t0(), FloatRoundedRect(0.f, 0.f, 1.f, 1.f)); @@ -498,7 +498,7 @@ EXPECT_EFFECT_BOUNDS(0, 0, 100, 100, *output, 0); } -TEST_F(PaintChunksToCcLayerTest, +TEST_P(PaintChunksToCcLayerTest, EffectWithNoOutputClipNestedInDecompositedEffect) { auto c1 = CreateClip(c0(), t0(), FloatRoundedRect(0.f, 0.f, 1.f, 1.f)); auto e1 = CreateOpacityEffect(e0(), 0.5); @@ -526,7 +526,7 @@ EXPECT_EFFECT_BOUNDS(0, 0, 100, 100, *output, 1); } -TEST_F(PaintChunksToCcLayerTest, +TEST_P(PaintChunksToCcLayerTest, EffectWithNoOutputClipNestedInCompositedEffect) { auto c1 = CreateClip(c0(), t0(), FloatRoundedRect(0.f, 0.f, 1.f, 1.f)); auto e1 = CreateOpacityEffect(e0(), 0.5); @@ -551,7 +551,7 @@ EXPECT_EFFECT_BOUNDS(0, 0, 100, 100, *output, 0); } -TEST_F(PaintChunksToCcLayerTest, +TEST_P(PaintChunksToCcLayerTest, EffectWithNoOutputClipNestedInCompositedEffectAndClip) { auto c1 = CreateClip(c0(), t0(), FloatRoundedRect(0.f, 0.f, 1.f, 1.f)); auto e1 = CreateOpacityEffect(e0(), 0.5); @@ -573,7 +573,7 @@ EXPECT_EFFECT_BOUNDS(0, 0, 100, 100, *output, 0); } -TEST_F(PaintChunksToCcLayerTest, VisualRect) { +TEST_P(PaintChunksToCcLayerTest, VisualRect) { auto layer_transform = CreateTransform(t0(), TransformationMatrix().Scale(20)); auto chunk_transform = CreateTransform( @@ -600,7 +600,7 @@ cc::PaintOpType::Restore})); // </layer_offset> } -TEST_F(PaintChunksToCcLayerTest, NoncompositedClipPath) { +TEST_P(PaintChunksToCcLayerTest, NoncompositedClipPath) { auto c1 = CreateClipPathClip(c0(), t0(), FloatRoundedRect(1, 2, 3, 4)); TestChunks chunks; chunks.AddChunk(t0(), *c1, e0()); @@ -620,7 +620,7 @@ cc::PaintOpType::Restore})); // </clip_path> } -TEST_F(PaintChunksToCcLayerTest, EmptyClipsAreElided) { +TEST_P(PaintChunksToCcLayerTest, EmptyClipsAreElided) { auto c1 = CreateClip(c0(), t0(), FloatRoundedRect(0.f, 0.f, 1.f, 1.f)); auto c1c2 = CreateClip(*c1, t0(), FloatRoundedRect(0.f, 0.f, 1.f, 1.f)); auto c2 = CreateClip(c0(), t0(), FloatRoundedRect(0.f, 0.f, 1.f, 1.f)); @@ -649,7 +649,7 @@ })); } -TEST_F(PaintChunksToCcLayerTest, NonEmptyClipsAreStored) { +TEST_P(PaintChunksToCcLayerTest, NonEmptyClipsAreStored) { auto c1 = CreateClip(c0(), t0(), FloatRoundedRect(0.f, 0.f, 1.f, 1.f)); auto c1c2 = CreateClip(*c1, t0(), FloatRoundedRect(0.f, 0.f, 1.f, 1.f)); auto c2 = CreateClip(c0(), t0(), FloatRoundedRect(0.f, 0.f, 1.f, 1.f)); @@ -681,7 +681,7 @@ })); } -TEST_F(PaintChunksToCcLayerTest, EmptyEffectsAreStored) { +TEST_P(PaintChunksToCcLayerTest, EmptyEffectsAreStored) { auto e1 = CreateOpacityEffect(e0(), 0.5); TestChunks chunks; @@ -701,7 +701,7 @@ EXPECT_EFFECT_BOUNDS(0, 0, 100, 100, *output, 0); } -TEST_F(PaintChunksToCcLayerTest, CombineClips) { +TEST_P(PaintChunksToCcLayerTest, CombineClips) { FloatRoundedRect clip_rect(0, 0, 100, 100); auto t1 = CreateTransform(t0(), TransformationMatrix().Scale(2.f)); auto c1 = CreateClip(c0(), t0(), clip_rect); @@ -738,7 +738,7 @@ cc::PaintOpType::Restore})); // </c1+c2> } -TEST_F(PaintChunksToCcLayerTest, CombineClipsAcrossTransform) { +TEST_P(PaintChunksToCcLayerTest, CombineClipsAcrossTransform) { FloatRoundedRect clip_rect(0, 0, 100, 100); auto identity = CreateTransform(t0(), TransformationMatrix()); auto non_identity = @@ -782,7 +782,7 @@ EXPECT_CLIP(FloatRect(5, 6, 7, 8), *output, 7); } -TEST_F(PaintChunksToCcLayerTest, CombineClipsWithRoundedRects) { +TEST_P(PaintChunksToCcLayerTest, CombineClipsWithRoundedRects) { FloatRoundedRect clip_rect(0, 0, 100, 100); FloatSize corner(5, 5); FloatRoundedRect big_rounded_clip_rect(FloatRect(0, 0, 200, 200), corner, @@ -829,7 +829,7 @@ EXPECT_ROUNDED_CLIP(small_rounded_clip_rect, *output, 9); } -TEST_F(PaintChunksToCcLayerTest, ChunksSamePropertyTreeState) { +TEST_P(PaintChunksToCcLayerTest, ChunksSamePropertyTreeState) { auto t1 = CreateTransform(t0(), TransformationMatrix().Scale(2.f)); auto t2 = CreateTransform(*t1, TransformationMatrix().Scale(3.f)); auto c1 = CreateClip(c0(), *t1, FloatRoundedRect(0, 0, 100, 100)); @@ -866,7 +866,7 @@ cc::PaintOpType::Restore})); // </t1> } -TEST_F(PaintChunksToCcLayerTest, NoOpForIdentityTransforms) { +TEST_P(PaintChunksToCcLayerTest, NoOpForIdentityTransforms) { auto t1 = CreateTransform(t0(), TransformationMatrix()); auto t2 = CreateTransform(*t1, TransformationMatrix()); auto t3 = CreateTransform(*t2, TransformationMatrix()); @@ -901,7 +901,7 @@ cc::PaintOpType::Restore})); // </c1+c2> } -TEST_F(PaintChunksToCcLayerTest, EffectsWithSameTransform) { +TEST_P(PaintChunksToCcLayerTest, EffectsWithSameTransform) { auto t1 = CreateTransform(t0(), TransformationMatrix().Scale(2)); auto e1 = CreateOpacityEffect(e0(), *t1, &c0(), 0.1f); auto e2 = CreateOpacityEffect(e0(), *t1, &c0(), 0.2f); @@ -930,7 +930,7 @@ cc::PaintOpType::Restore})); // </t1> } -TEST_F(PaintChunksToCcLayerTest, NestedEffectsWithSameTransform) { +TEST_P(PaintChunksToCcLayerTest, NestedEffectsWithSameTransform) { auto t1 = CreateTransform(t0(), TransformationMatrix().Scale(2)); auto e1 = CreateOpacityEffect(e0(), *t1, &c0(), 0.1f); auto e2 = CreateOpacityEffect(*e1, *t1, &c0(), 0.2f); @@ -959,7 +959,7 @@ cc::PaintOpType::Restore})); // </t1> } -TEST_F(PaintChunksToCcLayerTest, NoopTransformIsNotEmitted) { +TEST_P(PaintChunksToCcLayerTest, NoopTransformIsNotEmitted) { auto t1 = CreateTransform(t0(), TransformationMatrix().Scale(2.f)); auto noop_t2 = TransformPaintPropertyNode::CreateAlias(*t1); auto noop_t3 = TransformPaintPropertyNode::CreateAlias(*noop_t2); @@ -998,7 +998,7 @@ })); } -TEST_F(PaintChunksToCcLayerTest, OnlyNoopTransformIsNotEmitted) { +TEST_P(PaintChunksToCcLayerTest, OnlyNoopTransformIsNotEmitted) { auto noop_t1 = TransformPaintPropertyNode::CreateAlias(t0()); auto noop_t2 = TransformPaintPropertyNode::CreateAlias(*noop_t1); @@ -1018,7 +1018,7 @@ cc::PaintOpType::DrawRecord})); } -TEST_F(PaintChunksToCcLayerTest, NoopTransformFirstThenBackToParent) { +TEST_P(PaintChunksToCcLayerTest, NoopTransformFirstThenBackToParent) { auto t1 = CreateTransform(t0(), TransformationMatrix().Scale(2)); auto noop_t2 = TransformPaintPropertyNode::CreateAlias(*t1); @@ -1043,7 +1043,7 @@ })); } -TEST_F(PaintChunksToCcLayerTest, ClipUndoesNoopTransform) { +TEST_P(PaintChunksToCcLayerTest, ClipUndoesNoopTransform) { auto t1 = CreateTransform(t0(), TransformationMatrix().Scale(2)); auto noop_t2 = TransformPaintPropertyNode::CreateAlias(*t1); auto c1 = CreateClip(c0(), *t1, FloatRoundedRect(0.f, 0.f, 1.f, 1.f)); @@ -1072,7 +1072,7 @@ })); } -TEST_F(PaintChunksToCcLayerTest, EffectUndoesNoopTransform) { +TEST_P(PaintChunksToCcLayerTest, EffectUndoesNoopTransform) { auto t1 = CreateTransform(t0(), TransformationMatrix().Scale(2)); auto noop_t2 = TransformPaintPropertyNode::CreateAlias(*t1); auto e1 = CreateOpacityEffect(e0(), *t1, &c0(), 0.5); @@ -1101,7 +1101,7 @@ })); } -TEST_F(PaintChunksToCcLayerTest, NoopClipDoesNotEmitItems) { +TEST_P(PaintChunksToCcLayerTest, NoopClipDoesNotEmitItems) { FloatRoundedRect clip_rect(0.f, 0.f, 1.f, 1.f); auto c1 = CreateClip(c0(), t0(), clip_rect); auto noop_c2 = ClipPaintPropertyNode::CreateAlias(*c1); @@ -1139,7 +1139,7 @@ })); } -TEST_F(PaintChunksToCcLayerTest, EffectUndoesNoopClip) { +TEST_P(PaintChunksToCcLayerTest, EffectUndoesNoopClip) { FloatRoundedRect clip_rect(0.f, 0.f, 1.f, 1.f); auto c1 = CreateClip(c0(), t0(), clip_rect); auto noop_c2 = ClipPaintPropertyNode::CreateAlias(*c1); @@ -1166,7 +1166,7 @@ })); } -TEST_F(PaintChunksToCcLayerTest, StartWithAliasClip) { +TEST_P(PaintChunksToCcLayerTest, StartWithAliasClip) { auto noop_c1 = ClipPaintPropertyNode::CreateAlias(c0()); TestChunks chunks; @@ -1184,7 +1184,7 @@ // These tests are testing error recovery path that are only used in // release builds. A DCHECK'd build will trap instead. #if !DCHECK_IS_ON() -TEST_F(PaintChunksToCcLayerTest, SPv1ChunkEscapeLayerClipFailSafe) { +TEST_P(PaintChunksToCcLayerTest, SPv1ChunkEscapeLayerClipFailSafe) { ScopedCompositeAfterPaintForTest cap_disabler(false); // This test verifies the fail-safe path correctly recovers from a malformed // chunk that escaped its layer's clip. @@ -1203,7 +1203,7 @@ // We don't care about the exact output as long as it didn't crash. } -TEST_F(PaintChunksToCcLayerTest, SPv1ChunkEscapeEffectClipFailSafe) { +TEST_P(PaintChunksToCcLayerTest, SPv1ChunkEscapeEffectClipFailSafe) { ScopedCompositeAfterPaintForTest cap_disabler(false); // This test verifies the fail-safe path correctly recovers from a malformed // chunk that escaped its effect's clip. @@ -1226,7 +1226,7 @@ // We don't care about the exact output as long as it didn't crash. } -TEST_F(PaintChunksToCcLayerTest, SPv1ChunkEscapeLayerClipDoubleFault) { +TEST_P(PaintChunksToCcLayerTest, SPv1ChunkEscapeLayerClipDoubleFault) { ScopedCompositeAfterPaintForTest cap_disabler(false); // This test verifies the fail-safe path correctly recovers from a series of // malformed chunks that escaped their layer's clip. @@ -1248,7 +1248,7 @@ } #endif -TEST_F(PaintChunksToCcLayerTest, NoopEffectDoesNotEmitItems) { +TEST_P(PaintChunksToCcLayerTest, NoopEffectDoesNotEmitItems) { auto e1 = CreateOpacityEffect(e0(), 0.5f); auto noop_e2 = EffectPaintPropertyNode::CreateAlias(*e1); auto noop_e3 = EffectPaintPropertyNode::CreateAlias(*noop_e2); @@ -1285,5 +1285,33 @@ })); } +TEST_P(PaintChunksToCcLayerTest, AllowChunkEscapeLayerNoopEffects) { + // This test doesn't apply to CAP. + if (RuntimeEnabledFeatures::CompositeAfterPaintEnabled()) + return; + + auto e1 = CreateOpacityEffect(e0(), 0.5f); + auto noop_e2 = CreateOpacityEffect(*e1, 1.0f); + auto noop_e3 = CreateOpacityEffect(*noop_e2, 1.0f); + auto e4 = CreateOpacityEffect(*e1, 0.5f); + + PropertyTreeState layer_state(t0(), c0(), *noop_e3); + TestChunks chunks; + chunks.AddChunk(t0(), c0(), *noop_e3); + chunks.AddChunk(t0(), c0(), *e4); + + auto output = PaintChunksToCcLayer::Convert( + chunks.chunks, layer_state, gfx::Vector2dF(), chunks.items, + cc::DisplayItemList::kToBeReleasedAsPaintOpBuffer) + ->ReleaseAsRecord(); + + EXPECT_THAT(*output, PaintRecordMatcher::Make({ + cc::PaintOpType::DrawRecord, + cc::PaintOpType::SaveLayerAlpha, // e4 + cc::PaintOpType::DrawRecord, + cc::PaintOpType::Restore, // end e4 + })); +} + } // namespace } // namespace blink
diff --git a/third_party/blink/renderer/platform/graphics/graphics_layer_client.h b/third_party/blink/renderer/platform/graphics/graphics_layer_client.h index 1b338f8..ce0fab37 100644 --- a/third_party/blink/renderer/platform/graphics/graphics_layer_client.h +++ b/third_party/blink/renderer/platform/graphics/graphics_layer_client.h
@@ -110,6 +110,7 @@ } virtual bool PaintBlockedByDisplayLock() const { return false; } + virtual void NotifyDisplayLockNeedsGraphicsLayerCollection() {} #if DCHECK_IS_ON() // CompositedLayerMapping overrides this to verify that it is not
diff --git a/third_party/blink/renderer/platform/graphics/paint/effect_paint_property_node.h b/third_party/blink/renderer/platform/graphics/paint/effect_paint_property_node.h index c27731b..fca4703c 100644 --- a/third_party/blink/renderer/platform/graphics/paint/effect_paint_property_node.h +++ b/third_party/blink/renderer/platform/graphics/paint/effect_paint_property_node.h
@@ -200,6 +200,12 @@ return state_.filters_origin; } + bool HasRealEffects() const { + return Opacity() != 1.0f || GetColorFilter() != kColorFilterNone || + BlendMode() != SkBlendMode::kSrcOver || !Filter().IsEmpty() || + !BackdropFilter().IsEmpty(); + } + // Returns a rect covering the pixels that can be affected by pixels in // |inputRect|. The rects are in the space of localTransformSpace. FloatRect MapRect(const FloatRect& input_rect) const;
diff --git a/third_party/blink/renderer/platform/loader/fetch/resource_load_scheduler.cc b/third_party/blink/renderer/platform/loader/fetch/resource_load_scheduler.cc index 6477a86..b2a9c67d 100644 --- a/third_party/blink/renderer/platform/loader/fetch/resource_load_scheduler.cc +++ b/third_party/blink/renderer/platform/loader/fetch/resource_load_scheduler.cc
@@ -102,10 +102,10 @@ if (!RuntimeEnabledFeatures::ResourceLoadSchedulerEnabled()) return ResourceLoadScheduler::kOutstandingUnlimited; - static size_t main_frame_limit = GetFieldTrialUint32Param( + static const size_t main_frame_limit = GetFieldTrialUint32Param( kResourceLoadThrottlingTrial, kOutstandingLimitForBackgroundMainFrameName, kOutstandingLimitForBackgroundMainFrameDefault); - static size_t sub_frame_limit = GetFieldTrialUint32Param( + static const size_t sub_frame_limit = GetFieldTrialUint32Param( kResourceLoadThrottlingTrial, kOutstandingLimitForBackgroundSubFrameName, kOutstandingLimitForBackgroundSubFrameDefault);
diff --git a/third_party/blink/renderer/platform/loader/fetch/resource_request.cc b/third_party/blink/renderer/platform/loader/fetch/resource_request.cc index d7fdd9b..3a8d3eb5 100644 --- a/third_party/blink/renderer/platform/loader/fetch/resource_request.cc +++ b/third_party/blink/renderer/platform/loader/fetch/resource_request.cc
@@ -37,7 +37,7 @@ namespace blink { -base::TimeDelta ResourceRequest::default_timeout_interval_ = +const base::TimeDelta ResourceRequest::default_timeout_interval_ = base::TimeDelta::Max(); ResourceRequest::ResourceRequest() : ResourceRequest(NullURL()) {}
diff --git a/third_party/blink/renderer/platform/loader/fetch/resource_request.h b/third_party/blink/renderer/platform/loader/fetch/resource_request.h index 8ace9ecc..77944627 100644 --- a/third_party/blink/renderer/platform/loader/fetch/resource_request.h +++ b/third_party/blink/renderer/platform/loader/fetch/resource_request.h
@@ -492,7 +492,7 @@ mutable CacheControlHeader cache_control_header_cache_; - static base::TimeDelta default_timeout_interval_; + static const base::TimeDelta default_timeout_interval_; bool is_ad_resource_ = false;
diff --git a/third_party/blink/renderer/platform/runtime_enabled_features.json5 b/third_party/blink/renderer/platform/runtime_enabled_features.json5 index f4ad0c0..e5dfef6 100644 --- a/third_party/blink/renderer/platform/runtime_enabled_features.json5 +++ b/third_party/blink/renderer/platform/runtime_enabled_features.json5
@@ -629,6 +629,9 @@ status: "test", }, { + name: "ForcedColors", + }, + { name: "ForceOverlayFullscreenVideo", }, {
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 d124f20..9090d5d 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
@@ -458,6 +458,7 @@ case TaskType::kInternalMediaRealTime: case TaskType::kInternalUserInteraction: case TaskType::kInternalIntersectionObserver: + case TaskType::kInternalContinueScriptLoading: return PausableTaskQueueTraits(); case TaskType::kInternalFreezableIPC: return FreezableTaskQueueTraits(); @@ -510,6 +511,8 @@ scoped_refptr<MainThreadTaskQueue> FrameSchedulerImpl::GetTaskQueue( TaskType type) { switch (type) { + case TaskType::kInternalContinueScriptLoading: + return frame_task_queue_controller_->VeryHighPriorityTaskQueue(); case TaskType::kInternalLoading: case TaskType::kNetworking: case TaskType::kNetworkingWithURLLoaderAnnotation:
diff --git a/third_party/blink/renderer/platform/scheduler/main_thread/frame_task_queue_controller.cc b/third_party/blink/renderer/platform/scheduler/main_thread/frame_task_queue_controller.cc index 6ee760e..4b0b0890 100644 --- a/third_party/blink/renderer/platform/scheduler/main_thread/frame_task_queue_controller.cc +++ b/third_party/blink/renderer/platform/scheduler/main_thread/frame_task_queue_controller.cc
@@ -77,6 +77,17 @@ } scoped_refptr<MainThreadTaskQueue> +FrameTaskQueueController::VeryHighPriorityTaskQueue() { + if (!very_high_priority_task_queue_) { + very_high_priority_task_queue_ = main_thread_scheduler_impl_->NewTaskQueue( + MainThreadTaskQueue::QueueCreationParams( + MainThreadTaskQueue::QueueType::kDefault) + .SetFixedPriority(TaskQueue::QueuePriority::kVeryHighPriority)); + } + return very_high_priority_task_queue_; +} + +scoped_refptr<MainThreadTaskQueue> FrameTaskQueueController::ExperimentalWebSchedulingTaskQueue( WebSchedulingTaskQueueType task_queue_type) { if (!web_scheduling_task_queues_[task_queue_type])
diff --git a/third_party/blink/renderer/platform/scheduler/main_thread/frame_task_queue_controller.h b/third_party/blink/renderer/platform/scheduler/main_thread/frame_task_queue_controller.h index c80ac68..71e67986 100644 --- a/third_party/blink/renderer/platform/scheduler/main_thread/frame_task_queue_controller.h +++ b/third_party/blink/renderer/platform/scheduler/main_thread/frame_task_queue_controller.h
@@ -78,6 +78,10 @@ // Return the best effort task queue and create it if it doesn't exist. scoped_refptr<MainThreadTaskQueue> BestEffortTaskQueue(); + // Return the continue script loading task queue and create it if it doesn't + // exist. + scoped_refptr<MainThreadTaskQueue> VeryHighPriorityTaskQueue(); + enum WebSchedulingTaskQueueType : unsigned { kWebSchedulingUserVisiblePriority, kWebSchedulingBestEffortPriority, @@ -147,6 +151,8 @@ scoped_refptr<MainThreadTaskQueue> best_effort_task_queue_; + scoped_refptr<MainThreadTaskQueue> very_high_priority_task_queue_; + scoped_refptr<MainThreadTaskQueue> web_scheduling_task_queues_[kWebSchedulingPriorityCount];
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 0d5c5c9..20ab732 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
@@ -133,6 +133,8 @@ return "InternalNavigationAssociated"; case TaskType::kInternalFreezableIPC: return "InternalFreezableIPC"; + case TaskType::kInternalContinueScriptLoading: + return "InternalContinueScriptLoading"; 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 f5fbe122..75869ef 100644 --- a/third_party/blink/renderer/platform/scheduler/worker/worker_scheduler.cc +++ b/third_party/blink/renderer/platform/scheduler/worker/worker_scheduler.cc
@@ -157,6 +157,7 @@ case TaskType::kInternalUserInteraction: case TaskType::kInternalIntersectionObserver: case TaskType::kInternalFreezableIPC: + case TaskType::kInternalContinueScriptLoading: // 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/tools/blinkpy/presubmit/audit_non_blink_usage.py b/third_party/blink/tools/blinkpy/presubmit/audit_non_blink_usage.py index 415b820..ed79c0b 100755 --- a/third_party/blink/tools/blinkpy/presubmit/audit_non_blink_usage.py +++ b/third_party/blink/tools/blinkpy/presubmit/audit_non_blink_usage.py
@@ -32,6 +32,7 @@ # //base constructs that are allowed everywhere 'base::AdoptRef', 'base::AutoReset', + 'base::Contains', 'base::CreateSequencedTaskRunnerWithTraits', 'base::DefaultTickClock', 'base::ElapsedTimer',
diff --git a/third_party/blink/web_tests/TestExpectations b/third_party/blink/web_tests/TestExpectations index 5d4730b..be4e9cf 100644 --- a/third_party/blink/web_tests/TestExpectations +++ b/third_party/blink/web_tests/TestExpectations
@@ -729,6 +729,7 @@ crbug.com/591099 virtual/layout_ng_experimental/fast/multicol/dynamic/remove-block-from-content-between-spanners.html [ Failure Crash Timeout ] crbug.com/636993 virtual/layout_ng_experimental/fast/multicol/dynamic/remove-inline-and-spanner-after-spanner-foreignObject.html [ Pass Crash Timeout ] +crbug.com/591099 virtual/layout_ng_experimental/fast/multicol/flowthread-with-floats-destroyed-crash.html [ Crash ] crbug.com/797591 virtual/layout_ng_experimental/fast/multicol/regular-block-becomes-multicol.html [ Failure ] crbug.com/797591 virtual/layout_ng_experimental/fast/multicol/newmulticol/regular-block-becomes-multicol.html [ Failure ] @@ -902,6 +903,7 @@ crbug.com/591099 virtual/layout_ng_experimental/fast/multicol/balance-float-with-margin-top-and-line-after-break.html [ Crash Failure ] crbug.com/591099 virtual/layout_ng_experimental/fast/multicol/balance-float-with-margin-top-and-line-before-break.html [ Failure ] crbug.com/591099 virtual/layout_ng_experimental/fast/multicol/balance-line-overflow.html [ Failure ] +crbug.com/591099 virtual/layout_ng_experimental/fast/multicol/balance-line-underflow-1.html [ Crash ] crbug.com/591099 virtual/layout_ng_experimental/fast/multicol/balance-line-underflow-2.html [ Failure ] crbug.com/591099 virtual/layout_ng_experimental/fast/multicol/balance-repeating-table-headers.html [ Failure ] crbug.com/591099 virtual/layout_ng_experimental/fast/multicol/balance-table-with-border-spacing.html [ Failure ] @@ -941,7 +943,7 @@ crbug.com/591099 virtual/layout_ng_experimental/fast/multicol/dynamic/change-spanner-display.html [ Failure ] crbug.com/591099 virtual/layout_ng_experimental/fast/multicol/dynamic/change-spanner-parent-display.html [ Failure ] crbug.com/591099 virtual/layout_ng_experimental/fast/multicol/dynamic/float-becomes-spanner.html [ Failure ] -crbug.com/591099 virtual/layout_ng_experimental/fast/multicol/dynamic/insert-block-among-text-in-anonymous-wrapper.html [ Failure ] +crbug.com/591099 virtual/layout_ng_experimental/fast/multicol/dynamic/insert-block-among-text-in-anonymous-wrapper.html [ Crash Failure ] crbug.com/591099 virtual/layout_ng_experimental/fast/multicol/dynamic/insert-block-before-spanner-before-content.html [ Failure ] crbug.com/591099 virtual/layout_ng_experimental/fast/multicol/dynamic/insert-block-before-spanner.html [ Failure ] crbug.com/591099 virtual/layout_ng_experimental/fast/multicol/dynamic/insert-block-between-spanners.html [ Failure ] @@ -972,7 +974,7 @@ crbug.com/591099 virtual/layout_ng_experimental/fast/multicol/dynamic/remove-column-content-next-to-abspos-between-spanners.html [ Failure ] crbug.com/591099 virtual/layout_ng_experimental/fast/multicol/dynamic/remove-spanner-after-content.html [ Failure ] crbug.com/591099 virtual/layout_ng_experimental/fast/multicol/dynamic/remove-spanner-before-content.html [ Failure ] -crbug.com/591099 virtual/layout_ng_experimental/fast/multicol/dynamic/remove-spanner-in-content.html [ Failure ] +crbug.com/591099 virtual/layout_ng_experimental/fast/multicol/dynamic/remove-spanner-in-content.html [ Crash Failure ] crbug.com/591099 virtual/layout_ng_experimental/fast/multicol/dynamic/spanner-after-content-becomes-regular-block.html [ Failure ] crbug.com/591099 virtual/layout_ng_experimental/fast/multicol/dynamic/spanner-ancestor-becomes-spanner.html [ Failure ] crbug.com/829028 virtual/layout_ng_experimental/fast/multicol/dynamic/spanner-becomes-float.html [ Failure ] @@ -1107,11 +1109,14 @@ crbug.com/591099 virtual/layout_ng_experimental/fast/multicol/span/break-in-columns-before-spanner.html [ Failure ] crbug.com/591099 virtual/layout_ng_experimental/fast/multicol/span/change-multicol-writing-mode.html [ Failure ] crbug.com/591099 virtual/layout_ng_experimental/fast/multicol/span/change-spanner-margins.html [ Failure ] +crbug.com/591099 virtual/layout_ng_experimental/fast/multicol/span/empty-block-between-spanners.html [ Crash ] crbug.com/591099 virtual/layout_ng_experimental/fast/multicol/span/empty-block-between-spanners-with-margins.html [ Failure ] +crbug.com/591099 virtual/layout_ng_experimental/fast/multicol/span/empty-block-with-bottom-margin-between-spanners.html [ Crash ] crbug.com/591099 virtual/layout_ng_experimental/fast/multicol/span/empty-spanner-between-spanners-with-margins.html [ Failure ] crbug.com/591099 virtual/layout_ng_experimental/fast/multicol/span/fill-after-spanner-exact-fit.html [ Failure ] crbug.com/591099 virtual/layout_ng_experimental/fast/multicol/span/fill-after-spanner-extra-height.html [ Failure ] crbug.com/591099 virtual/layout_ng_experimental/fast/multicol/span/float.html [ Failure ] +crbug.com/591099 virtual/layout_ng_experimental/fast/multicol/span/generated-child-split-flow-crash.html [ Crash ] crbug.com/591099 virtual/layout_ng_experimental/fast/multicol/span/height-decrease.html [ Failure ] crbug.com/591099 virtual/layout_ng_experimental/fast/multicol/span/height-increase.html [ Failure ] crbug.com/591099 virtual/layout_ng_experimental/fast/multicol/span/in-nested-multicol-with-hard-breaks.html [ Failure ] @@ -1224,6 +1229,8 @@ crbug.com/591099 virtual/layout_ng_experimental/fragmentation/auto-scrollbar-shrink-to-fit.html [ Failure ] crbug.com/591099 virtual/layout_ng_experimental/fragmentation/avoid-break-inside-first-child.html [ Failure ] crbug.com/591099 virtual/layout_ng_experimental/fragmentation/avoid-break-inside-first-child-nested.html [ Failure ] +crbug.com/591099 virtual/layout_ng_experimental/fragmentation/become-unfragmented-with-lines.html [ Crash ] +crbug.com/591099 virtual/layout_ng_experimental/fragmentation/become-unfragmented-with-unbreakable-blocks.html [ Crash ] crbug.com/591099 virtual/layout_ng_experimental/fragmentation/block-after-float-first-child.html [ Failure ] crbug.com/591099 virtual/layout_ng_experimental/fragmentation/border-spacing-break-before-unbreakable-row.html [ Failure ] crbug.com/591099 virtual/layout_ng_experimental/fragmentation/break-in-first-table-row-only.html [ Failure ] @@ -1367,6 +1374,7 @@ crbug.com/591099 virtual/layout_ng_experimental/css3/flexbox/box-sizing-min-max-sizes.html [ Failure ] crbug.com/591099 virtual/layout_ng_experimental/css3/flexbox/box-sizing.html [ Failure ] crbug.com/591099 virtual/layout_ng_experimental/css3/flexbox/bug604346.html [ Failure ] +crbug.com/591099 virtual/layout_ng_experimental/css3/flexbox/change-column-flex-width.html [ Crash ] crbug.com/591099 virtual/layout_ng_experimental/css3/flexbox/columns-auto-size.html [ Failure ] crbug.com/591099 virtual/layout_ng_experimental/css3/flexbox/columns-height-set-via-top-bottom.html [ Failure ] crbug.com/591099 virtual/layout_ng_experimental/css3/flexbox/content-height-with-scrollbars.html [ Failure ] @@ -1391,7 +1399,7 @@ crbug.com/591099 virtual/layout_ng_experimental/css3/flexbox/flexbox-baseline.html [ Failure ] crbug.com/591099 virtual/layout_ng_experimental/css3/flexbox/flexbox-height-with-overflow-auto.html [ Failure ] crbug.com/591099 virtual/layout_ng_experimental/css3/flexbox/flexbox-overflow-auto.html [ Failure ] -crbug.com/591099 virtual/layout_ng_experimental/css3/flexbox/flexitem.html [ Failure ] +crbug.com/591099 virtual/layout_ng_experimental/css3/flexbox/flexitem.html [ Crash Failure ] crbug.com/591099 virtual/layout_ng_experimental/css3/flexbox/inline-flexbox-wrap-vertically-width-calculation.html [ Failure ] crbug.com/591099 virtual/layout_ng_experimental/css3/flexbox/line-wrapping.html [ Failure ] crbug.com/591099 virtual/layout_ng_experimental/css3/flexbox/minimum-size-image.html [ Failure ] @@ -1552,6 +1560,7 @@ # Fieldset in NG # +crbug.com/591099 virtual/layout_ng_experimental/external/wpt/html/rendering/non-replaced-elements/the-fieldset-and-legend-elements/fieldset-calculating-min-max-content.html [ Crash ] crbug.com/875235 virtual/layout_ng_experimental/external/wpt/html/rendering/non-replaced-elements/the-fieldset-and-legend-elements/fieldset-overflow.html [ Failure ] crbug.com/875235 virtual/layout_ng_experimental/external/wpt/html/rendering/non-replaced-elements/the-fieldset-and-legend-elements/fieldset-painting-order.html [ Failure ] crbug.com/875235 virtual/layout_ng_experimental/external/wpt/html/rendering/non-replaced-elements/the-fieldset-and-legend-elements/fieldset-percentage-block-size.html [ Failure ] @@ -2128,8 +2137,6 @@ crbug.com/658305 css3/filters/effect-reference-zoom-hw.html [ Failure Pass ] crbug.com/658305 css3/filters/filter-effect-removed.html [ Failure Pass ] -crbug.com/968033 [ Mac ] fast/writing-mode/text-combine-line-break.html [ Failure ] - crbug.com/524160 [ Debug ] http/tests/media/media-source/stream_memory_tests/mediasource-appendbuffer-quota-exceeded-default-buffers.html [ Timeout ] # Run the tests with the default MSE buffer sizes in the main test suite and the tests for 1MB buffers set via command line in a virtual test suite @@ -3146,7 +3153,6 @@ crbug.com/626703 external/wpt/css/css-text/writing-system/writing-system-text-transform-001.html [ Failure ] crbug.com/903383 external/wpt/css/filter-effects/css-filters-animation-combined-001.html [ Failure ] crbug.com/903383 external/wpt/css/filter-effects/css-filters-animation-blur.html [ Failure ] -crbug.com/903383 external/wpt/css/filter-effects/filters-test-brightness-003.html [ Failure ] crbug.com/626703 external/wpt/html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/open-features-non-integer-width.html [ Timeout ] crbug.com/626703 external/wpt/html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/open-features-non-integer-screenx.html [ Timeout ] crbug.com/626703 external/wpt/html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/open-features-non-integer-innerwidth.html [ Timeout ] @@ -4023,8 +4029,6 @@ crbug.com/957457 virtual/threaded/external/wpt/css/css-paint-api/background-image-tiled.https.html [ Crash ] crbug.com/957457 virtual/threaded/external/wpt/css/css-paint-api/geometry-background-image-tiled-001.https.html [ Crash ] crbug.com/957457 virtual/threaded/external/wpt/css/css-paint-api/invalid-image-pending-script.https.html [ Crash ] -crbug.com/957459 virtual/threaded/external/wpt/css/css-paint-api/paint-arguments.https.html [ Failure ] -crbug.com/957459 virtual/threaded/external/wpt/css/css-paint-api/paint-function-arguments.https.html [ Failure ] crbug.com/957457 virtual/threaded/external/wpt/css/css-paint-api/paint2d-image.https.html [ Failure Timeout ] crbug.com/957459 virtual/threaded/external/wpt/css/css-paint-api/parse-input-arguments-018.https.html [ Crash Failure ] crbug.com/957459 virtual/threaded/external/wpt/css/css-paint-api/registered-property-interpolation-004.https.html [ Failure ]
diff --git a/third_party/blink/web_tests/animations/interpolation/filter-interpolation-004.html b/third_party/blink/web_tests/animations/interpolation/filter-interpolation-004.html new file mode 100644 index 0000000..fb293da --- /dev/null +++ b/third_party/blink/web_tests/animations/interpolation/filter-interpolation-004.html
@@ -0,0 +1,131 @@ +<!DOCTYPE html> +<meta charset="UTF-8"> +<style> +.target { + color: blue; +} +</style> +<body> +<script src="resources/interpolation-test.js"></script> +<script> +assertInterpolation({ + property: 'filter', + from: 'blur()', // Default value when omitted is 0px. + to: 'blur(10px)' +}, [ + {at: -1, is: 'blur(0px)'}, // Negative values are not allowed. + {at: 0, is: 'blur()'}, + {at: 0.5, is: 'blur(5px)'}, + {at: 1, is: 'blur(10px)'}, + {at: 1.5, is: 'blur(15px)'} +]); + +assertInterpolation({ + property: 'filter', + from: 'brightness(0)', + to: 'brightness()' // Default value when omitted is 1. +}, [ + {at: -1, is: 'brightness(0)'}, // Negative values are not allowed. + {at: 0, is: 'brightness(0)'}, + {at: 0.5, is: 'brightness(0.5)'}, + {at: 1, is: 'brightness()'}, + {at: 1.5, is: 'brightness(1.5)'} +]); + +assertInterpolation({ + property: 'filter', + from: 'contrast(0)', + to: 'contrast()' // Default value when omitted is 1. +}, [ + {at: -1, is: 'contrast(0)'}, // Negative values are not allowed. + {at: 0, is: 'contrast(0)'}, + {at: 0.5, is: 'contrast(0.5)'}, + {at: 1, is: 'contrast()'}, + {at: 1.5, is: 'contrast(1.5)'} +]); + +assertInterpolation({ + property: 'filter', + from: 'drop-shadow(0px 0px)', // The default value for omitted values is missing length values set to 0 and the missing used color is taken from the color property. + to: 'drop-shadow(20px 10px 30px green)' +}, [ + {at: -1, is: 'drop-shadow(-20px -10px blue)'}, + {at: 0, is: 'drop-shadow(0px 0px blue)'}, + {at: 0.5, is: 'drop-shadow(10px 5px 15px rgb(0, 64, 128))'}, + {at: 1, is: 'drop-shadow(20px 10px 30px green)'}, + {at: 1.5, is: 'drop-shadow(30px 15px 45px rgb(0, 192, 0))'} +]); + +assertInterpolation({ + property: 'filter', + from: 'grayscale(0)', + to: 'grayscale()' // Default value when omitted is 1. +}, [ + {at: -1, is: 'grayscale(0)'}, // Negative values are not allowed. + {at: 0, is: 'grayscale(0)'}, + {at: 0.5, is: 'grayscale(0.5)'}, + {at: 1, is: 'grayscale()'}, + {at: 1.5, is: 'grayscale(1)'} // Should clamp values to 1. +]); + +assertInterpolation({ + property: 'filter', + from: 'hue-rotate()', // Default value when omitted is 0deg. + to: 'hue-rotate(360deg)' +}, [ + {at: -1, is: 'hue-rotate(-360deg)'}, + {at: 0, is: 'hue-rotate()'}, + {at: 0.5, is: 'hue-rotate(180deg)'}, + {at: 1, is: 'hue-rotate(360deg)'}, + {at: 1.5, is: 'hue-rotate(540deg)'} +]); + +assertInterpolation({ + property: 'filter', + from: 'invert(0)', + to: 'invert()' // Default value when omitted is 1. +}, [ + {at: -1, is: 'invert(0)'}, // Negative values are not allowed. + {at: 0, is: 'invert(0)'}, + {at: 0.5, is: 'invert(0.5)'}, + {at: 1, is: 'invert()'}, + {at: 1.5, is: 'invert(1)'} // Should clamp values to 1. +]); + +assertInterpolation({ + property: 'filter', + from: 'opacity(0)', + to: 'opacity()' // Default value when omitted is 1. +}, [ + {at: -1, is: 'opacity(0)'}, // Negative values are not allowed. + {at: 0, is: 'opacity(0)'}, + {at: 0.5, is: 'opacity(0.5)'}, + {at: 1, is: 'opacity()'}, + {at: 1.5, is: 'opacity(1)'} // Should clamp values to 1. +]); + +assertInterpolation({ + property: 'filter', + from: 'saturate(0)', + to: 'saturate()' // Default value when omitted is 1. +}, [ + {at: -1, is: 'saturate(0)'}, // Negative values are not allowed. + {at: 0, is: 'saturate(0)'}, + {at: 0.5, is: 'saturate(0.5)'}, + {at: 1, is: 'saturate()'}, + {at: 1.5, is: 'saturate(1.5)'} +]); + +assertInterpolation({ + property: 'filter', + from: 'sepia(0)', + to: 'sepia()' // Default value when omitted is 1. +}, [ + {at: -1, is: 'sepia(0)'}, // Negative values are not allowed. + {at: 0, is: 'sepia(0)'}, + {at: 0.5, is: 'sepia(0.5)'}, + {at: 1, is: 'sepia()'}, + {at: 1.5, is: 'sepia(1)'} // Should clamp values to 1. +]); +</script> +</body>
diff --git a/third_party/blink/web_tests/css3/filters/effect-brightness-hw.html b/third_party/blink/web_tests/css3/filters/effect-brightness-hw.html index 839520b..29d55ef 100644 --- a/third_party/blink/web_tests/css3/filters/effect-brightness-hw.html +++ b/third_party/blink/web_tests/css3/filters/effect-brightness-hw.html
@@ -13,7 +13,7 @@ <div><img style="filter: brightness(0)" src="resources/reference_square.png"></div> <div><img style="filter: brightness(0.4)" src="resources/reference_square.png"></div> <div><img style="filter: brightness(0.7)" src="resources/reference_square.png"></div> -<div><img style="filter: brightness()" src="resources/reference_square.png"></div> +<div><img style="filter: brightness(0)" src="resources/reference_square.png"></div> <div><img style="filter: brightness(1.3)" src="resources/reference_square.png"></div> <div><img style="filter: brightness(1.6)" src="resources/reference_square.png"></div> <div><img style="filter: brightness(2)" src="resources/reference_square.png"></div>
diff --git a/third_party/blink/web_tests/css3/filters/effect-brightness.html b/third_party/blink/web_tests/css3/filters/effect-brightness.html index af63a59c..a4753f3 100644 --- a/third_party/blink/web_tests/css3/filters/effect-brightness.html +++ b/third_party/blink/web_tests/css3/filters/effect-brightness.html
@@ -1,7 +1,7 @@ <img style="filter: brightness(-1)" src="resources/reference.png"> <img style="filter: brightness(-0.6)" src="resources/reference.png"> <img style="filter: brightness(-0.3)" src="resources/reference.png"> -<img style="filter: brightness()" src="resources/reference.png"> +<img style="filter: brightness(0)" src="resources/reference.png"> <img style="filter: brightness(0.3)" src="resources/reference.png"> <img style="filter: brightness(0.6)" src="resources/reference.png"> <img style="filter: brightness(1)" src="resources/reference.png">
diff --git a/third_party/blink/web_tests/css3/filters/filter-property-computed-style.html b/third_party/blink/web_tests/css3/filters/filter-property-computed-style.html index 1f7eb352..5580f20 100644 --- a/third_party/blink/web_tests/css3/filters/filter-property-computed-style.html +++ b/third_party/blink/web_tests/css3/filters/filter-property-computed-style.html
@@ -52,7 +52,7 @@ assert_computed_style("filter", "invert(1)"); // Integer value assert_computed_style("filter", "invert(1.0)", "invert(1)"); // Float value converts to integer assert_computed_style("filter", "invert(0)"); // Zero value -assert_computed_style("filter", "invert()", "invert(0)"); // No arguments +assert_computed_style("filter", "invert()", "invert(1)"); // No arguments assert_computed_style("filter", "invert(0.5) invert(0.25)"); // Multiple values assert_computed_style("filter", "opacity(1)"); // Integer value @@ -64,7 +64,7 @@ assert_computed_style("filter", "brightness(1)"); // Integer value assert_computed_style("filter", "brightness(1.0)", "brightness(1)"); // Float value converts to integer assert_computed_style("filter", "brightness(0)"); // Zero value -assert_computed_style("filter", "brightness()", "brightness(0)"); // No arguments +assert_computed_style("filter", "brightness()", "brightness(1)"); // No arguments assert_computed_style("filter", "brightness(0.5) brightness(0.25)"); // Multiple values assert_computed_style("filter", "contrast(1)"); // Integer value
diff --git a/third_party/blink/web_tests/css3/filters/unprefixed.html b/third_party/blink/web_tests/css3/filters/unprefixed.html index 2168566..f3938220 100644 --- a/third_party/blink/web_tests/css3/filters/unprefixed.html +++ b/third_party/blink/web_tests/css3/filters/unprefixed.html
@@ -54,7 +54,7 @@ assert_prefixed_computed_style("filter", "invert(1)"); // Integer value assert_prefixed_computed_style("filter", "invert(1.0)", "invert(1)"); // Float value converts to integer assert_prefixed_computed_style("filter", "invert(0)"); // Zero value -assert_prefixed_computed_style("filter", "invert()", "invert(0)"); // No arguments +assert_prefixed_computed_style("filter", "invert()", "invert(1)"); // No arguments assert_prefixed_computed_style("filter", "invert(0.5) invert(0.25)"); // Multiple values assert_prefixed_computed_style("filter", "opacity(1)"); // Integer value @@ -66,7 +66,7 @@ assert_prefixed_computed_style("filter", "brightness(1)"); // Integer value assert_prefixed_computed_style("filter", "brightness(1.0)", "brightness(1)"); // Float value converts to integer assert_prefixed_computed_style("filter", "brightness(0)"); // Zero value -assert_prefixed_computed_style("filter", "brightness()", "brightness(0)"); // No arguments +assert_prefixed_computed_style("filter", "brightness()", "brightness(1)"); // No arguments assert_prefixed_computed_style("filter", "brightness(0.5) brightness(0.25)"); // Multiple values assert_prefixed_computed_style("filter", "contrast(1)"); // Integer value
diff --git a/third_party/blink/web_tests/external/wpt/2dcontext/drawing-text-to-the-canvas/2d.text.measure.actualBoundingBox.html b/third_party/blink/web_tests/external/wpt/2dcontext/drawing-text-to-the-canvas/2d.text.measure.actualBoundingBox.html index 484af7c2..6ab0c38 100644 --- a/third_party/blink/web_tests/external/wpt/2dcontext/drawing-text-to-the-canvas/2d.text.measure.actualBoundingBox.html +++ b/third_party/blink/web_tests/external/wpt/2dcontext/drawing-text-to-the-canvas/2d.text.measure.actualBoundingBox.html
@@ -27,23 +27,27 @@ _addTest(function(canvas, ctx) { deferTest(); -step_timeout(t.step_func_done(function () { - ctx.font = '50px CanvasTest'; - ctx.direction = 'ltr'; - ctx.align = 'left' - ctx.baseline = 'alphabetic' - // Some platforms may return '-0'. - _assertSame(Math.abs(ctx.measureText('A').actualBoundingBoxLeft), 0, "Math.abs(ctx.measureText('A').actualBoundingBoxLeft)", "0"); - // Different platforms may render text slightly different. - _assert(ctx.measureText('A').actualBoundingBoxRight >= 50, "ctx.measureText('A').actualBoundingBoxRight >= 50"); - _assert(ctx.measureText('A').actualBoundingBoxAscent >= 35, "ctx.measureText('A').actualBoundingBoxAscent >= 35"); - _assertSame(Math.abs(ctx.measureText('A').actualBoundingBoxDescent), 0, "Math.abs(ctx.measureText('A').actualBoundingBoxDescent)", "0"); +var f = new FontFace("CanvasTest", "/fonts/CanvasTest.ttf"); +document.fonts.add(f); +document.fonts.ready.then(() => { + step_timeout(t.step_func_done(function () { + ctx.font = '50px CanvasTest'; + ctx.direction = 'ltr'; + ctx.align = 'left' + ctx.baseline = 'alphabetic' + // Some platforms may return '-0'. + _assertSame(Math.abs(ctx.measureText('A').actualBoundingBoxLeft), 0, "Math.abs(ctx.measureText('A').actualBoundingBoxLeft)", "0"); + // Different platforms may render text slightly different. + _assert(ctx.measureText('A').actualBoundingBoxRight >= 50, "ctx.measureText('A').actualBoundingBoxRight >= 50"); + _assert(ctx.measureText('A').actualBoundingBoxAscent >= 35, "ctx.measureText('A').actualBoundingBoxAscent >= 35"); + _assertSame(Math.abs(ctx.measureText('A').actualBoundingBoxDescent), 0, "Math.abs(ctx.measureText('A').actualBoundingBoxDescent)", "0"); - _assertSame(Math.abs(ctx.measureText('ABCD').actualBoundingBoxLeft), 0, "Math.abs(ctx.measureText('ABCD').actualBoundingBoxLeft)", "0"); - _assert(ctx.measureText('ABCD').actualBoundingBoxRight >= 200, "ctx.measureText('ABCD').actualBoundingBoxRight >= 200"); - _assert(ctx.measureText('ABCD').actualBoundingBoxAscent >= 85, "ctx.measureText('ABCD').actualBoundingBoxAscent >= 85"); - _assert(ctx.measureText('ABCD').actualBoundingBoxDescent >= 37, "ctx.measureText('ABCD').actualBoundingBoxDescent >= 37"); -}), 500); + _assertSame(Math.abs(ctx.measureText('ABCD').actualBoundingBoxLeft), 0, "Math.abs(ctx.measureText('ABCD').actualBoundingBoxLeft)", "0"); + _assert(ctx.measureText('ABCD').actualBoundingBoxRight >= 200, "ctx.measureText('ABCD').actualBoundingBoxRight >= 200"); + _assert(ctx.measureText('ABCD').actualBoundingBoxAscent >= 85, "ctx.measureText('ABCD').actualBoundingBoxAscent >= 85"); + _assert(ctx.measureText('ABCD').actualBoundingBoxDescent >= 37, "ctx.measureText('ABCD').actualBoundingBoxDescent >= 37"); + }), 500); +}); });
diff --git a/third_party/blink/web_tests/external/wpt/2dcontext/drawing-text-to-the-canvas/2d.text.measure.advances.html b/third_party/blink/web_tests/external/wpt/2dcontext/drawing-text-to-the-canvas/2d.text.measure.advances.html index ed8c04d..1830d1de 100644 --- a/third_party/blink/web_tests/external/wpt/2dcontext/drawing-text-to-the-canvas/2d.text.measure.advances.html +++ b/third_party/blink/web_tests/external/wpt/2dcontext/drawing-text-to-the-canvas/2d.text.measure.advances.html
@@ -27,25 +27,29 @@ _addTest(function(canvas, ctx) { deferTest(); -step_timeout(t.step_func_done(function () { - ctx.font = '50px CanvasTest'; - ctx.direction = 'ltr'; - ctx.align = 'left' - // Some platforms may return '-0'. - _assertSame(Math.abs(ctx.measureText('Hello').advances[0]), 0, "Math.abs(ctx.measureText('Hello').advances[\""+(0)+"\"])", "0"); - // Different platforms may render text slightly different. - _assert(ctx.measureText('Hello').advances[1] >= 36, "ctx.measureText('Hello').advances[\""+(1)+"\"] >= 36"); - _assert(ctx.measureText('Hello').advances[2] >= 58, "ctx.measureText('Hello').advances[\""+(2)+"\"] >= 58"); - _assert(ctx.measureText('Hello').advances[3] >= 70, "ctx.measureText('Hello').advances[\""+(3)+"\"] >= 70"); - _assert(ctx.measureText('Hello').advances[4] >= 80, "ctx.measureText('Hello').advances[\""+(4)+"\"] >= 80"); +var f = new FontFace("CanvasTest", "/fonts/CanvasTest.ttf"); +document.fonts.add(f); +document.fonts.ready.then(() => { + step_timeout(t.step_func_done(function () { + ctx.font = '50px CanvasTest'; + ctx.direction = 'ltr'; + ctx.align = 'left' + // Some platforms may return '-0'. + _assertSame(Math.abs(ctx.measureText('Hello').advances[0]), 0, "Math.abs(ctx.measureText('Hello').advances[\""+(0)+"\"])", "0"); + // Different platforms may render text slightly different. + _assert(ctx.measureText('Hello').advances[1] >= 36, "ctx.measureText('Hello').advances[\""+(1)+"\"] >= 36"); + _assert(ctx.measureText('Hello').advances[2] >= 58, "ctx.measureText('Hello').advances[\""+(2)+"\"] >= 58"); + _assert(ctx.measureText('Hello').advances[3] >= 70, "ctx.measureText('Hello').advances[\""+(3)+"\"] >= 70"); + _assert(ctx.measureText('Hello').advances[4] >= 80, "ctx.measureText('Hello').advances[\""+(4)+"\"] >= 80"); - var tm = ctx.measureText('Hello'); - _assertSame(ctx.measureText('Hello').advances[0], tm.advances[0], "ctx.measureText('Hello').advances[\""+(0)+"\"]", "tm.advances[\""+(0)+"\"]"); - _assertSame(ctx.measureText('Hello').advances[1], tm.advances[1], "ctx.measureText('Hello').advances[\""+(1)+"\"]", "tm.advances[\""+(1)+"\"]"); - _assertSame(ctx.measureText('Hello').advances[2], tm.advances[2], "ctx.measureText('Hello').advances[\""+(2)+"\"]", "tm.advances[\""+(2)+"\"]"); - _assertSame(ctx.measureText('Hello').advances[3], tm.advances[3], "ctx.measureText('Hello').advances[\""+(3)+"\"]", "tm.advances[\""+(3)+"\"]"); - _assertSame(ctx.measureText('Hello').advances[4], tm.advances[4], "ctx.measureText('Hello').advances[\""+(4)+"\"]", "tm.advances[\""+(4)+"\"]"); -}), 500); + var tm = ctx.measureText('Hello'); + _assertSame(ctx.measureText('Hello').advances[0], tm.advances[0], "ctx.measureText('Hello').advances[\""+(0)+"\"]", "tm.advances[\""+(0)+"\"]"); + _assertSame(ctx.measureText('Hello').advances[1], tm.advances[1], "ctx.measureText('Hello').advances[\""+(1)+"\"]", "tm.advances[\""+(1)+"\"]"); + _assertSame(ctx.measureText('Hello').advances[2], tm.advances[2], "ctx.measureText('Hello').advances[\""+(2)+"\"]", "tm.advances[\""+(2)+"\"]"); + _assertSame(ctx.measureText('Hello').advances[3], tm.advances[3], "ctx.measureText('Hello').advances[\""+(3)+"\"]", "tm.advances[\""+(3)+"\"]"); + _assertSame(ctx.measureText('Hello').advances[4], tm.advances[4], "ctx.measureText('Hello').advances[\""+(4)+"\"]", "tm.advances[\""+(4)+"\"]"); + }), 500); +}); });
diff --git a/third_party/blink/web_tests/external/wpt/2dcontext/drawing-text-to-the-canvas/2d.text.measure.baselines.html b/third_party/blink/web_tests/external/wpt/2dcontext/drawing-text-to-the-canvas/2d.text.measure.baselines.html index 2472889..c3e5f6a 100644 --- a/third_party/blink/web_tests/external/wpt/2dcontext/drawing-text-to-the-canvas/2d.text.measure.baselines.html +++ b/third_party/blink/web_tests/external/wpt/2dcontext/drawing-text-to-the-canvas/2d.text.measure.baselines.html
@@ -27,18 +27,22 @@ _addTest(function(canvas, ctx) { deferTest(); -step_timeout(t.step_func_done(function () { - ctx.font = '50px CanvasTest'; - ctx.direction = 'ltr'; - ctx.align = 'left' - _assertSame(Math.abs(ctx.measureText('A').getBaselines().alphabetic), 0, "Math.abs(ctx.measureText('A').getBaselines().alphabetic)", "0"); - _assertSame(ctx.measureText('A').getBaselines().ideographic, -39, "ctx.measureText('A').getBaselines().ideographic", "-39"); - _assertSame(ctx.measureText('A').getBaselines().hanging, 68, "ctx.measureText('A').getBaselines().hanging", "68"); +var f = new FontFace("CanvasTest", "/fonts/CanvasTest.ttf"); +document.fonts.add(f); +document.fonts.ready.then(() => { + step_timeout(t.step_func_done(function () { + ctx.font = '50px CanvasTest'; + ctx.direction = 'ltr'; + ctx.align = 'left' + _assertSame(Math.abs(ctx.measureText('A').getBaselines().alphabetic), 0, "Math.abs(ctx.measureText('A').getBaselines().alphabetic)", "0"); + _assertSame(ctx.measureText('A').getBaselines().ideographic, -39, "ctx.measureText('A').getBaselines().ideographic", "-39"); + _assertSame(ctx.measureText('A').getBaselines().hanging, 68, "ctx.measureText('A').getBaselines().hanging", "68"); - _assertSame(Math.abs(ctx.measureText('ABCD').getBaselines().alphabetic), 0, "Math.abs(ctx.measureText('ABCD').getBaselines().alphabetic)", "0"); - _assertSame(ctx.measureText('ABCD').getBaselines().ideographic, -39, "ctx.measureText('ABCD').getBaselines().ideographic", "-39"); - _assertSame(ctx.measureText('ABCD').getBaselines().hanging, 68, "ctx.measureText('ABCD').getBaselines().hanging", "68"); -}), 500); + _assertSame(Math.abs(ctx.measureText('ABCD').getBaselines().alphabetic), 0, "Math.abs(ctx.measureText('ABCD').getBaselines().alphabetic)", "0"); + _assertSame(ctx.measureText('ABCD').getBaselines().ideographic, -39, "ctx.measureText('ABCD').getBaselines().ideographic", "-39"); + _assertSame(ctx.measureText('ABCD').getBaselines().hanging, 68, "ctx.measureText('ABCD').getBaselines().hanging", "68"); + }), 500); +}); });
diff --git a/third_party/blink/web_tests/external/wpt/2dcontext/drawing-text-to-the-canvas/2d.text.measure.emHeights.html b/third_party/blink/web_tests/external/wpt/2dcontext/drawing-text-to-the-canvas/2d.text.measure.emHeights.html index 36087e7..6c7d5373 100644 --- a/third_party/blink/web_tests/external/wpt/2dcontext/drawing-text-to-the-canvas/2d.text.measure.emHeights.html +++ b/third_party/blink/web_tests/external/wpt/2dcontext/drawing-text-to-the-canvas/2d.text.measure.emHeights.html
@@ -27,18 +27,22 @@ _addTest(function(canvas, ctx) { deferTest(); -step_timeout(t.step_func_done(function () { - ctx.font = '50px CanvasTest'; - ctx.direction = 'ltr'; - ctx.align = 'left' - _assertSame(ctx.measureText('A').emHeightAscent, 37.5, "ctx.measureText('A').emHeightAscent", "37.5"); - _assertSame(ctx.measureText('A').emHeightDescent, 12.5, "ctx.measureText('A').emHeightDescent", "12.5"); - _assertSame(ctx.measureText('A').emHeightDescent + ctx.measureText('A').emHeightAscent, 50, "ctx.measureText('A').emHeightDescent + ctx.measureText('A').emHeightAscent", "50"); +var f = new FontFace("CanvasTest", "/fonts/CanvasTest.ttf"); +document.fonts.add(f); +document.fonts.ready.then(() => { + step_timeout(t.step_func_done(function () { + ctx.font = '50px CanvasTest'; + ctx.direction = 'ltr'; + ctx.align = 'left' + _assertSame(ctx.measureText('A').emHeightAscent, 37.5, "ctx.measureText('A').emHeightAscent", "37.5"); + _assertSame(ctx.measureText('A').emHeightDescent, 12.5, "ctx.measureText('A').emHeightDescent", "12.5"); + _assertSame(ctx.measureText('A').emHeightDescent + ctx.measureText('A').emHeightAscent, 50, "ctx.measureText('A').emHeightDescent + ctx.measureText('A').emHeightAscent", "50"); - _assertSame(ctx.measureText('ABCD').emHeightAscent, 37.5, "ctx.measureText('ABCD').emHeightAscent", "37.5"); - _assertSame(ctx.measureText('ABCD').emHeightDescent, 12.5, "ctx.measureText('ABCD').emHeightDescent", "12.5"); - _assertSame(ctx.measureText('ABCD').emHeightDescent + ctx.measureText('ABCD').emHeightAscent, 50, "ctx.measureText('ABCD').emHeightDescent + ctx.measureText('ABCD').emHeightAscent", "50"); -}), 500); + _assertSame(ctx.measureText('ABCD').emHeightAscent, 37.5, "ctx.measureText('ABCD').emHeightAscent", "37.5"); + _assertSame(ctx.measureText('ABCD').emHeightDescent, 12.5, "ctx.measureText('ABCD').emHeightDescent", "12.5"); + _assertSame(ctx.measureText('ABCD').emHeightDescent + ctx.measureText('ABCD').emHeightAscent, 50, "ctx.measureText('ABCD').emHeightDescent + ctx.measureText('ABCD').emHeightAscent", "50"); + }), 500); +}); });
diff --git a/third_party/blink/web_tests/external/wpt/2dcontext/drawing-text-to-the-canvas/2d.text.measure.fontBoundingBox.html b/third_party/blink/web_tests/external/wpt/2dcontext/drawing-text-to-the-canvas/2d.text.measure.fontBoundingBox.html index 1c9bfc49..cbe98ba 100644 --- a/third_party/blink/web_tests/external/wpt/2dcontext/drawing-text-to-the-canvas/2d.text.measure.fontBoundingBox.html +++ b/third_party/blink/web_tests/external/wpt/2dcontext/drawing-text-to-the-canvas/2d.text.measure.fontBoundingBox.html
@@ -27,16 +27,20 @@ _addTest(function(canvas, ctx) { deferTest(); -step_timeout(t.step_func_done(function () { - ctx.font = '50px CanvasTest'; - ctx.direction = 'ltr'; - ctx.align = 'left' - _assertSame(ctx.measureText('A').fontBoundingBoxAscent, 85, "ctx.measureText('A').fontBoundingBoxAscent", "85"); - _assertSame(ctx.measureText('A').fontBoundingBoxDescent, 39, "ctx.measureText('A').fontBoundingBoxDescent", "39"); +var f = new FontFace("CanvasTest", "/fonts/CanvasTest.ttf"); +document.fonts.add(f); +document.fonts.ready.then(() => { + step_timeout(t.step_func_done(function () { + ctx.font = '50px CanvasTest'; + ctx.direction = 'ltr'; + ctx.align = 'left' + _assertSame(ctx.measureText('A').fontBoundingBoxAscent, 85, "ctx.measureText('A').fontBoundingBoxAscent", "85"); + _assertSame(ctx.measureText('A').fontBoundingBoxDescent, 39, "ctx.measureText('A').fontBoundingBoxDescent", "39"); - _assertSame(ctx.measureText('ABCD').fontBoundingBoxAscent, 85, "ctx.measureText('ABCD').fontBoundingBoxAscent", "85"); - _assertSame(ctx.measureText('ABCD').fontBoundingBoxDescent, 39, "ctx.measureText('ABCD').fontBoundingBoxDescent", "39"); -}), 500); + _assertSame(ctx.measureText('ABCD').fontBoundingBoxAscent, 85, "ctx.measureText('ABCD').fontBoundingBoxAscent", "85"); + _assertSame(ctx.measureText('ABCD').fontBoundingBoxDescent, 39, "ctx.measureText('ABCD').fontBoundingBoxDescent", "39"); + }), 500); +}); });
diff --git a/third_party/blink/web_tests/external/wpt/2dcontext/drawing-text-to-the-canvas/2d.text.measure.width.basic.html b/third_party/blink/web_tests/external/wpt/2dcontext/drawing-text-to-the-canvas/2d.text.measure.width.basic.html index 1cfe164..5a5a57ad 100644 --- a/third_party/blink/web_tests/external/wpt/2dcontext/drawing-text-to-the-canvas/2d.text.measure.width.basic.html +++ b/third_party/blink/web_tests/external/wpt/2dcontext/drawing-text-to-the-canvas/2d.text.measure.width.basic.html
@@ -14,7 +14,7 @@ <body class="show_output"> <h1>2d.text.measure.width.basic</h1> -<p class="desc"></p> +<p class="desc">The width of character is same as font used</p> <span style="font-family: CanvasTest; position: absolute; visibility: hidden">A</span> @@ -23,19 +23,23 @@ <ul id="d"></ul> <script> -var t = async_test(""); +var t = async_test("The width of character is same as font used"); _addTest(function(canvas, ctx) { deferTest(); -step_timeout(t.step_func_done(function () { - ctx.font = '50px CanvasTest'; - _assertSame(ctx.measureText('A').width, 50, "ctx.measureText('A').width", "50"); - _assertSame(ctx.measureText('AA').width, 100, "ctx.measureText('AA').width", "100"); - _assertSame(ctx.measureText('ABCD').width, 200, "ctx.measureText('ABCD').width", "200"); +var f = new FontFace("CanvasTest", "/fonts/CanvasTest.ttf"); +document.fonts.add(f); +document.fonts.ready.then(() => { + step_timeout(t.step_func_done(function () { + ctx.font = '50px CanvasTest'; + _assertSame(ctx.measureText('A').width, 50, "ctx.measureText('A').width", "50"); + _assertSame(ctx.measureText('AA').width, 100, "ctx.measureText('AA').width", "100"); + _assertSame(ctx.measureText('ABCD').width, 200, "ctx.measureText('ABCD').width", "200"); - ctx.font = '100px CanvasTest'; - _assertSame(ctx.measureText('A').width, 100, "ctx.measureText('A').width", "100"); -}), 500); + ctx.font = '100px CanvasTest'; + _assertSame(ctx.measureText('A').width, 100, "ctx.measureText('A').width", "100"); + }), 500); +}); });
diff --git a/third_party/blink/web_tests/external/wpt/2dcontext/drawing-text-to-the-canvas/2d.text.measure.width.empty.html b/third_party/blink/web_tests/external/wpt/2dcontext/drawing-text-to-the-canvas/2d.text.measure.width.empty.html index add8ce5b..70f0f07a 100644 --- a/third_party/blink/web_tests/external/wpt/2dcontext/drawing-text-to-the-canvas/2d.text.measure.width.empty.html +++ b/third_party/blink/web_tests/external/wpt/2dcontext/drawing-text-to-the-canvas/2d.text.measure.width.empty.html
@@ -27,10 +27,14 @@ _addTest(function(canvas, ctx) { deferTest(); -step_timeout(t.step_func_done(function () { - ctx.font = '50px CanvasTest'; - _assertSame(ctx.measureText("").width, 0, "ctx.measureText(\"\").width", "0"); -}), 500); +var f = new FontFace("CanvasTest", "/fonts/CanvasTest.ttf"); +document.fonts.add(f); +document.fonts.ready.then(() => { + step_timeout(t.step_func_done(function () { + ctx.font = '50px CanvasTest'; + _assertSame(ctx.measureText("").width, 0, "ctx.measureText(\"\").width", "0"); + }), 500); +}); });
diff --git a/third_party/blink/web_tests/external/wpt/2dcontext/text-styles/2d.text.measure.width.space.html b/third_party/blink/web_tests/external/wpt/2dcontext/text-styles/2d.text.measure.width.space.html index d6e37a1..82a6118 100644 --- a/third_party/blink/web_tests/external/wpt/2dcontext/text-styles/2d.text.measure.width.space.html +++ b/third_party/blink/web_tests/external/wpt/2dcontext/text-styles/2d.text.measure.width.space.html
@@ -27,16 +27,20 @@ _addTest(function(canvas, ctx) { deferTest(); -step_timeout(t.step_func_done(function () { - ctx.font = '50px CanvasTest'; - _assertSame(ctx.measureText('A B').width, 150, "ctx.measureText('A B').width", "150"); - _assertSame(ctx.measureText('A B').width, 150, "ctx.measureText('A B').width", "150"); - _assertSame(ctx.measureText('A \x09\x0a\x0c\x0d \x09\x0a\x0c\x0dB').width, 150, "ctx.measureText('A \\x09\\x0a\\x0c\\x0d \\x09\\x0a\\x0c\\x0dB').width", "150"); - _assert(ctx.measureText('A \x0b B').width >= 200, "ctx.measureText('A \\x0b B').width >= 200"); +var f = new FontFace("CanvasTest", "/fonts/CanvasTest.ttf"); +document.fonts.add(f); +document.fonts.ready.then(() => { + step_timeout(t.step_func_done(function () { + ctx.font = '50px CanvasTest'; + _assertSame(ctx.measureText('A B').width, 150, "ctx.measureText('A B').width", "150"); + _assertSame(ctx.measureText('A B').width, 150, "ctx.measureText('A B').width", "150"); + _assertSame(ctx.measureText('A \x09\x0a\x0c\x0d \x09\x0a\x0c\x0dB').width, 150, "ctx.measureText('A \\x09\\x0a\\x0c\\x0d \\x09\\x0a\\x0c\\x0dB').width", "150"); + _assert(ctx.measureText('A \x0b B').width >= 200, "ctx.measureText('A \\x0b B').width >= 200"); - _assertSame(ctx.measureText(' AB').width, 100, "ctx.measureText(' AB').width", "100"); - _assertSame(ctx.measureText('AB ').width, 100, "ctx.measureText('AB ').width", "100"); -}), 500); + _assertSame(ctx.measureText(' AB').width, 100, "ctx.measureText(' AB').width", "100"); + _assertSame(ctx.measureText('AB ').width, 100, "ctx.measureText('AB ').width", "100"); + }), 500); +}); });
diff --git a/third_party/blink/web_tests/external/wpt/2dcontext/tools/tests2dtext.yaml b/third_party/blink/web_tests/external/wpt/2dcontext/tools/tests2dtext.yaml index f89d6d48..0ee476d7 100644 --- a/third_party/blink/web_tests/external/wpt/2dcontext/tools/tests2dtext.yaml +++ b/third_party/blink/web_tests/external/wpt/2dcontext/tools/tests2dtext.yaml
@@ -967,24 +967,27 @@ expected: green - - - name: 2d.text.measure.width.basic + desc: The width of character is same as font used testing: - 2d.text.measure fonts: - CanvasTest code: | deferTest(); - step_timeout(t.step_func_done(function () { - ctx.font = '50px CanvasTest'; - @assert ctx.measureText('A').width === 50; - @assert ctx.measureText('AA').width === 100; - @assert ctx.measureText('ABCD').width === 200; + var f = new FontFace("CanvasTest", "/fonts/CanvasTest.ttf"); + document.fonts.add(f); + document.fonts.ready.then(() => { + step_timeout(t.step_func_done(function () { + ctx.font = '50px CanvasTest'; + @assert ctx.measureText('A').width === 50; + @assert ctx.measureText('AA').width === 100; + @assert ctx.measureText('ABCD').width === 200; - ctx.font = '100px CanvasTest'; - @assert ctx.measureText('A').width === 100; - }), 500); + ctx.font = '100px CanvasTest'; + @assert ctx.measureText('A').width === 100; + }), 500); + }); - name: 2d.text.measure.width.empty desc: The empty string has zero width @@ -994,10 +997,14 @@ - CanvasTest code: | deferTest(); - step_timeout(t.step_func_done(function () { - ctx.font = '50px CanvasTest'; - @assert ctx.measureText("").width === 0; - }), 500); + var f = new FontFace("CanvasTest", "/fonts/CanvasTest.ttf"); + document.fonts.add(f); + document.fonts.ready.then(() => { + step_timeout(t.step_func_done(function () { + ctx.font = '50px CanvasTest'; + @assert ctx.measureText("").width === 0; + }), 500); + }); - name: 2d.text.measure.width.space desc: Space characters are converted to U+0020 and collapsed (per CSS) @@ -1007,16 +1014,20 @@ - CanvasTest code: | deferTest(); - step_timeout(t.step_func_done(function () { - ctx.font = '50px CanvasTest'; - @assert ctx.measureText('A B').width === 150; - @assert ctx.measureText('A B').width === 150; @moz-todo - @assert ctx.measureText('A \x09\x0a\x0c\x0d \x09\x0a\x0c\x0dB').width === 150; @moz-todo - @assert ctx.measureText('A \x0b B').width >= 200; + var f = new FontFace("CanvasTest", "/fonts/CanvasTest.ttf"); + document.fonts.add(f); + document.fonts.ready.then(() => { + step_timeout(t.step_func_done(function () { + ctx.font = '50px CanvasTest'; + @assert ctx.measureText('A B').width === 150; + @assert ctx.measureText('A B').width === 150; @moz-todo + @assert ctx.measureText('A \x09\x0a\x0c\x0d \x09\x0a\x0c\x0dB').width === 150; @moz-todo + @assert ctx.measureText('A \x0b B').width >= 200; - @assert ctx.measureText(' AB').width === 100; @moz-todo - @assert ctx.measureText('AB ').width === 100; @moz-todo - }), 500); + @assert ctx.measureText(' AB').width === 100; @moz-todo + @assert ctx.measureText('AB ').width === 100; @moz-todo + }), 500); + }); - name: 2d.text.measure.advances desc: Testing width advances @@ -1026,25 +1037,29 @@ - CanvasTest code: | deferTest(); - step_timeout(t.step_func_done(function () { - ctx.font = '50px CanvasTest'; - ctx.direction = 'ltr'; - ctx.align = 'left' - // Some platforms may return '-0'. - @assert Math.abs(ctx.measureText('Hello').advances[0]) === 0; - // Different platforms may render text slightly different. - @assert ctx.measureText('Hello').advances[1] >= 36; - @assert ctx.measureText('Hello').advances[2] >= 58; - @assert ctx.measureText('Hello').advances[3] >= 70; - @assert ctx.measureText('Hello').advances[4] >= 80; + var f = new FontFace("CanvasTest", "/fonts/CanvasTest.ttf"); + document.fonts.add(f); + document.fonts.ready.then(() => { + step_timeout(t.step_func_done(function () { + ctx.font = '50px CanvasTest'; + ctx.direction = 'ltr'; + ctx.align = 'left' + // Some platforms may return '-0'. + @assert Math.abs(ctx.measureText('Hello').advances[0]) === 0; + // Different platforms may render text slightly different. + @assert ctx.measureText('Hello').advances[1] >= 36; + @assert ctx.measureText('Hello').advances[2] >= 58; + @assert ctx.measureText('Hello').advances[3] >= 70; + @assert ctx.measureText('Hello').advances[4] >= 80; - var tm = ctx.measureText('Hello'); - @assert ctx.measureText('Hello').advances[0] === tm.advances[0]; - @assert ctx.measureText('Hello').advances[1] === tm.advances[1]; - @assert ctx.measureText('Hello').advances[2] === tm.advances[2]; - @assert ctx.measureText('Hello').advances[3] === tm.advances[3]; - @assert ctx.measureText('Hello').advances[4] === tm.advances[4]; - }), 500); + var tm = ctx.measureText('Hello'); + @assert ctx.measureText('Hello').advances[0] === tm.advances[0]; + @assert ctx.measureText('Hello').advances[1] === tm.advances[1]; + @assert ctx.measureText('Hello').advances[2] === tm.advances[2]; + @assert ctx.measureText('Hello').advances[3] === tm.advances[3]; + @assert ctx.measureText('Hello').advances[4] === tm.advances[4]; + }), 500); + }); - name: 2d.text.measure.actualBoundingBox desc: Testing actualBoundingBox @@ -1054,23 +1069,27 @@ - CanvasTest code: | deferTest(); - step_timeout(t.step_func_done(function () { - ctx.font = '50px CanvasTest'; - ctx.direction = 'ltr'; - ctx.align = 'left' - ctx.baseline = 'alphabetic' - // Some platforms may return '-0'. - @assert Math.abs(ctx.measureText('A').actualBoundingBoxLeft) === 0; - // Different platforms may render text slightly different. - @assert ctx.measureText('A').actualBoundingBoxRight >= 50; - @assert ctx.measureText('A').actualBoundingBoxAscent >= 35; - @assert Math.abs(ctx.measureText('A').actualBoundingBoxDescent) === 0; + var f = new FontFace("CanvasTest", "/fonts/CanvasTest.ttf"); + document.fonts.add(f); + document.fonts.ready.then(() => { + step_timeout(t.step_func_done(function () { + ctx.font = '50px CanvasTest'; + ctx.direction = 'ltr'; + ctx.align = 'left' + ctx.baseline = 'alphabetic' + // Some platforms may return '-0'. + @assert Math.abs(ctx.measureText('A').actualBoundingBoxLeft) === 0; + // Different platforms may render text slightly different. + @assert ctx.measureText('A').actualBoundingBoxRight >= 50; + @assert ctx.measureText('A').actualBoundingBoxAscent >= 35; + @assert Math.abs(ctx.measureText('A').actualBoundingBoxDescent) === 0; - @assert Math.abs(ctx.measureText('ABCD').actualBoundingBoxLeft) === 0; - @assert ctx.measureText('ABCD').actualBoundingBoxRight >= 200; - @assert ctx.measureText('ABCD').actualBoundingBoxAscent >= 85; - @assert ctx.measureText('ABCD').actualBoundingBoxDescent >= 37; - }), 500); + @assert Math.abs(ctx.measureText('ABCD').actualBoundingBoxLeft) === 0; + @assert ctx.measureText('ABCD').actualBoundingBoxRight >= 200; + @assert ctx.measureText('ABCD').actualBoundingBoxAscent >= 85; + @assert ctx.measureText('ABCD').actualBoundingBoxDescent >= 37; + }), 500); + }); - name: 2d.text.measure.fontBoundingBox desc: Testing fontBoundingBox @@ -1080,16 +1099,20 @@ - CanvasTest code: | deferTest(); - step_timeout(t.step_func_done(function () { - ctx.font = '50px CanvasTest'; - ctx.direction = 'ltr'; - ctx.align = 'left' - @assert ctx.measureText('A').fontBoundingBoxAscent === 85; - @assert ctx.measureText('A').fontBoundingBoxDescent === 39; + var f = new FontFace("CanvasTest", "/fonts/CanvasTest.ttf"); + document.fonts.add(f); + document.fonts.ready.then(() => { + step_timeout(t.step_func_done(function () { + ctx.font = '50px CanvasTest'; + ctx.direction = 'ltr'; + ctx.align = 'left' + @assert ctx.measureText('A').fontBoundingBoxAscent === 85; + @assert ctx.measureText('A').fontBoundingBoxDescent === 39; - @assert ctx.measureText('ABCD').fontBoundingBoxAscent === 85; - @assert ctx.measureText('ABCD').fontBoundingBoxDescent === 39; - }), 500); + @assert ctx.measureText('ABCD').fontBoundingBoxAscent === 85; + @assert ctx.measureText('ABCD').fontBoundingBoxDescent === 39; + }), 500); + }); - name: 2d.text.measure.emHeights desc: Testing emHeights @@ -1099,18 +1122,22 @@ - CanvasTest code: | deferTest(); - step_timeout(t.step_func_done(function () { - ctx.font = '50px CanvasTest'; - ctx.direction = 'ltr'; - ctx.align = 'left' - @assert ctx.measureText('A').emHeightAscent === 37.5; - @assert ctx.measureText('A').emHeightDescent === 12.5; - @assert ctx.measureText('A').emHeightDescent + ctx.measureText('A').emHeightAscent === 50; + var f = new FontFace("CanvasTest", "/fonts/CanvasTest.ttf"); + document.fonts.add(f); + document.fonts.ready.then(() => { + step_timeout(t.step_func_done(function () { + ctx.font = '50px CanvasTest'; + ctx.direction = 'ltr'; + ctx.align = 'left' + @assert ctx.measureText('A').emHeightAscent === 37.5; + @assert ctx.measureText('A').emHeightDescent === 12.5; + @assert ctx.measureText('A').emHeightDescent + ctx.measureText('A').emHeightAscent === 50; - @assert ctx.measureText('ABCD').emHeightAscent === 37.5; - @assert ctx.measureText('ABCD').emHeightDescent === 12.5; - @assert ctx.measureText('ABCD').emHeightDescent + ctx.measureText('ABCD').emHeightAscent === 50; - }), 500); + @assert ctx.measureText('ABCD').emHeightAscent === 37.5; + @assert ctx.measureText('ABCD').emHeightDescent === 12.5; + @assert ctx.measureText('ABCD').emHeightDescent + ctx.measureText('ABCD').emHeightAscent === 50; + }), 500); + }); - name: 2d.text.measure.baselines desc: Testing baselines @@ -1120,17 +1147,21 @@ - CanvasTest code: | deferTest(); - step_timeout(t.step_func_done(function () { - ctx.font = '50px CanvasTest'; - ctx.direction = 'ltr'; - ctx.align = 'left' - @assert Math.abs(ctx.measureText('A').getBaselines().alphabetic) === 0; - @assert ctx.measureText('A').getBaselines().ideographic === -39; - @assert ctx.measureText('A').getBaselines().hanging === 68; + var f = new FontFace("CanvasTest", "/fonts/CanvasTest.ttf"); + document.fonts.add(f); + document.fonts.ready.then(() => { + step_timeout(t.step_func_done(function () { + ctx.font = '50px CanvasTest'; + ctx.direction = 'ltr'; + ctx.align = 'left' + @assert Math.abs(ctx.measureText('A').getBaselines().alphabetic) === 0; + @assert ctx.measureText('A').getBaselines().ideographic === -39; + @assert ctx.measureText('A').getBaselines().hanging === 68; - @assert Math.abs(ctx.measureText('ABCD').getBaselines().alphabetic) === 0; - @assert ctx.measureText('ABCD').getBaselines().ideographic === -39; - @assert ctx.measureText('ABCD').getBaselines().hanging === 68; - }), 500); + @assert Math.abs(ctx.measureText('ABCD').getBaselines().alphabetic) === 0; + @assert ctx.measureText('ABCD').getBaselines().ideographic === -39; + @assert ctx.measureText('ABCD').getBaselines().hanging === 68; + }), 500); + }); # TODO: shadows, alpha, composite, clip
diff --git a/third_party/blink/web_tests/external/wpt/css/css-break/floats-and-text-narrow-and-short-dynamic-ref.html b/third_party/blink/web_tests/external/wpt/css/css-break/floats-and-text-narrow-and-short-dynamic-ref.html new file mode 100644 index 0000000..51855d2 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-break/floats-and-text-narrow-and-short-dynamic-ref.html
@@ -0,0 +1,19 @@ +<!DOCTYPE html> +<style> + .float { + float: left; + width: 2em; + height: 2em; + } + .yellow { + background: yellow; + } + .blue { + background: blue; + } +</style> +<p>Below there should be two yellow and two blue squares.</p> +<div class="float yellow"></div> +<div class="float blue"></div> +<div class="float yellow"></div> +<div class="float blue"></div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-break/floats-and-text-narrow-and-short-dynamic.html b/third_party/blink/web_tests/external/wpt/css/css-break/floats-and-text-narrow-and-short-dynamic.html new file mode 100644 index 0000000..09e5021 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-break/floats-and-text-narrow-and-short-dynamic.html
@@ -0,0 +1,36 @@ +<!DOCTYPE html> +<link rel="author" title="Morten Stenshorne" href="mailto:mstensho@chromium.org"> +<link rel="help" href="https://www.w3.org/TR/css-break-3/#parallel-flows"> +<link rel="help" href="https://bugs.chromium.org/p/chromium/issues/detail?id=961516"> +<link rel="match" href="floats-and-text-narrow-and-short-dynamic-ref.html"> +<style> + #container { + columns: 4; + height: 2em; + column-fill: auto; + column-gap: 0; + line-height: 2em; + background: yellow; + } + + .float { + float: left; + width: 2em; + height: 2em; + break-inside: avoid; + background: blue; + } +</style> +<p>Below there should be two yellow and two blue squares.</p> +<div id="container"> + <div style="width:1em;"> + <div style="height:1em;"></div> + <div class="float"></div> + + <div class="float"></div> + </div> +</div> +<script> + document.body.offsetTop; + container.style.width = "8em"; +</script>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-grid/animation/grid-template-columns-interpolation.html b/third_party/blink/web_tests/external/wpt/css/css-grid/animation/grid-template-columns-interpolation.html index 4adba6d..e42a424 100644 --- a/third_party/blink/web_tests/external/wpt/css/css-grid/animation/grid-template-columns-interpolation.html +++ b/third_party/blink/web_tests/external/wpt/css/css-grid/animation/grid-template-columns-interpolation.html
@@ -7,7 +7,7 @@ <meta name="assert" content="grid-template-columns supports animation."> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> - <script src="resources/interpolation-testcommon.js"></script> + <script src="/css/support/interpolation-testcommon.js"></script> </head> <body> <script>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-grid/animation/grid-template-rows-interpolation.html b/third_party/blink/web_tests/external/wpt/css/css-grid/animation/grid-template-rows-interpolation.html index 42152bc..3c650395 100644 --- a/third_party/blink/web_tests/external/wpt/css/css-grid/animation/grid-template-rows-interpolation.html +++ b/third_party/blink/web_tests/external/wpt/css/css-grid/animation/grid-template-rows-interpolation.html
@@ -7,7 +7,7 @@ <meta name="assert" content="grid-template-rows supports animation."> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> - <script src="resources/interpolation-testcommon.js"></script> + <script src="/css/support/interpolation-testcommon.js"></script> </head> <body> <script>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-position/position-absolute-crash-chrome-008.html b/third_party/blink/web_tests/external/wpt/css/css-position/position-absolute-crash-chrome-008.html new file mode 100644 index 0000000..3d1c909 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-position/position-absolute-crash-chrome-008.html
@@ -0,0 +1,17 @@ +<!DOCTYPE html> +<link rel="author" href="mailto:atotic@chromium.org"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<link rel="help" href="https://crbug.com/967977"> +<meta name="assert" content="zero width inline abspos container with borders does not cause a crash"> +<style> +</style> +<span style="border-bottom:1px solid; filter:blur(2px);"> + <div style="position:absolute"></div> +</span> +<script> +document.body.offsetTop; + test(() => { + }, 'test passes if it does not crash'); +</script> +
diff --git a/third_party/blink/web_tests/external/wpt/css/filter-effects/animation/filter-interpolation-001.html b/third_party/blink/web_tests/external/wpt/css/filter-effects/animation/filter-interpolation-001.html new file mode 100644 index 0000000..b4a4b3f --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/filter-effects/animation/filter-interpolation-001.html
@@ -0,0 +1,49 @@ +<!DOCTYPE html> +<html> + <head> + <meta charset="utf-8"> + <title>filter interpolation</title> + <link rel="help" href="https://drafts.fxtf.org/filter-effects/#FilterProperty"> + <meta name="assert" content="Matching lists interpolate."> + <script src="/resources/testharness.js"></script> + <script src="/resources/testharnessreport.js"></script> + <script src="/css/support/interpolation-testcommon.js"></script> + <style> + body { + color: blue; + } + </style> + </head> + <body> + <script> + 'use strict'; + + test_interpolation({ + property: 'filter', + from: 'hue-rotate(0deg) blur(6px)', + to: 'hue-rotate(180deg) blur(10px)' + }, [ + {at: -0.5, expect: 'hue-rotate(-90deg) blur(4px)'}, + {at: 0, expect: 'hue-rotate(0deg) blur(6px)'}, + {at: 0.25, expect: 'hue-rotate(45deg) blur(7px)'}, + {at: 0.5, expect: 'hue-rotate(90deg) blur(8px)'}, + {at: 1, expect: 'hue-rotate(180deg) blur(10px)'}, + {at: 1.5, expect: 'hue-rotate(270deg) blur(12px)'} + ]); + + // Matching lists with differing units: + test_interpolation({ + property: 'filter', + from: 'hue-rotate(80deg) blur(6mm)', + to: 'hue-rotate(100grad) blur(1cm)' + }, [ + {at: -0.5, expect: 'hue-rotate(75deg) blur(4mm)'}, + {at: 0, expect: 'hue-rotate(80deg) blur(6mm)'}, + {at: 0.25, expect: 'hue-rotate(82.5deg) blur(7mm)'}, + {at: 0.5, expect: 'hue-rotate(85deg) blur(8mm)'}, + {at: 1, expect: 'hue-rotate(90deg) blur(10mm)'}, + {at: 1.5, expect: 'hue-rotate(95deg) blur(12mm)'} + ]); + </script> + </body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/filter-effects/animation/filter-interpolation-002.html b/third_party/blink/web_tests/external/wpt/css/filter-effects/animation/filter-interpolation-002.html new file mode 100644 index 0000000..1b66c275 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/filter-effects/animation/filter-interpolation-002.html
@@ -0,0 +1,53 @@ +<!DOCTYPE html> +<html> + <head> + <meta charset="utf-8"> + <title>filter interpolation</title> + <link rel="help" href="https://drafts.fxtf.org/filter-effects/#FilterProperty"> + <meta name="assert" content="Partially matching lists interpolate."> + <script src="/resources/testharness.js"></script> + <script src="/resources/testharnessreport.js"></script> + <script src="/css/support/interpolation-testcommon.js"></script> + <style> + body { + color: blue; + } + </style> + </head> + <body> + <script> + 'use strict'; + + test_interpolation({ + property: 'filter', + from: 'none', + to: 'opacity(0.5) hue-rotate(180deg)', + }, [ + {at: -0.5, expect: 'opacity(1) hue-rotate(-90deg)'}, + {at: 0.25, expect: 'opacity(0.875) hue-rotate(45deg)'}, + {at: 0.5, expect: 'opacity(0.75) hue-rotate(90deg)'}, + {at: 1, expect: 'opacity(0.5) hue-rotate(180deg)'}, + {at: 1.5, expect: 'opacity(0.25) hue-rotate(270deg)'}, + ]); + + test_interpolation({ + property: 'filter', + from: 'blur(6px)', + to: 'blur(10px) hue-rotate(180deg)' + }, [ + {at: -0.5, expect: 'blur(4px) hue-rotate(-90deg)'}, + {at: 0.25, expect: 'blur(7px) hue-rotate(45deg)'}, + {at: 0.5, expect: 'blur(8px) hue-rotate(90deg)'}, + {at: 1, expect: 'blur(10px) hue-rotate(180deg)'}, + {at: 1.5, expect: 'blur(12px) hue-rotate(270deg)'}, + ]); + + // Mismatched lists: + test_no_interpolation({ + property: 'filter', + from: 'grayscale(0) blur(0px)', + to: 'blur(10px)' + }); + </script> + </body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/filter-effects/animation/filter-interpolation-003.html b/third_party/blink/web_tests/external/wpt/css/filter-effects/animation/filter-interpolation-003.html new file mode 100644 index 0000000..5ca1229 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/filter-effects/animation/filter-interpolation-003.html
@@ -0,0 +1,138 @@ +<!DOCTYPE html> +<html> + <head> + <meta charset="utf-8"> + <title>filter interpolation</title> + <link rel="help" href="https://drafts.fxtf.org/filter-effects/#FilterProperty"> + <meta name="assert" content="lacuna matches spec."> + <script src="/resources/testharness.js"></script> + <script src="/resources/testharnessreport.js"></script> + <script src="/css/support/interpolation-testcommon.js"></script> + <style> + body { + color: blue; + } + </style> + </head> + <body> + <script> + 'use strict'; + + test_interpolation({ + property: 'filter', + from: 'none', // lacuna is 0px + to: 'blur(10px)' + }, [ + {at: -1, expect: 'blur(0px)'}, // Negative values are not allowed. + {at: 0.5, expect: 'blur(5px)'}, + {at: 1, expect: 'blur(10px)'}, + {at: 1.5, expect: 'blur(15px)'} + ]); + + test_interpolation({ + property: 'filter', + from: 'brightness(0)', + to: 'none' // lacuna is 1 + }, [ + {at: -1, expect: 'brightness(0)'}, // Negative values are not allowed. + {at: 0, expect: 'brightness(0)'}, + {at: 0.5, expect: 'brightness(0.5)'}, + {at: 1.5, expect: 'brightness(1.5)'} + ]); + + test_interpolation({ + property: 'filter', + from: 'contrast(0)', + to: 'none' // lacuna is 1 + }, [ + {at: -1, expect: 'contrast(0)'}, // Negative values are not allowed. + {at: 0, expect: 'contrast(0)'}, + {at: 0.5, expect: 'contrast(0.5)'}, + {at: 1.5, expect: 'contrast(1.5)'} + ]); + + test_interpolation({ + property: 'filter', + from: 'none', // lacuna is drop-shadow(0px 0px 0px transparent) + to: 'drop-shadow(20px 10px green)' + }, [ + {at: -1, expect: 'drop-shadow(-20px -10px transparent)'}, + {at: 0.5, expect: 'drop-shadow(10px 5px rgba(0, 128, 0, 0.5))'}, + {at: 1, expect: 'drop-shadow(20px 10px green)'}, + {at: 1.5, expect: 'drop-shadow(30px 15px #00C000)'} + ]); + + test_interpolation({ + property: 'filter', + from: 'none', // lacuna is 0 + to: 'grayscale(1)' + }, [ + {at: -1, expect: 'grayscale(0)'}, // Negative values are not allowed. + {at: 0.5, expect: 'grayscale(0.5)'}, + {at: 1, expect: 'grayscale(1)'}, + {at: 1.5, expect: 'grayscale(1)'} // Should clamp values to 1. + ]); + + test_interpolation({ + property: 'filter', + from: 'none', // lacuna is 0deg + to: 'hue-rotate(360deg)' + }, [ + {at: -1, expect: 'hue-rotate(-360deg)'}, + {at: 0.5, expect: 'hue-rotate(180deg)'}, + {at: 1, expect: 'hue-rotate(360deg)'}, + {at: 1.5, expect: 'hue-rotate(540deg)'} + ]); + + test_interpolation({ + property: 'filter', + from: 'none', // lacuna is 0 + to: 'invert(1)' + }, [ + {at: -1, expect: 'invert(0)'}, // Negative values are not allowed. + {at: 0.5, expect: 'invert(0.5)'}, + {at: 1, expect: 'invert(1)'}, + {at: 1.5, expect: 'invert(1)'} // Should clamp values to 1. + ]); + + test_interpolation({ + property: 'filter', + from: 'opacity(0)', + to: 'none' // lacuna is 1 + }, [ + {at: -1, expect: 'opacity(0)'}, // Negative values are not allowed. + {at: 0, expect: 'opacity(0)'}, + {at: 0.5, expect: 'opacity(0.5)'}, + {at: 1.5, expect: 'opacity(1)'} // Should clamp values to 1. + ]); + + test_interpolation({ + property: 'filter', + from: 'saturate(0)', + to: 'none' // lacuna is 1 + }, [ + {at: -1, expect: 'saturate(0)'}, // Negative values are not allowed. + {at: 0, expect: 'saturate(0)'}, + {at: 0.5, expect: 'saturate(0.5)'}, + {at: 1.5, expect: 'saturate(1.5)'} + ]); + + test_interpolation({ + property: 'filter', + from: 'none', // lacuna is 0 + to: 'sepia(1)' + }, [ + {at: -1, expect: 'sepia(0)'}, // Negative values are not allowed. + {at: 0.5, expect: 'sepia(0.5)'}, + {at: 1, expect: 'sepia(1)'}, + {at: 1.5, expect: 'sepia(1)'} // Should clamp values to 1. + ]); + + test_no_interpolation({ + property: 'filter', + from: 'url("#svgfilter")', + to: 'none', // lacuna is not defined + }); + </script> + </body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/filter-effects/animation/filter-interpolation-004.html b/third_party/blink/web_tests/external/wpt/css/filter-effects/animation/filter-interpolation-004.html new file mode 100644 index 0000000..63dd1736 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/filter-effects/animation/filter-interpolation-004.html
@@ -0,0 +1,142 @@ +<!DOCTYPE html> +<html> + <head> + <meta charset="utf-8"> + <title>filter interpolation</title> + <link rel="help" href="https://drafts.fxtf.org/filter-effects/#FilterProperty"> + <meta name="assert" content="Default value when omitted matches spec."> + <script src="/resources/testharness.js"></script> + <script src="/resources/testharnessreport.js"></script> + <script src="/css/support/interpolation-testcommon.js"></script> + <style> + body { + color: blue; + } + </style> + </head> + <body> + <script> + 'use strict'; + + test_interpolation({ + property: 'filter', + from: 'blur()', // Default value when omitted is 0px. + to: 'blur(10px)' + }, [ + {at: -1, expect: 'blur(0px)'}, // Negative values are not allowed. + {at: 0, expect: 'blur()'}, + {at: 0.5, expect: 'blur(5px)'}, + {at: 1, expect: 'blur(10px)'}, + {at: 1.5, expect: 'blur(15px)'} + ]); + + test_interpolation({ + property: 'filter', + from: 'brightness(0)', + to: 'brightness()' // Default value when omitted is 1. + }, [ + {at: -1, expect: 'brightness(0)'}, // Negative values are not allowed. + {at: 0, expect: 'brightness(0)'}, + {at: 0.5, expect: 'brightness(0.5)'}, + {at: 1, expect: 'brightness()'}, + {at: 1.5, expect: 'brightness(1.5)'} + ]); + + test_interpolation({ + property: 'filter', + from: 'contrast(0)', + to: 'contrast()' // Default value when omitted is 1. + }, [ + {at: -1, expect: 'contrast(0)'}, // Negative values are not allowed. + {at: 0, expect: 'contrast(0)'}, + {at: 0.5, expect: 'contrast(0.5)'}, + {at: 1, expect: 'contrast()'}, + {at: 1.5, expect: 'contrast(1.5)'} + ]); + + test_interpolation({ + property: 'filter', + from: 'drop-shadow(0px 0px)', // The default value for omitted values is missing length values set to 0 and the missing used color is taken from the color property. + to: 'drop-shadow(20px 10px 30px green)' + }, [ + {at: -1, expect: 'drop-shadow(-20px -10px blue)'}, + {at: 0, expect: 'drop-shadow(0px 0px blue)'}, + {at: 0.5, expect: 'drop-shadow(10px 5px 15px rgb(0, 64, 128))'}, + {at: 1, expect: 'drop-shadow(20px 10px 30px green)'}, + {at: 1.5, expect: 'drop-shadow(30px 15px 45px rgb(0, 192, 0))'} + ]); + + test_interpolation({ + property: 'filter', + from: 'grayscale(0)', + to: 'grayscale()' // Default value when omitted is 1. + }, [ + {at: -1, expect: 'grayscale(0)'}, // Negative values are not allowed. + {at: 0, expect: 'grayscale(0)'}, + {at: 0.5, expect: 'grayscale(0.5)'}, + {at: 1, expect: 'grayscale()'}, + {at: 1.5, expect: 'grayscale(1)'} // Should clamp values to 1. + ]); + + test_interpolation({ + property: 'filter', + from: 'hue-rotate()', // Default value when omitted is 0deg. + to: 'hue-rotate(360deg)' + }, [ + {at: -1, expect: 'hue-rotate(-360deg)'}, + {at: 0, expect: 'hue-rotate()'}, + {at: 0.5, expect: 'hue-rotate(180deg)'}, + {at: 1, expect: 'hue-rotate(360deg)'}, + {at: 1.5, expect: 'hue-rotate(540deg)'} + ]); + + test_interpolation({ + property: 'filter', + from: 'invert(0)', + to: 'invert()' // Default value when omitted is 1. + }, [ + {at: -1, expect: 'invert(0)'}, // Negative values are not allowed. + {at: 0, expect: 'invert(0)'}, + {at: 0.5, expect: 'invert(0.5)'}, + {at: 1, expect: 'invert()'}, + {at: 1.5, expect: 'invert(1)'} // Should clamp values to 1. + ]); + + test_interpolation({ + property: 'filter', + from: 'opacity(0)', + to: 'opacity()' // Default value when omitted is 1. + }, [ + {at: -1, expect: 'opacity(0)'}, // Negative values are not allowed. + {at: 0, expect: 'opacity(0)'}, + {at: 0.5, expect: 'opacity(0.5)'}, + {at: 1, expect: 'opacity()'}, + {at: 1.5, expect: 'opacity(1)'} // Should clamp values to 1. + ]); + + test_interpolation({ + property: 'filter', + from: 'saturate(0)', + to: 'saturate()' // Default value when omitted is 1. + }, [ + {at: -1, expect: 'saturate(0)'}, // Negative values are not allowed. + {at: 0, expect: 'saturate(0)'}, + {at: 0.5, expect: 'saturate(0.5)'}, + {at: 1, expect: 'saturate()'}, + {at: 1.5, expect: 'saturate(1.5)'} + ]); + + test_interpolation({ + property: 'filter', + from: 'sepia(0)', + to: 'sepia()' // Default value when omitted is 1. + }, [ + {at: -1, expect: 'sepia(0)'}, // Negative values are not allowed. + {at: 0, expect: 'sepia(0)'}, + {at: 0.5, expect: 'sepia(0.5)'}, + {at: 1, expect: 'sepia()'}, + {at: 1.5, expect: 'sepia(1)'} // Should clamp values to 1. + ]); + </script> + </body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/filter-effects/parsing/backdrop-filter-computed.html b/third_party/blink/web_tests/external/wpt/css/filter-effects/parsing/backdrop-filter-computed.html index 96de7b94..d947e2c 100644 --- a/third_party/blink/web_tests/external/wpt/css/filter-effects/parsing/backdrop-filter-computed.html +++ b/third_party/blink/web_tests/external/wpt/css/filter-effects/parsing/backdrop-filter-computed.html
@@ -25,7 +25,7 @@ test_computed_value("backdrop-filter", "brightness(0)"); test_computed_value("backdrop-filter", "brightness(300%)", "brightness(3)"); -test_computed_value("backdrop-filter", "brightness()", "brightness(0)"); +test_computed_value("backdrop-filter", "brightness()", "brightness(1)"); test_computed_value("backdrop-filter", "contrast(0)"); test_computed_value("backdrop-filter", "contrast(300%)", "contrast(3)"); @@ -42,7 +42,7 @@ test_computed_value("backdrop-filter", "invert(0)"); test_computed_value("backdrop-filter", "invert(100%)", "invert(1)"); -test_computed_value("backdrop-filter", "invert()", "invert(0)"); +test_computed_value("backdrop-filter", "invert()", "invert(1)"); test_computed_value("backdrop-filter", "opacity(0)"); test_computed_value("backdrop-filter", "opacity(100%)", "opacity(1)");
diff --git a/third_party/blink/web_tests/external/wpt/css/filter-effects/parsing/filter-computed-expected.txt b/third_party/blink/web_tests/external/wpt/css/filter-effects/parsing/filter-computed-expected.txt deleted file mode 100644 index 1284d37..0000000 --- a/third_party/blink/web_tests/external/wpt/css/filter-effects/parsing/filter-computed-expected.txt +++ /dev/null
@@ -1,31 +0,0 @@ -This is a testharness.js-based test. -PASS Property filter value 'none' computes to 'none' -PASS Property filter value 'blur(100px)' computes to 'blur(100px)' -PASS Property filter value 'blur()' computes to 'blur(0px)' -PASS Property filter value 'brightness(0)' computes to 'brightness(0)' -PASS Property filter value 'brightness(300%)' computes to 'brightness(3)' -FAIL Property filter value 'brightness()' computes to 'brightness(1)' assert_equals: expected "brightness(1)" but got "brightness(0)" -PASS Property filter value 'contrast(0)' computes to 'contrast(0)' -PASS Property filter value 'contrast(300%)' computes to 'contrast(3)' -PASS Property filter value 'contrast()' computes to 'contrast(1)' -PASS Property filter value 'drop-shadow(1px 2px)' computes to 'drop-shadow(rgb(0, 255, 0) 1px 2px 0px)' -PASS Property filter value 'drop-shadow(rgb(4, 5, 6) 1px 2px 0px)' computes to 'drop-shadow(rgb(4, 5, 6) 1px 2px 0px)' -PASS Property filter value 'grayscale(50%)' computes to 'grayscale(0.5)' -PASS Property filter value 'grayscale()' computes to 'grayscale(1)' -PASS Property filter value 'hue-rotate(90deg)' computes to 'hue-rotate(90deg)' -PASS Property filter value 'hue-rotate()' computes to 'hue-rotate(0deg)' -PASS Property filter value 'invert(0)' computes to 'invert(0)' -PASS Property filter value 'invert(100%)' computes to 'invert(1)' -FAIL Property filter value 'invert()' computes to 'invert(1)' assert_equals: expected "invert(1)" but got "invert(0)" -PASS Property filter value 'opacity(0)' computes to 'opacity(0)' -PASS Property filter value 'opacity(100%)' computes to 'opacity(1)' -PASS Property filter value 'opacity()' computes to 'opacity(1)' -PASS Property filter value 'saturate(0)' computes to 'saturate(0)' -PASS Property filter value 'saturate(300%)' computes to 'saturate(3)' -PASS Property filter value 'saturate()' computes to 'saturate(1)' -PASS Property filter value 'sepia(0)' computes to 'sepia(0)' -PASS Property filter value 'sepia(100%)' computes to 'sepia(1)' -PASS Property filter value 'sepia()' computes to 'sepia(1)' -PASS Property filter value 'blur(10px) url("https://www.example.com/picture.svg#f") contrast(20) brightness(30)' computes to 'blur(10px) url("https://www.example.com/picture.svg#f") contrast(20) brightness(30)' -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/external/wpt/css/filter-effects/parsing/filter-computed.html b/third_party/blink/web_tests/external/wpt/css/filter-effects/parsing/filter-computed.html index 0c9bb9e..2e7f3b4 100644 --- a/third_party/blink/web_tests/external/wpt/css/filter-effects/parsing/filter-computed.html +++ b/third_party/blink/web_tests/external/wpt/css/filter-effects/parsing/filter-computed.html
@@ -35,6 +35,7 @@ test_computed_value("filter", "drop-shadow(rgb(4, 5, 6) 1px 2px 0px)"); test_computed_value("filter", "grayscale(50%)", "grayscale(0.5)"); +test_computed_value("filter", "grayscale(2)", "grayscale(1)"); test_computed_value("filter", "grayscale()", "grayscale(1)"); test_computed_value("filter", "hue-rotate(90deg)"); @@ -42,10 +43,12 @@ test_computed_value("filter", "invert(0)"); test_computed_value("filter", "invert(100%)", "invert(1)"); +test_computed_value("filter", "invert(2)", "invert(1)"); test_computed_value("filter", "invert()", "invert(1)"); test_computed_value("filter", "opacity(0)"); test_computed_value("filter", "opacity(100%)", "opacity(1)"); +test_computed_value("filter", "opacity(2)", "opacity(1)"); test_computed_value("filter", "opacity()", "opacity(1)"); test_computed_value("filter", "saturate(0)"); @@ -54,6 +57,7 @@ test_computed_value("filter", "sepia(0)"); test_computed_value("filter", "sepia(100%)", "sepia(1)"); +test_computed_value("filter", "sepia(2)", "sepia(1)"); test_computed_value("filter", "sepia()", "sepia(1)"); test_computed_value("filter", 'blur(10px) url("https://www.example.com/picture.svg#f") contrast(20) brightness(30)');
diff --git a/third_party/blink/web_tests/external/wpt/css/mediaqueries/forced-colors-expected.txt b/third_party/blink/web_tests/external/wpt/css/mediaqueries/forced-colors-expected.txt new file mode 100644 index 0000000..6f9cba5 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/mediaqueries/forced-colors-expected.txt
@@ -0,0 +1,22 @@ +This is a testharness.js-based test. +PASS Should be parseable in a CSS stylesheet: '(forced-colors)' +FAIL Should be parseable in a CSS stylesheet: '(forced-colors: none)' assert_true: expected true got false +FAIL Should be parseable in a CSS stylesheet: '(forced-colors: active)' assert_true: expected true got false +PASS Should not be parseable in a CSS stylesheet: '(forced-colors: 0)' +PASS Should not be parseable in a CSS stylesheet: '(forced-colors: no-preference)' +PASS Should not be parseable in a CSS stylesheet: '(forced-colors: 10px)' +PASS Should not be parseable in a CSS stylesheet: '(forced-colors: active 0)' +PASS Should not be parseable in a CSS stylesheet: '(forced-colors: none active)' +PASS Should not be parseable in a CSS stylesheet: '(forced-colors: active/none)' +PASS Should be parseable in JS: '(forced-colors)' +FAIL Should be parseable in JS: '(forced-colors: none)' assert_true: expected true got false +FAIL Should be parseable in JS: '(forced-colors: active)' assert_true: expected true got false +PASS Should not be parseable in JS: '(forced-colors: 0)' +PASS Should not be parseable in JS: '(forced-colors: no-preference)' +PASS Should not be parseable in JS: '(forced-colors: 10px)' +PASS Should not be parseable in JS: '(forced-colors: active 0)' +PASS Should not be parseable in JS: '(forced-colors: none active)' +PASS Should not be parseable in JS: '(forced-colors: active/none)' +FAIL Check that none evaluates to false in the boolean context assert_equals: expected true but got false +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/external/wpt/css/mediaqueries/forced-colors.html b/third_party/blink/web_tests/external/wpt/css/mediaqueries/forced-colors.html new file mode 100644 index 0000000..005b5cf --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/mediaqueries/forced-colors.html
@@ -0,0 +1,35 @@ +<!DOCTYPE html> +<link rel="help" href="https://drafts.csswg.org/mediaqueries-5/#forced-colors" /> +<script type="text/javascript" src="/resources/testharness.js"></script> +<script type="text/javascript" src="/resources/testharnessreport.js"></script> + +<script type="text/javascript" src="resources/matchmedia-utils.js"></script> +<script> +query_should_be_css_parseable("(forced-colors)"); +query_should_be_css_parseable("(forced-colors: none)"); +query_should_be_css_parseable("(forced-colors: active)"); + +query_should_not_be_css_parseable("(forced-colors: 0)"); +query_should_not_be_css_parseable("(forced-colors: no-preference)"); +query_should_not_be_css_parseable("(forced-colors: 10px)"); +query_should_not_be_css_parseable("(forced-colors: active 0)"); +query_should_not_be_css_parseable("(forced-colors: none active)"); +query_should_not_be_css_parseable("(forced-colors: active/none)"); + +query_should_be_js_parseable("(forced-colors)"); +query_should_be_js_parseable("(forced-colors: none)"); +query_should_be_js_parseable("(forced-colors: active)"); + +query_should_not_be_js_parseable("(forced-colors: 0)"); +query_should_not_be_js_parseable("(forced-colors: no-preference)"); +query_should_not_be_js_parseable("(forced-colors: 10px)"); +query_should_not_be_js_parseable("(forced-colors: active 0)"); +query_should_not_be_js_parseable("(forced-colors: none active)"); +query_should_not_be_js_parseable("(forced-colors: active/none)"); + +test(() => { + let booleanContext = window.matchMedia("(forced-colors)"); + let none = window.matchMedia("(forced-colors: none)"); + assert_equals(booleanContext.matches, !none.matches); +}, "Check that none evaluates to false in the boolean context"); +</script>
diff --git a/third_party/blink/web_tests/external/wpt/css/motion/animation/offset-anchor-interpolation.html b/third_party/blink/web_tests/external/wpt/css/motion/animation/offset-anchor-interpolation.html index 414a0bd0d..7ad9482 100644 --- a/third_party/blink/web_tests/external/wpt/css/motion/animation/offset-anchor-interpolation.html +++ b/third_party/blink/web_tests/external/wpt/css/motion/animation/offset-anchor-interpolation.html
@@ -8,7 +8,7 @@ <meta name="assert" content="offset-anchor supports <position> animation."> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> - <script src="resources/interpolation-testcommon.js"></script> + <script src="/css/support/interpolation-testcommon.js"></script> <style> body { width: 500px;
diff --git a/third_party/blink/web_tests/external/wpt/css/motion/animation/offset-distance-interpolation.html b/third_party/blink/web_tests/external/wpt/css/motion/animation/offset-distance-interpolation.html index a56878a0..4912b9cf 100644 --- a/third_party/blink/web_tests/external/wpt/css/motion/animation/offset-distance-interpolation.html +++ b/third_party/blink/web_tests/external/wpt/css/motion/animation/offset-distance-interpolation.html
@@ -8,7 +8,7 @@ <meta name="assert" content="offset-distance supports animation."> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> - <script src="resources/interpolation-testcommon.js"></script> + <script src="/css/support/interpolation-testcommon.js"></script> </head> <body> <script>
diff --git a/third_party/blink/web_tests/external/wpt/css/motion/animation/offset-path-interpolation-001.html b/third_party/blink/web_tests/external/wpt/css/motion/animation/offset-path-interpolation-001.html index 279152e..5b90813b 100644 --- a/third_party/blink/web_tests/external/wpt/css/motion/animation/offset-path-interpolation-001.html +++ b/third_party/blink/web_tests/external/wpt/css/motion/animation/offset-path-interpolation-001.html
@@ -8,7 +8,7 @@ <meta name="assert" content="offset-distance supports animation."> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> - <script src="resources/interpolation-testcommon.js"></script> + <script src="/css/support/interpolation-testcommon.js"></script> </head> <body> <script>
diff --git a/third_party/blink/web_tests/external/wpt/css/motion/animation/offset-path-interpolation-002.html b/third_party/blink/web_tests/external/wpt/css/motion/animation/offset-path-interpolation-002.html index 742e9d0a..2841bd95 100644 --- a/third_party/blink/web_tests/external/wpt/css/motion/animation/offset-path-interpolation-002.html +++ b/third_party/blink/web_tests/external/wpt/css/motion/animation/offset-path-interpolation-002.html
@@ -8,7 +8,7 @@ <meta name="assert" content="offset-distance supports animation."> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> - <script src="resources/interpolation-testcommon.js"></script> + <script src="/css/support/interpolation-testcommon.js"></script> </head> <body> <script>
diff --git a/third_party/blink/web_tests/external/wpt/css/motion/animation/offset-path-interpolation-003.html b/third_party/blink/web_tests/external/wpt/css/motion/animation/offset-path-interpolation-003.html index a6d4e89..44c0285 100644 --- a/third_party/blink/web_tests/external/wpt/css/motion/animation/offset-path-interpolation-003.html +++ b/third_party/blink/web_tests/external/wpt/css/motion/animation/offset-path-interpolation-003.html
@@ -8,7 +8,7 @@ <meta name="assert" content="offset-distance supports animation."> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> - <script src="resources/interpolation-testcommon.js"></script> + <script src="/css/support/interpolation-testcommon.js"></script> </head> <body> <script>
diff --git a/third_party/blink/web_tests/external/wpt/css/motion/animation/offset-path-interpolation-004.html b/third_party/blink/web_tests/external/wpt/css/motion/animation/offset-path-interpolation-004.html index f3e07ab..8603486 100644 --- a/third_party/blink/web_tests/external/wpt/css/motion/animation/offset-path-interpolation-004.html +++ b/third_party/blink/web_tests/external/wpt/css/motion/animation/offset-path-interpolation-004.html
@@ -8,7 +8,7 @@ <meta name="assert" content="offset-distance supports animation."> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> - <script src="resources/interpolation-testcommon.js"></script> + <script src="/css/support/interpolation-testcommon.js"></script> </head> <body> <script>
diff --git a/third_party/blink/web_tests/external/wpt/css/motion/animation/offset-path-interpolation-005.html b/third_party/blink/web_tests/external/wpt/css/motion/animation/offset-path-interpolation-005.html index 617fff0..afe4bf57 100644 --- a/third_party/blink/web_tests/external/wpt/css/motion/animation/offset-path-interpolation-005.html +++ b/third_party/blink/web_tests/external/wpt/css/motion/animation/offset-path-interpolation-005.html
@@ -8,7 +8,7 @@ <meta name="assert" content="offset-distance supports animation."> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> - <script src="resources/interpolation-testcommon.js"></script> + <script src="/css/support/interpolation-testcommon.js"></script> </head> <body> <script>
diff --git a/third_party/blink/web_tests/external/wpt/css/motion/animation/offset-position-interpolation.html b/third_party/blink/web_tests/external/wpt/css/motion/animation/offset-position-interpolation.html index c31034d..5ccca37 100644 --- a/third_party/blink/web_tests/external/wpt/css/motion/animation/offset-position-interpolation.html +++ b/third_party/blink/web_tests/external/wpt/css/motion/animation/offset-position-interpolation.html
@@ -8,7 +8,7 @@ <meta name="assert" content="offset-position supports <position> animation."> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> - <script src="resources/interpolation-testcommon.js"></script> + <script src="/css/support/interpolation-testcommon.js"></script> <style> body { width: 500px;
diff --git a/third_party/blink/web_tests/external/wpt/css/motion/animation/offset-rotate-interpolation.html b/third_party/blink/web_tests/external/wpt/css/motion/animation/offset-rotate-interpolation.html index 3b3d755..a55a005 100644 --- a/third_party/blink/web_tests/external/wpt/css/motion/animation/offset-rotate-interpolation.html +++ b/third_party/blink/web_tests/external/wpt/css/motion/animation/offset-rotate-interpolation.html
@@ -8,7 +8,7 @@ <meta name="assert" content="offset-rotate supports animation."> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> - <script src="resources/interpolation-testcommon.js"></script> + <script src="/css/support/interpolation-testcommon.js"></script> </head> <body> <script>
diff --git a/third_party/blink/web_tests/external/wpt/css/motion/animation/resources/interpolation-testcommon.js b/third_party/blink/web_tests/external/wpt/css/motion/animation/resources/interpolation-testcommon.js deleted file mode 100644 index 6933733..0000000 --- a/third_party/blink/web_tests/external/wpt/css/motion/animation/resources/interpolation-testcommon.js +++ /dev/null
@@ -1,66 +0,0 @@ -'use strict'; -function test_interpolation(settings, expectations) { - // Returns a timing function that at 0.5 evaluates to progress. - function timingFunction(progress) { - if (progress === 0) - return 'steps(1, end)'; - if (progress === 1) - return 'steps(1, start)'; - var y = (8 * progress - 1) / 6; - return 'cubic-bezier(0, ' + y + ', 1, ' + y + ')'; - } - - test(function(){ - assert_true(CSS.supports(settings.property, settings.from), 'Value "' + settings.from + '" is supported by ' + settings.property); - assert_true(CSS.supports(settings.property, settings.to), 'Value "' + settings.to + '" is supported by ' + settings.property); - }, '"' + settings.from + '" and "' + settings.to + '" are valid ' + settings.property + ' values'); - - for (var i = 0; i < expectations.length; ++i) { - var progress = expectations[i].at; - var expectation = expectations[i].expect; - var animationId = 'anim' + i; - var targetId = 'target' + i; - var referenceId = 'reference' + i; - test(function(){ - assert_true(CSS.supports(settings.property, expectation), 'Value "' + expectation + '" is supported by ' + settings.property); - - var stylesheet = document.createElement('style'); - stylesheet.textContent = - '#' + targetId + ' {\n' + - ' animation: 2s ' + timingFunction(progress) + ' -1s paused ' + animationId + ';\n' + - '}\n' + - '@keyframes ' + animationId + ' {\n' + - ' 0% { ' + settings.property + ': ' + settings.from + '; }\n' + - ' 100% { ' + settings.property + ': ' + settings.to + '; }\n' + - '}\n' + - '#' + referenceId + ' {\n' + - ' ' + settings.property + ': ' + expectation + ';\n' + - '}\n'; - document.head.appendChild(stylesheet); - - var target = document.createElement('div'); - target.id = targetId; - document.body.appendChild(target); - - var reference = document.createElement('div'); - reference.id = referenceId; - document.body.appendChild(reference); - reference.style = ''; - - assert_equals(getComputedStyle(target)[settings.property], getComputedStyle(reference)[settings.property]); - }, (settings.test_prefix ? settings.test_prefix : "") + - 'Animation between "' + settings.from + '" and "' + settings.to + - '" at progress ' + progress); - } -} - -function test_no_interpolation(settings) { - var expectatFrom = [-1, 0, 0.125].map(function (progress) { - return {at: progress, expect: settings.from}; - }); - var expectatTo = [0.875, 1, 2].map(function (progress) { - return {at: progress, expect: settings.to}; - }); - - test_interpolation(settings, expectatFrom.concat(expectatTo)); -}
diff --git a/third_party/blink/web_tests/external/wpt/css/css-grid/animation/resources/interpolation-testcommon.js b/third_party/blink/web_tests/external/wpt/css/support/interpolation-testcommon.js similarity index 88% rename from third_party/blink/web_tests/external/wpt/css/css-grid/animation/resources/interpolation-testcommon.js rename to third_party/blink/web_tests/external/wpt/css/support/interpolation-testcommon.js index 530b4fea..9bc71ff9d 100644 --- a/third_party/blink/web_tests/external/wpt/css/css-grid/animation/resources/interpolation-testcommon.js +++ b/third_party/blink/web_tests/external/wpt/css/support/interpolation-testcommon.js
@@ -11,8 +11,8 @@ } test(function(){ - assert_true(CSS.supports(settings.property, settings.from), 'Value "' + settings.from + '" is supported by ' + settings.property); - assert_true(CSS.supports(settings.property, settings.to), 'Value "' + settings.to + '" is supported by ' + settings.property); + assert_true(CSS.supports(settings.property, settings.from), 'From value "' + settings.from + '" is supported by ' + settings.property); + assert_true(CSS.supports(settings.property, settings.to), 'To value "' + settings.to + '" is supported by ' + settings.property); }, '"' + settings.from + '" and "' + settings.to + '" are valid ' + settings.property + ' values'); for (var i = 0; i < expectations.length; ++i) { @@ -22,7 +22,7 @@ var targetId = 'target' + i; var referenceId = 'reference' + i; test(function(){ - assert_true(CSS.supports(settings.property, expectation), 'Value "' + expectation + '" is supported by ' + settings.property); + assert_true(CSS.supports(settings.property, expectation), 'Expectation value "' + expectation + '" is supported by ' + settings.property); var stylesheet = document.createElement('style'); stylesheet.textContent =
diff --git a/third_party/blink/web_tests/external/wpt/feature-policy/experimental-features/layout-animations-disabled-tentative.html b/third_party/blink/web_tests/external/wpt/feature-policy/experimental-features/layout-animations-disabled-tentative.html index 993aa0d..0190eaa8 100644 --- a/third_party/blink/web_tests/external/wpt/feature-policy/experimental-features/layout-animations-disabled-tentative.html +++ b/third_party/blink/web_tests/external/wpt/feature-policy/experimental-features/layout-animations-disabled-tentative.html
@@ -1,7 +1,7 @@ <!DOCTYPE html> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> -<script src="/css/motion/animation/resources/interpolation-testcommon.js"></script> +<script src="/css/support/interpolation-testcommon.js"></script> <title> 'layout-animations' Policy : Correct behavior for affected and unaffected properties when feature is disabled. </title>
diff --git a/third_party/blink/web_tests/external/wpt/feature-policy/experimental-features/layout-animations-enabled-tentative.html b/third_party/blink/web_tests/external/wpt/feature-policy/experimental-features/layout-animations-enabled-tentative.html index cf396e9..19e4054 100644 --- a/third_party/blink/web_tests/external/wpt/feature-policy/experimental-features/layout-animations-enabled-tentative.html +++ b/third_party/blink/web_tests/external/wpt/feature-policy/experimental-features/layout-animations-enabled-tentative.html
@@ -1,7 +1,7 @@ <!DOCTYPE html> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> -<script src="/css/motion/animation/resources/interpolation-testcommon.js"></script> +<script src="/css/support/interpolation-testcommon.js"></script> <title> 'layout-animations' Policy : Correct behavior for affected and unaffected properties when feature is enabled. </title>
diff --git a/third_party/blink/web_tests/external/wpt/fetch/sec-metadata/redirect/multiple-redirect-https-downgrade-upgrade.tentative.sub.html b/third_party/blink/web_tests/external/wpt/fetch/sec-metadata/redirect/multiple-redirect-https-downgrade-upgrade.tentative.sub.html new file mode 100644 index 0000000..3f8726d --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/fetch/sec-metadata/redirect/multiple-redirect-https-downgrade-upgrade.tentative.sub.html
@@ -0,0 +1,68 @@ +<!DOCTYPE html> +<html> +<script src=/resources/testharness.js></script> +<script src=/resources/testharnessreport.js></script> +<script src=/fetch/sec-metadata/resources/helper.js></script> +<script src=/fetch/sec-metadata/resources/redirectTestHelper.sub.js></script> +<script src=/common/security-features/resources/common.js></script> +<script src=/common/utils.js></script> +<style> + @font-face { + font-family: myDowngradeUpgradeFont; + src: url(https://{{host}}:{{ports[https][0]}}/fetch/api/resources/redirect.py?location=http%3A%2F%2F{{host}}%3A{{ports[http][0]}}%2Ffetch%2Fapi%2Fresources%2Fredirect.py%3Flocation%3Dhttps%253A%252F%252F{{host}}%253A{{ports[https][0]}}%252Ffetch%252Fsec-metadata%252Fresources%252Frecord-header.py%253Ffile%253Dfont-https-downgrade-upgrade); + } + #fontTest { + font-family: myDowngradeUpgradeFont; + } +</style> +<body> + <div id="fontTest">Downgraded then upgraded font</div> + <script> + let nonce = token(); + let expected = { "dest": "", "site": "same-site", "user": "", "mode": "" }; + + // Validate various scenarios handle a request that redirects from https => http + // correctly and avoids disclosure of any Sec- headers. + RunCommonRedirectTests("Https downgrade-upgrade", MultipleRedirectTo, expected); + + document.fonts.ready.then(function () { + promise_test(t => { + return new Promise((resolve, reject) => { + let key = "font-https-downgrade-upgrade"; + fetch("/fetch/sec-metadata/resources/record-header.py?retrieve=true&file=" + key) + .then(response => response.text()) + .then(text => assert_header_equals(text, expected)) + .then(_ => resolve()) + .catch(e => reject(e)); + }); + }, "Https downgrade-upgrade font => No headers"); + }); + + promise_test(() => + requestViaImage(secureRedirectURL + encodeURIComponent(insecureRedirectURL + encodeURIComponent("https://{{host}}:{{ports[https][0]}}/common/security-features/subresource/image.py"))) + .then(result => { + headers = result.headers; + got = { + "dest": headers["sec-fetch-dest"], + "mode": headers["sec-fetch-mode"], + "site": headers["sec-fetch-site"], + "user": headers["sec-fetch-user"] + }; + assert_header_equals(got, { + // Note that we're using `undefined` here, as opposed to "" elsewhere because of the way + // that `image.py` encodes data. + "dest": undefined, + "site": "same-site", + "user": undefined, + "mode": undefined, + }); + }), "Https downgrade-upgrade image => No headers"); +</script> +<script src="https://{{host}}:{{ports[https][0]}}/fetch/api/resources/redirect.py?location=http%3A%2F%2F{{host}}%3A{{ports[http][0]}}%2Ffetch%2Fapi%2Fresources%2Fredirect.py%3Flocation%3Dhttps%253A%252F%252F{{host}}%253A{{ports[https][0]}}%252Ffetch%252Fsec-metadata%252Fresources%252Fecho-as-script.py"></script> +<script> + test(t => { + t.add_cleanup(_ => { header = null; }); + assert_header_equals(header, expected); + }, "Https downgrade-upgrade script => No headers"); +</script> +</body>
diff --git a/third_party/blink/web_tests/external/wpt/fetch/sec-metadata/redirect/redirect-http-upgrade.tentative.sub.html b/third_party/blink/web_tests/external/wpt/fetch/sec-metadata/redirect/redirect-http-upgrade.tentative.sub.html new file mode 100644 index 0000000..fe55cda --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/fetch/sec-metadata/redirect/redirect-http-upgrade.tentative.sub.html
@@ -0,0 +1,67 @@ +<!DOCTYPE html> +<html> +<script src=/resources/testharness.js></script> +<script src=/resources/testharnessreport.js></script> +<script src=/fetch/sec-metadata/resources/helper.js></script> +<script src=/fetch/sec-metadata/resources/redirectTestHelper.sub.js></script> +<script src=/common/security-features/resources/common.js></script> +<script src=/common/utils.js></script> +<style> + @font-face { + font-family: myUpgradedFont; + src: url(http://{{host}}:{{ports[http][0]}}/fetch/api/resources/redirect.py?location=https%3A%2F%2F{{host}}%3A{{ports[https][0]}}%2Ffetch%2Fsec-metadata%2Fresources%2Frecord-header.py%3Ffile%3Dfont-https-upgrade); + } + #fontTest { + font-family: myUpgradedFont; + } +</style> +<body> + <div id="fontTest">Upgraded font</div> + <script> + let nonce = token(); + let expected = { "dest": "", "site": "same-site", "user": "", "mode": "" }; + + // Validate various scenarios handle a request that redirects from http => https correctly and add the proper Sec- headers. + RunCommonRedirectTests("Http upgrade", upgradeRedirectTo, expected); + + document.fonts.ready.then(function () { + promise_test(t => { + return new Promise((resolve, reject) => { + let key = "font-https-upgrade"; + fetch("/fetch/sec-metadata/resources/record-header.py?retrieve=true&file=" + key) + .then(response => response.text()) + .then(text => assert_header_equals(text, expected)) + .then(_ => resolve()) + .catch(e => reject(e)); + }); + }, "Http upgrade font => No headers"); + }); + + promise_test(() => + requestViaImage(insecureRedirectURL + encodeURIComponent("https://{{host}}:{{ports[https][0]}}/common/security-features/subresource/image.py")) + .then(result => { + headers = result.headers; + got = { + "dest": headers["sec-fetch-dest"], + "mode": headers["sec-fetch-mode"], + "site": headers["sec-fetch-site"], + "user": headers["sec-fetch-user"] + }; + assert_header_equals(got, { + // Note that we're using `undefined` here, as opposed to "" elsewhere because of the way + // that `image.py` encodes data. + "dest": undefined, + "site": "same-site", + "user": undefined, + "mode": undefined, + }); + }), "Http upgrade image => No headers"); +</script> +<script src="http://{{host}}:{{ports[http][0]}}/fetch/api/resources/redirect.py?location=https%3A%2F%2F{{host}}%3A{{ports[https][0]}}%2Ffetch%2Fsec-metadata%2Fresources%2Fecho-as-script.py"></script> +<script> + test(t => { + t.add_cleanup(_ => { header = null; }); + assert_header_equals(header, expected); + }, "Http upgrade script => No headers"); +</script> +</body>
diff --git a/third_party/blink/web_tests/external/wpt/fetch/sec-metadata/redirect/redirect-https-downgrade.tentative.sub.html b/third_party/blink/web_tests/external/wpt/fetch/sec-metadata/redirect/redirect-https-downgrade.tentative.sub.html new file mode 100644 index 0000000..8178438 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/fetch/sec-metadata/redirect/redirect-https-downgrade.tentative.sub.html
@@ -0,0 +1,68 @@ +<!DOCTYPE html> +<html> +<script src=/resources/testharness.js></script> +<script src=/resources/testharnessreport.js></script> +<script src=/fetch/sec-metadata/resources/helper.js></script> +<script src=/fetch/sec-metadata/resources/redirectTestHelper.sub.js></script> +<script src=/common/security-features/resources/common.js></script> +<script src=/common/utils.js></script> +<style> + @font-face { + font-family: myDowngradedFont; + src: url(https://{{host}}:{{ports[https][0]}}/fetch/api/resources/redirect.py?location=http%3A%2F%2F{{host}}%3A{{ports[http][0]}}%2Ffetch%2Fsec-metadata%2Fresources%2Frecord-header.py%3Ffile%3Dfont-https-downgrade); + } + #fontTest { + font-family: myDowngradedFont; + } +</style> +<body> + <div id="fontTest">Downgraded font</div> + <script> + let nonce = token(); + let expected = { "dest": "", "site": "", "user": "", "mode": "" }; + + // Validate various scenarios handle a request that redirects from https => http correctly and avoids disclosure of any Sec- headers. + RunCommonRedirectTests("Https downgrade", downgradeRedirectTo, expected); + + document.fonts.ready.then(function () { + promise_test(t => { + return new Promise((resolve, reject) => { + let key = "font-https-downgrade"; + fetch("/fetch/sec-metadata/resources/record-header.py?retrieve=true&file=" + key) + .then(response => response.text()) + .then(text => assert_header_equals(text, expected)) + .then(_ => resolve()) + .catch(e => reject(e)); + }); + }, "Https downgrade font => No headers"); + }); + + promise_test(() => + requestViaImage(secureRedirectURL + encodeURIComponent("http://{{host}}:{{ports[http][0]}}/common/security-features/subresource/image.py")) + .then(result => { + headers = result.headers; + got = { + "dest": headers["sec-fetch-dest"], + "mode": headers["sec-fetch-mode"], + "site": headers["sec-fetch-site"], + "user": headers["sec-fetch-user"] + }; + assert_header_equals(got, { + // Note that we're using `undefined` here, as opposed to "" elsewhere because of the way + // that `image.py` encodes data. + "dest": undefined, + "site": undefined, + "user": undefined, + "mode": undefined, + }); + }), "Https downgrade image => No headers"); +</script> + +<script src="https://{{host}}:{{ports[https][0]}}/fetch/api/resources/redirect.py?location=http%3A%2F%2F{{host}}%3A{{ports[http][0]}}%2Ffetch%2Fsec-metadata%2Fresources%2Fecho-as-script.py"></script> +<script> + test(t => { + t.add_cleanup(_ => { header = null; }); + assert_header_equals(header, expected); + }, "Https downgrade script => No headers"); +</script> +</body>
diff --git a/third_party/blink/web_tests/external/wpt/fetch/sec-metadata/resources/redirectTestHelper.sub.js b/third_party/blink/web_tests/external/wpt/fetch/sec-metadata/resources/redirectTestHelper.sub.js new file mode 100644 index 0000000..ad78702 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/fetch/sec-metadata/resources/redirectTestHelper.sub.js
@@ -0,0 +1,181 @@ +function createVideoElement() { + let el = document.createElement('video'); + el.src = "/media/movie_5.mp4"; + el.setAttribute("controls", ""); + el.setAttribute("crossorigin", ""); + return el; +} + +function createTrack() { + let el = document.createElement("track"); + el.setAttribute("default", ""); + el.setAttribute("kind", "captions"); + el.setAttribute("srclang", "en"); + return el; +} + +let secureRedirectURL = "https://{{host}}:{{ports[https][0]}}/fetch/api/resources/redirect.py?location="; +let insecureRedirectURL = "http://{{host}}:{{ports[http][0]}}/fetch/api/resources/redirect.py?location="; +let secureTestURL = "https://{{host}}:{{ports[https][0]}}/fetch/sec-metadata/"; +let insecureTestURL = "http://{{host}}:{{ports[http][0]}}/fetch/sec-metadata/"; + +// Helper to craft an URL that will go from HTTPS => HTTP => HTTPS to +// simulate us downgrading then upgrading again during the same redirect chain. +function MultipleRedirectTo(partialPath) { + let finalURL = insecureRedirectURL + encodeURIComponent(secureTestURL + partialPath); + return insecureRedirectURL + encodeURIComponent(finalURL); +} + +// Helper to craft an URL that will go from HTTP => HTTPS to simulate upgrading a +// given request. +function upgradeRedirectTo(partialPath) { + return insecureRedirectURL + encodeURIComponent(secureTestURL + partialPath); +} + +// Helper to craft an URL that will go from HTTPS => HTTP to simulate downgrading a +// given request. +function downgradeRedirectTo(partialPath) { + return secureRedirectURL + encodeURIComponent(insecureTestURL + partialPath); +} + +// Helper to run common redirect test cases that don't require special setup on +// the test page itself. +function RunCommonRedirectTests(testNamePrefix, urlHelperMethod, expectedResults) { + async_test(t => { + let i = document.createElement('iframe'); + i.src = urlHelperMethod("resources/post-to-owner.py"); + window.addEventListener('message', t.step_func(e => { + if (e.source != i.contentWindow) { + return; + } + + assert_header_equals(e.data, expectedResults); + t.done(); + })); + + document.body.appendChild(i); + }, testNamePrefix + " iframe => No headers"); + + async_test(t => { + let testWindow = window.open(urlHelperMethod("resources/post-to-owner.py")); + t.add_cleanup(_ => testWindow.close()); + window.addEventListener('message', t.step_func(e => { + if (e.source != testWindow) { + return; + } + + assert_header_equals(e.data, expectedResults); + t.done(); + })); + }, testNamePrefix + " top level navigation => No headers"); + + promise_test(t => { + return new Promise((resolve, reject) => { + let key = "embed-redirect-redirect" + nonce; + + let e = document.createElement('embed'); + e.src = urlHelperMethod("resources/record-header.py?file=" + key); + e.onload = e => { + fetch("/fetch/sec-metadata/resources/record-header.py?retrieve=true&file=" + key) + .then(response => response.text()) + .then(text => assert_header_equals(text, expectedResults)) + .then(_ => resolve()) + .catch(e => reject(e)); + }; + + document.body.appendChild(e); + }); + }, testNamePrefix + " embed => No headers"); + + promise_test(t => { + let key = "fetch-redirect" + nonce; + return fetch(urlHelperMethod("resources/echo-as-json.py?" + key)) + .then(r => r.json()) + .then(j => {assert_header_equals(j, expectedResults);}); + }, testNamePrefix + " fetch() api => No headers"); + + promise_test(t => { + return new Promise((resolve, reject) => { + let key = "object-https-redirect" + nonce; + let e = document.createElement('object'); + e.data = urlHelperMethod("resources/record-header.py?file=" + key); + e.onload = e => { + fetch("/fetch/sec-metadata/resources/record-header.py?retrieve=true&file=" + key) + .then(response => response.text()) + .then(text => assert_header_equals(text, expectedResults)) + .then(_ => resolve()) + .catch(e => reject(e)); + }; + document.body.appendChild(e); + }); + }, testNamePrefix + " object => No headers"); + + if (document.createElement('link').relList.supports('prefetch')) { + async_test(t => { + let key = "prefetch" + nonce; + let e = document.createElement('link'); + e.rel = "prefetch"; + e.href = urlHelperMethod("resources/record-header.py?file=" + key) + "&simple=true"; + e.onload = t.step_func(e => { + fetch("/fetch/sec-metadata/resources/record-header.py?retrieve=true&file=" + key) + .then(t.step_func(response => response.text())) + .then(t.step_func_done(text => assert_header_equals(text, expectedResults))) + .catch(t.unreached_func("Fetching and verifying the results should succeed.")); + }); + e.onerror = t.unreached_func(); + document.head.appendChild(e); + }, testNamePrefix + " prefetch => No headers"); + } + + if (document.createElement('link').relList.supports('preload')) { + async_test(t => { + let key = "preload" + nonce; + let e = document.createElement('link'); + e.rel = "preload"; + e.href = urlHelperMethod("resources/record-header.py?file=" + key); + e.setAttribute("as", "track"); + e.onload = e.onerror = t.step_func_done(e => { + fetch("/fetch/sec-metadata/resources/record-header.py?retrieve=true&file=" + key) + .then(t.step_func(response => response.text())) + .then(t.step_func(text => assert_header_equals(text, expectedResults))) + .then(t.step_func_done(_ => resolve())) + .catch(t.unreached_func()); + }); + document.head.appendChild(e); + }, testNamePrefix + " preload => No headers"); + } + + promise_test(t => { + return new Promise((resolve, reject) => { + let key = "style-https-redirect" + nonce; + let e = document.createElement('link'); + e.rel = "stylesheet"; + e.href = urlHelperMethod("resources/record-header.py?file=" + key); + e.onload = e => { + fetch("/fetch/sec-metadata/resources/record-header.py?retrieve=true&file=" + key) + .then(response => response.text()) + .then(text => assert_header_equals(text, expectedResults)) + .then(_ => resolve()) + .catch(e => reject(e)); + }; + document.body.appendChild(e); + }); + }, testNamePrefix + " stylesheet => No headers"); + + promise_test(t => { + return new Promise((resolve, reject) => { + let key = "track-https-redirect" + nonce; + let video = createVideoElement(); + let el = createTrack(); + el.src = urlHelperMethod("resources/record-header.py?file=" + key); + el.onload = t.step_func(_ => { + fetch("/fetch/sec-metadata/resources/record-header.py?retrieve=true&file=" + key) + .then(response => response.text()) + .then(text => assert_header_equals(text, expectedResults)) + .then(_ => resolve()); + }); + video.appendChild(el); + document.body.appendChild(video); + }); + }, testNamePrefix + " track => No headers"); +}
diff --git a/third_party/blink/web_tests/external/wpt/offscreen-canvas/text/2d.text.measure.actualBoundingBox.html b/third_party/blink/web_tests/external/wpt/offscreen-canvas/text/2d.text.measure.actualBoundingBox.html new file mode 100644 index 0000000..e747d30 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/offscreen-canvas/text/2d.text.measure.actualBoundingBox.html
@@ -0,0 +1,46 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.text.measure.actualBoundingBox</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.text.measure.actualBoundingBox</h1> +<p class="desc">Testing actualBoundingBox for OffscreenCanvas</p> + + +<script> +var t = async_test("Testing actualBoundingBox for OffscreenCanvas"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +deferTest(); +var f = new FontFace("CanvasTest", "/fonts/CanvasTest.ttf"); +let fonts = (self.fonts ? self.fonts : document.fonts); +fonts.add(f); +fonts.ready.then(() => { + step_timeout(t.step_func_done(function () { + ctx.font = '50px CanvasTest'; + ctx.direction = 'ltr'; + ctx.align = 'left' + ctx.baseline = 'alphabetic' + // Some platforms may return '-0'. + _assertSame(Math.abs(ctx.measureText('A').actualBoundingBoxLeft), 0, "Math.abs(ctx.measureText('A').actualBoundingBoxLeft)", "0"); + // Different platforms may render text slightly different. + _assert(ctx.measureText('A').actualBoundingBoxRight >= 50, "ctx.measureText('A').actualBoundingBoxRight >= 50"); + _assert(ctx.measureText('A').actualBoundingBoxAscent >= 35, "ctx.measureText('A').actualBoundingBoxAscent >= 35"); + _assertSame(Math.abs(ctx.measureText('A').actualBoundingBoxDescent), 0, "Math.abs(ctx.measureText('A').actualBoundingBoxDescent)", "0"); + + _assertSame(Math.abs(ctx.measureText('ABCD').actualBoundingBoxLeft), 0, "Math.abs(ctx.measureText('ABCD').actualBoundingBoxLeft)", "0"); + _assert(ctx.measureText('ABCD').actualBoundingBoxRight >= 200, "ctx.measureText('ABCD').actualBoundingBoxRight >= 200"); + _assert(ctx.measureText('ABCD').actualBoundingBoxAscent >= 85, "ctx.measureText('ABCD').actualBoundingBoxAscent >= 85"); + _assert(ctx.measureText('ABCD').actualBoundingBoxDescent >= 37, "ctx.measureText('ABCD').actualBoundingBoxDescent >= 37"); + }), 500); +}); + +t.done(); + +}); +</script>
diff --git a/third_party/blink/web_tests/external/wpt/offscreen-canvas/text/2d.text.measure.actualBoundingBox.worker.js b/third_party/blink/web_tests/external/wpt/offscreen-canvas/text/2d.text.measure.actualBoundingBox.worker.js new file mode 100644 index 0000000..da6eac5 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/offscreen-canvas/text/2d.text.measure.actualBoundingBox.worker.js
@@ -0,0 +1,42 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.text.measure.actualBoundingBox +// Description:Testing actualBoundingBox for OffscreenCanvas +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("Testing actualBoundingBox for OffscreenCanvas"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +deferTest(); +var f = new FontFace("CanvasTest", "/fonts/CanvasTest.ttf"); +let fonts = (self.fonts ? self.fonts : document.fonts); +fonts.add(f); +fonts.ready.then(() => { + step_timeout(t.step_func_done(function () { + ctx.font = '50px CanvasTest'; + ctx.direction = 'ltr'; + ctx.align = 'left' + ctx.baseline = 'alphabetic' + // Some platforms may return '-0'. + _assertSame(Math.abs(ctx.measureText('A').actualBoundingBoxLeft), 0, "Math.abs(ctx.measureText('A').actualBoundingBoxLeft)", "0"); + // Different platforms may render text slightly different. + _assert(ctx.measureText('A').actualBoundingBoxRight >= 50, "ctx.measureText('A').actualBoundingBoxRight >= 50"); + _assert(ctx.measureText('A').actualBoundingBoxAscent >= 35, "ctx.measureText('A').actualBoundingBoxAscent >= 35"); + _assertSame(Math.abs(ctx.measureText('A').actualBoundingBoxDescent), 0, "Math.abs(ctx.measureText('A').actualBoundingBoxDescent)", "0"); + + _assertSame(Math.abs(ctx.measureText('ABCD').actualBoundingBoxLeft), 0, "Math.abs(ctx.measureText('ABCD').actualBoundingBoxLeft)", "0"); + _assert(ctx.measureText('ABCD').actualBoundingBoxRight >= 200, "ctx.measureText('ABCD').actualBoundingBoxRight >= 200"); + _assert(ctx.measureText('ABCD').actualBoundingBoxAscent >= 85, "ctx.measureText('ABCD').actualBoundingBoxAscent >= 85"); + _assert(ctx.measureText('ABCD').actualBoundingBoxDescent >= 37, "ctx.measureText('ABCD').actualBoundingBoxDescent >= 37"); + }), 500); +}); + +t.done(); + +}); +done();
diff --git a/third_party/blink/web_tests/external/wpt/offscreen-canvas/text/2d.text.measure.advances.html b/third_party/blink/web_tests/external/wpt/offscreen-canvas/text/2d.text.measure.advances.html new file mode 100644 index 0000000..ce03b2b --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/offscreen-canvas/text/2d.text.measure.advances.html
@@ -0,0 +1,48 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.text.measure.advances</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.text.measure.advances</h1> +<p class="desc">Testing width advances for OffscreenCanvas</p> + + +<script> +var t = async_test("Testing width advances for OffscreenCanvas"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +deferTest(); +var f = new FontFace("CanvasTest", "/fonts/CanvasTest.ttf"); +let fonts = (self.fonts ? self.fonts : document.fonts); +fonts.add(f); +fonts.ready.then(() => { + step_timeout(t.step_func_done(function () { + ctx.font = '50px CanvasTest'; + ctx.direction = 'ltr'; + ctx.align = 'left' + // Some platforms may return '-0'. + _assertSame(Math.abs(ctx.measureText('Hello').advances[0]), 0, "Math.abs(ctx.measureText('Hello').advances[\""+(0)+"\"])", "0"); + // Different platforms may render text slightly different. + _assert(ctx.measureText('Hello').advances[1] >= 36, "ctx.measureText('Hello').advances[\""+(1)+"\"] >= 36"); + _assert(ctx.measureText('Hello').advances[2] >= 58, "ctx.measureText('Hello').advances[\""+(2)+"\"] >= 58"); + _assert(ctx.measureText('Hello').advances[3] >= 70, "ctx.measureText('Hello').advances[\""+(3)+"\"] >= 70"); + _assert(ctx.measureText('Hello').advances[4] >= 80, "ctx.measureText('Hello').advances[\""+(4)+"\"] >= 80"); + + var tm = ctx.measureText('Hello'); + _assertSame(ctx.measureText('Hello').advances[0], tm.advances[0], "ctx.measureText('Hello').advances[\""+(0)+"\"]", "tm.advances[\""+(0)+"\"]"); + _assertSame(ctx.measureText('Hello').advances[1], tm.advances[1], "ctx.measureText('Hello').advances[\""+(1)+"\"]", "tm.advances[\""+(1)+"\"]"); + _assertSame(ctx.measureText('Hello').advances[2], tm.advances[2], "ctx.measureText('Hello').advances[\""+(2)+"\"]", "tm.advances[\""+(2)+"\"]"); + _assertSame(ctx.measureText('Hello').advances[3], tm.advances[3], "ctx.measureText('Hello').advances[\""+(3)+"\"]", "tm.advances[\""+(3)+"\"]"); + _assertSame(ctx.measureText('Hello').advances[4], tm.advances[4], "ctx.measureText('Hello').advances[\""+(4)+"\"]", "tm.advances[\""+(4)+"\"]"); + }), 500); +}); + +t.done(); + +}); +</script>
diff --git a/third_party/blink/web_tests/external/wpt/offscreen-canvas/text/2d.text.measure.advances.worker.js b/third_party/blink/web_tests/external/wpt/offscreen-canvas/text/2d.text.measure.advances.worker.js new file mode 100644 index 0000000..ff696f8 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/offscreen-canvas/text/2d.text.measure.advances.worker.js
@@ -0,0 +1,44 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.text.measure.advances +// Description:Testing width advances for OffscreenCanvas +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("Testing width advances for OffscreenCanvas"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +deferTest(); +var f = new FontFace("CanvasTest", "/fonts/CanvasTest.ttf"); +let fonts = (self.fonts ? self.fonts : document.fonts); +fonts.add(f); +fonts.ready.then(() => { + step_timeout(t.step_func_done(function () { + ctx.font = '50px CanvasTest'; + ctx.direction = 'ltr'; + ctx.align = 'left' + // Some platforms may return '-0'. + _assertSame(Math.abs(ctx.measureText('Hello').advances[0]), 0, "Math.abs(ctx.measureText('Hello').advances[\""+(0)+"\"])", "0"); + // Different platforms may render text slightly different. + _assert(ctx.measureText('Hello').advances[1] >= 36, "ctx.measureText('Hello').advances[\""+(1)+"\"] >= 36"); + _assert(ctx.measureText('Hello').advances[2] >= 58, "ctx.measureText('Hello').advances[\""+(2)+"\"] >= 58"); + _assert(ctx.measureText('Hello').advances[3] >= 70, "ctx.measureText('Hello').advances[\""+(3)+"\"] >= 70"); + _assert(ctx.measureText('Hello').advances[4] >= 80, "ctx.measureText('Hello').advances[\""+(4)+"\"] >= 80"); + + var tm = ctx.measureText('Hello'); + _assertSame(ctx.measureText('Hello').advances[0], tm.advances[0], "ctx.measureText('Hello').advances[\""+(0)+"\"]", "tm.advances[\""+(0)+"\"]"); + _assertSame(ctx.measureText('Hello').advances[1], tm.advances[1], "ctx.measureText('Hello').advances[\""+(1)+"\"]", "tm.advances[\""+(1)+"\"]"); + _assertSame(ctx.measureText('Hello').advances[2], tm.advances[2], "ctx.measureText('Hello').advances[\""+(2)+"\"]", "tm.advances[\""+(2)+"\"]"); + _assertSame(ctx.measureText('Hello').advances[3], tm.advances[3], "ctx.measureText('Hello').advances[\""+(3)+"\"]", "tm.advances[\""+(3)+"\"]"); + _assertSame(ctx.measureText('Hello').advances[4], tm.advances[4], "ctx.measureText('Hello').advances[\""+(4)+"\"]", "tm.advances[\""+(4)+"\"]"); + }), 500); +}); + +t.done(); + +}); +done();
diff --git a/third_party/blink/web_tests/external/wpt/offscreen-canvas/text/2d.text.measure.baselines.html b/third_party/blink/web_tests/external/wpt/offscreen-canvas/text/2d.text.measure.baselines.html new file mode 100644 index 0000000..7812c4e --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/offscreen-canvas/text/2d.text.measure.baselines.html
@@ -0,0 +1,41 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.text.measure.baselines</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.text.measure.baselines</h1> +<p class="desc">Testing baselines for OffscreenCanvas</p> + + +<script> +var t = async_test("Testing baselines for OffscreenCanvas"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +deferTest(); +var f = new FontFace("CanvasTest", "/fonts/CanvasTest.ttf"); +let fonts = (self.fonts ? self.fonts : document.fonts); +fonts.add(f); +fonts.ready.then(() => { + step_timeout(t.step_func_done(function () { + ctx.font = '50px CanvasTest'; + ctx.direction = 'ltr'; + ctx.align = 'left' + _assertSame(Math.abs(ctx.measureText('A').getBaselines().alphabetic), 0, "Math.abs(ctx.measureText('A').getBaselines().alphabetic)", "0"); + _assertSame(ctx.measureText('A').getBaselines().ideographic, -39, "ctx.measureText('A').getBaselines().ideographic", "-39"); + _assertSame(ctx.measureText('A').getBaselines().hanging, 68, "ctx.measureText('A').getBaselines().hanging", "68"); + + _assertSame(Math.abs(ctx.measureText('ABCD').getBaselines().alphabetic), 0, "Math.abs(ctx.measureText('ABCD').getBaselines().alphabetic)", "0"); + _assertSame(ctx.measureText('ABCD').getBaselines().ideographic, -39, "ctx.measureText('ABCD').getBaselines().ideographic", "-39"); + _assertSame(ctx.measureText('ABCD').getBaselines().hanging, 68, "ctx.measureText('ABCD').getBaselines().hanging", "68"); + }), 500); +}); + +t.done(); + +}); +</script>
diff --git a/third_party/blink/web_tests/external/wpt/offscreen-canvas/text/2d.text.measure.baselines.worker.js b/third_party/blink/web_tests/external/wpt/offscreen-canvas/text/2d.text.measure.baselines.worker.js new file mode 100644 index 0000000..721eccfe --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/offscreen-canvas/text/2d.text.measure.baselines.worker.js
@@ -0,0 +1,37 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.text.measure.baselines +// Description:Testing baselines for OffscreenCanvas +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("Testing baselines for OffscreenCanvas"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +deferTest(); +var f = new FontFace("CanvasTest", "/fonts/CanvasTest.ttf"); +let fonts = (self.fonts ? self.fonts : document.fonts); +fonts.add(f); +fonts.ready.then(() => { + step_timeout(t.step_func_done(function () { + ctx.font = '50px CanvasTest'; + ctx.direction = 'ltr'; + ctx.align = 'left' + _assertSame(Math.abs(ctx.measureText('A').getBaselines().alphabetic), 0, "Math.abs(ctx.measureText('A').getBaselines().alphabetic)", "0"); + _assertSame(ctx.measureText('A').getBaselines().ideographic, -39, "ctx.measureText('A').getBaselines().ideographic", "-39"); + _assertSame(ctx.measureText('A').getBaselines().hanging, 68, "ctx.measureText('A').getBaselines().hanging", "68"); + + _assertSame(Math.abs(ctx.measureText('ABCD').getBaselines().alphabetic), 0, "Math.abs(ctx.measureText('ABCD').getBaselines().alphabetic)", "0"); + _assertSame(ctx.measureText('ABCD').getBaselines().ideographic, -39, "ctx.measureText('ABCD').getBaselines().ideographic", "-39"); + _assertSame(ctx.measureText('ABCD').getBaselines().hanging, 68, "ctx.measureText('ABCD').getBaselines().hanging", "68"); + }), 500); +}); + +t.done(); + +}); +done();
diff --git a/third_party/blink/web_tests/external/wpt/offscreen-canvas/text/2d.text.measure.emHeights.html b/third_party/blink/web_tests/external/wpt/offscreen-canvas/text/2d.text.measure.emHeights.html new file mode 100644 index 0000000..be8be39 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/offscreen-canvas/text/2d.text.measure.emHeights.html
@@ -0,0 +1,41 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.text.measure.emHeights</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.text.measure.emHeights</h1> +<p class="desc">Testing emHeights for OffscreenCanvas</p> + + +<script> +var t = async_test("Testing emHeights for OffscreenCanvas"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +deferTest(); +var f = new FontFace("CanvasTest", "/fonts/CanvasTest.ttf"); +let fonts = (self.fonts ? self.fonts : document.fonts); +fonts.add(f); +fonts.ready.then(() => { + step_timeout(t.step_func_done(function () { + ctx.font = '50px CanvasTest'; + ctx.direction = 'ltr'; + ctx.align = 'left' + _assertSame(ctx.measureText('A').emHeightAscent, 37.5, "ctx.measureText('A').emHeightAscent", "37.5"); + _assertSame(ctx.measureText('A').emHeightDescent, 12.5, "ctx.measureText('A').emHeightDescent", "12.5"); + _assertSame(ctx.measureText('A').emHeightDescent + ctx.measureText('A').emHeightAscent, 50, "ctx.measureText('A').emHeightDescent + ctx.measureText('A').emHeightAscent", "50"); + + _assertSame(ctx.measureText('ABCD').emHeightAscent, 37.5, "ctx.measureText('ABCD').emHeightAscent", "37.5"); + _assertSame(ctx.measureText('ABCD').emHeightDescent, 12.5, "ctx.measureText('ABCD').emHeightDescent", "12.5"); + _assertSame(ctx.measureText('ABCD').emHeightDescent + ctx.measureText('ABCD').emHeightAscent, 50, "ctx.measureText('ABCD').emHeightDescent + ctx.measureText('ABCD').emHeightAscent", "50"); + }), 500); +}); + +t.done(); + +}); +</script>
diff --git a/third_party/blink/web_tests/external/wpt/offscreen-canvas/text/2d.text.measure.emHeights.worker.js b/third_party/blink/web_tests/external/wpt/offscreen-canvas/text/2d.text.measure.emHeights.worker.js new file mode 100644 index 0000000..561bcb8 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/offscreen-canvas/text/2d.text.measure.emHeights.worker.js
@@ -0,0 +1,37 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.text.measure.emHeights +// Description:Testing emHeights for OffscreenCanvas +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("Testing emHeights for OffscreenCanvas"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +deferTest(); +var f = new FontFace("CanvasTest", "/fonts/CanvasTest.ttf"); +let fonts = (self.fonts ? self.fonts : document.fonts); +fonts.add(f); +fonts.ready.then(() => { + step_timeout(t.step_func_done(function () { + ctx.font = '50px CanvasTest'; + ctx.direction = 'ltr'; + ctx.align = 'left' + _assertSame(ctx.measureText('A').emHeightAscent, 37.5, "ctx.measureText('A').emHeightAscent", "37.5"); + _assertSame(ctx.measureText('A').emHeightDescent, 12.5, "ctx.measureText('A').emHeightDescent", "12.5"); + _assertSame(ctx.measureText('A').emHeightDescent + ctx.measureText('A').emHeightAscent, 50, "ctx.measureText('A').emHeightDescent + ctx.measureText('A').emHeightAscent", "50"); + + _assertSame(ctx.measureText('ABCD').emHeightAscent, 37.5, "ctx.measureText('ABCD').emHeightAscent", "37.5"); + _assertSame(ctx.measureText('ABCD').emHeightDescent, 12.5, "ctx.measureText('ABCD').emHeightDescent", "12.5"); + _assertSame(ctx.measureText('ABCD').emHeightDescent + ctx.measureText('ABCD').emHeightAscent, 50, "ctx.measureText('ABCD').emHeightDescent + ctx.measureText('ABCD').emHeightAscent", "50"); + }), 500); +}); + +t.done(); + +}); +done();
diff --git a/third_party/blink/web_tests/external/wpt/offscreen-canvas/text/2d.text.measure.fontBoundingBox.html b/third_party/blink/web_tests/external/wpt/offscreen-canvas/text/2d.text.measure.fontBoundingBox.html new file mode 100644 index 0000000..91e7f5f --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/offscreen-canvas/text/2d.text.measure.fontBoundingBox.html
@@ -0,0 +1,39 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.text.measure.fontBoundingBox</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/canvas-tests.js"></script> + +<h1>2d.text.measure.fontBoundingBox</h1> +<p class="desc">Testing fontBoundingBox for OffscreenCanvas</p> + + +<script> +var t = async_test("Testing fontBoundingBox for OffscreenCanvas"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +deferTest(); +var f = new FontFace("CanvasTest", "/fonts/CanvasTest.ttf"); +let fonts = (self.fonts ? self.fonts : document.fonts); +fonts.add(f); +fonts.ready.then(() => { + step_timeout(t.step_func_done(function () { + ctx.font = '50px CanvasTest'; + ctx.direction = 'ltr'; + ctx.align = 'left' + _assertSame(ctx.measureText('A').fontBoundingBoxAscent, 85, "ctx.measureText('A').fontBoundingBoxAscent", "85"); + _assertSame(ctx.measureText('A').fontBoundingBoxDescent, 39, "ctx.measureText('A').fontBoundingBoxDescent", "39"); + + _assertSame(ctx.measureText('ABCD').fontBoundingBoxAscent, 85, "ctx.measureText('ABCD').fontBoundingBoxAscent", "85"); + _assertSame(ctx.measureText('ABCD').fontBoundingBoxDescent, 39, "ctx.measureText('ABCD').fontBoundingBoxDescent", "39"); + }), 500); +}); + +t.done(); + +}); +</script>
diff --git a/third_party/blink/web_tests/external/wpt/offscreen-canvas/text/2d.text.measure.fontBoundingBox.worker.js b/third_party/blink/web_tests/external/wpt/offscreen-canvas/text/2d.text.measure.fontBoundingBox.worker.js new file mode 100644 index 0000000..b9038bc --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/offscreen-canvas/text/2d.text.measure.fontBoundingBox.worker.js
@@ -0,0 +1,35 @@ +// DO NOT EDIT! This test has been generated by tools/gentest.py. +// OffscreenCanvas test in a worker:2d.text.measure.fontBoundingBox +// Description:Testing fontBoundingBox for OffscreenCanvas +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/common/canvas-tests.js"); + +var t = async_test("Testing fontBoundingBox for OffscreenCanvas"); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +deferTest(); +var f = new FontFace("CanvasTest", "/fonts/CanvasTest.ttf"); +let fonts = (self.fonts ? self.fonts : document.fonts); +fonts.add(f); +fonts.ready.then(() => { + step_timeout(t.step_func_done(function () { + ctx.font = '50px CanvasTest'; + ctx.direction = 'ltr'; + ctx.align = 'left' + _assertSame(ctx.measureText('A').fontBoundingBoxAscent, 85, "ctx.measureText('A').fontBoundingBoxAscent", "85"); + _assertSame(ctx.measureText('A').fontBoundingBoxDescent, 39, "ctx.measureText('A').fontBoundingBoxDescent", "39"); + + _assertSame(ctx.measureText('ABCD').fontBoundingBoxAscent, 85, "ctx.measureText('ABCD').fontBoundingBoxAscent", "85"); + _assertSame(ctx.measureText('ABCD').fontBoundingBoxDescent, 39, "ctx.measureText('ABCD').fontBoundingBoxDescent", "39"); + }), 500); +}); + +t.done(); + +}); +done();
diff --git a/third_party/blink/web_tests/external/wpt/offscreen-canvas/text/2d.text.measure.width.basic.html b/third_party/blink/web_tests/external/wpt/offscreen-canvas/text/2d.text.measure.width.basic.html index a01c1099..4712c1cd 100644 --- a/third_party/blink/web_tests/external/wpt/offscreen-canvas/text/2d.text.measure.width.basic.html +++ b/third_party/blink/web_tests/external/wpt/offscreen-canvas/text/2d.text.measure.width.basic.html
@@ -6,26 +6,31 @@ <script src="/common/canvas-tests.js"></script> <h1>2d.text.measure.width.basic</h1> -<p class="desc"></p> +<p class="desc">The width of character is same as font used for OffscreenCanvas</p> <script> -var t = async_test(""); +var t = async_test("The width of character is same as font used for OffscreenCanvas"); t.step(function() { var offscreenCanvas = new OffscreenCanvas(100, 50); var ctx = offscreenCanvas.getContext('2d'); deferTest(); -step_timeout(t.step_func_done(function () { - ctx.font = '50px CanvasTest'; - _assertSame(ctx.measureText('A').width, 50, "ctx.measureText('A').width", "50"); - _assertSame(ctx.measureText('AA').width, 100, "ctx.measureText('AA').width", "100"); - _assertSame(ctx.measureText('ABCD').width, 200, "ctx.measureText('ABCD').width", "200"); +var f = new FontFace("CanvasTest", "/fonts/CanvasTest.ttf"); +let fonts = (self.fonts ? self.fonts : document.fonts); +fonts.add(f); +fonts.ready.then(() => { + step_timeout(t.step_func_done(function () { + ctx.font = '50px CanvasTest'; + _assertSame(ctx.measureText('A').width, 50, "ctx.measureText('A').width", "50"); + _assertSame(ctx.measureText('AA').width, 100, "ctx.measureText('AA').width", "100"); + _assertSame(ctx.measureText('ABCD').width, 200, "ctx.measureText('ABCD').width", "200"); - ctx.font = '100px CanvasTest'; - _assertSame(ctx.measureText('A').width, 100, "ctx.measureText('A').width", "100"); -}), 500); + ctx.font = '100px CanvasTest'; + _assertSame(ctx.measureText('A').width, 100, "ctx.measureText('A').width", "100"); + }), 500); +}); t.done();
diff --git a/third_party/blink/web_tests/external/wpt/offscreen-canvas/text/2d.text.measure.width.basic.worker.js b/third_party/blink/web_tests/external/wpt/offscreen-canvas/text/2d.text.measure.width.basic.worker.js index b4ca23b..b646b78 100644 --- a/third_party/blink/web_tests/external/wpt/offscreen-canvas/text/2d.text.measure.width.basic.worker.js +++ b/third_party/blink/web_tests/external/wpt/offscreen-canvas/text/2d.text.measure.width.basic.worker.js
@@ -1,27 +1,32 @@ // DO NOT EDIT! This test has been generated by tools/gentest.py. // OffscreenCanvas test in a worker:2d.text.measure.width.basic -// Description: +// Description:The width of character is same as font used for OffscreenCanvas // Note: importScripts("/resources/testharness.js"); importScripts("/common/canvas-tests.js"); -var t = async_test(""); +var t = async_test("The width of character is same as font used for OffscreenCanvas"); t.step(function() { var offscreenCanvas = new OffscreenCanvas(100, 50); var ctx = offscreenCanvas.getContext('2d'); deferTest(); -step_timeout(t.step_func_done(function () { - ctx.font = '50px CanvasTest'; - _assertSame(ctx.measureText('A').width, 50, "ctx.measureText('A').width", "50"); - _assertSame(ctx.measureText('AA').width, 100, "ctx.measureText('AA').width", "100"); - _assertSame(ctx.measureText('ABCD').width, 200, "ctx.measureText('ABCD').width", "200"); +var f = new FontFace("CanvasTest", "/fonts/CanvasTest.ttf"); +let fonts = (self.fonts ? self.fonts : document.fonts); +fonts.add(f); +fonts.ready.then(() => { + step_timeout(t.step_func_done(function () { + ctx.font = '50px CanvasTest'; + _assertSame(ctx.measureText('A').width, 50, "ctx.measureText('A').width", "50"); + _assertSame(ctx.measureText('AA').width, 100, "ctx.measureText('AA').width", "100"); + _assertSame(ctx.measureText('ABCD').width, 200, "ctx.measureText('ABCD').width", "200"); - ctx.font = '100px CanvasTest'; - _assertSame(ctx.measureText('A').width, 100, "ctx.measureText('A').width", "100"); -}), 500); + ctx.font = '100px CanvasTest'; + _assertSame(ctx.measureText('A').width, 100, "ctx.measureText('A').width", "100"); + }), 500); +}); t.done();
diff --git a/third_party/blink/web_tests/external/wpt/offscreen-canvas/text/2d.text.measure.width.empty.html b/third_party/blink/web_tests/external/wpt/offscreen-canvas/text/2d.text.measure.width.empty.html index 6173d18..1f48f77 100644 --- a/third_party/blink/web_tests/external/wpt/offscreen-canvas/text/2d.text.measure.width.empty.html +++ b/third_party/blink/web_tests/external/wpt/offscreen-canvas/text/2d.text.measure.width.empty.html
@@ -6,21 +6,26 @@ <script src="/common/canvas-tests.js"></script> <h1>2d.text.measure.width.empty</h1> -<p class="desc">The empty string has zero width</p> +<p class="desc">The empty string has zero width for OffscreenCanvas</p> <script> -var t = async_test("The empty string has zero width"); +var t = async_test("The empty string has zero width for OffscreenCanvas"); t.step(function() { var offscreenCanvas = new OffscreenCanvas(100, 50); var ctx = offscreenCanvas.getContext('2d'); deferTest(); -step_timeout(t.step_func_done(function () { - ctx.font = '50px CanvasTest'; - _assertSame(ctx.measureText("").width, 0, "ctx.measureText(\"\").width", "0"); -}), 500); +var f = new FontFace("CanvasTest", "/fonts/CanvasTest.ttf"); +let fonts = (self.fonts ? self.fonts : document.fonts); +fonts.add(f); +fonts.ready.then(() => { + step_timeout(t.step_func_done(function () { + ctx.font = '50px CanvasTest'; + _assertSame(ctx.measureText("").width, 0, "ctx.measureText(\"\").width", "0"); + }), 500); +}); t.done();
diff --git a/third_party/blink/web_tests/external/wpt/offscreen-canvas/text/2d.text.measure.width.empty.worker.js b/third_party/blink/web_tests/external/wpt/offscreen-canvas/text/2d.text.measure.width.empty.worker.js index d9c71af..35dca25 100644 --- a/third_party/blink/web_tests/external/wpt/offscreen-canvas/text/2d.text.measure.width.empty.worker.js +++ b/third_party/blink/web_tests/external/wpt/offscreen-canvas/text/2d.text.measure.width.empty.worker.js
@@ -1,22 +1,27 @@ // DO NOT EDIT! This test has been generated by tools/gentest.py. // OffscreenCanvas test in a worker:2d.text.measure.width.empty -// Description:The empty string has zero width +// Description:The empty string has zero width for OffscreenCanvas // Note: importScripts("/resources/testharness.js"); importScripts("/common/canvas-tests.js"); -var t = async_test("The empty string has zero width"); +var t = async_test("The empty string has zero width for OffscreenCanvas"); t.step(function() { var offscreenCanvas = new OffscreenCanvas(100, 50); var ctx = offscreenCanvas.getContext('2d'); deferTest(); -step_timeout(t.step_func_done(function () { - ctx.font = '50px CanvasTest'; - _assertSame(ctx.measureText("").width, 0, "ctx.measureText(\"\").width", "0"); -}), 500); +var f = new FontFace("CanvasTest", "/fonts/CanvasTest.ttf"); +let fonts = (self.fonts ? self.fonts : document.fonts); +fonts.add(f); +fonts.ready.then(() => { + step_timeout(t.step_func_done(function () { + ctx.font = '50px CanvasTest'; + _assertSame(ctx.measureText("").width, 0, "ctx.measureText(\"\").width", "0"); + }), 500); +}); t.done();
diff --git a/third_party/blink/web_tests/external/wpt/offscreen-canvas/text/2d.text.measure.width.space.html b/third_party/blink/web_tests/external/wpt/offscreen-canvas/text/2d.text.measure.width.space.html index b4cdc8b..bfe89568 100644 --- a/third_party/blink/web_tests/external/wpt/offscreen-canvas/text/2d.text.measure.width.space.html +++ b/third_party/blink/web_tests/external/wpt/offscreen-canvas/text/2d.text.measure.width.space.html
@@ -6,27 +6,32 @@ <script src="/common/canvas-tests.js"></script> <h1>2d.text.measure.width.space</h1> -<p class="desc">Space characters are converted to U+0020 and collapsed (per CSS)</p> +<p class="desc">Space characters are converted to U+0020 and collapsed (per CSS) for OffscreenCanvas</p> <script> -var t = async_test("Space characters are converted to U+0020 and collapsed (per CSS)"); +var t = async_test("Space characters are converted to U+0020 and collapsed (per CSS) for OffscreenCanvas"); t.step(function() { var offscreenCanvas = new OffscreenCanvas(100, 50); var ctx = offscreenCanvas.getContext('2d'); deferTest(); -step_timeout(t.step_func_done(function () { - ctx.font = '50px CanvasTest'; - _assertSame(ctx.measureText('A B').width, 150, "ctx.measureText('A B').width", "150"); - _assertSame(ctx.measureText('A B').width, 150, "ctx.measureText('A B').width", "150"); - _assertSame(ctx.measureText('A \x09\x0a\x0c\x0d \x09\x0a\x0c\x0dB').width, 150, "ctx.measureText('A \\x09\\x0a\\x0c\\x0d \\x09\\x0a\\x0c\\x0dB').width", "150"); - _assert(ctx.measureText('A \x0b B').width >= 200, "ctx.measureText('A \\x0b B').width >= 200"); +var f = new FontFace("CanvasTest", "/fonts/CanvasTest.ttf"); +let fonts = (self.fonts ? self.fonts : document.fonts); +fonts.add(f); +fonts.ready.then(() => { + step_timeout(t.step_func_done(function () { + ctx.font = '50px CanvasTest'; + _assertSame(ctx.measureText('A B').width, 150, "ctx.measureText('A B').width", "150"); + _assertSame(ctx.measureText('A B').width, 150, "ctx.measureText('A B').width", "150"); + _assertSame(ctx.measureText('A \x09\x0a\x0c\x0d \x09\x0a\x0c\x0dB').width, 150, "ctx.measureText('A \\x09\\x0a\\x0c\\x0d \\x09\\x0a\\x0c\\x0dB').width", "150"); + _assert(ctx.measureText('A \x0b B').width >= 200, "ctx.measureText('A \\x0b B').width >= 200"); - _assertSame(ctx.measureText(' AB').width, 100, "ctx.measureText(' AB').width", "100"); - _assertSame(ctx.measureText('AB ').width, 100, "ctx.measureText('AB ').width", "100"); -}), 500); + _assertSame(ctx.measureText(' AB').width, 100, "ctx.measureText(' AB').width", "100"); + _assertSame(ctx.measureText('AB ').width, 100, "ctx.measureText('AB ').width", "100"); + }), 500); +}); t.done();
diff --git a/third_party/blink/web_tests/external/wpt/offscreen-canvas/text/2d.text.measure.width.space.worker.js b/third_party/blink/web_tests/external/wpt/offscreen-canvas/text/2d.text.measure.width.space.worker.js index 5fc91b8488..25b594a 100644 --- a/third_party/blink/web_tests/external/wpt/offscreen-canvas/text/2d.text.measure.width.space.worker.js +++ b/third_party/blink/web_tests/external/wpt/offscreen-canvas/text/2d.text.measure.width.space.worker.js
@@ -1,28 +1,33 @@ // DO NOT EDIT! This test has been generated by tools/gentest.py. // OffscreenCanvas test in a worker:2d.text.measure.width.space -// Description:Space characters are converted to U+0020 and collapsed (per CSS) +// Description:Space characters are converted to U+0020 and collapsed (per CSS) for OffscreenCanvas // Note: importScripts("/resources/testharness.js"); importScripts("/common/canvas-tests.js"); -var t = async_test("Space characters are converted to U+0020 and collapsed (per CSS)"); +var t = async_test("Space characters are converted to U+0020 and collapsed (per CSS) for OffscreenCanvas"); t.step(function() { var offscreenCanvas = new OffscreenCanvas(100, 50); var ctx = offscreenCanvas.getContext('2d'); deferTest(); -step_timeout(t.step_func_done(function () { - ctx.font = '50px CanvasTest'; - _assertSame(ctx.measureText('A B').width, 150, "ctx.measureText('A B').width", "150"); - _assertSame(ctx.measureText('A B').width, 150, "ctx.measureText('A B').width", "150"); - _assertSame(ctx.measureText('A \x09\x0a\x0c\x0d \x09\x0a\x0c\x0dB').width, 150, "ctx.measureText('A \\x09\\x0a\\x0c\\x0d \\x09\\x0a\\x0c\\x0dB').width", "150"); - _assert(ctx.measureText('A \x0b B').width >= 200, "ctx.measureText('A \\x0b B').width >= 200"); +var f = new FontFace("CanvasTest", "/fonts/CanvasTest.ttf"); +let fonts = (self.fonts ? self.fonts : document.fonts); +fonts.add(f); +fonts.ready.then(() => { + step_timeout(t.step_func_done(function () { + ctx.font = '50px CanvasTest'; + _assertSame(ctx.measureText('A B').width, 150, "ctx.measureText('A B').width", "150"); + _assertSame(ctx.measureText('A B').width, 150, "ctx.measureText('A B').width", "150"); + _assertSame(ctx.measureText('A \x09\x0a\x0c\x0d \x09\x0a\x0c\x0dB').width, 150, "ctx.measureText('A \\x09\\x0a\\x0c\\x0d \\x09\\x0a\\x0c\\x0dB').width", "150"); + _assert(ctx.measureText('A \x0b B').width >= 200, "ctx.measureText('A \\x0b B').width >= 200"); - _assertSame(ctx.measureText(' AB').width, 100, "ctx.measureText(' AB').width", "100"); - _assertSame(ctx.measureText('AB ').width, 100, "ctx.measureText('AB ').width", "100"); -}), 500); + _assertSame(ctx.measureText(' AB').width, 100, "ctx.measureText(' AB').width", "100"); + _assertSame(ctx.measureText('AB ').width, 100, "ctx.measureText('AB ').width", "100"); + }), 500); +}); t.done();
diff --git a/third_party/blink/web_tests/external/wpt/offscreen-canvas/tools/tests2d.yaml b/third_party/blink/web_tests/external/wpt/offscreen-canvas/tools/tests2d.yaml index ed712922..0aaad783 100644 --- a/third_party/blink/web_tests/external/wpt/offscreen-canvas/tools/tests2d.yaml +++ b/third_party/blink/web_tests/external/wpt/offscreen-canvas/tools/tests2d.yaml
@@ -10186,52 +10186,208 @@ expected: green - name: 2d.text.measure.width.basic + desc: The width of character is same as font used for OffscreenCanvas testing: - 2d.text.measure fonts: - CanvasTest code: | deferTest(); - step_timeout(t.step_func_done(function () { - ctx.font = '50px CanvasTest'; - @assert ctx.measureText('A').width === 50; - @assert ctx.measureText('AA').width === 100; - @assert ctx.measureText('ABCD').width === 200; + var f = new FontFace("CanvasTest", "/fonts/CanvasTest.ttf"); + let fonts = (self.fonts ? self.fonts : document.fonts); + fonts.add(f); + fonts.ready.then(() => { + step_timeout(t.step_func_done(function () { + ctx.font = '50px CanvasTest'; + @assert ctx.measureText('A').width === 50; + @assert ctx.measureText('AA').width === 100; + @assert ctx.measureText('ABCD').width === 200; - ctx.font = '100px CanvasTest'; - @assert ctx.measureText('A').width === 100; - }), 500); + ctx.font = '100px CanvasTest'; + @assert ctx.measureText('A').width === 100; + }), 500); + }); - name: 2d.text.measure.width.empty - desc: The empty string has zero width + desc: The empty string has zero width for OffscreenCanvas testing: - 2d.text.measure fonts: - CanvasTest code: | deferTest(); - step_timeout(t.step_func_done(function () { - ctx.font = '50px CanvasTest'; - @assert ctx.measureText("").width === 0; - }), 500); + var f = new FontFace("CanvasTest", "/fonts/CanvasTest.ttf"); + let fonts = (self.fonts ? self.fonts : document.fonts); + fonts.add(f); + fonts.ready.then(() => { + step_timeout(t.step_func_done(function () { + ctx.font = '50px CanvasTest'; + @assert ctx.measureText("").width === 0; + }), 500); + }); - name: 2d.text.measure.width.space - desc: Space characters are converted to U+0020 and collapsed (per CSS) + desc: Space characters are converted to U+0020 and collapsed (per CSS) for OffscreenCanvas testing: - 2d.text.measure.spaces fonts: - CanvasTest code: | deferTest(); - step_timeout(t.step_func_done(function () { - ctx.font = '50px CanvasTest'; - @assert ctx.measureText('A B').width === 150; - @assert ctx.measureText('A B').width === 150; @moz-todo - @assert ctx.measureText('A \x09\x0a\x0c\x0d \x09\x0a\x0c\x0dB').width === 150; @moz-todo - @assert ctx.measureText('A \x0b B').width >= 200; + var f = new FontFace("CanvasTest", "/fonts/CanvasTest.ttf"); + let fonts = (self.fonts ? self.fonts : document.fonts); + fonts.add(f); + fonts.ready.then(() => { + step_timeout(t.step_func_done(function () { + ctx.font = '50px CanvasTest'; + @assert ctx.measureText('A B').width === 150; + @assert ctx.measureText('A B').width === 150; @moz-todo + @assert ctx.measureText('A \x09\x0a\x0c\x0d \x09\x0a\x0c\x0dB').width === 150; @moz-todo + @assert ctx.measureText('A \x0b B').width >= 200; - @assert ctx.measureText(' AB').width === 100; @moz-todo - @assert ctx.measureText('AB ').width === 100; @moz-todo - }), 500); + @assert ctx.measureText(' AB').width === 100; @moz-todo + @assert ctx.measureText('AB ').width === 100; @moz-todo + }), 500); + }); + +- name: 2d.text.measure.advances + desc: Testing width advances for OffscreenCanvas + testing: + - 2d.text.measure.advances + fonts: + - CanvasTest + code: | + deferTest(); + var f = new FontFace("CanvasTest", "/fonts/CanvasTest.ttf"); + let fonts = (self.fonts ? self.fonts : document.fonts); + fonts.add(f); + fonts.ready.then(() => { + step_timeout(t.step_func_done(function () { + ctx.font = '50px CanvasTest'; + ctx.direction = 'ltr'; + ctx.align = 'left' + // Some platforms may return '-0'. + @assert Math.abs(ctx.measureText('Hello').advances[0]) === 0; + // Different platforms may render text slightly different. + @assert ctx.measureText('Hello').advances[1] >= 36; + @assert ctx.measureText('Hello').advances[2] >= 58; + @assert ctx.measureText('Hello').advances[3] >= 70; + @assert ctx.measureText('Hello').advances[4] >= 80; + + var tm = ctx.measureText('Hello'); + @assert ctx.measureText('Hello').advances[0] === tm.advances[0]; + @assert ctx.measureText('Hello').advances[1] === tm.advances[1]; + @assert ctx.measureText('Hello').advances[2] === tm.advances[2]; + @assert ctx.measureText('Hello').advances[3] === tm.advances[3]; + @assert ctx.measureText('Hello').advances[4] === tm.advances[4]; + }), 500); + }); + +- name: 2d.text.measure.actualBoundingBox + desc: Testing actualBoundingBox for OffscreenCanvas + testing: + - 2d.text.measure.actualBoundingBox + fonts: + - CanvasTest + code: | + deferTest(); + var f = new FontFace("CanvasTest", "/fonts/CanvasTest.ttf"); + let fonts = (self.fonts ? self.fonts : document.fonts); + fonts.add(f); + fonts.ready.then(() => { + step_timeout(t.step_func_done(function () { + ctx.font = '50px CanvasTest'; + ctx.direction = 'ltr'; + ctx.align = 'left' + ctx.baseline = 'alphabetic' + // Some platforms may return '-0'. + @assert Math.abs(ctx.measureText('A').actualBoundingBoxLeft) === 0; + // Different platforms may render text slightly different. + @assert ctx.measureText('A').actualBoundingBoxRight >= 50; + @assert ctx.measureText('A').actualBoundingBoxAscent >= 35; + @assert Math.abs(ctx.measureText('A').actualBoundingBoxDescent) === 0; + + @assert Math.abs(ctx.measureText('ABCD').actualBoundingBoxLeft) === 0; + @assert ctx.measureText('ABCD').actualBoundingBoxRight >= 200; + @assert ctx.measureText('ABCD').actualBoundingBoxAscent >= 85; + @assert ctx.measureText('ABCD').actualBoundingBoxDescent >= 37; + }), 500); + }); + +- name: 2d.text.measure.fontBoundingBox + desc: Testing fontBoundingBox for OffscreenCanvas + testing: + - 2d.text.measure.fontBoundingBox + fonts: + - CanvasTest + code: | + deferTest(); + var f = new FontFace("CanvasTest", "/fonts/CanvasTest.ttf"); + let fonts = (self.fonts ? self.fonts : document.fonts); + fonts.add(f); + fonts.ready.then(() => { + step_timeout(t.step_func_done(function () { + ctx.font = '50px CanvasTest'; + ctx.direction = 'ltr'; + ctx.align = 'left' + @assert ctx.measureText('A').fontBoundingBoxAscent === 85; + @assert ctx.measureText('A').fontBoundingBoxDescent === 39; + + @assert ctx.measureText('ABCD').fontBoundingBoxAscent === 85; + @assert ctx.measureText('ABCD').fontBoundingBoxDescent === 39; + }), 500); + }); + +- name: 2d.text.measure.emHeights + desc: Testing emHeights for OffscreenCanvas + testing: + - 2d.text.measure.emHeights + fonts: + - CanvasTest + code: | + deferTest(); + var f = new FontFace("CanvasTest", "/fonts/CanvasTest.ttf"); + let fonts = (self.fonts ? self.fonts : document.fonts); + fonts.add(f); + fonts.ready.then(() => { + step_timeout(t.step_func_done(function () { + ctx.font = '50px CanvasTest'; + ctx.direction = 'ltr'; + ctx.align = 'left' + @assert ctx.measureText('A').emHeightAscent === 37.5; + @assert ctx.measureText('A').emHeightDescent === 12.5; + @assert ctx.measureText('A').emHeightDescent + ctx.measureText('A').emHeightAscent === 50; + + @assert ctx.measureText('ABCD').emHeightAscent === 37.5; + @assert ctx.measureText('ABCD').emHeightDescent === 12.5; + @assert ctx.measureText('ABCD').emHeightDescent + ctx.measureText('ABCD').emHeightAscent === 50; + }), 500); + }); + +- name: 2d.text.measure.baselines + desc: Testing baselines for OffscreenCanvas + testing: + - 2d.text.measure.baselines + fonts: + - CanvasTest + code: | + deferTest(); + var f = new FontFace("CanvasTest", "/fonts/CanvasTest.ttf"); + let fonts = (self.fonts ? self.fonts : document.fonts); + fonts.add(f); + fonts.ready.then(() => { + step_timeout(t.step_func_done(function () { + ctx.font = '50px CanvasTest'; + ctx.direction = 'ltr'; + ctx.align = 'left' + @assert Math.abs(ctx.measureText('A').getBaselines().alphabetic) === 0; + @assert ctx.measureText('A').getBaselines().ideographic === -39; + @assert ctx.measureText('A').getBaselines().hanging === 68; + + @assert Math.abs(ctx.measureText('ABCD').getBaselines().alphabetic) === 0; + @assert ctx.measureText('ABCD').getBaselines().ideographic === -39; + @assert ctx.measureText('ABCD').getBaselines().hanging === 68; + }), 500); + }); # TODO: shadows, alpha, composite, clip
diff --git a/third_party/blink/web_tests/external/wpt/service-workers/service-worker/postmessage.https.html b/third_party/blink/web_tests/external/wpt/service-workers/service-worker/postmessage.https.html index b1f3342..7abb302 100644 --- a/third_party/blink/web_tests/external/wpt/service-workers/service-worker/postmessage.https.html +++ b/third_party/blink/web_tests/external/wpt/service-workers/service-worker/postmessage.https.html
@@ -39,15 +39,6 @@ .then(e => { assert_equals(e.data, 'quit'); return registration.unregister(scope); - }) - .then(() => { return wait_for_state(t, worker, 'redundant'); }) - .then(() => { - assert_equals(worker.state, 'redundant'); - assert_throws( - {name:'InvalidStateError'}, - function() { worker.postMessage(''); }, - 'Calling postMessage on a redundant ServiceWorker should ' + - 'throw InvalidStateError.'); }); }, 'postMessage to a ServiceWorker (and back via MessagePort)'); @@ -178,4 +169,34 @@ }); }, 'postMessage with dictionary a transferable ArrayBuffer between ServiceWorker and Client'); + promise_test(async t => { + const firstScript = 'resources/postmessage-echo-worker.js?one'; + const secondScript = 'resources/postmessage-echo-worker.js?two'; + const scope = 'resources/'; + + const registration = await service_worker_unregister_and_register(t, firstScript, scope); + t.add_cleanup(() => registration.unregister()); + const firstWorker = registration.installing; + + const messagePromise = new Promise(resolve => { + navigator.serviceWorker.addEventListener('message', (event) => { + resolve(event.data); + }, {once: true}); + }); + + await wait_for_state(t, firstWorker, 'activated'); + await navigator.serviceWorker.register(secondScript, {scope}); + const secondWorker = registration.installing; + await wait_for_state(t, firstWorker, 'redundant'); + + // postMessage() to a redundant worker should be dropped silently. + // Historically, this threw an exception. + firstWorker.postMessage('firstWorker'); + + // To test somewhat that it was not received, send a message to another + // worker and check that we get a reply for that one. + secondWorker.postMessage('secondWorker'); + const data = await messagePromise; + assert_equals(data, 'secondWorker'); + }, 'postMessage to a redundant worker'); </script>
diff --git a/third_party/blink/web_tests/external/wpt/service-workers/service-worker/resources/postmessage-echo-worker.js b/third_party/blink/web_tests/external/wpt/service-workers/service-worker/resources/postmessage-echo-worker.js new file mode 100644 index 0000000..f088ad1 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/service-workers/service-worker/resources/postmessage-echo-worker.js
@@ -0,0 +1,3 @@ +self.addEventListener('message', event => { + event.source.postMessage(event.data); +});
diff --git a/third_party/blink/web_tests/fast/multicol/hit-test-end-of-column-with-line-height.html b/third_party/blink/web_tests/fast/multicol/hit-test-end-of-column-with-line-height.html index 49b6f63..b337d9f 100644 --- a/third_party/blink/web_tests/fast/multicol/hit-test-end-of-column-with-line-height.html +++ b/third_party/blink/web_tests/fast/multicol/hit-test-end-of-column-with-line-height.html
@@ -36,7 +36,7 @@ // Clicking above the last line in the first column should not select anything from the first // line on the second column. - hitOffset = document.caretRangeFromPoint(target.offsetLeft + 80, target.offsetTop + 193).startOffset; + hitOffset = document.caretRangeFromPoint(target.offsetLeft + 2, target.offsetTop + 193).startOffset; log(hitOffset === 11 ? "PASS" : "FAIL: hit offset " + hitOffset + "."); // Clicking below the first line in the second column should not snap to the beginning of the line.
diff --git a/third_party/blink/web_tests/fast/serviceworker/serviceworkercontainer-interface.html b/third_party/blink/web_tests/fast/serviceworker/serviceworkercontainer-interface.html index 88e28ce..1fe693e 100644 --- a/third_party/blink/web_tests/fast/serviceworker/serviceworkercontainer-interface.html +++ b/third_party/blink/web_tests/fast/serviceworker/serviceworkercontainer-interface.html
@@ -2,13 +2,6 @@ <script src="../../resources/testharness.js"></script> <script src="../../resources/testharnessreport.js"></script> <script> -function getPropertyDescriptor(name) { - return ( - Object.getOwnPropertyDescriptor(ServiceWorkerContainer.prototype, name) || - // FIXME: Remove this when http://crbug.com/43394 is fixed. - Object.getOwnPropertyDescriptor(navigator.serviceWorker, name)); -} - test(function() { assert_true('ServiceWorkerContainer' in window, 'the constructor should be defined');
diff --git a/third_party/blink/web_tests/fast/spatial-navigation/resources/mock-snav-service.js b/third_party/blink/web_tests/fast/spatial-navigation/resources/mock-snav-service.js index d475a8e7..4808163 100644 --- a/third_party/blink/web_tests/fast/spatial-navigation/resources/mock-snav-service.js +++ b/third_party/blink/web_tests/fast/spatial-navigation/resources/mock-snav-service.js
@@ -4,6 +4,7 @@ constructor() { this.canExitFocus = false; this.canSelectElement = false; + this.isFormFocused = false; this.hasNextFormElement = false; this.hasDefaultVideoControls = false; this.callback = null; @@ -18,6 +19,7 @@ spatialNavigationStateChanged(state) { this.canExitFocus = state.canExitFocus; this.canSelectElement = state.canSelectElement; + this.isFormFocused = state.isFormFocused; this.hasNextFormElement = state.hasNextFormElement; this.hasDefaultVideoControls = state.hasDefaultVideoControls; if (this.callback) {
diff --git a/third_party/blink/web_tests/fast/writing-mode/text-combine-line-break.html b/third_party/blink/web_tests/fast/writing-mode/text-combine-line-break.html index 3a9d1821..11917d8 100644 --- a/third_party/blink/web_tests/fast/writing-mode/text-combine-line-break.html +++ b/third_party/blink/web_tests/fast/writing-mode/text-combine-line-break.html
@@ -48,7 +48,8 @@ var block = element.parentElement.getBoundingClientRect() var column = rect.top - block.top; var row = block.right - rect.right; - return [Math.round(column / 20), Math.round(row / 20)]; + // "+ 1 - 1" is to convert -0 to 0. + return [Math.round(column / 20) + 1 - 1, Math.round(row / 20) + 1 - 1]; } })();
diff --git a/third_party/blink/web_tests/flag-specific/enable-blink-features=LayoutNG/paint/invalidation/selection/selection-clear-expected.txt b/third_party/blink/web_tests/flag-specific/enable-blink-features=LayoutNG/paint/invalidation/selection/selection-clear-expected.txt index a5919eee6..eed918d 100644 --- a/third_party/blink/web_tests/flag-specific/enable-blink-features=LayoutNG/paint/invalidation/selection/selection-clear-expected.txt +++ b/third_party/blink/web_tests/flag-specific/enable-blink-features=LayoutNG/paint/invalidation/selection/selection-clear-expected.txt
@@ -19,8 +19,18 @@ "paintInvalidations": [ { "object": "NGPhysicalBoxFragment LayoutNGBlockFlow DIV id='firstLine'", - "rect": [8, 108, 100, 100], - "reason": "incremental" + "rect": [8, 8, 100, 200], + "reason": "disappeared" + }, + { + "object": "NGPhysicalBoxFragment LayoutNGBlockFlow DIV id='firstLine'", + "rect": [8, 8, 100, 100], + "reason": "appeared" + }, + { + "object": "NGPhysicalTextFragment 'FAIL: Test did'", + "rect": [8, 8, 97, 200], + "reason": "disappeared" }, { "object": "NGPhysicalTextFragment 'not run'", @@ -29,7 +39,7 @@ }, { "object": "NGPhysicalTextFragment '\u00A0'", - "rect": [8, 8, 97, 200], + "rect": [8, 8, 8, 100], "reason": "appeared" } ]
diff --git a/third_party/blink/web_tests/flag-specific/enable-blink-features=LayoutNG/paint/invalidation/text-match-document-change-expected.txt b/third_party/blink/web_tests/flag-specific/enable-blink-features=LayoutNG/paint/invalidation/text-match-document-change-expected.txt index eb3f1e6..a36d79c5 100644 --- a/third_party/blink/web_tests/flag-specific/enable-blink-features=LayoutNG/paint/invalidation/text-match-document-change-expected.txt +++ b/third_party/blink/web_tests/flag-specific/enable-blink-features=LayoutNG/paint/invalidation/text-match-document-change-expected.txt
@@ -18,16 +18,21 @@ "backgroundColor": "#FFFFFF", "paintInvalidations": [ { - "object": "NGPhysicalTextFragment 'After change'", - "rect": [18, 130, 251, 39], - "reason": "appeared" - }, - { "object": "NGPhysicalTextFragment 'Find-in-page 'findme', then click here)'", "rect": [18, 130, 251, 39], "reason": "disappeared" }, { + "object": "NGPhysicalTextFragment 'To be changed: findme (Manual testing:'", + "rect": [18, 130, 251, 39], + "reason": "disappeared" + }, + { + "object": "NGPhysicalTextFragment 'After change'", + "rect": [18, 130, 82, 19], + "reason": "appeared" + }, + { "object": "VerticalScrollbar", "rect": [295, 102, 15, 400], "reason": "scroll control"
diff --git a/third_party/blink/web_tests/http/tests/devtools/service-workers/service-workers-redundant-expected.txt b/third_party/blink/web_tests/http/tests/devtools/service-workers/service-workers-redundant-expected.txt index 8494d0c..838d5e2 100644 --- a/third_party/blink/web_tests/http/tests/devtools/service-workers/service-workers-redundant-expected.txt +++ b/third_party/blink/web_tests/http/tests/devtools/service-workers/service-workers-redundant-expected.txt
@@ -2,7 +2,7 @@ The first ServiceWorker is activated. ==== ServiceWorkersView ==== -127.0.0.1:8000/devtools/service-workers/resources/service-worker-redundant-scope +http://127.0.0.1:8000/devtools/service-workers/resources/service-worker-redundant-scope/ Update Unregister Source @@ -19,7 +19,7 @@ ============================ The second Serviceworker is installed. ==== ServiceWorkersView ==== -127.0.0.1:8000/devtools/service-workers/resources/service-worker-redundant-scope +http://127.0.0.1:8000/devtools/service-workers/resources/service-worker-redundant-scope/ Update Unregister Source @@ -41,7 +41,7 @@ ============================ The first ServiceWorker worker became redundant and stopped. ==== ServiceWorkersView ==== -127.0.0.1:8000/devtools/service-workers/resources/service-worker-redundant-scope +http://127.0.0.1:8000/devtools/service-workers/resources/service-worker-redundant-scope/ Update Unregister Source
diff --git a/third_party/blink/web_tests/http/tests/devtools/service-workers/service-workers-view-expected.txt b/third_party/blink/web_tests/http/tests/devtools/service-workers/service-workers-view-expected.txt index a890fe1f..b2e4e1f1 100644 --- a/third_party/blink/web_tests/http/tests/devtools/service-workers/service-workers-view-expected.txt +++ b/third_party/blink/web_tests/http/tests/devtools/service-workers/service-workers-view-expected.txt
@@ -2,7 +2,7 @@ Select ServiceWorkers tree element. Register ServiceWorker for scope1 -127.0.0.1:8000/devtools/service-workers/resources/scope1 +http://127.0.0.1:8000/devtools/service-workers/resources/scope1/ Update Unregister Source @@ -17,7 +17,7 @@ Sync Sync Register ServiceWorker for scope2 -127.0.0.1:8000/devtools/service-workers/resources/scope2 +http://127.0.0.1:8000/devtools/service-workers/resources/scope2 Update Unregister Source @@ -31,7 +31,7 @@ Push Sync Sync -127.0.0.1:8000/devtools/service-workers/resources/scope1 +http://127.0.0.1:8000/devtools/service-workers/resources/scope1/ Update Unregister Source @@ -46,7 +46,7 @@ Sync Sync Unregister ServiceWorker for scope1 -127.0.0.1:8000/devtools/service-workers/resources/scope2 +http://127.0.0.1:8000/devtools/service-workers/resources/scope2 Update Unregister Source @@ -60,7 +60,7 @@ Push Sync Sync -127.0.0.1:8000/devtools/service-workers/resources/scope1 - deleted +http://127.0.0.1:8000/devtools/service-workers/resources/scope1/ - deleted Update Unregister Source
diff --git a/third_party/blink/web_tests/http/tests/devtools/service-workers/service-workers-view.js b/third_party/blink/web_tests/http/tests/devtools/service-workers/service-workers-view.js index 2d67701..bc5be4f 100644 --- a/third_party/blink/web_tests/http/tests/devtools/service-workers/service-workers-view.js +++ b/third_party/blink/web_tests/http/tests/devtools/service-workers/service-workers-view.js
@@ -12,8 +12,8 @@ await TestRunner.showPanel('resources'); var scriptURL = 'http://127.0.0.1:8000/devtools/service-workers/resources/service-worker-empty.js'; - var scope1 = 'http://127.0.0.1:8000/devtools/service-workers/resources/scope1/'; - var scope2 = 'http://127.0.0.1:8000/devtools/service-workers/resources/scope2/'; + var scope1 = 'http://127.0.0.1:8000/devtools/service-workers/resources/scope1/'; // with trailing '/' + var scope2 = 'http://127.0.0.1:8000/devtools/service-workers/resources/scope2'; // without trailing '/' var step = 0; Resources.ServiceWorkersView._noThrottle = true;
diff --git a/third_party/blink/web_tests/notes.txt b/third_party/blink/web_tests/notes.txt new file mode 100644 index 0000000..79bab2e --- /dev/null +++ b/third_party/blink/web_tests/notes.txt
@@ -0,0 +1,8 @@ + +What if they set animation-delay to 5s +and then read animation +Should it be "5s" or "0s 5s" ? + +What if they set animation-name to Paused +and then read animation +Should it be "Paused" or "running Paused" ?
diff --git a/third_party/blink/web_tests/platform/mac/virtual/scalefactor200/css3/filters/effect-reference-subregion-hw-expected.txt b/third_party/blink/web_tests/platform/mac/virtual/scalefactor200/css3/filters/effect-reference-subregion-hw-expected.txt new file mode 100644 index 0000000..5a6ac0b --- /dev/null +++ b/third_party/blink/web_tests/platform/mac/virtual/scalefactor200/css3/filters/effect-reference-subregion-hw-expected.txt
@@ -0,0 +1,2 @@ +Content-Type: text/plain +#EOF
diff --git a/third_party/blink/web_tests/virtual/blink-cors/external/wpt/fetch/sec-metadata/redirect/multiple-redirect-https-downgrade-upgrade.tentative.sub-expected.txt b/third_party/blink/web_tests/virtual/blink-cors/external/wpt/fetch/sec-metadata/redirect/multiple-redirect-https-downgrade-upgrade.tentative.sub-expected.txt new file mode 100644 index 0000000..36b192be --- /dev/null +++ b/third_party/blink/web_tests/virtual/blink-cors/external/wpt/fetch/sec-metadata/redirect/multiple-redirect-https-downgrade-upgrade.tentative.sub-expected.txt
@@ -0,0 +1,15 @@ +This is a testharness.js-based test. +PASS Https downgrade-upgrade iframe => No headers +PASS Https downgrade-upgrade top level navigation => No headers +PASS Https downgrade-upgrade embed => No headers +FAIL Https downgrade-upgrade fetch() api => No headers assert_equals: dest expected "" but got "empty" +PASS Https downgrade-upgrade object => No headers +PASS Https downgrade-upgrade prefetch => No headers +PASS Https downgrade-upgrade preload => No headers +PASS Https downgrade-upgrade stylesheet => No headers +PASS Https downgrade-upgrade track => No headers +PASS Https downgrade-upgrade image => No headers +PASS Https downgrade-upgrade script => No headers +PASS Https downgrade-upgrade font => No headers +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/virtual/blink-cors/external/wpt/fetch/sec-metadata/redirect/redirect-http-upgrade.tentative.sub-expected.txt b/third_party/blink/web_tests/virtual/blink-cors/external/wpt/fetch/sec-metadata/redirect/redirect-http-upgrade.tentative.sub-expected.txt new file mode 100644 index 0000000..96043a6 --- /dev/null +++ b/third_party/blink/web_tests/virtual/blink-cors/external/wpt/fetch/sec-metadata/redirect/redirect-http-upgrade.tentative.sub-expected.txt
@@ -0,0 +1,15 @@ +This is a testharness.js-based test. +PASS Http upgrade iframe => No headers +PASS Http upgrade top level navigation => No headers +PASS Http upgrade embed => No headers +FAIL Http upgrade fetch() api => No headers assert_equals: dest expected "" but got "empty" +PASS Http upgrade object => No headers +PASS Http upgrade prefetch => No headers +PASS Http upgrade preload => No headers +PASS Http upgrade stylesheet => No headers +PASS Http upgrade track => No headers +PASS Http upgrade image => No headers +PASS Http upgrade script => No headers +PASS Http upgrade font => No headers +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/virtual/focusless-spat-nav/fast/spatial-navigation/focusless/snav-focusless-form-does-not-submit-a11y.html b/third_party/blink/web_tests/virtual/focusless-spat-nav/fast/spatial-navigation/focusless/snav-focusless-form-does-not-submit-a11y.html index 213abef..c5c66e3c 100644 --- a/third_party/blink/web_tests/virtual/focusless-spat-nav/fast/spatial-navigation/focusless/snav-focusless-form-does-not-submit-a11y.html +++ b/third_party/blink/web_tests/virtual/focusless-spat-nav/fast/spatial-navigation/focusless/snav-focusless-form-does-not-submit-a11y.html
@@ -25,8 +25,8 @@ "Should not be able to exit focus."); assert_true(mockSnavService.canSelectElement, "Should be able to select element."); - assert_true(mockSnavService.hasNextFormElement, - "Should not be able to move to next form element."); + assert_false(mockSnavService.hasNextFormElement, + "Should not be able to move to next form element."); assert_equals(document.activeElement, first, @@ -38,7 +38,7 @@ "Should be able to exit focus."); assert_true(mockSnavService.canSelectElement, "Should be able to select element."); - assert_true(mockSnavService.hasNextFormElement, - "Should be able to move to next form element."); + assert_false(mockSnavService.hasNextFormElement, + "Should not be able to move to next form element."); }, 'Form does not submit when passing spat nav focus.'); </script>
diff --git a/third_party/blink/web_tests/virtual/focusless-spat-nav/fast/spatial-navigation/focusless/snav-focusless-form-does-not-submit.html b/third_party/blink/web_tests/virtual/focusless-spat-nav/fast/spatial-navigation/focusless/snav-focusless-form-does-not-submit.html index 36887c0..90865a5 100644 --- a/third_party/blink/web_tests/virtual/focusless-spat-nav/fast/spatial-navigation/focusless/snav-focusless-form-does-not-submit.html +++ b/third_party/blink/web_tests/virtual/focusless-spat-nav/fast/spatial-navigation/focusless/snav-focusless-form-does-not-submit.html
@@ -30,7 +30,7 @@ assert_true(mockSnavService.canSelectElement, "Should be able to select element."); assert_false(mockSnavService.hasNextFormElement, - "Should not be able to move to next form element."); + "Should not be able to move to next form element."); eventSender.keyDown('Enter'); assert_equals(document.activeElement, @@ -43,7 +43,7 @@ "Should be able to exit focus."); assert_true(mockSnavService.canSelectElement, "Should be able to select element."); - assert_true(mockSnavService.hasNextFormElement, - "Should be able to move to next form element."); + assert_false(mockSnavService.hasNextFormElement, + "Should not be able to move to next form element."); }, 'Form does not submit when passing spat nav focus.'); </script>
diff --git a/third_party/blink/web_tests/virtual/focusless-spat-nav/fast/spatial-navigation/focusless/snav-focusless-form-state.html b/third_party/blink/web_tests/virtual/focusless-spat-nav/fast/spatial-navigation/focusless/snav-focusless-form-state.html index 6501c24..3f7fc8da 100644 --- a/third_party/blink/web_tests/virtual/focusless-spat-nav/fast/spatial-navigation/focusless/snav-focusless-form-state.html +++ b/third_party/blink/web_tests/virtual/focusless-spat-nav/fast/spatial-navigation/focusless/snav-focusless-form-state.html
@@ -10,6 +10,7 @@ <input type="text" id="first" autofocus></input> <input type="text" id="second"></input> <input type="checkbox" id="third"></input> +<input type="submit" id="submit">Submit</input> </form> <script> @@ -38,6 +39,8 @@ "Should be able to exit focus."); assert_true(mockSnavService.canSelectElement, "Should be able to select element."); + assert_true(mockSnavService.isFormFocused, + "Form should be focused."); assert_true(mockSnavService.hasNextFormElement, "Should be able to move to next form element."); @@ -59,6 +62,8 @@ "Should be able to exit focus."); assert_true(mockSnavService.canSelectElement, "Should be able to select element."); + assert_true(mockSnavService.isFormFocused, + "Form should be focused."); assert_false(mockSnavService.hasNextFormElement, "Should be able to move to next form element."); @@ -69,6 +74,8 @@ "Should be able to exit focus."); assert_true(mockSnavService.canSelectElement, "Should be able to select element."); + assert_false(mockSnavService.isFormFocused, + "Form should not be focused."); assert_false(mockSnavService.hasNextFormElement, "Should be able to move to next form element.");
diff --git a/third_party/crashpad/README.chromium b/third_party/crashpad/README.chromium index 4865a99..f3ee185 100644 --- a/third_party/crashpad/README.chromium +++ b/third_party/crashpad/README.chromium
@@ -2,7 +2,7 @@ Short Name: crashpad URL: https://crashpad.chromium.org/ Version: unknown -Revision: ee1d5124a2bfec578a1474b048cf934d92dcf7ba +Revision: e0e83ad18af41dba0ae10e0204193ec9074aeb2a License: Apache 2.0 License File: crashpad/LICENSE Security Critical: yes
diff --git a/third_party/crashpad/crashpad/DEPS b/third_party/crashpad/crashpad/DEPS index 3feafd8..33310cd 100644 --- a/third_party/crashpad/crashpad/DEPS +++ b/third_party/crashpad/crashpad/DEPS
@@ -24,7 +24,7 @@ '3e50219fc4503f461b2176a9976891b28d80f9ab', 'crashpad/third_party/gtest/gtest': Var('chromium_git') + '/external/github.com/google/googletest@' + - '3f5b5b8f8493a03fa25f1e4a7eae7678514a431d', + 'da10da05c262af0a9e8fa91789a272a3dec67655', 'crashpad/third_party/gyp/gyp': Var('chromium_git') + '/external/gyp@' + '8bee09f4a57807136593ddc906b0b213c21f9014',
diff --git a/third_party/crashpad/crashpad/snapshot/win/system_snapshot_win_test.cc b/third_party/crashpad/crashpad/snapshot/win/system_snapshot_win_test.cc index 8065993..a8ccd32b 100644 --- a/third_party/crashpad/crashpad/snapshot/win/system_snapshot_win_test.cc +++ b/third_party/crashpad/crashpad/snapshot/win/system_snapshot_win_test.cc
@@ -79,11 +79,13 @@ EXPECT_TRUE(cpu_vendor == "GenuineIntel" || cpu_vendor == "AuthenticAMD"); } +#if defined(ARCH_CPU_X86_FAMILY) TEST_F(SystemSnapshotWinTest, CPUX86SupportsDAZ) { // Most SSE2+ machines support Denormals-Are-Zero. This may fail if run on // older machines. EXPECT_TRUE(system_snapshot().CPUX86SupportsDAZ()); } +#endif TEST_F(SystemSnapshotWinTest, GetOperatingSystem) { EXPECT_EQ(system_snapshot().GetOperatingSystem(),
diff --git a/third_party/crashpad/crashpad/test/multiprocess_exec_fuchsia.cc b/third_party/crashpad/crashpad/test/multiprocess_exec_fuchsia.cc index 2f675869..a1e2acf5 100644 --- a/third_party/crashpad/crashpad/test/multiprocess_exec_fuchsia.cc +++ b/third_party/crashpad/crashpad/test/multiprocess_exec_fuchsia.cc
@@ -31,8 +31,8 @@ void AddPipe(fdio_spawn_action_t* action, int target_fd, int* fd_out) { zx_handle_t handle = ZX_HANDLE_INVALID; - zx_status_t status = fdio_pipe_half2(fd_out, &handle); - ZX_CHECK(status == ZX_OK, status) << "fdio_pipe_half2"; + zx_status_t status = fdio_pipe_half(fd_out, &handle); + ZX_CHECK(status == ZX_OK, status) << "fdio_pipe_half"; action->action = FDIO_SPAWN_ACTION_ADD_HANDLE; action->h.id = PA_HND(PA_FD, target_fd); action->h.handle = handle;
diff --git a/third_party/crashpad/crashpad/util/BUILD.gn b/third_party/crashpad/crashpad/util/BUILD.gn index 620ae25..cfa4e225a 100644 --- a/third_party/crashpad/crashpad/util/BUILD.gn +++ b/third_party/crashpad/crashpad/util/BUILD.gn
@@ -47,9 +47,19 @@ args += rebase_path(outputs, root_build_dir) if (crashpad_is_in_chromium) { if (!use_system_xcode) { + import("//build/config/clang/clang.gni") + import("//build/config/mac/mac_sdk.gni") + clang_path = rebase_path("$clang_base_path/bin/", root_build_dir) + "clang" + mig_path = "$mac_bin_path" + "mig" + migcom_path = "$mac_bin_path" + "../libexec/migcom" + args += [ - "--developer-dir", - hermetic_xcode_path, + "--clang-path", + clang_path, + "--mig-path", + mig_path, + "--migcom-path", + migcom_path, ] } }
diff --git a/third_party/crashpad/crashpad/util/mach/mig.py b/third_party/crashpad/crashpad/util/mach/mig.py index c2357338..ef14031 100755 --- a/third_party/crashpad/crashpad/util/mach/mig.py +++ b/third_party/crashpad/crashpad/util/mach/mig.py
@@ -26,7 +26,8 @@ interface = mig_gen.MigInterface(parsed.user_c, parsed.server_c, parsed.user_h, parsed.server_h) mig_gen.generate_interface(parsed.defs, interface, parsed.include, - parsed.developer_dir, parsed.sdk) + parsed.sdk, parsed.clang_path, parsed.mig_path, + parsed.migcom_path) mig_fix.fix_interface(interface) if __name__ == '__main__':
diff --git a/third_party/crashpad/crashpad/util/mach/mig_gen.py b/third_party/crashpad/crashpad/util/mach/mig_gen.py index d71029a..976cd12 100755 --- a/third_party/crashpad/crashpad/util/mach/mig_gen.py +++ b/third_party/crashpad/crashpad/util/mach/mig_gen.py
@@ -24,16 +24,21 @@ MigInterface = collections.namedtuple('MigInterface', ['user_c', 'server_c', 'user_h', 'server_h']) -def generate_interface(defs, interface, includes=[], - developer_dir=None, sdk=None): - command = ['mig', +def generate_interface(defs, interface, includes=[], sdk=None, clang_path=None, + mig_path=None, migcom_path=None): + if mig_path is None: + mig_path = 'mig' + command = [mig_path, '-user', interface.user_c, '-server', interface.server_c, '-header', interface.user_h, '-sheader', interface.server_h, ] - if developer_dir is not None: - os.environ['DEVELOPER_DIR'] = developer_dir + + if clang_path is not None: + os.environ['MIGCC'] = clang_path + if migcom_path is not None: + os.environ['MIGCOM'] = migcom_path if sdk is not None: command.extend(['-isysroot', sdk]) for include in includes: @@ -43,7 +48,9 @@ def parse_args(args): parser = argparse.ArgumentParser() - parser.add_argument('--developer-dir', help='Path to Xcode') + parser.add_argument('--clang-path', help='Path to Clang') + parser.add_argument('--mig-path', help='Path to mig') + parser.add_argument('--migcom-path', help='Path to migcom') parser.add_argument('--sdk', help='Path to SDK') parser.add_argument('--include', default=[], @@ -61,7 +68,8 @@ interface = MigInterface(parsed.user_c, parsed.server_c, parsed.user_h, parsed.server_h) generate_interface(parsed.defs, interface, parsed.include, - parsed.developer_dir, parsed.sdk) + parsed.sdk, parsed.clang_path, parsed.mig_path, + parsed.migcom_path) if __name__ == '__main__': sys.exit(main(sys.argv[1:]))
diff --git a/third_party/leveldatabase/leveldb_chrome.cc b/third_party/leveldatabase/leveldb_chrome.cc index e84aacdb..304600cd 100644 --- a/third_party/leveldatabase/leveldb_chrome.cc +++ b/third_party/leveldatabase/leveldb_chrome.cc
@@ -181,7 +181,7 @@ leveldb::Status s = leveldb::EnvWrapper::DeleteFile(fname); if (s.ok()) { base::AutoLock lock(files_lock_); - DCHECK(base::ContainsKey(file_names_, fname)); + DCHECK(base::Contains(file_names_, fname)); file_names_.erase(fname); } return s;
diff --git a/third_party/libaddressinput/BUILD.gn b/third_party/libaddressinput/BUILD.gn index 2698d79..d3c8e84 100644 --- a/third_party/libaddressinput/BUILD.gn +++ b/third_party/libaddressinput/BUILD.gn
@@ -278,6 +278,7 @@ ":test_support", ":util", "//base/test:run_all_unittests", + "//base/test:test_support", "//components/prefs", "//mojo/core/embedder", "//net:test_support",
diff --git a/third_party/libaddressinput/chromium/chrome_address_validator_unittest.cc b/third_party/libaddressinput/chromium/chrome_address_validator_unittest.cc index 8afbe82..05740c8 100644 --- a/third_party/libaddressinput/chromium/chrome_address_validator_unittest.cc +++ b/third_party/libaddressinput/chromium/chrome_address_validator_unittest.cc
@@ -11,9 +11,9 @@ #include <vector> #include "base/macros.h" -#include "base/message_loop/message_loop.h" #include "base/run_loop.h" #include "base/strings/utf_string_conversions.h" +#include "base/test/scoped_task_environment.h" #include "testing/gtest/include/gtest/gtest.h" #include "third_party/libaddressinput/src/cpp/include/libaddressinput/address_data.h" #include "third_party/libaddressinput/src/cpp/include/libaddressinput/address_problem.h" @@ -922,7 +922,7 @@ load_rules_success_ = success; } - base::MessageLoop ui_; + base::test::ScopedTaskEnvironment scoped_task_environment_; DISALLOW_COPY_AND_ASSIGN(FailingAddressValidatorTest); };
diff --git a/third_party/libaddressinput/chromium/chrome_metadata_source_unittest.cc b/third_party/libaddressinput/chromium/chrome_metadata_source_unittest.cc index faa5f03a..631800c 100644 --- a/third_party/libaddressinput/chromium/chrome_metadata_source_unittest.cc +++ b/third_party/libaddressinput/chromium/chrome_metadata_source_unittest.cc
@@ -4,8 +4,8 @@ #include "third_party/libaddressinput/chromium/chrome_metadata_source.h" -#include "base/message_loop/message_loop.h" #include "base/run_loop.h" +#include "base/test/scoped_task_environment.h" #include "base/threading/thread_task_runner_handle.h" #include "mojo/core/embedder/embedder.h" #include "services/network/public/cpp/shared_url_loader_factory.h" @@ -64,7 +64,7 @@ data_.reset(data); } - base::MessageLoop loop_; + base::test::ScopedTaskEnvironment scoped_task_environment_; network::TestURLLoaderFactory test_url_loader_factory_; scoped_refptr<network::SharedURLLoaderFactory> test_shared_loader_factory_; GURL url_;
diff --git a/third_party/libvpx/README.chromium b/third_party/libvpx/README.chromium index ffbe533..3849a412 100644 --- a/third_party/libvpx/README.chromium +++ b/third_party/libvpx/README.chromium
@@ -5,9 +5,9 @@ License File: source/libvpx/LICENSE Security Critical: yes -Date: Tuesday May 28 2019 +Date: Thursday June 06 2019 Branch: master -Commit: 0308a9a132612006056f9920c069a1942e49c26c +Commit: 28cc5f3646bac9d01e583621f611303f738424f0 Description: Contains the sources used to compile libvpx binaries used by Google Chrome and
diff --git a/third_party/libvpx/libvpx_srcs.gni b/third_party/libvpx/libvpx_srcs.gni index 52b42ef1..6a9ae8a 100644 --- a/third_party/libvpx/libvpx_srcs.gni +++ b/third_party/libvpx/libvpx_srcs.gni
@@ -190,16 +190,8 @@ "//third_party/libvpx/source/libvpx/vp9/decoder/vp9_dsubexp.h", "//third_party/libvpx/source/libvpx/vp9/decoder/vp9_job_queue.c", "//third_party/libvpx/source/libvpx/vp9/decoder/vp9_job_queue.h", - "//third_party/libvpx/source/libvpx/vp9/encoder/vp9_alt_ref_aq.c", - "//third_party/libvpx/source/libvpx/vp9/encoder/vp9_alt_ref_aq.h", - "//third_party/libvpx/source/libvpx/vp9/encoder/vp9_aq_360.c", - "//third_party/libvpx/source/libvpx/vp9/encoder/vp9_aq_360.h", - "//third_party/libvpx/source/libvpx/vp9/encoder/vp9_aq_complexity.c", - "//third_party/libvpx/source/libvpx/vp9/encoder/vp9_aq_complexity.h", "//third_party/libvpx/source/libvpx/vp9/encoder/vp9_aq_cyclicrefresh.c", "//third_party/libvpx/source/libvpx/vp9/encoder/vp9_aq_cyclicrefresh.h", - "//third_party/libvpx/source/libvpx/vp9/encoder/vp9_aq_variance.c", - "//third_party/libvpx/source/libvpx/vp9/encoder/vp9_aq_variance.h", "//third_party/libvpx/source/libvpx/vp9/encoder/vp9_bitstream.c", "//third_party/libvpx/source/libvpx/vp9/encoder/vp9_bitstream.h", "//third_party/libvpx/source/libvpx/vp9/encoder/vp9_block.h", @@ -667,16 +659,8 @@ "//third_party/libvpx/source/libvpx/vp9/decoder/vp9_dsubexp.h", "//third_party/libvpx/source/libvpx/vp9/decoder/vp9_job_queue.c", "//third_party/libvpx/source/libvpx/vp9/decoder/vp9_job_queue.h", - "//third_party/libvpx/source/libvpx/vp9/encoder/vp9_alt_ref_aq.c", - "//third_party/libvpx/source/libvpx/vp9/encoder/vp9_alt_ref_aq.h", - "//third_party/libvpx/source/libvpx/vp9/encoder/vp9_aq_360.c", - "//third_party/libvpx/source/libvpx/vp9/encoder/vp9_aq_360.h", - "//third_party/libvpx/source/libvpx/vp9/encoder/vp9_aq_complexity.c", - "//third_party/libvpx/source/libvpx/vp9/encoder/vp9_aq_complexity.h", "//third_party/libvpx/source/libvpx/vp9/encoder/vp9_aq_cyclicrefresh.c", "//third_party/libvpx/source/libvpx/vp9/encoder/vp9_aq_cyclicrefresh.h", - "//third_party/libvpx/source/libvpx/vp9/encoder/vp9_aq_variance.c", - "//third_party/libvpx/source/libvpx/vp9/encoder/vp9_aq_variance.h", "//third_party/libvpx/source/libvpx/vp9/encoder/vp9_bitstream.c", "//third_party/libvpx/source/libvpx/vp9/encoder/vp9_bitstream.h", "//third_party/libvpx/source/libvpx/vp9/encoder/vp9_block.h", @@ -1147,16 +1131,8 @@ "//third_party/libvpx/source/libvpx/vp9/decoder/vp9_dsubexp.h", "//third_party/libvpx/source/libvpx/vp9/decoder/vp9_job_queue.c", "//third_party/libvpx/source/libvpx/vp9/decoder/vp9_job_queue.h", - "//third_party/libvpx/source/libvpx/vp9/encoder/vp9_alt_ref_aq.c", - "//third_party/libvpx/source/libvpx/vp9/encoder/vp9_alt_ref_aq.h", - "//third_party/libvpx/source/libvpx/vp9/encoder/vp9_aq_360.c", - "//third_party/libvpx/source/libvpx/vp9/encoder/vp9_aq_360.h", - "//third_party/libvpx/source/libvpx/vp9/encoder/vp9_aq_complexity.c", - "//third_party/libvpx/source/libvpx/vp9/encoder/vp9_aq_complexity.h", "//third_party/libvpx/source/libvpx/vp9/encoder/vp9_aq_cyclicrefresh.c", "//third_party/libvpx/source/libvpx/vp9/encoder/vp9_aq_cyclicrefresh.h", - "//third_party/libvpx/source/libvpx/vp9/encoder/vp9_aq_variance.c", - "//third_party/libvpx/source/libvpx/vp9/encoder/vp9_aq_variance.h", "//third_party/libvpx/source/libvpx/vp9/encoder/vp9_bitstream.c", "//third_party/libvpx/source/libvpx/vp9/encoder/vp9_bitstream.h", "//third_party/libvpx/source/libvpx/vp9/encoder/vp9_block.h", @@ -1517,16 +1493,8 @@ "//third_party/libvpx/source/libvpx/vp9/encoder/arm/neon/vp9_error_neon.c", "//third_party/libvpx/source/libvpx/vp9/encoder/arm/neon/vp9_frame_scale_neon.c", "//third_party/libvpx/source/libvpx/vp9/encoder/arm/neon/vp9_quantize_neon.c", - "//third_party/libvpx/source/libvpx/vp9/encoder/vp9_alt_ref_aq.c", - "//third_party/libvpx/source/libvpx/vp9/encoder/vp9_alt_ref_aq.h", - "//third_party/libvpx/source/libvpx/vp9/encoder/vp9_aq_360.c", - "//third_party/libvpx/source/libvpx/vp9/encoder/vp9_aq_360.h", - "//third_party/libvpx/source/libvpx/vp9/encoder/vp9_aq_complexity.c", - "//third_party/libvpx/source/libvpx/vp9/encoder/vp9_aq_complexity.h", "//third_party/libvpx/source/libvpx/vp9/encoder/vp9_aq_cyclicrefresh.c", "//third_party/libvpx/source/libvpx/vp9/encoder/vp9_aq_cyclicrefresh.h", - "//third_party/libvpx/source/libvpx/vp9/encoder/vp9_aq_variance.c", - "//third_party/libvpx/source/libvpx/vp9/encoder/vp9_aq_variance.h", "//third_party/libvpx/source/libvpx/vp9/encoder/vp9_bitstream.c", "//third_party/libvpx/source/libvpx/vp9/encoder/vp9_bitstream.h", "//third_party/libvpx/source/libvpx/vp9/encoder/vp9_block.h", @@ -1916,16 +1884,8 @@ "//third_party/libvpx/source/libvpx/vp9/decoder/vp9_dsubexp.h", "//third_party/libvpx/source/libvpx/vp9/decoder/vp9_job_queue.c", "//third_party/libvpx/source/libvpx/vp9/decoder/vp9_job_queue.h", - "//third_party/libvpx/source/libvpx/vp9/encoder/vp9_alt_ref_aq.c", - "//third_party/libvpx/source/libvpx/vp9/encoder/vp9_alt_ref_aq.h", - "//third_party/libvpx/source/libvpx/vp9/encoder/vp9_aq_360.c", - "//third_party/libvpx/source/libvpx/vp9/encoder/vp9_aq_360.h", - "//third_party/libvpx/source/libvpx/vp9/encoder/vp9_aq_complexity.c", - "//third_party/libvpx/source/libvpx/vp9/encoder/vp9_aq_complexity.h", "//third_party/libvpx/source/libvpx/vp9/encoder/vp9_aq_cyclicrefresh.c", "//third_party/libvpx/source/libvpx/vp9/encoder/vp9_aq_cyclicrefresh.h", - "//third_party/libvpx/source/libvpx/vp9/encoder/vp9_aq_variance.c", - "//third_party/libvpx/source/libvpx/vp9/encoder/vp9_aq_variance.h", "//third_party/libvpx/source/libvpx/vp9/encoder/vp9_bitstream.c", "//third_party/libvpx/source/libvpx/vp9/encoder/vp9_bitstream.h", "//third_party/libvpx/source/libvpx/vp9/encoder/vp9_block.h", @@ -2364,16 +2324,8 @@ "//third_party/libvpx/source/libvpx/vp9/encoder/arm/neon/vp9_error_neon.c", "//third_party/libvpx/source/libvpx/vp9/encoder/arm/neon/vp9_frame_scale_neon.c", "//third_party/libvpx/source/libvpx/vp9/encoder/arm/neon/vp9_quantize_neon.c", - "//third_party/libvpx/source/libvpx/vp9/encoder/vp9_alt_ref_aq.c", - "//third_party/libvpx/source/libvpx/vp9/encoder/vp9_alt_ref_aq.h", - "//third_party/libvpx/source/libvpx/vp9/encoder/vp9_aq_360.c", - "//third_party/libvpx/source/libvpx/vp9/encoder/vp9_aq_360.h", - "//third_party/libvpx/source/libvpx/vp9/encoder/vp9_aq_complexity.c", - "//third_party/libvpx/source/libvpx/vp9/encoder/vp9_aq_complexity.h", "//third_party/libvpx/source/libvpx/vp9/encoder/vp9_aq_cyclicrefresh.c", "//third_party/libvpx/source/libvpx/vp9/encoder/vp9_aq_cyclicrefresh.h", - "//third_party/libvpx/source/libvpx/vp9/encoder/vp9_aq_variance.c", - "//third_party/libvpx/source/libvpx/vp9/encoder/vp9_aq_variance.h", "//third_party/libvpx/source/libvpx/vp9/encoder/vp9_bitstream.c", "//third_party/libvpx/source/libvpx/vp9/encoder/vp9_bitstream.h", "//third_party/libvpx/source/libvpx/vp9/encoder/vp9_block.h", @@ -2774,16 +2726,8 @@ "//third_party/libvpx/source/libvpx/vp9/encoder/arm/neon/vp9_denoiser_neon.c", "//third_party/libvpx/source/libvpx/vp9/encoder/arm/neon/vp9_frame_scale_neon.c", "//third_party/libvpx/source/libvpx/vp9/encoder/arm/neon/vp9_quantize_neon.c", - "//third_party/libvpx/source/libvpx/vp9/encoder/vp9_alt_ref_aq.c", - "//third_party/libvpx/source/libvpx/vp9/encoder/vp9_alt_ref_aq.h", - "//third_party/libvpx/source/libvpx/vp9/encoder/vp9_aq_360.c", - "//third_party/libvpx/source/libvpx/vp9/encoder/vp9_aq_360.h", - "//third_party/libvpx/source/libvpx/vp9/encoder/vp9_aq_complexity.c", - "//third_party/libvpx/source/libvpx/vp9/encoder/vp9_aq_complexity.h", "//third_party/libvpx/source/libvpx/vp9/encoder/vp9_aq_cyclicrefresh.c", "//third_party/libvpx/source/libvpx/vp9/encoder/vp9_aq_cyclicrefresh.h", - "//third_party/libvpx/source/libvpx/vp9/encoder/vp9_aq_variance.c", - "//third_party/libvpx/source/libvpx/vp9/encoder/vp9_aq_variance.h", "//third_party/libvpx/source/libvpx/vp9/encoder/vp9_bitstream.c", "//third_party/libvpx/source/libvpx/vp9/encoder/vp9_bitstream.h", "//third_party/libvpx/source/libvpx/vp9/encoder/vp9_block.h", @@ -3213,16 +3157,8 @@ "//third_party/libvpx/source/libvpx/vp9/encoder/arm/neon/vp9_denoiser_neon.c", "//third_party/libvpx/source/libvpx/vp9/encoder/arm/neon/vp9_frame_scale_neon.c", "//third_party/libvpx/source/libvpx/vp9/encoder/arm/neon/vp9_quantize_neon.c", - "//third_party/libvpx/source/libvpx/vp9/encoder/vp9_alt_ref_aq.c", - "//third_party/libvpx/source/libvpx/vp9/encoder/vp9_alt_ref_aq.h", - "//third_party/libvpx/source/libvpx/vp9/encoder/vp9_aq_360.c", - "//third_party/libvpx/source/libvpx/vp9/encoder/vp9_aq_360.h", - "//third_party/libvpx/source/libvpx/vp9/encoder/vp9_aq_complexity.c", - "//third_party/libvpx/source/libvpx/vp9/encoder/vp9_aq_complexity.h", "//third_party/libvpx/source/libvpx/vp9/encoder/vp9_aq_cyclicrefresh.c", "//third_party/libvpx/source/libvpx/vp9/encoder/vp9_aq_cyclicrefresh.h", - "//third_party/libvpx/source/libvpx/vp9/encoder/vp9_aq_variance.c", - "//third_party/libvpx/source/libvpx/vp9/encoder/vp9_aq_variance.h", "//third_party/libvpx/source/libvpx/vp9/encoder/vp9_bitstream.c", "//third_party/libvpx/source/libvpx/vp9/encoder/vp9_bitstream.h", "//third_party/libvpx/source/libvpx/vp9/encoder/vp9_block.h", @@ -3608,16 +3544,8 @@ "//third_party/libvpx/source/libvpx/vp9/decoder/vp9_dsubexp.h", "//third_party/libvpx/source/libvpx/vp9/decoder/vp9_job_queue.c", "//third_party/libvpx/source/libvpx/vp9/decoder/vp9_job_queue.h", - "//third_party/libvpx/source/libvpx/vp9/encoder/vp9_alt_ref_aq.c", - "//third_party/libvpx/source/libvpx/vp9/encoder/vp9_alt_ref_aq.h", - "//third_party/libvpx/source/libvpx/vp9/encoder/vp9_aq_360.c", - "//third_party/libvpx/source/libvpx/vp9/encoder/vp9_aq_360.h", - "//third_party/libvpx/source/libvpx/vp9/encoder/vp9_aq_complexity.c", - "//third_party/libvpx/source/libvpx/vp9/encoder/vp9_aq_complexity.h", "//third_party/libvpx/source/libvpx/vp9/encoder/vp9_aq_cyclicrefresh.c", "//third_party/libvpx/source/libvpx/vp9/encoder/vp9_aq_cyclicrefresh.h", - "//third_party/libvpx/source/libvpx/vp9/encoder/vp9_aq_variance.c", - "//third_party/libvpx/source/libvpx/vp9/encoder/vp9_aq_variance.h", "//third_party/libvpx/source/libvpx/vp9/encoder/vp9_bitstream.c", "//third_party/libvpx/source/libvpx/vp9/encoder/vp9_bitstream.h", "//third_party/libvpx/source/libvpx/vp9/encoder/vp9_block.h", @@ -3950,16 +3878,8 @@ "//third_party/libvpx/source/libvpx/vp9/decoder/vp9_dsubexp.h", "//third_party/libvpx/source/libvpx/vp9/decoder/vp9_job_queue.c", "//third_party/libvpx/source/libvpx/vp9/decoder/vp9_job_queue.h", - "//third_party/libvpx/source/libvpx/vp9/encoder/vp9_alt_ref_aq.c", - "//third_party/libvpx/source/libvpx/vp9/encoder/vp9_alt_ref_aq.h", - "//third_party/libvpx/source/libvpx/vp9/encoder/vp9_aq_360.c", - "//third_party/libvpx/source/libvpx/vp9/encoder/vp9_aq_360.h", - "//third_party/libvpx/source/libvpx/vp9/encoder/vp9_aq_complexity.c", - "//third_party/libvpx/source/libvpx/vp9/encoder/vp9_aq_complexity.h", "//third_party/libvpx/source/libvpx/vp9/encoder/vp9_aq_cyclicrefresh.c", "//third_party/libvpx/source/libvpx/vp9/encoder/vp9_aq_cyclicrefresh.h", - "//third_party/libvpx/source/libvpx/vp9/encoder/vp9_aq_variance.c", - "//third_party/libvpx/source/libvpx/vp9/encoder/vp9_aq_variance.h", "//third_party/libvpx/source/libvpx/vp9/encoder/vp9_bitstream.c", "//third_party/libvpx/source/libvpx/vp9/encoder/vp9_bitstream.h", "//third_party/libvpx/source/libvpx/vp9/encoder/vp9_block.h", @@ -4291,16 +4211,8 @@ "//third_party/libvpx/source/libvpx/vp9/decoder/vp9_dsubexp.h", "//third_party/libvpx/source/libvpx/vp9/decoder/vp9_job_queue.c", "//third_party/libvpx/source/libvpx/vp9/decoder/vp9_job_queue.h", - "//third_party/libvpx/source/libvpx/vp9/encoder/vp9_alt_ref_aq.c", - "//third_party/libvpx/source/libvpx/vp9/encoder/vp9_alt_ref_aq.h", - "//third_party/libvpx/source/libvpx/vp9/encoder/vp9_aq_360.c", - "//third_party/libvpx/source/libvpx/vp9/encoder/vp9_aq_360.h", - "//third_party/libvpx/source/libvpx/vp9/encoder/vp9_aq_complexity.c", - "//third_party/libvpx/source/libvpx/vp9/encoder/vp9_aq_complexity.h", "//third_party/libvpx/source/libvpx/vp9/encoder/vp9_aq_cyclicrefresh.c", "//third_party/libvpx/source/libvpx/vp9/encoder/vp9_aq_cyclicrefresh.h", - "//third_party/libvpx/source/libvpx/vp9/encoder/vp9_aq_variance.c", - "//third_party/libvpx/source/libvpx/vp9/encoder/vp9_aq_variance.h", "//third_party/libvpx/source/libvpx/vp9/encoder/vp9_bitstream.c", "//third_party/libvpx/source/libvpx/vp9/encoder/vp9_bitstream.h", "//third_party/libvpx/source/libvpx/vp9/encoder/vp9_block.h",
diff --git a/third_party/libvpx/source/config/vpx_version.h b/third_party/libvpx/source/config/vpx_version.h index ad2a19a..806f15b7 100644 --- a/third_party/libvpx/source/config/vpx_version.h +++ b/third_party/libvpx/source/config/vpx_version.h
@@ -2,7 +2,7 @@ #define VERSION_MAJOR 1 #define VERSION_MINOR 8 #define VERSION_PATCH 0 -#define VERSION_EXTRA "508-g0308a9a132" +#define VERSION_EXTRA "538-g28cc5f3646" #define VERSION_PACKED ((VERSION_MAJOR<<16)|(VERSION_MINOR<<8)|(VERSION_PATCH)) -#define VERSION_STRING_NOSP "v1.8.0-508-g0308a9a132" -#define VERSION_STRING " v1.8.0-508-g0308a9a132" +#define VERSION_STRING_NOSP "v1.8.0-538-g28cc5f3646" +#define VERSION_STRING " v1.8.0-538-g28cc5f3646"
diff --git a/tools/clang/scripts/build.py b/tools/clang/scripts/build.py index 1f29fb6..2c5b1248 100755 --- a/tools/clang/scripts/build.py +++ b/tools/clang/scripts/build.py
@@ -792,10 +792,10 @@ # And copy it into the main build tree. fuchsia_lib_dst_dir = os.path.join(LLVM_BUILD_DIR, 'lib', 'clang', - RELEASE_VERSION, target_spec, 'lib') + RELEASE_VERSION, 'lib', target_spec) if not os.path.exists(fuchsia_lib_dst_dir): os.makedirs(fuchsia_lib_dst_dir) - CopyFile(os.path.join(build_dir, target_spec, 'lib', builtins_a), + CopyFile(os.path.join(build_dir, 'lib', target_spec, builtins_a), fuchsia_lib_dst_dir) # Run tests.
diff --git a/tools/clang/scripts/package.py b/tools/clang/scripts/package.py index ae8a0fd..a133264c 100755 --- a/tools/clang/scripts/package.py +++ b/tools/clang/scripts/package.py
@@ -231,8 +231,8 @@ 'bin/clang', # Include libclang_rt.builtins.a for Fuchsia targets. - 'lib/clang/$V/aarch64-fuchsia/lib/libclang_rt.builtins.a', - 'lib/clang/$V/x86_64-fuchsia/lib/libclang_rt.builtins.a', + 'lib/clang/$V/lib/aarch64-fuchsia/libclang_rt.builtins.a', + 'lib/clang/$V/lib/x86_64-fuchsia/libclang_rt.builtins.a', ]) if sys.platform == 'darwin': want.extend([
diff --git a/tools/clang/scripts/update.py b/tools/clang/scripts/update.py index c14a188..84455a1 100755 --- a/tools/clang/scripts/update.py +++ b/tools/clang/scripts/update.py
@@ -36,9 +36,9 @@ # Do NOT CHANGE this if you don't know what you're doing -- see # https://chromium.googlesource.com/chromium/src/+/master/docs/updating_clang.md # Reverting problematic clang rolls is safe, though. -CLANG_REVISION = '67510fac36d27b2e22c7cd955fc167136b737b93' -CLANG_SVN_REVISION = '361212' -CLANG_SUB_REVISION = 3 +CLANG_REVISION = '80fee25776c2fb61e74c1ecb1a523375c2500b69' +CLANG_SVN_REVISION = '362913' +CLANG_SUB_REVISION = 1 PACKAGE_VERSION = '%s-%s-%s' % (CLANG_SVN_REVISION, CLANG_REVISION[:8], CLANG_SUB_REVISION)
diff --git a/tools/mb/mb_config.pyl b/tools/mb/mb_config.pyl index 05f2c18b..fecc36a 100644 --- a/tools/mb/mb_config.pyl +++ b/tools/mb/mb_config.pyl
@@ -205,7 +205,7 @@ 'Android Builder (dbg) Goma Canary': 'android_debug_static_bot_vrdata', 'Android Builder (dbg) Goma Latest Client': 'android_debug_static_bot_vrdata', - 'android-code-coverage': 'android_release_bot_minimal_symbols_coverage', + 'android-code-coverage': 'android_debug_static_bot_minimal_symbols_coverage', 'chromeos-amd64-generic-rel-goma-canary': 'cros_chrome_sdk', 'chromeos-amd64-generic-rel-goma-latest': 'cros_chrome_sdk', 'chromeos-amd64-generic-rel-vm-tests': 'cros_chrome_sdk_headless_ozone_dcheck_always_on', @@ -297,6 +297,7 @@ 'Win 10 Fast Ring': 'release_trybot', 'win-annotator-rel': 'release_bot', 'win-autofill-captured-sites-rel': 'release_bot', + 'win-pixel-builder-rel': 'release_bot', 'win32-arm64-rel': 'win32_arm64_release_bot', }, @@ -991,6 +992,11 @@ 'android', 'debug_static_bot', ], + 'android_debug_static_bot_minimal_symbols_coverage': [ + 'android', 'debug_static_bot', 'minimal_symbols', 'java_coverage', + 'strip_debug_info', + ], + 'android_debug_static_bot_vrdata': [ 'android', 'debug_static_bot', 'include_vr_data', ], @@ -1069,11 +1075,6 @@ 'strip_debug_info', ], - 'android_release_bot_minimal_symbols_coverage': [ - 'android', 'release_bot', 'minimal_symbols', 'java_coverage', - 'strip_debug_info', - ], - 'android_release_thumb_bot': [ 'android', 'release_bot', 'arm_thumb', ],
diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml index 15bbfae..a31d5b8 100644 --- a/tools/metrics/histograms/enums.xml +++ b/tools/metrics/histograms/enums.xml
@@ -33497,6 +33497,7 @@ <int value="-1572010356" label="enable-privet-v3"/> <int value="-1571841513" label="enable-devtools-experiments"/> <int value="-1568559155" label="WebSocketHandshakeReuseConnection:enabled"/> + <int value="-1561252720" label="AutofillCreditCardUploadFeedback:disabled"/> <int value="-1560729847" label="AutofillCacheQueryResponses:enabled"/> <int value="-1560650271" label="WasmCodeCache:disabled"/> <int value="-1559789642" label="RunAllFlashInAllowMode:enabled"/> @@ -33611,6 +33612,7 @@ label="AutofillRationalizeRepeatedServerPredictions:enabled"/> <int value="-1420542268" label="AutofillEnableAccountWalletStorage:disabled"/> <int value="-1419788257" label="enable-experimental-hotwording"/> + <int value="-1417642561" label="AutofillCreditCardUploadFeedback:enabled"/> <int value="-1417122729" label="AutofillCreditCardAblationExperiment:disabled"/> <int value="-1416758392" label="migrate-linux-to-logindb:disabled"/> @@ -49329,6 +49331,7 @@ <int value="61" label="InternalContentCapture"/> <int value="62" label="MainThreadTaskQueueMemoryPurge"/> <int value="63" label="InternalNavigation"/> + <int value="64" label="InternalContinueScriptLoading"/> </enum> <enum name="RendererSchedulerTaskUseCase">
diff --git a/tools/metrics/histograms/histograms.xml b/tools/metrics/histograms/histograms.xml index 767e79da..bc0b86d 100644 --- a/tools/metrics/histograms/histograms.xml +++ b/tools/metrics/histograms/histograms.xml
@@ -4874,8 +4874,8 @@ <histogram name="Apps.NoteTakingApp.DefaultLaunchResult" enum="NoteTakingAppLaunchResult"> - <owner>derat@chromium.org</owner> - <owner>jdufault@chromium.org</owner> + <owner>tbarzic@chromium.org</owner> + <owner>tbuckley@chromium.org</owner> <summary> The result of attempting to launch a default note-taking app on Chrome OS. Only reported if the preferred app was unspecified or failed to launch. @@ -4884,8 +4884,8 @@ <histogram name="Apps.NoteTakingApp.PreferredLaunchResult" enum="NoteTakingAppLaunchResult" expires_after="M77"> - <owner>derat@chromium.org</owner> - <owner>jdufault@chromium.org</owner> + <owner>tbarzic@chromium.org</owner> + <owner>tbuckley@chromium.org</owner> <summary> The result of attempting to launch the user-specified preferred note-taking app, if any, on Chrome OS. @@ -6023,21 +6023,20 @@ </summary> </histogram> -<histogram name="Ash.Login.Lock.NumPasswordAttempts.UntilFailure" units="count" - expires_after="M77"> - <owner>jdufault@google.com</owner> +<histogram name="Ash.Login.Lock.NumPasswordAttempts.UntilFailure" units="count"> + <owner>kerrnel@google.com</owner> <summary> - The number of incorrect password entered in ChromeOS lock screen until the - user gives up (switch pods or user sign out the current session or shutdown - the device). + The number of incorrect password entered in ChromeOS login/lock screen until + the user gives up (switch pods or user sign out the current session or + shutdown the device). </summary> </histogram> <histogram name="Ash.Login.Lock.NumPasswordAttempts.UntilSuccess" units="count"> - <owner>jdufault@google.com</owner> + <owner>kerrnel@google.com</owner> <summary> - The number of incorrect password entered in ChromeOS lock screen until a - successful attempt. + The number of incorrect password entered in ChromeOS login/lock screen until + a successful attempt. </summary> </histogram> @@ -6692,7 +6691,7 @@ </histogram> <histogram name="Ash.TouchView.LidAngle" units="degrees"> - <owner>derat@chromium.org</owner> + <owner>oshima@chromium.org</owner> <summary> Chrome OS only. The computed angle between the lid and the keyboard panel. These values are imprecise and may be tens of degrees off from reality. @@ -22377,7 +22376,7 @@ </histogram> <histogram name="CryptAuth.DeviceSync.Result" enum="BooleanSuccess" - expires_after="M77"> + expires_after="2020-06-06"> <owner>hansberry@chromium.org</owner> <summary>Indicates success of performing a DeviceSync.</summary> </histogram> @@ -60397,6 +60396,9 @@ </histogram> <histogram name="Memory.Stats.Win.AvailPageFile2" units="MB"> + <obsolete> + Deprecated in 05/2019 + </obsolete> <owner>georgesak@chromium.org</owner> <summary> Windows-only metric that represents the maximum amount of memory the current @@ -60420,6 +60422,9 @@ </histogram> <histogram name="Memory.Stats.Win.AvailPhys2" units="MB" expires_after="M77"> + <obsolete> + Deprecated in 05/2019 + </obsolete> <owner>georgesak@chromium.org</owner> <summary> Windows-only metric that represents the amount of physical memory currently @@ -60443,6 +60448,9 @@ </histogram> <histogram name="Memory.Stats.Win.AvailVirtual2" units="MB" expires_after="M77"> + <obsolete> + Deprecated in 05/2019 + </obsolete> <owner>georgesak@chromium.org</owner> <summary> Windows-only metric that represents the amount of unreserved and uncommitted @@ -60452,6 +60460,9 @@ </histogram> <histogram name="Memory.Stats.Win.MemoryLoad" units="%" expires_after="M77"> + <obsolete> + Deprecated in 05/2019 + </obsolete> <owner>georgesak@chromium.org</owner> <summary> Windows-only metric that represents the approximate percentage of physical @@ -60474,6 +60485,9 @@ <histogram name="Memory.Stats.Win.TotalPageFile2" units="MB" expires_after="M77"> + <obsolete> + Deprecated in 05/2019 + </obsolete> <owner>georgesak@chromium.org</owner> <summary> Windows-only metric that represents the current committed memory limit for @@ -60493,6 +60507,9 @@ </histogram> <histogram name="Memory.Stats.Win.TotalPhys2" units="MB"> + <obsolete> + Deprecated in 05/2019 + </obsolete> <owner>georgesak@chromium.org</owner> <summary> Windows-only metric that represents the amount of actual physical memory. @@ -60517,6 +60534,9 @@ </histogram> <histogram name="Memory.Stats.Win.TotalVirtual2" units="MB"> + <obsolete> + Deprecated in 05/2019 + </obsolete> <owner>georgesak@chromium.org</owner> <summary> Windows-only metric that represents the size of the user-mode portion of the @@ -65483,6 +65503,9 @@ </histogram> <histogram name="Net.AutoReload.CountAtStop" expires_after="M77"> + <obsolete> + Deprecated and removed 06/2019. + </obsolete> <owner>mmenke@chromium.org</owner> <summary> Number of times auto-reload has been attempted before auto-reload stopped @@ -65492,6 +65515,9 @@ </histogram> <histogram name="Net.AutoReload.CountAtSuccess" expires_after="M77"> + <obsolete> + Deprecated and removed 06/2019. + </obsolete> <owner>mmenke@chromium.org</owner> <summary> Number of times auto-reload had to attempt to reload a page before @@ -65500,6 +65526,9 @@ </histogram> <histogram name="Net.AutoReload.ErrorAtFirstSuccess" enum="NetErrorCodes"> + <obsolete> + Deprecated and removed 06/2019. + </obsolete> <owner>mmenke@chromium.org</owner> <summary> Original error code that started an auto-reload which then succeeded on the @@ -65509,6 +65538,9 @@ <histogram name="Net.AutoReload.ErrorAtStop" enum="NetErrorCodes" expires_after="M77"> + <obsolete> + Deprecated and removed 06/2019. + </obsolete> <owner>mmenke@chromium.org</owner> <summary> Error code, if any, when auto-reload stopped without succeeding, either @@ -65518,6 +65550,9 @@ <histogram name="Net.AutoReload.ErrorAtSuccess" enum="NetErrorCodes" expires_after="M77"> + <obsolete> + Deprecated and removed 06/2019. + </obsolete> <owner>mmenke@chromium.org</owner> <summary> Original error code that started an auto-reload which then eventually @@ -97436,7 +97471,7 @@ </histogram> <histogram name="Power.BacklightLevelOnAC" units="%"> - <owner>derat@chromium.org</owner> + <owner>tbroch@chromium.org</owner> <summary> The level of the backlight as a percentage when the user is on AC. Sampled every 30 seconds. @@ -97444,7 +97479,7 @@ </histogram> <histogram name="Power.BacklightLevelOnBattery" units="%"> - <owner>derat@chromium.org</owner> + <owner>tbroch@chromium.org</owner> <summary> The level of the backlight as a percentage when the user is on battery. Sampled every 30 seconds. @@ -97452,7 +97487,7 @@ </histogram> <histogram name="Power.BatteryChargeHealth" units="%"> - <owner>derat@chromium.org</owner> + <owner>tbroch@chromium.org</owner> <summary> Chrome OS battery charge health percentage. Sampled once when device starts charging. @@ -97483,7 +97518,7 @@ </histogram> <histogram name="Power.BatteryDischargeRate" units="mW"> - <owner>derat@chromium.org</owner> + <owner>tbroch@chromium.org</owner> <summary> Chrome OS battery discharge rate in mW sampled every 30 seconds while the device runs on battery. @@ -97548,7 +97583,7 @@ </histogram> <histogram name="Power.BatteryDischargeRateWhileSuspended" units="mW"> - <owner>derat@chromium.org</owner> + <owner>tbroch@chromium.org</owner> <summary> Chrome OS battery discharge rate in mW while the system was suspended, sampled at resume. Only reported if the system was on battery power both @@ -97559,7 +97594,7 @@ </histogram> <histogram name="Power.BatteryInfoSample" enum="BatteryInfoSampleResult"> - <owner>derat@chromium.org</owner> + <owner>tbroch@chromium.org</owner> <summary> Counts the number of times we have read the battery status from sysfs and if it gave us sensible values. @@ -97583,7 +97618,7 @@ </histogram> <histogram name="Power.BatteryRemainingAtEndOfSessionOnAC" units="%"> - <owner>derat@chromium.org</owner> + <owner>tbroch@chromium.org</owner> <summary> Chrome OS remaining battery charge as percent of the maximum battery charge, sampled at the end of a user session when the device is on AC. @@ -97591,7 +97626,7 @@ </histogram> <histogram name="Power.BatteryRemainingAtEndOfSessionOnBattery" units="%"> - <owner>derat@chromium.org</owner> + <owner>tbroch@chromium.org</owner> <summary> Chrome OS remaining battery charge as percent of the maximum battery charge, sampled at the end of a user session when the device is on battery. @@ -97599,7 +97634,7 @@ </histogram> <histogram name="Power.BatteryRemainingAtStartOfSessionOnAC" units="%"> - <owner>derat@chromium.org</owner> + <owner>tbroch@chromium.org</owner> <summary> Chrome OS remaining battery charge as percent of the maximum battery charge, sampled at the start of a user session when the device is on AC. @@ -97607,7 +97642,7 @@ </histogram> <histogram name="Power.BatteryRemainingAtStartOfSessionOnBattery" units="%"> - <owner>derat@chromium.org</owner> + <owner>tbroch@chromium.org</owner> <summary> Chrome OS remaining battery charge as percent of the maximum battery charge, sampled at the start of a user session when the device is on battery. @@ -97619,7 +97654,7 @@ <obsolete> Deprecated as of 03/2012, no longer being generated by powerd. </obsolete> - <owner>derat@chromium.org</owner> + <owner>tbroch@chromium.org</owner> <summary> Chrome OS remaining battery charge as percent of the maximum battery charge sampled when the device runs on battery. @@ -97627,7 +97662,7 @@ </histogram> <histogram name="Power.BatteryRemainingWhenChargeStarts" units="%"> - <owner>derat@chromium.org</owner> + <owner>tbroch@chromium.org</owner> <summary> Chrome OS remaining battery charge as percent of the maximum battery charge, sampled when charging starts. @@ -97639,7 +97674,7 @@ <obsolete> Deprecated as of 03/2012, no longer being generated by powerd. </obsolete> - <owner>derat@chromium.org</owner> + <owner>tbroch@chromium.org</owner> <summary> Chrome OS remaining time to empty battery in minutes sampled when the device runs on battery. @@ -97672,7 +97707,7 @@ Deprecated as of 5/2013. See Accel_BrightnessDown_F6 and Accel_BrightnessUp_F7 user actions instead. </obsolete> - <owner>derat@chromium.org</owner> + <owner>tbroch@chromium.org</owner> <summary> Number of times the user has adjusted brightness up and down while running on battery power. @@ -97685,7 +97720,7 @@ Deprecated as of 5/2013. See Accel_BrightnessDown_F6 and Accel_BrightnessUp_F7 user actions instead. </obsolete> - <owner>derat@chromium.org</owner> + <owner>tbroch@chromium.org</owner> <summary> Number of times the user has adjusted brightness up and down while running on AC power. @@ -97697,7 +97732,7 @@ <obsolete> Deprecated 11/2014 in issue 427057. </obsolete> - <owner>derat@chromium.org</owner> + <owner>tbroch@chromium.org</owner> <summary> External power supply type such as MAINS_CHARGER, USB_CHARGER, UNCONFIRMED_SPRING_CHARGER, SAFE_SPRING_CHARGER. A sample is reported each @@ -97708,7 +97743,7 @@ <histogram name="Power.ConnectedChargingPorts" enum="PowerConnectedChargingPorts"> <owner>bleung@chromium.org</owner> - <owner>derat@chromium.org</owner> + <owner>tbroch@chromium.org</owner> <summary> Connected charging ports on Chrome OS. A sample is reported every time that the power manager polls sysfs (typically every 30 seconds). Ordinals are @@ -97783,7 +97818,7 @@ <histogram name="Power.ExternalBrightnessReadResult" enum="ExternalDisplayReceiveResult" expires_after="M77"> - <owner>derat@chromium.org</owner> + <owner>tbroch@chromium.org</owner> <summary> The result of attempting to read an external display's brightness on Chrome OS. A read attempt is made after successfully requesting the brightness (see @@ -97793,7 +97828,7 @@ <histogram name="Power.ExternalBrightnessRequestResult" enum="ExternalDisplaySendResult" expires_after="M77"> - <owner>derat@chromium.org</owner> + <owner>tbroch@chromium.org</owner> <summary> The result of requesting an external display's brightness on Chrome OS. A request is sent when the user presses a brightness key and the current @@ -97804,7 +97839,7 @@ <histogram name="Power.ExternalBrightnessWriteResult" enum="ExternalDisplaySendResult" expires_after="M77"> - <owner>derat@chromium.org</owner> + <owner>tbroch@chromium.org</owner> <summary> The result of attempting to change an external display's brightness on Chrome OS. A request is sent when the user presses a brightness key and the @@ -97814,7 +97849,7 @@ <histogram name="Power.ExternalDisplayOpenResult" enum="ExternalDisplayOpenResult"> - <owner>derat@chromium.org</owner> + <owner>tbroch@chromium.org</owner> <summary> The result of attempting to open an I2C device to control an external display's brightness on Chrome OS. An attempt is made when a display is @@ -97840,7 +97875,8 @@ <histogram name="Power.IdleScreenDimCountDaily" units="count" expires_after="M77"> - <owner>derat@chromium.org</owner> + <owner>tbroch@chromium.org</owner> + <owner>jiameng@chromium.org</owner> <summary> Number of times that that the screen has been dimmed in response to user inactivity, reported daily. The count is accumulated through the day, @@ -97854,7 +97890,8 @@ <histogram name="Power.IdleScreenOffCountDaily" units="count" expires_after="M77"> - <owner>derat@chromium.org</owner> + <owner>tbroch@chromium.org</owner> + <owner>jiameng@chromium.org</owner> <summary> Number of times that that the screen has been turned off in response to user inactivity, reported daily. The count is accumulated through the day, @@ -97867,7 +97904,8 @@ </histogram> <histogram name="Power.IdleSuspendCountDaily" units="count"> - <owner>derat@chromium.org</owner> + <owner>tbroch@chromium.org</owner> + <owner>jiameng@chromium.org</owner> <summary> Number of times that that the system has suspended in response to user inactivity, reported daily. The count is accumulated through the day, @@ -97880,7 +97918,8 @@ </histogram> <histogram name="Power.IdleTimeAfterDimOnAC" units="ms" expires_after="M77"> - <owner>derat@chromium.org</owner> + <owner>tbroch@chromium.org</owner> + <owner>jiameng@chromium.org</owner> <summary> Chrome OS user idle time since the screen dimmed sampled when the user becomes active again if the device runs on AC. @@ -97889,7 +97928,8 @@ <histogram name="Power.IdleTimeAfterDimOnBattery" units="ms" expires_after="M77"> - <owner>derat@chromium.org</owner> + <owner>tbroch@chromium.org</owner> + <owner>jiameng@chromium.org</owner> <summary> Chrome OS user idle time since the screen dimmed sampled when the user becomes active again if the device runs on battery. @@ -97898,7 +97938,8 @@ <histogram name="Power.IdleTimeAfterScreenOffOnAC" units="ms" expires_after="M77"> - <owner>derat@chromium.org</owner> + <owner>tbroch@chromium.org</owner> + <owner>jiameng@chromium.org</owner> <summary> Chrome OS user idle time since the screen turned off sampled when the user becomes active again if the device runs on AC. @@ -97907,7 +97948,8 @@ <histogram name="Power.IdleTimeAfterScreenOffOnBattery" units="ms" expires_after="M77"> - <owner>derat@chromium.org</owner> + <owner>tbroch@chromium.org</owner> + <owner>jiameng@chromium.org</owner> <summary> Chrome OS user idle time since the screen turned off sampled when the user becomes active again if the device runs on battery. @@ -97915,7 +97957,8 @@ </histogram> <histogram name="Power.IdleTimeOnAC" units="ms" expires_after="M77"> - <owner>derat@chromium.org</owner> + <owner>tbroch@chromium.org</owner> + <owner>jiameng@chromium.org</owner> <summary> Chrome OS user idle time sampled when the user becomes active again if the device runs on AC. @@ -97923,7 +97966,8 @@ </histogram> <histogram name="Power.IdleTimeOnBattery" units="ms"> - <owner>derat@chromium.org</owner> + <owner>tbroch@chromium.org</owner> + <owner>jiameng@chromium.org</owner> <summary> Chrome OS user idle time sampled when the user becomes active again if the device runs on battery. @@ -97963,7 +98007,7 @@ </histogram> <histogram name="Power.KeyboardBacklightLevel" units="%"> - <owner>derat@chromium.org</owner> + <owner>tbroch@chromium.org</owner> <summary> The level of the keyboard backlight as a percentage. Sampled every 30 seconds. @@ -97971,7 +98015,7 @@ </histogram> <histogram name="Power.LengthOfSession" units="seconds"> - <owner>derat@chromium.org</owner> + <owner>tbroch@chromium.org</owner> <summary> The length of time, in seconds, that a user spent in a single session. Values for this metric are clamped to 12 hours, so the last bucket should be @@ -97980,7 +98024,7 @@ </histogram> <histogram name="Power.LidClosedSuspendCountDaily" units="count"> - <owner>derat@chromium.org</owner> + <owner>tbroch@chromium.org</owner> <summary> Number of times that that the system has suspended in response to its lid being closed, reported daily. The count is accumulated through the day, @@ -98024,7 +98068,7 @@ <histogram name="Power.MetricsDailyEventInterval" enum="DailyEventIntervalType" expires_after="M77"> - <owner>derat@chromium.org</owner> + <owner>tbroch@chromium.org</owner> <summary> Reasons why power-management-related daily metrics were reported. Chrome OS only. @@ -98095,7 +98139,8 @@ </histogram> <histogram name="Power.NumberOfAlsAdjustmentsPerSession" expires_after="M77"> - <owner>derat@chromium.org</owner> + <owner>tbroch@chromium.org</owner> + <owner>jiameng@chromium.org</owner> <summary> The number of times that the Automatic Light Sensor (ALS) adjusted the brightness during a session. Values for this metric are clamped to 10k @@ -98105,7 +98150,7 @@ </histogram> <histogram name="Power.NumberOfSessionsPerCharge"> - <owner>derat@chromium.org</owner> + <owner>tbroch@chromium.org</owner> <summary> The number of user sessions that occured since the last time that the device was charged. Values for this metric are clamped at 10k, so the last bucket @@ -98115,7 +98160,7 @@ <histogram name="Power.PowerButtonAcknowledgmentDelay" units="ms" expires_after="M77"> - <owner>derat@chromium.org</owner> + <owner>tbroch@chromium.org</owner> <summary> The amount of time between the user pressing the power button and Chrome acknowledging the button-down event on Chrome OS. Values for this metric are @@ -98124,7 +98169,7 @@ </histogram> <histogram name="Power.PowerButtonDownTime" units="ms" expires_after="M77"> - <owner>derat@chromium.org</owner> + <owner>tbroch@chromium.org</owner> <summary> The amount of time between the user pressing the power button and releasing it on Chrome OS. @@ -98159,7 +98204,7 @@ <histogram name="Power.PowerSupplyMaxPower" units="W"> <owner>bleung@chromium.org</owner> - <owner>derat@chromium.org</owner> + <owner>tbroch@chromium.org</owner> <summary> The maximum power supported by the connected power supply on Chrome OS. A sample is reported every time that the power manager polls sysfs (typically @@ -98169,7 +98214,7 @@ <histogram name="Power.PowerSupplyMaxVoltage" units="V" expires_after="M77"> <owner>bleung@chromium.org</owner> - <owner>derat@chromium.org</owner> + <owner>tbroch@chromium.org</owner> <summary> The maximum voltage supported by the connected power supply on Chrome OS. A sample is reported every time that the power manager polls sysfs (typically @@ -98179,7 +98224,7 @@ <histogram name="Power.PowerSupplyType" enum="PowerSupplyType"> <owner>bleung@chromium.org</owner> - <owner>derat@chromium.org</owner> + <owner>tbroch@chromium.org</owner> <summary> The type of the connected power supply on Chrome OS. A sample is reported every time that the power manager polls sysfs (typically every 30 seconds) @@ -98192,14 +98237,14 @@ Deprecated Feb 2014 by Power.SuspendAttemptsBeforeCancel and Power.SuspendAttemptsBeforeSuccess. </obsolete> - <owner>derat@chromium.org</owner> + <owner>tbroch@chromium.org</owner> <summary> The number of times Chrome OS retried suspend due to previous failure. </summary> </histogram> <histogram name="Power.ShutdownReason" enum="ShutdownReason"> - <owner>derat@chromium.org</owner> + <owner>tbroch@chromium.org</owner> <summary> The reason for the Chrome OS power manager shutting down or rebooting the system. @@ -98207,8 +98252,7 @@ </histogram> <histogram name="Power.SuspendAttempt" enum="SuspendAttempt"> - <owner>derat@chromium.org</owner> - <owner>snanda@chromium.org</owner> + <owner>tbroch@chromium.org</owner> <summary> The number of suspend attempts on Chrome OS. Samples are reported before each attempt, so this histogram may include cases where the system crashed @@ -98217,8 +98261,7 @@ </histogram> <histogram name="Power.SuspendAttemptsBeforeCancel"> - <owner>derat@chromium.org</owner> - <owner>snanda@chromium.org</owner> + <owner>tbroch@chromium.org</owner> <summary> The number of suspend attempts performed for a single suspend request (e.g. triggered by the lid being closed) that was eventually canceled on Chrome @@ -98228,8 +98271,7 @@ </histogram> <histogram name="Power.SuspendAttemptsBeforeSuccess"> - <owner>derat@chromium.org</owner> - <owner>snanda@chromium.org</owner> + <owner>tbroch@chromium.org</owner> <summary> The number of suspend attempts performed for a single suspend request (e.g. triggered by the lid being closed) that eventually succeeded on Chrome OS. @@ -98238,8 +98280,7 @@ </histogram> <histogram name="Power.SuspendResult" enum="SuspendResult"> - <owner>derat@chromium.org</owner> - <owner>snanda@chromium.org</owner> + <owner>tbroch@chromium.org</owner> <summary> The results of suspend attempts on Chrome OS. Samples are reported after each attempt. @@ -98251,7 +98292,7 @@ <obsolete> Deprecated Jan 2014 by Power.SuspendAttempt and Power.SuspendResult. </obsolete> - <owner>derat@chromium.org</owner> + <owner>tbroch@chromium.org</owner> <summary>Chrome OS suspend status.</summary> </histogram> @@ -98260,7 +98301,7 @@ <obsolete> No longer sent. </obsolete> - <owner>derat@chromium.org</owner> + <owner>tbroch@chromium.org</owner> <summary> The percentage of aborted fan attempts out of total fan attempts per session, where an abort is due to hysteresis. This value is computed from @@ -98273,7 +98314,7 @@ <obsolete> No longer sent. </obsolete> - <owner>derat@chromium.org</owner> + <owner>tbroch@chromium.org</owner> <summary> The percentage of fan trip point passes that are more than one trip point. This value is computed from boot and sent when powerd starts and then every @@ -98282,7 +98323,7 @@ </histogram> <histogram name="Power.TimeInSuspendAtBoot" units="minutes"> - <owner>derat@chromium.org</owner> + <owner>tbroch@chromium.org</owner> <owner>snanda@chromium.org</owner> <summary> Chrome OS time in minutes spent in suspend-to-RAM mode sampled at boot @@ -98291,7 +98332,7 @@ </histogram> <histogram name="Power.TimeInSuspendAtResume" units="minutes"> - <owner>derat@chromium.org</owner> + <owner>tbroch@chromium.org</owner> <owner>snanda@chromium.org</owner> <summary> Chrome OS time in minutes spent in suspend-to-RAM mode sampled at resume. @@ -98300,7 +98341,8 @@ <histogram name="Power.UserBrightnessAdjustmentsPerSessionOnAC" expires_after="M77"> - <owner>derat@chromium.org</owner> + <owner>tbroch@chromium.org</owner> + <owner>jiameng@chromium.org</owner> <summary> The number of times that the user adjusted the brightness during a session when on AC. Values for this metric are clamped to 10k count, so the last @@ -98309,7 +98351,8 @@ </histogram> <histogram name="Power.UserBrightnessAdjustmentsPerSessionOnBattery"> - <owner>derat@chromium.org</owner> + <owner>tbroch@chromium.org</owner> + <owner>jiameng@chromium.org</owner> <summary> The number of times that the user adjusted the brightness during a session when on battery. Values for this metric are clamped to 10k count, so the @@ -101220,6 +101263,24 @@ <summary>Size of the bookmarks database.</summary> </histogram> +<histogram name="Profile.BrowserActive.PerProfile" units="Profile ID" + expires_after="2020-06-30"> + <owner>msarda@chromium.org</owner> + <owner>tangltom@chromium.org</owner> + <summary> + Recorded every time a browser window becomes active. Each profile on a + client is assigned a unique bucket, i.e. whenever a browser window of + profile x becomes active, an entry is recorded in bucket x. + + Example: A user has 2 profiles and opens 1 browser window for each of them. + When the user switches back and forth between the windows, multiple entries + will be recorded in bucket 1 and 2, corresponding to the profiles. + + Note: The guest profile has bucket 0. Regular profiles start at bucket 1. + Incognito browser windows count towards the original profile. + </summary> +</histogram> + <histogram name="Profile.CookiesSize" units="MB" expires_after="2018-08-30"> <owner>Please list the metric's owners. Add more owner tags as needed.</owner> <summary>Size of the cookies database.</summary> @@ -131544,6 +131605,9 @@ </histogram> <histogram name="Tabs.Discard.MemAllocatedMB" units="MB"> + <obsolete> + Deprecated 05/2019 + </obsolete> <owner>jamescook@chromium.org</owner> <summary> System-wide memory allocation at the time a tab was discarded, roughly @@ -131567,6 +131631,9 @@ </histogram> <histogram name="Tabs.Discard.MemAvailableMB" units="MB"> + <obsolete> + Deprecated 05/2019 + </obsolete> <owner>jamescook@chromium.org</owner> <summary> System-wide file-backed memory plus free memory, roughly equivalent to what @@ -131577,6 +131644,9 @@ </histogram> <histogram name="Tabs.Discard.MemGraphicsMB" units="MB" expires_after="M77"> + <obsolete> + Deprecated 05/2019 + </obsolete> <owner>jamescook@chromium.org</owner> <summary> Graphics driver (GEM object) memory at the time of a tab discard. @@ -131584,6 +131654,9 @@ </histogram> <histogram name="Tabs.Discard.MemShmemMB" units="MB" expires_after="M77"> + <obsolete> + Deprecated 05/2019 + </obsolete> <owner>jamescook@chromium.org</owner> <summary> System-wide shared memory at the time of a tab discard. Used primarily for @@ -136533,7 +136606,8 @@ </histogram> <histogram name="Uptime.DBusCrash" units="ms"> - <owner>derat@chromium.org</owner> + <owner>satorux@chromium.org</owner> + <owner>hashimoto@chromium.org</owner> <summary> The system uptime on Chrome OS when the dbus-daemon process crashes, resulting in a reboot. @@ -145176,7 +145250,7 @@ </histogram> <histogram name="WebRTC.Video.Screenshare.BandwidthLimitedResolutionInPercent" - units="%" expires_after="M77"> + units="%" expires_after="M80"> <owner>sprang@chromium.org</owner> <summary> Percentage of sent frames that are limited in resolution due to bandwidth @@ -145204,7 +145278,7 @@ </histogram> <histogram name="WebRTC.Video.Screenshare.Decoded.Vp8.Qp" units="qp value" - expires_after="M77"> + expires_after="M80"> <owner>ilnik@chromium.org</owner> <summary> The average QP (quantizer value) per frame for a received VP8 screenshare @@ -145213,7 +145287,7 @@ </histogram> <histogram name="WebRTC.Video.Screenshare.DroppedFrames.Capturer" - units="frames" expires_after="M77"> + units="frames" expires_after="M80"> <owner>ilnik@chromium.org</owner> <summary> Total number of frames dropped by a capturer for a sent screenshare stream. @@ -145222,7 +145296,7 @@ </histogram> <histogram name="WebRTC.Video.Screenshare.DroppedFrames.Encoder" units="frames" - expires_after="M77"> + expires_after="M80"> <owner>ilnik@chromium.org</owner> <summary> Total number of frames dropped by an encoder's internal rate limiter for a @@ -145240,7 +145314,7 @@ </histogram> <histogram name="WebRTC.Video.Screenshare.DroppedFrames.Ratelimiter" - units="frames" expires_after="M77"> + units="frames" expires_after="M80"> <owner>ilnik@chromium.org</owner> <summary> Total number of frames dropped by a WebRTC rate limiter (in MediaOpt) for a @@ -145249,7 +145323,7 @@ </histogram> <histogram name="WebRTC.Video.Screenshare.EncodeTimeInMs" units="ms" - expires_after="M77"> + expires_after="M80"> <owner>sprang@chromium.org</owner> <summary> The average encode time per frame for a sent (screen content) video stream. @@ -145274,7 +145348,7 @@ </histogram> <histogram name="WebRTC.Video.Screenshare.FecBitrateSentInKbps" units="kbps" - expires_after="M77"> + expires_after="M80"> <owner>sprang@chromium.org</owner> <summary> The number of sent FEC bits per second for a sent screenshare stream. @@ -145284,7 +145358,7 @@ </histogram> <histogram name="WebRTC.Video.Screenshare.FirPacketsReceivedPerMinute" - units="packets/minute" expires_after="M77"> + units="packets/minute" expires_after="M80"> <owner>sprang@chromium.org</owner> <summary> The number of received RTCP FIR packets per minute for a sent screenshare @@ -145304,7 +145378,7 @@ </histogram> <histogram name="WebRTC.Video.Screenshare.FramesPerOvershoot" - units="sent/overshoot ratio" expires_after="M77"> + units="sent/overshoot ratio" expires_after="M80"> <owner>sprang@chromium.org</owner> <summary> Ratio of sent frames to number of re-encoded frames (due to target bitrate @@ -145314,7 +145388,7 @@ </histogram> <histogram name="WebRTC.Video.Screenshare.InputFramesPerSecond" units="fps" - expires_after="M77"> + expires_after="M80"> <owner>asapersson@chromium.org</owner> <summary> The number of incoming frames per second for a sent (screen content) video @@ -145324,7 +145398,7 @@ </histogram> <histogram name="WebRTC.Video.Screenshare.InputHeightInPixels" units="pixels" - expires_after="M77"> + expires_after="M80"> <owner>sprang@chromium.org</owner> <summary> The average input height per frame (for incoming frames to video engine) for @@ -145333,7 +145407,7 @@ </histogram> <histogram name="WebRTC.Video.Screenshare.InputWidthInPixels" units="pixels" - expires_after="M77"> + expires_after="M80"> <owner>sprang@chromium.org</owner> <summary> The average input width per frame (for incoming frames to video engine) for @@ -145351,7 +145425,7 @@ </histogram> <histogram name="WebRTC.Video.Screenshare.InterframeDelayInMs" units="ms" - expires_after="M77"> + expires_after="M80"> <owner>ilnik@chromium.org</owner> <summary> The average interframe delay for a received screenshare stream. Recorded @@ -145368,7 +145442,7 @@ </histogram> <histogram name="WebRTC.Video.Screenshare.KeyFramesReceivedInPermille" - units="permille" expires_after="M77"> + units="permille" expires_after="M80"> <owner>ilnik@chromium.org</owner> <summary> Permille of frames that are key frames for a received screenshare stream. @@ -145400,7 +145474,7 @@ </histogram> <histogram name="WebRTC.Video.Screenshare.MeanFreezeDurationMs" units="ms" - expires_after="M77"> + expires_after="M80"> <owner>ilnik@chromium.org</owner> <summary> The average duration of a freeze in screenshare playback. Recorded then a @@ -145409,7 +145483,7 @@ </histogram> <histogram name="WebRTC.Video.Screenshare.MeanTimeBetweenFreezesMs" units="ms" - expires_after="M77"> + expires_after="M80"> <owner>ilnik@chromium.org</owner> <summary> The average duration of a smooth video playback for screenshare stream. @@ -145418,7 +145492,7 @@ </histogram> <histogram name="WebRTC.Video.Screenshare.MediaBitrateReceivedInKbps" - units="kbps" expires_after="M77"> + units="kbps" expires_after="M80"> <owner>ilnik@chromium.org</owner> <summary> The number of received media payload bits per second for a received @@ -145428,7 +145502,7 @@ </histogram> <histogram name="WebRTC.Video.Screenshare.MediaBitrateSentInKbps" units="kbps" - expires_after="M77"> + expires_after="M80"> <owner>sprang@chromium.org</owner> <summary> The number of sent media payload bits per second for a sent screenshare @@ -145459,7 +145533,7 @@ </histogram> <histogram name="WebRTC.Video.Screenshare.PaddingBitrateSentInKbps" - units="kbps" expires_after="M77"> + units="kbps" expires_after="M80"> <owner>sprang@chromium.org</owner> <summary> The number of sent padding bits per second for a sent screenshare stream. @@ -145469,7 +145543,7 @@ </histogram> <histogram name="WebRTC.Video.Screenshare.PliPacketsReceivedPerMinute" - units="packets/minute" expires_after="M77"> + units="packets/minute" expires_after="M80"> <owner>sprang@chromium.org</owner> <summary> The number of received RTCP PLI packets per minute for a sent screenshare @@ -145498,7 +145572,7 @@ </histogram> <histogram name="WebRTC.Video.Screenshare.ReceivedHeightInPixels" - units="pixels" expires_after="M77"> + units="pixels" expires_after="M80"> <owner>ilnik@chromium.org</owner> <summary> The average received height per frame for a received screenshare stream. @@ -145516,7 +145590,7 @@ </histogram> <histogram name="WebRTC.Video.Screenshare.ReceivedWidthInPixels" units="pixels" - expires_after="M77"> + expires_after="M80"> <owner>ilnik@chromium.org</owner> <summary> The average received width per frame for a received screenshare stream. @@ -145544,7 +145618,7 @@ </histogram> <histogram name="WebRTC.Video.Screenshare.RtxBitrateSentInKbps" units="kbps" - expires_after="M77"> + expires_after="M80"> <owner>sprang@chromium.org</owner> <summary> The number of sent bits over RTX per second for a sent screenshare stream. @@ -145578,7 +145652,7 @@ </histogram> <histogram name="WebRTC.Video.Screenshare.SentFramesPerSecond" units="fps" - expires_after="M77"> + expires_after="M80"> <owner>asapersson@chromium.org</owner> <summary> The number of sent frames per second for a sent (screen content) video @@ -145614,7 +145688,7 @@ </histogram> <histogram name="WebRTC.Video.Screenshare.SentWidthInPixels" units="pixels" - expires_after="M77"> + expires_after="M80"> <owner>sprang@chromium.org</owner> <summary> The average sent width per frame for a sent (screen content) video stream. @@ -145623,7 +145697,7 @@ </histogram> <histogram name="WebRTC.Video.Screenshare.TimeInBlockyVideoPercentage" - units="%" expires_after="M77"> + units="%" expires_after="M80"> <owner>ilnik@chromium.org</owner> <summary> Percentage of time the received screenshare stream playbacks low quality @@ -145640,7 +145714,7 @@ </histogram> <histogram name="WebRTC.Video.Screenshare.UniqueNackRequestsReceivedInPercent" - units="%" expires_after="M77"> + units="%" expires_after="M80"> <owner>sprang@chromium.org</owner> <summary> Percentage of unique RTCP NACK requests that are received in response to a @@ -145713,7 +145787,7 @@ </histogram> <histogram name="WebRTC.Video.SentToInputFpsRatioPercent" units="%" - expires_after="M77"> + expires_after="M80"> <owner>ilnik@chromium.org</owner> <summary> Ratio between SentFramesPerSecond and InputFramesPerSecond in percents. @@ -145739,7 +145813,7 @@ </histogram> <histogram name="WebRTC.Video.TimeInBlockyVideoPercentage" units="%" - expires_after="M77"> + expires_after="M80"> <owner>ilnik@chromium.org</owner> <summary> Percentage of time the receive video stream playbacks low quality blocky
diff --git a/tools/perf/benchmarks/v8_browsing.py b/tools/perf/benchmarks/v8_browsing.py index 2d69f194..014787f 100644 --- a/tools/perf/benchmarks/v8_browsing.py +++ b/tools/perf/benchmarks/v8_browsing.py
@@ -54,24 +54,12 @@ '-*', # Memory categories. 'disabled-by-default-memory-infra', - # UE categories required by runtimeStatsTotalMetric to bucket - # runtimeStats by UE. - 'rail', - # EQT categories. - 'blink.user_timing', - 'loading', - 'navigation', 'toplevel', # V8 categories. 'disabled-by-default-v8.gc', - 'renderer.scheduler', 'v8', 'v8.console', 'webkit.console', - # TODO(crbug.com/616441, primiano): Remove this temporary workaround, - # which enables memory-infra V8 code stats in V8 code size benchmarks - # only (to not slow down detailed memory dumps in other benchmarks). - 'disabled-by-default-memory-infra.v8.code_stats', # Blink categories. 'blink_gc', ]
diff --git a/tools/perf/contrib/media_router_benchmarks/media_router_base_page.py b/tools/perf/contrib/media_router_benchmarks/media_router_base_page.py index dd009e9..aba5fd4 100644 --- a/tools/perf/contrib/media_router_benchmarks/media_router_base_page.py +++ b/tools/perf/contrib/media_router_benchmarks/media_router_base_page.py
@@ -123,13 +123,15 @@ timeout=15) def WaitForSink(self, action_runner, target_sink, error_message, timeout=5): - sink_list = action_runner.tab.GetCastSinks() + sink_name_list = [sink['name'] for sink in action_runner.tab.GetCastSinks()] start_time = time.time() - while target_sink not in sink_list and time.time() - start_time < timeout: + while (target_sink not in sink_name_list + and time.time() - start_time < timeout): action_runner.tab.EnableCast() - sink_list = action_runner.tab.GetCastSinks() + sink_name_list = [ + sink['name'] for sink in action_runner.tab.GetCastSinks()] action_runner.Wait(1) - if target_sink not in sink_list: + if target_sink not in sink_name_list: raise RuntimeError(error_message) def _WaitForResult(self, action_runner, verify_func, error_message,
diff --git a/tools/perf/core/bot_platforms.py b/tools/perf/core/bot_platforms.py index a829564..9c2cd9ae 100644 --- a/tools/perf/core/bot_platforms.py +++ b/tools/perf/core/bot_platforms.py
@@ -105,10 +105,10 @@ _MAC_HIGH_END_BENCHMARK_NAMES = _OFFICIAL_EXCEPT_DISPLAY_LOCKING _MAC_LOW_END_BENCHMARK_NAMES = OFFICIAL_BENCHMARK_NAMES _WIN_10_BENCHMARK_NAMES = _OFFICIAL_EXCEPT_DISPLAY_LOCKING +_WIN_10_LOW_END_HP_CANDIDATE_BENCHMARK_NAMES = frozenset([ + 'rendering.desktop']) _WIN_7_BENCHMARK_NAMES = _OFFICIAL_EXCEPT_DISPLAY_LOCKING _WIN_7_GPU_BENCHMARK_NAMES = _OFFICIAL_EXCEPT_DISPLAY_LOCKING -_WIN_LOW_END_HP_CANDIDATE_BENCHMARK_NAMES = frozenset([ - 'rendering.desktop']) _ANDROID_GO_BENCHMARK_NAMES = frozenset([ 'memory.top_10_mobile', 'system_health.memory_mobile', @@ -187,9 +187,9 @@ _ANDROID_PIXEL2_WEBVIEW_BENCHMARK_NAMES, num_shards=28) # FYI bots -WIN_LOW_END_HP_CANDIDATE = PerfPlatform( - 'win_laptop_low_end-perf_HP-Candidate', 'HP 15-BS121NR Laptop Candidate', - _WIN_LOW_END_HP_CANDIDATE_BENCHMARK_NAMES, +WIN_10_LOW_END_HP_CANDIDATE = PerfPlatform( + 'win-10_laptop_low_end-perf_HP-Candidate', 'HP 15-BS121NR Laptop Candidate', + _WIN_10_LOW_END_HP_CANDIDATE_BENCHMARK_NAMES, num_shards=1, platform_os='win', is_fyi=True) ANDROID_NEXUS5X_PERF_FYI = PerfPlatform( 'android-nexus5x-perf-fyi', 'Android MMB29Q',
diff --git a/tools/perf/core/perf_data_generator.py b/tools/perf/core/perf_data_generator.py index 724e4f3..dbcb095 100755 --- a/tools/perf/core/perf_data_generator.py +++ b/tools/perf/core/perf_data_generator.py
@@ -129,7 +129,7 @@ 'pool': 'chrome.tests.perf-fyi', }, }, - 'win_laptop_low_end-perf_HP-Candidate': { + 'win-10_laptop_low_end-perf_HP-Candidate': { 'tests': [ { 'isolate': 'performance_test_suite', @@ -137,7 +137,7 @@ 'extra_args': [ '--run-ref-build', '--test-shard-map-filename=' - 'win_laptop_low_end-perf_HP-Candidate_map.json', + 'win-10_laptop_low_end-perf_HP-Candidate_map.json', ], }, ], @@ -146,6 +146,9 @@ 'dimension': { 'pool': 'chrome.tests.perf-fyi', 'id': 'build370-a7', + # (TODO crbug.com/971204) Explicitly set the gpu to None to make + # chromium_swarming recipe_module ignore this dimension. + 'gpu': None, }, }, }
diff --git a/tools/perf/core/perf_json_config_validator.py b/tools/perf/core/perf_json_config_validator.py index 05163384..4690a166 100644 --- a/tools/perf/core/perf_json_config_validator.py +++ b/tools/perf/core/perf_json_config_validator.py
@@ -99,7 +99,7 @@ "%s must use 'android-chromium', 'android-chrome' or 'exact' " "browser" % builder_name) elif builder_name in ('win-10-perf', 'Win 7 Nvidia GPU Perf', - 'win_laptop_low_end-perf_HP-Candidate'): + 'win-10_laptop_low_end-perf_HP-Candidate'): if browser_options.browser != 'release_x64': raise ValueError("%s must use 'release_x64' browser type" % builder_name)
diff --git a/tools/perf/core/shard_maps/timing_data/win_laptop_low_end-perf_hp-candidate_timing.json b/tools/perf/core/shard_maps/timing_data/win-10_laptop_low_end-perf_hp-candidate_timing.json similarity index 100% rename from tools/perf/core/shard_maps/timing_data/win_laptop_low_end-perf_hp-candidate_timing.json rename to tools/perf/core/shard_maps/timing_data/win-10_laptop_low_end-perf_hp-candidate_timing.json
diff --git a/tools/perf/core/shard_maps/win_laptop_low_end-perf_hp-candidate_map.json b/tools/perf/core/shard_maps/win-10_laptop_low_end-perf_hp-candidate_map.json similarity index 100% rename from tools/perf/core/shard_maps/win_laptop_low_end-perf_hp-candidate_map.json rename to tools/perf/core/shard_maps/win-10_laptop_low_end-perf_hp-candidate_map.json
diff --git a/tools/polymer/PRESUBMIT.py b/tools/polymer/PRESUBMIT.py new file mode 100644 index 0000000..68b593a --- /dev/null +++ b/tools/polymer/PRESUBMIT.py
@@ -0,0 +1,35 @@ +# 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. + +"""Presubmit script for files in tools/polymer/ + +See http://dev.chromium.org/developers/how-tos/depottools/presubmit-scripts +for more details about the presubmit API built into depot_tools. +""" + +def RunPolymerTests(input_api, output_api): + presubmit_path = input_api.PresubmitLocalPath() + sources = ['polymer_test.py'] + tests = [input_api.os_path.join(presubmit_path, s) for s in sources] + return input_api.canned_checks.RunUnitTests(input_api, output_api, tests) + + +def _CheckChangeOnUploadOrCommit(input_api, output_api): + results = [] + affected = input_api.AffectedFiles() + + webui_sources = set(['polymer.py']) + affected_files = [input_api.os_path.basename(f.LocalPath()) for f in affected] + if webui_sources.intersection(set(affected_files)): + results += RunPolymerTests(input_api, output_api) + + return results + + +def CheckChangeOnUpload(input_api, output_api): + return _CheckChangeOnUploadOrCommit(input_api, output_api) + + +def CheckChangeOnCommit(input_api, output_api): + return _CheckChangeOnUploadOrCommit(input_api, output_api)
diff --git a/tools/polymer/polymer.gni b/tools/polymer/polymer.gni new file mode 100644 index 0000000..990ccf6 --- /dev/null +++ b/tools/polymer/polymer.gni
@@ -0,0 +1,31 @@ +# 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. + +template("js_html_template") { + action(target_name + "_js_html_template") { + script = "//tools/polymer/polymer.py" + + inputs = [ + invoker.js_file, + invoker.html_file, + ] + + outputs = [ + "$target_gen_dir/" + invoker.js_file, + ] + + args = [ + "--js_file", + invoker.js_file, + "--html_file", + invoker.html_file, + "--html_type", + invoker.html_type, + "--in_folder", + rebase_path(".", root_build_dir), + "--out_folder", + rebase_path(target_gen_dir, root_build_dir), + ] + } +}
diff --git a/tools/polymer/polymer.py b/tools/polymer/polymer.py new file mode 100644 index 0000000..13ca4d6a --- /dev/null +++ b/tools/polymer/polymer.py
@@ -0,0 +1,111 @@ +# 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. + +# Helper script for inlining HTML content from an HTML to a JS file. This is +# necessary for Polymer3 UI elements. The following |html_type| options are +# provided +# - dom-module: Extracts HTML content from a Polymer2 HTML file hosting a +# dom-module. +# - custom-style: Extracts HTML content from a Polymer HTML file hosting a +# custom-style. +# - v3-ready: Extracts HTML content from a file that is only used in Polymer3. +# +# "dom-module" and "custom-style" are useful for avoiding duplicating HTML code +# between Polymer2 and Polymer3 while migration is in progress. +# +# Note: Having multiple <dom-module>s within a single HTML file is not currently +# supported by this script. + +import argparse +import os +import re +import sys + +_CWD = os.getcwd() + +HTML_TEMPLATE_REGEX = '{__html_template__}' + + +def ExtractTemplate(html_file, html_type): + if html_type == 'v3-ready': + with open(html_file, 'r') as f: + return f.read() + + if html_type == 'dom-module': + with open(html_file, 'r') as f: + lines = f.readlines() + start_line = -1 + end_line = -1 + for i, line in enumerate(lines): + if re.match(r'\s*<dom-module ', line): + assert start_line == -1 + assert end_line == -1 + assert re.match(r'\s*<template', lines[i + 1]) + start_line = i + 2; + if re.match(r'\s*</dom-module>', line): + assert start_line != -1 + assert end_line == -1 + assert re.match(r'\s*</template>', lines[i - 2]) + assert re.match(r'\s*<script ', lines[i - 1]) + end_line = i - 3; + return ''.join(lines[start_line:end_line + 1]) + + assert html_type == 'custom-style' + with open(html_file, 'r') as f: + lines = f.readlines() + start_line = -1 + end_line = -1 + for i, line in enumerate(lines): + if re.match(r'\s*<custom-style>', line): + assert start_line == -1 + assert end_line == -1 + start_line = i; + if re.match(r'\s*</custom-style>', line): + assert start_line != -1 + assert end_line == -1 + end_line = i; + + return ''.join(lines[start_line:end_line + 1]) + + +def ProcessFile(js_file, html_file, html_type, out_folder): + html_template = ExtractTemplate(html_file, html_type) + + with open(js_file) as f: + lines = f.readlines() + + for i, line in enumerate(lines): + line = line.replace(HTML_TEMPLATE_REGEX, html_template) + lines[i] = line + + # Reconstruct file. + out_filename = os.path.basename(js_file) + + with open(os.path.join(out_folder, out_filename), 'w') as f: + for l in lines: + f.write(l) + return + +def main(argv): + parser = argparse.ArgumentParser() + parser.add_argument('--in_folder', required=True) + parser.add_argument('--out_folder', required=True) + parser.add_argument('--js_file', required=True) + parser.add_argument('--html_file', required=True) + parser.add_argument( + '--html_type', choices=['dom-module', 'custom-style', 'v3-ready'], + required=True) + args = parser.parse_args(argv) + + in_folder = os.path.normpath(os.path.join(_CWD, args.in_folder)) + out_folder = os.path.normpath(os.path.join(_CWD, args.out_folder)) + + ProcessFile( + os.path.join(in_folder, args.js_file), + os.path.join(in_folder, args.html_file), + args.html_type, out_folder) + + +if __name__ == '__main__': + main(sys.argv[1:])
diff --git a/tools/polymer/polymer_test.py b/tools/polymer/polymer_test.py new file mode 100755 index 0000000..ebb5bc0 --- /dev/null +++ b/tools/polymer/polymer_test.py
@@ -0,0 +1,168 @@ +#!/usr/bin/env python +# 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. + +import polymer +import os +import shutil +import tempfile +import unittest + + +_HERE_DIR = os.path.dirname(__file__) + + +class HtmlToJsTest(unittest.TestCase): + def setUp(self): + self._out_folder = None + self._tmp_dirs = [] + self._tmp_src_dir = None + + def tearDown(self): + for tmp_dir in self._tmp_dirs: + shutil.rmtree(tmp_dir) + + def _write_file_to_src_dir(self, file_path, file_contents): + if not self._tmp_src_dir: + self._tmp_src_dir = self._create_tmp_dir() + file_path_normalized = os.path.normpath(os.path.join(self._tmp_src_dir, + file_path)) + file_dir = os.path.dirname(file_path_normalized) + if not os.path.exists(file_dir): + os.makedirs(file_dir) + with open(file_path_normalized, 'w') as tmp_file: + tmp_file.write(file_contents) + + def _create_tmp_dir(self): + tmp_dir = tempfile.mkdtemp(dir=_HERE_DIR) + self._tmp_dirs.append(tmp_dir) + return tmp_dir + + def _read_out_file(self, file_name): + assert self._out_folder + return open(os.path.join(self._out_folder, file_name), 'r').read() + + def _run_html_to_js(self, js_file, html_file, html_type): + assert not self._out_folder + self._out_folder = self._create_tmp_dir() + polymer.main([ + '--in_folder', self._tmp_src_dir, + '--out_folder', self._out_folder, + '--js_file', js_file, + '--html_file', html_file, + '--html_type', html_type, + ]) + + def _run_test_(self, html_type, src_html, src_js, expected_js): + self._write_file_to_src_dir('foo.html', src_html) + self._write_file_to_src_dir('foo.js', src_js) + self._run_html_to_js('foo.js', 'foo.html', html_type) + actual_js = self._read_out_file('foo.js') + self.assertEquals(expected_js, actual_js) + + # Test case where HTML is extracted from a Polymer2 <dom-module>. + def testSuccess_DomModule(self): + self._run_test_('dom-module', ''' +<link rel="import" href="../../foo/bar.html"> +<link rel="import" href="chrome://resources/foo/bar.html"> + +<dom-module id="cr-checkbox"> + <template> + <style> + div { + font-size: 2rem; + } + </style> + <div>Hello world</div> + </template> + <script src="foo.js"></script> +</dom-module> +''', ''' +Polymer({ + is: 'cr-foo', + + _template: html` +{__html_template__} + `, +}); +''', ''' +Polymer({ + is: 'cr-foo', + + _template: html` + <style> + div { + font-size: 2rem; + } + </style> + <div>Hello world</div> + + `, +}); +''') + + # Test case where HTML is extracted from a Polymer2 <custom-style>. + def testSuccess_CustomStyle(self): + self._run_test_('custom-style', ''' +<link rel="import" href="../../foo/bar.html"> +<link rel="import" href="chrome://resources/foo/bar.html"> + +<custom-style> + <style> + html { + --foo-bar: 2rem; + } + </style> +</custom-style> +''', ''' +$_documentContainer.innerHTML = ` +{__html_template__} + `; +''', ''' +$_documentContainer.innerHTML = ` +<custom-style> + <style> + html { + --foo-bar: 2rem; + } + </style> +</custom-style> + + `; +''') + + # Test case where the provided HTML is already in the form needed by Polymer3. + def testSuccess_V3Ready(self): + self._run_test_('v3-ready', '''<style> + div { + font-size: 2rem; + } +</style> +<div>Hello world</div> +''', ''' +Polymer({ + is: 'cr-foo', + + _template: html` +{__html_template__} + `, +}); +''', ''' +Polymer({ + is: 'cr-foo', + + _template: html` +<style> + div { + font-size: 2rem; + } +</style> +<div>Hello world</div> + + `, +}); +''') + +if __name__ == '__main__': + unittest.main()
diff --git a/ui/accessibility/ax_event_generator.cc b/ui/accessibility/ax_event_generator.cc index 949ad99..d71e00d 100644 --- a/ui/accessibility/ax_event_generator.cc +++ b/ui/accessibility/ax_event_generator.cc
@@ -100,12 +100,11 @@ // A newly created live region or alert should not *also* fire a // live region changed event. if (event == Event::LIVE_REGION_CHANGED && - (base::ContainsKey( - tree_events_[node], - EventParams(Event::ALERT, ax::mojom::EventFrom::kNone)) || - base::ContainsKey(tree_events_[node], - EventParams(Event::LIVE_REGION_CREATED, - ax::mojom::EventFrom::kNone)))) { + (base::Contains(tree_events_[node], + EventParams(Event::ALERT, ax::mojom::EventFrom::kNone)) || + base::Contains(tree_events_[node], + EventParams(Event::LIVE_REGION_CREATED, + ax::mojom::EventFrom::kNone)))) { return; }
diff --git a/ui/accessibility/ax_node_position_unittest.cc b/ui/accessibility/ax_node_position_unittest.cc index 02738ff3..c794a70 100644 --- a/ui/accessibility/ax_node_position_unittest.cc +++ b/ui/accessibility/ax_node_position_unittest.cc
@@ -1741,18 +1741,177 @@ TestPositionType test_position = null_position->AsPositionBeforeCharacter(); EXPECT_NE(nullptr, test_position); EXPECT_TRUE(test_position->IsNullPosition()); + test_position = null_position->AsLeafTextPositionBeforeCharacter(); + EXPECT_NE(nullptr, test_position); + EXPECT_TRUE(test_position->IsNullPosition()); test_position = null_position->AsPositionAfterCharacter(); EXPECT_NE(nullptr, test_position); EXPECT_TRUE(test_position->IsNullPosition()); + test_position = null_position->AsLeafTextPositionAfterCharacter(); + EXPECT_NE(nullptr, test_position); + EXPECT_TRUE(test_position->IsNullPosition()); } TEST_F(AXPositionTest, AsPositionBeforeCharacter) { + // A text offset that is on the line break right after "Line 1". + TestPositionType text_position = AXNodePosition::CreateTextPosition( + tree_.data().tree_id, root_.id, 6 /* text_offset */, + ax::mojom::TextAffinity::kDownstream); + ASSERT_NE(nullptr, text_position); + ASSERT_TRUE(text_position->IsTextPosition()); + TestPositionType test_position = text_position->AsPositionBeforeCharacter(); + EXPECT_NE(nullptr, test_position); + EXPECT_TRUE(test_position->IsTextPosition()); + EXPECT_EQ(root_.id, test_position->anchor_id()); + EXPECT_EQ(6, test_position->text_offset()); + + // A text offset that is on the line break right after "Line 1". + text_position = AXNodePosition::CreateTextPosition( + tree_.data().tree_id, text_field_.id, 6 /* text_offset */, + ax::mojom::TextAffinity::kUpstream); + ASSERT_NE(nullptr, text_position); + ASSERT_TRUE(text_position->IsTextPosition()); + test_position = text_position->AsPositionBeforeCharacter(); + EXPECT_NE(nullptr, test_position); + EXPECT_TRUE(test_position->IsTextPosition()); + EXPECT_EQ(text_field_.id, test_position->anchor_id()); + EXPECT_EQ(6, test_position->text_offset()); + EXPECT_EQ(ax::mojom::TextAffinity::kDownstream, test_position->affinity()); + + text_position = AXNodePosition::CreateTextPosition( + tree_.data().tree_id, text_field_.id, 13 /* text_offset */, + ax::mojom::TextAffinity::kDownstream); + ASSERT_NE(nullptr, text_position); + ASSERT_TRUE(text_position->IsTextPosition()); + test_position = text_position->AsPositionBeforeCharacter(); + EXPECT_NE(nullptr, test_position); + EXPECT_TRUE(test_position->IsNullPosition()); + + text_position = AXNodePosition::CreateTextPosition( + tree_.data().tree_id, static_text1_.id, 6 /* text_offset */, + ax::mojom::TextAffinity::kDownstream); + ASSERT_NE(nullptr, text_position); + ASSERT_TRUE(text_position->IsTextPosition()); + test_position = text_position->AsPositionBeforeCharacter(); + EXPECT_NE(nullptr, test_position); + EXPECT_TRUE(test_position->IsTextPosition()); + EXPECT_EQ(line_break_.id, test_position->anchor_id()); + EXPECT_EQ(0, test_position->text_offset()); + + text_position = AXNodePosition::CreateTextPosition( + tree_.data().tree_id, inline_box1_.id, 6 /* text_offset */, + ax::mojom::TextAffinity::kDownstream); + ASSERT_NE(nullptr, text_position); + ASSERT_TRUE(text_position->IsTextPosition()); + test_position = text_position->AsPositionBeforeCharacter(); + EXPECT_NE(nullptr, test_position); + EXPECT_TRUE(test_position->IsTextPosition()); + EXPECT_EQ(line_break_.id, test_position->anchor_id()); + EXPECT_EQ(0, test_position->text_offset()); + + text_position = AXNodePosition::CreateTextPosition( + tree_.data().tree_id, line_break_.id, 1 /* text_offset */, + ax::mojom::TextAffinity::kDownstream); + ASSERT_NE(nullptr, text_position); + ASSERT_TRUE(text_position->IsTextPosition()); + test_position = text_position->AsPositionBeforeCharacter(); + EXPECT_NE(nullptr, test_position); + EXPECT_TRUE(test_position->IsTextPosition()); + EXPECT_EQ(inline_box2_.id, test_position->anchor_id()); + EXPECT_EQ(0, test_position->text_offset()); +} + +TEST_F(AXPositionTest, AsPositionAfterCharacter) { + // A text offset that is after "Line 2". + TestPositionType text_position = AXNodePosition::CreateTextPosition( + tree_.data().tree_id, root_.id, 13 /* text_offset */, + ax::mojom::TextAffinity::kDownstream); + ASSERT_NE(nullptr, text_position); + ASSERT_TRUE(text_position->IsTextPosition()); + TestPositionType test_position = text_position->AsPositionAfterCharacter(); + EXPECT_NE(nullptr, test_position); + EXPECT_TRUE(test_position->IsTextPosition()); + EXPECT_EQ(root_.id, test_position->anchor_id()); + EXPECT_EQ(13, test_position->text_offset()); + + // A text offset that is before "Line 2". + text_position = AXNodePosition::CreateTextPosition( + tree_.data().tree_id, root_.id, 7 /* text_offset */, + ax::mojom::TextAffinity::kDownstream); + ASSERT_NE(nullptr, text_position); + ASSERT_TRUE(text_position->IsTextPosition()); + test_position = text_position->AsPositionAfterCharacter(); + EXPECT_NE(nullptr, test_position); + EXPECT_TRUE(test_position->IsTextPosition()); + EXPECT_EQ(root_.id, test_position->anchor_id()); + EXPECT_EQ(7, test_position->text_offset()); + + // A text offset that is on the line break right after "Line 1". + text_position = AXNodePosition::CreateTextPosition( + tree_.data().tree_id, text_field_.id, 6 /* text_offset */, + ax::mojom::TextAffinity::kUpstream); + ASSERT_NE(nullptr, text_position); + ASSERT_TRUE(text_position->IsTextPosition()); + test_position = text_position->AsPositionAfterCharacter(); + EXPECT_NE(nullptr, test_position); + EXPECT_TRUE(test_position->IsTextPosition()); + EXPECT_EQ(text_field_.id, test_position->anchor_id()); + EXPECT_EQ(6, test_position->text_offset()); + EXPECT_EQ(ax::mojom::TextAffinity::kUpstream, test_position->affinity()); + + text_position = AXNodePosition::CreateTextPosition( + tree_.data().tree_id, text_field_.id, 13 /* text_offset */, + ax::mojom::TextAffinity::kDownstream); + ASSERT_NE(nullptr, text_position); + ASSERT_TRUE(text_position->IsTextPosition()); + test_position = text_position->AsPositionAfterCharacter(); + EXPECT_NE(nullptr, test_position); + EXPECT_TRUE(test_position->IsTextPosition()); + EXPECT_EQ(text_field_.id, test_position->anchor_id()); + EXPECT_EQ(13, test_position->text_offset()); + + text_position = AXNodePosition::CreateTextPosition( + tree_.data().tree_id, line_break_.id, 0 /* text_offset */, + ax::mojom::TextAffinity::kDownstream); + ASSERT_NE(nullptr, text_position); + ASSERT_TRUE(text_position->IsTextPosition()); + test_position = text_position->AsPositionAfterCharacter(); + EXPECT_NE(nullptr, test_position); + EXPECT_TRUE(test_position->IsTextPosition()); + EXPECT_EQ(inline_box1_.id, test_position->anchor_id()); + EXPECT_EQ(6, test_position->text_offset()); + + text_position = AXNodePosition::CreateTextPosition( + tree_.data().tree_id, line_break_.id, 1 /* text_offset */, + ax::mojom::TextAffinity::kDownstream); + ASSERT_NE(nullptr, text_position); + ASSERT_TRUE(text_position->IsTextPosition()); + test_position = text_position->AsPositionAfterCharacter(); + EXPECT_NE(nullptr, test_position); + EXPECT_TRUE(test_position->IsTextPosition()); + EXPECT_EQ(line_break_.id, test_position->anchor_id()); + EXPECT_EQ(1, test_position->text_offset()); + + text_position = AXNodePosition::CreateTextPosition( + tree_.data().tree_id, inline_box2_.id, 6 /* text_offset */, + ax::mojom::TextAffinity::kDownstream); + ASSERT_NE(nullptr, text_position); + ASSERT_TRUE(text_position->IsTextPosition()); + test_position = text_position->AsPositionAfterCharacter(); + EXPECT_NE(nullptr, test_position); + EXPECT_TRUE(test_position->IsTextPosition()); + EXPECT_EQ(inline_box2_.id, test_position->anchor_id()); + EXPECT_EQ(6, test_position->text_offset()); +} + +TEST_F(AXPositionTest, AsLeafTextPositionBeforeCharacter) { TestPositionType text_position = AXNodePosition::CreateTextPosition( tree_.data().tree_id, root_.id, 0 /* text_offset */, ax::mojom::TextAffinity::kDownstream); ASSERT_NE(nullptr, text_position); ASSERT_TRUE(text_position->IsTextPosition()); - TestPositionType test_position = text_position->AsPositionBeforeCharacter(); + TestPositionType test_position = + text_position->AsLeafTextPositionBeforeCharacter(); EXPECT_NE(nullptr, test_position); EXPECT_TRUE(test_position->IsTextPosition()); EXPECT_EQ(inline_box1_.id, test_position->anchor_id()); @@ -1763,7 +1922,7 @@ ax::mojom::TextAffinity::kDownstream); ASSERT_NE(nullptr, text_position); ASSERT_TRUE(text_position->IsTextPosition()); - test_position = text_position->AsPositionBeforeCharacter(); + test_position = text_position->AsLeafTextPositionBeforeCharacter(); EXPECT_NE(nullptr, test_position); EXPECT_TRUE(test_position->IsTextPosition()); EXPECT_EQ(inline_box1_.id, test_position->anchor_id()); @@ -1774,7 +1933,7 @@ ax::mojom::TextAffinity::kDownstream); ASSERT_NE(nullptr, text_position); ASSERT_TRUE(text_position->IsTextPosition()); - test_position = text_position->AsPositionBeforeCharacter(); + test_position = text_position->AsLeafTextPositionBeforeCharacter(); EXPECT_NE(nullptr, test_position); EXPECT_TRUE(test_position->IsTextPosition()); EXPECT_EQ(inline_box2_.id, test_position->anchor_id()); @@ -1785,7 +1944,7 @@ ax::mojom::TextAffinity::kDownstream); ASSERT_NE(nullptr, text_position); ASSERT_TRUE(text_position->IsTextPosition()); - test_position = text_position->AsPositionBeforeCharacter(); + test_position = text_position->AsLeafTextPositionBeforeCharacter(); EXPECT_NE(nullptr, test_position); EXPECT_TRUE(test_position->IsTextPosition()); EXPECT_EQ(inline_box2_.id, test_position->anchor_id()); @@ -1796,18 +1955,19 @@ ax::mojom::TextAffinity::kDownstream); ASSERT_NE(nullptr, text_position); ASSERT_TRUE(text_position->IsTextPosition()); - test_position = text_position->AsPositionBeforeCharacter(); + test_position = text_position->AsLeafTextPositionBeforeCharacter(); EXPECT_NE(nullptr, test_position); EXPECT_TRUE(test_position->IsNullPosition()); } -TEST_F(AXPositionTest, AsPositionAfterCharacter) { +TEST_F(AXPositionTest, AsLeafTextPositionAfterCharacter) { TestPositionType text_position = AXNodePosition::CreateTextPosition( tree_.data().tree_id, inline_box1_.id, 0 /* text_offset */, ax::mojom::TextAffinity::kDownstream); ASSERT_NE(nullptr, text_position); ASSERT_TRUE(text_position->IsTextPosition()); - TestPositionType test_position = text_position->AsPositionAfterCharacter(); + TestPositionType test_position = + text_position->AsLeafTextPositionAfterCharacter(); EXPECT_NE(nullptr, test_position); EXPECT_TRUE(test_position->IsNullPosition()); @@ -1816,7 +1976,7 @@ ax::mojom::TextAffinity::kDownstream); ASSERT_NE(nullptr, text_position); ASSERT_TRUE(text_position->IsTextPosition()); - test_position = text_position->AsPositionAfterCharacter(); + test_position = text_position->AsLeafTextPositionAfterCharacter(); EXPECT_NE(nullptr, test_position); EXPECT_TRUE(test_position->IsTextPosition()); EXPECT_EQ(inline_box1_.id, test_position->anchor_id()); @@ -1827,7 +1987,7 @@ ax::mojom::TextAffinity::kDownstream); ASSERT_NE(nullptr, text_position); ASSERT_TRUE(text_position->IsTextPosition()); - test_position = text_position->AsPositionAfterCharacter(); + test_position = text_position->AsLeafTextPositionAfterCharacter(); EXPECT_NE(nullptr, test_position); EXPECT_TRUE(test_position->IsTextPosition()); EXPECT_EQ(line_break_.id, test_position->anchor_id()); @@ -1838,7 +1998,7 @@ ax::mojom::TextAffinity::kDownstream); ASSERT_NE(nullptr, text_position); ASSERT_TRUE(text_position->IsTextPosition()); - test_position = text_position->AsPositionAfterCharacter(); + test_position = text_position->AsLeafTextPositionAfterCharacter(); EXPECT_NE(nullptr, test_position); EXPECT_TRUE(test_position->IsTextPosition()); EXPECT_EQ(line_break_.id, test_position->anchor_id()); @@ -1849,7 +2009,7 @@ ax::mojom::TextAffinity::kDownstream); ASSERT_NE(nullptr, text_position); ASSERT_TRUE(text_position->IsTextPosition()); - test_position = text_position->AsPositionAfterCharacter(); + test_position = text_position->AsLeafTextPositionAfterCharacter(); EXPECT_NE(nullptr, test_position); EXPECT_TRUE(test_position->IsTextPosition()); EXPECT_EQ(inline_box2_.id, test_position->anchor_id()); @@ -1947,7 +2107,7 @@ AXBoundaryBehavior::CrossBoundary); EXPECT_NE(nullptr, test_position); EXPECT_TRUE(test_position->IsTextPosition()); - EXPECT_EQ(inline_box1_.id, test_position->anchor_id()); + EXPECT_EQ(text_field_.id, test_position->anchor_id()); EXPECT_EQ(1, test_position->text_offset()); // Affinity should have been reset to downstream. EXPECT_EQ(ax::mojom::TextAffinity::kDownstream, test_position->affinity()); @@ -1961,8 +2121,8 @@ AXBoundaryBehavior::CrossBoundary); EXPECT_NE(nullptr, test_position); EXPECT_TRUE(test_position->IsTextPosition()); - EXPECT_EQ(inline_box2_.id, test_position->anchor_id()); - EXPECT_EQ(6, test_position->text_offset()); + EXPECT_EQ(text_field_.id, test_position->anchor_id()); + EXPECT_EQ(13, test_position->text_offset()); // Affinity should have been reset to downstream. EXPECT_EQ(ax::mojom::TextAffinity::kDownstream, test_position->affinity()); } @@ -2044,7 +2204,7 @@ AXBoundaryBehavior::CrossBoundary); EXPECT_NE(nullptr, test_position); EXPECT_TRUE(test_position->IsTextPosition()); - EXPECT_EQ(inline_box1_.id, test_position->anchor_id()); + EXPECT_EQ(text_field_.id, test_position->anchor_id()); EXPECT_EQ(0, test_position->text_offset()); // Affinity should have been reset to downstream. EXPECT_EQ(ax::mojom::TextAffinity::kDownstream, test_position->affinity());
diff --git a/ui/accessibility/ax_position.h b/ui/accessibility/ax_position.h index c46b3f46..d9346cb 100644 --- a/ui/accessibility/ax_position.h +++ b/ui/accessibility/ax_position.h
@@ -269,7 +269,7 @@ case AXPositionKind::TEXT_POSITION: { const std::vector<int32_t> word_starts = text_position->GetWordStartOffsets(); - return base::ContainsValue( + return base::Contains( word_starts, static_cast<int32_t>(text_position->text_offset_)); } } @@ -287,7 +287,7 @@ case AXPositionKind::TEXT_POSITION: { const std::vector<int32_t> word_ends = text_position->GetWordEndOffsets(); - return base::ContainsValue( + return base::Contains( word_ends, static_cast<int32_t>(text_position->text_offset_)); } } @@ -802,27 +802,66 @@ } // Returns a text position located right before the next character (from this - // position) on the tree's text representation, following these conditions: + // position) in the tree's text representation, following these conditions: // - If this position is at the end of its anchor, normalize it to the start - // of the next text anchor. Both positions are equal when compared, but we - // consider the start of an anchor to be a position BEFORE its first - // character and the end to be AFTER its last character. + // of the next text anchor, regardless of the position's affinity. Both + // positions are equal when compared, but we consider the start of an anchor + // to be a position BEFORE its first character and the end to be AFTER its + // last character. // - Skip any empty text anchors; they're "invisible" to the text // representation and the next character could be ahead. // - Return a null position if there is no next character forward. + // Don't return a leaf equivalent position, but try and return a position that + // has the same anchor as the current position if the resulting position is + // enclosed by the same anchor. AXPositionInstance AsPositionBeforeCharacter() const { - AXPositionInstance text_position = AsLeafTextPosition(); + AXPositionInstance text_position = AsLeafTextPositionBeforeCharacter(); + // If possible, return a position anchored at the current position. This is + // necessary because we don't want to return any position that might be in + // the shadow DOM or a position anchored at a node that is not visible to + // platform APIs, if the original position didn't meet any of these + // criteria. + AXPositionInstance common_ancestor = + text_position->LowestCommonAncestor(*this); + if (GetAnchor() == common_ancestor->GetAnchor()) + text_position = std::move(common_ancestor); + + return text_position; + } + + // Returns a text position located right after the previous character (from + // this position) in the tree's text representation. + // See `AsPositionBeforeCharacter`, as this is its "reversed" version. + AXPositionInstance AsPositionAfterCharacter() const { + AXPositionInstance text_position = AsLeafTextPositionAfterCharacter(); + + // If possible, return a position anchored at the current position. This is + // necessary because we don't want to return any position that might be in + // the shadow DOM or a position anchored at a node that is not visible to + // platform APIs, if the original position didn't meet any of these + // criteria. + AXPositionInstance common_ancestor = + text_position->LowestCommonAncestor(*this); + if (GetAnchor() == common_ancestor->GetAnchor()) + text_position = std::move(common_ancestor); + + return text_position; + } + + // Same as `AsPositionBeforeCharacter`, but returns the leaf equivalent text + // position. + AXPositionInstance AsLeafTextPositionBeforeCharacter() const { + AXPositionInstance text_position = AsLeafTextPosition(); // This loop satisfies all the conditions described above. while (text_position->AtEndOfAnchor()) text_position = text_position->CreateNextTextAnchorPosition(); return text_position; } - // Returns a text position located right after the previous character (from - // this position) on the tree's text representation. - // See `AsPositionBeforeCharacter`, as this is its "reversed" version. - AXPositionInstance AsPositionAfterCharacter() const { + // Same as `AsPositionAfterCharacter`, but returns the leaf equivalent text + // position. + AXPositionInstance AsLeafTextPositionAfterCharacter() const { AXPositionInstance text_position = AsLeafTextPosition(); while (text_position->AtStartOfAnchor()) { text_position = text_position->CreatePreviousTextAnchorPosition();
diff --git a/ui/accessibility/ax_text_utils.cc b/ui/accessibility/ax_text_utils.cc index 19ad4d6e..fdce319 100644 --- a/ui/accessibility/ax_text_utils.cc +++ b/ui/accessibility/ax_text_utils.cc
@@ -6,6 +6,7 @@ #include "base/i18n/break_iterator.h" #include "base/logging.h" +#include "base/numerics/safe_conversions.h" #include "base/optional.h" #include "base/strings/string_util.h" #include "base/strings/utf_string_conversions.h" @@ -226,4 +227,33 @@ return base::string16(); } +std::vector<int> GetWordStartOffsets(const base::string16& text) { + std::vector<int> word_starts; + base::i18n::BreakIterator iter(text, base::i18n::BreakIterator::BREAK_WORD); + if (!iter.Init()) + return word_starts; + // iter.Advance() returns false if we've run past end of the text. + while (iter.Advance()) { + if (!iter.IsWord()) + continue; + word_starts.push_back( + base::checked_cast<int>(iter.prev()) /* start index */); + } + return word_starts; +} + +std::vector<int> GetWordEndOffsets(const base::string16& text) { + std::vector<int> word_ends; + base::i18n::BreakIterator iter(text, base::i18n::BreakIterator::BREAK_WORD); + if (!iter.Init()) + return word_ends; + // iter.Advance() returns false if we've run past end of the text. + while (iter.Advance()) { + if (!iter.IsWord()) + continue; + word_ends.push_back(base::checked_cast<int>(iter.pos()) /* end index */); + } + return word_ends; +} + } // namespace ui
diff --git a/ui/accessibility/ax_text_utils.h b/ui/accessibility/ax_text_utils.h index f39721d..07dabcb2 100644 --- a/ui/accessibility/ax_text_utils.h +++ b/ui/accessibility/ax_text_utils.h
@@ -29,7 +29,7 @@ // (depending on |direction|) from the given |start_offset| until the // given boundary is found, and return the offset of that boundary, // using the vector of line break character offsets in |line_breaks|. -size_t AX_EXPORT FindAccessibleTextBoundary(const base::string16& text, +AX_EXPORT size_t FindAccessibleTextBoundary(const base::string16& text, const std::vector<int>& line_breaks, AXTextBoundary boundary, size_t start_offset, @@ -37,13 +37,18 @@ ax::mojom::TextAffinity affinity); // Returns a string ID that corresponds to the name of the given action. -base::string16 AX_EXPORT -ActionVerbToLocalizedString(const ax::mojom::DefaultActionVerb action_verb); +AX_EXPORT base::string16 ActionVerbToLocalizedString( + const ax::mojom::DefaultActionVerb action_verb); // Returns the non-localized string representation of a supported action. // Some APIs on Linux and Windows need to return non-localized action names. -base::string16 AX_EXPORT -ActionVerbToUnlocalizedString(const ax::mojom::DefaultActionVerb action_verb); +AX_EXPORT base::string16 ActionVerbToUnlocalizedString( + const ax::mojom::DefaultActionVerb action_verb); + +// Returns indices of all word starts in |text|. +AX_EXPORT std::vector<int> GetWordStartOffsets(const base::string16& text); +// Returns indices of all word ends in |text|. +AX_EXPORT std::vector<int> GetWordEndOffsets(const base::string16& text); } // namespace ui
diff --git a/ui/accessibility/ax_text_utils_unittest.cc b/ui/accessibility/ax_text_utils_unittest.cc index 7e0561d..898ff05 100644 --- a/ui/accessibility/ax_text_utils_unittest.cc +++ b/ui/accessibility/ax_text_utils_unittest.cc
@@ -8,6 +8,7 @@ #include <utility> #include "base/strings/utf_string_conversions.h" +#include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" #include "ui/accessibility/ax_enums.mojom.h" #include "ui/accessibility/ax_text_boundary.h" @@ -251,4 +252,29 @@ verify_boundaries_at_offset(18, 18L, 19UL); } +TEST(AXTextUtils, GetWordOffsetsEmptyTest) { + const base::string16 text = base::UTF8ToUTF16(""); + std::vector<int> word_starts = GetWordStartOffsets(text); + std::vector<int> word_ends = GetWordEndOffsets(text); + EXPECT_EQ(0UL, word_starts.size()); + EXPECT_EQ(0UL, word_ends.size()); +} + +TEST(AXTextUtils, GetWordStartOffsetsBasicTest) { + const base::string16 text = base::UTF8ToUTF16("This is very simple input"); + EXPECT_THAT(GetWordStartOffsets(text), testing::ElementsAre(0, 5, 8, 13, 20)); +} + +TEST(AXTextUtils, GetWordEndOffsetsBasicTest) { + const base::string16 text = base::UTF8ToUTF16("This is very simple input"); + EXPECT_THAT(GetWordEndOffsets(text), testing::ElementsAre(4, 7, 12, 19, 25)); +} + +TEST(AXTextUtils, GetWordStartOffsetsMalformedInputTest) { + const base::string16 text = + base::UTF8ToUTF16("..we *## should parse $#@$ through bad ,, input"); + EXPECT_THAT(GetWordStartOffsets(text), + testing::ElementsAre(2, 9, 16, 27, 35, 43)); +} + } // namespace ui
diff --git a/ui/accessibility/ax_tree_unittest.cc b/ui/accessibility/ax_tree_unittest.cc index 83f5094c..b9c07106 100644 --- a/ui/accessibility/ax_tree_unittest.cc +++ b/ui/accessibility/ax_tree_unittest.cc
@@ -622,9 +622,9 @@ test_observer.subtree_reparented_finished_ids(); std::vector<int> node_reparented = test_observer.node_reparented_finished_ids(); - ASSERT_FALSE(base::ContainsValue(created, 3)); - ASSERT_TRUE(base::ContainsValue(subtree_reparented, 3)); - ASSERT_FALSE(base::ContainsValue(node_reparented, 3)); + ASSERT_FALSE(base::Contains(created, 3)); + ASSERT_TRUE(base::Contains(subtree_reparented, 3)); + ASSERT_FALSE(base::Contains(node_reparented, 3)); } TEST(AXTreeTest, TreeObserverIsNotCalledForReparenting) { @@ -1198,7 +1198,7 @@ auto reverse_active_descendant = tree.GetReverseRelations(ax::mojom::IntAttribute::kActivedescendantId, 2); ASSERT_EQ(1U, reverse_active_descendant.size()); - EXPECT_TRUE(base::ContainsKey(reverse_active_descendant, 1)); + EXPECT_TRUE(base::Contains(reverse_active_descendant, 1)); reverse_active_descendant = tree.GetReverseRelations(ax::mojom::IntAttribute::kActivedescendantId, 1); @@ -1211,8 +1211,8 @@ auto reverse_member_of = tree.GetReverseRelations(ax::mojom::IntAttribute::kMemberOfId, 1); ASSERT_EQ(2U, reverse_member_of.size()); - EXPECT_TRUE(base::ContainsKey(reverse_member_of, 3)); - EXPECT_TRUE(base::ContainsKey(reverse_member_of, 4)); + EXPECT_TRUE(base::Contains(reverse_member_of, 3)); + EXPECT_TRUE(base::Contains(reverse_member_of, 4)); AXTreeUpdate update = initial_state; update.nodes.resize(5); @@ -1233,13 +1233,13 @@ reverse_active_descendant = tree.GetReverseRelations(ax::mojom::IntAttribute::kActivedescendantId, 5); ASSERT_EQ(1U, reverse_active_descendant.size()); - EXPECT_TRUE(base::ContainsKey(reverse_active_descendant, 1)); + EXPECT_TRUE(base::Contains(reverse_active_descendant, 1)); reverse_member_of = tree.GetReverseRelations(ax::mojom::IntAttribute::kMemberOfId, 1); ASSERT_EQ(2U, reverse_member_of.size()); - EXPECT_TRUE(base::ContainsKey(reverse_member_of, 4)); - EXPECT_TRUE(base::ContainsKey(reverse_member_of, 5)); + EXPECT_TRUE(base::Contains(reverse_member_of, 4)); + EXPECT_TRUE(base::Contains(reverse_member_of, 5)); } TEST(AXTreeTest, IntListReverseRelations) { @@ -1266,7 +1266,7 @@ auto reverse_labelled_by = tree.GetReverseRelations(ax::mojom::IntListAttribute::kLabelledbyIds, 2); ASSERT_EQ(1U, reverse_labelled_by.size()); - EXPECT_TRUE(base::ContainsKey(reverse_labelled_by, 1)); + EXPECT_TRUE(base::Contains(reverse_labelled_by, 1)); reverse_labelled_by = tree.GetReverseRelations(ax::mojom::IntListAttribute::kLabelledbyIds, 3); @@ -1282,7 +1282,7 @@ reverse_labelled_by = tree.GetReverseRelations(ax::mojom::IntListAttribute::kLabelledbyIds, 3); ASSERT_EQ(1U, reverse_labelled_by.size()); - EXPECT_TRUE(base::ContainsKey(reverse_labelled_by, 1)); + EXPECT_TRUE(base::Contains(reverse_labelled_by, 1)); } TEST(AXTreeTest, DeletingNodeUpdatesReverseRelations) { @@ -1300,7 +1300,7 @@ auto reverse_active_descendant = tree.GetReverseRelations(ax::mojom::IntAttribute::kActivedescendantId, 2); ASSERT_EQ(1U, reverse_active_descendant.size()); - EXPECT_TRUE(base::ContainsKey(reverse_active_descendant, 3)); + EXPECT_TRUE(base::Contains(reverse_active_descendant, 3)); AXTreeUpdate update; update.root_id = 1; @@ -1588,12 +1588,12 @@ auto child_tree_2_nodes = tree.GetNodeIdsForChildTreeId(tree_id_2); EXPECT_EQ(1U, child_tree_2_nodes.size()); - EXPECT_TRUE(base::ContainsKey(child_tree_2_nodes, 2)); + EXPECT_TRUE(base::Contains(child_tree_2_nodes, 2)); auto child_tree_3_nodes = tree.GetNodeIdsForChildTreeId(tree_id_3); EXPECT_EQ(2U, child_tree_3_nodes.size()); - EXPECT_TRUE(base::ContainsKey(child_tree_3_nodes, 3)); - EXPECT_TRUE(base::ContainsKey(child_tree_3_nodes, 4)); + EXPECT_TRUE(base::Contains(child_tree_3_nodes, 3)); + EXPECT_TRUE(base::Contains(child_tree_3_nodes, 4)); AXTreeUpdate update = initial_state; update.nodes[2].string_attributes.clear(); @@ -1605,8 +1605,8 @@ child_tree_2_nodes = tree.GetNodeIdsForChildTreeId(tree_id_2); EXPECT_EQ(2U, child_tree_2_nodes.size()); - EXPECT_TRUE(base::ContainsKey(child_tree_2_nodes, 2)); - EXPECT_TRUE(base::ContainsKey(child_tree_2_nodes, 3)); + EXPECT_TRUE(base::Contains(child_tree_2_nodes, 2)); + EXPECT_TRUE(base::Contains(child_tree_2_nodes, 3)); child_tree_3_nodes = tree.GetNodeIdsForChildTreeId(tree_id_3); EXPECT_EQ(0U, child_tree_3_nodes.size());
diff --git a/ui/accessibility/platform/ax_platform_node_textrangeprovider_win.cc b/ui/accessibility/platform/ax_platform_node_textrangeprovider_win.cc index 479916d4..ec70d6e 100644 --- a/ui/accessibility/platform/ax_platform_node_textrangeprovider_win.cc +++ b/ui/accessibility/platform/ax_platform_node_textrangeprovider_win.cc
@@ -183,8 +183,9 @@ // Some text positions are equal when compared, but they could be located at // different anchors, affecting how `GetEnclosingElement` works. Normalize the // endpoints to correctly enclose characters of the text representation. - AXPositionInstance normalized_start = start_->AsPositionBeforeCharacter(); - AXPositionInstance normalized_end = end_->AsPositionBeforeCharacter(); + AXPositionInstance normalized_start = + start_->AsLeafTextPositionBeforeCharacter(); + AXPositionInstance normalized_end = end_->AsLeafTextPositionBeforeCharacter(); if (!normalized_start->IsNullPosition()) { DCHECK_EQ(*start_, *normalized_start);
diff --git a/ui/accessibility/platform/ax_platform_node_win.cc b/ui/accessibility/platform/ax_platform_node_win.cc index b075208..a96cc539 100644 --- a/ui/accessibility/platform/ax_platform_node_win.cc +++ b/ui/accessibility/platform/ax_platform_node_win.cc
@@ -1080,8 +1080,11 @@ auto* node = static_cast<AXPlatformNodeWin*>( FromNativeViewAccessible(GetDelegate()->ChildAtIndex(i))); if (node && - node->GetData().GetBoolAttribute(ax::mojom::BoolAttribute::kSelected)) - selected_nodes.emplace_back(node); + node->GetData().GetBoolAttribute(ax::mojom::BoolAttribute::kSelected)) { + Microsoft::WRL::ComPtr<IDispatch> node_idispatch; + if (SUCCEEDED(node->QueryInterface(IID_PPV_ARGS(&node_idispatch)))) + selected_nodes.push_back(node_idispatch); + } } if (selected_nodes.empty()) {
diff --git a/ui/accessibility/platform/ax_platform_node_win_unittest.cc b/ui/accessibility/platform/ax_platform_node_win_unittest.cc index 509c2a0..9144c40 100644 --- a/ui/accessibility/platform/ax_platform_node_win_unittest.cc +++ b/ui/accessibility/platform/ax_platform_node_win_unittest.cc
@@ -2642,8 +2642,8 @@ std::vector<base::string16> attribute_vector = base::SplitString( attributes, L";", base::KEEP_WHITESPACE, base::SPLIT_WANT_ALL); - EXPECT_TRUE(base::ContainsValue(attribute_vector, - L"roledescription:Unlabeled image")); + EXPECT_TRUE( + base::Contains(attribute_vector, L"roledescription:Unlabeled image")); } }
diff --git a/ui/accessibility/platform/ax_unique_id.cc b/ui/accessibility/platform/ax_unique_id.cc index 852371c..9da346f 100644 --- a/ui/accessibility/platform/ax_unique_id.cc +++ b/ui/accessibility/platform/ax_unique_id.cc
@@ -36,7 +36,7 @@ } bool AXUniqueId::IsAssigned(const int32_t id) const { - return base::ContainsKey(g_assigned_ids.Get(), id); + return base::Contains(g_assigned_ids.Get(), id); } int32_t AXUniqueId::GetNextAXUniqueId(const int32_t max_id) {
diff --git a/ui/android/view_android.cc b/ui/android/view_android.cc index 90536083..b7fc229 100644 --- a/ui/android/view_android.cc +++ b/ui/android/view_android.cc
@@ -123,7 +123,7 @@ void ViewAndroid::AddChild(ViewAndroid* child) { DCHECK(child); - DCHECK(!base::ContainsValue(children_, child)); + DCHECK(!base::Contains(children_, child)); DCHECK(!RootPathHasEventForwarder(this) || !SubtreeHasEventForwarder(child)) << "Some view tree path will have more than one event forwarder " "if the child is added.";
diff --git a/ui/aura/native_window_occlusion_tracker_win.cc b/ui/aura/native_window_occlusion_tracker_win.cc index 8f00b5881..5553d08 100644 --- a/ui/aura/native_window_occlusion_tracker_win.cc +++ b/ui/aura/native_window_occlusion_tracker_win.cc
@@ -538,7 +538,7 @@ DWORD pid; GetWindowThreadProcessId(hwnd, &pid); current_pids_with_visible_windows->insert(pid); - if (!base::ContainsKey(process_event_hooks_, pid)) + if (!base::Contains(process_event_hooks_, pid)) RegisterEventHookForProcess(pid); SkRegion window_region(SkIRect::MakeLTRB(window_rect.x(), window_rect.y(),
diff --git a/ui/aura/scoped_simple_keyboard_hook.cc b/ui/aura/scoped_simple_keyboard_hook.cc index 7b1895a..53f4c45 100644 --- a/ui/aura/scoped_simple_keyboard_hook.cc +++ b/ui/aura/scoped_simple_keyboard_hook.cc
@@ -21,7 +21,7 @@ if (dom_code == ui::DomCode::NONE) return false; - return !dom_codes_ || base::ContainsKey(dom_codes_.value(), dom_code); + return !dom_codes_ || base::Contains(dom_codes_.value(), dom_code); } } // namespace aura
diff --git a/ui/aura/window.cc b/ui/aura/window.cc index 1bad3ff..8c4cbc8 100644 --- a/ui/aura/window.cc +++ b/ui/aura/window.cc
@@ -414,7 +414,7 @@ Window* old_root = child->GetRootWindow(); - DCHECK(!base::ContainsValue(children_, child)); + DCHECK(!base::Contains(children_, child)); if (child->parent()) child->parent()->RemoveChildImpl(child, this); @@ -803,7 +803,7 @@ if (child->owned_by_parent_) { delete child; // Deleting the child so remove it from out children_ list. - DCHECK(!base::ContainsValue(children_, child)); + DCHECK(!base::Contains(children_, child)); } else { // Even if we can't delete the child, we still need to remove it from the // parent so that relevant bookkeeping (parent_ back-pointers etc) are
diff --git a/ui/aura/window_event_dispatcher_unittest.cc b/ui/aura/window_event_dispatcher_unittest.cc index a3ee340..006fa860 100644 --- a/ui/aura/window_event_dispatcher_unittest.cc +++ b/ui/aura/window_event_dispatcher_unittest.cc
@@ -556,7 +556,7 @@ } bool HasReceivedEvent(ui::EventType type) { - return base::ContainsValue(events_, type); + return base::Contains(events_, type); } bool LastTouchMayCauseScrolling() const {
diff --git a/ui/aura/window_occlusion_tracker.cc b/ui/aura/window_occlusion_tracker.cc index 642250f..9993382 100644 --- a/ui/aura/window_occlusion_tracker.cc +++ b/ui/aura/window_occlusion_tracker.cc
@@ -522,18 +522,18 @@ } bool WindowOcclusionTracker::WindowIsTracked(Window* window) const { - return base::ContainsKey(tracked_windows_, window); + return base::Contains(tracked_windows_, window); } bool WindowOcclusionTracker::WindowIsAnimated(Window* window) const { return !ShouldUseTargetValues() && - base::ContainsKey(animated_windows_, window) && + base::Contains(animated_windows_, window) && window->layer()->GetAnimator()->IsAnimatingOnePropertyOf( kSkipWindowWhenPropertiesAnimated); } bool WindowOcclusionTracker::WindowIsExcluded(Window* window) const { - return base::ContainsKey(excluded_windows_, window); + return base::Contains(excluded_windows_, window); } bool WindowOcclusionTracker::WindowIsVisible(Window* window) const { @@ -798,7 +798,7 @@ const HierarchyChangeParams& params) { Window* const window = params.target; Window* const root_window = window->GetRootWindow(); - if (root_window && base::ContainsKey(root_windows_, root_window) && + if (root_window && base::Contains(root_windows_, root_window) && !window_observer_.IsObserving(window)) { AddObserverToWindowAndDescendants(window); }
diff --git a/ui/aura/window_tracker.cc b/ui/aura/window_tracker.cc index 8b43559..a4623cb 100644 --- a/ui/aura/window_tracker.cc +++ b/ui/aura/window_tracker.cc
@@ -20,7 +20,7 @@ } void WindowTracker::Add(Window* window) { - if (base::ContainsValue(windows_, window)) + if (base::Contains(windows_, window)) return; window->AddObserver(this); @@ -49,7 +49,7 @@ } bool WindowTracker::Contains(Window* window) const { - return base::ContainsValue(windows_, window); + return base::Contains(windows_, window); } void WindowTracker::OnWindowDestroying(Window* window) {
diff --git a/ui/aura_extra/window_occlusion_impl_unittest_win.cc b/ui/aura_extra/window_occlusion_impl_unittest_win.cc index 50bb76e..7a4c127b 100644 --- a/ui/aura_extra/window_occlusion_impl_unittest_win.cc +++ b/ui/aura_extra/window_occlusion_impl_unittest_win.cc
@@ -138,7 +138,7 @@ ComputeOcclusion(); EXPECT_EQ(result.size(), 1U); - ASSERT_TRUE(base::ContainsKey(result, window)); + ASSERT_TRUE(base::Contains(result, window)); EXPECT_EQ(result[window], aura::Window::OcclusionState::OCCLUDED); } @@ -152,7 +152,7 @@ ComputeOcclusion(); EXPECT_EQ(result.size(), 1U); - ASSERT_TRUE(base::ContainsKey(result, window)); + ASSERT_TRUE(base::Contains(result, window)); EXPECT_EQ(result[window], aura::Window::OcclusionState::VISIBLE); Clear(); } @@ -170,10 +170,10 @@ EXPECT_EQ(result.size(), 2U); - ASSERT_TRUE(base::ContainsKey(result, window1)); + ASSERT_TRUE(base::Contains(result, window1)); EXPECT_EQ(result[window1], aura::Window::OcclusionState::VISIBLE); - ASSERT_TRUE(base::ContainsKey(result, window2)); + ASSERT_TRUE(base::Contains(result, window2)); EXPECT_EQ(result[window2], aura::Window::OcclusionState::OCCLUDED); } @@ -195,7 +195,7 @@ ComputeOcclusion(); EXPECT_EQ(result.size(), 1U); - ASSERT_TRUE(base::ContainsKey(result, window)); + ASSERT_TRUE(base::Contains(result, window)); EXPECT_EQ(result[window], aura::Window::OcclusionState::OCCLUDED); } @@ -213,10 +213,10 @@ EXPECT_EQ(result.size(), 2U); - ASSERT_TRUE(base::ContainsKey(result, window1)); + ASSERT_TRUE(base::Contains(result, window1)); EXPECT_EQ(result[window1], aura::Window::OcclusionState::VISIBLE); - ASSERT_TRUE(base::ContainsKey(result, window2)); + ASSERT_TRUE(base::Contains(result, window2)); EXPECT_EQ(result[window2], aura::Window::OcclusionState::VISIBLE); } @@ -234,7 +234,7 @@ EXPECT_EQ(result.size(), 1U); - ASSERT_TRUE(base::ContainsKey(result, window)); + ASSERT_TRUE(base::Contains(result, window)); EXPECT_EQ(result[window], aura::Window::OcclusionState::VISIBLE); } @@ -251,7 +251,7 @@ EXPECT_EQ(result.size(), 1U); - ASSERT_TRUE(base::ContainsKey(result, window)); + ASSERT_TRUE(base::Contains(result, window)); EXPECT_EQ(result[window], aura::Window::OcclusionState::VISIBLE); }
diff --git a/ui/base/accelerators/accelerator_manager.cc b/ui/base/accelerators/accelerator_manager.cc index 919326f..3ee4a7e6 100644 --- a/ui/base/accelerators/accelerator_manager.cc +++ b/ui/base/accelerators/accelerator_manager.cc
@@ -23,7 +23,7 @@ for (const ui::Accelerator& accelerator : accelerators) { AcceleratorTargetList& targets = accelerators_[accelerator].second; - DCHECK(!base::ContainsValue(targets, target)) + DCHECK(!base::Contains(targets, target)) << "Registering the same target multiple times"; // All priority accelerators go to the front of the line. @@ -61,7 +61,7 @@ for (auto map_iter = accelerators_.begin(); map_iter != accelerators_.end();) { AcceleratorTargetList* targets = &map_iter->second.second; - if (!base::ContainsValue(*targets, target)) { + if (!base::Contains(*targets, target)) { ++map_iter; } else { auto tmp_iter = map_iter;
diff --git a/ui/base/clipboard/clipboard.cc b/ui/base/clipboard/clipboard.cc index a34a877..e043f0f 100644 --- a/ui/base/clipboard/clipboard.cc +++ b/ui/base/clipboard/clipboard.cc
@@ -176,7 +176,7 @@ // was whitelisted to use the clipboard. This is a CHECK rather than a DCHECK // to catch incorrect usage in production (e.g. https://crbug.com/872737). AllowedThreadsVector* allowed_threads = allowed_threads_.Pointer(); - CHECK(allowed_threads->empty() || base::ContainsValue(*allowed_threads, id)); + CHECK(allowed_threads->empty() || base::Contains(*allowed_threads, id)); return id; }
diff --git a/ui/base/clipboard/clipboard.h b/ui/base/clipboard/clipboard.h index f6ca005..2a4c2f07 100644 --- a/ui/base/clipboard/clipboard.h +++ b/ui/base/clipboard/clipboard.h
@@ -101,7 +101,7 @@ std::vector<base::string16>* types, bool* contains_filenames) const = 0; - // Reads UNICODE text from the clipboard, if available. + // Reads Unicode text from the clipboard, if available. virtual void ReadText(ClipboardType type, base::string16* result) const = 0; // Reads ASCII text from the clipboard, if available.
diff --git a/ui/base/clipboard/clipboard_android.cc b/ui/base/clipboard/clipboard_android.cc index 4f6fc493..b3f20e59 100644 --- a/ui/base/clipboard/clipboard_android.cc +++ b/ui/base/clipboard/clipboard_android.cc
@@ -126,7 +126,7 @@ bool ClipboardMap::HasFormat(const std::string& format) { base::AutoLock lock(lock_); UpdateFromAndroidClipboard(); - return base::ContainsKey(map_, format); + return base::Contains(map_, format); } void ClipboardMap::OnPrimaryClipboardChanged() { @@ -153,11 +153,11 @@ void ClipboardMap::CommitToAndroidClipboard() { JNIEnv* env = AttachCurrentThread(); base::AutoLock lock(lock_); - if (base::ContainsKey(map_, ClipboardFormatType::GetHtmlType().ToString())) { + if (base::Contains(map_, ClipboardFormatType::GetHtmlType().ToString())) { // Android's API for storing HTML content on the clipboard requires a plain- // text representation to be available as well. - if (!base::ContainsKey(map_, - ClipboardFormatType::GetPlainTextType().ToString())) + if (!base::Contains(map_, + ClipboardFormatType::GetPlainTextType().ToString())) return; ScopedJavaLocalRef<jstring> html = ConvertUTF8ToJavaString( @@ -167,7 +167,7 @@ DCHECK(html.obj() && text.obj()); Java_Clipboard_setHTMLText(env, clipboard_manager_, html, text); - } else if (base::ContainsKey( + } else if (base::Contains( map_, ClipboardFormatType::GetPlainTextType().ToString())) { ScopedJavaLocalRef<jstring> str = ConvertUTF8ToJavaString( env, map_[ClipboardFormatType::GetPlainTextType().ToString()]);
diff --git a/ui/base/clipboard/clipboard_aura.cc b/ui/base/clipboard/clipboard_aura.cc index 7d73d97..fef0e33 100644 --- a/ui/base/clipboard/clipboard_aura.cc +++ b/ui/base/clipboard/clipboard_aura.cc
@@ -202,7 +202,7 @@ *result = base::UTF8ToUTF16(utf8_result); } - // Reads ascii text from the data at the top of clipboard stack. + // Reads ASCII text from the data at the top of clipboard stack. void ReadAsciiText(std::string* result) const { result->clear(); const ClipboardData* data = GetData();
diff --git a/ui/base/clipboard/clipboard_format_type_win.cc b/ui/base/clipboard/clipboard_format_type_win.cc index bb242e0..5d300923 100644 --- a/ui/base/clipboard/clipboard_format_type_win.cc +++ b/ui/base/clipboard/clipboard_format_type_win.cc
@@ -164,8 +164,8 @@ } // Nothing prevents the drag source app from using the CFSTR_FILEDESCRIPTORA -// ANSI format (e.g., it could be that it doesn't support UNICODE). So need to -// register both the ANSI and UNICODE file group descriptors. +// ANSI format (e.g., it could be that it doesn't support Unicode). So need to +// register both the ANSI and Unicode file group descriptors. // static const ClipboardFormatType& ClipboardFormatType::GetFileDescriptorType() { CR_STATIC_UI_CLIPBOARD_FORMAT_TYPE(
diff --git a/ui/base/clipboard/clipboard_util_win.cc b/ui/base/clipboard/clipboard_util_win.cc index a460c37..7091ece 100644 --- a/ui/base/clipboard/clipboard_util_win.cc +++ b/ui/base/clipboard/clipboard_util_win.cc
@@ -374,7 +374,7 @@ }; // Retrieves display names of virtual files, making sure they are unique. -// Use template parameter of FILEGROUPDESCRIPTORW for retrieving unicode data +// Use template parameter of FILEGROUPDESCRIPTORW for retrieving Unicode data // and FILEGROUPDESCRIPTORA for ascii. template <typename FileGroupDescriptorType> bool GetVirtualFilenames(IDataObject* data_object, @@ -502,7 +502,7 @@ if (GetData(data_object, ClipboardFormatType::GetMozUrlType(), &store) || GetData(data_object, ClipboardFormatType::GetUrlWType(), &store)) { { - // Mozilla URL format or unicode URL + // Mozilla URL format or Unicode URL base::win::ScopedHGlobal<wchar_t*> data(store.hGlobal); SplitUrlAndTitle(data.get(), url, title); } @@ -512,7 +512,7 @@ if (GetData(data_object, ClipboardFormatType::GetUrlType(), &store)) { { - // URL using ascii + // URL using ASCII base::win::ScopedHGlobal<char*> data(store.hGlobal); SplitUrlAndTitle(base::UTF8ToWide(data.get()), url, title); } @@ -560,7 +560,7 @@ if (GetData(data_object, ClipboardFormatType::GetFilenameWType(), &medium)) { { - // filename using unicode + // filename using Unicode base::win::ScopedHGlobal<wchar_t*> data(medium.hGlobal); if (data.get() && data.get()[0]) filenames->push_back(data.get()); @@ -571,7 +571,7 @@ if (GetData(data_object, ClipboardFormatType::GetFilenameType(), &medium)) { { - // filename using ascii + // filename using ASCII base::win::ScopedHGlobal<char*> data(medium.hGlobal); if (data.get() && data.get()[0]) filenames->push_back(base::SysNativeMBToWide(data.get())); @@ -591,10 +591,10 @@ return false; // Nothing prevents the drag source app from using the CFSTR_FILEDESCRIPTORA - // ANSI format (e.g., it could be that it doesn't support UNICODE). So need to - // check for both the ANSI and UNICODE file group descriptors. + // ANSI format (e.g., it could be that it doesn't support Unicode). So need to + // check for both the ANSI and Unicode file group descriptors. if (ui::GetVirtualFilenames<FILEGROUPDESCRIPTORW>(data_object, filenames)) { - // file group descriptor using unicode. + // file group descriptor using Unicode. return true; } @@ -653,7 +653,7 @@ if (GetData(data_object, ClipboardFormatType::GetPlainTextType(), &store)) { { - // ascii text + // ASCII text base::win::ScopedHGlobal<char*> data(store.hGlobal); plain_text->assign(base::UTF8ToWide(data.get())); } @@ -726,11 +726,11 @@ } // Nothing prevents the drag source app from using the CFSTR_FILEDESCRIPTORA - // ANSI format (e.g., it could be that it doesn't support UNICODE). So need to - // check for both the ANSI and UNICODE file group descriptors. + // ANSI format (e.g., it could be that it doesn't support Unicode). So need to + // check for both the ANSI and Unicode file group descriptors. if (GetFileNameFromFirstDescriptor<FILEGROUPDESCRIPTORW>(data_object, filename)) { - // file group descriptor using unicode. + // file group descriptor using Unicode. return true; }
diff --git a/ui/base/ime/character_composer_unittest.cc b/ui/base/ime/character_composer_unittest.cc index 95ade2d..371c1798 100644 --- a/ui/base/ime/character_composer_unittest.cc +++ b/ui/base/ime/character_composer_unittest.cc
@@ -272,7 +272,7 @@ EXPECT_LT(previous_key, key) << index; previous_key = key; // Verify that the internal link is valid. - EXPECT_TRUE(base::ContainsValue(subtrees, value)) << index; + EXPECT_TRUE(base::Contains(subtrees, value)) << index; index += 2; } // Check the leaf subtable.
diff --git a/ui/base/ime/win/tsf_input_scope.cc b/ui/base/ime/win/tsf_input_scope.cc index aac64cb4..71516e2 100644 --- a/ui/base/ime/win/tsf_input_scope.cc +++ b/ui/base/ime/win/tsf_input_scope.cc
@@ -24,7 +24,7 @@ if (input_scope == IS_DEFAULT) return; - if (base::ContainsValue(*input_scopes, input_scope)) + if (base::Contains(*input_scopes, input_scope)) return; input_scopes->push_back(input_scope);
diff --git a/ui/base/models/list_selection_model.cc b/ui/base/models/list_selection_model.cc index d8e23ba1..a3288f9 100644 --- a/ui/base/models/list_selection_model.cc +++ b/ui/base/models/list_selection_model.cc
@@ -102,7 +102,7 @@ } bool ListSelectionModel::IsSelected(int index) const { - return base::ContainsValue(selected_indices_, index); + return base::Contains(selected_indices_, index); } void ListSelectionModel::AddIndexToSelection(int index) {
diff --git a/ui/base/resource/data_pack.cc b/ui/base/resource/data_pack.cc index da3771f..15dd01c 100644 --- a/ui/base/resource/data_pack.cc +++ b/ui/base/resource/data_pack.cc
@@ -79,7 +79,7 @@ // DataPack doesn't require single-threaded access, so use a lock. static base::Lock* lock = new base::Lock; base::AutoLock auto_lock(*lock); - if (!base::ContainsKey(*resource_ids_logged, resource_id)) { + if (!base::Contains(*resource_ids_logged, resource_id)) { printf("Resource=%d\n", resource_id); resource_ids_logged->insert(resource_id); }
diff --git a/ui/base/resource/resource_bundle.cc b/ui/base/resource/resource_bundle.cc index ab883f7..2808d55 100644 --- a/ui/base/resource/resource_bundle.cc +++ b/ui/base/resource/resource_bundle.cc
@@ -711,7 +711,7 @@ bool ResourceBundle::IsScaleFactorSupported(ScaleFactor scale_factor) { const std::vector<ScaleFactor>& supported_scale_factors = ui::GetSupportedScaleFactors(); - return base::ContainsValue(supported_scale_factors, scale_factor); + return base::Contains(supported_scale_factors, scale_factor); } void ResourceBundle::CheckCanOverrideStringResources() {
diff --git a/ui/base/win/hwnd_subclass.cc b/ui/base/win/hwnd_subclass.cc index c6325d5..8d92ece8 100644 --- a/ui/base/win/hwnd_subclass.cc +++ b/ui/base/win/hwnd_subclass.cc
@@ -96,7 +96,7 @@ void HWNDSubclass::AddFilter(HWNDMessageFilter* filter) { DCHECK(filter); - if (!base::ContainsValue(filters_, filter)) + if (!base::Contains(filters_, filter)) filters_.push_back(filter); }
diff --git a/ui/base/x/BUILD.gn b/ui/base/x/BUILD.gn index 593221f..0b7130d 100644 --- a/ui/base/x/BUILD.gn +++ b/ui/base/x/BUILD.gn
@@ -12,7 +12,6 @@ output_name = "ui_base_x" sources = [ - "ui_base_x_export.h", "x11_display_util.cc", "x11_display_util.h", "x11_menu_list.cc", @@ -31,7 +30,7 @@ "//build/config/linux:xrandr", ] - defines = [ "UI_BASE_X_IMPLEMENTATION" ] + defines = [ "IS_UI_BASE_X_IMPL" ] deps = [ "//base",
diff --git a/ui/base/x/selection_utils.cc b/ui/base/x/selection_utils.cc index b107218..a05dcc8 100644 --- a/ui/base/x/selection_utils.cc +++ b/ui/base/x/selection_utils.cc
@@ -52,7 +52,7 @@ const std::vector< ::Atom>& offered, std::vector< ::Atom>* output) { for (const auto& desired_atom : desired) { - if (base::ContainsValue(offered, desired_atom)) + if (base::Contains(offered, desired_atom)) output->push_back(desired_atom); } }
diff --git a/ui/base/x/ui_base_x_export.h b/ui/base/x/ui_base_x_export.h deleted file mode 100644 index ddc5036..0000000 --- a/ui/base/x/ui_base_x_export.h +++ /dev/null
@@ -1,37 +0,0 @@ -// Copyright 2016 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 UI_BASE_X_UI_BASE_X_EXPORT_H_ -#define UI_BASE_X_UI_BASE_X_EXPORT_H_ - -// Defines UI_BASE_X_EXPORT so that functionality implemented by the UI module -// can be exported to consumers. - -#if defined(COMPONENT_BUILD) - -#if defined(WIN32) - -#if defined(UI_BASE_X_IMPLEMENTATION) -#define UI_BASE_X_EXPORT __declspec(dllexport) -#else -#define UI_BASE_X_EXPORT __declspec(dllimport) -#endif - -#else // !defined(WIN32) - -#if defined(UI_BASE_X_IMPLEMENTATION) -#define UI_BASE_X_EXPORT __attribute__((visibility("default"))) -#else -#define UI_BASE_X_EXPORT -#endif - -#endif - -#else // !defined(COMPONENT_BUILD) - -#define UI_BASE_X_EXPORT - -#endif - -#endif // UI_BASE_X_UI_BASE_X_EXPORT_H_
diff --git a/ui/base/x/x11_display_util.h b/ui/base/x/x11_display_util.h index 8d16263c..6fa61c8 100644 --- a/ui/base/x/x11_display_util.h +++ b/ui/base/x/x11_display_util.h
@@ -5,7 +5,7 @@ #ifndef UI_BASE_X_X11_DISPLAY_UTIL_H_ #define UI_BASE_X_X11_DISPLAY_UTIL_H_ -#include "ui/base/x/ui_base_x_export.h" +#include "base/component_export.h" #include "ui/display/display.h" #include "ui/gfx/x/x11_types.h" @@ -14,15 +14,16 @@ // Return the version for xrandr. It multiplies the major number by 100 and // adds the minor like MAJOR * 100 + MINOR. It returns zero if no xrandr is // present. -UI_BASE_X_EXPORT int GetXrandrVersion(XDisplay* xdisplay); +COMPONENT_EXPORT(UI_BASE_X) int GetXrandrVersion(XDisplay* xdisplay); // Builds a list of displays for fallback. -UI_BASE_X_EXPORT std::vector<display::Display> GetFallbackDisplayList( - float scale); +COMPONENT_EXPORT(UI_BASE_X) +std::vector<display::Display> GetFallbackDisplayList(float scale); // Builds a list of displays from the current screen information offered by // the X server. -UI_BASE_X_EXPORT std::vector<display::Display> BuildDisplaysFromXRandRInfo( +COMPONENT_EXPORT(UI_BASE_X) +std::vector<display::Display> BuildDisplaysFromXRandRInfo( int version, float scale, int64_t* primary_display_index_out);
diff --git a/ui/base/x/x11_menu_list.h b/ui/base/x/x11_menu_list.h index 87d412d..f4882b8d 100644 --- a/ui/base/x/x11_menu_list.h +++ b/ui/base/x/x11_menu_list.h
@@ -7,8 +7,8 @@ #include <vector> +#include "base/component_export.h" #include "base/macros.h" -#include "ui/base/x/ui_base_x_export.h" #include "ui/gfx/x/x11_types.h" // A process wide singleton cache for X menus. @@ -19,7 +19,7 @@ namespace ui { // Keeps track of created and destroyed top level menu windows. -class UI_BASE_X_EXPORT XMenuList { +class COMPONENT_EXPORT(UI_BASE_X) XMenuList { public: static XMenuList* GetInstance();
diff --git a/ui/base/x/x11_pointer_grab.h b/ui/base/x/x11_pointer_grab.h index e0a48d7..9f34e281 100644 --- a/ui/base/x/x11_pointer_grab.h +++ b/ui/base/x/x11_pointer_grab.h
@@ -5,7 +5,7 @@ #ifndef UI_BASE_X_X11_POINTER_GRAB_H_ #define UI_BASE_X_X11_POINTER_GRAB_H_ -#include "ui/base/x/ui_base_x_export.h" +#include "base/component_export.h" #include "ui/gfx/x/x11_types.h" typedef unsigned long Cursor; @@ -14,15 +14,14 @@ // Grabs the pointer. It is unnecessary to ungrab the pointer prior to grabbing // it. -UI_BASE_X_EXPORT int GrabPointer(XID window, - bool owner_events, - ::Cursor cursor); +COMPONENT_EXPORT(UI_BASE_X) +int GrabPointer(XID window, bool owner_events, ::Cursor cursor); // Sets the cursor to use for the duration of the active pointer grab. -UI_BASE_X_EXPORT void ChangeActivePointerGrabCursor(::Cursor cursor); +COMPONENT_EXPORT(UI_BASE_X) void ChangeActivePointerGrabCursor(::Cursor cursor); // Ungrabs the pointer. -UI_BASE_X_EXPORT void UngrabPointer(); +COMPONENT_EXPORT(UI_BASE_X) void UngrabPointer(); } // namespace ui
diff --git a/ui/base/x/x11_util.cc b/ui/base/x/x11_util.cc index 544d5fdb..11f9ce2 100644 --- a/ui/base/x/x11_util.cc +++ b/ui/base/x/x11_util.cc
@@ -536,7 +536,7 @@ std::vector<XAtom> wm_states; if (GetAtomArrayProperty(window, "_NET_WM_STATE", &wm_states)) { XAtom hidden_atom = gfx::GetAtom("_NET_WM_STATE_HIDDEN"); - if (base::ContainsValue(wm_states, hidden_atom)) + if (base::Contains(wm_states, hidden_atom)) return false; } @@ -1236,7 +1236,7 @@ if (GetAtomArrayProperty(window, "_NET_WM_STATE", &atom_properties)) { - return base::ContainsValue(atom_properties, fullscreen_atom); + return base::Contains(atom_properties, fullscreen_atom); } } @@ -1267,7 +1267,7 @@ return false; } - return base::ContainsValue(supported_atoms, atom); + return base::Contains(supported_atoms, atom); } gfx::ICCProfile GetICCProfileForMonitor(int monitor) {
diff --git a/ui/base/x/x11_util.h b/ui/base/x/x11_util.h index daf755e..496d2fa 100644 --- a/ui/base/x/x11_util.h +++ b/ui/base/x/x11_util.h
@@ -16,10 +16,10 @@ #include <string> #include <vector> +#include "base/component_export.h" #include "base/containers/flat_set.h" #include "base/macros.h" #include "base/memory/ref_counted_memory.h" -#include "ui/base/x/ui_base_x_export.h" #include "ui/events/event_constants.h" #include "ui/events/keycodes/keyboard_codes.h" #include "ui/events/platform_event.h" @@ -45,173 +45,184 @@ // These functions cache their results --------------------------------- // Returns true if the system supports XINPUT2. -UI_BASE_X_EXPORT bool IsXInput2Available(); +COMPONENT_EXPORT(UI_BASE_X) bool IsXInput2Available(); // Return true iff the display supports Xrender -UI_BASE_X_EXPORT bool QueryRenderSupport(XDisplay* dpy); +COMPONENT_EXPORT(UI_BASE_X) bool QueryRenderSupport(XDisplay* dpy); // Creates a custom X cursor from the image. This takes ownership of image. The // caller must not free/modify the image. The refcount of the newly created // cursor is set to 1. -UI_BASE_X_EXPORT::Cursor CreateReffedCustomXCursor(XcursorImage* image); +COMPONENT_EXPORT(UI_BASE_X)::Cursor + CreateReffedCustomXCursor(XcursorImage* image); // Increases the refcount of the custom cursor. -UI_BASE_X_EXPORT void RefCustomXCursor(::Cursor cursor); +COMPONENT_EXPORT(UI_BASE_X) void RefCustomXCursor(::Cursor cursor); // Decreases the refcount of the custom cursor, and destroys it if it reaches 0. -UI_BASE_X_EXPORT void UnrefCustomXCursor(::Cursor cursor); +COMPONENT_EXPORT(UI_BASE_X) void UnrefCustomXCursor(::Cursor cursor); // Creates a XcursorImage and copies the SkBitmap |bitmap| on it. |bitmap| // should be non-null. Caller owns the returned object. -UI_BASE_X_EXPORT XcursorImage* SkBitmapToXcursorImage( - const SkBitmap* bitmap, - const gfx::Point& hotspot); +COMPONENT_EXPORT(UI_BASE_X) +XcursorImage* SkBitmapToXcursorImage(const SkBitmap* bitmap, + const gfx::Point& hotspot); // Coalesce all pending motion events (touch or mouse) that are at the top of // the queue, and return the number eliminated, storing the last one in // |last_event|. -UI_BASE_X_EXPORT int CoalescePendingMotionEvents(const XEvent* xev, - XEvent* last_event); +COMPONENT_EXPORT(UI_BASE_X) +int CoalescePendingMotionEvents(const XEvent* xev, XEvent* last_event); // Hides the host cursor. -UI_BASE_X_EXPORT void HideHostCursor(); +COMPONENT_EXPORT(UI_BASE_X) void HideHostCursor(); // Returns an invisible cursor. -UI_BASE_X_EXPORT::Cursor CreateInvisibleCursor(); +COMPONENT_EXPORT(UI_BASE_X)::Cursor CreateInvisibleCursor(); // Sets whether |window| should use the OS window frame. -UI_BASE_X_EXPORT void SetUseOSWindowFrame(XID window, bool use_os_window_frame); +COMPONENT_EXPORT(UI_BASE_X) +void SetUseOSWindowFrame(XID window, bool use_os_window_frame); // These functions do not cache their results -------------------------- // Returns true if the shape extension is supported. -UI_BASE_X_EXPORT bool IsShapeExtensionAvailable(); +COMPONENT_EXPORT(UI_BASE_X) bool IsShapeExtensionAvailable(); // Get the X window id for the default root window -UI_BASE_X_EXPORT XID GetX11RootWindow(); +COMPONENT_EXPORT(UI_BASE_X) XID GetX11RootWindow(); // Returns the user's current desktop. -UI_BASE_X_EXPORT bool GetCurrentDesktop(int* desktop); +COMPONENT_EXPORT(UI_BASE_X) bool GetCurrentDesktop(int* desktop); enum HideTitlebarWhenMaximized { SHOW_TITLEBAR_WHEN_MAXIMIZED = 0, HIDE_TITLEBAR_WHEN_MAXIMIZED = 1, }; // Sets _GTK_HIDE_TITLEBAR_WHEN_MAXIMIZED on |window|. -UI_BASE_X_EXPORT void SetHideTitlebarWhenMaximizedProperty( - XID window, - HideTitlebarWhenMaximized property); +COMPONENT_EXPORT(UI_BASE_X) +void SetHideTitlebarWhenMaximizedProperty(XID window, + HideTitlebarWhenMaximized property); // Clears all regions of X11's default root window by filling black pixels. -UI_BASE_X_EXPORT void ClearX11DefaultRootWindow(); +COMPONENT_EXPORT(UI_BASE_X) void ClearX11DefaultRootWindow(); // Returns true if |window| is visible. -UI_BASE_X_EXPORT bool IsWindowVisible(XID window); +COMPONENT_EXPORT(UI_BASE_X) bool IsWindowVisible(XID window); // Returns the inner bounds of |window| (excluding the non-client area). -UI_BASE_X_EXPORT bool GetInnerWindowBounds(XID window, gfx::Rect* rect); +COMPONENT_EXPORT(UI_BASE_X) +bool GetInnerWindowBounds(XID window, gfx::Rect* rect); // Returns the non-client area extents of |window|. This is a negative inset; it // represents the negative size of the window border on all sides. // InnerWindowBounds.Inset(WindowExtents) = OuterWindowBounds. // Returns false if the window manager does not provide extents information. -UI_BASE_X_EXPORT bool GetWindowExtents(XID window, gfx::Insets* extents); +COMPONENT_EXPORT(UI_BASE_X) +bool GetWindowExtents(XID window, gfx::Insets* extents); // Returns the outer bounds of |window| (including the non-client area). -UI_BASE_X_EXPORT bool GetOuterWindowBounds(XID window, gfx::Rect* rect); +COMPONENT_EXPORT(UI_BASE_X) +bool GetOuterWindowBounds(XID window, gfx::Rect* rect); // Returns true if |window| contains the point |screen_loc|. -UI_BASE_X_EXPORT bool WindowContainsPoint(XID window, gfx::Point screen_loc); +COMPONENT_EXPORT(UI_BASE_X) +bool WindowContainsPoint(XID window, gfx::Point screen_loc); // Return true if |window| has any property with |property_name|. -UI_BASE_X_EXPORT bool PropertyExists(XID window, - const std::string& property_name); +COMPONENT_EXPORT(UI_BASE_X) +bool PropertyExists(XID window, const std::string& property_name); // Returns the raw bytes from a property with minimal // interpretation. |out_data| should be freed by XFree() after use. -UI_BASE_X_EXPORT bool GetRawBytesOfProperty( - XID window, - XAtom property, - scoped_refptr<base::RefCountedMemory>* out_data, - size_t* out_data_items, - XAtom* out_type); +COMPONENT_EXPORT(UI_BASE_X) +bool GetRawBytesOfProperty(XID window, + XAtom property, + scoped_refptr<base::RefCountedMemory>* out_data, + size_t* out_data_items, + XAtom* out_type); // Get the value of an int, int array, atom array or string property. On // success, true is returned and the value is stored in |value|. // // TODO(erg): Once we remove the gtk port and are 100% aura, all of these // should accept an XAtom instead of a string. -UI_BASE_X_EXPORT bool GetIntProperty(XID window, - const std::string& property_name, - int* value); -UI_BASE_X_EXPORT bool GetXIDProperty(XID window, - const std::string& property_name, - XID* value); -UI_BASE_X_EXPORT bool GetIntArrayProperty(XID window, - const std::string& property_name, - std::vector<int>* value); -UI_BASE_X_EXPORT bool GetAtomArrayProperty(XID window, - const std::string& property_name, - std::vector<XAtom>* value); -UI_BASE_X_EXPORT bool GetStringProperty(XID window, - const std::string& property_name, - std::string* value); +COMPONENT_EXPORT(UI_BASE_X) +bool GetIntProperty(XID window, const std::string& property_name, int* value); +COMPONENT_EXPORT(UI_BASE_X) +bool GetXIDProperty(XID window, const std::string& property_name, XID* value); +COMPONENT_EXPORT(UI_BASE_X) +bool GetIntArrayProperty(XID window, + const std::string& property_name, + std::vector<int>* value); +COMPONENT_EXPORT(UI_BASE_X) +bool GetAtomArrayProperty(XID window, + const std::string& property_name, + std::vector<XAtom>* value); +COMPONENT_EXPORT(UI_BASE_X) +bool GetStringProperty(XID window, + const std::string& property_name, + std::string* value); // These setters all make round trips. -UI_BASE_X_EXPORT bool SetIntProperty(XID window, - const std::string& name, - const std::string& type, - int value); -UI_BASE_X_EXPORT bool SetIntArrayProperty(XID window, - const std::string& name, - const std::string& type, - const std::vector<int>& value); -UI_BASE_X_EXPORT bool SetAtomProperty(XID window, - const std::string& name, - const std::string& type, - XAtom value); -UI_BASE_X_EXPORT bool SetAtomArrayProperty(XID window, - const std::string& name, - const std::string& type, - const std::vector<XAtom>& value); -UI_BASE_X_EXPORT bool SetStringProperty(XID window, - XAtom property, - XAtom type, - const std::string& value); +COMPONENT_EXPORT(UI_BASE_X) +bool SetIntProperty(XID window, + const std::string& name, + const std::string& type, + int value); +COMPONENT_EXPORT(UI_BASE_X) +bool SetIntArrayProperty(XID window, + const std::string& name, + const std::string& type, + const std::vector<int>& value); +COMPONENT_EXPORT(UI_BASE_X) +bool SetAtomProperty(XID window, + const std::string& name, + const std::string& type, + XAtom value); +COMPONENT_EXPORT(UI_BASE_X) +bool SetAtomArrayProperty(XID window, + const std::string& name, + const std::string& type, + const std::vector<XAtom>& value); +COMPONENT_EXPORT(UI_BASE_X) +bool SetStringProperty(XID window, + XAtom property, + XAtom type, + const std::string& value); // Sets the WM_CLASS attribute for a given X11 window. -UI_BASE_X_EXPORT void SetWindowClassHint(XDisplay* display, - XID window, - const std::string& res_name, - const std::string& res_class); +COMPONENT_EXPORT(UI_BASE_X) +void SetWindowClassHint(XDisplay* display, + XID window, + const std::string& res_name, + const std::string& res_class); // Sets the WM_WINDOW_ROLE attribute for a given X11 window. -UI_BASE_X_EXPORT void SetWindowRole(XDisplay* display, - XID window, - const std::string& role); +COMPONENT_EXPORT(UI_BASE_X) +void SetWindowRole(XDisplay* display, XID window, const std::string& role); // Sends a message to the x11 window manager, enabling or disabling the // states |state1| and |state2|. -UI_BASE_X_EXPORT void SetWMSpecState(XID window, - bool enabled, - XAtom state1, - XAtom state2); +COMPONENT_EXPORT(UI_BASE_X) +void SetWMSpecState(XID window, bool enabled, XAtom state1, XAtom state2); // Checks if the window manager has set a specific state. -UI_BASE_X_EXPORT bool HasWMSpecProperty(const base::flat_set<XAtom>& properties, - XAtom atom); +COMPONENT_EXPORT(UI_BASE_X) +bool HasWMSpecProperty(const base::flat_set<XAtom>& properties, XAtom atom); // Determine whether we should default to native decorations or the custom // frame based on the currently-running window manager. -UI_BASE_X_EXPORT bool GetCustomFramePrefDefault(); +COMPONENT_EXPORT(UI_BASE_X) bool GetCustomFramePrefDefault(); static const int kAllDesktops = -1; // Queries the desktop |window| is on, kAllDesktops if sticky. Returns false if // property not found. -UI_BASE_X_EXPORT bool GetWindowDesktop(XID window, int* desktop); +COMPONENT_EXPORT(UI_BASE_X) bool GetWindowDesktop(XID window, int* desktop); // Translates an X11 error code into a printable string. -UI_BASE_X_EXPORT std::string GetX11ErrorString(XDisplay* display, int err); +COMPONENT_EXPORT(UI_BASE_X) +std::string GetX11ErrorString(XDisplay* display, int err); // Implementers of this interface receive a notification for every X window of // the main display. @@ -227,26 +238,28 @@ // Enumerates all windows in the current display. Will recurse into child // windows up to a depth of |max_depth|. -UI_BASE_X_EXPORT bool EnumerateAllWindows(EnumerateWindowsDelegate* delegate, - int max_depth); +COMPONENT_EXPORT(UI_BASE_X) +bool EnumerateAllWindows(EnumerateWindowsDelegate* delegate, int max_depth); // Enumerates the top-level windows of the current display. -UI_BASE_X_EXPORT void EnumerateTopLevelWindows( - ui::EnumerateWindowsDelegate* delegate); +COMPONENT_EXPORT(UI_BASE_X) +void EnumerateTopLevelWindows(ui::EnumerateWindowsDelegate* delegate); // Returns all children windows of a given window in top-to-bottom stacking // order. -UI_BASE_X_EXPORT bool GetXWindowStack(XID window, std::vector<XID>* windows); +COMPONENT_EXPORT(UI_BASE_X) +bool GetXWindowStack(XID window, std::vector<XID>* windows); // Copies |source_bounds| from |drawable| to |canvas| at offset |dest_offset|. // |source_bounds| is in physical pixels, while |dest_offset| is relative to // the canvas's scale. Note that this function is slow since it uses // XGetImage() to copy the data from the X server to this process before // copying it to |canvas|. -UI_BASE_X_EXPORT bool CopyAreaToCanvas(XID drawable, - gfx::Rect source_bounds, - gfx::Point dest_offset, - gfx::Canvas* canvas); +COMPONENT_EXPORT(UI_BASE_X) +bool CopyAreaToCanvas(XID drawable, + gfx::Rect source_bounds, + gfx::Point dest_offset, + gfx::Canvas* canvas); enum WindowManagerName { WM_OTHER, // We were able to obtain the WM's name, but there is @@ -278,36 +291,38 @@ }; // Attempts to guess the window maager. Returns WM_OTHER or WM_UNNAMED // if we can't determine it for one reason or another. -UI_BASE_X_EXPORT WindowManagerName GuessWindowManager(); +COMPONENT_EXPORT(UI_BASE_X) WindowManagerName GuessWindowManager(); // The same as GuessWindowManager(), but returns the raw string. If we // can't determine it, return "Unknown". -UI_BASE_X_EXPORT std::string GuessWindowManagerName(); +COMPONENT_EXPORT(UI_BASE_X) std::string GuessWindowManagerName(); // Returns true if a compositing manager is present. -UI_BASE_X_EXPORT bool IsCompositingManagerPresent(); +COMPONENT_EXPORT(UI_BASE_X) bool IsCompositingManagerPresent(); // Enable the default X error handlers. These will log the error and abort // the process if called. Use SetX11ErrorHandlers() from x11_util_internal.h // to set your own error handlers. -UI_BASE_X_EXPORT void SetDefaultX11ErrorHandlers(); +COMPONENT_EXPORT(UI_BASE_X) void SetDefaultX11ErrorHandlers(); // Returns true if a given window is in full-screen mode. -UI_BASE_X_EXPORT bool IsX11WindowFullScreen(XID window); +COMPONENT_EXPORT(UI_BASE_X) bool IsX11WindowFullScreen(XID window); // Returns true if the window manager supports the given hint. -UI_BASE_X_EXPORT bool WmSupportsHint(XAtom atom); +COMPONENT_EXPORT(UI_BASE_X) bool WmSupportsHint(XAtom atom); // Returns the ICCProfile corresponding to |monitor| using XGetWindowProperty. -UI_BASE_X_EXPORT gfx::ICCProfile GetICCProfileForMonitor(int monitor); +COMPONENT_EXPORT(UI_BASE_X) +gfx::ICCProfile GetICCProfileForMonitor(int monitor); // Return true if the display supports SYNC extension. -UI_BASE_X_EXPORT bool IsSyncExtensionAvailable(); +COMPONENT_EXPORT(UI_BASE_X) bool IsSyncExtensionAvailable(); // Manages a piece of X11 allocated memory as a RefCountedMemory segment. This // object takes ownership over the passed in memory and will free it with the // X11 allocator when done. -class UI_BASE_X_EXPORT XRefcountedMemory : public base::RefCountedMemory { +class COMPONENT_EXPORT(UI_BASE_X) XRefcountedMemory + : public base::RefCountedMemory { public: XRefcountedMemory(unsigned char* x11_data, size_t length); @@ -326,7 +341,7 @@ // Keeps track of a cursor returned by an X function and makes sure it's // XFreeCursor'd. -class UI_BASE_X_EXPORT XScopedCursor { +class COMPONENT_EXPORT(UI_BASE_X) XScopedCursor { public: // Keeps track of |cursor| created with |display|. XScopedCursor(::Cursor cursor, XDisplay* display); @@ -345,7 +360,8 @@ namespace test { // Returns the cached XcursorImage for |cursor|. -UI_BASE_X_EXPORT const XcursorImage* GetCachedXcursorImage(::Cursor cursor); +COMPONENT_EXPORT(UI_BASE_X) +const XcursorImage* GetCachedXcursorImage(::Cursor cursor); } // namespace test
diff --git a/ui/base/x/x11_util_internal.h b/ui/base/x/x11_util_internal.h index 0ea56479..e26d3afa 100644 --- a/ui/base/x/x11_util_internal.h +++ b/ui/base/x/x11_util_internal.h
@@ -10,10 +10,10 @@ #include <memory> #include <unordered_map> +#include "base/component_export.h" #include "base/macros.h" #include "base/synchronization/lock.h" #include "build/build_config.h" -#include "ui/base/x/ui_base_x_export.h" #include "ui/gfx/x/x11.h" #include "ui/gfx/x/x11_types.h" @@ -30,26 +30,28 @@ // Get the XRENDER format id for ARGB32 (Skia's format). // // NOTE:Currently this don't support multiple screens/displays. -UI_BASE_X_EXPORT XRenderPictFormat* GetRenderARGB32Format(Display* dpy); +COMPONENT_EXPORT(UI_BASE_X) +XRenderPictFormat* GetRenderARGB32Format(Display* dpy); // -------------------------------------------------------------------------- // X11 error handling. // Sets the X Error Handlers. Passing NULL for either will enable the default // error handler, which if called will log the error and abort the process. -UI_BASE_X_EXPORT void SetX11ErrorHandlers(XErrorHandler error_handler, - XIOErrorHandler io_error_handler); +COMPONENT_EXPORT(UI_BASE_X) +void SetX11ErrorHandlers(XErrorHandler error_handler, + XIOErrorHandler io_error_handler); // NOTE: This function should not be called directly from the // X11 Error handler because it queries the server to decode the // error message, which may trigger other errors. A suitable workaround // is to post a task in the error handler to call this function. -UI_BASE_X_EXPORT void LogErrorEventDescription(Display* dpy, - const XErrorEvent& error_event); +COMPONENT_EXPORT(UI_BASE_X) +void LogErrorEventDescription(Display* dpy, const XErrorEvent& error_event); // -------------------------------------------------------------------------- // Selects a visual with a preference for alpha support on compositing window // managers. -class UI_BASE_X_EXPORT XVisualManager { +class COMPONENT_EXPORT(UI_BASE_X) XVisualManager { public: static XVisualManager* GetInstance();
diff --git a/ui/base/x/x11_window_event_manager.h b/ui/base/x/x11_window_event_manager.h index d5a2f37..1a20c68c 100644 --- a/ui/base/x/x11_window_event_manager.h +++ b/ui/base/x/x11_window_event_manager.h
@@ -7,9 +7,9 @@ #include <map> +#include "base/component_export.h" #include "base/macros.h" #include "base/memory/weak_ptr.h" -#include "ui/base/x/ui_base_x_export.h" #include "ui/gfx/x/x11_types.h" namespace base { @@ -23,7 +23,7 @@ // Ensures events in |event_mask| are selected on |xid| for the duration of this // object's lifetime. -class UI_BASE_X_EXPORT XScopedEventSelector { +class COMPONENT_EXPORT(UI_BASE_X) XScopedEventSelector { public: XScopedEventSelector(XID xid, uint32_t event_mask); ~XScopedEventSelector();
diff --git a/ui/chromeos/translations/ui_chromeos_strings_am.xtb b/ui/chromeos/translations/ui_chromeos_strings_am.xtb index a4baccf..475aa8f0 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_am.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_am.xtb
@@ -286,6 +286,7 @@ <translation id="4572815280350369984"><ph name="FILE_TYPE" /> ፋይል</translation> <translation id="457386861538956877">ተጨማሪ...</translation> <translation id="4582497162516204941">ከLinux (ቅድመ ይሁንታ ሙከራ) ጋር ጫን</translation> +<translation id="4594543368593301662">ለ <ph name="SEARCH_TERM" /> ውጤቶችን በማሳየት ላይ።</translation> <translation id="4631887759990505102">አርቲስት</translation> <translation id="4656293982926141856">ይህ ኮምፒውተር</translation> <translation id="4669606053856530811">እነዚህ ንጥሎች ለእነሱ ካልተጋሩ በስተቀር የ«<ph name="SOURCE_NAME" />» አባላት መዳረሻ ያጣሉ።</translation> @@ -383,12 +384,14 @@ <translation id="5412637665001827670">የቡልጋሪያኛ ቁልፍ ሰሌዳ</translation> <translation id="5418923334382419584">የሚያንማር ቁልፍ ሰሌዳ</translation> <translation id="5428105026674456456">ስፓኒሽ</translation> +<translation id="5438282218546237410">ለ <ph name="SEARCH_TERM" /> ምንም ውጤቶች የሉም።</translation> <translation id="5464696796438641524">የፖላንድኛ ሰሌዳ ቁልፍ</translation> <translation id="5465122519792752163">የኔፓሊ ቁልፍ ሰሌዳ (InScript)</translation> <translation id="5469868506864199649">ጣሊያንኛ</translation> <translation id="5494920125229734069">ሁሉንም ይመርጣል</translation> <translation id="5500122897333236901">አይስላንድኛ</translation> <translation id="5508696409934741614">ነጥቦች</translation> +<translation id="5522908512596376669">የፋይል ዝርዝር ወደ ዝርዝር ዕይታ ተለውጧል።</translation> <translation id="5524517123096967210">ፋይሉ ሊነበብ አልቻለም።</translation> <translation id="5533102081734025921">የ<ph name="IMAGE_TYPE" /> ምስል</translation> <translation id="5533555070048896610">በቋንቋ ፊደል መጻፍ (namaste → नमस्ते)</translation> @@ -434,6 +437,7 @@ <translation id="6040143037577758943">ዝጋ</translation> <translation id="6054173164583630569">የፈረንሳይኛ ቁልፍ ሰሌዳ</translation> <translation id="6074825444536523002">Google ቅጽ</translation> +<translation id="6096979789310008754">የፍለጋ ጽሑፍ ጸድቷል፣ ሁሉንም ፋይሎች እና አቃፊዎች በማሳየት ላይ።</translation> <translation id="6111770213269631447">በቋንቋ ፊደል መጻፍ (namaskar → নমস্কার)</translation> <translation id="6129953537138746214">ባዶ ቦታ</translation> <translation id="6133173853026656527"><ph name="FILE_NAME" />ን በመውሰድ ላይ...</translation> @@ -649,6 +653,7 @@ <translation id="8561206103590473338">ዝሆን</translation> <translation id="8569764466147087991">የሚከፈት ፋይል ይምረጡ</translation> <translation id="8579285237314169903"><ph name="NUMBER_OF_FILES" /> ንጥሎችን በማመሳሰል ላይ...</translation> +<translation id="8600173386174225982">የፋይል ዝርዝር ወደ ድንክየ ዕይታ ተለውጧል።</translation> <translation id="8669949407341943408">በመውሰድ ላይ...</translation> <translation id="8671210955687109937">አስተያየት መስጠት ይችላሉ</translation> <translation id="8686213429977032554">ይህ የDrive ፋይል ገና አልተጋራም</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_ar.xtb b/ui/chromeos/translations/ui_chromeos_strings_ar.xtb index 1560984..a8b5ebb2 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_ar.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_ar.xtb
@@ -292,6 +292,7 @@ <translation id="4690246192099372265">السويدية</translation> <translation id="4693155481716051732">سوشي</translation> <translation id="4694604912444486114">قرد</translation> +<translation id="4697043402264950621">تم ترتيب قائمة الملف تصاعديًا حسب <ph name="COLUMN_NAME" />.</translation> <translation id="4711094779914110278">التركية</translation> <translation id="4713544552769165154">تم تصميم هذا الملف لجهاز كمبيوتر يستخدم برنامج Macintosh. وهو غير متوافق مع جهازك الذي يعمل بنظام تشغيل Chrome. يُرجى البحث في <ph name="BEGIN_LINK" />سوق Chrome الإلكتروني<ph name="END_LINK" /> للحصول على تطبيق بديل مناسب.<ph name="BEGIN_LINK_HELP" />مزيد من المعلومات<ph name="END_LINK_HELP" /></translation> <translation id="4724850507808590449">تم نسخ <ph name="FILE_COUNT" /> من الصور احتياطيًا</translation> @@ -530,6 +531,7 @@ <translation id="7339898014177206373">نافذة جديدة</translation> <translation id="7348749398828259943">لوحة مفاتيح US Workman الدولية</translation> <translation id="7359359531237882347">جارٍ نسخ <ph name="NUMBER_OF_ITEMS" /> من العناصر...</translation> +<translation id="7375951387215729722">تم ترتيب قائمة الملف تنازليًا حسب <ph name="COLUMN_NAME" />.</translation> <translation id="7389722738210761877">لوحة المفاتيح التايلاندية (TIS 820-2531)</translation> <translation id="7396038720194014279">لوحة المفاتيح الهندية (صوتية)</translation> <translation id="7417453074306512035">لوحة المفاتيح الإثيوبية</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_bg.xtb b/ui/chromeos/translations/ui_chromeos_strings_bg.xtb index d4b8491..c1fc3666 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_bg.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_bg.xtb
@@ -286,6 +286,7 @@ <translation id="4572815280350369984">Файл от тип <ph name="FILE_TYPE" /></translation> <translation id="457386861538956877">Още...</translation> <translation id="4582497162516204941">Инсталиране чрез Linux (бета)</translation> +<translation id="4594543368593301662">Показани са резултати за „<ph name="SEARCH_TERM" />“.</translation> <translation id="4631887759990505102">Изпълнител</translation> <translation id="4656293982926141856">Този компютър</translation> <translation id="4669606053856530811">Членовете на „<ph name="SOURCE_NAME" />“ ще загубят достъп, ако тези елементи не са споделени с тях.</translation> @@ -383,12 +384,14 @@ <translation id="5412637665001827670">Българска клавиатура</translation> <translation id="5418923334382419584">Бирманска клавиатура</translation> <translation id="5428105026674456456">испански</translation> +<translation id="5438282218546237410">Няма резултати за <ph name="SEARCH_TERM" />.</translation> <translation id="5464696796438641524">Полска клавиатура</translation> <translation id="5465122519792752163">Непалска клавиатура (InScript)</translation> <translation id="5469868506864199649">италиански</translation> <translation id="5494920125229734069">Избиране на всички</translation> <translation id="5500122897333236901">исландски</translation> <translation id="5508696409934741614">Точки</translation> +<translation id="5522908512596376669">Списъкът с файлове е превключен към списъчен изглед.</translation> <translation id="5524517123096967210">Файлът не можа да бъде прочетен.</translation> <translation id="5533102081734025921">Изображение във формат <ph name="IMAGE_TYPE" /></translation> <translation id="5533555070048896610">Транслитерация (namaste → नमस्ते)</translation> @@ -435,6 +438,7 @@ <translation id="6040143037577758943">Затваряне</translation> <translation id="6054173164583630569">Френска клавиатура</translation> <translation id="6074825444536523002">Формуляр на Google</translation> +<translation id="6096979789310008754">Текстът за търсене е изчистен. Показват се всички файлове и папки.</translation> <translation id="6111770213269631447">Транслитерация (namaskar → নমস্কার)</translation> <translation id="6129953537138746214">Интервал</translation> <translation id="6133173853026656527">„<ph name="FILE_NAME" />“ се премества...</translation> @@ -650,6 +654,7 @@ <translation id="8561206103590473338">Слон</translation> <translation id="8569764466147087991">Изберете файл за отваряне</translation> <translation id="8579285237314169903"><ph name="NUMBER_OF_FILES" /> елемента се синхронизират...</translation> +<translation id="8600173386174225982">Списъкът с файлове е превключен към изглед с миниизображения.</translation> <translation id="8669949407341943408">Извършва се преместване...</translation> <translation id="8671210955687109937">Може да коментира</translation> <translation id="8686213429977032554">Този файл в Диск още не е споделен</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_bn.xtb b/ui/chromeos/translations/ui_chromeos_strings_bn.xtb index ad14c5b..a0bbd78e 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_bn.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_bn.xtb
@@ -286,6 +286,7 @@ <translation id="4572815280350369984"><ph name="FILE_TYPE" /> ফাইল</translation> <translation id="457386861538956877">আরও...</translation> <translation id="4582497162516204941">Linux (বিটা) ব্যবহার করে ইনস্টল করুন</translation> +<translation id="4594543368593301662"><ph name="SEARCH_TERM" />-এর ফলাফল দেখানো হচ্ছে।</translation> <translation id="4631887759990505102">শিল্পী</translation> <translation id="4656293982926141856">এই কম্পিউটার</translation> <translation id="4669606053856530811">এই আইটেমগুলি '<ph name="SOURCE_NAME" />' এর সদস্যদের সাথে শেয়ার না করলে তারা সেগুলি অ্যাক্সেস করতে পারবে না।</translation> @@ -382,12 +383,14 @@ <translation id="5412637665001827670">বুলগেরিয় কীবোর্ড</translation> <translation id="5418923334382419584">মায়ানমার কীবোর্ড</translation> <translation id="5428105026674456456">স্প্যানিশ</translation> +<translation id="5438282218546237410"><ph name="SEARCH_TERM" />-এর জন্য কোনও ফলাফল পাওয়া যায়নি।</translation> <translation id="5464696796438641524">পোলিশ কীবোর্ড</translation> <translation id="5465122519792752163">নেপালি কীবোর্ড (ইনস্ক্রিপ্ট)</translation> <translation id="5469868506864199649">ইতালীয়</translation> <translation id="5494920125229734069">সকল বেছে নিন</translation> <translation id="5500122897333236901">আইসল্যান্ডিক</translation> <translation id="5508696409934741614">বিন্দু</translation> +<translation id="5522908512596376669">লিস্ট ভিউতে ফাইলের তালিকা পরিবর্তিত হয়েছে।</translation> <translation id="5524517123096967210">ফাইল পড়া যায়নি৷</translation> <translation id="5533102081734025921"><ph name="IMAGE_TYPE" /> ছবি</translation> <translation id="5533555070048896610">লিপ্যন্তরকরণ (namaste → नमस्ते)</translation> @@ -434,6 +437,7 @@ <translation id="6040143037577758943">বন্ধ</translation> <translation id="6054173164583630569">ফরাসী কিবোর্ড</translation> <translation id="6074825444536523002">Google ফর্ম</translation> +<translation id="6096979789310008754">সার্চ টেক্সট মুছে দেওয়া হয়েছে, সব ফাইল এবং ফোল্ডার দেখা যাচ্ছে।</translation> <translation id="6111770213269631447">লিপ্যন্তরকরণ (namaskar → নমস্কার)</translation> <translation id="6129953537138746214">ব্যবধান</translation> <translation id="6133173853026656527"><ph name="FILE_NAME" /> সরানো হচ্ছে...</translation> @@ -649,6 +653,7 @@ <translation id="8561206103590473338">হাতি</translation> <translation id="8569764466147087991">খুলতে একটি স্ক্রিপ্ট বেছে নিন</translation> <translation id="8579285237314169903"><ph name="NUMBER_OF_FILES" />টি আইটেম সিঙ্ক করা হচ্ছে...</translation> +<translation id="8600173386174225982">থাম্বনেল ভিউতে ফাইলের তালিকা পরিবর্তিত হয়েছে।</translation> <translation id="8669949407341943408">সরানো হচ্ছে...</translation> <translation id="8671210955687109937">মন্তব্য করতে পারবেন</translation> <translation id="8686213429977032554">এই ড্রাইভ ফাইল এখনো শেয়ার করা হয়নি</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_ca.xtb b/ui/chromeos/translations/ui_chromeos_strings_ca.xtb index a2991f3a..6d8dcd9 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_ca.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_ca.xtb
@@ -286,6 +286,7 @@ <translation id="4572815280350369984">Fitxer <ph name="FILE_TYPE" /></translation> <translation id="457386861538956877">Més...</translation> <translation id="4582497162516204941">Instal·la amb Linux (versió beta)</translation> +<translation id="4594543368593301662">Es mostren els resultats per a <ph name="SEARCH_TERM" />.</translation> <translation id="4631887759990505102">Artista</translation> <translation id="4656293982926141856">Aquest ordinador</translation> <translation id="4669606053856530811">Els membres de l'equip <ph name="SOURCE_NAME" /> ja no podran accedir a aquests elements, tret que es comparteixin amb ells.</translation> @@ -383,12 +384,14 @@ <translation id="5412637665001827670">Teclat búlgar</translation> <translation id="5418923334382419584">Teclat de Birmània</translation> <translation id="5428105026674456456">Espanyol</translation> +<translation id="5438282218546237410">No hi ha cap resultat per a <ph name="SEARCH_TERM" />.</translation> <translation id="5464696796438641524">Teclat polonès</translation> <translation id="5465122519792752163">Teclat nepalès (InScript)</translation> <translation id="5469868506864199649">Italià</translation> <translation id="5494920125229734069">Selecciona-ho tot</translation> <translation id="5500122897333236901">Islandès</translation> <translation id="5508696409934741614">Punts</translation> +<translation id="5522908512596376669">La llista de fitxers ha canviat a la visualització de llista.</translation> <translation id="5524517123096967210">El fitxer no s'ha pogut llegir.</translation> <translation id="5533102081734025921">Imatge <ph name="IMAGE_TYPE" /></translation> <translation id="5533555070048896610">Transliteració (namaste → नमस्ते)</translation> @@ -435,6 +438,7 @@ <translation id="6040143037577758943">Tanca</translation> <translation id="6054173164583630569">Teclat francès</translation> <translation id="6074825444536523002">Formulari de Google</translation> +<translation id="6096979789310008754">El text de cerca s'ha esborrat. Es mostren tots els fitxers i carpetes.</translation> <translation id="6111770213269631447">Transliteració (namaskar → নমস্কার)</translation> <translation id="6129953537138746214">Espai</translation> <translation id="6133173853026656527">S'està traslladant <ph name="FILE_NAME" />...</translation> @@ -650,6 +654,7 @@ <translation id="8561206103590473338">Elefant</translation> <translation id="8569764466147087991">Seleccioneu el fitxer que vulgueu obrir</translation> <translation id="8579285237314169903">S'estan sincronitzant <ph name="NUMBER_OF_FILES" /> elements...</translation> +<translation id="8600173386174225982">La llista de fitxers ha canviat a la visualització de miniatures.</translation> <translation id="8669949407341943408">S'estan traslladant...</translation> <translation id="8671210955687109937">Pot comentar</translation> <translation id="8686213429977032554">Aquest fitxer de Drive encara no s'ha compartit</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_cs.xtb b/ui/chromeos/translations/ui_chromeos_strings_cs.xtb index 1f495a3..1ea79ef 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_cs.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_cs.xtb
@@ -286,6 +286,7 @@ <translation id="4572815280350369984">Soubor <ph name="FILE_TYPE" /></translation> <translation id="457386861538956877">Další...</translation> <translation id="4582497162516204941">Instalovat pomocí Linuxu (beta)</translation> +<translation id="4594543368593301662">Zobrazují se výsledky pro dotaz <ph name="SEARCH_TERM" />.</translation> <translation id="4631887759990505102">Interpret</translation> <translation id="4656293982926141856">Tento počítač</translation> <translation id="4669606053856530811">Pokud s nimi tyto položky nejsou sdíleny, ztratí k nim členové týmu <ph name="SOURCE_NAME" /> přístup.</translation> @@ -382,12 +383,14 @@ <translation id="5412637665001827670">Bulharská klávesnice</translation> <translation id="5418923334382419584">Myanmarská klávesnice</translation> <translation id="5428105026674456456">španělština</translation> +<translation id="5438282218546237410">Pro dotaz <ph name="SEARCH_TERM" /> nebyly nalezeny žádné výsledky.</translation> <translation id="5464696796438641524">Polská klávesnice</translation> <translation id="5465122519792752163">Nepálská klávesnice (InScript)</translation> <translation id="5469868506864199649">italština</translation> <translation id="5494920125229734069">Vybrat vše</translation> <translation id="5500122897333236901">islandština</translation> <translation id="5508696409934741614">Tečky</translation> +<translation id="5522908512596376669">Seznam souborů byl změněn na seznamové zobrazení.</translation> <translation id="5524517123096967210">Soubor se nepodařilo načíst.</translation> <translation id="5533102081734025921">Obrázek <ph name="IMAGE_TYPE" /></translation> <translation id="5533555070048896610">Přepis (namaste → नमस्ते)</translation> @@ -434,6 +437,7 @@ <translation id="6040143037577758943">Zavřít</translation> <translation id="6054173164583630569">Francouzská klávesnice</translation> <translation id="6074825444536523002">Formulář Google</translation> +<translation id="6096979789310008754">Text vyhledávání byl vymazán, jsou zobrazeny všechny soubory a složky.</translation> <translation id="6111770213269631447">Přepis (namaskar → নমস্কার)</translation> <translation id="6129953537138746214">Mezera</translation> <translation id="6133173853026656527">Přesouvání souboru <ph name="FILE_NAME" />...</translation> @@ -649,6 +653,7 @@ <translation id="8561206103590473338">Slon</translation> <translation id="8569764466147087991">Vyberte soubor, který chcete otevřít</translation> <translation id="8579285237314169903">Synchronizace <ph name="NUMBER_OF_FILES" /> položek...</translation> +<translation id="8600173386174225982">Seznam souborů se změnil na zobrazení miniatur.</translation> <translation id="8669949407341943408">Přesouvání...</translation> <translation id="8671210955687109937">Může přidávat komentáře</translation> <translation id="8686213429977032554">Tento soubor na Disku dosud není sdílen</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_el.xtb b/ui/chromeos/translations/ui_chromeos_strings_el.xtb index e614ee8..8652728b 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_el.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_el.xtb
@@ -294,6 +294,7 @@ <translation id="4572815280350369984">Αρχείο <ph name="FILE_TYPE" /></translation> <translation id="457386861538956877">Περισσότερα...</translation> <translation id="4582497162516204941">Εγκατάσταση με Linux (beta)</translation> +<translation id="4594543368593301662">Εμφάνιση αποτελεσμάτων για <ph name="SEARCH_TERM" />.</translation> <translation id="4631887759990505102">Καλλιτέχνης</translation> <translation id="4656293982926141856">Αυτός ο υπολογιστής</translation> <translation id="4669606053856530811">Τα μέλη του "<ph name="SOURCE_NAME" />" θα χάσουν την πρόσβαση, εκτός εάν αυτά τα στοιχεία είναι κοινόχρηστα για τα συγκεκριμένα μέλη.</translation> @@ -396,12 +397,14 @@ <translation id="5418923334382419584">Πληκτρολόγιο Μιανμάρ</translation> <translation id="5428105026674456456">Ισπανικά </translation> +<translation id="5438282218546237410">Δεν υπάρχουν αποτελέσματα για <ph name="SEARCH_TERM" />.</translation> <translation id="5464696796438641524">Πληκτρολόγιο με πολωνικούς χαρακτήρες</translation> <translation id="5465122519792752163">Πληκτρολόγιο Νεπάλι (InScript)</translation> <translation id="5469868506864199649">Ιταλικά</translation> <translation id="5494920125229734069">Επιλογή όλων</translation> <translation id="5500122897333236901">Ισλανδικά</translation> <translation id="5508696409934741614">Τελείες</translation> +<translation id="5522908512596376669">Η λίστα αρχείων έχει αλλάξει σε προβολή λίστας.</translation> <translation id="5524517123096967210">Δεν ήταν δυνατή η ανάγνωση του αρχείου.</translation> <translation id="5533102081734025921">Εικόνα <ph name="IMAGE_TYPE" /></translation> <translation id="5533555070048896610">Μεταγραφή (namaste → नमस्ते)</translation> @@ -448,6 +451,7 @@ <translation id="6040143037577758943">Κλείσιμο</translation> <translation id="6054173164583630569">Πληκτρολόγιο με γαλλικούς χαρακτήρες</translation> <translation id="6074825444536523002">Φόρμα Google</translation> +<translation id="6096979789310008754">Έγινε κατάργηση του κειμένου αναζήτησης, εμφανίζονται όλα τα αρχεία και οι φάκελοι.</translation> <translation id="6111770213269631447">Μεταγραφή (namaskar → নমস্কার)</translation> <translation id="6129953537138746214">Κενό</translation> <translation id="6133173853026656527">Μετακίνηση αρχείου <ph name="FILE_NAME" />…</translation> @@ -670,6 +674,7 @@ <translation id="8561206103590473338">Ελέφαντας</translation> <translation id="8569764466147087991">Επιλέξτε αρχείο για άνοιγμα</translation> <translation id="8579285237314169903">Γίνεται συγχρονισμός <ph name="NUMBER_OF_FILES" /> στοιχείων…</translation> +<translation id="8600173386174225982">Η λίστα αρχείων έχει αλλάξει σε προβολή μικρογραφίας.</translation> <translation id="8669949407341943408">Μετακίνηση…</translation> <translation id="8671210955687109937">Δυνατότητα σχολιασμού</translation> <translation id="8686213429977032554">Δεν μοιράζεστε ακόμα αυτό το αρχείο του Drive</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_en-GB.xtb b/ui/chromeos/translations/ui_chromeos_strings_en-GB.xtb index ae6d7bb..6dd43998 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_en-GB.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_en-GB.xtb
@@ -286,6 +286,7 @@ <translation id="4572815280350369984"><ph name="FILE_TYPE" /> file</translation> <translation id="457386861538956877">More...</translation> <translation id="4582497162516204941">Install with Linux (Beta)</translation> +<translation id="4594543368593301662">Showing results for <ph name="SEARCH_TERM" />.</translation> <translation id="4631887759990505102">Artist</translation> <translation id="4656293982926141856">This computer</translation> <translation id="4669606053856530811">Members of '<ph name="SOURCE_NAME" />' will lose access unless these items are shared with them.</translation> @@ -383,12 +384,14 @@ <translation id="5412637665001827670">Bulgarian keyboard</translation> <translation id="5418923334382419584">Myanmar keyboard</translation> <translation id="5428105026674456456">Spanish</translation> +<translation id="5438282218546237410">There are no results for <ph name="SEARCH_TERM" />.</translation> <translation id="5464696796438641524">Polish keyboard</translation> <translation id="5465122519792752163">Nepali keyboard (InScript)</translation> <translation id="5469868506864199649">Italian</translation> <translation id="5494920125229734069">Select all</translation> <translation id="5500122897333236901">Icelandic</translation> <translation id="5508696409934741614">Dots</translation> +<translation id="5522908512596376669">File list has changed to list view.</translation> <translation id="5524517123096967210">The file could not be read.</translation> <translation id="5533102081734025921"><ph name="IMAGE_TYPE" /> image</translation> <translation id="5533555070048896610">Transliteration (namaste → नमस्ते)</translation> @@ -435,6 +438,7 @@ <translation id="6040143037577758943">Close</translation> <translation id="6054173164583630569">French keyboard</translation> <translation id="6074825444536523002">Google form</translation> +<translation id="6096979789310008754">Search text cleared, showing all files and folders.</translation> <translation id="6111770213269631447">Transliteration (namaskar → নমস্কার)</translation> <translation id="6129953537138746214">Space</translation> <translation id="6133173853026656527">Moving <ph name="FILE_NAME" />...</translation> @@ -650,6 +654,7 @@ <translation id="8561206103590473338">Elephant</translation> <translation id="8569764466147087991">Select a file to open</translation> <translation id="8579285237314169903">Syncing <ph name="NUMBER_OF_FILES" /> items...</translation> +<translation id="8600173386174225982">File list has changed to thumbnail view.</translation> <translation id="8669949407341943408">Moving...</translation> <translation id="8671210955687109937">Can comment</translation> <translation id="8686213429977032554">This Drive file isn't shared yet</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_et.xtb b/ui/chromeos/translations/ui_chromeos_strings_et.xtb index 901efca4..623f21d 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_et.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_et.xtb
@@ -286,6 +286,7 @@ <translation id="4572815280350369984"><ph name="FILE_TYPE" />-file</translation> <translation id="457386861538956877">Rohkem ...</translation> <translation id="4582497162516204941">Installimine Linuxiga (beetaversioon)</translation> +<translation id="4594543368593301662">Kuvatakse otsingu <ph name="SEARCH_TERM" /> tulemusi.</translation> <translation id="4631887759990505102">Esitaja</translation> <translation id="4656293982926141856">See arvuti</translation> <translation id="4669606053856530811">Üksuse „<ph name="SOURCE_NAME" />” liikmed kaotavad juurdepääsu, kui neid üksusi nendega ei jagata.</translation> @@ -383,12 +384,14 @@ <translation id="5412637665001827670">Bulgaaria klaviatuur</translation> <translation id="5418923334382419584">Birma klaviatuur</translation> <translation id="5428105026674456456">hispaania keel</translation> +<translation id="5438282218546237410">Päringule <ph name="SEARCH_TERM" /> ei leitud tulemusi.</translation> <translation id="5464696796438641524">Poola klaviatuur</translation> <translation id="5465122519792752163">Nepaali klaviatuur (InScript)</translation> <translation id="5469868506864199649">itaalia keel</translation> <translation id="5494920125229734069">Valige kõik</translation> <translation id="5500122897333236901">islandi keel</translation> <translation id="5508696409934741614">Punktid</translation> +<translation id="5522908512596376669">Faililoendi jaoks aktiveeriti loendikuva.</translation> <translation id="5524517123096967210">Faili ei saa lugeda.</translation> <translation id="5533102081734025921"><ph name="IMAGE_TYPE" />-pilt</translation> <translation id="5533555070048896610">Transliteratsioon (namaste → नमस्ते)</translation> @@ -435,6 +438,7 @@ <translation id="6040143037577758943">Sulge</translation> <translation id="6054173164583630569">Prantsuse klaviatuur</translation> <translation id="6074825444536523002">Google'i vorm</translation> +<translation id="6096979789310008754">Otsingutekst on kustutatud, kuvatud on kõik failid ja kaustad.</translation> <translation id="6111770213269631447">Transliteratsioon (namaskar → নমস্কার)</translation> <translation id="6129953537138746214">Tühik</translation> <translation id="6133173853026656527">Faili <ph name="FILE_NAME" /> teisaldamine ...</translation> @@ -650,6 +654,7 @@ <translation id="8561206103590473338">Elevant</translation> <translation id="8569764466147087991">Valige avatav fail</translation> <translation id="8579285237314169903"><ph name="NUMBER_OF_FILES" /> üksuse sünkroonimine ...</translation> +<translation id="8600173386174225982">Faililoendi jaoks aktiveeriti pisipildikuva.</translation> <translation id="8669949407341943408">Teisaldamine ...</translation> <translation id="8671210955687109937">Saab kommenteerida</translation> <translation id="8686213429977032554">Seda Drive'i faili pole veel jagatud</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_fi.xtb b/ui/chromeos/translations/ui_chromeos_strings_fi.xtb index 3e6f709..6dcbe30 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_fi.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_fi.xtb
@@ -286,6 +286,7 @@ <translation id="4572815280350369984"><ph name="FILE_TYPE" />-tiedosto</translation> <translation id="457386861538956877">Lisää...</translation> <translation id="4582497162516204941">Asenna Linuxilla (beta)</translation> +<translation id="4594543368593301662">Näytetään tulokset haulla <ph name="SEARCH_TERM" /></translation> <translation id="4631887759990505102">Esittäjä</translation> <translation id="4656293982926141856">Tällä tietokoneella</translation> <translation id="4669606053856530811">Jäsenet (<ph name="SOURCE_NAME" />) menettävät käyttöoikeuden, ellei näitä kohteita jaeta heille.</translation> @@ -383,12 +384,14 @@ <translation id="5412637665001827670">Näppäimistö: bulgaria</translation> <translation id="5418923334382419584">Myanmarilainen näppäimistö</translation> <translation id="5428105026674456456">espanja</translation> +<translation id="5438282218546237410">Ei tuloksia haulla <ph name="SEARCH_TERM" /></translation> <translation id="5464696796438641524">Näppäimistö: puola</translation> <translation id="5465122519792752163">Nepalinkielinen näppäimistö (InScript)</translation> <translation id="5469868506864199649">italia</translation> <translation id="5494920125229734069">Valitse kaikki</translation> <translation id="5500122897333236901">islanti</translation> <translation id="5508696409934741614">Pisteet</translation> +<translation id="5522908512596376669">Tiedostot näkyvät nyt luettelona.</translation> <translation id="5524517123096967210">Tiedostoa ei voi lukea.</translation> <translation id="5533102081734025921">Kuva, jonka tyyppi on <ph name="IMAGE_TYPE" /></translation> <translation id="5533555070048896610">Translitterointi (namaste → नमस्ते)</translation> @@ -435,6 +438,7 @@ <translation id="6040143037577758943">Sulje</translation> <translation id="6054173164583630569">Näppäimistö: ranska</translation> <translation id="6074825444536523002">Google-lomake</translation> +<translation id="6096979789310008754">Hakukysely poistettu, kaikki tiedostot ja kansiot näytetään.</translation> <translation id="6111770213269631447">Translitterointi (namaskar → নমস্কার)</translation> <translation id="6129953537138746214">Välilyönti</translation> <translation id="6133173853026656527">Siirretään tiedostoa <ph name="FILE_NAME" />…</translation> @@ -650,6 +654,7 @@ <translation id="8561206103590473338">Norsu</translation> <translation id="8569764466147087991">Valitse avattava tiedosto</translation> <translation id="8579285237314169903">Synkronoidaan <ph name="NUMBER_OF_FILES" /> kohdetta…</translation> +<translation id="8600173386174225982">Tiedostot näkyvät nyt pikkukuvina.</translation> <translation id="8669949407341943408">Siirretään…</translation> <translation id="8671210955687109937">Voi kommentoida</translation> <translation id="8686213429977032554">Tätä Drive-tiedostoa ei ole vielä jaettu</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_fr.xtb b/ui/chromeos/translations/ui_chromeos_strings_fr.xtb index 8e336f3e..dfe2fc4 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_fr.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_fr.xtb
@@ -286,6 +286,7 @@ <translation id="4572815280350369984">Fichier <ph name="FILE_TYPE" /></translation> <translation id="457386861538956877">Autres...</translation> <translation id="4582497162516204941">Installer avec Linux (Bêta)</translation> +<translation id="4594543368593301662">Résultats de recherche pour <ph name="SEARCH_TERM" />.</translation> <translation id="4631887759990505102">Artiste</translation> <translation id="4656293982926141856">Cet ordinateur</translation> <translation id="4669606053856530811">Les membres de "<ph name="SOURCE_NAME" />" n'auront plus accès à ces éléments, à moins qu'ils ne soient partagés avec eux.</translation> @@ -383,12 +384,14 @@ <translation id="5412637665001827670">Clavier bulgare</translation> <translation id="5418923334382419584">Clavier birman</translation> <translation id="5428105026674456456">Espagnol</translation> +<translation id="5438282218546237410">Il n'y a pas de résultat pour <ph name="SEARCH_TERM" />.</translation> <translation id="5464696796438641524">Clavier polonais</translation> <translation id="5465122519792752163">Clavier népalais (InScript)</translation> <translation id="5469868506864199649">Italien</translation> <translation id="5494920125229734069">Tout sélectionner</translation> <translation id="5500122897333236901">Islandais</translation> <translation id="5508696409934741614">Points</translation> +<translation id="5522908512596376669">Les fichiers s'affichent désormais sous forme de liste.</translation> <translation id="5524517123096967210">Impossible de lire le fichier.</translation> <translation id="5533102081734025921">Fichier image <ph name="IMAGE_TYPE" /></translation> <translation id="5533555070048896610">Translittération (namaste → नमस्ते)</translation> @@ -435,6 +438,7 @@ <translation id="6040143037577758943">Fermer</translation> <translation id="6054173164583630569">Clavier français</translation> <translation id="6074825444536523002">Formulaire Google</translation> +<translation id="6096979789310008754">Texte de recherche effacé, tous les fichiers et dossiers sont affichés.</translation> <translation id="6111770213269631447">Translittération (namaskar → নমস্কার)</translation> <translation id="6129953537138746214">Espace</translation> <translation id="6133173853026656527">Transfert du fichier <ph name="FILE_NAME" /> en cours…</translation> @@ -650,6 +654,7 @@ <translation id="8561206103590473338">Éléphant</translation> <translation id="8569764466147087991">Sélectionnez le fichier à ouvrir</translation> <translation id="8579285237314169903">Synchronisation de <ph name="NUMBER_OF_FILES" /> éléments en cours…</translation> +<translation id="8600173386174225982">Les fichiers s'affichent désormais sous forme de vignettes.</translation> <translation id="8669949407341943408">Déplacement en cours…</translation> <translation id="8671210955687109937">Commentateur</translation> <translation id="8686213429977032554">Ce fichier Drive n'a pas encore été partagé</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_hr.xtb b/ui/chromeos/translations/ui_chromeos_strings_hr.xtb index 1121c87..3dd3934 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_hr.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_hr.xtb
@@ -286,6 +286,7 @@ <translation id="4572815280350369984"><ph name="FILE_TYPE" /> datoteka</translation> <translation id="457386861538956877">Više...</translation> <translation id="4582497162516204941">Instalacija uz Linux (Beta)</translation> +<translation id="4594543368593301662">Prikazuju se rezultati za <ph name="SEARCH_TERM" />.</translation> <translation id="4631887759990505102">Izvođač</translation> <translation id="4656293982926141856">Ovo računalo</translation> <translation id="4669606053856530811">Članovi grupe "<ph name="SOURCE_NAME" />" izgubit će pristup ako se te stavke ne podijele s njima.</translation> @@ -383,12 +384,14 @@ <translation id="5412637665001827670">Bugarska tipkovnica</translation> <translation id="5418923334382419584">mjanmarska tipkovnica</translation> <translation id="5428105026674456456">Španjolski</translation> +<translation id="5438282218546237410">Nema rezultata za <ph name="SEARCH_TERM" />.</translation> <translation id="5464696796438641524">Poljska tipkovnica</translation> <translation id="5465122519792752163">nepalska tipkovnica (InScript)</translation> <translation id="5469868506864199649">Talijanski</translation> <translation id="5494920125229734069">Odaberi sve</translation> <translation id="5500122897333236901">Islandski</translation> <translation id="5508696409934741614">Točke</translation> +<translation id="5522908512596376669">Popis datoteka promijenio se na prikaz popisa.</translation> <translation id="5524517123096967210">Nije bilo moguće pročitati datoteku.</translation> <translation id="5533102081734025921"><ph name="IMAGE_TYPE" /> slika</translation> <translation id="5533555070048896610">transliteracija (namaste → नमस्ते)</translation> @@ -435,6 +438,7 @@ <translation id="6040143037577758943">Zatvori</translation> <translation id="6054173164583630569">Francuska tipkovnica</translation> <translation id="6074825444536523002">Google obrazac</translation> +<translation id="6096979789310008754">Pretraži izbrisani tekst, uz prikaz svih datoteka i mapa.</translation> <translation id="6111770213269631447">transliteracija (namaskar → নমস্কার)</translation> <translation id="6129953537138746214">Razmak</translation> <translation id="6133173853026656527">Premještanje datoteke <ph name="FILE_NAME" />...</translation> @@ -650,6 +654,7 @@ <translation id="8561206103590473338">Slon</translation> <translation id="8569764466147087991">Odaberite datoteku za otvaranje</translation> <translation id="8579285237314169903">Sinkronizacija ovoliko stavki: <ph name="NUMBER_OF_FILES" />...</translation> +<translation id="8600173386174225982">Popis datoteka promijenio se na prikaz minijatura.</translation> <translation id="8669949407341943408">Premještanje...</translation> <translation id="8671210955687109937">Može komentirati</translation> <translation id="8686213429977032554">Ova datoteka na Disku još se ne dijeli</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_hu.xtb b/ui/chromeos/translations/ui_chromeos_strings_hu.xtb index b819f35a..e6707b15 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_hu.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_hu.xtb
@@ -286,6 +286,7 @@ <translation id="4572815280350369984"><ph name="FILE_TYPE" /> fájl</translation> <translation id="457386861538956877">Továbbiak...</translation> <translation id="4582497162516204941">Telepítés a Linux (béta) segítségével</translation> +<translation id="4594543368593301662">Keresési eredmények megjelenítése a következőhöz: <ph name="SEARCH_TERM" />.</translation> <translation id="4631887759990505102">Előadó</translation> <translation id="4656293982926141856">Ez a számítógép</translation> <translation id="4669606053856530811">A(z) „<ph name="SOURCE_NAME" />” tagjai elveszítik hozzáférésüket, kivéve, ha meg vannak osztva velük ezek az elemek.</translation> @@ -383,12 +384,14 @@ <translation id="5412637665001827670">Bolgár billentyűzet</translation> <translation id="5418923334382419584">Mianmari billentyűzet</translation> <translation id="5428105026674456456">spanyol</translation> +<translation id="5438282218546237410">Nincs találat a következő kifejezésre: <ph name="SEARCH_TERM" />.</translation> <translation id="5464696796438641524">Lengyel billentyűzet</translation> <translation id="5465122519792752163">Nepáli billentyűzet (InScript)</translation> <translation id="5469868506864199649">olasz</translation> <translation id="5494920125229734069">Összes kiválasztása</translation> <translation id="5500122897333236901">izlandi</translation> <translation id="5508696409934741614">Pöttyök</translation> +<translation id="5522908512596376669">A fájllista nézete listanézetre változott.</translation> <translation id="5524517123096967210">A fájl nem olvasható.</translation> <translation id="5533102081734025921"><ph name="IMAGE_TYPE" /> kép</translation> <translation id="5533555070048896610">Átírás (namaste → नमस्ते)</translation> @@ -435,6 +438,7 @@ <translation id="6040143037577758943">Bezárás</translation> <translation id="6054173164583630569">Francia billentyűzet</translation> <translation id="6074825444536523002">Google-űrlap</translation> +<translation id="6096979789310008754">A keresési kifejezés törölve, az összes fájl és mappa látható.</translation> <translation id="6111770213269631447">Átírás (namaskar → নমস্কার)</translation> <translation id="6129953537138746214">Szóköz</translation> <translation id="6133173853026656527"><ph name="FILE_NAME" /> áthelyezése...</translation> @@ -650,6 +654,7 @@ <translation id="8561206103590473338">Elefánt</translation> <translation id="8569764466147087991">Válassza ki a megnyitni kívánt fájlt</translation> <translation id="8579285237314169903"><ph name="NUMBER_OF_FILES" /> elem szinkronizálása…</translation> +<translation id="8600173386174225982">A fájllista nézete indexképnézetre változott.</translation> <translation id="8669949407341943408">Áthelyezés…</translation> <translation id="8671210955687109937">Megjegyzések fűzhetők hozzá</translation> <translation id="8686213429977032554">Ez a Drive-fájl még nincs megosztva</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_it.xtb b/ui/chromeos/translations/ui_chromeos_strings_it.xtb index f10939f..e427b84 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_it.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_it.xtb
@@ -286,6 +286,7 @@ <translation id="4572815280350369984">File <ph name="FILE_TYPE" /></translation> <translation id="457386861538956877">Altro...</translation> <translation id="4582497162516204941">Installa con Linux (beta)</translation> +<translation id="4594543368593301662">Risultati visualizzati per <ph name="SEARCH_TERM" />.</translation> <translation id="4631887759990505102">Artista</translation> <translation id="4656293982926141856">Questo computer</translation> <translation id="4669606053856530811">I membri di "<ph name="SOURCE_NAME" />" non avranno più accesso, a meno che questi elementi vengano condivisi con loro.</translation> @@ -382,12 +383,14 @@ <translation id="5412637665001827670">Tastiera bulgara</translation> <translation id="5418923334382419584">Tastiera Birmano</translation> <translation id="5428105026674456456">Spagnolo</translation> +<translation id="5438282218546237410">Nessun risultato per <ph name="SEARCH_TERM" />.</translation> <translation id="5464696796438641524">Tastiera polacca</translation> <translation id="5465122519792752163">Tastiera Nepalese (InScript)</translation> <translation id="5469868506864199649">Italiano</translation> <translation id="5494920125229734069">Seleziona tutto</translation> <translation id="5500122897333236901">Islandese</translation> <translation id="5508696409934741614">Punti</translation> +<translation id="5522908512596376669">L'elenco dei file è stato modificato in visualizzazione elenco.</translation> <translation id="5524517123096967210">Impossibile leggere il file.</translation> <translation id="5533102081734025921">Immagine <ph name="IMAGE_TYPE" /></translation> <translation id="5533555070048896610">Traslitterazione (namaste → नमस्ते)</translation> @@ -434,6 +437,7 @@ <translation id="6040143037577758943">Chiudi</translation> <translation id="6054173164583630569">Tastiera francese</translation> <translation id="6074825444536523002">Modulo Google</translation> +<translation id="6096979789310008754">Testo di ricerca cancellato, sono visualizzati tutti i file e tutte le cartelle.</translation> <translation id="6111770213269631447">Traslitterazione (namaskar → নমস্কার)</translation> <translation id="6129953537138746214">Spazio</translation> <translation id="6133173853026656527">Spostamento di <ph name="FILE_NAME" />...</translation> @@ -649,6 +653,7 @@ <translation id="8561206103590473338">Elefante</translation> <translation id="8569764466147087991">Seleziona un file da aprire</translation> <translation id="8579285237314169903">Sincronizzazione di <ph name="NUMBER_OF_FILES" /> elementi...</translation> +<translation id="8600173386174225982">L'elenco dei file è stato modificato in visualizzazione miniatura.</translation> <translation id="8669949407341943408">Spostamento...</translation> <translation id="8671210955687109937">Può commentare</translation> <translation id="8686213429977032554">Questo file di Drive non è stato ancora condiviso</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_lt.xtb b/ui/chromeos/translations/ui_chromeos_strings_lt.xtb index 946537b..fc63244d 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_lt.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_lt.xtb
@@ -286,6 +286,7 @@ <translation id="4572815280350369984"><ph name="FILE_TYPE" /> failas</translation> <translation id="457386861538956877">Daugiau...</translation> <translation id="4582497162516204941">Diegimas sistemoje „Linux“ (beta vers.)</translation> +<translation id="4594543368593301662">Rodomi rezultatai pagal užklausą „<ph name="SEARCH_TERM" />“.</translation> <translation id="4631887759990505102">Atlikėjas</translation> <translation id="4656293982926141856">Šis kompiuteris</translation> <translation id="4669606053856530811">„<ph name="SOURCE_NAME" />“ nariai praras prieigą, nebent šie elementai bus bendrinami su jais.</translation> @@ -383,12 +384,14 @@ <translation id="5412637665001827670">Bulgariška klaviatūra</translation> <translation id="5418923334382419584">Mianmariečių klaviatūra</translation> <translation id="5428105026674456456">Ispanų</translation> +<translation id="5438282218546237410">Nėra jokių rezultatų pagal užklausą „<ph name="SEARCH_TERM" />“.</translation> <translation id="5464696796438641524">Lenkiška klaviatūra</translation> <translation id="5465122519792752163">Nepaliečių klaviatūra („InScript“)</translation> <translation id="5469868506864199649">Italų</translation> <translation id="5494920125229734069">Pasirinkti viską</translation> <translation id="5500122897333236901">Islandų</translation> <translation id="5508696409934741614">Taškai</translation> +<translation id="5522908512596376669">Failų sąrašas pakeistas į sąrašo rodinį.</translation> <translation id="5524517123096967210">Nepavyko nuskaityti failo.</translation> <translation id="5533102081734025921"><ph name="IMAGE_TYPE" /> vaizdas</translation> <translation id="5533555070048896610">Transliteracija (namaste → नमस्ते)</translation> @@ -435,6 +438,7 @@ <translation id="6040143037577758943">Uždaryti</translation> <translation id="6054173164583630569">Prancūziška klaviatūra</translation> <translation id="6074825444536523002">„Google“ forma</translation> +<translation id="6096979789310008754">Paieškos tekstas išvalytas, rodomi visi failai ir aplankai.</translation> <translation id="6111770213269631447">Transliteracija (namaskar → নমস্কার)</translation> <translation id="6129953537138746214">Tarpas</translation> <translation id="6133173853026656527">Perkeliamas failas „<ph name="FILE_NAME" />“...</translation> @@ -650,6 +654,7 @@ <translation id="8561206103590473338">Dramblys</translation> <translation id="8569764466147087991">Pasirinkite norimą atidaryti failą</translation> <translation id="8579285237314169903">Sinchronizuojama elementų: <ph name="NUMBER_OF_FILES" />…</translation> +<translation id="8600173386174225982">Failų sąrašas pakeistas į miniatiūrų rodinį.</translation> <translation id="8669949407341943408">Perkeliama...</translation> <translation id="8671210955687109937">Galima komentuoti</translation> <translation id="8686213429977032554">Šis Disko failas dar nebendrinamas</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_lv.xtb b/ui/chromeos/translations/ui_chromeos_strings_lv.xtb index 0a789b3..007ca91 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_lv.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_lv.xtb
@@ -286,6 +286,7 @@ <translation id="4572815280350369984"><ph name="FILE_TYPE" /> fails</translation> <translation id="457386861538956877">Vēl...</translation> <translation id="4582497162516204941">Instalēt operētājsistēmā Linux (Beta)</translation> +<translation id="4594543368593301662">Tiek rādīti rezultāti šādam vaicājumam: <ph name="SEARCH_TERM" />.</translation> <translation id="4631887759990505102">Izpildītājs</translation> <translation id="4656293982926141856">Šajā datorā</translation> <translation id="4669606053856530811">“<ph name="SOURCE_NAME" />” dalībnieki zaudēs piekļuvi šiem vienumiem, ja tie netiks kopīgoti ar viņiem.</translation> @@ -383,12 +384,14 @@ <translation id="5412637665001827670">Bulgāru valodas tastatūra</translation> <translation id="5418923334382419584">Birmiešu tastatūra</translation> <translation id="5428105026674456456">Spāņu valoda</translation> +<translation id="5438282218546237410">Meklēšanas vienumam “<ph name="SEARCH_TERM" />” nav neviena rezultāta.</translation> <translation id="5464696796438641524">Poļu valodas tastatūra</translation> <translation id="5465122519792752163">Nepāliešu tastatūra (InScript)</translation> <translation id="5469868506864199649">Itāļu valoda</translation> <translation id="5494920125229734069">Atlasīt visu</translation> <translation id="5500122897333236901">Īslandiešu valoda</translation> <translation id="5508696409934741614">Punkti</translation> +<translation id="5522908512596376669">Failu saraksts ir mainīts uz saraksta skatu.</translation> <translation id="5524517123096967210">Failu nevarēja nolasīt.</translation> <translation id="5533102081734025921"><ph name="IMAGE_TYPE" /> attēls</translation> <translation id="5533555070048896610">Transliterācija (namaste → नमस्ते)</translation> @@ -435,6 +438,7 @@ <translation id="6040143037577758943">Aizvērt</translation> <translation id="6054173164583630569">Franču valodas tastatūra</translation> <translation id="6074825444536523002">Google veidlapa</translation> +<translation id="6096979789310008754">Meklēšanas teksts ir notīrīts; tiek rādīti visi faili un mapes.</translation> <translation id="6111770213269631447">Transliterācija (namaskar → নমস্কার)</translation> <translation id="6129953537138746214">Atstarpe</translation> <translation id="6133173853026656527">Notiek faila “<ph name="FILE_NAME" />” pārvietošana...</translation> @@ -650,6 +654,7 @@ <translation id="8561206103590473338">Zilonis</translation> <translation id="8569764466147087991">Atlasīt atveramo failu</translation> <translation id="8579285237314169903">Notiek <ph name="NUMBER_OF_FILES" /> vienumu sinhronizēšana...</translation> +<translation id="8600173386174225982">Failu saraksts ir mainīts uz sīktēlu skatu.</translation> <translation id="8669949407341943408">Notiek pārvietošana...</translation> <translation id="8671210955687109937">Var komentēt</translation> <translation id="8686213429977032554">Šis Diska fails vēl nav kopīgots</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_no.xtb b/ui/chromeos/translations/ui_chromeos_strings_no.xtb index e2e3ca63..cd466ea 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_no.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_no.xtb
@@ -286,6 +286,7 @@ <translation id="4572815280350369984"><ph name="FILE_TYPE" />-fil</translation> <translation id="457386861538956877">Mer</translation> <translation id="4582497162516204941">Installer med Linux (beta)</translation> +<translation id="4594543368593301662">Viser resultater for <ph name="SEARCH_TERM" />.</translation> <translation id="4631887759990505102">Artist</translation> <translation id="4656293982926141856">Denne datamaskinen</translation> <translation id="4669606053856530811">Medlemmer av «<ph name="SOURCE_NAME" />» mister tilgangen, med mindre disse elementene deles med dem.</translation> @@ -383,12 +384,14 @@ <translation id="5412637665001827670">Bulgarsk tastatur</translation> <translation id="5418923334382419584">Myanmar-tastatur</translation> <translation id="5428105026674456456">Spansk</translation> +<translation id="5438282218546237410">Det er ingen resultater for <ph name="SEARCH_TERM" />.</translation> <translation id="5464696796438641524">Polsk tastatur</translation> <translation id="5465122519792752163">Nepali-tastatur (InScript)</translation> <translation id="5469868506864199649">Italiensk</translation> <translation id="5494920125229734069">Velg alle</translation> <translation id="5500122897333236901">Islandsk</translation> <translation id="5508696409934741614">Prikker</translation> +<translation id="5522908512596376669">Fillisten vises nå i listevisning.</translation> <translation id="5524517123096967210">Kunne ikke lese filen.</translation> <translation id="5533102081734025921"><ph name="IMAGE_TYPE" /> bilde</translation> <translation id="5533555070048896610">Translitterasjon (namaste → नमस्ते)</translation> @@ -435,6 +438,7 @@ <translation id="6040143037577758943">Lukk</translation> <translation id="6054173164583630569">Fransk tastatur</translation> <translation id="6074825444536523002">Google-skjema</translation> +<translation id="6096979789310008754">Søketeksten er fjernet. Viser alle filer og mapper.</translation> <translation id="6111770213269631447">Translitterasjon (namaskar → নমস্কার)</translation> <translation id="6129953537138746214">Mellomrom</translation> <translation id="6133173853026656527">Flytter <ph name="FILE_NAME" /> ...</translation> @@ -650,6 +654,7 @@ <translation id="8561206103590473338">Elefant</translation> <translation id="8569764466147087991">Velg en fil du vil åpne</translation> <translation id="8579285237314169903">Synkroniserer <ph name="NUMBER_OF_FILES" /> elementer …</translation> +<translation id="8600173386174225982">Fillisten vises nå i miniatyrbildevisning.</translation> <translation id="8669949407341943408">Flytter …</translation> <translation id="8671210955687109937">Kan kommentere</translation> <translation id="8686213429977032554">Denne Disk-filen er ikke delt ennå</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_pl.xtb b/ui/chromeos/translations/ui_chromeos_strings_pl.xtb index 66643e5b..af85f7b1 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_pl.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_pl.xtb
@@ -286,6 +286,7 @@ <translation id="4572815280350369984">Plik <ph name="FILE_TYPE" /></translation> <translation id="457386861538956877">Więcej</translation> <translation id="4582497162516204941">Zainstaluj za pomocą Linuksa (Beta)</translation> +<translation id="4594543368593301662">Wyświetlam wyniki dla: <ph name="SEARCH_TERM" />.</translation> <translation id="4631887759990505102">Wykonawca</translation> <translation id="4656293982926141856">Ten komputer</translation> <translation id="4669606053856530811">Osoby z uprawnieniami do: „<ph name="SOURCE_NAME" />” utracą dostęp do tych elementów, chyba że zostaną one im udostępnione.</translation> @@ -383,12 +384,14 @@ <translation id="5412637665001827670">Klawiatura bułgarska</translation> <translation id="5418923334382419584">Klawiatura birmańska</translation> <translation id="5428105026674456456">Hiszpański</translation> +<translation id="5438282218546237410">Brak wyników dla: <ph name="SEARCH_TERM" />.</translation> <translation id="5464696796438641524">Klawiatura polska</translation> <translation id="5465122519792752163">Klawiatura nepalska (InScript)</translation> <translation id="5469868506864199649">Włoski</translation> <translation id="5494920125229734069">Wybierz wszystko</translation> <translation id="5500122897333236901">Islandzki</translation> <translation id="5508696409934741614">Punkty</translation> +<translation id="5522908512596376669">Lista plików została przełączona na widok listy.</translation> <translation id="5524517123096967210">Nie można odczytać pliku.</translation> <translation id="5533102081734025921">Obraz <ph name="IMAGE_TYPE" /></translation> <translation id="5533555070048896610">Transliteracja (namaste → नमस्ते)</translation> @@ -435,6 +438,7 @@ <translation id="6040143037577758943">Zamknij</translation> <translation id="6054173164583630569">Klawiatura francuska</translation> <translation id="6074825444536523002">Formularz Google</translation> +<translation id="6096979789310008754">Wyszukiwany tekst został wyczyszczony. Wyświetlam wszystkie pliki i foldery.</translation> <translation id="6111770213269631447">Transliteracja (namaskar → নমস্কার)</translation> <translation id="6129953537138746214">Spacja</translation> <translation id="6133173853026656527">Przenoszę <ph name="FILE_NAME" />...</translation> @@ -583,7 +587,7 @@ <translation id="7864662577698025113">Dodaj nową usługę</translation> <translation id="7873831373602885875">Nie można zapisać w folderze <ph name="FOLDER_NAME" />. Wszystkie zmiany będą zapisywane w folderze <ph name="DOWNLOADS_FOLDER" /> znajdującym się w folderze Pobrane pliki.</translation> <translation id="7881969471599061635">Wyłącz napisy</translation> -<translation id="78946041517601018">Udostępniane dyski</translation> +<translation id="78946041517601018">Dyski współdzielone</translation> <translation id="7896906914454843592">Klawiatura rozszerzona USA</translation> <translation id="7898607018410277265">Klawiatura gudżarati (nowa fonetyczna)</translation> <translation id="7917972308273378936">Klawiatura litewska</translation> @@ -650,6 +654,7 @@ <translation id="8561206103590473338">Słoń</translation> <translation id="8569764466147087991">Wybierz plik do otwarcia</translation> <translation id="8579285237314169903">Synchronizuję elementy – <ph name="NUMBER_OF_FILES" />...</translation> +<translation id="8600173386174225982">Lista plików została przełączona na widok miniatur.</translation> <translation id="8669949407341943408">Przenoszę...</translation> <translation id="8671210955687109937">Może komentować</translation> <translation id="8686213429977032554">Ten plik na Dysku nie jest jeszcze udostępniany</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_pt-PT.xtb b/ui/chromeos/translations/ui_chromeos_strings_pt-PT.xtb index 14b6af5..152d025d 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_pt-PT.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_pt-PT.xtb
@@ -286,6 +286,7 @@ <translation id="4572815280350369984">Ficheiro <ph name="FILE_TYPE" /></translation> <translation id="457386861538956877">Mais...</translation> <translation id="4582497162516204941">Instalar com o Linux (Beta)</translation> +<translation id="4594543368593301662">A mostrar resultados para <ph name="SEARCH_TERM" />.</translation> <translation id="4631887759990505102">Artista</translation> <translation id="4656293982926141856">Este computador</translation> <translation id="4669606053856530811">Os membros de "<ph name="SOURCE_NAME" />" irão perder o acesso, exceto se estes itens forem partilhados com eles.</translation> @@ -383,12 +384,14 @@ <translation id="5412637665001827670">Teclado búlgaro</translation> <translation id="5418923334382419584">Teclado birmanês</translation> <translation id="5428105026674456456">Espanhol</translation> +<translation id="5438282218546237410">Não existem resultados para <ph name="SEARCH_TERM" />.</translation> <translation id="5464696796438641524">Teclado polaco</translation> <translation id="5465122519792752163">Teclado nepalês (InScript)</translation> <translation id="5469868506864199649">Italiano</translation> <translation id="5494920125229734069">Selecionar tudo</translation> <translation id="5500122897333236901">Islandês</translation> <translation id="5508696409934741614">Pontos</translation> +<translation id="5522908512596376669">A lista de ficheiros foi alterada para a vista de lista.</translation> <translation id="5524517123096967210">Não foi possível ler o ficheiro.</translation> <translation id="5533102081734025921">Imagem <ph name="IMAGE_TYPE" /></translation> <translation id="5533555070048896610">Transliteração (namaste → नमस्ते)</translation> @@ -435,6 +438,7 @@ <translation id="6040143037577758943">Fechar</translation> <translation id="6054173164583630569">Teclado francês</translation> <translation id="6074825444536523002">Formulário do Google</translation> +<translation id="6096979789310008754">Texto da pesquisa limpo, a mostrar todos os ficheiros e pastas.</translation> <translation id="6111770213269631447">Transliteração (namaskar → নমস্কার)</translation> <translation id="6129953537138746214">Espaço</translation> <translation id="6133173853026656527">A mover <ph name="FILE_NAME" />...</translation> @@ -650,6 +654,7 @@ <translation id="8561206103590473338">Elefante</translation> <translation id="8569764466147087991">Selecione um ficheiro para abrir</translation> <translation id="8579285237314169903">A sincronizar <ph name="NUMBER_OF_FILES" /> itens...</translation> +<translation id="8600173386174225982">A lista de ficheiros foi alterada para a vista de miniatura.</translation> <translation id="8669949407341943408">A mover...</translation> <translation id="8671210955687109937">Pode comentar</translation> <translation id="8686213429977032554">Este ficheiro do Google Drive ainda não foi partilhado</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_ro.xtb b/ui/chromeos/translations/ui_chromeos_strings_ro.xtb index c0b9522..2a397c3f 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_ro.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_ro.xtb
@@ -286,6 +286,7 @@ <translation id="4572815280350369984">Fișier <ph name="FILE_TYPE" /></translation> <translation id="457386861538956877">Mai multe...</translation> <translation id="4582497162516204941">Instalează cu Linux (Beta)</translation> +<translation id="4594543368593301662">Se afișează rezultate pentru <ph name="SEARCH_TERM" />.</translation> <translation id="4631887759990505102">Artist</translation> <translation id="4656293982926141856">Acest computer</translation> <translation id="4669606053856530811">Membrii „<ph name="SOURCE_NAME" />” vor pierde accesul, exceptând cazul în care li se permite accesul la aceste articole.</translation> @@ -383,12 +384,14 @@ <translation id="5412637665001827670">Tastatură bulgară</translation> <translation id="5418923334382419584">Tastatură birmană</translation> <translation id="5428105026674456456">Spaniolă</translation> +<translation id="5438282218546237410">Nu există rezultate pentru <ph name="SEARCH_TERM" />.</translation> <translation id="5464696796438641524">Tastatură poloneză</translation> <translation id="5465122519792752163">Tastatură nepaleză (InScript)</translation> <translation id="5469868506864199649">Italiană</translation> <translation id="5494920125229734069">Selectează-le pe toate</translation> <translation id="5500122897333236901">Islandeză</translation> <translation id="5508696409934741614">Puncte</translation> +<translation id="5522908512596376669">Lista de fișiere s-a modificat la afișare listă.</translation> <translation id="5524517123096967210">Fișierul nu a putut fi citit.</translation> <translation id="5533102081734025921">Imagine <ph name="IMAGE_TYPE" /></translation> <translation id="5533555070048896610">Transliterație (namaste → नमस्ते)</translation> @@ -435,6 +438,7 @@ <translation id="6040143037577758943">Închide</translation> <translation id="6054173164583630569">Tastatură franceză</translation> <translation id="6074825444536523002">Formular Google</translation> +<translation id="6096979789310008754">Textul căutării a fost șters; se afișează toate fișierele și dosarele.</translation> <translation id="6111770213269631447">Transliterație (namaskar → নমস্কার)</translation> <translation id="6129953537138746214">Spațiu</translation> <translation id="6133173853026656527">Se mută <ph name="FILE_NAME" />...</translation> @@ -650,6 +654,7 @@ <translation id="8561206103590473338">Elefant</translation> <translation id="8569764466147087991">Selectează un fișier pentru a-l deschide</translation> <translation id="8579285237314169903">Se sincronizează <ph name="NUMBER_OF_FILES" /> elemente...</translation> +<translation id="8600173386174225982">Lista de fișiere s-a modificat la vizualizare cu miniaturi.</translation> <translation id="8669949407341943408">Se mută...</translation> <translation id="8671210955687109937">Poate face comentarii</translation> <translation id="8686213429977032554">La acest fișier din Drive nu s-a permis încă accesul</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_sk.xtb b/ui/chromeos/translations/ui_chromeos_strings_sk.xtb index dd1511b..12b034b3 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_sk.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_sk.xtb
@@ -286,6 +286,7 @@ <translation id="4572815280350369984">Súbor <ph name="FILE_TYPE" /></translation> <translation id="457386861538956877">Viac...</translation> <translation id="4582497162516204941">Nainštalovať pomocou systému Linux (beta)</translation> +<translation id="4594543368593301662">Zobrazujú sa výsledky pre dopyt <ph name="SEARCH_TERM" />.</translation> <translation id="4631887759990505102">Interpret</translation> <translation id="4656293982926141856">Tento počítač</translation> <translation id="4669606053856530811">Členovia zdroja <ph name="SOURCE_NAME" /> stratia prístup, pokiaľ s nimi tieto položky nezačnete zdieľať.</translation> @@ -383,12 +384,14 @@ <translation id="5412637665001827670">bulharská klávesnica</translation> <translation id="5418923334382419584">Klávesnica pre mjanmarčinu</translation> <translation id="5428105026674456456">Španielčina</translation> +<translation id="5438282218546237410">Pre dopyt <ph name="SEARCH_TERM" /> nie sú k dispozícii žiadne výsledky.</translation> <translation id="5464696796438641524">poľská klávesnica</translation> <translation id="5465122519792752163">Klávesnica pre nepálčinu (InScript)</translation> <translation id="5469868506864199649">Taliančina</translation> <translation id="5494920125229734069">Vybrať všetko</translation> <translation id="5500122897333236901">Islandčina</translation> <translation id="5508696409934741614">Bodky</translation> +<translation id="5522908512596376669">Zoznam súborov sa zmenil na zobrazenie zoznamu.</translation> <translation id="5524517123096967210">Súbor sa nepodarilo prečítať.</translation> <translation id="5533102081734025921">Obrázok <ph name="IMAGE_TYPE" /></translation> <translation id="5533555070048896610">Prepis (namaste → नमस्ते)</translation> @@ -435,6 +438,7 @@ <translation id="6040143037577758943">Zavrieť</translation> <translation id="6054173164583630569">francúzska klávesnica</translation> <translation id="6074825444536523002">Formulár Google</translation> +<translation id="6096979789310008754">Text vyhľadávania bol vymazaný, zobrazujú sa všetky súbory a priečinky</translation> <translation id="6111770213269631447">Prepis (namaskar → নমস্কার)</translation> <translation id="6129953537138746214">Medzera</translation> <translation id="6133173853026656527">Prebieha presúvanie súboru <ph name="FILE_NAME" />...</translation> @@ -650,6 +654,7 @@ <translation id="8561206103590473338">Slon</translation> <translation id="8569764466147087991">Vyberte súbor, ktorý chcete otvoriť</translation> <translation id="8579285237314169903">Synchronizujú sa položky (počet: <ph name="NUMBER_OF_FILES" />)...</translation> +<translation id="8600173386174225982">Zoznam súborov sa zmenil na zobrazenie miniatúry.</translation> <translation id="8669949407341943408">Presúva sa...</translation> <translation id="8671210955687109937">Môže pridávať komentáre</translation> <translation id="8686213429977032554">Tento súbor na Disku sa zatiaľ nezdieľa</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_sl.xtb b/ui/chromeos/translations/ui_chromeos_strings_sl.xtb index c660c03..b39d847 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_sl.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_sl.xtb
@@ -286,6 +286,7 @@ <translation id="4572815280350369984">Datoteka <ph name="FILE_TYPE" /></translation> <translation id="457386861538956877">Več ...</translation> <translation id="4582497162516204941">Namestitev v Linuxu (beta)</translation> +<translation id="4594543368593301662">Prikaz rezultatov za »<ph name="SEARCH_TERM" />«.</translation> <translation id="4631887759990505102">Izvajalec</translation> <translation id="4656293982926141856">V tem računalniku</translation> <translation id="4669606053856530811">Člani skupine »<ph name="SOURCE_NAME" />« bodo izgubili dostop, razen če te elemente delite z njimi.</translation> @@ -383,12 +384,14 @@ <translation id="5412637665001827670">Bolgarska tipkovnica</translation> <translation id="5418923334382419584">Tipkovnica za mjanmarščino</translation> <translation id="5428105026674456456">španščina</translation> +<translation id="5438282218546237410">Ni rezultatov za »<ph name="SEARCH_TERM" />«.</translation> <translation id="5464696796438641524">Poljska tipkovnica</translation> <translation id="5465122519792752163">Tipkovnica za nepalščino (InScript)</translation> <translation id="5469868506864199649">italijanščina</translation> <translation id="5494920125229734069">Izberi vse</translation> <translation id="5500122897333236901">islandščina</translation> <translation id="5508696409934741614">Pike</translation> +<translation id="5522908512596376669">Seznam datotek je spremenjen na prikaz seznama.</translation> <translation id="5524517123096967210">Datoteke ni bilo mogoče prebrati.</translation> <translation id="5533102081734025921">Slika <ph name="IMAGE_TYPE" /></translation> <translation id="5533555070048896610">Prečrkovanje (namaste → नमस्ते)</translation> @@ -435,6 +438,7 @@ <translation id="6040143037577758943">Zapri</translation> <translation id="6054173164583630569">Francoska tipkovnica</translation> <translation id="6074825444536523002">Googlov obrazec</translation> +<translation id="6096979789310008754">Besedilo iskanja je izbrisano, prikaz vseh datotek in map.</translation> <translation id="6111770213269631447">Prečrkovanje (namaskar → নমস্কার)</translation> <translation id="6129953537138746214">Presledek</translation> <translation id="6133173853026656527">Premikanje datoteke <ph name="FILE_NAME" /> ...</translation> @@ -650,6 +654,7 @@ <translation id="8561206103590473338">Slon</translation> <translation id="8569764466147087991">Izberite datoteko, ki jo želite odpreti</translation> <translation id="8579285237314169903">Sinhroniziranje datotek (<ph name="NUMBER_OF_FILES" />) ...</translation> +<translation id="8600173386174225982">Seznam datotek je spremenjen na pogled sličic.</translation> <translation id="8669949407341943408">Premikanje ...</translation> <translation id="8671210955687109937">Komentiranje dovoljeno</translation> <translation id="8686213429977032554">Ta datoteka v storitvi Google Drive še ni v skupni rabi</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_sr.xtb b/ui/chromeos/translations/ui_chromeos_strings_sr.xtb index ad5711e..5460e5e 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_sr.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_sr.xtb
@@ -286,6 +286,7 @@ <translation id="4572815280350369984">Датотека <ph name="FILE_TYPE" /></translation> <translation id="457386861538956877">Још...</translation> <translation id="4582497162516204941">Инсталирај за Linux (бета)</translation> +<translation id="4594543368593301662">Приказују се резултати за: <ph name="SEARCH_TERM" />.</translation> <translation id="4631887759990505102">Извођач</translation> <translation id="4656293982926141856">Овај рачунар</translation> <translation id="4669606053856530811">Чланови из „<ph name="SOURCE_NAME" />“ ће изгубити приступ ако се ове ставке не деле са њима.</translation> @@ -383,12 +384,14 @@ <translation id="5412637665001827670">Језик тастатуре: бугарски</translation> <translation id="5418923334382419584">Мјанмарска тастатура</translation> <translation id="5428105026674456456">шпански</translation> +<translation id="5438282218546237410">Нема резултата за термин <ph name="SEARCH_TERM" />.</translation> <translation id="5464696796438641524">Језик тастатуре: пољски</translation> <translation id="5465122519792752163">Непалска тастатура (индијско писмо)</translation> <translation id="5469868506864199649">италијански</translation> <translation id="5494920125229734069">Избор свих ставки</translation> <translation id="5500122897333236901">исландски</translation> <translation id="5508696409934741614">Тачке</translation> +<translation id="5522908512596376669">Листа датотека се променила у приказ листе.</translation> <translation id="5524517123096967210">Није могуће прочитати датотеку.</translation> <translation id="5533102081734025921">Слика <ph name="IMAGE_TYPE" /></translation> <translation id="5533555070048896610">Транслитерација (namaste → नमस्ते)</translation> @@ -435,6 +438,7 @@ <translation id="6040143037577758943">Затвори</translation> <translation id="6054173164583630569">Језик тастатуре: француски</translation> <translation id="6074825444536523002">Google образац</translation> +<translation id="6096979789310008754">Текст претраге је обрисан, приказују се све датотеке и директоријуми.</translation> <translation id="6111770213269631447">Транслитерација (namaskar → নমস্কার)</translation> <translation id="6129953537138746214">Размак</translation> <translation id="6133173853026656527">Премештање датотеке <ph name="FILE_NAME" />...</translation> @@ -650,6 +654,7 @@ <translation id="8561206103590473338">Слон</translation> <translation id="8569764466147087991">Избор датотеке за отварање</translation> <translation id="8579285237314169903">Синхронизују се ставке (<ph name="NUMBER_OF_FILES" />)...</translation> +<translation id="8600173386174225982">Листа датотека се променила у приказ сличица.</translation> <translation id="8669949407341943408">Премештање...</translation> <translation id="8671210955687109937">Може да коментарише</translation> <translation id="8686213429977032554">Ова датотека са Диска се још увек не дели</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_sw.xtb b/ui/chromeos/translations/ui_chromeos_strings_sw.xtb index 9e42e3e..23939f92 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_sw.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_sw.xtb
@@ -286,6 +286,7 @@ <translation id="4572815280350369984">Faili ya <ph name="FILE_TYPE" /></translation> <translation id="457386861538956877">Zaidi...</translation> <translation id="4582497162516204941">Sakinisha ukitumia Linux (Beta)</translation> +<translation id="4594543368593301662">Inaonyesha matokeo ya <ph name="SEARCH_TERM" />.</translation> <translation id="4631887759990505102">Msanii</translation> <translation id="4656293982926141856">Kompyuta hii</translation> <translation id="4669606053856530811">Wanachama wa '<ph name="SOURCE_NAME" />' hawataweza kuifikia isipokuwa vipengee hivi viwe vinashirikiwa nao.</translation> @@ -383,12 +384,14 @@ <translation id="5412637665001827670">Kidobi ya Kibulgeria</translation> <translation id="5418923334382419584">Kibodi ya Kimyanma</translation> <translation id="5428105026674456456">Kihispania</translation> +<translation id="5438282218546237410">Hakuna matokeo ya <ph name="SEARCH_TERM" />.</translation> <translation id="5464696796438641524">Kibodi ya Kipoli</translation> <translation id="5465122519792752163">Kibodi ya Kinepali (InScript)</translation> <translation id="5469868506864199649">Kiitaliano</translation> <translation id="5494920125229734069">Chagua zote</translation> <translation id="5500122897333236901">Kiaislandi</translation> <translation id="5508696409934741614">Nukta</translation> +<translation id="5522908512596376669">Umebadilisha orodha ya faili kuwa mwonekano wa orodha.</translation> <translation id="5524517123096967210">Faili isingeweza kusomwa.</translation> <translation id="5533102081734025921">Picha ya <ph name="IMAGE_TYPE" /></translation> <translation id="5533555070048896610">Unukuzi wa mfumo wa kuandika (namaste → नमस्ते)</translation> @@ -435,6 +438,7 @@ <translation id="6040143037577758943">Funga</translation> <translation id="6054173164583630569">Kibodi ya Kifaransa</translation> <translation id="6074825444536523002">Fomu ya Google</translation> +<translation id="6096979789310008754">Imefuta hoja ya utafutaji, inaonyesha faili na folda zote.</translation> <translation id="6111770213269631447">Unukuzi wa mfumo wa kuandika (namaskar → নমস্কার)</translation> <translation id="6129953537138746214">Nafasi</translation> <translation id="6133173853026656527">Inasogeza <ph name="FILE_NAME" />...</translation> @@ -650,6 +654,7 @@ <translation id="8561206103590473338">Tembo</translation> <translation id="8569764466147087991">Chagua faili ya kufungua</translation> <translation id="8579285237314169903">Inasasisha vipengee <ph name="NUMBER_OF_FILES" />...</translation> +<translation id="8600173386174225982">Orodha ya faili imebadilishwa kuwa mwonekano wa kijipicha.</translation> <translation id="8669949407341943408">Inahamisha...</translation> <translation id="8671210955687109937">Anaweza kutoa maoni</translation> <translation id="8686213429977032554">Faili hii ya Hifadhi bado haijashirikiwa</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_ta.xtb b/ui/chromeos/translations/ui_chromeos_strings_ta.xtb index 117124e..59dc481 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_ta.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_ta.xtb
@@ -413,7 +413,7 @@ <translation id="5818003990515275822">கொரியன்</translation> <translation id="5819442873484330149">ஹாங்குல் 3 செட் (இறுதி)</translation> <translation id="5833610766403489739">இந்தக் கோப்பு வேறு எங்கோ சேமிக்கப்பட்டுவிட்டது. உங்கள் பதிவிறக்க இருப்பிட அமைப்பைச் சரிபார்த்து, மீண்டும் முயற்சிக்கவும்.</translation> -<translation id="5838051104334203064">இந்தச் சாதனத்தை Play ஸ்டோர் ஆப்ஸ் பயன்படுத்தாது</translation> +<translation id="5838051104334203064">இந்தச் சாதனத்தை Play ஸ்டோர் ஆப்ஸினால் பயன்படுத்த முடியாது</translation> <translation id="5838825566232597749">யுஎஸ் ஒர்க்மேன் இன்டர்நேஷனல்</translation> <translation id="5850516540536751549">இந்தக் கோப்பு வகை ஆதரிக்கப்படவில்லை. இந்த வகையான கோப்பைத் திறக்கக்கூடிய பயன்பாட்டைக் கண்டறிய <ph name="BEGIN_LINK" />Chrome இணைய அங்காடியைப்<ph name="END_LINK" /> பார்வையிடவும். <ph name="BEGIN_LINK_HELP" />மேலும் அறிக<ph name="END_LINK_HELP" /></translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_th.xtb b/ui/chromeos/translations/ui_chromeos_strings_th.xtb index f19a1f9..271553d 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_th.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_th.xtb
@@ -286,6 +286,7 @@ <translation id="4572815280350369984">ไฟล์ <ph name="FILE_TYPE" /></translation> <translation id="457386861538956877">เพิ่มเติม...</translation> <translation id="4582497162516204941">ติดตั้งด้วย Linux (เบต้า)</translation> +<translation id="4594543368593301662">กำลังแสดงผลการค้นหาสำหรับ <ph name="SEARCH_TERM" /></translation> <translation id="4631887759990505102">ศิลปิน</translation> <translation id="4656293982926141856">คอมพิวเตอร์เครื่องนี้</translation> <translation id="4669606053856530811">สมาชิกของ "<ph name="SOURCE_NAME" />" จะสูญเสียสิทธิ์เข้าถึง เว้นแต่มีการแชร์รายการเหล่านี้กับสมาชิกดังกล่าว</translation> @@ -383,12 +384,14 @@ <translation id="5412637665001827670">แป้นพิมพ์ภาษาบัลแกเรีย</translation> <translation id="5418923334382419584">แป้นพิมพ์ภาษาพม่า</translation> <translation id="5428105026674456456">สเปน</translation> +<translation id="5438282218546237410">ไม่มีผลการค้นหาสำหรับ <ph name="SEARCH_TERM" /></translation> <translation id="5464696796438641524">แป้นพิมพ์ภาษาโปแลนด์</translation> <translation id="5465122519792752163">แป้นพิมพ์ภาษาเนปาล (InScript)</translation> <translation id="5469868506864199649">อิตาลี</translation> <translation id="5494920125229734069">เลือกทั้งหมด</translation> <translation id="5500122897333236901">ไอซ์แลนดิก</translation> <translation id="5508696409934741614">จุด</translation> +<translation id="5522908512596376669">เปลี่ยนรายการไฟล์เป็นมุมมองรายการแล้ว</translation> <translation id="5524517123096967210">ไม่สามารถอ่านไฟล์</translation> <translation id="5533102081734025921">รูปภาพ <ph name="IMAGE_TYPE" /></translation> <translation id="5533555070048896610">การทับศัพท์ (namaste → नमस्ते)</translation> @@ -435,6 +438,7 @@ <translation id="6040143037577758943">ปิด</translation> <translation id="6054173164583630569">แป้นพิมพ์ภาษาฝรั่งเศส</translation> <translation id="6074825444536523002">Google ฟอร์ม</translation> +<translation id="6096979789310008754">ล้างข้อความค้นหาแล้ว กำลังแสดงไฟล์และโฟลเดอร์ทั้งหมด</translation> <translation id="6111770213269631447">การทับศัพท์ (namaskar → নমস্কার)</translation> <translation id="6129953537138746214">ช่องว่าง</translation> <translation id="6133173853026656527">กำลังย้าย <ph name="FILE_NAME" />...</translation> @@ -650,6 +654,7 @@ <translation id="8561206103590473338">ช้าง</translation> <translation id="8569764466147087991">เลือกไฟล์เพื่อเปิด</translation> <translation id="8579285237314169903">กำลังซิงค์ <ph name="NUMBER_OF_FILES" /> รายการ...</translation> +<translation id="8600173386174225982">เปลี่ยนรายการไฟล์เป็นมุมมองภาพขนาดย่อแล้ว</translation> <translation id="8669949407341943408">กำลังย้าย...</translation> <translation id="8671210955687109937">สามารถแสดงความคิดเห็นได้</translation> <translation id="8686213429977032554">ยังไม่มีการแชร์ไฟล์ไดรฟ์นี้</translation>
diff --git a/ui/display/manager/display_manager.cc b/ui/display/manager/display_manager.cc index b719974..b6b1403 100644 --- a/ui/display/manager/display_manager.cc +++ b/ui/display/manager/display_manager.cc
@@ -1047,7 +1047,7 @@ std::vector<size_t> updated_indices; UpdateNonPrimaryDisplayBoundsForLayout(&new_displays, &updated_indices); for (size_t updated_index : updated_indices) { - if (!base::ContainsValue(added_display_indices, updated_index)) { + if (!base::Contains(added_display_indices, updated_index)) { uint32_t metrics = DisplayObserver::DISPLAY_METRIC_BOUNDS | DisplayObserver::DISPLAY_METRIC_WORK_AREA; if (display_changes.find(updated_index) != display_changes.end())
diff --git a/ui/display/manager/touch_device_manager.cc b/ui/display/manager/touch_device_manager.cc index 713ecff..ca19e78 100644 --- a/ui/display/manager/touch_device_manager.cc +++ b/ui/display/manager/touch_device_manager.cc
@@ -132,7 +132,7 @@ // If we have no historical information for the touch device identified by // |identifier|, do an early return. - if (!base::ContainsKey(touch_associations, identifier)) + if (!base::Contains(touch_associations, identifier)) return display_info; const TouchDeviceManager::AssociationInfoMap& info_map = @@ -143,7 +143,7 @@ // We do not want to match anything to the internal display. if (Display::IsInternalDisplayId(display->id())) continue; - if (!base::ContainsKey(info_map, display->id())) + if (!base::Contains(info_map, display->id())) continue; const TouchDeviceManager::TouchAssociationInfo& info = info_map.at(display->id()); @@ -405,8 +405,8 @@ // If this device is not the one that has a collision or if this device is // the one that has collision but we have no past port mapping information // associated with it, then we skip. - if (!base::ContainsKey(collision_set, identifier) || - !base::ContainsKey(port_associations_, identifier)) { + if (!base::Contains(collision_set, identifier) || + !base::Contains(port_associations_, identifier)) { device_it++; continue; } @@ -599,7 +599,7 @@ const TouchDeviceIdentifier& identifier, int64_t display_id, const TouchCalibrationData& data) { - if (!base::ContainsKey(touch_associations_, identifier)) + if (!base::Contains(touch_associations_, identifier)) touch_associations_.emplace(identifier, AssociationInfoMap()); // Update the current touch association and associate the display identified @@ -631,7 +631,7 @@ void TouchDeviceManager::ClearTouchCalibrationData( const TouchDeviceIdentifier& identifier, int64_t display_id) { - if (base::ContainsKey(touch_associations_, identifier)) { + if (base::Contains(touch_associations_, identifier)) { ClearCalibrationDataInMap(touch_associations_.at(identifier), display_id); } } @@ -652,7 +652,7 @@ if (display_id == kInvalidDisplayId) { // If the touch device is currently not associated with any display and the // |display_id| was not provided, then this is an invalid query. - if (!base::ContainsKey(active_touch_associations_, identifier)) + if (!base::Contains(active_touch_associations_, identifier)) return TouchCalibrationData(); // If the display id is not provided, we return the calibration information @@ -661,7 +661,7 @@ display_id = active_touch_associations_.at(identifier); } - if (base::ContainsKey(touch_associations_, identifier)) { + if (base::Contains(touch_associations_, identifier)) { const AssociationInfoMap& info_map = touch_associations_.at(identifier); if (info_map.find(display_id) != info_map.end()) return info_map.at(display_id).calibration_data; @@ -670,7 +670,7 @@ // Check for legacy calibration data. TouchDeviceIdentifier fallback_identifier( TouchDeviceIdentifier::GetFallbackTouchDeviceIdentifier()); - if (base::ContainsKey(touch_associations_, fallback_identifier)) { + if (base::Contains(touch_associations_, fallback_identifier)) { const AssociationInfoMap& info_map = touch_associations_.at(fallback_identifier); if (info_map.find(display_id) != info_map.end()) @@ -684,13 +684,13 @@ bool TouchDeviceManager::DisplayHasTouchDevice( int64_t display_id, const TouchDeviceIdentifier& identifier) const { - return base::ContainsKey(active_touch_associations_, identifier) && + return base::Contains(active_touch_associations_, identifier) && active_touch_associations_.at(identifier) == display_id; } int64_t TouchDeviceManager::GetAssociatedDisplay( const TouchDeviceIdentifier& identifier) const { - if (base::ContainsKey(active_touch_associations_, identifier)) + if (base::Contains(active_touch_associations_, identifier)) return active_touch_associations_.at(identifier); return kInvalidDisplayId; }
diff --git a/ui/display/unified_desktop_utils.cc b/ui/display/unified_desktop_utils.cc index 6a0da75..5016514 100644 --- a/ui/display/unified_desktop_utils.cc +++ b/ui/display/unified_desktop_utils.cc
@@ -204,7 +204,7 @@ const DisplayLayout& layout, UnifiedDesktopLayoutMatrix* out_matrix) { // The primary display should be in the IDs list. - if (!base::ContainsValue(ids_list, layout.primary_id)) { + if (!base::Contains(ids_list, layout.primary_id)) { LOG(ERROR) << "The primary ID: " << layout.primary_id << " is not in the IDs list."; return false; @@ -259,13 +259,13 @@ LOG(ERROR) << "display_id must not be the same as parent_display_id"; return false; } - if (!base::ContainsValue(ids_list, placement.display_id)) { + if (!base::Contains(ids_list, placement.display_id)) { LOG(ERROR) << "display_id: " << placement.display_id << " is not in the id list: " << placement.ToString(); return false; } - if (!base::ContainsValue(ids_list, placement.parent_display_id)) { + if (!base::Contains(ids_list, placement.parent_display_id)) { LOG(ERROR) << "parent_display_id: " << placement.parent_display_id << " is not in the id list: " << placement.ToString(); return false;
diff --git a/ui/display/win/screen_win.cc b/ui/display/win/screen_win.cc index 15e4bbd1..0963947b 100644 --- a/ui/display/win/screen_win.cc +++ b/ui/display/win/screen_win.cc
@@ -845,7 +845,7 @@ // it so that if it's wildly out-of-band we won't send it to the backend. const int reported_scale = std::min( std::max(base::checked_cast<int>(scale_factor * 100), 0), 1000); - if (!base::ContainsValue(unique_scale_factors, reported_scale)) { + if (!base::Contains(unique_scale_factors, reported_scale)) { unique_scale_factors.push_back(reported_scale); base::UmaHistogramSparse("UI.DeviceScale", reported_scale); }
diff --git a/ui/events/devices/mojo/device_struct_traits_unittest.cc b/ui/events/devices/mojo/device_struct_traits_unittest.cc index 23f8f9f..b6d6096 100644 --- a/ui/events/devices/mojo/device_struct_traits_unittest.cc +++ b/ui/events/devices/mojo/device_struct_traits_unittest.cc
@@ -5,7 +5,7 @@ #include <utility> #include "base/files/file_path.h" -#include "base/message_loop/message_loop.h" +#include "base/test/scoped_task_environment.h" #include "mojo/public/cpp/bindings/binding_set.h" #include "testing/gtest/include/gtest/gtest.h" #include "ui/events/devices/input_device.h" @@ -41,7 +41,9 @@ std::move(callback).Run(in); } - base::MessageLoop loop_; // A MessageLoop is needed for mojo IPC to work. + base::test::ScopedTaskEnvironment + scoped_task_environment_; // A MessageLoop is needed for mojo IPC to + // work. mojo::BindingSet<mojom::DeviceStructTraitsTest> traits_test_bindings_; DISALLOW_COPY_AND_ASSIGN(DeviceStructTraitsTest);
diff --git a/ui/events/gestures/gesture_recognizer_impl.cc b/ui/events/gestures/gesture_recognizer_impl.cc index 26d0fb1..60260b17 100644 --- a/ui/events/gestures/gesture_recognizer_impl.cc +++ b/ui/events/gestures/gesture_recognizer_impl.cc
@@ -29,7 +29,7 @@ GestureConsumer* current_consumer, GestureConsumer* new_consumer, std::map<GestureConsumer*, std::unique_ptr<GestureProviderAura>>* map) { - if (!map->empty() && base::ContainsKey(*map, current_consumer)) { + if (!map->empty() && base::Contains(*map, current_consumer)) { (*map)[new_consumer] = std::move((*map)[current_consumer]); (*map)[new_consumer]->set_gesture_consumer(new_consumer); map->erase(current_consumer); @@ -112,7 +112,7 @@ void GestureRecognizerImpl::CancelActiveTouchesOn( const std::vector<GestureConsumer*>& consumers) { for (auto* consumer : consumers) { - if (base::ContainsKey(consumer_gesture_provider_, consumer)) + if (base::Contains(consumer_gesture_provider_, consumer)) CancelActiveTouchesImpl(consumer); } } @@ -174,7 +174,7 @@ // gesture detection for some reasons but that might not be applied to the new // consumer. See also: // https://docs.google.com/document/d/1AKeK8IuF-j2TJ-2sPsewORXdjnr6oAzy5nnR1zwrsfc/edit# - if (base::ContainsKey(consumer_gesture_provider_, new_consumer)) + if (base::Contains(consumer_gesture_provider_, new_consumer)) GetGestureProviderForConsumer(new_consumer)->ResetGestureHandlingState(); for (int touch_id : touchids_targeted_at_current) @@ -186,7 +186,7 @@ gfx::PointF* point) { if (consumer_gesture_provider_.empty()) return false; - if (!base::ContainsKey(consumer_gesture_provider_, consumer)) + if (!base::Contains(consumer_gesture_provider_, consumer)) return false; const MotionEvent& pointer_state = consumer_gesture_provider_[consumer]->pointer_state(); @@ -203,7 +203,7 @@ if (consumer_gesture_provider_.empty()) return cancelling_touches; - if (!base::ContainsKey(consumer_gesture_provider_, consumer)) + if (!base::Contains(consumer_gesture_provider_, consumer)) return cancelling_touches; const MotionEventAura& pointer_state = consumer_gesture_provider_[consumer]->pointer_state(); @@ -235,7 +235,7 @@ GestureProviderAura* gesture_provider = nullptr; if (!consumer_gesture_provider_.empty() && - base::ContainsKey(consumer_gesture_provider_, consumer)) { + base::Contains(consumer_gesture_provider_, consumer)) { gesture_provider = consumer_gesture_provider_.at(consumer).get(); }
diff --git a/ui/events/keyboard_hook_base.cc b/ui/events/keyboard_hook_base.cc index 327c2d4..c212acc 100644 --- a/ui/events/keyboard_hook_base.cc +++ b/ui/events/keyboard_hook_base.cc
@@ -31,7 +31,7 @@ if (dom_code == DomCode::NONE) return false; - return !dom_codes_ || base::ContainsKey(dom_codes_.value(), dom_code); + return !dom_codes_ || base::Contains(dom_codes_.value(), dom_code); } void KeyboardHookBase::ForwardCapturedKeyEvent(KeyEvent* event) {
diff --git a/ui/gfx/font_unittest.cc b/ui/gfx/font_unittest.cc index 4c75a35..2e8e1db 100644 --- a/ui/gfx/font_unittest.cc +++ b/ui/gfx/font_unittest.cc
@@ -19,7 +19,24 @@ namespace gfx { namespace { -using FontTest = testing::Test; +class FontTest : public testing::Test { + public: + FontTest() = default; + + protected: + void SetUp() override { +#if defined(OS_WIN) + // System fonts is keeping a cache of loaded system fonts. These fonts are + // scaled based on global callbacks configured on startup. The tests in this + // file are testing these callbacks and need to be sure we cleared the + // global state to avoid flaky tests. + win::ResetSystemFontsForTesting(); +#endif + } + + private: + DISALLOW_COPY_AND_ASSIGN(FontTest); +}; TEST_F(FontTest, DefaultFont) { Font cf;
diff --git a/ui/gfx/render_text_harfbuzz.cc b/ui/gfx/render_text_harfbuzz.cc index 720668e..9d7b23d 100644 --- a/ui/gfx/render_text_harfbuzz.cc +++ b/ui/gfx/render_text_harfbuzz.cc
@@ -79,7 +79,7 @@ // 0x300c and 0x300d are「foo」 style brackets. constexpr UChar32 kBrackets[] = {'(', ')', '{', '}', '<', '>', L'\u300c', L'\u300d'}; - return base::ContainsValue(kBrackets, character); + return base::Contains(kBrackets, character); } // If the given scripts match, returns the one that isn't USCRIPT_INHERITED,
diff --git a/ui/gfx/system_fonts_win.cc b/ui/gfx/system_fonts_win.cc index 849654c..c084489 100644 --- a/ui/gfx/system_fonts_win.cc +++ b/ui/gfx/system_fonts_win.cc
@@ -21,18 +21,28 @@ class SystemFonts { public: - const gfx::Font& GetFont(SystemFont system_font) const { + const gfx::Font& GetFont(SystemFont system_font) { + if (!IsInitialized()) + Initialize(); + auto it = system_fonts_.find(system_font); DCHECK(it != system_fonts_.end()) << "System font #" << static_cast<int>(system_font) << " not found!"; return it->second; } - static const SystemFonts* Instance() { + static SystemFonts* Instance() { static base::NoDestructor<SystemFonts> instance; return instance.get(); } + void ResetForTesting() { + SystemFonts::is_initialized_ = false; + SystemFonts::adjust_font_callback_ = nullptr; + SystemFonts::get_minimum_font_size_callback_ = nullptr; + system_fonts_.clear(); + } + static int AdjustFontSize(int lf_height, int size_delta) { // Extract out the sign of |lf_height| - we'll add it back later. const int lf_sign = lf_height < 0 ? -1 : 1; @@ -109,8 +119,10 @@ private: friend base::NoDestructor<SystemFonts>; - SystemFonts() { - TRACE_EVENT0("fonts", "gfx::SystemFonts::SystemFonts"); + SystemFonts() {} + + void Initialize() { + TRACE_EVENT0("fonts", "gfx::SystemFonts::Initialize"); NONCLIENTMETRICS_XP metrics; base::win::GetNonClientMetrics(&metrics); @@ -255,5 +267,9 @@ SystemFonts::AdjustLOGFONT(font_adjustment, logfont); } +GFX_EXPORT void ResetSystemFontsForTesting() { + SystemFonts::Instance()->ResetForTesting(); +} + } // namespace win } // namespace gfx
diff --git a/ui/gfx/system_fonts_win.h b/ui/gfx/system_fonts_win.h index fe651c0..b10298d 100644 --- a/ui/gfx/system_fonts_win.h +++ b/ui/gfx/system_fonts_win.h
@@ -53,6 +53,12 @@ // Adjusts a LOGFONT structure for optional size scale and face override. GFX_EXPORT void AdjustLOGFONTForTesting(const FontAdjustment& font_adjustment, LOGFONT* logfont); + +// Clear the system fonts cache. SystemFonts is keeping a global state that +// must be reset in unittests when using |GetMinimumFontSizeCallback| or +// |SetAdjustFontCallback|. +GFX_EXPORT void ResetSystemFontsForTesting(); + } // namespace win } // namespace gfx
diff --git a/ui/gfx/system_fonts_win_unittest.cc b/ui/gfx/system_fonts_win_unittest.cc index 8dbf1ddc..28d024e 100644 --- a/ui/gfx/system_fonts_win_unittest.cc +++ b/ui/gfx/system_fonts_win_unittest.cc
@@ -6,6 +6,7 @@ #include <windows.h> +#include "build/build_config.h" #include "testing/gtest/include/gtest/gtest.h" namespace gfx { @@ -13,6 +14,25 @@ namespace { +class SystemFontsWinTest : public testing::Test { + public: + SystemFontsWinTest() = default; + + protected: + void SetUp() override { +#if defined(OS_WIN) + // System fonts is keeping a cache of loaded system fonts. These fonts are + // scaled based on global callbacks configured on startup. The tests in this + // file are testing these callbacks and need to be sure we cleared the + // global state to avoid flaky tests. + win::ResetSystemFontsForTesting(); +#endif + } + + private: + DISALLOW_COPY_AND_ASSIGN(SystemFontsWinTest); +}; + LOGFONT CreateLOGFONT(const base::char16* name, LONG height) { LOGFONT logfont = {}; logfont.lfHeight = height; @@ -26,8 +46,7 @@ } // namespace -TEST(SystemFontsWinTest, AdjustFontSize) { - gfx::win::SetGetMinimumFontSizeCallback(nullptr); +TEST_F(SystemFontsWinTest, AdjustFontSize) { EXPECT_EQ(10, gfx::win::AdjustFontSize(10, 0)); EXPECT_EQ(-10, gfx::win::AdjustFontSize(-10, 0)); EXPECT_EQ(8, gfx::win::AdjustFontSize(10, -2)); @@ -40,7 +59,7 @@ EXPECT_EQ(0, gfx::win::AdjustFontSize(-10, -12)); } -TEST(SystemFontsWinTest, AdjustFontSize_MinimumSizeSpecified) { +TEST_F(SystemFontsWinTest, AdjustFontSize_MinimumSizeSpecified) { gfx::win::SetGetMinimumFontSizeCallback([] { return 1; }); EXPECT_EQ(10, gfx::win::AdjustFontSize(10, 0)); EXPECT_EQ(-10, gfx::win::AdjustFontSize(-10, 0)); @@ -54,7 +73,7 @@ EXPECT_EQ(-1, gfx::win::AdjustFontSize(-10, -12)); } -TEST(SystemFontsWinTest, AdjustLOGFONT_NoAdjustment) { +TEST_F(SystemFontsWinTest, AdjustLOGFONT_NoAdjustment) { LOGFONT logfont = CreateLOGFONT(kSegoeUI, -12); FontAdjustment adjustment; AdjustLOGFONTForTesting(adjustment, &logfont); @@ -62,7 +81,7 @@ EXPECT_STREQ(kSegoeUI, logfont.lfFaceName); } -TEST(SystemFontsWinTest, AdjustLOGFONT_ChangeFace) { +TEST_F(SystemFontsWinTest, AdjustLOGFONT_ChangeFace) { LOGFONT logfont = CreateLOGFONT(kSegoeUI, -12); FontAdjustment adjustment{kArial, 1.0}; AdjustLOGFONTForTesting(adjustment, &logfont); @@ -70,7 +89,7 @@ EXPECT_STREQ(kArial, logfont.lfFaceName); } -TEST(SystemFontsWinTest, AdjustLOGFONT_ScaleDown) { +TEST_F(SystemFontsWinTest, AdjustLOGFONT_ScaleDown) { LOGFONT logfont = CreateLOGFONT(kSegoeUI, -12); FontAdjustment adjustment{L"", 0.5}; AdjustLOGFONTForTesting(adjustment, &logfont); @@ -84,7 +103,7 @@ EXPECT_STREQ(kSegoeUI, logfont.lfFaceName); } -TEST(SystemFontsWinTest, AdjustLOGFONT_ScaleDownWithRounding) { +TEST_F(SystemFontsWinTest, AdjustLOGFONT_ScaleDownWithRounding) { LOGFONT logfont = CreateLOGFONT(kSegoeUI, -10); FontAdjustment adjustment{L"", 0.85}; AdjustLOGFONTForTesting(adjustment, &logfont); @@ -98,7 +117,7 @@ EXPECT_STREQ(kSegoeUI, logfont.lfFaceName); } -TEST(SystemFontsWinTest, AdjustLOGFONT_ScaleUpWithFaceChange) { +TEST_F(SystemFontsWinTest, AdjustLOGFONT_ScaleUpWithFaceChange) { LOGFONT logfont = CreateLOGFONT(kSegoeUI, -12); FontAdjustment adjustment{kArial, 1.5}; AdjustLOGFONTForTesting(adjustment, &logfont); @@ -112,7 +131,7 @@ EXPECT_STREQ(kArial, logfont.lfFaceName); } -TEST(SystemFontsWinTest, AdjustLOGFONT_ScaleUpWithRounding) { +TEST_F(SystemFontsWinTest, AdjustLOGFONT_ScaleUpWithRounding) { LOGFONT logfont = CreateLOGFONT(kSegoeUI, -10); FontAdjustment adjustment{L"", 1.111}; AdjustLOGFONTForTesting(adjustment, &logfont);
diff --git a/ui/gl/gl_gl_api_implementation.cc b/ui/gl/gl_gl_api_implementation.cc index 68296bb..ebcdb9b 100644 --- a/ui/gl/gl_gl_api_implementation.cc +++ b/ui/gl/gl_gl_api_implementation.cc
@@ -513,7 +513,7 @@ const char* gl_extension = reinterpret_cast<const char*>( GLApiBase::glGetStringiFn(GL_EXTENSIONS, i)); DCHECK(gl_extension); - if (!base::ContainsValue(disabled_exts_, gl_extension)) + if (!base::Contains(disabled_exts_, gl_extension)) filtered_exts_.push_back(gl_extension); } filtered_exts_str_ = base::JoinString(filtered_exts_, " ");
diff --git a/ui/gl/gl_image_native_pixmap_unittest.cc b/ui/gl/gl_image_native_pixmap_unittest.cc index c4781df7..83fe0f3 100644 --- a/ui/gl/gl_image_native_pixmap_unittest.cc +++ b/ui/gl/gl_image_native_pixmap_unittest.cc
@@ -7,6 +7,21 @@ #include "ui/gl/gl_bindings.h" #include "ui/gl/test/gl_image_test_template.h" +// TODO(crbug.com/969798): Fix memory leaks in tests and re-enable on LSAN. +#ifdef LEAK_SANITIZER +#define MAYBE_GLTexture2DToDmabuf DISABLED_GLTexture2DToDmabuf +#else +#define MAYBE_GLTexture2DToDmabuf GLTexture2DToDmabuf +#endif + +// TYPED_TEST_P() and REGISTER_TYPED_TEST_SUITE_P() don't do macro expansion on +// their parameters, making the MAYBE_ technique above not work -- these macros +// are a workaround. +#define TYPED_TEST_P_WITH_EXPANSION(SuiteName, TestName) \ + TYPED_TEST_P(SuiteName, TestName) +#define REGISTER_TYPED_TEST_SUITE_P_WITH_EXPANSION(SuiteName, ...) \ + REGISTER_TYPED_TEST_SUITE_P(SuiteName, __VA_ARGS__) + namespace gl { namespace { @@ -71,7 +86,8 @@ TYPED_TEST_SUITE_P(GLImageNativePixmapToDmabufTest); -TYPED_TEST_P(GLImageNativePixmapToDmabufTest, GLTexture2DToDmabuf) { +TYPED_TEST_P_WITH_EXPANSION(GLImageNativePixmapToDmabufTest, + MAYBE_GLTexture2DToDmabuf) { if (this->delegate_.SkipTest()) return; @@ -94,8 +110,8 @@ } // This test verifies that GLImageNativePixmap can be exported as dmabuf fds. -REGISTER_TYPED_TEST_SUITE_P(GLImageNativePixmapToDmabufTest, - GLTexture2DToDmabuf); +REGISTER_TYPED_TEST_SUITE_P_WITH_EXPANSION(GLImageNativePixmapToDmabufTest, + MAYBE_GLTexture2DToDmabuf); using GLImageTestTypes = testing::Types< GLImageNativePixmapTestDelegate<gfx::BufferFormat::RGBX_8888>,
diff --git a/ui/gl/gl_implementation.cc b/ui/gl/gl_implementation.cc index d7634538..68d8a5d6 100644 --- a/ui/gl/gl_implementation.cc +++ b/ui/gl/gl_implementation.cc
@@ -206,7 +206,7 @@ extensions, " ", base::TRIM_WHITESPACE, base::SPLIT_WANT_ALL); auto is_disabled = [&disabled_extensions](const base::StringPiece& ext) { - return base::ContainsValue(disabled_extensions, ext); + return base::Contains(disabled_extensions, ext); }; base::EraseIf(extension_vec, is_disabled);
diff --git a/ui/gl/gl_surface_egl.cc b/ui/gl/gl_surface_egl.cc index bb775f34..4ed501ef 100644 --- a/ui/gl/gl_surface_egl.cc +++ b/ui/gl/gl_surface_egl.cc
@@ -500,7 +500,7 @@ void AddInitDisplay(std::vector<DisplayType>* init_displays, DisplayType display_type) { // Make sure to not add the same display type twice. - if (!base::ContainsValue(*init_displays, display_type)) + if (!base::Contains(*init_displays, display_type)) init_displays->push_back(display_type); }
diff --git a/ui/gl/gl_surface_egl_unittest.cc b/ui/gl/gl_surface_egl_unittest.cc index 1349516..58e3d42 100644 --- a/ui/gl/gl_surface_egl_unittest.cc +++ b/ui/gl/gl_surface_egl_unittest.cc
@@ -16,6 +16,12 @@ #include "ui/platform_window/platform_window_delegate.h" #include "ui/platform_window/win/win_window.h" #endif +// TODO(crbug.com/969798): Fix memory leaks in tests and re-enable on LSAN. +#ifdef LEAK_SANITIZER +#define MAYBE_SurfaceFormatTest DISABLED_SurfaceFormatTest +#else +#define MAYBE_SurfaceFormatTest SurfaceFormatTest +#endif namespace gl { @@ -33,7 +39,7 @@ #if !defined(MEMORY_SANITIZER) // Fails under MSAN: crbug.com/886995 -TEST_F(GLSurfaceEGLTest, SurfaceFormatTest) { +TEST_F(GLSurfaceEGLTest, MAYBE_SurfaceFormatTest) { GLSurfaceFormat surface_format = GLSurfaceFormat(); surface_format.SetDepthBits(24); surface_format.SetStencilBits(8);
diff --git a/ui/gl/init/gl_factory.cc b/ui/gl/init/gl_factory.cc index 3de1fd2..9d71f34 100644 --- a/ui/gl/init/gl_factory.cc +++ b/ui/gl/init/gl_factory.cc
@@ -66,7 +66,7 @@ impl = kGLImplementationEGLGLES2; } else { impl = GetNamedGLImplementation(requested_implementation_name); - if (!base::ContainsValue(allowed_impls, impl)) { + if (!base::Contains(allowed_impls, impl)) { LOG(ERROR) << "Requested GL implementation is not available."; return false; }
diff --git a/ui/gl/swap_chain_presenter.cc b/ui/gl/swap_chain_presenter.cc index 187916b..4967369 100644 --- a/ui/gl/swap_chain_presenter.cc +++ b/ui/gl/swap_chain_presenter.cc
@@ -9,6 +9,7 @@ #include "base/feature_list.h" #include "base/metrics/histogram_functions.h" #include "base/metrics/histogram_macros.h" +#include "base/synchronization/waitable_event.h" #include "base/trace_event/trace_event.h" #include "ui/gfx/color_space_win.h" #include "ui/gfx/geometry/rect_conversions.h"
diff --git a/ui/gl/test/egl_initialization_displays_unittest.cc b/ui/gl/test/egl_initialization_displays_unittest.cc index 17ef83c..847d583 100644 --- a/ui/gl/test/egl_initialization_displays_unittest.cc +++ b/ui/gl/test/egl_initialization_displays_unittest.cc
@@ -18,7 +18,7 @@ // D3D11. command_line->AppendSwitch(switches::kDisableD3D11); GetEGLInitDisplays(true, true, true, true, command_line.get(), &displays); - EXPECT_FALSE(base::ContainsValue(displays, gl::ANGLE_D3D11)); + EXPECT_FALSE(base::Contains(displays, gl::ANGLE_D3D11)); // Specifically requesting D3D11 should always return it if the extension is // available @@ -26,14 +26,14 @@ gl::kANGLEImplementationD3D11Name); displays.clear(); GetEGLInitDisplays(true, true, true, true, command_line.get(), &displays); - EXPECT_TRUE(base::ContainsValue(displays, gl::ANGLE_D3D11)); + EXPECT_TRUE(base::Contains(displays, gl::ANGLE_D3D11)); EXPECT_EQ(displays.size(), 1u); // Specifically requesting D3D11 should not return D3D11 if the extension is // not available displays.clear(); GetEGLInitDisplays(false, true, true, true, command_line.get(), &displays); - EXPECT_FALSE(base::ContainsValue(displays, gl::ANGLE_D3D11)); + EXPECT_FALSE(base::Contains(displays, gl::ANGLE_D3D11)); } TEST(EGLInitializationDisplaysTest, SwiftShader) { @@ -47,7 +47,7 @@ gl::kGLImplementationSwiftShaderForWebGLName); displays.clear(); GetEGLInitDisplays(true, true, true, true, command_line.get(), &displays); - EXPECT_TRUE(base::ContainsValue(displays, gl::SWIFT_SHADER)); + EXPECT_TRUE(base::Contains(displays, gl::SWIFT_SHADER)); EXPECT_EQ(displays.size(), 1u); // Even if there are other flags, swiftshader should take prescedence @@ -55,7 +55,7 @@ gl::kANGLEImplementationD3D11Name); displays.clear(); GetEGLInitDisplays(true, true, true, true, command_line.get(), &displays); - EXPECT_TRUE(base::ContainsValue(displays, gl::SWIFT_SHADER)); + EXPECT_TRUE(base::Contains(displays, gl::SWIFT_SHADER)); EXPECT_EQ(displays.size(), 1u); } @@ -92,7 +92,7 @@ gl::kANGLEImplementationOpenGLName); displays.clear(); GetEGLInitDisplays(true, true, true, true, command_line.get(), &displays); - EXPECT_TRUE(base::ContainsValue(displays, gl::ANGLE_OPENGL)); + EXPECT_TRUE(base::Contains(displays, gl::ANGLE_OPENGL)); EXPECT_EQ(displays.size(), 1u); // OpenGLES @@ -100,7 +100,7 @@ gl::kANGLEImplementationOpenGLESName); displays.clear(); GetEGLInitDisplays(true, true, true, true, command_line.get(), &displays); - EXPECT_TRUE(base::ContainsValue(displays, gl::ANGLE_OPENGLES)); + EXPECT_TRUE(base::Contains(displays, gl::ANGLE_OPENGLES)); EXPECT_EQ(displays.size(), 1u); // Null @@ -108,7 +108,7 @@ gl::kANGLEImplementationNullName); displays.clear(); GetEGLInitDisplays(true, true, true, true, command_line.get(), &displays); - EXPECT_TRUE(base::ContainsValue(displays, gl::ANGLE_NULL)); + EXPECT_TRUE(base::Contains(displays, gl::ANGLE_NULL)); EXPECT_EQ(displays.size(), 1u); // Vulkan @@ -116,7 +116,7 @@ gl::kANGLEImplementationVulkanName); displays.clear(); GetEGLInitDisplays(true, true, true, true, command_line.get(), &displays); - EXPECT_TRUE(base::ContainsValue(displays, gl::ANGLE_VULKAN)); + EXPECT_TRUE(base::Contains(displays, gl::ANGLE_VULKAN)); EXPECT_EQ(displays.size(), 1u); } @@ -127,7 +127,7 @@ // With no angle platform extensions, only DEFAULT should be available std::vector<gl::DisplayType> displays; GetEGLInitDisplays(false, false, false, false, command_line.get(), &displays); - EXPECT_TRUE(base::ContainsValue(displays, gl::DEFAULT)); + EXPECT_TRUE(base::Contains(displays, gl::DEFAULT)); EXPECT_EQ(displays.size(), 1u); }
diff --git a/ui/gl/test/gl_image_test_support.cc b/ui/gl/test/gl_image_test_support.cc index 257fde4..7a838cae 100644 --- a/ui/gl/test/gl_image_test_support.cc +++ b/ui/gl/test/gl_image_test_support.cc
@@ -34,7 +34,7 @@ DCHECK(!allowed_impls.empty()); GLImplementation impl = prefered_impl ? *prefered_impl : allowed_impls[0]; - DCHECK(base::ContainsValue(allowed_impls, impl)); + DCHECK(base::Contains(allowed_impls, impl)); GLSurfaceTestSupport::InitializeOneOffImplementation(impl, true); #if defined(USE_OZONE)
diff --git a/ui/gl/test/gl_image_test_template.h b/ui/gl/test/gl_image_test_template.h index a6070e3b..874187d 100644 --- a/ui/gl/test/gl_image_test_template.h +++ b/ui/gl/test/gl_image_test_template.h
@@ -33,6 +33,21 @@ #include "base/mac/mac_util.h" #endif +// TODO(crbug.com/969798): Fix memory leaks in tests and re-enable on LSAN. +#ifdef LEAK_SANITIZER +#define MAYBE_Create DISABLED_Create +#else +#define MAYBE_Create Create +#endif + +// TYPED_TEST_P() and REGISTER_TYPED_TEST_SUITE_P() don't do macro expansion on +// their parameters, making the MAYBE_ technique above not work -- these macros +// are a workaround. +#define TYPED_TEST_P_WITH_EXPANSION(SuiteName, TestName) \ + TYPED_TEST_P(SuiteName, TestName) +#define REGISTER_TYPED_TEST_SUITE_P_WITH_EXPANSION(SuiteName, ...) \ + REGISTER_TYPED_TEST_SUITE_P(SuiteName, __VA_ARGS__) + namespace gl { namespace internal { @@ -75,7 +90,7 @@ TYPED_TEST_SUITE_P(GLImageTest); -TYPED_TEST_P(GLImageTest, Create) { +TYPED_TEST_P_WITH_EXPANSION(GLImageTest, MAYBE_Create) { if (this->delegate_.SkipTest()) return; @@ -104,7 +119,7 @@ // The GLImageTest test case verifies the behaviour that is expected from a // GLImage in order to be conformant. -REGISTER_TYPED_TEST_SUITE_P(GLImageTest, Create); +REGISTER_TYPED_TEST_SUITE_P_WITH_EXPANSION(GLImageTest, MAYBE_Create); template <typename GLImageTestDelegate> class GLImageOddSizeTest : public GLImageTest<GLImageTestDelegate> {}; @@ -112,7 +127,7 @@ // This test verifies that odd-sized GLImages can be created and destroyed. TYPED_TEST_SUITE_P(GLImageOddSizeTest); -TYPED_TEST_P(GLImageOddSizeTest, Create) { +TYPED_TEST_P_WITH_EXPANSION(GLImageOddSizeTest, MAYBE_Create) { if (this->delegate_.SkipTest()) return; @@ -131,7 +146,7 @@ // The GLImageTest test case verifies the behaviour that is expected from a // GLImage in order to be conformant. -REGISTER_TYPED_TEST_SUITE_P(GLImageOddSizeTest, Create); +REGISTER_TYPED_TEST_SUITE_P_WITH_EXPANSION(GLImageOddSizeTest, MAYBE_Create); template <typename GLImageTestDelegate> class GLImageZeroInitializeTest : public GLImageTest<GLImageTestDelegate> {}; @@ -311,4 +326,9 @@ } // namespace gl +// Avoid polluting source files that include this header. +#undef MAYBE_Create +#undef TYPED_TEST_P_WITH_EXPANSION +#undef REGISTER_TYPED_TEST_SUITE_P_WITH_EXPANSION + #endif // UI_GL_TEST_GL_IMAGE_TEST_TEMPLATE_H_
diff --git a/ui/login/display_manager.js b/ui/login/display_manager.js index f766edf..7ab39566 100644 --- a/ui/login/display_manager.js +++ b/ui/login/display_manager.js
@@ -398,7 +398,6 @@ currentStepId == SCREEN_ACCOUNT_PICKER) { chrome.send('toggleEnrollmentScreen'); } else if (attributes.postponeEnrollmentAllowed || - currentStepId == SCREEN_OOBE_WELCOME || currentStepId == SCREEN_OOBE_NETWORK || currentStepId == SCREEN_OOBE_EULA) { // In this case update check will be skipped and OOBE will
diff --git a/ui/message_center/message_center_impl.cc b/ui/message_center/message_center_impl.cc index f35cc787..ae9c596 100644 --- a/ui/message_center/message_center_impl.cc +++ b/ui/message_center/message_center_impl.cc
@@ -55,7 +55,7 @@ void MessageCenterImpl::AddNotificationBlocker(NotificationBlocker* blocker) { DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); - if (base::ContainsValue(blockers_, blocker)) + if (base::Contains(blockers_, blocker)) return; blocker->AddObserver(this);
diff --git a/ui/message_center/popup_timers_controller.cc b/ui/message_center/popup_timers_controller.cc index 8fa5993..88ab8ed 100644 --- a/ui/message_center/popup_timers_controller.cc +++ b/ui/message_center/popup_timers_controller.cc
@@ -76,7 +76,7 @@ } void PopupTimersController::TimerFinished(const std::string& id) { - if (!base::ContainsKey(popup_timers_, id)) + if (!base::Contains(popup_timers_, id)) return; CancelTimer(id);
diff --git a/ui/message_center/public/mojo/struct_traits_unittest.cc b/ui/message_center/public/mojo/struct_traits_unittest.cc index 138444f..a47cd4d 100644 --- a/ui/message_center/public/mojo/struct_traits_unittest.cc +++ b/ui/message_center/public/mojo/struct_traits_unittest.cc
@@ -4,8 +4,8 @@ #include <utility> -#include "base/message_loop/message_loop.h" #include "base/strings/utf_string_conversions.h" +#include "base/test/scoped_task_environment.h" #include "mojo/public/cpp/bindings/binding_set.h" #include "testing/gmock/include/gmock/gmock-matchers.h" #include "testing/gtest/include/gtest/gtest.h" @@ -65,7 +65,7 @@ std::move(callback).Run(n); } - base::MessageLoop loop_; + base::test::ScopedTaskEnvironment scoped_task_environment_; mojo::BindingSet<TraitsTestService> traits_test_bindings_; DISALLOW_COPY_AND_ASSIGN(StructTraitsTest);
diff --git a/ui/ozone/platform/drm/gpu/gbm_surface_factory.cc b/ui/ozone/platform/drm/gpu/gbm_surface_factory.cc index 25fa807..b40c911 100644 --- a/ui/ozone/platform/drm/gpu/gbm_surface_factory.cc +++ b/ui/ozone/platform/drm/gpu/gbm_surface_factory.cc
@@ -123,7 +123,7 @@ for (int i = 0; i <= static_cast<int>(gfx::BufferFormat::LAST); ++i) { const gfx::BufferFormat buffer_format = static_cast<gfx::BufferFormat>(i); - if (base::ContainsValue(supported_buffer_formats, buffer_format)) + if (base::Contains(supported_buffer_formats, buffer_format)) continue; if (gbm_device_is_format_supported( device.get(), GetFourCCFormatFromBufferFormat(buffer_format),
diff --git a/ui/ozone/platform/drm/gpu/hardware_display_plane_manager_atomic.cc b/ui/ozone/platform/drm/gpu/hardware_display_plane_manager_atomic.cc index ae429e6..869c441 100644 --- a/ui/ozone/platform/drm/gpu/hardware_display_plane_manager_atomic.cc +++ b/ui/ozone/platform/drm/gpu/hardware_display_plane_manager_atomic.cc
@@ -66,7 +66,7 @@ std::unique_ptr<gfx::GpuFence>* out_fence) { bool test_only = !page_flip_request; for (HardwareDisplayPlane* plane : plane_list->old_plane_list) { - if (!base::ContainsValue(plane_list->plane_list, plane)) { + if (!base::Contains(plane_list->plane_list, plane)) { // This plane is being released, so we need to zero it. plane->set_in_use(false); HardwareDisplayPlaneAtomic* atomic_plane =
diff --git a/ui/ozone/platform/drm/gpu/mock_drm_device.cc b/ui/ozone/platform/drm/gpu/mock_drm_device.cc index 38cc4f3..8a457e7 100644 --- a/ui/ozone/platform/drm/gpu/mock_drm_device.cc +++ b/ui/ozone/platform/drm/gpu/mock_drm_device.cc
@@ -493,8 +493,8 @@ std::vector<std::string> blob_properties = {"CTM", "DEGAMMA_LUT", "GAMMA_LUT", "PLANE_CTM"}; - if (base::ContainsValue(blob_properties, it->second)) - return base::ContainsKey(allocated_property_blobs_, value); + if (base::Contains(blob_properties, it->second)) + return base::Contains(allocated_property_blobs_, value); return true; }
diff --git a/ui/ozone/platform/drm/gpu/proxy_helpers_unittest.cc b/ui/ozone/platform/drm/gpu/proxy_helpers_unittest.cc index b96b390..d8b077e 100644 --- a/ui/ozone/platform/drm/gpu/proxy_helpers_unittest.cc +++ b/ui/ozone/platform/drm/gpu/proxy_helpers_unittest.cc
@@ -8,8 +8,8 @@ #include <utility> #include "base/bind.h" -#include "base/message_loop/message_loop.h" #include "base/run_loop.h" +#include "base/test/scoped_task_environment.h" #include "base/threading/thread.h" #include "base/threading/thread_checker_impl.h" #include "testing/gtest/include/gtest/gtest.h" @@ -32,7 +32,7 @@ void QuitFunction(int a) { EXPECT_TRUE(drm_checker_.CalledOnValidThread()); - message_loop_.task_runner()->PostTask( + scoped_task_environment_.GetMainThreadTaskRunner()->PostTask( FROM_HERE, base::BindOnce(&ProxyHelpersTest::QuitFunctionCallback, base::Unretained(this), 8)); } @@ -42,7 +42,8 @@ EXPECT_TRUE(main_checker_.CalledOnValidThread()); auto quitter = run_loop_.QuitWhenIdleClosure(); - message_loop_.task_runner()->PostTask(FROM_HERE, quitter); + scoped_task_environment_.GetMainThreadTaskRunner()->PostTask(FROM_HERE, + quitter); } void SetDrmChecker() { drm_checker_.DetachFromThread(); } @@ -90,7 +91,7 @@ protected: // Main thread message loop. - base::MessageLoop message_loop_; + base::test::ScopedTaskEnvironment scoped_task_environment_; base::RunLoop run_loop_; // Thread to simulate the drm thread in ozone viz process.
diff --git a/ui/ozone/platform/scenic/BUILD.gn b/ui/ozone/platform/scenic/BUILD.gn index 67d670f..59d1d8ae 100644 --- a/ui/ozone/platform/scenic/BUILD.gn +++ b/ui/ozone/platform/scenic/BUILD.gn
@@ -63,11 +63,16 @@ "//ui/platform_window", ] + data_deps = [] if (enable_vulkan) { sources += [ "vulkan_implementation_scenic.cc", "vulkan_implementation_scenic.h", ] defines += [ "VK_USE_PLATFORM_MAGMA_KHR" ] + data_deps += [ + "//third_party/angle:libEGL", + "//third_party/angle:libGLESv2", + ] } }
diff --git a/ui/ozone/platform/scenic/scenic_gpu_host.cc b/ui/ozone/platform/scenic/scenic_gpu_host.cc index 6f8ecf5..25bbb30e 100644 --- a/ui/ozone/platform/scenic/scenic_gpu_host.cc +++ b/ui/ozone/platform/scenic/scenic_gpu_host.cc
@@ -55,17 +55,18 @@ return gpu_host; } -void ScenicGpuHost::ExportParent(int32_t surface_handle, - mojo::ScopedHandle export_token_mojo) { +void ScenicGpuHost::AttachSurfaceToWindow( + int32_t window_id, + mojo::ScopedHandle surface_view_holder_token_mojo) { DCHECK_CALLED_ON_VALID_THREAD(ui_thread_checker_); - ScenicWindow* scenic_window = - scenic_window_manager_->GetWindow(surface_handle); + ScenicWindow* scenic_window = scenic_window_manager_->GetWindow(window_id); if (!scenic_window) return; - fuchsia::ui::gfx::ExportToken export_token; - export_token.value = zx::eventpair( - mojo::UnwrapPlatformHandle(std::move(export_token_mojo)).TakeHandle()); - scenic_window->ExportRenderingEntity(std::move(export_token)); + fuchsia::ui::views::ViewHolderToken surface_view_holder_token; + surface_view_holder_token.value = zx::eventpair( + mojo::UnwrapPlatformHandle(std::move(surface_view_holder_token_mojo)) + .TakeHandle()); + scenic_window->AttachSurfaceView(std::move(surface_view_holder_token)); } void ScenicGpuHost::OnGpuProcessLaunched(
diff --git a/ui/ozone/platform/scenic/scenic_gpu_host.h b/ui/ozone/platform/scenic/scenic_gpu_host.h index 8fb2bef63..14f2a1a 100644 --- a/ui/ozone/platform/scenic/scenic_gpu_host.h +++ b/ui/ozone/platform/scenic/scenic_gpu_host.h
@@ -37,8 +37,9 @@ mojom::ScenicGpuHostPtr CreateHostProcessSelfBinding(); // mojom::ScenicGpuHost: - void ExportParent(int32_t surface_handle, - mojo::ScopedHandle export_token_mojo) override; + void AttachSurfaceToWindow( + int32_t window_id, + mojo::ScopedHandle surface_view_holder_token_mojo) override; // GpuPlatformSupportHost: void OnGpuProcessLaunched(
diff --git a/ui/ozone/platform/scenic/scenic_surface.cc b/ui/ozone/platform/scenic/scenic_surface.cc index ae540c1..9f92823 100644 --- a/ui/ozone/platform/scenic/scenic_surface.cc +++ b/ui/ozone/platform/scenic/scenic_surface.cc
@@ -5,6 +5,7 @@ #include "ui/ozone/platform/scenic/scenic_surface.h" #include <lib/ui/scenic/cpp/commands.h> +#include <lib/ui/scenic/cpp/view_token_pair.h> #include <lib/zx/eventpair.h> #include "mojo/public/cpp/system/platform_handle.h" @@ -18,7 +19,6 @@ gfx::AcceleratedWidget window, scenic::SessionPtrAndListenerRequest sesion_and_listener_request) : scenic_session_(std::move(sesion_and_listener_request)), - parent_(&scenic_session_), shape_(&scenic_session_), material_(&scenic_session_), scenic_surface_factory_(scenic_surface_factory), @@ -50,17 +50,21 @@ material_.SetTexture(image); } -mojo::ScopedHandle ScenicSurface::CreateParentExportToken() { - // Scenic does not care about order here; it's totally fine for imports to - // cause exports, and that's what's done here. +mojo::ScopedHandle ScenicSurface::CreateView() { DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); - zx::eventpair export_token; - parent_.BindAsRequest(&export_token); - parent_.AddChild(shape_); + + // Scenic will associate the View and ViewHolder regardless of which it + // learns about first, so we don't need to synchronize View creation with + // attachment into the scene graph by the caller. + auto tokens = scenic::ViewTokenPair::New(); + parent_ = std::make_unique<scenic::View>( + &scenic_session_, std::move(tokens.view_token), "chromium surface"); + parent_->AddChild(shape_); + scenic_session_.Present( /*presentation_time=*/0, [](fuchsia::images::PresentationInfo info) {}); return mojo::WrapPlatformHandle( - mojo::PlatformHandle(std::move(export_token))); + mojo::PlatformHandle(std::move(tokens.view_holder_token.value))); } } // namespace ui
diff --git a/ui/ozone/platform/scenic/scenic_surface.h b/ui/ozone/platform/scenic/scenic_surface.h index 080739b..693ee49 100644 --- a/ui/ozone/platform/scenic/scenic_surface.h +++ b/ui/ozone/platform/scenic/scenic_surface.h
@@ -41,8 +41,9 @@ // Sets the texture of the surface to an image resource. void SetTextureToImage(const scenic::Image& image); - // Creates token to links the surface to the window in the browser process. - mojo::ScopedHandle CreateParentExportToken(); + // Creates a View for this surface, and returns a ViewHolderToken handle + // that can be used to attach it into a scene graph. + mojo::ScopedHandle CreateView(); void AssertBelongsToCurrentThread() { DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); @@ -55,7 +56,7 @@ private: scenic::Session scenic_session_; - scenic::ImportNode parent_; + std::unique_ptr<scenic::View> parent_; scenic::ShapeNode shape_; scenic::Material material_;
diff --git a/ui/ozone/platform/scenic/scenic_surface_factory.cc b/ui/ozone/platform/scenic/scenic_surface_factory.cc index 31de60a..dca85fa 100644 --- a/ui/ozone/platform/scenic/scenic_surface_factory.cc +++ b/ui/ozone/platform/scenic/scenic_surface_factory.cc
@@ -84,14 +84,16 @@ std::vector<gl::GLImplementation> ScenicSurfaceFactory::GetAllowedGLImplementations() { - // TODO(spang): Remove this after crbug.com/897208 is fixed. - return std::vector<gl::GLImplementation>{gl::kGLImplementationSwiftShaderGL, - gl::kGLImplementationStubGL}; + return std::vector<gl::GLImplementation>{ + gl::kGLImplementationSwiftShaderGL, + gl::kGLImplementationEGLGLES2, + }; } GLOzone* ScenicSurfaceFactory::GetGLOzone(gl::GLImplementation implementation) { switch (implementation) { case gl::kGLImplementationSwiftShaderGL: + case gl::kGLImplementationEGLGLES2: return egl_implementation_.get(); default: return nullptr; @@ -100,14 +102,14 @@ std::unique_ptr<PlatformWindowSurface> ScenicSurfaceFactory::CreatePlatformWindowSurface( - gfx::AcceleratedWidget widget) { + gfx::AcceleratedWidget window) { DCHECK(gpu_host_); auto surface = - std::make_unique<ScenicSurface>(this, widget, CreateScenicSession()); + std::make_unique<ScenicSurface>(this, window, CreateScenicSession()); main_thread_task_runner_->PostTask( - FROM_HERE, base::BindOnce(&ScenicSurfaceFactory::LinkSurfaceToParent, - weak_ptr_factory_.GetWeakPtr(), widget, - surface->CreateParentExportToken())); + FROM_HERE, base::BindOnce(&ScenicSurfaceFactory::AttachSurfaceToWindow, + weak_ptr_factory_.GetWeakPtr(), window, + surface->CreateView())); return surface; } @@ -146,7 +148,7 @@ void ScenicSurfaceFactory::AddSurface(gfx::AcceleratedWidget widget, ScenicSurface* surface) { base::AutoLock lock(surface_lock_); - DCHECK(!base::ContainsKey(surface_map_, widget)); + DCHECK(!base::Contains(surface_map_, widget)); surface->AssertBelongsToCurrentThread(); surface_map_.insert(std::make_pair(widget, surface)); } @@ -205,11 +207,12 @@ scenic_->CreateSession(std::move(session_request), std::move(listener)); } -void ScenicSurfaceFactory::LinkSurfaceToParent( - gfx::AcceleratedWidget widget, - mojo::ScopedHandle export_token_mojo) { +void ScenicSurfaceFactory::AttachSurfaceToWindow( + gfx::AcceleratedWidget window, + mojo::ScopedHandle surface_view_holder_token_mojo) { DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); - gpu_host_->ExportParent(widget, std::move(export_token_mojo)); + gpu_host_->AttachSurfaceToWindow(window, + std::move(surface_view_holder_token_mojo)); } } // namespace ui
diff --git a/ui/ozone/platform/scenic/scenic_surface_factory.h b/ui/ozone/platform/scenic/scenic_surface_factory.h index 0228b166..fe8a193 100644 --- a/ui/ozone/platform/scenic/scenic_surface_factory.h +++ b/ui/ozone/platform/scenic/scenic_surface_factory.h
@@ -76,9 +76,9 @@ fidl::InterfaceRequest<fuchsia::ui::scenic::Session> session_request, fidl::InterfaceHandle<fuchsia::ui::scenic::SessionListener> listener); - // Links a surface to its parent in the host process. - void LinkSurfaceToParent(gfx::AcceleratedWidget widget, - mojo::ScopedHandle export_token_mojo); + // Links a surface to its parent window in the host process. + void AttachSurfaceToWindow(gfx::AcceleratedWidget window, + mojo::ScopedHandle surface_view_holder_token_mojo); base::flat_map<gfx::AcceleratedWidget, ScenicSurface*> surface_map_ GUARDED_BY(surface_lock_);
diff --git a/ui/ozone/platform/scenic/scenic_window.cc b/ui/ozone/platform/scenic/scenic_window.cc index 91f0a445..10a6a01 100644 --- a/ui/ozone/platform/scenic/scenic_window.cc +++ b/ui/ozone/platform/scenic/scenic_window.cc
@@ -58,14 +58,14 @@ manager_->RemoveWindow(window_id_, this); } -void ScenicWindow::ExportRenderingEntity( - fuchsia::ui::gfx::ExportToken export_token) { - scenic::EntityNode export_node(&scenic_session_); +void ScenicWindow::AttachSurfaceView( + fuchsia::ui::views::ViewHolderToken token) { + scenic::ViewHolder surface_view_holder(&scenic_session_, std::move(token), + "chromium window surface"); render_node_.DetachChildren(); - render_node_.AddChild(export_node); + render_node_.Attach(surface_view_holder); - export_node.Export(std::move(export_token.value)); scenic_session_.Present( /*presentation_time=*/0, [](fuchsia::images::PresentationInfo info) {}); }
diff --git a/ui/ozone/platform/scenic/scenic_window.h b/ui/ozone/platform/scenic/scenic_window.h index ad743a3..4e1d7a86 100644 --- a/ui/ozone/platform/scenic/scenic_window.h +++ b/ui/ozone/platform/scenic/scenic_window.h
@@ -39,7 +39,9 @@ scenic::Session* scenic_session() { return &scenic_session_; } - void ExportRenderingEntity(fuchsia::ui::gfx::ExportToken export_token); + // Embeds the View identified by |token| into the render node, + // causing its contents to be displayed in this window. + void AttachSurfaceView(fuchsia::ui::views::ViewHolderToken token); // PlatformWindow implementation. gfx::Rect GetBounds() override;
diff --git a/ui/ozone/platform/wayland/host/wayland_data_offer.cc b/ui/ozone/platform/wayland/host/wayland_data_offer.cc index 7fc0156..73d4dbc1 100644 --- a/ui/ozone/platform/wayland/host/wayland_data_offer.cc +++ b/ui/ozone/platform/wayland/host/wayland_data_offer.cc
@@ -55,7 +55,7 @@ } void WaylandDataOffer::EnsureTextMimeTypeIfNeeded() { - if (base::ContainsValue(mime_types_, kTextPlain)) + if (base::Contains(mime_types_, kTextPlain)) return; if (std::any_of(mime_types_.begin(), mime_types_.end(), @@ -70,7 +70,7 @@ } base::ScopedFD WaylandDataOffer::Receive(const std::string& mime_type) { - if (!base::ContainsValue(mime_types_, mime_type)) + if (!base::Contains(mime_types_, mime_type)) return base::ScopedFD(); base::ScopedFD read_fd;
diff --git a/ui/ozone/public/interfaces/scenic_gpu_host.mojom b/ui/ozone/public/interfaces/scenic_gpu_host.mojom index 0736e92..6218943 100644 --- a/ui/ozone/public/interfaces/scenic_gpu_host.mojom +++ b/ui/ozone/public/interfaces/scenic_gpu_host.mojom
@@ -6,6 +6,7 @@ // Browser process interface that enables the GPU process to present to Scenic. interface ScenicGpuHost { - // Exports the surface's parent node in the scene graph using |export_token|. - ExportParent(int32 surface_handle, handle export_token); + // Attaches the surface View identified by |view_holder_token| to the scene + // graph for |window_id|. + AttachSurfaceToWindow(int32 window_id, handle view_holder_token); };
diff --git a/ui/strings/translations/ui_strings_am.xtb b/ui/strings/translations/ui_strings_am.xtb index d78f52a..c231f50 100644 --- a/ui/strings/translations/ui_strings_am.xtb +++ b/ui/strings/translations/ui_strings_am.xtb
@@ -1,6 +1,7 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="am"> +<translation id="1028699632127661925">ወደ <ph name="DEVICE_NAME" /> በመላክ ላይ...</translation> <translation id="111910763555783249">የማሳወቂያ ቅንብሮች</translation> <translation id="1127811143501539442">{DAYS,plural, =1{1 ቀን በፊት}one{# ቀኖች በፊት}other{# ቀኖች በፊት}}</translation> <translation id="1156623771253174079">{SECONDS,plural, =1{ከ1 ደቂቃ በፊት}one{ከ# ደቂቃዎች በፊት}other{ከ# ደቂቃዎች በፊት}}</translation> @@ -185,7 +186,6 @@ <translation id="8144660977431427332">የእርስዎ ፍለጋዎች የቀረቡት በ Google ረዳቱ ነው። <ph name="LEARN_MORE" /></translation> <translation id="8152264887680882389"><ph name="TEXT" />፣ ራስሰር ሙላ</translation> <translation id="815598010540052116">ወደ ታች ሸብልል</translation> -<translation id="8170087467028567933">ይህን የአስተያየት ጥቆማን ማስወገድ በመላ መሣሪያዎችዎ ላይ ከመለያዎ ይደብቀዋል።</translation> <translation id="8179976553408161302">አስገባ</translation> <translation id="8210608804940886430">ወደታች አንቀሳቅስ</translation> <translation id="8245914219290430011">ትር</translation> @@ -196,7 +196,6 @@ <translation id="838869780401515933">አመልክት</translation> <translation id="8393700583063109961">መልዕክት ይላኩ</translation> <translation id="8394908167088220973">ሚዲያ አጫውት/ለአፍታ አቁም</translation> -<translation id="8420205633584771378">ይህ የአስተያየት ጥቆማ ይወገድ?</translation> <translation id="8458811141851741261">{YEARS,plural, =1{1ዓ}one{#ዓ}other{#ዓ}}</translation> <translation id="8602707065186045623"><ph name="SAVEAS_EXTENSION_TYPE" /> ፋይል(.<ph name="SAVEAS_EXTENSION_NAME" />)</translation> <translation id="8649597172973390955">መደርደሪያ ሁልጊዜ ይታያል</translation>
diff --git a/ui/strings/translations/ui_strings_ar.xtb b/ui/strings/translations/ui_strings_ar.xtb index 93e9067..e4c1f9b 100644 --- a/ui/strings/translations/ui_strings_ar.xtb +++ b/ui/strings/translations/ui_strings_ar.xtb
@@ -185,7 +185,6 @@ <translation id="8144660977431427332">عمليات بحثك يوفّرها "مساعد Google". <ph name="LEARN_MORE" /></translation> <translation id="8152264887680882389"><ph name="TEXT" />، الإكمال التلقائي</translation> <translation id="815598010540052116">التمرير إلى أسفل</translation> -<translation id="8170087467028567933">ستؤدي إزالة هذا الاقتراح إلى إخفائه من حسابك على جميع أجهزتك.</translation> <translation id="8179976553408161302">Enter</translation> <translation id="8210608804940886430">صفحة إلى أسفل</translation> <translation id="8245914219290430011">علامة تبويب</translation> @@ -196,7 +195,6 @@ <translation id="838869780401515933">الاختيار</translation> <translation id="8393700583063109961">إرسال رسالة</translation> <translation id="8394908167088220973">تشغيل/إيقاف الوسائط</translation> -<translation id="8420205633584771378">هل تريد إزالة هذا الاقتراح؟</translation> <translation id="8458811141851741261">{YEARS,plural, =1{عام واحد}zero{# عام}two{عامان (#)}few{# أعوام}many{# عامًا}other{# عام}}</translation> <translation id="8602707065186045623">ملف <ph name="SAVEAS_EXTENSION_TYPE" /> (.<ph name="SAVEAS_EXTENSION_NAME" />)</translation> <translation id="8649597172973390955">إظهار الرف دائمًا</translation>
diff --git a/ui/strings/translations/ui_strings_bg.xtb b/ui/strings/translations/ui_strings_bg.xtb index 3a9ca8d3..4b4eff8f 100644 --- a/ui/strings/translations/ui_strings_bg.xtb +++ b/ui/strings/translations/ui_strings_bg.xtb
@@ -1,6 +1,7 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="bg"> +<translation id="1028699632127661925">Изпраща се до <ph name="DEVICE_NAME" />...</translation> <translation id="111910763555783249">Настройки за известяване</translation> <translation id="1127811143501539442">{DAYS,plural, =1{Преди 1 ден}other{Преди # дни}}</translation> <translation id="1156623771253174079">{SECONDS,plural, =1{Преди 1 минута}other{Преди # минути}}</translation> @@ -185,7 +186,6 @@ <translation id="8144660977431427332">Търсенията се извършват с помощта на Google Асистент. <ph name="LEARN_MORE" /></translation> <translation id="8152264887680882389"><ph name="TEXT" />, автоматично довършване</translation> <translation id="815598010540052116">Превъртане надолу</translation> -<translation id="8170087467028567933">При премахване на това предложение то ще бъде скрито от профила ви на всичките ви устройства.</translation> <translation id="8179976553408161302">Enter</translation> <translation id="8210608804940886430">Страница надолу</translation> <translation id="8245914219290430011">Табулатор</translation> @@ -196,7 +196,6 @@ <translation id="838869780401515933">отмятане</translation> <translation id="8393700583063109961">Изпратете съобщение</translation> <translation id="8394908167088220973">Мултимедия, пускане/пауза</translation> -<translation id="8420205633584771378">Да се премахне ли това предложение?</translation> <translation id="8458811141851741261">{YEARS,plural, =1{1 г.}other{# г.}}</translation> <translation id="8602707065186045623"><ph name="SAVEAS_EXTENSION_TYPE" /> файл (.<ph name="SAVEAS_EXTENSION_NAME" />)</translation> <translation id="8649597172973390955">Лавицата се показва винаги</translation>
diff --git a/ui/strings/translations/ui_strings_bn.xtb b/ui/strings/translations/ui_strings_bn.xtb index ec7ece5..4feeae6a 100644 --- a/ui/strings/translations/ui_strings_bn.xtb +++ b/ui/strings/translations/ui_strings_bn.xtb
@@ -1,6 +1,7 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="bn"> +<translation id="1028699632127661925"><ph name="DEVICE_NAME" />-এ পাঠানো হচ্ছে...</translation> <translation id="111910763555783249">বিজ্ঞপ্তি সেটিংস</translation> <translation id="1127811143501539442">{DAYS,plural, =1{১ দিন পূর্বে}one{# দিন পূর্বে}other{# দিন পূর্বে}}</translation> <translation id="1156623771253174079">{SECONDS,plural, =1{১ মিনিট আগে}one{# মিনিট আগে}other{# মিনিট আগে}}</translation> @@ -185,7 +186,6 @@ <translation id="8144660977431427332">Google অ্যাসিস্ট্যান্ট আপনার সার্চ পরিচালনা করে। <ph name="LEARN_MORE" /></translation> <translation id="8152264887680882389"><ph name="TEXT" />, নিজে থেকে সম্পূর্ন করা</translation> <translation id="815598010540052116">নিচে স্ক্রল করুন</translation> -<translation id="8170087467028567933">এই সাজেশন সরিয়ে দেওয়া হলে, আপনার সব ডিভাইসে অ্যাকাউন্ট থেকে এটি লুকিয়ে রাখা হবে।</translation> <translation id="8179976553408161302">Enter</translation> <translation id="8210608804940886430">পৃষ্ঠা উপরে</translation> <translation id="8245914219290430011">ট্যাব</translation> @@ -196,7 +196,6 @@ <translation id="838869780401515933">চেক করুন</translation> <translation id="8393700583063109961">বার্তা পাঠান</translation> <translation id="8394908167088220973">মিডিয়া প্লে করুন/বিরতি</translation> -<translation id="8420205633584771378">সাজেশনটি সরাতে চান?</translation> <translation id="8458811141851741261">{YEARS,plural, =1{১ বছর}one{# বছর}other{# বছর}}</translation> <translation id="8602707065186045623"><ph name="SAVEAS_EXTENSION_TYPE" /> ফাইল (.<ph name="SAVEAS_EXTENSION_NAME" />)</translation> <translation id="8649597172973390955">শেল্ফ সবসময় দেখানো হয়</translation>
diff --git a/ui/strings/translations/ui_strings_ca.xtb b/ui/strings/translations/ui_strings_ca.xtb index 65195926..870f3385 100644 --- a/ui/strings/translations/ui_strings_ca.xtb +++ b/ui/strings/translations/ui_strings_ca.xtb
@@ -1,6 +1,7 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="ca"> +<translation id="1028699632127661925">S'està enviant a <ph name="DEVICE_NAME" />...</translation> <translation id="111910763555783249">Configuració de notificacions</translation> <translation id="1127811143501539442">{DAYS,plural, =1{fa 1 dia}other{fa # dies}}</translation> <translation id="1156623771253174079">{SECONDS,plural, =1{Fa 1 minut}other{Fa # minuts}}</translation> @@ -185,7 +186,6 @@ <translation id="8144660977431427332">Les cerques es duen a terme amb la tecnologia de l'Assistent de Google. <ph name="LEARN_MORE" /></translation> <translation id="8152264887680882389"><ph name="TEXT" />, compleció automàtica</translation> <translation id="815598010540052116">Desplaçament avall</translation> -<translation id="8170087467028567933">Si suprimeixes aquest suggeriment, s'amagarà del teu compte en tots els dispositius.</translation> <translation id="8179976553408161302">Retorn</translation> <translation id="8210608804940886430">Av Pàg</translation> <translation id="8245914219290430011">Tabulador</translation> @@ -196,7 +196,6 @@ <translation id="838869780401515933">marca</translation> <translation id="8393700583063109961">Envia el missatge</translation> <translation id="8394908167088220973">Fitxer multimèdia: reprodueix/posa en pausa</translation> -<translation id="8420205633584771378">Vols suprimir aquest suggeriment?</translation> <translation id="8458811141851741261">{YEARS,plural, =1{1 a}other{# a}}</translation> <translation id="8602707065186045623">Fitxer <ph name="SAVEAS_EXTENSION_TYPE" /> (.<ph name="SAVEAS_EXTENSION_NAME" />)</translation> <translation id="8649597172973390955">El prestatge es mostra sempre</translation>
diff --git a/ui/strings/translations/ui_strings_cs.xtb b/ui/strings/translations/ui_strings_cs.xtb index df5b9e51..cf3e94e3 100644 --- a/ui/strings/translations/ui_strings_cs.xtb +++ b/ui/strings/translations/ui_strings_cs.xtb
@@ -1,6 +1,7 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="cs"> +<translation id="1028699632127661925">Odesílání na zařízení <ph name="DEVICE_NAME" />...</translation> <translation id="111910763555783249">Nastavení oznámení</translation> <translation id="1127811143501539442">{DAYS,plural, =1{Před 1 dnem}few{Před # dny}many{Před # dne}other{Před # dny}}</translation> <translation id="1156623771253174079">{SECONDS,plural, =1{před minutou}few{před # minutami}many{před # minuty}other{před # minutami}}</translation> @@ -185,7 +186,6 @@ <translation id="8144660977431427332">Pro vaše vyhledávání se používá technologie Asistenta Google. <ph name="LEARN_MORE" /></translation> <translation id="8152264887680882389"><ph name="TEXT" />, automatické doplnění</translation> <translation id="815598010540052116">Posuv dolů</translation> -<translation id="8170087467028567933">Pokud tento návrh odstraníte, bude ve vašem účtu skryt na všech vašich zařízeních.</translation> <translation id="8179976553408161302">Enter</translation> <translation id="8210608804940886430">Klávesa PageDown</translation> <translation id="8245914219290430011">Tab</translation> @@ -196,7 +196,6 @@ <translation id="838869780401515933">zaškrtnout</translation> <translation id="8393700583063109961">Odeslat zprávu</translation> <translation id="8394908167088220973">Média – přehrát/pozastavit</translation> -<translation id="8420205633584771378">Odstranit tento návrh?</translation> <translation id="8458811141851741261">{YEARS,plural, =1{1 r}few{# r}many{# r}other{# r}}</translation> <translation id="8602707065186045623">Soubor <ph name="SAVEAS_EXTENSION_TYPE" /> (.<ph name="SAVEAS_EXTENSION_NAME" />)</translation> <translation id="8649597172973390955">Polička se vždy zobrazuje</translation>
diff --git a/ui/strings/translations/ui_strings_da.xtb b/ui/strings/translations/ui_strings_da.xtb index cd882011..a82f0ed 100644 --- a/ui/strings/translations/ui_strings_da.xtb +++ b/ui/strings/translations/ui_strings_da.xtb
@@ -185,7 +185,6 @@ <translation id="8144660977431427332">Dine søgninger leveres af Google Assistent. <ph name="LEARN_MORE" /></translation> <translation id="8152264887680882389"><ph name="TEXT" />, autofuldfør</translation> <translation id="815598010540052116">Scroll Down</translation> -<translation id="8170087467028567933">Hvis du fjerner dette forslag, skjules det på din konto på alle dine enheder.</translation> <translation id="8179976553408161302">Enter</translation> <translation id="8210608804940886430">Side ned</translation> <translation id="8245914219290430011">Tabulatortast</translation> @@ -196,7 +195,6 @@ <translation id="838869780401515933">markér</translation> <translation id="8393700583063109961">Send en besked</translation> <translation id="8394908167088220973">Medie: Afspil/Pause</translation> -<translation id="8420205633584771378">Vil du fjerne dette forslag?</translation> <translation id="8458811141851741261">{YEARS,plural, =1{1 år}one{# år}other{# år}}</translation> <translation id="8602707065186045623"><ph name="SAVEAS_EXTENSION_TYPE" /> Fil (.<ph name="SAVEAS_EXTENSION_NAME" />)</translation> <translation id="8649597172973390955">Hylden vises altid</translation>
diff --git a/ui/strings/translations/ui_strings_de.xtb b/ui/strings/translations/ui_strings_de.xtb index b8e9b620..1aeb225a 100644 --- a/ui/strings/translations/ui_strings_de.xtb +++ b/ui/strings/translations/ui_strings_de.xtb
@@ -185,7 +185,6 @@ <translation id="8144660977431427332">Ihre Suchanfragen werden mit Google Assistant durchgeführt. <ph name="LEARN_MORE" /></translation> <translation id="8152264887680882389"><ph name="TEXT" />, automatische Vervollständigung</translation> <translation id="815598010540052116">Nach unten blättern</translation> -<translation id="8170087467028567933">Wenn Sie diesen Vorschlag entfernen, wird er für Ihr Konto nicht mehr eingeblendet, unabhängig vom Gerät.</translation> <translation id="8179976553408161302">Enter</translation> <translation id="8210608804940886430">Nach unten</translation> <translation id="8245914219290430011">Tabulatortaste</translation> @@ -196,7 +195,6 @@ <translation id="838869780401515933">auswählen</translation> <translation id="8393700583063109961">Nachricht senden</translation> <translation id="8394908167088220973">Medien – Wiedergabe/Pause</translation> -<translation id="8420205633584771378">Diesen Vorschlag entfernen?</translation> <translation id="8458811141851741261">{YEARS,plural, =1{1 Jahr}other{# Jahre}}</translation> <translation id="8602707065186045623"><ph name="SAVEAS_EXTENSION_TYPE" />-Datei (.<ph name="SAVEAS_EXTENSION_NAME" />)</translation> <translation id="8649597172973390955">Ablage immer eingeblendet</translation>
diff --git a/ui/strings/translations/ui_strings_el.xtb b/ui/strings/translations/ui_strings_el.xtb index 3f8b570..f3698fd 100644 --- a/ui/strings/translations/ui_strings_el.xtb +++ b/ui/strings/translations/ui_strings_el.xtb
@@ -1,6 +1,7 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="el"> +<translation id="1028699632127661925">Αποστολή στη συσκευή <ph name="DEVICE_NAME" />…</translation> <translation id="111910763555783249">Ρυθμίσεις ειδοποιήσεων</translation> <translation id="1127811143501539442">{DAYS,plural, =1{Πριν από 1 ημέρα}other{Πριν από # ημέρες}}</translation> <translation id="1156623771253174079">{SECONDS,plural, =1{Πριν από 1 λεπτό}other{Πριν από # λεπτά}}</translation> @@ -185,7 +186,6 @@ <translation id="8144660977431427332">Οι αναζητήσεις σας παρέχονται από τον Βοηθό Google. <ph name="LEARN_MORE" /></translation> <translation id="8152264887680882389"><ph name="TEXT" />, αυτόματη συμπλήρωση</translation> <translation id="815598010540052116">Κύλιση κάτω</translation> -<translation id="8170087467028567933">Η κατάργηση αυτής της πρότασης θα την αποκρύψει από τον λογαριασμό σας σε όλες τις συσκευές.</translation> <translation id="8179976553408161302">Enter</translation> <translation id="8210608804940886430">Επόμενη σελίδα</translation> <translation id="8245914219290430011">Πλήκτρο tab</translation> @@ -196,7 +196,6 @@ <translation id="838869780401515933">ενεργοποίηση</translation> <translation id="8393700583063109961">Αποστολή μηνύματος</translation> <translation id="8394908167088220973">Αναπαραγωγή/παύση πολυμέσων</translation> -<translation id="8420205633584771378">Να καταργηθεί αυτή η πρόταση;</translation> <translation id="8458811141851741261">{YEARS,plural, =1{1έτ.}other{#έτ.}}</translation> <translation id="8602707065186045623">Αρχείο <ph name="SAVEAS_EXTENSION_TYPE" /> (.<ph name="SAVEAS_EXTENSION_NAME" />)</translation> <translation id="8649597172973390955">Το ράφι είναι πάντα ορατό</translation>
diff --git a/ui/strings/translations/ui_strings_en-GB.xtb b/ui/strings/translations/ui_strings_en-GB.xtb index b55e965..7c2e6fb3 100644 --- a/ui/strings/translations/ui_strings_en-GB.xtb +++ b/ui/strings/translations/ui_strings_en-GB.xtb
@@ -1,6 +1,7 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="en-GB"> +<translation id="1028699632127661925">Sending to <ph name="DEVICE_NAME" />...</translation> <translation id="111910763555783249">Notification settings</translation> <translation id="1127811143501539442">{DAYS,plural, =1{1 day ago}other{# days ago}}</translation> <translation id="1156623771253174079">{SECONDS,plural, =1{1 minute ago}other{# minutes ago}}</translation> @@ -185,7 +186,6 @@ <translation id="8144660977431427332">Your searches are powered by the Google Assistant. <ph name="LEARN_MORE" /></translation> <translation id="8152264887680882389"><ph name="TEXT" />, autocomplete</translation> <translation id="815598010540052116">Scroll Down</translation> -<translation id="8170087467028567933">Removing this suggestion will hide it from your account across all your devices.</translation> <translation id="8179976553408161302">Enter</translation> <translation id="8210608804940886430">Page Down</translation> <translation id="8245914219290430011">Tab</translation> @@ -196,7 +196,6 @@ <translation id="838869780401515933">tick</translation> <translation id="8393700583063109961">Send message</translation> <translation id="8394908167088220973">Media Play/Pause</translation> -<translation id="8420205633584771378">Remove this suggestion?</translation> <translation id="8458811141851741261">{YEARS,plural, =1{1y}other{#y}}</translation> <translation id="8602707065186045623"><ph name="SAVEAS_EXTENSION_TYPE" /> File (.<ph name="SAVEAS_EXTENSION_NAME" />)</translation> <translation id="8649597172973390955">Shelf always shown</translation>
diff --git a/ui/strings/translations/ui_strings_es-419.xtb b/ui/strings/translations/ui_strings_es-419.xtb index 75ec0683..0a3cf09 100644 --- a/ui/strings/translations/ui_strings_es-419.xtb +++ b/ui/strings/translations/ui_strings_es-419.xtb
@@ -185,7 +185,6 @@ <translation id="8144660977431427332">Tus búsquedas cuentan con la tecnología del Asistente de Google. <ph name="LEARN_MORE" /></translation> <translation id="8152264887680882389"><ph name="TEXT" />; autocompletar</translation> <translation id="815598010540052116">Desplazar hacia abajo</translation> -<translation id="8170087467028567933">Si quitas esta sugerencia, se ocultará de tu cuenta en todos los dispositivos.</translation> <translation id="8179976553408161302">Intro</translation> <translation id="8210608804940886430">Avanzar página</translation> <translation id="8245914219290430011">Tabulador</translation> @@ -196,7 +195,6 @@ <translation id="838869780401515933">marcar</translation> <translation id="8393700583063109961">Enviar mensaje</translation> <translation id="8394908167088220973">Reproducir o pausar contenido multimedia</translation> -<translation id="8420205633584771378">¿Quieres quitar esta sugerencia?</translation> <translation id="8458811141851741261">{YEARS,plural, =1{1 a}other{# a}}</translation> <translation id="8602707065186045623"><ph name="SAVEAS_EXTENSION_TYPE" /> Archivo (.<ph name="SAVEAS_EXTENSION_NAME" />)</translation> <translation id="8649597172973390955">La biblioteca se muestra siempre</translation>
diff --git a/ui/strings/translations/ui_strings_es.xtb b/ui/strings/translations/ui_strings_es.xtb index 0a401f2..61b90bd 100644 --- a/ui/strings/translations/ui_strings_es.xtb +++ b/ui/strings/translations/ui_strings_es.xtb
@@ -185,7 +185,6 @@ <translation id="8144660977431427332">Tus búsquedas usan la tecnología del Asistente de Google. <ph name="LEARN_MORE" /></translation> <translation id="8152264887680882389"><ph name="TEXT" />, autocompletar</translation> <translation id="815598010540052116">Desplazar hacia abajo</translation> -<translation id="8170087467028567933">Quitar esta sugerencia hará que no la veas en ninguno de tus dispositivos con tu cuenta.</translation> <translation id="8179976553408161302">Intro</translation> <translation id="8210608804940886430">Avanzar página</translation> <translation id="8245914219290430011">Tabulador</translation> @@ -196,7 +195,6 @@ <translation id="838869780401515933">marcar</translation> <translation id="8393700583063109961">Enviar mensaje</translation> <translation id="8394908167088220973">Pausar/Reproducir contenido multimedia</translation> -<translation id="8420205633584771378">¿Quieres eliminar esta sugerencia?</translation> <translation id="8458811141851741261">{YEARS,plural, =1{1 año}other{# años}}</translation> <translation id="8602707065186045623">Archivo <ph name="SAVEAS_EXTENSION_TYPE" /> (.<ph name="SAVEAS_EXTENSION_NAME" />)</translation> <translation id="8649597172973390955">La estantería se muestra siempre</translation>
diff --git a/ui/strings/translations/ui_strings_et.xtb b/ui/strings/translations/ui_strings_et.xtb index 4efc129..073b0c47 100644 --- a/ui/strings/translations/ui_strings_et.xtb +++ b/ui/strings/translations/ui_strings_et.xtb
@@ -1,6 +1,7 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="et"> +<translation id="1028699632127661925">Saatmine seadmesse <ph name="DEVICE_NAME" /> …</translation> <translation id="111910763555783249">Märguandeseaded</translation> <translation id="1127811143501539442">{DAYS,plural, =1{1 päev tagasi}other{# päeva tagasi}}</translation> <translation id="1156623771253174079">{SECONDS,plural, =1{1 minut tagasi}other{# minutit tagasi}}</translation> @@ -185,7 +186,6 @@ <translation id="8144660977431427332">Teie otsingud toimuvad Google'i assistendi toel. <ph name="LEARN_MORE" /></translation> <translation id="8152264887680882389"><ph name="TEXT" />, automaatne täitmine</translation> <translation id="815598010540052116">Keri alla</translation> -<translation id="8170087467028567933">Kui selle soovituse eemaldate, peidetakse see teie kontol ja seda ei kuvata üheski seadmes.</translation> <translation id="8179976553408161302">Sisestusklahv</translation> <translation id="8210608804940886430">Lehekülje lõppu</translation> <translation id="8245914219290430011">Tabeldusklahv</translation> @@ -196,7 +196,6 @@ <translation id="838869780401515933">mrgista</translation> <translation id="8393700583063109961">Saatke sõnum</translation> <translation id="8394908167088220973">Meediumi esitamine/peatamine</translation> -<translation id="8420205633584771378">Kas eemaldada see soovitus?</translation> <translation id="8458811141851741261">{YEARS,plural, =1{1a}other{#a}}</translation> <translation id="8602707065186045623"><ph name="SAVEAS_EXTENSION_TYPE" /> Fail (.<ph name="SAVEAS_EXTENSION_NAME" />)</translation> <translation id="8649597172973390955">Riiul on alati kuvatud</translation>
diff --git a/ui/strings/translations/ui_strings_fa.xtb b/ui/strings/translations/ui_strings_fa.xtb index 792784c..bf6cf3f 100644 --- a/ui/strings/translations/ui_strings_fa.xtb +++ b/ui/strings/translations/ui_strings_fa.xtb
@@ -185,7 +185,6 @@ <translation id="8144660977431427332">جستجوهایتان را «دستیار Google» انجام میدهد. <ph name="LEARN_MORE" /></translation> <translation id="8152264887680882389"><ph name="TEXT" />، تکمیل خودکار</translation> <translation id="815598010540052116">پیمایش به پایین</translation> -<translation id="8170087467028567933">برداشتن این پیشنهاد موجب میشود از حسابتان در همه دستگاههایتان پنهان شود.</translation> <translation id="8179976553408161302">ورود</translation> <translation id="8210608804940886430">صفحه پایین</translation> <translation id="8245914219290430011">Tab</translation> @@ -196,7 +195,6 @@ <translation id="838869780401515933">علامتگذاری</translation> <translation id="8393700583063109961">ارسال پیام</translation> <translation id="8394908167088220973">پخش/مکث رسانه</translation> -<translation id="8420205633584771378">این پیشنهاد حذف شود؟</translation> <translation id="8458811141851741261">{YEARS,plural, =1{۱ سال}one{# سال}other{# سال}}</translation> <translation id="8602707065186045623">فایل <ph name="SAVEAS_EXTENSION_TYPE" /> (.<ph name="SAVEAS_EXTENSION_NAME" />)</translation> <translation id="8649597172973390955">قفسه همیشه نمایش داده میشود</translation>
diff --git a/ui/strings/translations/ui_strings_fi.xtb b/ui/strings/translations/ui_strings_fi.xtb index 08508d2c..efa6f07 100644 --- a/ui/strings/translations/ui_strings_fi.xtb +++ b/ui/strings/translations/ui_strings_fi.xtb
@@ -1,6 +1,7 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="fi"> +<translation id="1028699632127661925">Lähetetään: <ph name="DEVICE_NAME" /></translation> <translation id="111910763555783249">Ilmoitusasetukset</translation> <translation id="1127811143501539442">{DAYS,plural, =1{1 päivä sitten}other{# päivää sitten}}</translation> <translation id="1156623771253174079">{SECONDS,plural, =1{1 minuutti sitten}other{# minuuttia sitten}}</translation> @@ -185,7 +186,6 @@ <translation id="8144660977431427332">Hakupalvelun tarjoaa Google Assistant. <ph name="LEARN_MORE" /></translation> <translation id="8152264887680882389"><ph name="TEXT" />, automaattinen täydennys</translation> <translation id="815598010540052116">Vieritä alas</translation> -<translation id="8170087467028567933">Tämän ehdotuksen poistaminen piilottaa sen pysyvästi tililtäsi kaikilla laitteilla.</translation> <translation id="8179976553408161302">Enter</translation> <translation id="8210608804940886430">Sivu alas</translation> <translation id="8245914219290430011">Sarkain</translation> @@ -196,7 +196,6 @@ <translation id="838869780401515933">valitse</translation> <translation id="8393700583063109961">Lähetä viesti</translation> <translation id="8394908167088220973">Media: toista/keskeytä</translation> -<translation id="8420205633584771378">Poistetaanko tämä ehdotus?</translation> <translation id="8458811141851741261">{YEARS,plural, =1{1 v}other{# v}}</translation> <translation id="8602707065186045623"><ph name="SAVEAS_EXTENSION_TYPE" />-tiedosto (.<ph name="SAVEAS_EXTENSION_NAME" />)</translation> <translation id="8649597172973390955">Hylly näytetään aina</translation>
diff --git a/ui/strings/translations/ui_strings_fil.xtb b/ui/strings/translations/ui_strings_fil.xtb index 37f27c1..a5bee67 100644 --- a/ui/strings/translations/ui_strings_fil.xtb +++ b/ui/strings/translations/ui_strings_fil.xtb
@@ -185,7 +185,6 @@ <translation id="8144660977431427332">Pinapatakbo ng Google Assistant ang iyong mga paghahanap. <ph name="LEARN_MORE" /></translation> <translation id="8152264887680882389"><ph name="TEXT" />, Autocomplete</translation> <translation id="815598010540052116">Mag-scroll Pababa</translation> -<translation id="8170087467028567933">Kapag inalis ang suhestyong ito, itatago ito sa iyong account sa lahat ng device mo.</translation> <translation id="8179976553408161302">Enter</translation> <translation id="8210608804940886430">Page Down</translation> <translation id="8245914219290430011">Tab</translation> @@ -196,7 +195,6 @@ <translation id="838869780401515933">I-tsek</translation> <translation id="8393700583063109961">Ipadala ang mensahe</translation> <translation id="8394908167088220973">I-Play/I-Pause ang Media</translation> -<translation id="8420205633584771378">Alisin ang suhestyong ito?</translation> <translation id="8458811141851741261">{YEARS,plural, =1{1 taon}one{# taon}other{# na taon}}</translation> <translation id="8602707065186045623"><ph name="SAVEAS_EXTENSION_TYPE" /> File (.<ph name="SAVEAS_EXTENSION_NAME" />)</translation> <translation id="8649597172973390955">Palaging ipinapakita ang shelf</translation>
diff --git a/ui/strings/translations/ui_strings_fr.xtb b/ui/strings/translations/ui_strings_fr.xtb index 2b467e5e..065dd068 100644 --- a/ui/strings/translations/ui_strings_fr.xtb +++ b/ui/strings/translations/ui_strings_fr.xtb
@@ -1,6 +1,7 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="fr"> +<translation id="1028699632127661925">Envoi sur <ph name="DEVICE_NAME" />…</translation> <translation id="111910763555783249">Paramètres de notification</translation> <translation id="1127811143501539442">{DAYS,plural, =1{Il y a 1 jour}one{Il y a # jour}other{Il y a # jours}}</translation> <translation id="1156623771253174079">{SECONDS,plural, =1{Il y a une minute}one{Il y a # minute}other{Il y a # minutes}}</translation> @@ -185,7 +186,6 @@ <translation id="8144660977431427332">Vos recherches sont optimisées par l'Assistant Google. <ph name="LEARN_MORE" /></translation> <translation id="8152264887680882389"><ph name="TEXT" />, saisie semi-automatique</translation> <translation id="815598010540052116">Défilement vers le bas</translation> -<translation id="8170087467028567933">Si vous choisissez de supprimer cette suggestion, elle ne s'affichera plus lorsque vous serez connecté à votre compte, sur tous vos appareils.</translation> <translation id="8179976553408161302">Entrée</translation> <translation id="8210608804940886430">Page suivante</translation> <translation id="8245914219290430011">Tabulation</translation> @@ -196,7 +196,6 @@ <translation id="838869780401515933">cocher</translation> <translation id="8393700583063109961">Envoyer un message</translation> <translation id="8394908167088220973">Contenu multimédia : lecture/pause</translation> -<translation id="8420205633584771378">Supprimer cette suggestion ?</translation> <translation id="8458811141851741261">{YEARS,plural, =1{1 a}one{# a}other{# a}}</translation> <translation id="8602707065186045623">Fichier <ph name="SAVEAS_EXTENSION_TYPE" /> (.<ph name="SAVEAS_EXTENSION_NAME" />)</translation> <translation id="8649597172973390955">Étagère toujours affichée</translation>
diff --git a/ui/strings/translations/ui_strings_gu.xtb b/ui/strings/translations/ui_strings_gu.xtb index 9082832..dd711d73 100644 --- a/ui/strings/translations/ui_strings_gu.xtb +++ b/ui/strings/translations/ui_strings_gu.xtb
@@ -185,7 +185,6 @@ <translation id="8144660977431427332">તમારી શોધ Google આસિસ્ટંટ દ્વારા પૂરી પાડવામાં આવે છે. <ph name="LEARN_MORE" /></translation> <translation id="8152264887680882389"><ph name="TEXT" />, ઑટોમેટિક રીતે પૂર્ણ</translation> <translation id="815598010540052116">નીચે સ્ક્રોલ કરો</translation> -<translation id="8170087467028567933">આ સૂચનને કાઢી નાખવાથી તેને તમારા બધા ડિવાઇસના તમારા એકાઉન્ટમાં બતાવવામાં આવશે નહીં.</translation> <translation id="8179976553408161302">Enter</translation> <translation id="8210608804940886430">પૃષ્ઠ નીચે</translation> <translation id="8245914219290430011">ટૅબ</translation> @@ -196,7 +195,6 @@ <translation id="838869780401515933">તપાસો</translation> <translation id="8393700583063109961">સંદેશ મોકલો</translation> <translation id="8394908167088220973">મીડિયા ચલાવો/થોભાવો</translation> -<translation id="8420205633584771378">આ સૂચન કાઢી નાખીએ?</translation> <translation id="8458811141851741261">{YEARS,plural, =1{1 વ}one{# વ}other{# વ}}</translation> <translation id="8602707065186045623"><ph name="SAVEAS_EXTENSION_TYPE" /> ફાઇલ (.<ph name="SAVEAS_EXTENSION_NAME" />)</translation> <translation id="8649597172973390955">શેલ્ફ હંમેશાં બતાવવામાં આવે છે</translation>
diff --git a/ui/strings/translations/ui_strings_hi.xtb b/ui/strings/translations/ui_strings_hi.xtb index 918cd646..49997d3 100644 --- a/ui/strings/translations/ui_strings_hi.xtb +++ b/ui/strings/translations/ui_strings_hi.xtb
@@ -185,7 +185,6 @@ <translation id="8144660977431427332">आप जो चीज़ें खोजते हैं उनमें Google Assistant की मदद ली जाती है.<ph name="LEARN_MORE" /></translation> <translation id="8152264887680882389"><ph name="TEXT" />, अपने आप पूरा</translation> <translation id="815598010540052116">नीचे स्क्रोल करें</translation> -<translation id="8170087467028567933">अगर आप यह सुझाव हटाते हैं, तो यह उन सभी डिवाइस पर फिर से दिखाई नहीं देगा जिन पर आप यह खाता इस्तेमाल करते हैं.</translation> <translation id="8179976553408161302">Enter</translation> <translation id="8210608804940886430">Page Down</translation> <translation id="8245914219290430011">टैब</translation> @@ -196,7 +195,6 @@ <translation id="838869780401515933">सही का निशान लगाकर चुनें</translation> <translation id="8393700583063109961">संदेश भेजें</translation> <translation id="8394908167088220973">मीडिया चलाएं/रोकें</translation> -<translation id="8420205633584771378">यह सुझाव हटा दें?</translation> <translation id="8458811141851741261">{YEARS,plural, =1{1y}one{#y}other{#y}}</translation> <translation id="8602707065186045623"><ph name="SAVEAS_EXTENSION_TYPE" /> फ़ाइल (.<ph name="SAVEAS_EXTENSION_NAME" />)</translation> <translation id="8649597172973390955">अब शेल्फ़ हर समय उपलब्ध है</translation>
diff --git a/ui/strings/translations/ui_strings_hr.xtb b/ui/strings/translations/ui_strings_hr.xtb index 649f1a2a..1627004 100644 --- a/ui/strings/translations/ui_strings_hr.xtb +++ b/ui/strings/translations/ui_strings_hr.xtb
@@ -1,6 +1,7 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="hr"> +<translation id="1028699632127661925">Šalje se uređaju <ph name="DEVICE_NAME" />...</translation> <translation id="111910763555783249">Postavke obavijesti</translation> <translation id="1127811143501539442">{DAYS,plural, =1{Prije 1 dan}one{Prije # dan}few{Prije # dana}other{Prije # dana}}</translation> <translation id="1156623771253174079">{SECONDS,plural, =1{Prije 1 minute}one{prije # minute}few{prije # minute}other{prije # minuta}}</translation> @@ -185,7 +186,6 @@ <translation id="8144660977431427332">Vaša pretraživanja pokreće Google asistent. <ph name="LEARN_MORE" /></translation> <translation id="8152264887680882389"><ph name="TEXT" />, samodovrši</translation> <translation id="815598010540052116">Pomakni se dolje</translation> -<translation id="8170087467028567933">Ako ga uklonite, taj će se prijedlog sakriti na vašem računu na svim vašim uređajima.</translation> <translation id="8179976553408161302">Enter</translation> <translation id="8210608804940886430">Stranica prema dolje</translation> <translation id="8245914219290430011">Kartica</translation> @@ -196,7 +196,6 @@ <translation id="838869780401515933">označi</translation> <translation id="8393700583063109961">Pošaljite poruku</translation> <translation id="8394908167088220973">Reproduciraj/pauziraj Medije</translation> -<translation id="8420205633584771378">Ukloniti prijedlog?</translation> <translation id="8458811141851741261">{YEARS,plural, =1{1 g}one{# g}few{# g}other{# g}}</translation> <translation id="8602707065186045623"><ph name="SAVEAS_EXTENSION_TYPE" /> Datoteka (.<ph name="SAVEAS_EXTENSION_NAME" />)</translation> <translation id="8649597172973390955">Polica se uvijek prikazuje</translation>
diff --git a/ui/strings/translations/ui_strings_hu.xtb b/ui/strings/translations/ui_strings_hu.xtb index 8b47f5291..d89c49d 100644 --- a/ui/strings/translations/ui_strings_hu.xtb +++ b/ui/strings/translations/ui_strings_hu.xtb
@@ -1,6 +1,7 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="hu"> +<translation id="1028699632127661925">Küldés a következő eszközre: <ph name="DEVICE_NAME" />…</translation> <translation id="111910763555783249">Értesítési beállítások</translation> <translation id="1127811143501539442">{DAYS,plural, =1{1 napja}other{# napja}}</translation> <translation id="1156623771253174079">{SECONDS,plural, =1{1 perce}other{# perce}}</translation> @@ -185,7 +186,6 @@ <translation id="8144660977431427332">Kereséseit a Google Segéd teszi lehetővé. <ph name="LEARN_MORE" />.</translation> <translation id="8152264887680882389"><ph name="TEXT" />, automatikus kiegészítés</translation> <translation id="815598010540052116">Görgetés lefelé</translation> -<translation id="8170087467028567933">Ha eltávolítja ezt a javaslatot, továbbiakban nem jelenik meg a fiókjával használt egyik eszközön sem.</translation> <translation id="8179976553408161302">Enter</translation> <translation id="8210608804940886430">Page Down</translation> <translation id="8245914219290430011">Lap</translation> @@ -196,7 +196,6 @@ <translation id="838869780401515933">Megjelölés</translation> <translation id="8393700583063109961">Üzenet küldése</translation> <translation id="8394908167088220973">Lejátszás/szüneteltetés</translation> -<translation id="8420205633584771378">Eltávolítja ezt a javaslatot?</translation> <translation id="8458811141851741261">{YEARS,plural, =1{1 é}other{# é}}</translation> <translation id="8602707065186045623"><ph name="SAVEAS_EXTENSION_TYPE" /> fájl (.<ph name="SAVEAS_EXTENSION_NAME" />)</translation> <translation id="8649597172973390955">A polc mindig látható</translation>
diff --git a/ui/strings/translations/ui_strings_id.xtb b/ui/strings/translations/ui_strings_id.xtb index b31eef0..ee2005e 100644 --- a/ui/strings/translations/ui_strings_id.xtb +++ b/ui/strings/translations/ui_strings_id.xtb
@@ -185,7 +185,6 @@ <translation id="8144660977431427332">Penelusuran Anda difasilitasi oleh Asisten Google. <ph name="LEARN_MORE" /></translation> <translation id="8152264887680882389"><ph name="TEXT" />, Dilengkapi otomatis</translation> <translation id="815598010540052116">Gulir ke Bawah</translation> -<translation id="8170087467028567933">Menghapus saran ini akan menyembunyikannya dari akun Anda di seluruh perangkat.</translation> <translation id="8179976553408161302">Enter</translation> <translation id="8210608804940886430">Page Down</translation> <translation id="8245914219290430011">Tab</translation> @@ -196,7 +195,6 @@ <translation id="838869780401515933">centangi</translation> <translation id="8393700583063109961">Kirim pesan</translation> <translation id="8394908167088220973">Putar/Jeda Media</translation> -<translation id="8420205633584771378">Hapus saran ini?</translation> <translation id="8458811141851741261">{YEARS,plural, =1{1t}other{#t}}</translation> <translation id="8602707065186045623"><ph name="SAVEAS_EXTENSION_TYPE" /> File (.<ph name="SAVEAS_EXTENSION_NAME" />)</translation> <translation id="8649597172973390955">Rak selalu ditampilkan</translation>
diff --git a/ui/strings/translations/ui_strings_it.xtb b/ui/strings/translations/ui_strings_it.xtb index e787906..5d15256 100644 --- a/ui/strings/translations/ui_strings_it.xtb +++ b/ui/strings/translations/ui_strings_it.xtb
@@ -1,6 +1,7 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="it"> +<translation id="1028699632127661925">Invio a <ph name="DEVICE_NAME" />…</translation> <translation id="111910763555783249">Impostazioni di notifica</translation> <translation id="1127811143501539442">{DAYS,plural, =1{1 giorno fa}other{# giorni fa}}</translation> <translation id="1156623771253174079">{SECONDS,plural, =1{1 minuto fa}other{# minuti fa}}</translation> @@ -185,7 +186,6 @@ <translation id="8144660977431427332">Le tue ricerche sono basate sulla tecnologia dell'Assistente Google. <ph name="LEARN_MORE" /></translation> <translation id="8152264887680882389"><ph name="TEXT" />, completamento automatico</translation> <translation id="815598010540052116">Scorri verso il basso</translation> -<translation id="8170087467028567933">Questo suggerimento, se rimosso, verrà nascosto dal tuo account su tutti i tuoi dispositivi.</translation> <translation id="8179976553408161302">Invio</translation> <translation id="8210608804940886430">Pagina giù</translation> <translation id="8245914219290430011">Tabulazione</translation> @@ -196,7 +196,6 @@ <translation id="838869780401515933">seleziona</translation> <translation id="8393700583063109961">Invia messaggio</translation> <translation id="8394908167088220973">Play/Pausa contenuti multimediali</translation> -<translation id="8420205633584771378">Rimuovere questo suggerimento?</translation> <translation id="8458811141851741261">{YEARS,plural, =1{1 a}other{# a}}</translation> <translation id="8602707065186045623">File <ph name="SAVEAS_EXTENSION_TYPE" /> (.<ph name="SAVEAS_EXTENSION_NAME" />)</translation> <translation id="8649597172973390955">Shelf sempre visualizzato</translation>
diff --git a/ui/strings/translations/ui_strings_iw.xtb b/ui/strings/translations/ui_strings_iw.xtb index 0bddb70..e31b726e 100644 --- a/ui/strings/translations/ui_strings_iw.xtb +++ b/ui/strings/translations/ui_strings_iw.xtb
@@ -185,7 +185,6 @@ <translation id="8144660977431427332">החיפושים שלך מופעלים על ידי Google Assistant. <ph name="LEARN_MORE" /></translation> <translation id="8152264887680882389"><ph name="TEXT" />, השלמה אוטומטית</translation> <translation id="815598010540052116">גלול למטה</translation> -<translation id="8170087467028567933">הסרת ההצעה הזו תסתיר אותה בחשבון בכל המכשירים שברשותך.</translation> <translation id="8179976553408161302">Enter</translation> <translation id="8210608804940886430">דף למטה</translation> <translation id="8245914219290430011">כרטיסייה</translation> @@ -196,7 +195,6 @@ <translation id="838869780401515933">סמן</translation> <translation id="8393700583063109961">שלח הודעה</translation> <translation id="8394908167088220973">הפעלה/השהיה של המדיה</translation> -<translation id="8420205633584771378">להסיר את ההצעה הזו?</translation> <translation id="8458811141851741261">{YEARS,plural, =1{שנה}two{# שנ}many{# שנ}other{# שנ}}</translation> <translation id="8602707065186045623">קובץ <ph name="SAVEAS_EXTENSION_TYPE" /> (<ph name="SAVEAS_EXTENSION_NAME" />.)</translation> <translation id="8649597172973390955">המדף תמיד מוצג</translation>
diff --git a/ui/strings/translations/ui_strings_ja.xtb b/ui/strings/translations/ui_strings_ja.xtb index c102262..5e9c7a7 100644 --- a/ui/strings/translations/ui_strings_ja.xtb +++ b/ui/strings/translations/ui_strings_ja.xtb
@@ -185,7 +185,6 @@ <translation id="8144660977431427332">検索は Google アシスタントによって行われます。<ph name="LEARN_MORE" /></translation> <translation id="8152264887680882389"><ph name="TEXT" />、オートコンプリート</translation> <translation id="815598010540052116">下にスクロール</translation> -<translation id="8170087467028567933">この候補を削除すると、お使いのすべてのデバイスでアカウントに表示されなくなります。</translation> <translation id="8179976553408161302">Enter</translation> <translation id="8210608804940886430">次のページへ</translation> <translation id="8245914219290430011">タブ</translation> @@ -196,7 +195,6 @@ <translation id="838869780401515933">チェックを付ける</translation> <translation id="8393700583063109961">メッセージを送信</translation> <translation id="8394908167088220973">メディアの再生/一時停止</translation> -<translation id="8420205633584771378">この候補を削除しますか?</translation> <translation id="8458811141851741261">{YEARS,plural, =1{1年}other{#年}}</translation> <translation id="8602707065186045623"><ph name="SAVEAS_EXTENSION_TYPE" /> ファイル (.<ph name="SAVEAS_EXTENSION_NAME" />)</translation> <translation id="8649597172973390955">シェルフは常に表示されます</translation>
diff --git a/ui/strings/translations/ui_strings_kn.xtb b/ui/strings/translations/ui_strings_kn.xtb index 04da27e..a8246df 100644 --- a/ui/strings/translations/ui_strings_kn.xtb +++ b/ui/strings/translations/ui_strings_kn.xtb
@@ -185,7 +185,6 @@ <translation id="8144660977431427332">ನಿಮ್ಮ ಹುಡುಕಾಟಗಳು Google ಅಸಿಸ್ಟೆಂಟ್ನಿಂದ ಪ್ರಾಯೋಜಿತವಾಗಿವೆ. <ph name="LEARN_MORE" /></translation> <translation id="8152264887680882389"><ph name="TEXT" />, ಸ್ವಯಂಪೂರ್ಣಗೊಳಿಸುವಿಕೆ</translation> <translation id="815598010540052116">ಕೆಳಗೆ ಸ್ಕ್ರೋಲ್ ಮಾಡು</translation> -<translation id="8170087467028567933">ಈ ಸಲಹೆಯನ್ನು ತೆಗೆದುಹಾಕಿದರೆ, ಅದನ್ನು ನಿಮ್ಮ ಎಲ್ಲಾ ಸಾಧನಗಳಾದ್ಯಂತ ನಿಮ್ಮ ಖಾತೆಯಿಂದ ಮರೆಮಾಡಲಾಗುತ್ತದೆ.</translation> <translation id="8179976553408161302">Enter</translation> <translation id="8210608804940886430">ಪುಟ ಕೆಳಗೆ</translation> <translation id="8245914219290430011">ಟ್ಯಾಬ್</translation> @@ -196,7 +195,6 @@ <translation id="838869780401515933">ಪರಿಶೀಲಿಸಿ</translation> <translation id="8393700583063109961">ಸಂದೇಶ ಕಳುಹಿಸು</translation> <translation id="8394908167088220973">ಮೀಡಿಯಾ ಪ್ಲೇ/ವಿರಾಮ</translation> -<translation id="8420205633584771378">ಈ ಸಲಹೆಯನ್ನು ತೆಗೆದುಹಾಕುವುದೇ?</translation> <translation id="8458811141851741261">{YEARS,plural, =1{1ವ}one{#ವ}other{#ವ}}</translation> <translation id="8602707065186045623"><ph name="SAVEAS_EXTENSION_TYPE" /> ಫೈಲ್ (.<ph name="SAVEAS_EXTENSION_NAME" />)</translation> <translation id="8649597172973390955">ಶೆಲ್ಪ್ ಯಾವಾಗಲೂ ತೋರಿಸಲಾಗಿದೆ</translation>
diff --git a/ui/strings/translations/ui_strings_ko.xtb b/ui/strings/translations/ui_strings_ko.xtb index 20a1b9d..5f5bd6d 100644 --- a/ui/strings/translations/ui_strings_ko.xtb +++ b/ui/strings/translations/ui_strings_ko.xtb
@@ -185,7 +185,6 @@ <translation id="8144660977431427332">Google 어시스턴트가 지원되는 검색입니다. <ph name="LEARN_MORE" /></translation> <translation id="8152264887680882389"><ph name="TEXT" />, 자동 완성</translation> <translation id="815598010540052116">아래로 스크롤</translation> -<translation id="8170087467028567933">이 추천 검색어를 삭제하면 계정과 연결된 모든 기기에서 숨겨집니다.</translation> <translation id="8179976553408161302">Enter</translation> <translation id="8210608804940886430">페이지 아래로</translation> <translation id="8245914219290430011">탭</translation> @@ -196,7 +195,6 @@ <translation id="838869780401515933">선택</translation> <translation id="8393700583063109961">메시지 보내기</translation> <translation id="8394908167088220973">미디어 재생/일시중지</translation> -<translation id="8420205633584771378">추천을 삭제하시겠습니까?</translation> <translation id="8458811141851741261">{YEARS,plural, =1{1년}other{#년}}</translation> <translation id="8602707065186045623"><ph name="SAVEAS_EXTENSION_TYPE" /> 파일(.<ph name="SAVEAS_EXTENSION_NAME" />)</translation> <translation id="8649597172973390955">실행기 항상 표시</translation>
diff --git a/ui/strings/translations/ui_strings_lt.xtb b/ui/strings/translations/ui_strings_lt.xtb index 245b5416..885230b 100644 --- a/ui/strings/translations/ui_strings_lt.xtb +++ b/ui/strings/translations/ui_strings_lt.xtb
@@ -1,6 +1,7 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="lt"> +<translation id="1028699632127661925">Siunčiama į „<ph name="DEVICE_NAME" />“...</translation> <translation id="111910763555783249">Pranešimų nustatymai</translation> <translation id="1127811143501539442">{DAYS,plural, =1{Prieš 1 dieną}one{Prieš # dieną}few{Prieš # dienas}many{Prieš # dienos}other{Prieš # dienų}}</translation> <translation id="1156623771253174079">{SECONDS,plural, =1{Prieš 1 minutę}one{Prieš # minutę}few{Prieš # minutes}many{Prieš # minutės}other{Prieš # minučių}}</translation> @@ -185,7 +186,6 @@ <translation id="8144660977431427332">Jūsų paieškos veikia su „Google Assistant“. <ph name="LEARN_MORE" /></translation> <translation id="8152264887680882389"><ph name="TEXT" />, automatinis užbaigimas</translation> <translation id="815598010540052116">Slinkti žemyn</translation> -<translation id="8170087467028567933">Pašalinus šį pasiūlymą jis bus paslėptas jūsų paskyroje visuose įrenginiuose.</translation> <translation id="8179976553408161302">Įvesti</translation> <translation id="8210608804940886430">Puslapį žemyn</translation> <translation id="8245914219290430011">Skirtukas</translation> @@ -196,7 +196,6 @@ <translation id="838869780401515933">tikrinti</translation> <translation id="8393700583063109961">Siųsti pranešimą</translation> <translation id="8394908167088220973">Leisti / pristabdyti mediją</translation> -<translation id="8420205633584771378">Pašalinti šį siūlymą?</translation> <translation id="8458811141851741261">{YEARS,plural, =1{1 m.}one{# m.}few{# m.}many{# m.}other{# m.}}</translation> <translation id="8602707065186045623"><ph name="SAVEAS_EXTENSION_TYPE" /> failas (.<ph name="SAVEAS_EXTENSION_NAME" />)</translation> <translation id="8649597172973390955">Lentyna visada rodoma</translation>
diff --git a/ui/strings/translations/ui_strings_lv.xtb b/ui/strings/translations/ui_strings_lv.xtb index 1f231a0c..767f1d8d0 100644 --- a/ui/strings/translations/ui_strings_lv.xtb +++ b/ui/strings/translations/ui_strings_lv.xtb
@@ -1,6 +1,7 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="lv"> +<translation id="1028699632127661925">Notiek sūtīšana uz: <ph name="DEVICE_NAME" />...</translation> <translation id="111910763555783249">Paziņojumu iestatījumi</translation> <translation id="1127811143501539442">{DAYS,plural, =1{Pirms 1 dienas}zero{Pirms # dienām}one{Pirms # dienas}other{Pirms # dienām}}</translation> <translation id="1156623771253174079">{SECONDS,plural, =1{Pirms 1 minūtes}zero{Pirms # minūtēm}one{Pirms # minūtes}other{Pirms # minūtēm}}</translation> @@ -185,7 +186,6 @@ <translation id="8144660977431427332">Jūsu meklēšanas vaicājumus nodrošina Google asistents. <ph name="LEARN_MORE" /></translation> <translation id="8152264887680882389"><ph name="TEXT" />, automātiski pabeigts</translation> <translation id="815598010540052116">Ritināt lejup</translation> -<translation id="8170087467028567933">Ja noņemsiet šo ieteikumu, tas vairs netiks rādīts jūsu kontā nevienā jūsu ierīcē.</translation> <translation id="8179976553408161302">Ievadīt</translation> <translation id="8210608804940886430">Lejup</translation> <translation id="8245914219290430011">Tabulēšanas taustiņš</translation> @@ -196,7 +196,6 @@ <translation id="838869780401515933">prbaudt</translation> <translation id="8393700583063109961">Sūtīt ziņojumu</translation> <translation id="8394908167088220973">Multivide — atskaņot/apturēt</translation> -<translation id="8420205633584771378">Vai noņemt šo ieteikumu?</translation> <translation id="8458811141851741261">{YEARS,plural, =1{1 g.}zero{# g.}one{# g.}other{# g.}}</translation> <translation id="8602707065186045623">Fails <ph name="SAVEAS_EXTENSION_TYPE" /> (.<ph name="SAVEAS_EXTENSION_NAME" />)</translation> <translation id="8649597172973390955">Plaukts tiek rādīts vienmēr</translation>
diff --git a/ui/strings/translations/ui_strings_ml.xtb b/ui/strings/translations/ui_strings_ml.xtb index 8ff020c..0077ab2 100644 --- a/ui/strings/translations/ui_strings_ml.xtb +++ b/ui/strings/translations/ui_strings_ml.xtb
@@ -185,7 +185,6 @@ <translation id="8144660977431427332">നിങ്ങളുടെ തിരയലുകൾ നൽകുന്നത് Google അസിസ്റ്റൻ്റ് ആണ്. <ph name="LEARN_MORE" /></translation> <translation id="8152264887680882389"><ph name="TEXT" />, സ്വയമേവ പൂർത്തിയാക്കുക</translation> <translation id="815598010540052116">താഴേക്ക് സ്ക്രോള് ചെയ്യൂ</translation> -<translation id="8170087467028567933">ഈ നിർദ്ദേശം നീക്കം ചെയ്യുന്നത്, നിങ്ങളുടെ എല്ലാ ഉപകരണങ്ങളിലെയും അക്കൗണ്ടിൽ നിന്ന് ഇത് മറയ്ക്കും.</translation> <translation id="8179976553408161302">Enter</translation> <translation id="8210608804940886430">താഴെയുള്ള പേജുകള്</translation> <translation id="8245914219290430011">ടാബ്</translation> @@ -196,7 +195,6 @@ <translation id="838869780401515933">പരിശോധിക്കൂ</translation> <translation id="8393700583063109961">സന്ദേശം അയയ്ക്കുക</translation> <translation id="8394908167088220973">മീഡിയ പ്ലേ ചെയ്യുക/താൽക്കാലികമായി നിർത്തുക</translation> -<translation id="8420205633584771378">ഈ നിർദ്ദേശം നീക്കം ചെയ്യണോ?</translation> <translation id="8458811141851741261">{YEARS,plural, =1{1വർഷം}other{#വർഷം}}</translation> <translation id="8602707065186045623"><ph name="SAVEAS_EXTENSION_TYPE" /> ഫയല് (.<ph name="SAVEAS_EXTENSION_NAME" />)</translation> <translation id="8649597172973390955">ഷെൽഫ് എപ്പോഴും ദൃശ്യമാക്കിയിരിക്കുന്നു</translation>
diff --git a/ui/strings/translations/ui_strings_mr.xtb b/ui/strings/translations/ui_strings_mr.xtb index 0402b66..20a7858 100644 --- a/ui/strings/translations/ui_strings_mr.xtb +++ b/ui/strings/translations/ui_strings_mr.xtb
@@ -185,7 +185,6 @@ <translation id="8144660977431427332">तुमचे शोध Google असिस्टंट द्वारे प्रायोजित आहेत. <ph name="LEARN_MORE" /></translation> <translation id="8152264887680882389"><ph name="TEXT" />, ऑटोकंप्लीट</translation> <translation id="815598010540052116">खाली स्क्रोल करा</translation> -<translation id="8170087467028567933">ही सूचना काढल्याने ती तुमच्या सर्व डिव्हाइसवर तुमच्या खात्यावरून लपवली जाईल.</translation> <translation id="8179976553408161302">Enter</translation> <translation id="8210608804940886430">पृष्ठ खाली</translation> <translation id="8245914219290430011">टॅब</translation> @@ -196,7 +195,6 @@ <translation id="838869780401515933">तपासा</translation> <translation id="8393700583063109961">संदेश पाठवा</translation> <translation id="8394908167088220973">मीडिया प्ले करा/विराम द्या</translation> -<translation id="8420205633584771378">ही सूचना काढून टाकायची आहे का?</translation> <translation id="8458811141851741261">{YEARS,plural, =1{1वर्ष}other{#वर्षे}}</translation> <translation id="8602707065186045623"><ph name="SAVEAS_EXTENSION_TYPE" /> फाइल (.<ph name="SAVEAS_EXTENSION_NAME" />)</translation> <translation id="8649597172973390955">शेल्फ नेहमी दाखवले जात आहे</translation>
diff --git a/ui/strings/translations/ui_strings_ms.xtb b/ui/strings/translations/ui_strings_ms.xtb index 2a0168b..cbcbff631 100644 --- a/ui/strings/translations/ui_strings_ms.xtb +++ b/ui/strings/translations/ui_strings_ms.xtb
@@ -185,7 +185,6 @@ <translation id="8144660977431427332">Carian anda dikuasakan oleh Google Assistant. <ph name="LEARN_MORE" /></translation> <translation id="8152264887680882389"><ph name="TEXT" />, Autolengkap</translation> <translation id="815598010540052116">Tatal Ke Bawah</translation> -<translation id="8170087467028567933">Tindakan mengalih keluar cadangan ini akan menyembunyikannya daripada akaun anda pada semua peranti anda.</translation> <translation id="8179976553408161302">Enter</translation> <translation id="8210608804940886430">Ke Bawah Halaman</translation> <translation id="8245914219290430011">Tab</translation> @@ -196,7 +195,6 @@ <translation id="838869780401515933">periksa</translation> <translation id="8393700583063109961">Hantar mesej</translation> <translation id="8394908167088220973">Main/Jeda Media</translation> -<translation id="8420205633584771378">Alih keluar cadangan ini?</translation> <translation id="8458811141851741261">{YEARS,plural, =1{1t}other{#t}}</translation> <translation id="8602707065186045623"><ph name="SAVEAS_EXTENSION_TYPE" /> Fail (.<ph name="SAVEAS_EXTENSION_NAME" />)</translation> <translation id="8649597172973390955">Rak sentiasa ditunjukkan</translation>
diff --git a/ui/strings/translations/ui_strings_nl.xtb b/ui/strings/translations/ui_strings_nl.xtb index fb49aeb..6c03cb6 100644 --- a/ui/strings/translations/ui_strings_nl.xtb +++ b/ui/strings/translations/ui_strings_nl.xtb
@@ -185,7 +185,6 @@ <translation id="8144660977431427332">Je zoekopdrachten worden mogelijk gemaakt door de Google Assistent. <ph name="LEARN_MORE" /></translation> <translation id="8152264887680882389"><ph name="TEXT" />, automatisch aanvullen</translation> <translation id="815598010540052116">Omlaag bladeren</translation> -<translation id="8170087467028567933">Als je de suggestie verwijdert, wordt deze verborgen voor je account op al je apparaten.</translation> <translation id="8179976553408161302">Enter</translation> <translation id="8210608804940886430">Pagina omlaag</translation> <translation id="8245914219290430011">Tab</translation> @@ -196,7 +195,6 @@ <translation id="838869780401515933">Selecteren</translation> <translation id="8393700583063109961">Bericht verzenden</translation> <translation id="8394908167088220973">Media afspelen/onderbreken</translation> -<translation id="8420205633584771378">Deze suggestie verwijderen?</translation> <translation id="8458811141851741261">{YEARS,plural, =1{1 j}other{# j}}</translation> <translation id="8602707065186045623"><ph name="SAVEAS_EXTENSION_TYPE" />-bestand (.<ph name="SAVEAS_EXTENSION_NAME" />)</translation> <translation id="8649597172973390955">Plank altijd weergegeven</translation>
diff --git a/ui/strings/translations/ui_strings_no.xtb b/ui/strings/translations/ui_strings_no.xtb index beb629cd..bf0cf36 100644 --- a/ui/strings/translations/ui_strings_no.xtb +++ b/ui/strings/translations/ui_strings_no.xtb
@@ -1,6 +1,7 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="no"> +<translation id="1028699632127661925">Sender til <ph name="DEVICE_NAME" /> …</translation> <translation id="111910763555783249">Varslingsinnstillinger</translation> <translation id="1127811143501539442">{DAYS,plural, =1{For 1 dag siden}other{For # dager siden}}</translation> <translation id="1156623771253174079">{SECONDS,plural, =1{for 1 minutt siden}other{for # minutter siden}}</translation> @@ -185,7 +186,6 @@ <translation id="8144660977431427332">Søkene er drevet av Google-assistenten. <ph name="LEARN_MORE" /></translation> <translation id="8152264887680882389"><ph name="TEXT" />, autofullføring</translation> <translation id="815598010540052116">Rull ned</translation> -<translation id="8170087467028567933">Hvis du fjerner dette forslaget, skjules det for kontoen din på alle enhetene dine.</translation> <translation id="8179976553408161302">Enter</translation> <translation id="8210608804940886430">Ned 1 s.</translation> <translation id="8245914219290430011">Fane</translation> @@ -196,7 +196,6 @@ <translation id="838869780401515933">merk av</translation> <translation id="8393700583063109961">Send melding</translation> <translation id="8394908167088220973">Media – spill av / pause</translation> -<translation id="8420205633584771378">Vil du fjerne dette forslaget?</translation> <translation id="8458811141851741261">{YEARS,plural, =1{1 år}other{# år}}</translation> <translation id="8602707065186045623"><ph name="SAVEAS_EXTENSION_TYPE" /> Fil (.<ph name="SAVEAS_EXTENSION_NAME" />)</translation> <translation id="8649597172973390955">Hyllen vises alltid</translation>
diff --git a/ui/strings/translations/ui_strings_pl.xtb b/ui/strings/translations/ui_strings_pl.xtb index 1502bc5..64d94877 100644 --- a/ui/strings/translations/ui_strings_pl.xtb +++ b/ui/strings/translations/ui_strings_pl.xtb
@@ -1,6 +1,7 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="pl"> +<translation id="1028699632127661925">Przesyłam na: <ph name="DEVICE_NAME" />…</translation> <translation id="111910763555783249">Ustawienia powiadomień</translation> <translation id="1127811143501539442">{DAYS,plural, =1{1 dzień temu}few{# dni temu}many{# dni temu}other{# dnia temu}}</translation> <translation id="1156623771253174079">{SECONDS,plural, =1{minutę temu}few{# minuty temu}many{# minut temu}other{# minuty temu}}</translation> @@ -185,7 +186,6 @@ <translation id="8144660977431427332">Twoje wyszukiwania obsługuje Asystent Google. <ph name="LEARN_MORE" /></translation> <translation id="8152264887680882389"><ph name="TEXT" />, autouzupełnianie</translation> <translation id="815598010540052116">Przewiń w dół</translation> -<translation id="8170087467028567933">Usunięcie tej sugestii ukryje ją na Twoim koncie na wszystkich Twoich urządzeniach.</translation> <translation id="8179976553408161302">Enter</translation> <translation id="8210608804940886430">Strona w dół</translation> <translation id="8245914219290430011">Tab</translation> @@ -196,7 +196,6 @@ <translation id="838869780401515933">zaznacz</translation> <translation id="8393700583063109961">Wyślij wiadomość</translation> <translation id="8394908167088220973">Odtwórz/wstrzymaj multimedia</translation> -<translation id="8420205633584771378">Usunąć tę sugestię?</translation> <translation id="8458811141851741261">{YEARS,plural, =1{1 rok}few{# lata}many{# lat}other{# roku}}</translation> <translation id="8602707065186045623">Plik <ph name="SAVEAS_EXTENSION_TYPE" /> (.<ph name="SAVEAS_EXTENSION_NAME" />)</translation> <translation id="8649597172973390955">Półka zawsze widoczna</translation>
diff --git a/ui/strings/translations/ui_strings_pt-BR.xtb b/ui/strings/translations/ui_strings_pt-BR.xtb index 289f1bca..f4c39f92 100644 --- a/ui/strings/translations/ui_strings_pt-BR.xtb +++ b/ui/strings/translations/ui_strings_pt-BR.xtb
@@ -185,7 +185,6 @@ <translation id="8144660977431427332">Suas pesquisas são executadas pelo Google Assistente. <ph name="LEARN_MORE" /></translation> <translation id="8152264887680882389"><ph name="TEXT" />, preenchimento automático</translation> <translation id="815598010540052116">Percorrer para baixo</translation> -<translation id="8170087467028567933">Se você remover essa sugestão, ela não será exibida na sua conta em nenhum dos seus dispositivos.</translation> <translation id="8179976553408161302">Entrar</translation> <translation id="8210608804940886430">Página para baixo</translation> <translation id="8245914219290430011">Guia</translation> @@ -196,7 +195,6 @@ <translation id="838869780401515933">marcar</translation> <translation id="8393700583063109961">Enviar mensagem</translation> <translation id="8394908167088220973">Reproduzir/pausar mídia</translation> -<translation id="8420205633584771378">Remover esta sugestão?</translation> <translation id="8458811141851741261">{YEARS,plural, =1{1 a}one{# a}other{# a}}</translation> <translation id="8602707065186045623">Arquivo <ph name="SAVEAS_EXTENSION_TYPE" /> (.<ph name="SAVEAS_EXTENSION_NAME" />)</translation> <translation id="8649597172973390955">Sempre mostrar estante</translation>
diff --git a/ui/strings/translations/ui_strings_pt-PT.xtb b/ui/strings/translations/ui_strings_pt-PT.xtb index 2d5ff38..02cf54bc 100644 --- a/ui/strings/translations/ui_strings_pt-PT.xtb +++ b/ui/strings/translations/ui_strings_pt-PT.xtb
@@ -1,6 +1,7 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="pt-PT"> +<translation id="1028699632127661925">A enviar para <ph name="DEVICE_NAME" />…</translation> <translation id="111910763555783249">Definições de notificação</translation> <translation id="1127811143501539442">{DAYS,plural, =1{Há 1 dia}other{Há # dias}}</translation> <translation id="1156623771253174079">{SECONDS,plural, =1{Há 1 minuto}other{Há # minutos}}</translation> @@ -185,7 +186,6 @@ <translation id="8144660977431427332">As suas pesquisas são ativadas pelo Assistente Google. <ph name="LEARN_MORE" /></translation> <translation id="8152264887680882389"><ph name="TEXT" />, preenchimento automático</translation> <translation id="815598010540052116">Deslocar-se para baixo</translation> -<translation id="8170087467028567933">Ao remover a sugestão, esta deixará de ser apresentada na sua conta em todos os dispositivos.</translation> <translation id="8179976553408161302">Enter</translation> <translation id="8210608804940886430">Página para baixo</translation> <translation id="8245914219290430011">Tabulação</translation> @@ -196,7 +196,6 @@ <translation id="838869780401515933">verificar</translation> <translation id="8393700583063109961">Enviar mensagem</translation> <translation id="8394908167088220973">Reproduzir/interromper multimédia</translation> -<translation id="8420205633584771378">Pretende remover esta sugestão?</translation> <translation id="8458811141851741261">{YEARS,plural, =1{1 a}other{# a}}</translation> <translation id="8602707065186045623">Ficheiro <ph name="SAVEAS_EXTENSION_TYPE" /> (.<ph name="SAVEAS_EXTENSION_NAME" />)</translation> <translation id="8649597172973390955">Prateleira apresentada sempre</translation>
diff --git a/ui/strings/translations/ui_strings_ro.xtb b/ui/strings/translations/ui_strings_ro.xtb index 72a547ea..641d989 100644 --- a/ui/strings/translations/ui_strings_ro.xtb +++ b/ui/strings/translations/ui_strings_ro.xtb
@@ -1,6 +1,7 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="ro"> +<translation id="1028699632127661925">Se trimite la <ph name="DEVICE_NAME" />...</translation> <translation id="111910763555783249">Setări pentru notificări</translation> <translation id="1127811143501539442">{DAYS,plural, =1{Acum o zi}few{Acum # zile}other{Acum # de zile}}</translation> <translation id="1156623771253174079">{SECONDS,plural, =1{Acum 1 minut}few{Acum # minute}other{Acum # de minute}}</translation> @@ -185,7 +186,6 @@ <translation id="8144660977431427332">Căutările tale funcționează cu Asistentul Google. <ph name="LEARN_MORE" /></translation> <translation id="8152264887680882389"><ph name="TEXT" />, completare automată</translation> <translation id="815598010540052116">Derulează în jos</translation> -<translation id="8170087467028567933">Dacă elimini sugestia, nu se va mai afișa în cont pe niciun dispozitiv.</translation> <translation id="8179976553408161302">Enter</translation> <translation id="8210608804940886430">O pagină mai jos</translation> <translation id="8245914219290430011">Tab</translation> @@ -196,7 +196,6 @@ <translation id="838869780401515933">bifează</translation> <translation id="8393700583063109961">Trimite un mesaj</translation> <translation id="8394908167088220973">Redați/întrerupeți conținutul media</translation> -<translation id="8420205633584771378">Eliminați această sugestie?</translation> <translation id="8458811141851741261">{YEARS,plural, =1{1 an}few{# ani}other{# ani}}</translation> <translation id="8602707065186045623">Fișier <ph name="SAVEAS_EXTENSION_TYPE" /> (.<ph name="SAVEAS_EXTENSION_NAME" />)</translation> <translation id="8649597172973390955">Raftul este afișat mereu</translation>
diff --git a/ui/strings/translations/ui_strings_ru.xtb b/ui/strings/translations/ui_strings_ru.xtb index 4d51ac6b..3c323f73 100644 --- a/ui/strings/translations/ui_strings_ru.xtb +++ b/ui/strings/translations/ui_strings_ru.xtb
@@ -185,7 +185,6 @@ <translation id="8144660977431427332">Ваши поисковые запросы обрабатывает Google Ассистент. <ph name="LEARN_MORE" /></translation> <translation id="8152264887680882389"><ph name="TEXT" />, автозаполнение</translation> <translation id="815598010540052116">Прокрутка вниз</translation> -<translation id="8170087467028567933">Если вы удалите эту подсказку, она будет скрыта на всех ваших устройствах, где выполнен вход в аккаунт.</translation> <translation id="8179976553408161302">ВВОД</translation> <translation id="8210608804940886430">Прокрутка вниз</translation> <translation id="8245914219290430011">Tab</translation> @@ -196,7 +195,6 @@ <translation id="838869780401515933">поставить галочку</translation> <translation id="8393700583063109961">Отправить сообщение</translation> <translation id="8394908167088220973">Воспроизведение/пауза</translation> -<translation id="8420205633584771378">Удалить эту подсказку?</translation> <translation id="8458811141851741261">{YEARS,plural, =1{1 г.}one{# г.}few{# г.}many{# л.}other{# г.}}</translation> <translation id="8602707065186045623">Файл <ph name="SAVEAS_EXTENSION_TYPE" /> (.<ph name="SAVEAS_EXTENSION_NAME" />)</translation> <translation id="8649597172973390955">Временное хранилище будет всегда отображаться</translation>
diff --git a/ui/strings/translations/ui_strings_sk.xtb b/ui/strings/translations/ui_strings_sk.xtb index d2a12f0..8da921a 100644 --- a/ui/strings/translations/ui_strings_sk.xtb +++ b/ui/strings/translations/ui_strings_sk.xtb
@@ -1,6 +1,7 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="sk"> +<translation id="1028699632127661925">Odosiela sa do zariadenia <ph name="DEVICE_NAME" />…</translation> <translation id="111910763555783249">Nastavenia upozornení</translation> <translation id="1127811143501539442">{DAYS,plural, =1{Včera}few{Pred # dňami}many{Pred # dňom}other{Pred # dňami}}</translation> <translation id="1156623771253174079">{SECONDS,plural, =1{pred minútou}few{pred # minútami}many{pred # minútami}other{pred # minútami}}</translation> @@ -185,7 +186,6 @@ <translation id="8144660977431427332">Vaše vyhľadávania využívajú technológiu Asistenta Google. <ph name="LEARN_MORE" /></translation> <translation id="8152264887680882389"><ph name="TEXT" />, automatické dopĺňanie</translation> <translation id="815598010540052116">Rolovať nadol</translation> -<translation id="8170087467028567933">Odstránením tento návrh skryjete v účte vo všetkých zariadeniach.</translation> <translation id="8179976553408161302">Enter</translation> <translation id="8210608804940886430">Stránkovať nadol</translation> <translation id="8245914219290430011">Tab</translation> @@ -196,7 +196,6 @@ <translation id="838869780401515933">označiť</translation> <translation id="8393700583063109961">Odoslať správu</translation> <translation id="8394908167088220973">Média – prehrať / pozastaviť</translation> -<translation id="8420205633584771378">Chcete odstrániť tento návrh?</translation> <translation id="8458811141851741261">{YEARS,plural, =1{1 r.}few{# r.}many{# r.}other{# r.}}</translation> <translation id="8602707065186045623"><ph name="SAVEAS_EXTENSION_TYPE" /> Súbor (.<ph name="SAVEAS_EXTENSION_NAME" />)</translation> <translation id="8649597172973390955">Polička sa vždy zobrazuje</translation>
diff --git a/ui/strings/translations/ui_strings_sl.xtb b/ui/strings/translations/ui_strings_sl.xtb index 28f18722..abcbe15 100644 --- a/ui/strings/translations/ui_strings_sl.xtb +++ b/ui/strings/translations/ui_strings_sl.xtb
@@ -1,6 +1,7 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="sl"> +<translation id="1028699632127661925">Pošiljanje v napravo <ph name="DEVICE_NAME" /> ...</translation> <translation id="111910763555783249">Nastavitve obvestil</translation> <translation id="1127811143501539442">{DAYS,plural, =1{Pred 1 dnevom}one{Pred # dnevom}two{Pred # dnevoma}few{Pred # dnevi}other{Pred # dnevi}}</translation> <translation id="1156623771253174079">{SECONDS,plural, =1{Pred 1 minuto}one{Pred # minuto}two{Pred # minutama}few{Pred # minutami}other{Pred # minutami}}</translation> @@ -184,7 +185,6 @@ <translation id="8144660977431427332">Pri iskanju se uporablja tehnologija Pomočnika Google. <ph name="LEARN_MORE" /></translation> <translation id="8152264887680882389"><ph name="TEXT" />, samodokončanje</translation> <translation id="815598010540052116">Pomik dol</translation> -<translation id="8170087467028567933">Če odstranite ta predlog, ne bo več prikazan v vašem računu v vseh vaših napravah.</translation> <translation id="8179976553408161302">Enter</translation> <translation id="8210608804940886430">Stran dol</translation> <translation id="8245914219290430011">Zavihek</translation> @@ -195,7 +195,6 @@ <translation id="838869780401515933">potrdi</translation> <translation id="8393700583063109961">Pošlji sporočilo</translation> <translation id="8394908167088220973">Ustavitev/začasna ustavitev</translation> -<translation id="8420205633584771378">Želite odstraniti ta predlog?</translation> <translation id="8458811141851741261">{YEARS,plural, =1{1 l}one{# l}two{# l}few{# l}other{# l}}</translation> <translation id="8602707065186045623">Datoteka <ph name="SAVEAS_EXTENSION_TYPE" /> (.<ph name="SAVEAS_EXTENSION_NAME" />)</translation> <translation id="8649597172973390955">Polica je vedno prikazana</translation>
diff --git a/ui/strings/translations/ui_strings_sr.xtb b/ui/strings/translations/ui_strings_sr.xtb index 1946ad3e..a02ff6e 100644 --- a/ui/strings/translations/ui_strings_sr.xtb +++ b/ui/strings/translations/ui_strings_sr.xtb
@@ -1,6 +1,7 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="sr"> +<translation id="1028699632127661925">Шаље се на уређај <ph name="DEVICE_NAME" />...</translation> <translation id="111910763555783249">Подешавања обавештења</translation> <translation id="1127811143501539442">{DAYS,plural, =1{Пре 1 дан}one{Пре # дан}few{Пре # дана}other{Пре # дана}}</translation> <translation id="1156623771253174079">{SECONDS,plural, =1{Пре 1 минут}one{Пре # минут}few{Пре # минута}other{Пре # минута}}</translation> @@ -185,7 +186,6 @@ <translation id="8144660977431427332">Претраге омогућава Google помоћник. <ph name="LEARN_MORE" /></translation> <translation id="8152264887680882389"><ph name="TEXT" />, аутоматско довршавање</translation> <translation id="815598010540052116">Помери надоле</translation> -<translation id="8170087467028567933">Уклањањем овог предлога сакрићете га за свој налог на свим уређајима.</translation> <translation id="8179976553408161302">Enter</translation> <translation id="8210608804940886430">Страница надоле</translation> <translation id="8245914219290430011">Табулатор</translation> @@ -196,7 +196,6 @@ <translation id="838869780401515933">изабери</translation> <translation id="8393700583063109961">Пошаљите поруку</translation> <translation id="8394908167088220973">Пуштање/паузирање медија</translation> -<translation id="8420205633584771378">Желите ли да уклоните овај предлог?</translation> <translation id="8458811141851741261">{YEARS,plural, =1{1 г}one{# г}few{# г}other{# г}}</translation> <translation id="8602707065186045623"><ph name="SAVEAS_EXTENSION_TYPE" /> датотека (.<ph name="SAVEAS_EXTENSION_NAME" />)</translation> <translation id="8649597172973390955">Полица се увек приказује</translation>
diff --git a/ui/strings/translations/ui_strings_sv.xtb b/ui/strings/translations/ui_strings_sv.xtb index 722770b..dafbd08e 100644 --- a/ui/strings/translations/ui_strings_sv.xtb +++ b/ui/strings/translations/ui_strings_sv.xtb
@@ -185,7 +185,6 @@ <translation id="8144660977431427332">Sökningarna görs med Google Assistent. <ph name="LEARN_MORE" /></translation> <translation id="8152264887680882389"><ph name="TEXT" />, autoslutför</translation> <translation id="815598010540052116">Rulla nedåt</translation> -<translation id="8170087467028567933">Om du tar bort förslaget döljs det i ditt konto på alla enheter.</translation> <translation id="8179976553408161302">Enter</translation> <translation id="8210608804940886430">Page Down</translation> <translation id="8245914219290430011">Flik</translation> @@ -196,7 +195,6 @@ <translation id="838869780401515933">kryssa för</translation> <translation id="8393700583063109961">Skicka meddelande</translation> <translation id="8394908167088220973">Spela upp/Pausa</translation> -<translation id="8420205633584771378">Ska förslaget tas bort?</translation> <translation id="8458811141851741261">{YEARS,plural, =1{1 år}other{# år}}</translation> <translation id="8602707065186045623"><ph name="SAVEAS_EXTENSION_TYPE" />-fil (.<ph name="SAVEAS_EXTENSION_NAME" />)</translation> <translation id="8649597172973390955">Hyllan visas alltid</translation>
diff --git a/ui/strings/translations/ui_strings_sw.xtb b/ui/strings/translations/ui_strings_sw.xtb index 9a2d289..9ccda0a 100644 --- a/ui/strings/translations/ui_strings_sw.xtb +++ b/ui/strings/translations/ui_strings_sw.xtb
@@ -1,6 +1,7 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="sw"> +<translation id="1028699632127661925">Unatuma kwenye <ph name="DEVICE_NAME" />...</translation> <translation id="111910763555783249">Mipangilio ya arifa</translation> <translation id="1127811143501539442">{DAYS,plural, =1{Siku 1 iliyopita}other{Siku # zilizopita}}</translation> <translation id="1156623771253174079">{SECONDS,plural, =1{Dakika 1 iliyopita}other{Dakika # zilizopita}}</translation> @@ -185,7 +186,6 @@ <translation id="8144660977431427332">Utafutaji wako unatekelezwa na programu ya Mratibu wa Google. <ph name="LEARN_MORE" /></translation> <translation id="8152264887680882389"><ph name="TEXT" />, Jaza kiotomatiki</translation> <translation id="815598010540052116">Sogeza Chini</translation> -<translation id="8170087467028567933">Kuondoa pendekezo hili kutalifanya lisionekane katika akaunti yako kwenye vifaa vyote.</translation> <translation id="8179976553408161302">Enter</translation> <translation id="8210608804940886430">Ukurasa mmoja chini</translation> <translation id="8245914219290430011">Kichupo</translation> @@ -196,7 +196,6 @@ <translation id="838869780401515933">chunguza</translation> <translation id="8393700583063109961">Tuma ujumbe</translation> <translation id="8394908167088220973">Cheza Media/Sitisha</translation> -<translation id="8420205633584771378">Je, ungependa kuondoa pendekezo hili?</translation> <translation id="8458811141851741261">{YEARS,plural, =1{Mwaka 1}other{Miaka #}}</translation> <translation id="8602707065186045623">Faili ya <ph name="SAVEAS_EXTENSION_TYPE" /> (.<ph name="SAVEAS_EXTENSION_NAME" />)</translation> <translation id="8649597172973390955">Rafu inaonyeshwa kila wakati</translation>
diff --git a/ui/strings/translations/ui_strings_ta.xtb b/ui/strings/translations/ui_strings_ta.xtb index 9cb6650..a531306 100644 --- a/ui/strings/translations/ui_strings_ta.xtb +++ b/ui/strings/translations/ui_strings_ta.xtb
@@ -185,7 +185,6 @@ <translation id="8144660977431427332">உங்கள் தேடல்கள் Google அசிஸ்டண்ட்டைப் பயன்படுத்தி தேடப்படுகின்றன. <ph name="LEARN_MORE" /></translation> <translation id="8152264887680882389"><ph name="TEXT" />, தானே நிரப்பியது</translation> <translation id="815598010540052116">கீழே உருட்டு</translation> -<translation id="8170087467028567933">இந்தப் பரிந்துரையை அகற்றினால், உங்கள் எல்லாச் சாதனங்களிலும் உள்ள உங்கள் கணக்கிலிருந்து இது மறைக்கப்படும்.</translation> <translation id="8179976553408161302">Enter</translation> <translation id="8210608804940886430">பக்கத்தின் கீழே</translation> <translation id="8245914219290430011">தாவல்</translation> @@ -196,7 +195,6 @@ <translation id="838869780401515933">சரிபார்</translation> <translation id="8393700583063109961">செய்தி அனுப்பு</translation> <translation id="8394908167088220973">ஊடகத்தை இயக்கு/இடைநிறுத்து</translation> -<translation id="8420205633584771378">இந்தப் பரிந்துரையை அகற்றவா?</translation> <translation id="8458811141851741261">{YEARS,plural, =1{1ஆ}other{#ஆ}}</translation> <translation id="8602707065186045623"><ph name="SAVEAS_EXTENSION_TYPE" />கோப்பு(.<ph name="SAVEAS_EXTENSION_NAME" />)</translation> <translation id="8649597172973390955">ஷெல்ஃப் எப்போதும் காட்டப்படும்</translation>
diff --git a/ui/strings/translations/ui_strings_te.xtb b/ui/strings/translations/ui_strings_te.xtb index de78646..cf4e839 100644 --- a/ui/strings/translations/ui_strings_te.xtb +++ b/ui/strings/translations/ui_strings_te.xtb
@@ -185,7 +185,6 @@ <translation id="8144660977431427332">మీ శోధనలు Google అసిస్టెంట్ ఆధారితంగా ఉంటాయి. <ph name="LEARN_MORE" /></translation> <translation id="8152264887680882389"><ph name="TEXT" />, స్వయంపూర్తి</translation> <translation id="815598010540052116">కిందికి స్క్రోల్ చేయి</translation> -<translation id="8170087467028567933">ఈ సూచనను తీసివేయడం వలన అది మీ అన్ని పరికరాలలోని మీ ఖాతా నుండి దానిని దాచి పెడుతుంది.</translation> <translation id="8179976553408161302">Enter</translation> <translation id="8210608804940886430">పేజీ క్రిందికి</translation> <translation id="8245914219290430011">ట్యాబ్</translation> @@ -196,7 +195,6 @@ <translation id="838869780401515933">తనిఖీ చేయి</translation> <translation id="8393700583063109961">సందేశాన్ని పంపండి</translation> <translation id="8394908167088220973">మీడియా ప్లే/పాజ్</translation> -<translation id="8420205633584771378">ఈ సూచనని తీసివేయలా?</translation> <translation id="8458811141851741261">{YEARS,plural, =1{1సం}other{#సం}}</translation> <translation id="8602707065186045623"><ph name="SAVEAS_EXTENSION_TYPE" /> ఫైల్ (.<ph name="SAVEAS_EXTENSION_NAME" />)</translation> <translation id="8649597172973390955">అర ఎల్లప్పుడూ చూపబడుతుంది</translation>
diff --git a/ui/strings/translations/ui_strings_th.xtb b/ui/strings/translations/ui_strings_th.xtb index 525357d..2f59d9a 100644 --- a/ui/strings/translations/ui_strings_th.xtb +++ b/ui/strings/translations/ui_strings_th.xtb
@@ -1,6 +1,7 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="th"> +<translation id="1028699632127661925">กำลังส่งไปที่ <ph name="DEVICE_NAME" />...</translation> <translation id="111910763555783249">การตั้งค่าการแจ้งเตือน</translation> <translation id="1127811143501539442">{DAYS,plural, =1{1 วันที่ผ่านมา}other{# วันที่ผ่านมา}}</translation> <translation id="1156623771253174079">{SECONDS,plural, =1{1 นาทีที่ผ่านมา}other{# นาทีที่ผ่านมา}}</translation> @@ -185,7 +186,6 @@ <translation id="8144660977431427332">การค้นหาของคุณขับเคลื่อนโดย Google Assistant <ph name="LEARN_MORE" /></translation> <translation id="8152264887680882389"><ph name="TEXT" /> เติมข้อความอัตโนมัติ</translation> <translation id="815598010540052116">เลื่อนลง</translation> -<translation id="8170087467028567933">การนำคำแนะนำนี้ออกจะเป็นการซ่อนคำแนะนำจากบัญชีของคุณในอุปกรณ์ทุกเครื่อง</translation> <translation id="8179976553408161302">Enter</translation> <translation id="8210608804940886430">เลื่อนหน้าลง</translation> <translation id="8245914219290430011">แท็บ</translation> @@ -196,7 +196,6 @@ <translation id="838869780401515933">ทำเครื่องหมาย</translation> <translation id="8393700583063109961">ส่งข้อความ</translation> <translation id="8394908167088220973">เล่น/หยุดสื่อชั่วคราว</translation> -<translation id="8420205633584771378">นำคำแนะนำนี้ออกไหม</translation> <translation id="8458811141851741261">{YEARS,plural, =1{1 ปี}other{# ปี}}</translation> <translation id="8602707065186045623">ไฟล์ <ph name="SAVEAS_EXTENSION_TYPE" /> (.<ph name="SAVEAS_EXTENSION_NAME" />)</translation> <translation id="8649597172973390955">แสดงชั้นวางเสมอ</translation>
diff --git a/ui/strings/translations/ui_strings_tr.xtb b/ui/strings/translations/ui_strings_tr.xtb index 9e855fa..b79abccb08 100644 --- a/ui/strings/translations/ui_strings_tr.xtb +++ b/ui/strings/translations/ui_strings_tr.xtb
@@ -185,7 +185,6 @@ <translation id="8144660977431427332">Aramalarınız Google Asistan tarafından desteklenmektedir. <ph name="LEARN_MORE" /></translation> <translation id="8152264887680882389"><ph name="TEXT" />, Otomatik tamamlama</translation> <translation id="815598010540052116">Aşağı Kaydır</translation> -<translation id="8170087467028567933">Bu öneriyi kaldırırsanız, öneri tüm cihazlarınızda hesabınızdan gizlenir.</translation> <translation id="8179976553408161302">Enter</translation> <translation id="8210608804940886430">Page Down</translation> <translation id="8245914219290430011">Sekme</translation> @@ -196,7 +195,6 @@ <translation id="838869780401515933">işaretle</translation> <translation id="8393700583063109961">İleti gönder</translation> <translation id="8394908167088220973">Medyayı Oynat/Duraklat</translation> -<translation id="8420205633584771378">Bu öneri kaldırılsın mı?</translation> <translation id="8458811141851741261">{YEARS,plural, =1{1 yıl}other{# yıl}}</translation> <translation id="8602707065186045623">Dosyayı <ph name="SAVEAS_EXTENSION_TYPE" /> (.<ph name="SAVEAS_EXTENSION_NAME" />)</translation> <translation id="8649597172973390955">Raf her zaman gösteriliyor</translation>
diff --git a/ui/strings/translations/ui_strings_uk.xtb b/ui/strings/translations/ui_strings_uk.xtb index 1a84e69..e4af9c4 100644 --- a/ui/strings/translations/ui_strings_uk.xtb +++ b/ui/strings/translations/ui_strings_uk.xtb
@@ -185,7 +185,6 @@ <translation id="8144660977431427332">Ваші пошукові запити виконуються за технологією Google Асистента. <ph name="LEARN_MORE" /></translation> <translation id="8152264887680882389"><ph name="TEXT" />: автозавершення</translation> <translation id="815598010540052116">Прокрутка вниз</translation> -<translation id="8170087467028567933">Якщо видалити цю пропозицію, вона не з’являтиметься в обліковому записі на всіх ваших пристроях.</translation> <translation id="8179976553408161302">Enter</translation> <translation id="8210608804940886430">Сторінка вниз</translation> <translation id="8245914219290430011">Tab</translation> @@ -196,7 +195,6 @@ <translation id="838869780401515933">установити прапорець</translation> <translation id="8393700583063109961">Надіслати повідомлення</translation> <translation id="8394908167088220973">Відтворити чи призупинити</translation> -<translation id="8420205633584771378">Видалити цю пропозицію?</translation> <translation id="8458811141851741261">{YEARS,plural, =1{1 р.}one{# р.}few{# р.}many{# р.}other{# р.}}</translation> <translation id="8602707065186045623">файл <ph name="SAVEAS_EXTENSION_TYPE" /> (.<ph name="SAVEAS_EXTENSION_NAME" />)</translation> <translation id="8649597172973390955">Полицю завжди видно</translation>
diff --git a/ui/strings/translations/ui_strings_vi.xtb b/ui/strings/translations/ui_strings_vi.xtb index 3541789c..1934293 100644 --- a/ui/strings/translations/ui_strings_vi.xtb +++ b/ui/strings/translations/ui_strings_vi.xtb
@@ -185,7 +185,6 @@ <translation id="8144660977431427332">Các nội dung tìm kiếm của bạn được Trợ lý Google hỗ trợ. <ph name="LEARN_MORE" /></translation> <translation id="8152264887680882389"><ph name="TEXT" />, Tự động hoàn thành</translation> <translation id="815598010540052116">Cuộn Xuống</translation> -<translation id="8170087467028567933">Nếu bạn xóa nội dung đề xuất này, thì nội dung đề xuất này sẽ ẩn khỏi tài khoản của bạn trên tất cả thiết bị.</translation> <translation id="8179976553408161302">Enter</translation> <translation id="8210608804940886430">Trang Dưới</translation> <translation id="8245914219290430011">Tab</translation> @@ -196,7 +195,6 @@ <translation id="838869780401515933">chọn</translation> <translation id="8393700583063109961">Gửi tin nhắn</translation> <translation id="8394908167088220973">Phát/Tạm dừng trình phát phương tiện</translation> -<translation id="8420205633584771378">Xóa đề xuất này?</translation> <translation id="8458811141851741261">{YEARS,plural, =1{1 năm}other{# năm}}</translation> <translation id="8602707065186045623">Tệp <ph name="SAVEAS_EXTENSION_TYPE" /> (.<ph name="SAVEAS_EXTENSION_NAME" />)</translation> <translation id="8649597172973390955">Giá luôn hiển thị</translation>
diff --git a/ui/strings/translations/ui_strings_zh-CN.xtb b/ui/strings/translations/ui_strings_zh-CN.xtb index f446618..8428d0e1 100644 --- a/ui/strings/translations/ui_strings_zh-CN.xtb +++ b/ui/strings/translations/ui_strings_zh-CN.xtb
@@ -185,7 +185,6 @@ <translation id="8144660977431427332">您的搜索由 Google 助理提供支持。<ph name="LEARN_MORE" /></translation> <translation id="8152264887680882389"><ph name="TEXT" />,自动填充</translation> <translation id="815598010540052116">向下滚动</translation> -<translation id="8170087467028567933">移除这项推荐内容会致使它停止在您的帐号中显示(无论您使用何种设备)。</translation> <translation id="8179976553408161302">Enter</translation> <translation id="8210608804940886430">向下翻页</translation> <translation id="8245914219290430011">Tab</translation> @@ -196,7 +195,6 @@ <translation id="838869780401515933">选中</translation> <translation id="8393700583063109961">发送消息</translation> <translation id="8394908167088220973">媒体播放/暂停</translation> -<translation id="8420205633584771378">移除这项推荐内容?</translation> <translation id="8458811141851741261">{YEARS,plural, =1{1 年}other{# 年}}</translation> <translation id="8602707065186045623"><ph name="SAVEAS_EXTENSION_TYPE" /> 文件 (.<ph name="SAVEAS_EXTENSION_NAME" />)</translation> <translation id="8649597172973390955">一律显示任务栏</translation>
diff --git a/ui/strings/translations/ui_strings_zh-TW.xtb b/ui/strings/translations/ui_strings_zh-TW.xtb index 7e467b5b2..b32f8d0 100644 --- a/ui/strings/translations/ui_strings_zh-TW.xtb +++ b/ui/strings/translations/ui_strings_zh-TW.xtb
@@ -185,7 +185,6 @@ <translation id="8144660977431427332">你的搜尋結果由 Google 助理提供。<ph name="LEARN_MORE" /></translation> <translation id="8152264887680882389"><ph name="TEXT" />,自動完成</translation> <translation id="815598010540052116">向下捲動</translation> -<translation id="8170087467028567933">如果移除這項建議,你的帳戶會在所有裝置上隱藏該建議。</translation> <translation id="8179976553408161302">Enter</translation> <translation id="8210608804940886430">向下翻頁</translation> <translation id="8245914219290430011">Tab 鍵</translation> @@ -196,7 +195,6 @@ <translation id="838869780401515933">選取</translation> <translation id="8393700583063109961">傳送訊息</translation> <translation id="8394908167088220973">媒體播放/暫停</translation> -<translation id="8420205633584771378">要移除這項建議嗎?</translation> <translation id="8458811141851741261">{YEARS,plural, =1{1 年}other{# 年}}</translation> <translation id="8602707065186045623"><ph name="SAVEAS_EXTENSION_TYPE" /> 檔案 (.<ph name="SAVEAS_EXTENSION_NAME" />)</translation> <translation id="8649597172973390955">一律顯示檔案櫃</translation>
diff --git a/ui/views/accessibility/ax_root_obj_wrapper.cc b/ui/views/accessibility/ax_root_obj_wrapper.cc index e03f06a..c5bc7b0 100644 --- a/ui/views/accessibility/ax_root_obj_wrapper.cc +++ b/ui/views/accessibility/ax_root_obj_wrapper.cc
@@ -32,7 +32,7 @@ bool AXRootObjWrapper::HasChild(views::AXAuraObjWrapper* child) { std::vector<views::AXAuraObjWrapper*> children; GetChildren(&children); - return base::ContainsValue(children, child); + return base::Contains(children, child); } bool AXRootObjWrapper::IsIgnored() {
diff --git a/ui/views/accessibility/view_ax_platform_node_delegate_auralinux.cc b/ui/views/accessibility/view_ax_platform_node_delegate_auralinux.cc index 226ce123..cd191e5f 100644 --- a/ui/views/accessibility/view_ax_platform_node_delegate_auralinux.cc +++ b/ui/views/accessibility/view_ax_platform_node_delegate_auralinux.cc
@@ -50,7 +50,7 @@ return; widget = widget->GetTopLevelWidget(); - if (base::ContainsValue(widgets_, widget)) + if (base::Contains(widgets_, widget)) return; widgets_.push_back(widget);
diff --git a/ui/views/animation/installable_ink_drop.cc b/ui/views/animation/installable_ink_drop.cc index 8e826ee4..46d17cb 100644 --- a/ui/views/animation/installable_ink_drop.cc +++ b/ui/views/animation/installable_ink_drop.cc
@@ -4,18 +4,64 @@ #include "ui/views/animation/installable_ink_drop.h" +#include <algorithm> + #include "base/logging.h" +#include "base/memory/ptr_util.h" +#include "cc/paint/paint_flags.h" +#include "third_party/skia/include/core/SkColor.h" +#include "third_party/skia/include/core/SkPath.h" +#include "ui/compositor/layer.h" +#include "ui/compositor/paint_context.h" +#include "ui/compositor/paint_recorder.h" +#include "ui/gfx/canvas.h" +#include "ui/gfx/geometry/rect.h" +#include "ui/gfx/geometry/rect_f.h" +#include "ui/gfx/geometry/size.h" +#include "ui/gfx/skia_util.h" +#include "ui/views/view.h" +#include "ui/views/view_class_properties.h" + +namespace { +constexpr SkColor kInstallableInkDropPlaceholderColor = + SkColorSetA(SK_ColorBLACK, 0.08 * SK_AlphaOPAQUE); +} // namespace namespace views { const base::Feature kInstallableInkDropFeature{ "InstallableInkDrop", base::FEATURE_DISABLED_BY_DEFAULT}; -InstallableInkDrop::InstallableInkDrop() = default; +InstallableInkDrop::InstallableInkDrop(View* view) + : view_(view), + event_handler_(view_, this), + layer_(std::make_unique<ui::Layer>()) { + // Catch if |view_| is destroyed out from under us. + if (DCHECK_IS_ON()) + view_->AddObserver(this); -InstallableInkDrop::~InstallableInkDrop() = default; + layer_->set_delegate(this); + layer_->SetFillsBoundsOpaquely(false); + layer_->SetFillsBoundsCompletely(false); + view_->AddLayerBeneathView(layer_.get()); -void InstallableInkDrop::HostSizeChanged(const gfx::Size& new_size) {} + // AddLayerBeneathView() changes the location of |layer_| so this must be done + // after. + layer_->SetBounds(gfx::Rect(view_->size()) + + layer_->bounds().OffsetFromOrigin()); + layer_->SchedulePaint(gfx::Rect(layer_->size())); +} + +InstallableInkDrop::~InstallableInkDrop() { + view_->RemoveLayerBeneathView(layer_.get()); + if (DCHECK_IS_ON()) + view_->RemoveObserver(this); +} + +void InstallableInkDrop::HostSizeChanged(const gfx::Size& new_size) { + layer_->SetBounds(gfx::Rect(new_size) + layer_->bounds().OffsetFromOrigin()); + layer_->SchedulePaint(gfx::Rect(layer_->size())); +} InkDropState InstallableInkDrop::GetTargetInkDropState() const { return current_state_; @@ -33,13 +79,9 @@ NOTREACHED(); } -void InstallableInkDrop::SnapToActivated() { - NOTREACHED(); -} +void InstallableInkDrop::SnapToActivated() {} -void InstallableInkDrop::SnapToHidden() { - NOTREACHED(); -} +void InstallableInkDrop::SnapToHidden() {} void InstallableInkDrop::SetHovered(bool is_hovered) {} @@ -57,4 +99,56 @@ NOTREACHED(); } +InkDrop* InstallableInkDrop::GetInkDrop() { + return this; +} + +bool InstallableInkDrop::HasInkDrop() const { + return true; +} + +bool InstallableInkDrop::SupportsGestureEvents() const { + return true; +} + +void InstallableInkDrop::OnViewIsDeleting(View* observed_view) { + DCHECK_EQ(view_, observed_view); + NOTREACHED() << "|this| needs to outlive the view it's installed on"; +} + +void InstallableInkDrop::OnPaintLayer(const ui::PaintContext& context) { + DCHECK(view_->size() == layer_->size()); + + ui::PaintRecorder paint_recorder(context, layer_->size()); + gfx::Canvas* canvas = paint_recorder.canvas(); + + cc::PaintFlags flags; + flags.setStyle(cc::PaintFlags::kFill_Style); + flags.setColor(kInstallableInkDropPlaceholderColor); + + canvas->DrawPath(GetHighlightPathForView(view_), flags); +} + +void InstallableInkDrop::OnDeviceScaleFactorChanged( + float old_device_scale_factor, + float new_device_scale_factor) {} + +// static +SkPath InstallableInkDrop::GetHighlightPathForView(const View* view) { + // Use the provided highlight path if there is one. + const SkPath* const path_property = view->GetProperty(kHighlightPathKey); + if (path_property) + return *path_property; + + // Otherwise, construct a default path. This will be pill shaped, or circular + // when |view| is square. + SkPath path; + + const float radius = + std::min(view->size().width(), view->size().height()) / 2.0f; + path.addRoundRect(gfx::RectToSkRect(view->GetLocalBounds()), radius, radius); + + return path; +} + } // namespace views
diff --git a/ui/views/animation/installable_ink_drop.h b/ui/views/animation/installable_ink_drop.h index 0670195..6990688 100644 --- a/ui/views/animation/installable_ink_drop.h +++ b/ui/views/animation/installable_ink_drop.h
@@ -5,25 +5,49 @@ #ifndef UI_VIEWS_ANIMATION_INSTALLABLE_INK_DROP_H_ #define UI_VIEWS_ANIMATION_INSTALLABLE_INK_DROP_H_ +#include <memory> + #include "base/feature_list.h" -#include "ui/gfx/geometry/size.h" +#include "ui/compositor/layer_delegate.h" #include "ui/views/animation/ink_drop.h" +#include "ui/views/animation/ink_drop_event_handler.h" #include "ui/views/animation/ink_drop_state.h" +#include "ui/views/view_observer.h" #include "ui/views/views_export.h" +class SkPath; + +namespace gfx { +class Size; +} // namespace gfx + +namespace ui { +class Layer; +class PaintContext; +} // namespace ui + namespace views { +class View; + extern const VIEWS_EXPORT base::Feature kInstallableInkDropFeature; // Stub for future InkDrop implementation that will be installable on any View // without needing InkDropHostView. This is currently non-functional and fails // on some method calls. TODO(crbug.com/931964): implement the necessary parts // of the API and remove the rest from the InkDrop interface. -class VIEWS_EXPORT InstallableInkDrop : public InkDrop { +class VIEWS_EXPORT InstallableInkDrop : public InkDrop, + public InkDropEventHandler::Delegate, + public ui::LayerDelegate, + public ViewObserver { public: - InstallableInkDrop(); + // Create ink drop for |view|. Note that |view| must live longer than us. + explicit InstallableInkDrop(View* view); ~InstallableInkDrop() override; + // Should only be used for inspecting properties of the layer in tests. + const ui::Layer* layer_for_testing() const { return layer_.get(); } + // InkDrop: void HostSizeChanged(const gfx::Size& new_size) override; InkDropState GetTargetInkDropState() const override; @@ -38,7 +62,35 @@ void SetShowHighlightOnHover(bool show_highlight_on_hover) override; void SetShowHighlightOnFocus(bool show_highlight_on_focus) override; + // InkDropEventHandler::Delegate: + InkDrop* GetInkDrop() override; + bool HasInkDrop() const override; + bool SupportsGestureEvents() const override; + + // ViewObserver: + void OnViewIsDeleting(View* observed_view) override; + + // ui::LayerDelegate: + void OnPaintLayer(const ui::PaintContext& context) override; + void OnDeviceScaleFactorChanged(float old_device_scale_factor, + float new_device_scale_factor) override; + + // Gets the path that the ink drop fills in for the highlight. This uses + // |kHighlightPathKey| if provided but falls back to a pill-shaped path. + static SkPath GetHighlightPathForView(const View* view); + private: + // The view this ink drop is showing for. |layer_| is added to the layer + // hierarchy that |view_| belongs to. We track events on |view_| to update our + // visual state. + View* const view_; + + // Observes |view_| and updates our visual state accordingly. + InkDropEventHandler event_handler_; + + // The layer we paint to. + std::unique_ptr<ui::Layer> layer_; + InkDropState current_state_ = InkDropState::HIDDEN; };
diff --git a/ui/views/animation/installable_ink_drop_unittest.cc b/ui/views/animation/installable_ink_drop_unittest.cc index d75acae..0968bc9 100644 --- a/ui/views/animation/installable_ink_drop_unittest.cc +++ b/ui/views/animation/installable_ink_drop_unittest.cc
@@ -4,20 +4,67 @@ #include "ui/views/animation/installable_ink_drop.h" +#include <memory> + #include "testing/gtest/include/gtest/gtest.h" +#include "third_party/skia/include/core/SkPath.h" +#include "ui/gfx/geometry/rect.h" #include "ui/views/animation/ink_drop_state.h" +#include "ui/views/view.h" +#include "ui/views/view_class_properties.h" namespace views { -TEST(InstallableInkDropTest, UpdatesState) { - InstallableInkDrop installable_ink_drop; +class InstallableInkDropTest : public ::testing::Test { + protected: + void SetUp() override { + // Ink drop layers get installed as siblings to their host view's + // layer. Hence, there needs to be a root view with a layer above them. + root_view_.SetPaintToLayer(); + } + + View* root_view() { return &root_view_; } + + private: + View root_view_; +}; + +TEST_F(InstallableInkDropTest, LayerIsAddedAndRemoved) { + View* view = root_view()->AddChildView(std::make_unique<View>()); + view->SetPaintToLayer(); + EXPECT_EQ(1, static_cast<int>(root_view()->layer()->children().size())); + + { + InstallableInkDrop ink_drop(view); + EXPECT_EQ(2, static_cast<int>(root_view()->layer()->children().size())); + } + + EXPECT_EQ(1, static_cast<int>(root_view()->layer()->children().size())); +} + +TEST_F(InstallableInkDropTest, LayerSizeTracksViewSize) { + View* view = root_view()->AddChildView(std::make_unique<View>()); + view->SetBoundsRect(gfx::Rect(0, 0, 10, 10)); + + InstallableInkDrop ink_drop(view); + EXPECT_EQ(view->size(), ink_drop.layer_for_testing()->size()); + + view->SetBoundsRect(gfx::Rect(0, 0, 20, 15)); + EXPECT_EQ(view->size(), ink_drop.layer_for_testing()->size()); + + view->SetBoundsRect(gfx::Rect(10, 10, 30, 30)); + EXPECT_EQ(view->size(), ink_drop.layer_for_testing()->size()); +} + +TEST_F(InstallableInkDropTest, UpdatesState) { + View* view = root_view()->AddChildView(std::make_unique<View>()); + InstallableInkDrop ink_drop(view); // Initial state should be HIDDEN. - EXPECT_EQ(installable_ink_drop.GetTargetInkDropState(), InkDropState::HIDDEN); + EXPECT_EQ(ink_drop.GetTargetInkDropState(), InkDropState::HIDDEN); - installable_ink_drop.AnimateToState(InkDropState::ACTIVATED); - EXPECT_EQ(installable_ink_drop.GetTargetInkDropState(), - InkDropState::ACTIVATED); + ink_drop.AnimateToState(InkDropState::ACTIVATED); + EXPECT_EQ(ink_drop.GetTargetInkDropState(), InkDropState::ACTIVATED); } } // namespace views
diff --git a/ui/views/controls/editable_combobox/editable_combobox.cc b/ui/views/controls/editable_combobox/editable_combobox.cc index 23b6e4f..664f90e 100644 --- a/ui/views/controls/editable_combobox/editable_combobox.cc +++ b/ui/views/controls/editable_combobox/editable_combobox.cc
@@ -103,6 +103,13 @@ PaintComboboxArrow(color_, arrow_bounds, canvas); } + void GetAccessibleNodeData(ui::AXNodeData* node_data) override { + node_data->role = ax::mojom::Role::kPopUpButton; + node_data->SetHasPopup(ax::mojom::HasPopup::kMenu); + if (GetEnabled()) + node_data->SetDefaultActionVerb(ax::mojom::DefaultActionVerb::kOpen); + } + const SkColor color_; DISALLOW_COPY_AND_ASSIGN(Arrow);
diff --git a/ui/views/layout/grid_layout.cc b/ui/views/layout/grid_layout.cc index c5565437..fdd98437 100644 --- a/ui/views/layout/grid_layout.cc +++ b/ui/views/layout/grid_layout.cc
@@ -516,7 +516,7 @@ DCHECK(master_columns_.empty()); for (const auto& column : columns_) { Column* master_column = column->GetLastMasterColumn(); - if (master_column && !base::ContainsValue(master_columns_, master_column)) { + if (master_column && !base::Contains(master_columns_, master_column)) { master_columns_.push_back(master_column); } // At this point, GetLastMasterColumn may not == master_column
diff --git a/ui/views/resources/default_100_percent/common/blue_button.png b/ui/views/resources/default_100_percent/common/blue_button.png deleted file mode 100644 index ada819b..0000000 --- a/ui/views/resources/default_100_percent/common/blue_button.png +++ /dev/null Binary files differ
diff --git a/ui/views/resources/default_100_percent/common/blue_button_focused.png b/ui/views/resources/default_100_percent/common/blue_button_focused.png deleted file mode 100644 index efbf151..0000000 --- a/ui/views/resources/default_100_percent/common/blue_button_focused.png +++ /dev/null Binary files differ
diff --git a/ui/views/resources/default_100_percent/common/blue_button_focused_hover.png b/ui/views/resources/default_100_percent/common/blue_button_focused_hover.png deleted file mode 100644 index e3ead548..0000000 --- a/ui/views/resources/default_100_percent/common/blue_button_focused_hover.png +++ /dev/null Binary files differ
diff --git a/ui/views/resources/default_100_percent/common/blue_button_focused_pressed.png b/ui/views/resources/default_100_percent/common/blue_button_focused_pressed.png deleted file mode 100644 index 83a0884..0000000 --- a/ui/views/resources/default_100_percent/common/blue_button_focused_pressed.png +++ /dev/null Binary files differ
diff --git a/ui/views/resources/default_100_percent/common/blue_button_hover.png b/ui/views/resources/default_100_percent/common/blue_button_hover.png deleted file mode 100644 index 99a23d2..0000000 --- a/ui/views/resources/default_100_percent/common/blue_button_hover.png +++ /dev/null Binary files differ
diff --git a/ui/views/resources/default_100_percent/common/blue_button_inactive.png b/ui/views/resources/default_100_percent/common/blue_button_inactive.png deleted file mode 100644 index 4f4e1ae..0000000 --- a/ui/views/resources/default_100_percent/common/blue_button_inactive.png +++ /dev/null Binary files differ
diff --git a/ui/views/resources/default_100_percent/common/blue_button_pressed.png b/ui/views/resources/default_100_percent/common/blue_button_pressed.png deleted file mode 100644 index 0ab01706..0000000 --- a/ui/views/resources/default_100_percent/common/blue_button_pressed.png +++ /dev/null Binary files differ
diff --git a/ui/views/resources/default_100_percent/common/button.png b/ui/views/resources/default_100_percent/common/button.png deleted file mode 100644 index 698c17b..0000000 --- a/ui/views/resources/default_100_percent/common/button.png +++ /dev/null Binary files differ
diff --git a/ui/views/resources/default_100_percent/common/button_focused.png b/ui/views/resources/default_100_percent/common/button_focused.png deleted file mode 100644 index e77fe42e..0000000 --- a/ui/views/resources/default_100_percent/common/button_focused.png +++ /dev/null Binary files differ
diff --git a/ui/views/resources/default_100_percent/common/button_focused_hover.png b/ui/views/resources/default_100_percent/common/button_focused_hover.png deleted file mode 100644 index ec427d0..0000000 --- a/ui/views/resources/default_100_percent/common/button_focused_hover.png +++ /dev/null Binary files differ
diff --git a/ui/views/resources/default_100_percent/common/button_focused_pressed.png b/ui/views/resources/default_100_percent/common/button_focused_pressed.png deleted file mode 100644 index fcbd008..0000000 --- a/ui/views/resources/default_100_percent/common/button_focused_pressed.png +++ /dev/null Binary files differ
diff --git a/ui/views/resources/default_100_percent/common/button_hover.png b/ui/views/resources/default_100_percent/common/button_hover.png deleted file mode 100644 index 91905b3..0000000 --- a/ui/views/resources/default_100_percent/common/button_hover.png +++ /dev/null Binary files differ
diff --git a/ui/views/resources/default_100_percent/common/button_inactive.png b/ui/views/resources/default_100_percent/common/button_inactive.png deleted file mode 100644 index 07484039..0000000 --- a/ui/views/resources/default_100_percent/common/button_inactive.png +++ /dev/null Binary files differ
diff --git a/ui/views/resources/default_100_percent/common/button_pressed.png b/ui/views/resources/default_100_percent/common/button_pressed.png deleted file mode 100644 index 6610da3..0000000 --- a/ui/views/resources/default_100_percent/common/button_pressed.png +++ /dev/null Binary files differ
diff --git a/ui/views/resources/default_200_percent/common/blue_button.png b/ui/views/resources/default_200_percent/common/blue_button.png deleted file mode 100644 index 9798989..0000000 --- a/ui/views/resources/default_200_percent/common/blue_button.png +++ /dev/null Binary files differ
diff --git a/ui/views/resources/default_200_percent/common/blue_button_focused.png b/ui/views/resources/default_200_percent/common/blue_button_focused.png deleted file mode 100644 index e0a65b7..0000000 --- a/ui/views/resources/default_200_percent/common/blue_button_focused.png +++ /dev/null Binary files differ
diff --git a/ui/views/resources/default_200_percent/common/blue_button_focused_hover.png b/ui/views/resources/default_200_percent/common/blue_button_focused_hover.png deleted file mode 100644 index 5516ba9..0000000 --- a/ui/views/resources/default_200_percent/common/blue_button_focused_hover.png +++ /dev/null Binary files differ
diff --git a/ui/views/resources/default_200_percent/common/blue_button_focused_pressed.png b/ui/views/resources/default_200_percent/common/blue_button_focused_pressed.png deleted file mode 100644 index 7e1ad4c3..0000000 --- a/ui/views/resources/default_200_percent/common/blue_button_focused_pressed.png +++ /dev/null Binary files differ
diff --git a/ui/views/resources/default_200_percent/common/blue_button_hover.png b/ui/views/resources/default_200_percent/common/blue_button_hover.png deleted file mode 100644 index f725d4ec..0000000 --- a/ui/views/resources/default_200_percent/common/blue_button_hover.png +++ /dev/null Binary files differ
diff --git a/ui/views/resources/default_200_percent/common/blue_button_inactive.png b/ui/views/resources/default_200_percent/common/blue_button_inactive.png deleted file mode 100644 index 63065b8..0000000 --- a/ui/views/resources/default_200_percent/common/blue_button_inactive.png +++ /dev/null Binary files differ
diff --git a/ui/views/resources/default_200_percent/common/blue_button_pressed.png b/ui/views/resources/default_200_percent/common/blue_button_pressed.png deleted file mode 100644 index 8d54141..0000000 --- a/ui/views/resources/default_200_percent/common/blue_button_pressed.png +++ /dev/null Binary files differ
diff --git a/ui/views/resources/default_200_percent/common/button.png b/ui/views/resources/default_200_percent/common/button.png deleted file mode 100644 index 9845946..0000000 --- a/ui/views/resources/default_200_percent/common/button.png +++ /dev/null Binary files differ
diff --git a/ui/views/resources/default_200_percent/common/button_focused.png b/ui/views/resources/default_200_percent/common/button_focused.png deleted file mode 100644 index 72089d7e..0000000 --- a/ui/views/resources/default_200_percent/common/button_focused.png +++ /dev/null Binary files differ
diff --git a/ui/views/resources/default_200_percent/common/button_focused_hover.png b/ui/views/resources/default_200_percent/common/button_focused_hover.png deleted file mode 100644 index 7b4f421..0000000 --- a/ui/views/resources/default_200_percent/common/button_focused_hover.png +++ /dev/null Binary files differ
diff --git a/ui/views/resources/default_200_percent/common/button_focused_pressed.png b/ui/views/resources/default_200_percent/common/button_focused_pressed.png deleted file mode 100644 index c5e258b..0000000 --- a/ui/views/resources/default_200_percent/common/button_focused_pressed.png +++ /dev/null Binary files differ
diff --git a/ui/views/resources/default_200_percent/common/button_hover.png b/ui/views/resources/default_200_percent/common/button_hover.png deleted file mode 100644 index 81aa8ff..0000000 --- a/ui/views/resources/default_200_percent/common/button_hover.png +++ /dev/null Binary files differ
diff --git a/ui/views/resources/default_200_percent/common/button_inactive.png b/ui/views/resources/default_200_percent/common/button_inactive.png deleted file mode 100644 index 34cb782..0000000 --- a/ui/views/resources/default_200_percent/common/button_inactive.png +++ /dev/null Binary files differ
diff --git a/ui/views/resources/default_200_percent/common/button_pressed.png b/ui/views/resources/default_200_percent/common/button_pressed.png deleted file mode 100644 index 3353d8c1..0000000 --- a/ui/views/resources/default_200_percent/common/button_pressed.png +++ /dev/null Binary files differ
diff --git a/ui/views/resources/views_resources.grd b/ui/views/resources/views_resources.grd index 3fbd5da7..8ae34dd4 100644 --- a/ui/views/resources/views_resources.grd +++ b/ui/views/resources/views_resources.grd
@@ -15,13 +15,6 @@ <structure type="chrome_scaled_image" name="IDR_APP_TOP_CENTER" file="app_top_center.png" /> <structure type="chrome_scaled_image" name="IDR_APP_TOP_LEFT" file="app_top_left.png" /> <structure type="chrome_scaled_image" name="IDR_APP_TOP_RIGHT" file="app_top_right.png" /> - <structure type="chrome_scaled_image" name="IDR_BUTTON_DISABLED" file="common/button_inactive.png" /> - <structure type="chrome_scaled_image" name="IDR_BUTTON_FOCUSED_HOVER" file="common/button_focused_hover.png" /> - <structure type="chrome_scaled_image" name="IDR_BUTTON_FOCUSED_NORMAL" file="common/button_focused.png" /> - <structure type="chrome_scaled_image" name="IDR_BUTTON_FOCUSED_PRESSED" file="common/button_focused_pressed.png" /> - <structure type="chrome_scaled_image" name="IDR_BUTTON_HOVER" file="common/button_hover.png" /> - <structure type="chrome_scaled_image" name="IDR_BUTTON_NORMAL" file="common/button.png" /> - <structure type="chrome_scaled_image" name="IDR_BUTTON_PRESSED" file="common/button_pressed.png" /> <structure type="chrome_scaled_image" name="IDR_CLOSE" file="close.png" /> <structure type="chrome_scaled_image" name="IDR_CLOSE_H" file="close_hover.png" /> <structure type="chrome_scaled_image" name="IDR_CLOSE_P" file="close_pressed.png" />
diff --git a/ui/views/view.cc b/ui/views/view.cc index 6b8b0fb4..f0d165b 100644 --- a/ui/views/view.cc +++ b/ui/views/view.cc
@@ -543,8 +543,7 @@ void View::AddLayerBeneathView(ui::Layer* new_layer) { DCHECK(new_layer); - DCHECK(!base::ContainsValue(layers_beneath_, new_layer)) - << "Layer already added."; + DCHECK(!base::Contains(layers_beneath_, new_layer)) << "Layer already added."; new_layer->AddObserver(this); new_layer->SetVisible(GetVisible()); @@ -1257,7 +1256,7 @@ if (!accelerators_) accelerators_ = std::make_unique<std::vector<ui::Accelerator>>(); - if (!base::ContainsValue(*accelerators_, accelerator)) + if (!base::Contains(*accelerators_, accelerator)) accelerators_->push_back(accelerator); RegisterPendingAccelerators();
diff --git a/ui/views/view_unittest.cc b/ui/views/view_unittest.cc index dbca39a..d9013f9 100644 --- a/ui/views/view_unittest.cc +++ b/ui/views/view_unittest.cc
@@ -3648,8 +3648,8 @@ View::Views views; v1.GetViewsInGroup(kGroup, &views); EXPECT_EQ(2U, views.size()); - EXPECT_TRUE(base::ContainsValue(views, &v3)); - EXPECT_TRUE(base::ContainsValue(views, &v4)); + EXPECT_TRUE(base::Contains(views, &v3)); + EXPECT_TRUE(base::Contains(views, &v4)); } TEST_F(ViewTest, AddExistingChild) {
diff --git a/ui/views/widget/desktop_aura/desktop_window_tree_host_x11_unittest.cc b/ui/views/widget/desktop_aura/desktop_window_tree_host_x11_unittest.cc index 2578d41..702502cf 100644 --- a/ui/views/widget/desktop_aura/desktop_window_tree_host_x11_unittest.cc +++ b/ui/views/widget/desktop_aura/desktop_window_tree_host_x11_unittest.cc
@@ -52,7 +52,7 @@ bool ShouldKeepOnWaiting(const ui::PlatformEvent& event) override { std::vector<Atom> hints; if (ui::GetAtomArrayProperty(xwindow(), "_NET_WM_STATE", &hints)) - return base::ContainsValue(hints, gfx::GetAtom(hint_)) != wait_till_set_; + return base::Contains(hints, gfx::GetAtom(hint_)) != wait_till_set_; return true; }
diff --git a/ui/views/widget/desktop_aura/x11_topmost_window_finder_interactive_uitest.cc b/ui/views/widget/desktop_aura/x11_topmost_window_finder_interactive_uitest.cc index 784577da..100a1e8 100644 --- a/ui/views/widget/desktop_aura/x11_topmost_window_finder_interactive_uitest.cc +++ b/ui/views/widget/desktop_aura/x11_topmost_window_finder_interactive_uitest.cc
@@ -41,8 +41,7 @@ bool ShouldKeepOnWaiting(const ui::PlatformEvent& event) override { std::vector<Atom> wm_states; if (ui::GetAtomArrayProperty(xwindow(), "_NET_WM_STATE", &wm_states)) { - return !base::ContainsValue(wm_states, - gfx::GetAtom("_NET_WM_STATE_HIDDEN")); + return !base::Contains(wm_states, gfx::GetAtom("_NET_WM_STATE_HIDDEN")); } return true; } @@ -79,7 +78,7 @@ ui::GetXWindowStack(ui::GetX11RootWindow(), &stack); return !std::all_of( expected_windows_.cbegin(), expected_windows_.cend(), - [&stack](XID window) { return base::ContainsValue(stack, window); }); + [&stack](XID window) { return base::Contains(stack, window); }); } std::vector<XID> expected_windows_;
diff --git a/ui/webui/resources/cr_components/certificate_manager/ca_trust_edit_dialog.html b/ui/webui/resources/cr_components/certificate_manager/ca_trust_edit_dialog.html index 6483cef..0d34ac48 100644 --- a/ui/webui/resources/cr_components/certificate_manager/ca_trust_edit_dialog.html +++ b/ui/webui/resources/cr_components/certificate_manager/ca_trust_edit_dialog.html
@@ -1,17 +1,16 @@ <link rel="import" href="chrome://resources/html/polymer.html"> +<link rel="import" href="chrome://resources/cr_elements/cr_button/cr_button.html"> <link rel="import" href="chrome://resources/cr_elements/cr_checkbox/cr_checkbox.html"> <link rel="import" href="chrome://resources/cr_elements/cr_dialog/cr_dialog.html"> -<link rel="import" href="chrome://resources/cr_elements/paper_button_style_css.html"> <link rel="import" href="chrome://resources/html/i18n_behavior.html"> -<link rel="import" href="chrome://resources/polymer/v1_0/paper-button/paper-button.html"> <link rel="import" href="chrome://resources/polymer/v1_0/paper-spinner/paper-spinner-lite.html"> <link rel="import" href="certificate_shared_css.html"> <link rel="import" href="certificates_browser_proxy.html"> <dom-module id="ca-trust-edit-dialog"> <template> - <style include="certificate-shared paper-button-style"> + <style include="certificate-shared"> cr-checkbox, #description { margin: 15px 0; @@ -39,12 +38,12 @@ </div> <div slot="button-container"> <paper-spinner-lite id="spinner"></paper-spinner-lite> - <paper-button class="cancel-button" on-tap="onCancelTap_"> + <cr-button class="cancel-button" on-click="onCancelTap_"> [[i18n('cancel')]] - </paper-button> - <paper-button id="ok" class="action-button" on-tap="onOkTap_"> + </cr-button> + <cr-button id="ok" class="action-button" on-click="onOkTap_"> [[i18n('ok')]] - </paper-button> + </cr-button> </div> </cr-dialog> </template>
diff --git a/ui/webui/resources/cr_components/certificate_manager/certificate_delete_confirmation_dialog.html b/ui/webui/resources/cr_components/certificate_manager/certificate_delete_confirmation_dialog.html index 6e41d2c0..90670c3 100644 --- a/ui/webui/resources/cr_components/certificate_manager/certificate_delete_confirmation_dialog.html +++ b/ui/webui/resources/cr_components/certificate_manager/certificate_delete_confirmation_dialog.html
@@ -1,15 +1,14 @@ <link rel="import" href="chrome://resources/html/polymer.html"> +<link rel="import" href="chrome://resources/cr_elements/cr_button/cr_button.html"> <link rel="import" href="chrome://resources/cr_elements/cr_dialog/cr_dialog.html"> -<link rel="import" href="chrome://resources/cr_elements/paper_button_style_css.html"> <link rel="import" href="chrome://resources/html/i18n_behavior.html"> -<link rel="import" href="chrome://resources/polymer/v1_0/paper-button/paper-button.html"> <link rel="import" href="certificate_shared_css.html"> <link rel="import" href="certificates_browser_proxy.html"> <dom-module id="certificate-delete-confirmation-dialog"> <template> - <style include="certificate-shared paper-button-style"></style> + <style include="certificate-shared"></style> <cr-dialog id="dialog" close-text="[[i18n('close')]]"> <div slot="title"> [[getTitleText_(model, certificateType)]] @@ -18,12 +17,12 @@ <div>[[getDescriptionText_(model, certificateType)]]</div> </div> <div slot="button-container"> - <paper-button class="cancel-button" on-tap="onCancelTap_"> + <cr-button class="cancel-button" on-click="onCancelTap_"> [[i18n('cancel')]] - </paper-button> - <paper-button id="ok" class="action-button" on-tap="onOkTap_"> + </cr-button> + <cr-button id="ok" class="action-button" on-click="onOkTap_"> [[i18n('ok')]] - </paper-button> + </cr-button> </div> </cr-dialog> </template>
diff --git a/ui/webui/resources/cr_components/certificate_manager/certificate_list.html b/ui/webui/resources/cr_components/certificate_manager/certificate_list.html index c0798d5..b67ba398 100644 --- a/ui/webui/resources/cr_components/certificate_manager/certificate_list.html +++ b/ui/webui/resources/cr_components/certificate_manager/certificate_list.html
@@ -1,6 +1,6 @@ <link rel="import" href="chrome://resources/html/polymer.html"> -<link rel="import" href="chrome://resources/cr_elements/paper_button_style_css.html"> +<link rel="import" href="chrome://resources/cr_elements/cr_button/cr_button.html"> <link rel="import" href="chrome://resources/html/assert.html"> <link rel="import" href="chrome://resources/html/i18n_behavior.html"> <link rel="import" href="chrome://resources/polymer/v1_0/iron-flex-layout/iron-flex-layout-classes.html"> @@ -11,7 +11,7 @@ <dom-module id="certificate-list"> <template> - <style include="certificate-shared iron-flex paper-button-style"> + <style include="certificate-shared iron-flex"> .button-box { align-items: center; display: flex; @@ -28,14 +28,14 @@ <div class="button-box"> <span class="flex"> [[getDescription_(certificateType, certificates)]]</span> - <paper-button id="import" on-tap="onImportTap_" + <cr-button id="import" on-click="onImportTap_" hidden="[[!canImport_(certificateType, importAllowed, isKiosk_)]]"> - [[i18n('certificateManagerImport')]]</paper-button> + [[i18n('certificateManagerImport')]]</cr-button> <if expr="chromeos"> - <paper-button id="importAndBind" on-tap="onImportAndBindTap_" + <cr-button id="importAndBind" on-click="onImportAndBindTap_" hidden="[[!canImportAndBind_(certificateType, importAllowed, isGuest_)]]"> - [[i18n('certificateManagerImportAndBind')]]</paper-button> + [[i18n('certificateManagerImportAndBind')]]</cr-button> </if> </div> <template is="dom-repeat" items="[[certificates]]">
diff --git a/ui/webui/resources/cr_components/certificate_manager/certificate_password_decryption_dialog.html b/ui/webui/resources/cr_components/certificate_manager/certificate_password_decryption_dialog.html index b559ee7..15607230 100644 --- a/ui/webui/resources/cr_components/certificate_manager/certificate_password_decryption_dialog.html +++ b/ui/webui/resources/cr_components/certificate_manager/certificate_password_decryption_dialog.html
@@ -1,16 +1,15 @@ <link rel="import" href="chrome://resources/html/polymer.html"> +<link rel="import" href="chrome://resources/cr_elements/cr_button/cr_button.html"> <link rel="import" href="chrome://resources/cr_elements/cr_dialog/cr_dialog.html"> <link rel="import" href="chrome://resources/cr_elements/cr_input/cr_input.html"> -<link rel="import" href="chrome://resources/cr_elements/paper_button_style_css.html"> <link rel="import" href="chrome://resources/html/i18n_behavior.html"> -<link rel="import" href="chrome://resources/polymer/v1_0/paper-button/paper-button.html"> <link rel="import" href="certificate_shared_css.html"> <link rel="import" href="certificates_browser_proxy.html"> <dom-module id="certificate-password-decryption-dialog"> <template> - <style include="certificate-shared paper-button-style"> + <style include="certificate-shared"> cr-input { --cr-input-error-display: none; } @@ -26,12 +25,12 @@ </cr-input> </div> <div slot="button-container"> - <paper-button class="cancel-button" on-tap="onCancelTap_"> + <cr-button class="cancel-button" on-click="onCancelTap_"> [[i18n('cancel')]] - </paper-button> - <paper-button id="ok" class="action-button" on-tap="onOkTap_"> + </cr-button> + <cr-button id="ok" class="action-button" on-click="onOkTap_"> [[i18n('ok')]] - </paper-button> + </cr-button> </div> </cr-dialog> </template>
diff --git a/ui/webui/resources/cr_components/certificate_manager/certificate_password_encryption_dialog.html b/ui/webui/resources/cr_components/certificate_manager/certificate_password_encryption_dialog.html index c971f287..301aa3d 100644 --- a/ui/webui/resources/cr_components/certificate_manager/certificate_password_encryption_dialog.html +++ b/ui/webui/resources/cr_components/certificate_manager/certificate_password_encryption_dialog.html
@@ -1,17 +1,16 @@ <link rel="import" href="chrome://resources/html/polymer.html"> +<link rel="import" href="chrome://resources/cr_elements/cr_button/cr_button.html"> <link rel="import" href="chrome://resources/cr_elements/cr_dialog/cr_dialog.html"> <link rel="import" href="chrome://resources/cr_elements/cr_input/cr_input.html"> -<link rel="import" href="chrome://resources/cr_elements/paper_button_style_css.html"> <link rel="import" href="chrome://resources/cr_elements/shared_vars_css.html"> <link rel="import" href="chrome://resources/html/i18n_behavior.html"> -<link rel="import" href="chrome://resources/polymer/v1_0/paper-button/paper-button.html"> <link rel="import" href="certificate_shared_css.html"> <link rel="import" href="certificates_browser_proxy.html"> <dom-module id="certificate-password-encryption-dialog"> <template> - <style include="certificate-shared paper-button-style"> + <style include="certificate-shared"> cr-input { --cr-input-error-display: none; margin-top: var(--cr-form-field-bottom-spacing); @@ -38,12 +37,12 @@ </div> </div> <div slot="button-container"> - <paper-button class="cancel-button" on-tap="onCancelTap_"> + <cr-button class="cancel-button" on-click="onCancelTap_"> [[i18n('cancel')]] - </paper-button> - <paper-button id="ok" class="action-button" on-tap="onOkTap_" disabled> + </cr-button> + <cr-button id="ok" class="action-button" on-click="onOkTap_" disabled> [[i18n('ok')]] - </paper-button> + </cr-button> </div> </cr-dialog> </template>
diff --git a/ui/webui/resources/cr_components/certificate_manager/certificates_error_dialog.html b/ui/webui/resources/cr_components/certificate_manager/certificates_error_dialog.html index 0ef4dc1b4..0dc6aff 100644 --- a/ui/webui/resources/cr_components/certificate_manager/certificates_error_dialog.html +++ b/ui/webui/resources/cr_components/certificate_manager/certificates_error_dialog.html
@@ -1,14 +1,13 @@ <link rel="import" href="chrome://resources/html/polymer.html"> +<link rel="import" href="chrome://resources/cr_elements/cr_button/cr_button.html"> <link rel="import" href="chrome://resources/cr_elements/cr_dialog/cr_dialog.html"> -<link rel="import" href="chrome://resources/cr_elements/paper_button_style_css.html"> <link rel="import" href="chrome://resources/html/i18n_behavior.html"> -<link rel="import" href="chrome://resources/polymer/v1_0/paper-button/paper-button.html"> <link rel="import" href="certificate_shared_css.html"> <dom-module id="certificates-error-dialog"> <template> - <style include="certificate-shared paper-button-style"></style> + <style include="certificate-shared"></style> <cr-dialog id="dialog" close-text="[[i18n('close')]]"> <div slot="title">[[model.title]]</div> <div slot="body"> @@ -20,9 +19,9 @@ </template> </div> <div slot="button-container"> - <paper-button id="ok" class="action-button" on-tap="onOkTap_"> + <cr-button id="ok" class="action-button" on-click="onOkTap_"> [[i18n('ok')]] - </paper-button> + </cr-button> </div> </cr-dialog> </template>
diff --git a/ui/webui/resources/cr_components/chromeos/bluetooth_dialog.html b/ui/webui/resources/cr_components/chromeos/bluetooth_dialog.html index 7562232..32d93a3 100644 --- a/ui/webui/resources/cr_components/chromeos/bluetooth_dialog.html +++ b/ui/webui/resources/cr_components/chromeos/bluetooth_dialog.html
@@ -1,18 +1,17 @@ <link rel="import" href="chrome://resources/html/polymer.html"> +<link rel="import" href="chrome://resources/cr_elements/cr_button/cr_button.html"> <link rel="import" href="chrome://resources/cr_elements/cr_dialog/cr_dialog.html"> <link rel="import" href="chrome://resources/cr_elements/cr_input/cr_input.html"> <link rel="import" href="chrome://resources/cr_elements/hidden_style_css.html"> -<link rel="import" href="chrome://resources/cr_elements/paper_button_style_css.html"> <link rel="import" href="chrome://resources/html/cr.html"> <link rel="import" href="chrome://resources/html/i18n_behavior.html"> <link rel="import" href="chrome://resources/polymer/v1_0/iron-flex-layout/iron-flex-layout-classes.html"> <link rel="import" href="chrome://resources/polymer/v1_0/iron-list/iron-list.html"> -<link rel="import" href="chrome://resources/polymer/v1_0/paper-button/paper-button.html"> <dom-module id="bluetooth-dialog"> <template> - <style include="cr-hidden-style paper-button-style iron-flex"> + <style include="cr-hidden-style iron-flex"> #pairing { margin-bottom: 10px; } @@ -70,11 +69,11 @@ } /* Override default style since it assumes a single action-button */ - paper-button.cancel-button { + cr-button.cancel-button { margin: 0; } - paper-button.action-button { + cr-button.action-button { margin-inline-start: 8px; } </style> @@ -123,31 +122,30 @@ </div> <div slot="button-container"> <template is="dom-if" if="[[!errorMessage_]]"> - <paper-button hidden$="[[showDismiss_(pairingDevice, pairingEvent_)]]" - class="cancel-button" on-tap="onCancelTap_"> + <cr-button hidden$="[[showDismiss_(pairingDevice, pairingEvent_)]]" + class="cancel-button" on-click="onCancelTap_"> [[i18n('cancel')]] - </paper-button> - <paper-button hidden$="[[!showAcceptReject_(pairingEvent_)]]" - id="accept-button" class="action-button" on-tap="onAcceptTap_"> + </cr-button> + <cr-button hidden$="[[!showAcceptReject_(pairingEvent_)]]" + id="accept-button" class="action-button" on-click="onAcceptTap_"> [[i18n('bluetoothAccept')]] - </paper-button> - <paper-button hidden$="[[!showAcceptReject_(pairingEvent_)]]" - class="action-button" on-tap="onRejectTap_"> + </cr-button> + <cr-button hidden$="[[!showAcceptReject_(pairingEvent_)]]" + class="action-button" on-click="onRejectTap_"> [[i18n('bluetoothReject')]] - </paper-button> - <paper-button hidden$="[[!showConnect_(pairingEvent_)]]" + </cr-button> + <cr-button hidden$="[[!showConnect_(pairingEvent_)]]" disabled="[[!enableConnect_(pairingEvent_, pinOrPass_)]]" - class="action-button" on-tap="onConnectTap_"> + class="action-button" on-click="onConnectTap_"> [[i18n('bluetoothPair')]] - </paper-button> - <paper-button - hidden$="[[!showDismiss_(pairingDevice, pairingEvent_)]]" - class="action-button" on-tap="close"> + </cr-button> + <cr-button hidden$="[[!showDismiss_(pairingDevice, pairingEvent_)]]" + class="action-button" on-click="close"> [[i18n('ok')]] - </paper-button> + </cr-button> </template> <template is="dom-if" if="[[errorMessage_]]"> - <paper-button on-tap="close">[[i18n('ok')]]</paper-button> + <cr-button on-click="close">[[i18n('ok')]]</cr-button> </template> </div> </cr-dialog>
diff --git a/ui/webui/resources/cr_components/chromeos/cellular_setup/button_bar.html b/ui/webui/resources/cr_components/chromeos/cellular_setup/button_bar.html index ae3c624b..394cd72 100644 --- a/ui/webui/resources/cr_components/chromeos/cellular_setup/button_bar.html +++ b/ui/webui/resources/cr_components/chromeos/cellular_setup/button_bar.html
@@ -1,45 +1,44 @@ <link rel="import" href="chrome://resources/html/polymer.html"> <link rel="import" href="chrome://resources/html/i18n_behavior.html"> -<link rel="import" href="chrome://resources/cr_elements/paper_button_style_css.html"> +<link rel="import" href="chrome://resources/cr_elements/cr_button/cr_button.html"> <link rel="import" href="chrome://resources/cr_elements/shared_style_css.html"> <link rel="import" href="chrome://resources/cr_elements/shared_vars_css.html"> -<link rel="import" href="chrome://resources/polymer/v1_0/paper-button/paper-button.html"> <link rel="import" href="chrome://resources/polymer/v1_0/iron-flex-layout/iron-flex-layout.html"> <dom-module id="button-bar"> <template> - <style include="paper-button-style iron-flex"> + <style include="iron-flex"> :host { @apply --layout-horizontal; @apply --layout-justified; padding: 10px 0; } </style> - <paper-button id="backward" + <cr-button id="backward" class="cancel-button" on-click="onBackwardButtonClicked_" hidden$="[[showCancelButton]]"> [[i18n('back')]] - </paper-button> - <paper-button id="cancel" + </cr-button> + <cr-button id="cancel" class="cancel-button" on-click="onBackwardButtonClicked_" hidden$="[[!showCancelButton]]"> [[i18n('cancel')]] - </paper-button> - <paper-button id="tryAgain" + </cr-button> + <cr-button id="tryAgain" class="action-button" on-click="onTryAgainButtonClicked_" hidden$="[[!showTryAgainButton]]"> [[i18n('tryAgain')]] - </paper-button> - <paper-button id="finish" + </cr-button> + <cr-button id="finish" class="action-button" on-click="onFinishButtonClicked_" hidden$="[[!showFinishButton]]"> [[i18n('finish')]] - </paper-button> + </cr-button> </template> <script src="button_bar.js"></script> </dom-module>
diff --git a/ui/webui/resources/cr_components/chromeos/multidevice_setup/multidevice_setup_shared_css.html b/ui/webui/resources/cr_components/chromeos/multidevice_setup/multidevice_setup_shared_css.html index c940312..7dd645e 100644 --- a/ui/webui/resources/cr_components/chromeos/multidevice_setup/multidevice_setup_shared_css.html +++ b/ui/webui/resources/cr_components/chromeos/multidevice_setup/multidevice_setup_shared_css.html
@@ -1,6 +1,5 @@ <link rel="import" href="chrome://resources/html/polymer.html"> -<link rel="import" href="chrome://resources/cr_elements/paper_button_style_css.html"> <link rel="import" href="chrome://resources/cr_elements/shared_style_css.html"> <link rel="import" href="chrome://resources/cr_elements/shared_vars_css.html"> <link rel="import" href="chrome://resources/html/md_select_css.html"> @@ -9,7 +8,7 @@ <dom-module id="multidevice-setup-shared"> <template> - <style include="iron-flex paper-button-style cr-shared-style md-select"> + <style include="iron-flex cr-shared-style md-select"> a { color: var(--google-blue-600); text-decoration: none;
diff --git a/ui/webui/resources/cr_components/chromeos/network/network_apnlist.html b/ui/webui/resources/cr_components/chromeos/network/network_apnlist.html index 472b17a..c57826eb 100644 --- a/ui/webui/resources/cr_components/chromeos/network/network_apnlist.html +++ b/ui/webui/resources/cr_components/chromeos/network/network_apnlist.html
@@ -1,17 +1,16 @@ <link rel="import" href="chrome://resources/html/polymer.html"> <link rel="import" href="chrome://resources/cr_elements/chromeos/network/cr_onc_types.html"> -<link rel="import" href="chrome://resources/cr_elements/paper_button_style_css.html"> +<link rel="import" href="chrome://resources/cr_elements/cr_button/cr_button.html"> <link rel="import" href="chrome://resources/html/i18n_behavior.html"> <link rel="import" href="chrome://resources/html/md_select_css.html"> -<link rel="import" href="chrome://resources/polymer/v1_0/paper-button/paper-button.html"> <link rel="import" href="network_property_list.html"> <link rel="import" href="network_shared_css.html"> <dom-module id="network-apnlist"> <template> - <style include="network-shared md-select paper-button-style"> - paper-button { + <style include="network-shared md-select"> + cr-button { margin: 4px 0; } </style> @@ -32,9 +31,9 @@ fields="[[otherApnFields_]]" property-dict="[[otherApn_]]" edit-field-types="[[otherApnEditTypes_]]" prefix="Cellular.APN."> </network-property-list> - <paper-button class="action-button" on-tap="onSaveOtherTap_"> + <cr-button class="action-button" on-click="onSaveOtherTap_"> [[i18n('save')]] - </paper-button> + </cr-button> </div> </template> <script src="network_apnlist.js"></script>
diff --git a/ui/webui/resources/cr_components/chromeos/network/network_choose_mobile.html b/ui/webui/resources/cr_components/chromeos/network/network_choose_mobile.html index ce2da59..99b26fa 100644 --- a/ui/webui/resources/cr_components/chromeos/network/network_choose_mobile.html +++ b/ui/webui/resources/cr_components/chromeos/network/network_choose_mobile.html
@@ -1,16 +1,15 @@ <link rel="import" href="chrome://resources/html/polymer.html"> <link rel="import" href="chrome://resources/cr_elements/chromeos/network/cr_onc_types.html"> -<link rel="import" href="chrome://resources/cr_elements/paper_button_style_css.html"> +<link rel="import" href="chrome://resources/cr_elements/cr_button/cr_button.html"> <link rel="import" href="chrome://resources/html/i18n_behavior.html"> <link rel="import" href="chrome://resources/html/md_select_css.html"> <link rel="import" href="chrome://resources/polymer/v1_0/iron-flex-layout/iron-flex-layout-classes.html"> -<link rel="import" href="chrome://resources/polymer/v1_0/paper-button/paper-button.html"> <link rel="import" href="network_shared_css.html"> <dom-module id="network-choose-mobile"> <template> - <style include="network-shared md-select iron-flex paper-button-style"> + <style include="network-shared md-select iron-flex"> /* Leave some space between button and select. */ select { margin-inline-start: 8px; @@ -21,10 +20,10 @@ <div>[[i18n('networkChooseMobile')]]</div> <div class="secondary">[[getSecondaryText_(networkProperties)]]</div> </div> - <paper-button on-tap="onScanTap_" + <cr-button on-click="onScanTap_" disabled="[[!getEnableScanButton_(networkProperties)]]"> [[i18n('networkCellularScan')]] - </paper-button> + </cr-button> <select class="md-select" on-change="onChange_" value="[[selectedMobileNetworkId_]]" disabled="[[!getEnableSelectNetwork_(networkProperties)]]"
diff --git a/ui/webui/resources/cr_components/chromeos/network/network_proxy.html b/ui/webui/resources/cr_components/chromeos/network/network_proxy.html index e225181..8e5e97fff 100644 --- a/ui/webui/resources/cr_components/chromeos/network/network_proxy.html +++ b/ui/webui/resources/cr_components/chromeos/network/network_proxy.html
@@ -1,23 +1,22 @@ <link rel="import" href="chrome://resources/html/polymer.html"> <link rel="import" href="chrome://resources/cr_elements/chromeos/network/cr_onc_types.html"> +<link rel="import" href="chrome://resources/cr_elements/cr_button/cr_button.html"> <link rel="import" href="chrome://resources/cr_elements/cr_input/cr_input.html"> <link rel="import" href="chrome://resources/cr_elements/cr_toggle/cr_toggle.html"> <link rel="import" href="chrome://resources/cr_elements/hidden_style_css.html"> -<link rel="import" href="chrome://resources/cr_elements/paper_button_style_css.html"> <link rel="import" href="chrome://resources/cr_elements/policy/cr_policy_network_behavior.html"> <link rel="import" href="chrome://resources/html/assert.html"> <link rel="import" href="chrome://resources/html/i18n_behavior.html"> <link rel="import" href="chrome://resources/html/md_select_css.html"> <link rel="import" href="chrome://resources/polymer/v1_0/iron-flex-layout/iron-flex-layout-classes.html"> -<link rel="import" href="chrome://resources/polymer/v1_0/paper-button/paper-button.html"> <link rel="import" href="network_proxy_exclusions.html"> <link rel="import" href="network_proxy_input.html"> <link rel="import" href="network_shared_css.html"> <dom-module id="network-proxy"> <template> - <style include="network-shared cr-hidden-style iron-flex iron-flex-alignment md-select paper-button-style"> + <style include="network-shared cr-hidden-style iron-flex iron-flex-alignment md-select"> network-proxy-input { margin-bottom: 10px; } @@ -133,19 +132,19 @@ <div id="addException" class="layout horizontal center"> <cr-input id="proxyExclusion" class="flex" on-keypress="onAddProxyExclusionKeypress_"> - <paper-button on-tap="onAddProxyExclusionTap_" slot="suffix"> + <cr-button on-click="onAddProxyExclusionTap_" slot="suffix"> [[i18n('networkProxyAddException')]] - </paper-button> + </cr-button> </cr-input> </div> </div> - <paper-button id="saveManualProxy" - on-tap="onSaveProxyTap_" class="action-button" + <cr-button id="saveManualProxy" + on-click="onSaveProxyTap_" class="action-button" disabled="[[!isSaveManualProxyEnabled_(networkProperties, proxyIsUserModified_, proxy_.*)]]"> [[i18n('save')]] - </paper-button> + </cr-button> </div> </template>
diff --git a/ui/webui/resources/cr_components/chromeos/network/network_siminfo.html b/ui/webui/resources/cr_components/chromeos/network/network_siminfo.html index 01be157..de839ca 100644 --- a/ui/webui/resources/cr_components/chromeos/network/network_siminfo.html +++ b/ui/webui/resources/cr_components/chromeos/network/network_siminfo.html
@@ -1,22 +1,21 @@ <link rel="import" href="chrome://resources/html/polymer.html"> <link rel="import" href="chrome://resources/cr_elements/chromeos/network/cr_onc_types.html"> +<link rel="import" href="chrome://resources/cr_elements/cr_button/cr_button.html"> <link rel="import" href="chrome://resources/cr_elements/cr_dialog/cr_dialog.html"> <link rel="import" href="chrome://resources/cr_elements/cr_toggle/cr_toggle.html"> <link rel="import" href="chrome://resources/cr_elements/icons.html"> -<link rel="import" href="chrome://resources/cr_elements/paper_button_style_css.html"> <link rel="import" href="chrome://resources/html/assert.html"> <link rel="import" href="chrome://resources/html/cr/ui/focus_without_ink.html"> <link rel="import" href="chrome://resources/html/i18n_behavior.html"> <link rel="import" href="chrome://resources/polymer/v1_0/iron-flex-layout/iron-flex-layout-classes.html"> <link rel="import" href="chrome://resources/polymer/v1_0/iron-icon/iron-icon.html"> -<link rel="import" href="chrome://resources/polymer/v1_0/paper-button/paper-button.html"> <link rel="import" href="network_password_input.html"> <link rel="import" href="network_shared_css.html"> <dom-module id="network-siminfo"> <template> - <style include="network-shared iron-flex paper-button-style"> + <style include="network-shared iron-flex"> :host { cursor: default } @@ -67,9 +66,9 @@ <div class="error">[[i18n('networkSimCardLocked')]]</div> </div> <div class="separator"></div> - <paper-button id="unlockPinButton" on-tap="onUnlockPinTap_"> + <cr-button id="unlockPinButton" on-click="onUnlockPinTap_"> [[i18n('networkSimUnlock')]] - </paper-button> + </cr-button> </div> <!-- SIM unlocked --> @@ -78,10 +77,10 @@ <div id="simLockToggleLabel" class="start"> [[i18n('networkSimLockEnable')]] </div> - <paper-button id="changePinButton" on-tap="onChangePinTap_" + <cr-button id="changePinButton" on-click="onChangePinTap_" hidden$="[[!networkProperties.Cellular.SIMLockStatus.LockEnabled]]"> [[i18n('networkSimChangePin')]] - </paper-button> + </cr-button> <cr-toggle id="simLockButton" on-change="onSimLockEnabledChange_" checked="{{lockEnabled_}}" aria-labelledby="simLockToggleLabel"> @@ -103,13 +102,13 @@ </div> </div> <div slot="button-container"> - <paper-button class="cancel-button" on-tap="closeDialogs_"> + <cr-button class="cancel-button" on-click="closeDialogs_"> [[i18n('cancel')]] - </paper-button> - <paper-button class="action-button" on-tap="sendEnterPin_" + </cr-button> + <cr-button class="action-button" on-click="sendEnterPin_" disabled="[[!enterPinEnabled_]]"> [[i18n('networkSimEnter')]] - </paper-button> + </cr-button> </div> </cr-dialog> @@ -135,13 +134,13 @@ </div> </div> <div slot="button-container"> - <paper-button class="cancel-button" on-tap="closeDialogs_"> + <cr-button class="cancel-button" on-click="closeDialogs_"> [[i18n('cancel')]] - </paper-button> - <paper-button class="action-button" on-tap="sendChangePin_" + </cr-button> + <cr-button class="action-button" on-click="sendChangePin_" disabled="[[!changePinEnabled_]]"> [[i18n('networkSimChange')]] - </paper-button> + </cr-button> </div> </cr-dialog> @@ -159,13 +158,13 @@ </div> </div> <div slot="button-container"> - <paper-button class="cancel-button" on-tap="closeDialogs_"> + <cr-button class="cancel-button" on-click="closeDialogs_"> [[i18n('cancel')]] - </paper-button> - <paper-button class="action-button" on-tap="sendUnlockPin_" + </cr-button> + <cr-button class="action-button" on-click="sendUnlockPin_" disabled="[[!enterPinEnabled_]]"> [[i18n('networkSimUnlock')]] - </paper-button> + </cr-button> </div> </cr-dialog> @@ -197,13 +196,13 @@ </div> </div> <div slot="button-container"> - <paper-button class="cancel-button" on-tap="closeDialogs_"> + <cr-button class="cancel-button" on-click="closeDialogs_"> [[i18n('cancel')]] - </paper-button> - <paper-button class="action-button" on-tap="sendUnlockPuk_" + </cr-button> + <cr-button class="action-button" on-click="sendUnlockPuk_" disabled="[[!enterPukEnabled_]]"> [[i18n('networkSimUnlock')]] - </paper-button> + </cr-button> </div> </cr-dialog> </template>
diff --git a/ui/webui/resources/cr_components/chromeos/quick_unlock/BUILD.gn b/ui/webui/resources/cr_components/chromeos/quick_unlock/BUILD.gn index afe7eb0..19c5cb0 100644 --- a/ui/webui/resources/cr_components/chromeos/quick_unlock/BUILD.gn +++ b/ui/webui/resources/cr_components/chromeos/quick_unlock/BUILD.gn
@@ -13,7 +13,6 @@ js_library("pin_keyboard") { deps = [ - "//third_party/polymer/v1_0/components-chromium/paper-button:paper-button-extracted", "//ui/webui/resources/cr_elements/cr_input:cr_input", "//ui/webui/resources/js:i18n_behavior", ]
diff --git a/ui/webui/resources/cr_components/chromeos/quick_unlock/pin_keyboard.html b/ui/webui/resources/cr_components/chromeos/quick_unlock/pin_keyboard.html index b99492d5..1ffcce8 100644 --- a/ui/webui/resources/cr_components/chromeos/quick_unlock/pin_keyboard.html +++ b/ui/webui/resources/cr_components/chromeos/quick_unlock/pin_keyboard.html
@@ -4,12 +4,12 @@ <link rel="import" href="chrome://resources/html/polymer.html"> +<link rel="import" href="chrome://resources/cr_elements/cr_button/cr_button.html"> <link rel="import" href="chrome://resources/cr_elements/cr_icon_button/cr_icon_button.html"> <link rel="import" href="chrome://resources/cr_elements/cr_input/cr_input.html"> <link rel="import" href="chrome://resources/cr_elements/icons.html"> <link rel="import" href="chrome://resources/cr_elements/shared_vars_css.html"> <link rel="import" href="chrome://resources/html/i18n_behavior.html"> -<link rel="import" href="chrome://resources/polymer/v1_0/paper-button/paper-button.html"> <link rel="import" href="chrome://resources/polymer/v1_0/paper-styles/color.html"> <link rel="import" href="chrome://resources/polymer/v1_0/iron-icon/iron-icon.html"> <link rel="import" href="chrome://resources/polymer/v1_0/iron-iconset-svg/iron-iconset-svg.html"> @@ -88,7 +88,7 @@ --cr-icon-button-size: 48px; left: 0; opacity: var(--pin-keyboard-backspace-opacity, --dark-primary-opacity); - position: absolute; + position: relative; top: -4px; } @@ -96,32 +96,21 @@ opacity: 0.34; } - #backspaceButtonContainer { - position: relative; - } - - #backspaceButtonContainer paper-ripple { - left: var(--pin-keyboard-backspace-paper-ripple-offset, - var(--backspace-button-ripple-left)); - top: var(--pin-keyboard-backspace-paper-ripple-offset, - var(--pin-button-ripple-top)); - } - .digit-button { - --paper-button: { - min-width: 0; - }; align-items: center; background: none; - border-radius: 0; + border: 0; + box-shadow: none; box-sizing: border-box; color: var(--google-grey-900); display: flex; flex-direction: column; - height: var(--pin-button-height) + font-weight: 400; + height: var(--pin-button-height); justify-content: center; margin: 0 var(--pin-button-horizontal-margin); min-height: 0; + min-width: 0; opacity: 0.87; padding: 0; width: var(--pin-button-width); @@ -129,6 +118,10 @@ @apply --pin-keyboard-digit-button; } + :host-context(.focus-outline-visible) .digit-button:focus { + font-weight: 500; + } + .digit-button inner-text { font-family: 'Roboto'; } @@ -148,7 +141,8 @@ } paper-ripple { - color: var(--google-grey-700); + --paper-ripple-opacity: .15; + color: var(--google-grey-900); height: var(--pin-button-ripple-height); left: var(--pin-button-ripple-left); top: var(--pin-button-ripple-top); @@ -191,9 +185,9 @@ direction: rtl; } - /* Ensure that all children of paper-button do not consume events. This + /* Ensure that all children of cr-button do not consume events. This * simplifies the event handler code. */ - paper-button * { + cr-button * { pointer-events: none; } </style> @@ -212,86 +206,82 @@ <slot select="[problem]"></slot> <div id="rowsContainer"> <div class="row"> - <paper-button class="digit-button" on-tap="onNumberTap_" value="1" + <cr-button class="digit-button" on-click="onNumberTap_" value="1" noink> <inner-text class="number">[[i18n('pinKeyboard1')]]</inner-text> <inner-text class="letter"> </inner-text> <paper-ripple class="circle" center></paper-ripple> - </paper-button> - <paper-button class="digit-button" on-tap="onNumberTap_" value="2" + </cr-button> + <cr-button class="digit-button" on-click="onNumberTap_" value="2" noink> <inner-text class="number">[[i18n('pinKeyboard2')]]</inner-text> <inner-text class="letter">ABC</inner-text> <paper-ripple class="circle" center></paper-ripple> - </paper-button> - <paper-button class="digit-button" on-tap="onNumberTap_" value="3" + </cr-button> + <cr-button class="digit-button" on-click="onNumberTap_" value="3" noink> <inner-text class="number">[[i18n('pinKeyboard3')]]</inner-text> <inner-text class="letter">DEF</inner-text> <paper-ripple class="circle" center></paper-ripple> - </paper-button> + </cr-button> </div> <div class="row"> - <paper-button class="digit-button" on-tap="onNumberTap_" value="4" + <cr-button class="digit-button" on-click="onNumberTap_" value="4" noink> <inner-text class="number">[[i18n('pinKeyboard4')]]</inner-text> <inner-text class="letter">GHI</inner-text> <paper-ripple class="circle" center></paper-ripple> - </paper-button> - <paper-button class="digit-button" on-tap="onNumberTap_" value="5" + </cr-button> + <cr-button class="digit-button" on-click="onNumberTap_" value="5" noink> <inner-text class="number">[[i18n('pinKeyboard5')]]</inner-text> <inner-text class="letter">JKL</inner-text> <paper-ripple class="circle" center></paper-ripple> - </paper-button> - <paper-button class="digit-button" on-tap="onNumberTap_" value="6" + </cr-button> + <cr-button class="digit-button" on-click="onNumberTap_" value="6" noink> <inner-text class="number">[[i18n('pinKeyboard6')]]</inner-text> <inner-text class="letter">MNO</inner-text> <paper-ripple class="circle" center></paper-ripple> - </paper-button> + </cr-button> </div> <div class="row"> - <paper-button class="digit-button" on-tap="onNumberTap_" value="7" + <cr-button class="digit-button" on-click="onNumberTap_" value="7" noink> <inner-text class="number">[[i18n('pinKeyboard7')]]</inner-text> <inner-text class="letter">PQRS</inner-text> <paper-ripple class="circle" center></paper-ripple> - </paper-button> - <paper-button class="digit-button" on-tap="onNumberTap_" value="8" + </cr-button> + <cr-button class="digit-button" on-click="onNumberTap_" value="8" noink> <inner-text class="number">[[i18n('pinKeyboard8')]]</inner-text> <inner-text class="letter">TUV</inner-text> <paper-ripple class="circle" center></paper-ripple> - </paper-button> - <paper-button class="digit-button" on-tap="onNumberTap_" value="9" + </cr-button> + <cr-button class="digit-button" on-click="onNumberTap_" value="9" noink> <inner-text class="number">[[i18n('pinKeyboard9')]]</inner-text> <inner-text class="letter">WXYZ</inner-text> <paper-ripple class="circle" center></paper-ripple> - </paper-button> + </cr-button> </div> <div class="row bottom-row"> <div class="digit-button"></div> - <paper-button class="digit-button" on-tap="onNumberTap_" value="0" + <cr-button class="digit-button" on-click="onNumberTap_" value="0" noink> <inner-text class="number">[[i18n('pinKeyboard0')]]</inner-text> <inner-text class="letter">+</inner-text> <paper-ripple class="circle" center></paper-ripple> - </paper-button> - <div id="backspaceButtonContainer"> - <cr-icon-button id="backspaceButton" class="digit-button" - disabled$="[[!hasInput_(value)]]" - iron-icon="pin-keyboard:backspace" - on-click="onBackspaceTap_" - on-pointerdown="onBackspacePointerDown_" - on-pointerout="clearAndReset_" - on-pointerup="onBackspacePointerUp_" - title="[[i18n('pinKeyboardDeleteAccessibleName')]]"> - </cr-icon-button> - <paper-ripple class="circle" center hidden="[[!hasInput_(value)]]"> - </paper-ripple> - </div> + </cr-button> + <cr-icon-button id="backspaceButton" + disabled$="[[!hasInput_(value)]]" + iron-icon="pin-keyboard:backspace" + on-click="onBackspaceTap_" + on-pointerdown="onBackspacePointerDown_" + on-pointerout="clearAndReset_" + on-pointerup="onBackspacePointerUp_" + title="[[i18n('pinKeyboardDeleteAccessibleName')]]"> + </cr-icon-button> </div> </div> </div>
diff --git a/ui/webui/resources/cr_components/chromeos/quick_unlock/pin_keyboard.js b/ui/webui/resources/cr_components/chromeos/quick_unlock/pin_keyboard.js index ec511c1..c69a6e0 100644 --- a/ui/webui/resources/cr_components/chromeos/quick_unlock/pin_keyboard.js +++ b/ui/webui/resources/cr_components/chromeos/quick_unlock/pin_keyboard.js
@@ -47,6 +47,11 @@ */ const PIN_INPUT_ALLOWED_NON_NUMBER_KEY_CODES = [8, 9, 37, 39]; +/** @return {boolean} */ +function receivedFocusFromKeyboard() { + return !!document.querySelector('html.focus-outline-visible'); +} + Polymer({ is: 'pin-keyboard', @@ -229,7 +234,7 @@ // button, therefore we transfer focus back to the input, but if a number // button is tabbed into, it should keep focus, so users can use tab and // spacebar/return to enter their PIN. - if (!event.target.receivedFocusFromKeyboard) { + if (!receivedFocusFromKeyboard()) { this.focusInput(selectionStart + 1, selectionStart + 1); } event.stopImmediatePropagation(); @@ -286,7 +291,7 @@ * @private */ onBackspaceTap_: function(event) { - if (!event.target.receivedFocusFromKeyboard) { + if (!receivedFocusFromKeyboard()) { return; } @@ -308,7 +313,7 @@ setInterval(this.onPinClear_.bind(this), REPEAT_BACKSPACE_DELAY_MS); }.bind(this), INITIAL_BACKSPACE_DELAY_MS); - if (!event.target.receivedFocusFromKeyboard) { + if (!receivedFocusFromKeyboard()) { this.focusInput(this.selectionStart_, this.selectionEnd_); } event.stopImmediatePropagation(); @@ -344,7 +349,7 @@ // virtual keyboard, even if focusInput() is wrapped in a setTimeout. Blur // the input element first to workaround this. this.blur(); - if (!event.target.receivedFocusFromKeyboard) { + if (!receivedFocusFromKeyboard()) { this.focusInput(this.selectionStart_, this.selectionEnd_); } event.stopImmediatePropagation();
diff --git a/ui/webui/resources/cr_components/chromeos/quick_unlock/setup_pin_keyboard.html b/ui/webui/resources/cr_components/chromeos/quick_unlock/setup_pin_keyboard.html index 742a5c8d..94cd98f 100644 --- a/ui/webui/resources/cr_components/chromeos/quick_unlock/setup_pin_keyboard.html +++ b/ui/webui/resources/cr_components/chromeos/quick_unlock/setup_pin_keyboard.html
@@ -7,7 +7,6 @@ <link rel="import" href="chrome://resources/cr_elements/shared_vars_css.html"> <link rel="import" href="chrome://resources/html/assert.html"> <link rel="import" href="chrome://resources/html/i18n_behavior.html"> -<link rel="import" href="chrome://resources/polymer/v1_0/paper-button/paper-button.html"> <!--
diff --git a/ui/webui/resources/cr_components/chromeos/smb_shares/add_smb_share_dialog.html b/ui/webui/resources/cr_components/chromeos/smb_shares/add_smb_share_dialog.html index 7fea684da..25a8f7f 100644 --- a/ui/webui/resources/cr_components/chromeos/smb_shares/add_smb_share_dialog.html +++ b/ui/webui/resources/cr_components/chromeos/smb_shares/add_smb_share_dialog.html
@@ -1,21 +1,20 @@ <link rel="import" href="chrome://resources/html/polymer.html"> +<link rel="import" href="chrome://resources/cr_elements/cr_button/cr_button.html"> <link rel="import" href="chrome://resources/cr_elements/cr_dialog/cr_dialog.html"> <link rel="import" href="chrome://resources/cr_elements/cr_input/cr_input.html"> <link rel="import" href="chrome://resources/cr_elements/cr_searchable_drop_down/cr_searchable_drop_down.html"> <link rel="import" href="chrome://resources/cr_elements/icons.html"> -<link rel="import" href="chrome://resources/cr_elements/paper_button_style_css.html"> <link rel="import" href="chrome://resources/cr_elements/shared_vars_css.html"> <link rel="import" href="chrome://resources/html/i18n_behavior.html"> <link rel="import" href="chrome://resources/html/md_select_css.html"> <link rel="import" href="chrome://resources/html/web_ui_listener_behavior.html"> <link rel="import" href="chrome://resources/polymer/v1_0/iron-icon/iron-icon.html"> -<link rel="import" href="chrome://resources/polymer/v1_0/paper-button/paper-button.html"> <link rel="import" href="smb_browser_proxy.html"> <dom-module id="add-smb-share-dialog"> <template> - <style include="md-select paper-button-style"> + <style include="md-select"> #dialog [slot=body] { height: 400px; } @@ -38,7 +37,7 @@ margin-bottom: var(--cr-form-field-bottom-spacing); } - paper-button { + cr-button { position: relative; } @@ -112,13 +111,14 @@ </div> </div> <div slot="button-container"> - <paper-button class="cancel-button" on-click="cancel_" id="cancel"> + <cr-button class="cancel-button" on-click="cancel_" id="cancel"> [[i18n('cancel')]] - </paper-button> - <paper-button class="action-button" on-click="onAddButtonTap_" - disabled="[[!canAddShare_(mountUrl_, inProgress_, currentMountError_)]]"> + </cr-button> + <cr-button class="action-button" on-click="onAddButtonTap_" + disabled="[[!canAddShare_(mountUrl_, inProgress_, + currentMountError_)]]"> [[i18n('add')]] - </paper-button> + </cr-button> </div> </cr-dialog> </template>
diff --git a/ui/webui/resources/cr_elements/cr_checkbox/cr_checkbox.html b/ui/webui/resources/cr_elements/cr_checkbox/cr_checkbox.html index 6b7f870..bd6c454 100644 --- a/ui/webui/resources/cr_elements/cr_checkbox/cr_checkbox.html +++ b/ui/webui/resources/cr_elements/cr_checkbox/cr_checkbox.html
@@ -50,13 +50,15 @@ --cr-checkbox-unchecked-ripple-opacity: .15; } - :host-context([dark]) { - /* Dark mode colors. */ - --cr-checkbox-checked-ripple-opacity: .4; - --cr-checkbox-mark-color: var(--google-grey-900); - --cr-checkbox-ripple-unchecked-color: var(--google-grey-refresh-700); - --cr-checkbox-unchecked-box-color: var(--google-grey-refresh-500); - --cr-checkbox-unchecked-ripple-opacity: .4; + @media (prefers-color-scheme: dark) { + :host { + /* Dark mode colors. */ + --cr-checkbox-checked-ripple-opacity: .4; + --cr-checkbox-mark-color: var(--google-grey-900); + --cr-checkbox-ripple-unchecked-color: var(--google-grey-refresh-700); + --cr-checkbox-unchecked-box-color: var(--google-grey-refresh-500); + --cr-checkbox-unchecked-ripple-opacity: .4; + } } :host([disabled]) {
diff --git a/ui/webui/resources/cr_elements/cr_dialog/cr_dialog.html b/ui/webui/resources/cr_elements/cr_dialog/cr_dialog.html index e126072..6317338f 100644 --- a/ui/webui/resources/cr_elements/cr_dialog/cr_dialog.html +++ b/ui/webui/resources/cr_elements/cr_dialog/cr_dialog.html
@@ -26,13 +26,15 @@ @apply --cr-dialog-native; } - :host-context([dark]) dialog { - --scroll-border-color: var(--google-grey-refresh-700); - background-color: var(--google-grey-900); - /* Note: the colors in linear-gradient() are intentionally the same to - * add a 4% white layer on top of the fully opaque background-color. */ - background-image: linear-gradient(rgba(255, 255, 255, .04), - rgba(255, 255, 255, .04)); + @media (prefers-color-scheme: dark) { + dialog { + --scroll-border-color: var(--google-grey-refresh-700); + background-color: var(--google-grey-900); + /* Note: the colors in linear-gradient() are intentionally the same to + * add a 4% white layer on top of the fully opaque background-color. */ + background-image: linear-gradient(rgba(255, 255, 255, .04), + rgba(255, 255, 255, .04)); + } } dialog[open] #content-wrapper { @@ -123,8 +125,10 @@ padding: 16px 20px; } - :host-context([dark]) ::slotted([slot=footer]) { - border-top-color: var(--cr-separator-color); + @media (prefers-color-scheme: dark) { + :host ::slotted([slot=footer]) { + border-top-color: var(--cr-separator-color); + } } .body-container {
diff --git a/ui/webui/resources/cr_elements/cr_dialog/cr_dialog.js b/ui/webui/resources/cr_elements/cr_dialog/cr_dialog.js index c279564..e5e048f 100644 --- a/ui/webui/resources/cr_elements/cr_dialog/cr_dialog.js +++ b/ui/webui/resources/cr_elements/cr_dialog/cr_dialog.js
@@ -322,4 +322,8 @@ // the backdrop area. e.preventDefault(); }, + + focus() { + this.$$('.title-container').focus(); + }, });
diff --git a/ui/webui/resources/cr_elements/cr_drawer/cr_drawer.html b/ui/webui/resources/cr_elements/cr_drawer/cr_drawer.html index f068f79..dfd16f5 100644 --- a/ui/webui/resources/cr_elements/cr_drawer/cr_drawer.html +++ b/ui/webui/resources/cr_elements/cr_drawer/cr_drawer.html
@@ -23,9 +23,11 @@ width: var(--drawer-width); } - :host-context([dark]) dialog { - background: var(--google-grey-900) - linear-gradient(rgba(255, 255, 255, .04), rgba(255, 255, 255, .04)); + @media (prefers-color-scheme: dark) { + :host dialog { + background: var(--google-grey-900) + linear-gradient(rgba(255, 255, 255, .04), rgba(255, 255, 255, .04)); + } } :host dialog, @@ -73,8 +75,10 @@ padding-inline-start: 24px; } - :host-context([dark]) .drawer-header { - color: var(--cr-primary-text-color); + @media (prefers-color-scheme: dark) { + .drawer-header { + color: var(--cr-primary-text-color); + } } :host ::slotted(.drawer-content) {
diff --git a/ui/webui/resources/cr_elements/cr_icon_button/cr_icon_button.html b/ui/webui/resources/cr_elements/cr_icon_button/cr_icon_button.html index 605b2567..b8f359e 100644 --- a/ui/webui/resources/cr_elements/cr_icon_button/cr_icon_button.html +++ b/ui/webui/resources/cr_elements/cr_icon_button/cr_icon_button.html
@@ -9,26 +9,28 @@ <style> :host { --cr-icon-button-color: var(--google-grey-refresh-700); - --cr-icon-button-icon-padding: calc((var(--cr-icon-button-size) - - var(--cr-icon-button-icon-size)) / 2); + --cr-icon-button-icon-start-offset: 0; --cr-icon-button-icon-size: 20px; --cr-icon-button-size: 36px; + --cr-icon-button-height: var(--cr-icon-button-size); + --cr-icon-button-width: var(--cr-icon-button-size); /* Copied from paper-fab.html. Prevents square touch highlight. */ -webkit-tap-highlight-color: transparent; background-position: center; background-repeat: no-repeat; background-size: var(--cr-icon-button-icon-size); + border-radius: 4px; color: var(--cr-icon-button-color); cursor: pointer; display: inline-flex; - height: var(--cr-icon-button-size); + height: var(--cr-icon-button-height); margin-inline-end: var(--cr-icon-button-margin-end, var(--cr-icon-ripple-margin)); margin-inline-start: var(--cr-icon-button-margin-start); outline: none; user-select: none; vertical-align: middle; - width: var(--cr-icon-button-size); + width: var(--cr-icon-button-width); } :host([disabled]) { @@ -41,8 +43,10 @@ transform: scaleX(-1); /* Invert X: flip on the Y axis (aka mirror). */ } - :host-context([dark]) { - --cr-icon-button-color: var(--google-grey-refresh-500); + @media (prefers-color-scheme: dark) { + :host { + --cr-icon-button-color: var(--google-grey-refresh-500); + } } :host paper-ripple { @@ -50,22 +54,27 @@ --paper-ripple-opacity: var(--cr-icon-button-ripple-opacity, .21); } - :host-context([dark]) paper-ripple { - --paper-ripple-opacity: var(--cr-icon-button-ripple-opacity, .4); + @media (prefers-color-scheme: dark) { + :host paper-ripple { + --paper-ripple-opacity: var(--cr-icon-button-ripple-opacity, .4); + } } #icon { + align-items: center; + border-radius: 4px; display: flex; - height: var(--cr-icon-button-size); + height: 100%; + justify-content: center; + padding-inline-start: var(--cr-icon-button-icon-start-offset); /* The |_rippleContainer| must be position relative. */ position: relative; - width: var(--cr-icon-button-size); + width: 100%; } iron-icon { --iron-icon-height: var(--cr-icon-button-icon-size); --iron-icon-width: var(--cr-icon-button-icon-size); - padding: var(--cr-icon-button-icon-padding); } </style> <div id="icon"></div>
diff --git a/ui/webui/resources/cr_elements/cr_icon_button/cr_icon_button.js b/ui/webui/resources/cr_elements/cr_icon_button/cr_icon_button.js index 826e889..e40548a 100644 --- a/ui/webui/resources/cr_elements/cr_icon_button/cr_icon_button.js +++ b/ui/webui/resources/cr_elements/cr_icon_button/cr_icon_button.js
@@ -102,18 +102,20 @@ /** @private */ onIronIconChanged_: function() { - let ironIconElement = this.$$('iron-icon'); - if (this.ironIcon) { - if (!ironIconElement) { - ironIconElement = document.createElement('iron-icon'); - this.$.icon.appendChild(ironIconElement); - } - ironIconElement.icon = this.ironIcon; + this.shadowRoot.querySelectorAll('iron-icon').forEach(el => el.remove()); + if (!this.ironIcon) { return; } - - if (ironIconElement) { - ironIconElement.remove(); + const icons = (this.ironIcon || '').split(','); + icons.forEach(icon => { + const element = document.createElement('iron-icon'); + element.icon = icon; + this.$.icon.appendChild(element); + }); + if (icons.length > 1) { + this.getRipple().classList.remove('circle'); + } else { + this.getRipple().classList.add('circle'); } }, @@ -158,7 +160,9 @@ const ripple = Polymer.PaperRippleBehavior._createRipple(); ripple.id = 'ink'; ripple.setAttribute('recenters', ''); - ripple.classList.add('circle'); + if (!(this.ironIcon || '').includes(',')) { + ripple.classList.add('circle'); + } return ripple; }, });
diff --git a/ui/webui/resources/cr_elements/cr_icons_css.html b/ui/webui/resources/cr_elements/cr_icons_css.html index 2b4f7d0..4e7ea75 100644 --- a/ui/webui/resources/cr_elements/cr_icons_css.html +++ b/ui/webui/resources/cr_elements/cr_icons_css.html
@@ -27,63 +27,73 @@ :-webkit-any(cr-icon-button, .cr-icon).icon-arrow-back { background-image: url(../images/icon_arrow_back.svg); } - :host-context([dark]) :-webkit-any(cr-icon-button, - .cr-icon).icon-arrow-back { - background-image: url(../images/dark/icon_arrow_back.svg); + @media (prefers-color-scheme: dark) { + :-webkit-any(cr-icon-button, .cr-icon).icon-arrow-back { + background-image: url(../images/dark/icon_arrow_back.svg); + } } :-webkit-any(cr-icon-button, .cr-icon).icon-cancel { background-image: url(../images/icon_cancel.svg); } - :host-context([dark]) :-webkit-any(cr-icon-button, .cr-icon).icon-cancel { - background-image: url(../images/dark/icon_cancel.svg); + @media (prefers-color-scheme: dark) { + :-webkit-any(cr-icon-button, .cr-icon).icon-cancel { + background-image: url(../images/dark/icon_cancel.svg); + } } :-webkit-any(cr-icon-button, .cr-icon).icon-toolbar-cancel { background-image: url(../images/icon_toolbar_cancel.svg); } - :host-context([dark]) :-webkit-any(cr-icon-button, - .cr-icon).icon-toolbar-cancel { - background-image: url(../images/dark/icon_toolbar_cancel.svg); + @media (prefers-color-scheme: dark) { + :-webkit-any(cr-icon-button, .cr-icon).icon-toolbar-cancel { + background-image: url(../images/dark/icon_toolbar_cancel.svg); + } } :-webkit-any(cr-icon-button, .cr-icon).icon-clear { background-image: url(../images/icon_clear.svg); } - :host-context([dark]) :-webkit-any(cr-icon-button, .cr-icon).icon-clear { - background-image: url(../images/dark/icon_clear.svg); + @media (prefers-color-scheme: dark) { + :-webkit-any(cr-icon-button, .cr-icon).icon-clear { + background-image: url(../images/dark/icon_clear.svg); + } } :-webkit-any(cr-icon-button, .cr-icon).icon-delete-gray { background-image: url(../images/icon_delete_gray.svg); } - :host-context([dark]) :-webkit-any(cr-icon-button, - .cr-icon).icon-delete-gray { - background-image: url(../images/dark/icon_delete_gray.svg); + @media (prefers-color-scheme: dark) { + :-webkit-any(cr-icon-button, .cr-icon).icon-delete-gray { + background-image: url(../images/dark/icon_delete_gray.svg); + } } :-webkit-any(cr-icon-button, .cr-icon).icon-picture-delete { background-image: url(../images/icon_picture_delete.svg); } - :host-context([dark]) :-webkit-any(cr-icon-button, - .cr-icon).icon-picture-delete { - background-image: url(../images/dark/icon_picture_delete.svg); + @media (prefers-color-scheme: dark) { + :-webkit-any(cr-icon-button, .cr-icon).icon-picture-delete { + background-image: url(../images/dark/icon_picture_delete.svg); + } } :-webkit-any(cr-icon-button, .cr-icon).icon-expand-less { background-image: url(../images/icon_expand_less.svg); } - :host-context([dark]) :-webkit-any(cr-icon-button, - .cr-icon).icon-expand-less { - background-image: url(../images/dark/icon_expand_less.svg); + @media (prefers-color-scheme: dark) { + :-webkit-any(cr-icon-button, .cr-icon).icon-expand-less { + background-image: url(../images/dark/icon_expand_less.svg); + } } :-webkit-any(cr-icon-button, .cr-icon).icon-expand-more { background-image: url(../images/icon_expand_more.svg); } - :host-context([dark]) :-webkit-any(cr-icon-button, - .cr-icon).icon-expand-more { - background-image: url(../images/dark/icon_expand_more.svg); + @media (prefers-color-scheme: dark) { + :-webkit-any(cr-icon-button, .cr-icon).icon-expand-more { + background-image: url(../images/dark/icon_expand_more.svg); + } } :-webkit-any(cr-icon-button, .cr-icon).icon-external { @@ -94,9 +104,10 @@ :-webkit-any(cr-icon-button, .cr-icon).icon-more-vert { background-image: url(../images/icon_more_vert.svg); } - :host-context([dark]) :-webkit-any(cr-icon-button, - .cr-icon).icon-more-vert { - background-image: url(../images/dark/icon_more_vert.svg); + @media (prefers-color-scheme: dark) { + :-webkit-any(cr-icon-button, .cr-icon).icon-more-vert { + background-image: url(../images/dark/icon_more_vert.svg); + } } :-webkit-any(cr-icon-button, .cr-icon).icon-more-vert-light-mode { background-image: url(../images/icon_more_vert.svg); @@ -105,56 +116,64 @@ :-webkit-any(cr-icon-button, .cr-icon).icon-refresh { background-image: url(../images/icon_refresh.svg); } - :host-context([dark]) :-webkit-any(cr-icon-button, - .cr-icon).icon-refresh { - background-image: url(../images/dark/icon_refresh.svg); + @media (prefers-color-scheme: dark) { + :-webkit-any(cr-icon-button, .cr-icon).icon-refresh { + background-image: url(../images/dark/icon_refresh.svg); + } } :-webkit-any(cr-icon-button, .cr-icon).icon-settings { background-image: url(../images/icon_settings.svg); } - :host-context([dark]) :-webkit-any(cr-icon-button, - .cr-icon).icon-settings { - background-image: url(../images/dark/icon_settings.svg); + @media (prefers-color-scheme: dark) { + :-webkit-any(cr-icon-button, .cr-icon).icon-settings { + background-image: url(../images/dark/icon_settings.svg); + } } :-webkit-any(cr-icon-button, .cr-icon).icon-search { background-image: url(../images/icon_search.svg); } - :host-context([dark]) :-webkit-any(cr-icon-button, .cr-icon).icon-search { - background-image: url(../images/dark/icon_search.svg); + @media (prefers-color-scheme: dark) { + :-webkit-any(cr-icon-button, .cr-icon).icon-search { + background-image: url(../images/dark/icon_search.svg); + } } :-webkit-any(cr-icon-button, .cr-icon).icon-arrow-dropdown { background-image: url(../images/icon_arrow_dropdown.svg); } - :host-context([dark]) :-webkit-any(cr-icon-button, - .cr-icon).icon-arrow-dropdown { - background-image: url(../images/dark/icon_arrow_dropdown.svg); + @media (prefers-color-scheme: dark) { + :-webkit-any(cr-icon-button, .cr-icon).icon-arrow-dropdown { + background-image: url(../images/dark/icon_arrow_dropdown.svg); + } } :-webkit-any(cr-icon-button, .cr-icon).subpage-arrow { background-image: url(../images/arrow_right.svg); } - :host-context([dark]) :-webkit-any(cr-icon-button, - .cr-icon).subpage-arrow { - background-image: url(../images/dark/arrow_right.svg); + @media (prefers-color-scheme: dark) { + :-webkit-any(cr-icon-button, .cr-icon).subpage-arrow { + background-image: url(../images/dark/arrow_right.svg); + } } :-webkit-any(cr-icon-button, .cr-icon).icon-visibility { background-image: url(../images/icon_visibility.svg); } - :host-context([dark]) :-webkit-any(cr-icon-button, - .cr-icon).icon-visibility { - background-image: url(../images/dark/icon_visibility.svg); + @media (prefers-color-scheme: dark) { + :-webkit-any(cr-icon-button, .cr-icon).icon-visibility { + background-image: url(../images/dark/icon_visibility.svg); + } } :-webkit-any(cr-icon-button, .cr-icon).icon-visibility-off { background-image: url(../images/icon_visibility_off.svg); } - :host-context([dark]) :-webkit-any(cr-icon-button, - .cr-icon).icon-visibility-off { - background-image: url(../images/dark/icon_visibility_off.svg); + @media (prefers-color-scheme: dark) { + :-webkit-any(cr-icon-button, .cr-icon).icon-visibility-off { + background-image: url(../images/dark/icon_visibility_off.svg); + } } </style> </template>
diff --git a/ui/webui/resources/cr_elements/cr_input/cr_input.html b/ui/webui/resources/cr_elements/cr_input/cr_input.html index 2745ab5..18e48b2d 100644 --- a/ui/webui/resources/cr_elements/cr_input/cr_input.html +++ b/ui/webui/resources/cr_elements/cr_input/cr_input.html
@@ -38,8 +38,11 @@ pointer-events: none; } - /* Margin between <input> and <paper-button> in the 'suffix' slot */ - :host ::slotted(paper-button[slot=suffix]) { + /* Margin between <input> and <cr-button> in the 'suffix' slot */ + /* TODO(aee): remove paper-button selector when paper-button is removed. + */ + :host ::slotted(paper-button[slot=suffix]), + :host ::slotted(cr-button[slot=suffix]) { margin-inline-start: var(--cr-button-edge-spacing) !important; }
diff --git a/ui/webui/resources/cr_elements/cr_input/cr_input.js b/ui/webui/resources/cr_elements/cr_input/cr_input.js index 586df0c2..4879a200 100644 --- a/ui/webui/resources/cr_elements/cr_input/cr_input.js +++ b/ui/webui/resources/cr_elements/cr_input/cr_input.js
@@ -31,7 +31,7 @@ * center-aligned with the input field, regardless of position of the label and * error-message. Example: * <cr-input> - * <paper-button slot="suffix"></paper-button> + * <cr-button slot="suffix"></cr-button> * </cr-input> */ Polymer({
diff --git a/ui/webui/resources/cr_elements/cr_input/cr_input_style_css.html b/ui/webui/resources/cr_elements/cr_input/cr_input_style_css.html index 0f3f133..e695ac45 100644 --- a/ui/webui/resources/cr_elements/cr_input/cr_input_style_css.html +++ b/ui/webui/resources/cr_elements/cr_input/cr_input_style_css.html
@@ -19,12 +19,14 @@ outline: none; } - :host-context([dark]) { - --cr-input-background-color: rgba(0, 0, 0, .3); - --cr-input-color: var(--google-grey-refresh-500); - --cr-input-error-color: var(--google-red-refresh-300); - --cr-input-focus-color: var(--google-blue-refresh-300); - --cr-input-placeholder-color: var(--google-grey-refresh-500); + @media (prefers-color-scheme: dark) { + :host { + --cr-input-background-color: rgba(0, 0, 0, .3); + --cr-input-color: var(--google-grey-refresh-500); + --cr-input-error-color: var(--google-red-refresh-300); + --cr-input-focus-color: var(--google-blue-refresh-300); + --cr-input-placeholder-color: var(--google-grey-refresh-500); + } } /* Label styling below. */
diff --git a/ui/webui/resources/cr_elements/cr_profile_avatar_selector/cr_profile_avatar_selector.html b/ui/webui/resources/cr_elements/cr_profile_avatar_selector/cr_profile_avatar_selector.html index 3422544..8b58fd9 100644 --- a/ui/webui/resources/cr_elements/cr_profile_avatar_selector/cr_profile_avatar_selector.html +++ b/ui/webui/resources/cr_elements/cr_profile_avatar_selector/cr_profile_avatar_selector.html
@@ -1,8 +1,8 @@ <link rel="import" href="../../html/polymer.html"> +<link rel="import" href="../cr_button/cr_button.html"> <link rel="import" href="../shared_vars_css.html"> <link rel="import" href="../../html/icon.html"> -<link rel="import" href="chrome://resources/polymer/v1_0/paper-button/paper-button.html"> <link rel="import" href="chrome://resources/polymer/v1_0/paper-styles/color.html"> <link rel="import" href="cr_profile_avatar_selector_grid.html"> @@ -41,10 +41,12 @@ @apply --avatar-selector-avatar; } - :host-context([dark]) #avatar-grid .avatar { - --avatar-focus-color: var(--google-grey-refresh-500); - --avatar-gap-color: var(--google-grey-800); - --avatar-selected-color: var(--google-blue-refresh-300); + @media (prefers-color-scheme: dark) { + #avatar-grid .avatar { + --avatar-focus-color: var(--google-grey-refresh-500); + --avatar-gap-color: var(--google-grey-800); + --avatar-selected-color: var(--google-blue-refresh-300); + } } #avatar-grid .avatar.iron-selected { @@ -58,18 +60,18 @@ --avatar-outline-width: 1px; } - paper-button { + cr-button { background-size: var(--avatar-size); } </style> <cr-profile-avatar-selector-grid id="avatar-grid" ignore-modified-key-events="[[ignoreModifiedKeyEvents]]"> <template is="dom-repeat" items="[[avatars]]"> - <paper-button class$="avatar [[getSelectedClass_(item.selected)]]" + <cr-button class$="avatar [[getSelectedClass_(item.selected)]]" title="[[item.label]]" style$="background-image: [[getIconImageSet_(item.url)]]" - on-tap="onAvatarTap_"> - </paper-button> + on-click="onAvatarTap_"> + </cr-button> </template> </cr-profile-avatar-selector-grid> </template>
diff --git a/ui/webui/resources/cr_elements/cr_radio_button/cr_radio_button_style_css.html b/ui/webui/resources/cr_elements/cr_radio_button/cr_radio_button_style_css.html index 67cc164..f5c9390a 100644 --- a/ui/webui/resources/cr_elements/cr_radio_button/cr_radio_button_style_css.html +++ b/ui/webui/resources/cr_elements/cr_radio_button/cr_radio_button_style_css.html
@@ -25,13 +25,15 @@ outline: none; } - :host-context([dark]) { - --cr-radio-button-checked-color: var(--google-blue-refresh-300); - --cr-radio-button-checked-ripple-color: - rgba(var(--google-blue-refresh-300-rgb), .4); - --cr-radio-button-unchecked-color: var(--google-grey-refresh-500); - --cr-radio-button-unchecked-ripple-color: - rgba(var(--google-grey-refresh-300-rgb), .4); + @media (prefers-color-scheme: dark) { + :host { + --cr-radio-button-checked-color: var(--google-blue-refresh-300); + --cr-radio-button-checked-ripple-color: + rgba(var(--google-blue-refresh-300-rgb), .4); + --cr-radio-button-unchecked-color: var(--google-grey-refresh-500); + --cr-radio-button-unchecked-ripple-color: + rgba(var(--google-grey-refresh-300-rgb), .4); + } } :host([disabled]) {
diff --git a/ui/webui/resources/cr_elements/cr_search_field/cr_search_field.html b/ui/webui/resources/cr_elements/cr_search_field/cr_search_field.html index 8dd4100..e32b38dc7 100644 --- a/ui/webui/resources/cr_elements/cr_search_field/cr_search_field.html +++ b/ui/webui/resources/cr_elements/cr_search_field/cr_search_field.html
@@ -51,13 +51,15 @@ width: 160px; /* Special width for search input. */ } - :host-context([dark]) cr-input { - /* TODO(dbeam): needing to use inherit here seems silly. In light mode, - * the background color is just matched (i.e. the parent's background is - * white, but this element also explicitly sets its background and the - * background of the container cr-input to white). Can we just not set - * these rules? */ - --cr-input-background-color: inherit; + @media (prefers-color-scheme: dark) { + cr-input { + /* TODO(dbeam): needing to use inherit here seems silly. In light mode, + * the background color is just matched (i.e. the parent's background is + * white, but this element also explicitly sets its background and the + * background of the container cr-input to white). Can we just not set + * these rules? */ + --cr-input-background-color: inherit; + } } :host([has-search-text]) cr-input {
diff --git a/ui/webui/resources/cr_elements/cr_slider/cr_slider.html b/ui/webui/resources/cr_elements/cr_slider/cr_slider.html index 14ede13..0d4ea45 100644 --- a/ui/webui/resources/cr_elements/cr_slider/cr_slider.html +++ b/ui/webui/resources/cr_elements/cr_slider/cr_slider.html
@@ -31,20 +31,22 @@ user-select: none; } - :host-context([dark]) { - --cr-slider-active-color: var(--google-blue-refresh-300); - --cr-slider-container-color: - rgba(var(--google-blue-refresh-500-rgb, .48)); - --cr-slider-container-disabled-color: - rgba(var(--google-grey-600-rgb), .48); - /* --cr-slider-disabled-color is the same in dark mode (GG600). */ - --cr-slider-knob-color: var(--google-blue-refresh-300); - /* --google-grey-900 + 4% white blended together. */ - --cr-slider-knob-disabled-color: #28292c; - --cr-slider-marker-active-color: var(--google-blue-refresh-300); - --cr-slider-marker-color: var(--google-blue-refresh-300); - --cr-slider-marker-disabled-color: rgba(255, 255, 255, .54); - --cr-slider-ripple-opacity: .4; + @media (prefers-color-scheme: dark) { + :host { + --cr-slider-active-color: var(--google-blue-refresh-300); + --cr-slider-container-color: + rgba(var(--google-blue-refresh-500-rgb, .48)); + --cr-slider-container-disabled-color: + rgba(var(--google-grey-600-rgb), .48); + /* --cr-slider-disabled-color is the same in dark mode (GG600). */ + --cr-slider-knob-color: var(--google-blue-refresh-300); + /* --google-grey-900 + 4% white blended together. */ + --cr-slider-knob-disabled-color: #28292c; + --cr-slider-marker-active-color: var(--google-blue-refresh-300); + --cr-slider-marker-color: var(--google-blue-refresh-300); + --cr-slider-marker-disabled-color: rgba(255, 255, 255, .54); + --cr-slider-ripple-opacity: .4; + } } :host([dragging]) {
diff --git a/ui/webui/resources/cr_elements/cr_tabs/cr_tabs.html b/ui/webui/resources/cr_elements/cr_tabs/cr_tabs.html index 19e6fbb..108d45f 100644 --- a/ui/webui/resources/cr_elements/cr_tabs/cr_tabs.html +++ b/ui/webui/resources/cr_elements/cr_tabs/cr_tabs.html
@@ -35,12 +35,14 @@ opacity: 1; } - .selected:focus { - font-weight: 700; + @media (prefers-color-scheme: dark) { + .selected { + color: var(--google-blue-refresh-300); + } } - :host-context([dark]) .selected { - color: var(--google-blue-refresh-300); + .selected:focus { + font-weight: 700; } #selectionBar { @@ -58,8 +60,10 @@ transition: transform; } - :host-context([dark]) #selectionBar { - border-bottom-color: var(--google-blue-refresh-300); + @media (prefers-color-scheme: dark) { + #selectionBar { + border-bottom-color: var(--google-blue-refresh-300); + } } #selectionBar.expand {
diff --git a/ui/webui/resources/cr_elements/cr_tabs/cr_tabs.js b/ui/webui/resources/cr_elements/cr_tabs/cr_tabs.js index 5e63d0a0..ae220c8 100644 --- a/ui/webui/resources/cr_elements/cr_tabs/cr_tabs.js +++ b/ui/webui/resources/cr_elements/cr_tabs/cr_tabs.js
@@ -82,6 +82,17 @@ this.selected = newSelection; }, + /** @private */ + onSelectionBarTransitionEnd_: function() { + this.$.selectionBar.classList.replace('expand', 'contract'); + const tab = this.$$(`.tab:nth-of-type(${this.selected + 1})`); + if (!tab) { + this.$.selectionBar.style.transform = 'scaleX(0)'; + return; + } + this.updateSelectionBar_(tab.offsetLeft, tab.offsetWidth); + }, + /** * @param {!{model: !{index: number}}} _ * @private @@ -99,6 +110,20 @@ const containerWidth = this.offsetWidth; const leftPercent = 100 * left / containerWidth; const widthRatio = width / containerWidth; + + // When there are two tabs, the selection bar will expand to underline both + // tabs. If a user quickly changes tabs multiple times, the selection bar + // will no longer have any room to expand the transitionend event will be + // fired only after the unerline is fully expanded. The underline will + // freeze in an expanded state since no transitionend events will be fired + // for subsequent selection changes. Call transition end method to prevent + // this. + if (this.$.selectionBar.style.transform == 'translateX(0%) scaleX(1)' && + leftPercent == 0 && widthRatio == 1) { + this.onSelectionBarTransitionEnd_(); + return; + } + this.$.selectionBar.style.transform = `translateX(${leftPercent}%) scaleX(${widthRatio})`; }, @@ -143,18 +168,16 @@ return; } - const {offsetLeft: newLeft, offsetWidth: newWidth} = tabs[this.selected]; - const {offsetLeft: oldLeft, offsetWidth: oldWidth} = tabs[oldValue]; - // Expand bar to underline the last selected tab, the newly selected tab and // everything in between. After expansion is complete, contract bar to // underline the selected tab. this.$.selectionBar.classList.add('expand'); - this.$.selectionBar.addEventListener('transitionend', () => { - this.$.selectionBar.classList.replace('expand', 'contract'); - this.updateSelectionBar_(newLeft, newWidth); - }, {once: true}); + this.$.selectionBar.addEventListener( + 'transitionend', () => this.onSelectionBarTransitionEnd_(), + {once: true}); + const {offsetLeft: newLeft, offsetWidth: newWidth} = tabs[this.selected]; + const {offsetLeft: oldLeft, offsetWidth: oldWidth} = tabs[oldValue]; const left = Math.min(newLeft, oldLeft); const right = Math.max(newLeft + newWidth, oldLeft + oldWidth); this.updateSelectionBar_(left, right - left);
diff --git a/ui/webui/resources/cr_elements/cr_toast/cr_toast.html b/ui/webui/resources/cr_elements/cr_toast/cr_toast.html index b183a76..70daaf28 100644 --- a/ui/webui/resources/cr_elements/cr_toast/cr_toast.html +++ b/ui/webui/resources/cr_elements/cr_toast/cr_toast.html
@@ -12,11 +12,13 @@ --cr-toast-text-color: #fff; } - :host-context([dark]) { - --cr-toast-background: var(--google-grey-900) - linear-gradient(rgba(255, 255, 255, .06), rgba(255, 255, 255, .06)); - --cr-toast-button-color: var(--google-blue-refresh-300); - --cr-toast-text-color: var(--google-grey-200); + @media (prefers-color-scheme: dark) { + :host { + --cr-toast-background: var(--google-grey-900) + linear-gradient(rgba(255, 255, 255, .06), rgba(255, 255, 255, .06)); + --cr-toast-button-color: var(--google-blue-refresh-300); + --cr-toast-text-color: var(--google-grey-200); + } } :host { @@ -52,7 +54,10 @@ color: var(--cr-toast-text-color); } - :host ::slotted(paper-button) { + /* TODO(aee): remove paper-button selector when paper-button is removed. + */ + :host ::slotted(paper-button), + :host ::slotted(cr-button) { background-color: transparent !important; border: none !important; color: var(--cr-toast-button-color) !important; @@ -61,7 +66,8 @@ padding: 8px !important; } - :host ::slotted(paper-button:hover) { + :host ::slotted(paper-button:hover), + :host ::slotted(cr-button:hover) { background-color: transparent !important; } </style>
diff --git a/ui/webui/resources/cr_elements/cr_toast/cr_toast_manager.html b/ui/webui/resources/cr_elements/cr_toast/cr_toast_manager.html index f8474fdd..2679f15 100644 --- a/ui/webui/resources/cr_elements/cr_toast/cr_toast_manager.html +++ b/ui/webui/resources/cr_elements/cr_toast/cr_toast_manager.html
@@ -1,16 +1,15 @@ <link rel="import" href="../../html/polymer.html"> <link rel="import" href="chrome://resources/polymer/v1_0/iron-a11y-announcer/iron-a11y-announcer.html"> -<link rel="import" href="chrome://resources/polymer/v1_0/paper-button/paper-button.html"> <link rel="import" href="../../html/assert.html"> <link rel="import" href="../../html/cr.html"> <link rel="import" href="../../html/event_tracker.html"> -<link rel="import" href="../paper_button_style_css.html"> +<link rel="import" href="../cr_button/cr_button.html"> <link rel="import" href="cr_toast.html"> <dom-module id="cr-toast-manager"> <template> - <style include="paper-button-style"> + <style> #content { display: flex; flex: 1; @@ -33,10 +32,10 @@ </style> <cr-toast id="toast" duration="[[duration]]" role="alert"> <div id="content" class="elided-text"></div> - <paper-button id="button" hidden$="[[!showUndo_]]" on-click="onUndoClick_" + <cr-button id="button" hidden$="[[!showUndo_]]" on-click="onUndoClick_" aria-label$="[[undoDescription]]"> [[undoLabel]] - </paper-button> + </cr-button> </cr-toast> </template> <script src="cr_toast_manager.js"></script>
diff --git a/ui/webui/resources/cr_elements/cr_toggle/cr_toggle.html b/ui/webui/resources/cr_elements/cr_toggle/cr_toggle.html index 0374b0f4..f1859fb 100644 --- a/ui/webui/resources/cr_elements/cr_toggle/cr_toggle.html +++ b/ui/webui/resources/cr_elements/cr_toggle/cr_toggle.html
@@ -22,14 +22,16 @@ width: 34px; } - :host-context([dark]) { - --cr-toggle-checked-bar-color: var(--google-blue-refresh-300); - --cr-toggle-checked-button-color: var(--google-blue-refresh-300); - --cr-toggle-checked-ink-color: var(--google-blue-refresh-300); - --cr-toggle-ripple-opacity: .4; - --cr-toggle-unchecked-bar-color: var(--google-grey-refresh-500); - --cr-toggle-unchecked-button-color: var(--google-grey-refresh-300); - --cr-toggle-unchecked-ink-color: var(--google-grey-refresh-300); + @media (prefers-color-scheme: dark) { + :host { + --cr-toggle-checked-bar-color: var(--google-blue-refresh-300); + --cr-toggle-checked-button-color: var(--google-blue-refresh-300); + --cr-toggle-checked-ink-color: var(--google-blue-refresh-300); + --cr-toggle-ripple-opacity: .4; + --cr-toggle-unchecked-bar-color: var(--google-grey-refresh-500); + --cr-toggle-unchecked-button-color: var(--google-grey-refresh-300); + --cr-toggle-unchecked-ink-color: var(--google-grey-refresh-300); + } } :host([disabled]) { @@ -96,8 +98,10 @@ color: var(--cr-toggle-checked-ink-color); } - :host-context(html:not([dark])):host([checked]) paper-ripple { - --paper-ripple-opacity: 0.2; + @media (prefers-color-scheme: light) { + :host([checked]) paper-ripple { + --paper-ripple-opacity: 0.2; + } } </style> <span id="bar"></span>
diff --git a/ui/webui/resources/cr_elements/cr_toolbar/BUILD.gn b/ui/webui/resources/cr_elements/cr_toolbar/BUILD.gn index 6cefa20..385c0cd 100644 --- a/ui/webui/resources/cr_elements/cr_toolbar/BUILD.gn +++ b/ui/webui/resources/cr_elements/cr_toolbar/BUILD.gn
@@ -19,9 +19,6 @@ } js_library("cr_toolbar_selection_overlay") { - deps = [ - "//third_party/polymer/v1_0/components-chromium/paper-button:paper-button-extracted", - ] } js_library("cr_toolbar") {
diff --git a/ui/webui/resources/cr_elements/cr_toolbar/cr_toolbar.html b/ui/webui/resources/cr_elements/cr_toolbar/cr_toolbar.html index f8ec5ea..f9fe028 100644 --- a/ui/webui/resources/cr_elements/cr_toolbar/cr_toolbar.html +++ b/ui/webui/resources/cr_elements/cr_toolbar/cr_toolbar.html
@@ -19,11 +19,13 @@ height: var(--cr-toolbar-height); } - :host-context([dark]) { - background-color: rgba(255, 255, 255, .04); - border-bottom: var(--cr-separator-line); - box-sizing: border-box; - color: var(--cr-secondary-text-color); + @media (prefers-color-scheme: dark) { + :host { + background-color: rgba(255, 255, 255, .04); + border-bottom: var(--cr-separator-line); + box-sizing: border-box; + color: var(--cr-secondary-text-color); + } } h1 { @@ -36,8 +38,10 @@ padding-inline-end: 12px; } - :host-context([dark]) h1 { - color: var(--cr-primary-text-color); + @media (prefers-color-scheme: dark) { + h1 { + color: var(--cr-primary-text-color); + } } #leftContent { @@ -59,8 +63,10 @@ min-width: 32px; } - :host-context(html:not([dark])) cr-icon-button { - --cr-icon-button-color: currentColor; + @media (prefers-color-scheme: light) { + cr-icon-button { + --cr-icon-button-color: currentColor; + } } #centeredContent {
diff --git a/ui/webui/resources/cr_elements/cr_toolbar/cr_toolbar_search_field.html b/ui/webui/resources/cr_elements/cr_toolbar/cr_toolbar_search_field.html index 2edebdd8..3619422a 100644 --- a/ui/webui/resources/cr_elements/cr_toolbar/cr_toolbar_search_field.html +++ b/ui/webui/resources/cr_elements/cr_toolbar/cr_toolbar_search_field.html
@@ -28,8 +28,10 @@ margin: 6px; } - :host-context(html:not([dark])) cr-icon-button { - --cr-icon-button-color: currentColor; + @media (prefers-color-scheme: light) { + cr-icon-button { + --cr-icon-button-color: currentColor; + } } #icon { @@ -41,8 +43,10 @@ opacity: 0; } - :host-context([dark]) #prompt { - --cr-toolbar-search-field-prompt-opacity: 1; + @media (prefers-color-scheme: dark) { + #prompt { + --cr-toolbar-search-field-prompt-opacity: 1; + } } paper-spinner-lite {
diff --git a/ui/webui/resources/cr_elements/cr_toolbar/cr_toolbar_selection_overlay.html b/ui/webui/resources/cr_elements/cr_toolbar/cr_toolbar_selection_overlay.html index b363c31..28243f0 100644 --- a/ui/webui/resources/cr_elements/cr_toolbar/cr_toolbar_selection_overlay.html +++ b/ui/webui/resources/cr_elements/cr_toolbar/cr_toolbar_selection_overlay.html
@@ -1,14 +1,13 @@ <link rel="import" href="../../html/polymer.html"> +<link rel="import" href="../cr_button/cr_button.html"> <link rel="import" href="../cr_icon_button/cr_icon_button.html"> <link rel="import" href="../icons.html"> -<link rel="import" href="../paper_button_style_css.html"> <link rel="import" href="../shared_vars_css.html"> -<link rel="import" href="chrome://resources/polymer/v1_0/paper-button/paper-button.html"> <dom-module id="cr-toolbar-selection-overlay"> <template> - <style include="paper-button-style"> + <style> :host { background-color: white; border-bottom: 1px solid var(--google-grey-300); @@ -27,11 +26,13 @@ visibility: hidden; } - :host-context([dark]) { - background-color: var(--google-grey-900); - background-image: linear-gradient(rgba(255, 255, 255, .04), - rgba(255, 255, 255, .04)); - border-bottom-color: var(--cr-separator-color); + @media (prefers-color-scheme: dark) { + :host { + background-color: var(--google-grey-900); + background-image: linear-gradient(rgba(255, 255, 255, .04), + rgba(255, 255, 255, .04)); + border-bottom-color: var(--cr-separator-color); + } } :host([show]) { @@ -49,7 +50,7 @@ padding: 0 var(--selection-overlay-padding, 24px); } - paper-button { + cr-button { margin-inline-start: 8px; } @@ -70,13 +71,11 @@ <cr-icon-button title="[[cancelLabel]]" iron-icon="cr:clear" on-click="onClearSelectionClick_"></cr-icon-button> <div id="number-selected">[[selectionLabel_]]</div> - <paper-button on-click="onClearSelectionClick_"> - [[cancelLabel]] - </paper-button> - <paper-button id="delete" on-click="onDeleteClick_" + <cr-button on-click="onClearSelectionClick_">[[cancelLabel]]</cr-button> + <cr-button id="delete" on-click="onDeleteClick_" disabled="[[deleteDisabled]]"> [[deleteLabel]] - </paper-button> + </cr-button> </div> </template> </template>
diff --git a/ui/webui/resources/cr_elements/cr_toolbar/cr_toolbar_selection_overlay.js b/ui/webui/resources/cr_elements/cr_toolbar/cr_toolbar_selection_overlay.js index 1afd0dca..701b615 100644 --- a/ui/webui/resources/cr_elements/cr_toolbar/cr_toolbar_selection_overlay.js +++ b/ui/webui/resources/cr_elements/cr_toolbar/cr_toolbar_selection_overlay.js
@@ -42,9 +42,9 @@ 'updateSelectionLabel_(show, selectionLabel)', ], - /** @return {PaperButtonElement} */ + /** @return {HTMLElement} */ get deleteButton() { - return /** @type {PaperButtonElement} */ (this.$$('#delete')); + return /** @type {HTMLElement} */ (this.$$('#delete')); }, /** @private */
diff --git a/ui/webui/resources/cr_elements/paper_button_style_css.html b/ui/webui/resources/cr_elements/paper_button_style_css.html index e1a7665181..386b57e0 100644 --- a/ui/webui/resources/cr_elements/paper_button_style_css.html +++ b/ui/webui/resources/cr_elements/paper_button_style_css.html
@@ -38,39 +38,40 @@ --text-color: var(--google-blue-600); } - [dark] paper-button, - :host-context([dark]) paper-button { - /* Only in dark. */ - --active-bg: black linear-gradient(rgba(255, 255, 255, .06), - rgba(255, 255, 255, .06)); - --active-shadow-rgb: 0, 0, 0; - --active-shadow-action-rgb: var(--google-blue-refresh-500-rgb); + @media (prefers-color-scheme: dark) { + paper-button { + /* Only in dark. */ + --active-bg: black linear-gradient(rgba(255, 255, 255, .06), + rgba(255, 255, 255, .06)); + --active-shadow-rgb: 0, 0, 0; + --active-shadow-action-rgb: var(--google-blue-refresh-500-rgb); - --border-color: var(--google-grey-refresh-700); + --border-color: var(--google-grey-refresh-700); - --disabled-color: var(--google-grey-800); - /* --disabled-text-color is same as light mode (GG 600). */ + --disabled-color: var(--google-grey-800); + /* --disabled-text-color is same as light mode (GG 600). */ - --flat-bg-action: var(--google-blue-refresh-300); - /* TODO(dbeam): get --flat-disabled-bg from Namrata. */ - --flat-disabled-bg: transparent; - --flat-disabled-border-color: var(--google-grey-800); - --flat-focus-shadow-color: rgba(var(--google-blue-refresh-300-rgb), .5); - --flat-ink-color-action: black; - --flat-ripple-opacity-action: .16; - --flat-text-color-action: var(--google-grey-900); + --flat-bg-action: var(--google-blue-refresh-300); + /* TODO(dbeam): get --flat-disabled-bg from Namrata. */ + --flat-disabled-bg: transparent; + --flat-disabled-border-color: var(--google-grey-800); + --flat-focus-shadow-color: rgba(var(--google-blue-refresh-300-rgb), .5); + --flat-ink-color-action: black; + --flat-ripple-opacity-action: .16; + --flat-text-color-action: var(--google-grey-900); - --hover-bg-action: var(--flat-bg-action) - linear-gradient(rgba(0, 0, 0, .08), rgba(0, 0, 0, .08)); - --hover-bg-color: rgba(var(--google-blue-refresh-300-rgb), .08); - /* No change in secondary box-shadow or border color on hover - * (--hover-border-color, --hover-shadow-action-rgb) in dark mode. */ + --hover-bg-action: var(--flat-bg-action) + linear-gradient(rgba(0, 0, 0, .08), rgba(0, 0, 0, .08)); + --hover-bg-color: rgba(var(--google-blue-refresh-300-rgb), .08); + /* No change in secondary box-shadow or border color on hover + * (--hover-border-color, --hover-shadow-action-rgb) in dark mode. */ - --paper-button-ink-color: var(--google-blue-refresh-300); + --paper-button-ink-color: var(--google-blue-refresh-300); - --ripple-opacity: .16; + --ripple-opacity: .16; - --text-color: var(--google-blue-refresh-300); + --text-color: var(--google-blue-refresh-300); + } } paper-button { @@ -104,8 +105,10 @@ background-color: var(--hover-bg-color); } - :host-context(html:not([dark])) paper-button:not(.action-button):hover { - border-color: var(--hover-border-color); + @media (prefers-color-scheme: light) { + paper-button:not(.action-button):hover { + border-color: var(--hover-border-color); + } } paper-button:not(.action-button):active { @@ -119,10 +122,12 @@ background: var(--hover-bg-action); } - :host-context(html:not([dark])) paper-button.action-button:hover { - box-shadow: - 0 1px 2px 0 rgba(var(--hover-shadow-action-rgb), .3), - 0 1px 3px 1px rgba(var(--hover-shadow-action-rgb), .15); + @media (prefers-color-scheme: light) { + paper-button.action-button:hover { + box-shadow: + 0 1px 2px 0 rgba(var(--hover-shadow-action-rgb), .3), + 0 1px 3px 1px rgba(var(--hover-shadow-action-rgb), .15); + } } paper-button.action-button:active {
diff --git a/ui/webui/resources/cr_elements/shared_style_css.html b/ui/webui/resources/cr_elements/shared_style_css.html index fdb6520..4eed6ee 100644 --- a/ui/webui/resources/cr_elements/shared_style_css.html +++ b/ui/webui/resources/cr_elements/shared_style_css.html
@@ -14,9 +14,11 @@ --scrollable-border-color: var(--google-grey-refresh-300); } - html[dark], - :host-context([dark]) { - --scrollable-border-color: var(--google-grey-refresh-700); + @media (prefers-color-scheme: dark) { + html, + :host { + --scrollable-border-color: var(--google-grey-refresh-700); + } } [actionable] {
diff --git a/ui/webui/resources/cr_elements/shared_vars_css.html b/ui/webui/resources/cr_elements/shared_vars_css.html index e512172..a6f8496c 100644 --- a/ui/webui/resources/cr_elements/shared_vars_css.html +++ b/ui/webui/resources/cr_elements/shared_vars_css.html
@@ -78,32 +78,34 @@ --cr-toggle-color: var(--google-blue-500); } - html[dark] { - --cr-primary-text-color: var(--google-grey-200); - --cr-secondary-text-color: var(--google-grey-refresh-500); + @media (prefers-color-scheme: dark) { + html { + --cr-primary-text-color: var(--google-grey-200); + --cr-secondary-text-color: var(--google-grey-refresh-500); - --cr-card-background-color: var(--google-grey-900); - --cr-card-shadow-color-rgb: 0, 0, 0; + --cr-card-background-color: var(--google-grey-900); + --cr-card-shadow-color-rgb: 0, 0, 0; - --cr-card-elevation: { - /* This gradient intentionally uses the same from/to colors to add 4% - * white on top of an opaque background-color. */ - background-image: linear-gradient(rgba(255, 255, 255, .04), - rgba(255, 255, 255, .04)); - box-shadow: var(--cr-card-shadow); /* Uses --cr-card-shadow-color-rgb. */ + --cr-card-elevation: { + /* This gradient intentionally uses the same from/to colors to add 4% + * white on top of an opaque background-color. */ + background-image: linear-gradient(rgba(255, 255, 255, .04), + rgba(255, 255, 255, .04)); + box-shadow: var(--cr-card-shadow); /* Uses --cr-card-shadow-color-rgb. */ + } + + --cr-checked-color: var(--google-blue-refresh-300); + --cr-form-field-label-color: var(--dark-secondary-color); + --cr-link-color: var(--google-blue-refresh-300); + --cr-menu-background-color: var(--google-grey-900); + --cr-menu-background-focus-color: rgba(var(--google-grey-800-rgb), .6); + --cr-menu-background-sheen: rgba(255, 255, 255, .06); /* Only dark mode. */ + --cr-menu-shadow: rgba(0, 0, 0, .3) 0 1px 2px 0, + rgba(0, 0, 0, .15) 0 3px 6px 2px; + --cr-separator-color: rgba(255, 255, 255, .1); + /* TODO(dbeam): --cr-toggle-color (CrOS only). */ + --cr-title-text-color: var(--cr-primary-text-color); } - - --cr-checked-color: var(--google-blue-refresh-300); - --cr-form-field-label-color: var(--dark-secondary-color); - --cr-link-color: var(--google-blue-refresh-300); - --cr-menu-background-color: var(--google-grey-900); - --cr-menu-background-focus-color: rgba(var(--google-grey-800-rgb), .6); - --cr-menu-background-sheen: rgba(255, 255, 255, .06); /* Only dark mode. */ - --cr-menu-shadow: rgba(0, 0, 0, .3) 0 1px 2px 0, - rgba(0, 0, 0, .15) 0 3px 6px 2px; - --cr-separator-color: rgba(255, 255, 255, .1); - /* TODO(dbeam): --cr-toggle-color (CrOS only). */ - --cr-title-text-color: var(--cr-primary-text-color); } /* Don't use color values past this point. Instead, create a variable that's
diff --git a/ui/webui/resources/css/md_colors.css b/ui/webui/resources/css/md_colors.css index 9750520..383a5f3 100644 --- a/ui/webui/resources/css/md_colors.css +++ b/ui/webui/resources/css/md_colors.css
@@ -12,10 +12,12 @@ --md-toolbar-height: 56px; } -html[dark] { - --md-background-color: rgb(32, 33, 36); /* --google-grey-900 */ - --md-loading-message-color: #9AA0A6; /* --google-grey-refresh-500 */ - /* --cr-separator-line */ - --md-toolbar-border: 1px solid rgba(255, 255, 255, .1); - --md-toolbar-color: rgba(255, 255, 255, .04); +@media (prefers-color-scheme: dark) { + html { + --md-background-color: rgb(32, 33, 36); /* --google-grey-900 */ + --md-loading-message-color: #9AA0A6; /* --google-grey-refresh-500 */ + /* --cr-separator-line */ + --md-toolbar-border: 1px solid rgba(255, 255, 255, .1); + --md-toolbar-color: rgba(255, 255, 255, .04); + } }
diff --git a/ui/webui/resources/html/md_select_css.html b/ui/webui/resources/html/md_select_css.html index 9c72fee..ba2f742 100644 --- a/ui/webui/resources/html/md_select_css.html +++ b/ui/webui/resources/html/md_select_css.html
@@ -38,16 +38,18 @@ width: var(--md-select-width, 200px); } - :host-context([dark]) .md-select { - --md-select-bg-color: rgba(0, 0, 0, .3); - --md-select-focus-shadow-color: - rgba(var(--google-blue-refresh-300-rgb), .5); - /* --google-grey-900 + 4% white. This is typically implemented with - * background-{color,image} for e.g. menus, but it's not currently - * possible to style background-image on <option>. */ - --md-select-option-bg-color: #28292c; - --md-select-text-color: var(--cr-primary-text-color); - background-image: url(chrome://resources/images/dark/arrow_down.svg); + @media (prefers-color-scheme: dark) { + .md-select { + --md-select-bg-color: rgba(0, 0, 0, .3); + --md-select-focus-shadow-color: + rgba(var(--google-blue-refresh-300-rgb), .5); + /* --google-grey-900 + 4% white. This is typically implemented with + * background-{color,image} for e.g. menus, but it's not currently + * possible to style background-image on <option>. */ + --md-select-option-bg-color: #28292c; + --md-select-text-color: var(--cr-primary-text-color); + background-image: url(chrome://resources/images/dark/arrow_down.svg); + } } /* Makes sure anything within the dropdown menu has a background. */
diff --git a/ui/webui/resources/webui_resources.grd b/ui/webui/resources/webui_resources.grd index cf070f0a..28fe95f 100644 --- a/ui/webui/resources/webui_resources.grd +++ b/ui/webui/resources/webui_resources.grd
@@ -27,36 +27,6 @@ </if> <!-- Component apps common image resources - 1x --> - <!-- White button --> - <include name="IDR_WEBUI_IMAGES_APPS_BUTTON" - file="../../views/resources/default_100_percent/common/button.png" type="BINDATA" /> - <include name="IDR_WEBUI_IMAGES_APPS_BUTTON_PRESSED" - file="../../views/resources/default_100_percent/common/button_pressed.png" type="BINDATA" /> - <include name="IDR_WEBUI_IMAGES_APPS_BUTTON_HOVER" - file="../../views/resources/default_100_percent/common/button_hover.png" type="BINDATA" /> - <include name="IDR_WEBUI_IMAGES_APPS_BUTTON_DISABLED" - file="../../views/resources/default_100_percent/common/button_inactive.png" type="BINDATA" /> - <include name="IDR_WEBUI_IMAGES_APPS_BUTTON_FOCUSED" - file="../../views/resources/default_100_percent/common/button_focused.png" type="BINDATA" /> - <include name="IDR_WEBUI_IMAGES_APPS_BUTTON_FOCUSED_PRESSED" - file="../../views/resources/default_100_percent/common/button_focused_pressed.png" type="BINDATA" /> - <include name="IDR_WEBUI_IMAGES_APPS_BUTTON_FOCUSED_HOVER" - file="../../views/resources/default_100_percent/common/button_focused_hover.png" type="BINDATA" /> - <!-- Blue button --> - <include name="IDR_WEBUI_IMAGES_APPS_BLUE_BUTTON" - file="../../views/resources/default_100_percent/common/blue_button.png" type="BINDATA" /> - <include name="IDR_WEBUI_IMAGES_APPS_BLUE_BUTTON_PRESSED" - file="../../views/resources/default_100_percent/common/blue_button_pressed.png" type="BINDATA" /> - <include name="IDR_WEBUI_IMAGES_APPS_BLUE_BUTTON_HOVER" - file="../../views/resources/default_100_percent/common/blue_button_hover.png" type="BINDATA" /> - <include name="IDR_WEBUI_IMAGES_APPS_BLUE_BUTTON_DISABLED" - file="../../views/resources/default_100_percent/common/blue_button_inactive.png" type="BINDATA" /> - <include name="IDR_WEBUI_IMAGES_APPS_BLUE_BUTTON_FOCUSED" - file="../../views/resources/default_100_percent/common/blue_button_focused.png" type="BINDATA" /> - <include name="IDR_WEBUI_IMAGES_APPS_BLUE_BUTTON_FOCUSED_PRESSED" - file="../../views/resources/default_100_percent/common/blue_button_focused_pressed.png" type="BINDATA" /> - <include name="IDR_WEBUI_IMAGES_APPS_BLUE_BUTTON_FOCUSED_HOVER" - file="../../views/resources/default_100_percent/common/blue_button_focused_hover.png" type="BINDATA" /> <!-- Misc buttons --> <include name="IDR_WEBUI_IMAGES_APPS_TOPBAR_BUTTON_CLOSE" file="images/apps/topbar_button_close.png" type="BINDATA" /> @@ -72,36 +42,6 @@ file="images/apps/button_butter_bar_close_pressed.png" type="BINDATA" /> <!-- Component apps common image resources - 2x --> - <!-- White button --> - <include name="IDR_WEBUI_IMAGES_APPS_BUTTON_2X" - file="../../views/resources/default_200_percent/common/button.png" type="BINDATA" /> - <include name="IDR_WEBUI_IMAGES_APPS_BUTTON_2X_PRESSED" - file="../../views/resources/default_200_percent/common/button_pressed.png" type="BINDATA" /> - <include name="IDR_WEBUI_IMAGES_APPS_BUTTON_2X_HOVER" - file="../../views/resources/default_200_percent/common/button_hover.png" type="BINDATA" /> - <include name="IDR_WEBUI_IMAGES_APPS_BUTTON_2X_DISABLED" - file="../../views/resources/default_200_percent/common/button_inactive.png" type="BINDATA" /> - <include name="IDR_WEBUI_IMAGES_APPS_BUTTON_2X_FOCUSED" - file="../../views/resources/default_200_percent/common/button_focused.png" type="BINDATA" /> - <include name="IDR_WEBUI_IMAGES_APPS_BUTTON_2X_FOCUSED_PRESSED" - file="../../views/resources/default_200_percent/common/button_focused_pressed.png" type="BINDATA" /> - <include name="IDR_WEBUI_IMAGES_APPS_BUTTON_2X_FOCUSED_HOVER" - file="../../views/resources/default_200_percent/common/button_focused_hover.png" type="BINDATA" /> - <!-- Blue button --> - <include name="IDR_WEBUI_IMAGES_APPS_BLUE_BUTTON_2X" - file="../../views/resources/default_200_percent/common/blue_button.png" type="BINDATA" /> - <include name="IDR_WEBUI_IMAGES_APPS_BLUE_BUTTON_2X_PRESSED" - file="../../views/resources/default_200_percent/common/blue_button_pressed.png" type="BINDATA" /> - <include name="IDR_WEBUI_IMAGES_APPS_BLUE_BUTTON_2X_HOVER" - file="../../views/resources/default_200_percent/common/blue_button_hover.png" type="BINDATA" /> - <include name="IDR_WEBUI_IMAGES_APPS_BLUE_BUTTON_2X_DISABLED" - file="../../views/resources/default_200_percent/common/blue_button_inactive.png" type="BINDATA" /> - <include name="IDR_WEBUI_IMAGES_APPS_BLUE_BUTTON_2X_FOCUSED" - file="../../views/resources/default_200_percent/common/blue_button_focused.png" type="BINDATA" /> - <include name="IDR_WEBUI_IMAGES_APPS_BLUE_BUTTON_2X_FOCUSED_PRESSED" - file="../../views/resources/default_200_percent/common/blue_button_focused_pressed.png" type="BINDATA" /> - <include name="IDR_WEBUI_IMAGES_APPS_BLUE_BUTTON_2X_FOCUSED_HOVER" - file="../../views/resources/default_200_percent/common/blue_button_focused_hover.png" type="BINDATA" /> <!-- Misc buttons --> <include name="IDR_WEBUI_IMAGES_APPS_TOPBAR_BUTTON_2X_CLOSE" file="images/2x/apps/topbar_button_close.png" type="BINDATA" />
diff --git a/ui/wm/core/shadow_controller.cc b/ui/wm/core/shadow_controller.cc index cc648dc..50274fa 100644 --- a/ui/wm/core/shadow_controller.cc +++ b/ui/wm/core/shadow_controller.cc
@@ -53,8 +53,7 @@ int GetShadowElevationForWindowLosingActive(aura::Window* losing_active, aura::Window* gaining_active) { if (gaining_active && GetHideOnDeactivate(gaining_active)) { - if (base::ContainsValue(GetTransientChildren(losing_active), - gaining_active)) + if (base::Contains(GetTransientChildren(losing_active), gaining_active)) return kShadowElevationActiveWindow; } return kShadowElevationInactiveWindow;
diff --git a/ui/wm/core/transient_window_manager.cc b/ui/wm/core/transient_window_manager.cc index e7803a2ed..3beedbca 100644 --- a/ui/wm/core/transient_window_manager.cc +++ b/ui/wm/core/transient_window_manager.cc
@@ -65,7 +65,7 @@ TransientWindowManager* child_manager = GetOrCreate(child); if (child_manager->transient_parent_) GetOrCreate(child_manager->transient_parent_)->RemoveTransientChild(child); - DCHECK(!base::ContainsValue(transient_children_, child)); + DCHECK(!base::Contains(transient_children_, child)); transient_children_.push_back(child); child_manager->transient_parent_ = window_;
diff --git a/ui/wm/core/window_animations.cc b/ui/wm/core/window_animations.cc index 2d5b023..8435aa2ee 100644 --- a/ui/wm/core/window_animations.cc +++ b/ui/wm/core/window_animations.cc
@@ -90,7 +90,7 @@ DCHECK(iter != window_->parent()->children().end()); aura::Window* topmost_transient_child = NULL; for (++iter; iter != window_->parent()->children().end(); ++iter) { - if (base::ContainsValue(transient_children, *iter)) + if (base::Contains(transient_children, *iter)) topmost_transient_child = *iter; } if (topmost_transient_child) {
diff --git a/ui/wm/core/window_animations_unittest.cc b/ui/wm/core/window_animations_unittest.cc index dfd3127..5eac66a 100644 --- a/ui/wm/core/window_animations_unittest.cc +++ b/ui/wm/core/window_animations_unittest.cc
@@ -155,10 +155,9 @@ // Make sure the Hide animation create another layer, and both are in // the parent layer. EXPECT_NE(animating_window->layer(), animating_layer); + EXPECT_TRUE(base::Contains(parent->layer()->children(), animating_layer)); EXPECT_TRUE( - base::ContainsValue(parent->layer()->children(), animating_layer)); - EXPECT_TRUE(base::ContainsValue(parent->layer()->children(), - animating_window->layer())); + base::Contains(parent->layer()->children(), animating_window->layer())); // Current layer must be already hidden. EXPECT_FALSE(animating_window->layer()->visible()); @@ -177,8 +176,7 @@ // Animating layer must be gone animating_layer->GetAnimator()->StopAnimating(); - EXPECT_FALSE( - base::ContainsValue(parent->layer()->children(), animating_layer)); + EXPECT_FALSE(base::Contains(parent->layer()->children(), animating_layer)); } }
diff --git a/url/origin.cc b/url/origin.cc index c2dee88..0686e052 100644 --- a/url/origin.cc +++ b/url/origin.cc
@@ -43,7 +43,7 @@ // It's SchemeHostPort's responsibility to filter out unrecognized schemes; // sanity check that this is happening. DCHECK(tuple.IsInvalid() || url.IsStandard() || - base::ContainsValue(GetLocalSchemes(), url.scheme_piece()) || + base::Contains(GetLocalSchemes(), url.scheme_piece()) || AllowNonStandardSchemesForAndroidWebView()); } @@ -162,7 +162,7 @@ // For "no access" schemes, blink's SecurityOrigin will always create an // opaque unique one. However, about: scheme is also registered as such but // does not behave this way, therefore exclude it from this check. - if (base::ContainsValue(url::GetNoAccessSchemes(), url.scheme()) && + if (base::Contains(url::GetNoAccessSchemes(), url.scheme()) && !url.SchemeIs(kAboutScheme)) { // If |this| is not opaque, definitely return false as the expectation // is for opaque origin.
diff --git a/url/scheme_host_port.cc b/url/scheme_host_port.cc index 6af849f..18b0e8cd 100644 --- a/url/scheme_host_port.cc +++ b/url/scheme_host_port.cc
@@ -68,8 +68,7 @@ // // TODO: Migrate "content:" and "externalfile:" to be standard schemes, and // remove this local scheme exception. - if (base::ContainsValue(GetLocalSchemes(), scheme) && host.empty() && - port == 0) + if (base::Contains(GetLocalSchemes(), scheme) && host.empty() && port == 0) return true; // Otherwise, allow non-standard schemes only if the Android WebView